@beyondcorp/beyond-ui 1.2.85 → 1.2.89
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/Alert/Alert.js +5 -5
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Avatar/Avatar.js +1 -1
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Badge/Badge.js +6 -6
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Button/Button.js +9 -9
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Card/Card.js +5 -5
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- 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 +13 -13
- package/dist/components/DataTable/DataTable.js.map +1 -1
- package/dist/components/Input/Input.js +4 -4
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Modal/Modal.js +3 -3
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Navbar/Navbar.js +5 -5
- package/dist/components/Navbar/Navbar.js.map +1 -1
- package/dist/components/PageLayout/PageLayout.js +8 -8
- package/dist/components/PageLayout/PageLayout.js.map +1 -1
- package/dist/components/ProfileManagement/ProfileCard.js +1 -1
- package/dist/components/ProfileManagement/ProfileCard.js.map +1 -1
- package/dist/components/Radio/Radio.js +2 -2
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/Select/Select.js +4 -4
- package/dist/components/Select/Select.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/components/Skeleton/Skeleton.js +3 -3
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Spinner/Spinner.js +2 -2
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/StatsCard/StatsCard.js +4 -4
- package/dist/components/StatsCard/StatsCard.js.map +1 -1
- package/dist/components/Switch/Switch.js +2 -2
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Tabs/Tabs.js +6 -6
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Textarea/Textarea.js +4 -4
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Toast/Toast.js +6 -6
- package/dist/components/Toast/Toast.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -6,11 +6,11 @@ import { cn } from '../../utils/cn.js';
|
|
|
6
6
|
const alertVariants = cva("relative w-full rounded-lg border p-4", {
|
|
7
7
|
variants: {
|
|
8
8
|
variant: {
|
|
9
|
-
default: "bg-white text-gray-950 border-gray-200",
|
|
10
|
-
success: "bg-success-50 text-success-800 border-success-200",
|
|
11
|
-
warning: "bg-warning-50 text-warning-800 border-warning-200",
|
|
12
|
-
danger: "bg-danger-50 text-danger-800 border-danger-200",
|
|
13
|
-
info: "bg-primary-50 text-primary-800 border-primary-200",
|
|
9
|
+
default: "bg-white dark:bg-gray-900 text-gray-950 dark:text-gray-50 border-gray-200 dark:border-gray-800",
|
|
10
|
+
success: "bg-success-50 dark:bg-success-900/30 text-success-800 dark:text-success-400 border-success-200 dark:border-success-800",
|
|
11
|
+
warning: "bg-warning-50 dark:bg-warning-900/30 text-warning-800 dark:text-warning-400 border-warning-200 dark:border-warning-800",
|
|
12
|
+
danger: "bg-danger-50 dark:bg-danger-900/30 text-danger-800 dark:text-danger-400 border-danger-200 dark:border-danger-800",
|
|
13
|
+
info: "bg-primary-50 dark:bg-primary-900/30 text-primary-800 dark:text-primary-400 border-primary-200 dark:border-primary-800",
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
defaultVariants: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.js","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border p-4\",\n {\n variants: {\n variant: {\n default: \"bg-white text-gray-950 border-gray-200\",\n success: \"bg-success-50 text-success-800 border-success-200\",\n warning: \"bg-warning-50 text-warning-800 border-warning-200\",\n danger: \"bg-danger-50 text-danger-800 border-danger-200\",\n info: \"bg-primary-50 text-primary-800 border-primary-200\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription, alertVariants };"],"names":["_jsx"],"mappings":";;;;;AAIA,MAAM,aAAa,GAAG,GAAG,CACvB,uCAAuC,EACvC;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Alert.js","sources":["../../../src/components/Alert/Alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border p-4\",\n {\n variants: {\n variant: {\n default: \"bg-white dark:bg-gray-900 text-gray-950 dark:text-gray-50 border-gray-200 dark:border-gray-800\",\n success: \"bg-success-50 dark:bg-success-900/30 text-success-800 dark:text-success-400 border-success-200 dark:border-success-800\",\n warning: \"bg-warning-50 dark:bg-warning-900/30 text-warning-800 dark:text-warning-400 border-warning-200 dark:border-warning-800\",\n danger: \"bg-danger-50 dark:bg-danger-900/30 text-danger-800 dark:text-danger-400 border-danger-200 dark:border-danger-800\",\n info: \"bg-primary-50 dark:bg-primary-900/30 text-primary-800 dark:text-primary-400 border-primary-200 dark:border-primary-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertTitle, AlertDescription, alertVariants };"],"names":["_jsx"],"mappings":";;;;;AAIA,MAAM,aAAa,GAAG,GAAG,CACvB,uCAAuC,EACvC;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,gGAAgG;AACzG,YAAA,OAAO,EAAE,wHAAwH;AACjI,YAAA,OAAO,EAAE,wHAAwH;AACjI,YAAA,MAAM,EAAE,kHAAkH;AAC1H,YAAA,IAAI,EAAE,wHAAwH;AAC/H,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AACnB,KAAA;AACF,CAAA;AAGH,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAG5B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MACtCA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAChD,KAAK,EAAA,CACT,CACH;AACD,KAAK,CAAC,WAAW,GAAG,OAAO;AAE3B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,IAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,EAAA,GACpE,KAAK,EAAA,CACT,CACH;AACD,UAAU,CAAC,WAAW,GAAG,YAAY;AAErC,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAGvC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,EAAA,GACrD,KAAK,EAAA,CACT,CACH;AACD,gBAAgB,CAAC,WAAW,GAAG,kBAAkB;;;;"}
|
|
@@ -20,7 +20,7 @@ const Avatar = React.forwardRef(({ className, size, ...props }, ref) => (jsx("di
|
|
|
20
20
|
Avatar.displayName = "Avatar";
|
|
21
21
|
const AvatarImage = React.forwardRef(({ className, ...props }, ref) => (jsx("img", { ref: ref, className: cn("aspect-square h-full w-full object-cover", className), ...props })));
|
|
22
22
|
AvatarImage.displayName = "AvatarImage";
|
|
23
|
-
const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => (jsx("div", { ref: ref, className: cn("flex h-full w-full items-center justify-center rounded-full bg-gray-100 text-gray-600 font-medium", className), ...props })));
|
|
23
|
+
const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => (jsx("div", { ref: ref, className: cn("flex h-full w-full items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 font-medium", className), ...props })));
|
|
24
24
|
AvatarFallback.displayName = "AvatarFallback";
|
|
25
25
|
|
|
26
26
|
export { Avatar, AvatarFallback, AvatarImage, avatarVariants };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-16 w-16\",\n xl: \"h-20 w-20\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\nconst Avatar = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof avatarVariants>\n>(({ className, size, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(avatarVariants({ size }), className)}\n {...props}\n />\n));\nAvatar.displayName = \"Avatar\";\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={cn(\"aspect-square h-full w-full object-cover\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = \"AvatarImage\";\n\nconst AvatarFallback = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-gray-100 text-gray-600 font-medium\",\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport { Avatar, AvatarImage, AvatarFallback, avatarVariants };"],"names":["_jsx"],"mappings":";;;;;AAIA,MAAM,cAAc,GAAG,GAAG,CACxB,qDAAqD,EACrD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAG7B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MACnCA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,EAAA,GAC9C,KAAK,EAAA,CACT,CACH;AACD,MAAM,CAAC,WAAW,GAAG,QAAQ;AAE7B,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,SAAS,CAAC,EAAA,GAChE,KAAK,EAAA,CACT,CACH;AACD,WAAW,CAAC,WAAW,GAAG,aAAa;AAEvC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAGrC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n {\n variants: {\n size: {\n sm: \"h-8 w-8\",\n md: \"h-10 w-10\",\n lg: \"h-16 w-16\",\n xl: \"h-20 w-20\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\nconst Avatar = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof avatarVariants>\n>(({ className, size, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(avatarVariants({ size }), className)}\n {...props}\n />\n));\nAvatar.displayName = \"Avatar\";\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, ...props }, ref) => (\n <img\n ref={ref}\n className={cn(\"aspect-square h-full w-full object-cover\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = \"AvatarImage\";\n\nconst AvatarFallback = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-300 font-medium\",\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport { Avatar, AvatarImage, AvatarFallback, avatarVariants };"],"names":["_jsx"],"mappings":";;;;;AAIA,MAAM,cAAc,GAAG,GAAG,CACxB,qDAAqD,EACrD;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAGH,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAG7B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MACnCA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,EAAA,GAC9C,KAAK,EAAA,CACT,CACH;AACD,MAAM,CAAC,WAAW,GAAG,QAAQ;AAE7B,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,SAAS,CAAC,EAAA,GAChE,KAAK,EAAA,CACT,CACH;AACD,WAAW,CAAC,WAAW,GAAG,aAAa;AAEvC,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAGrC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,uIAAuI,EACvI,SAAS,CACV,EAAA,GACG,KAAK,EAAA,CACT,CACH;AACD,cAAc,CAAC,WAAW,GAAG,gBAAgB;;;;"}
|
|
@@ -5,12 +5,12 @@ import { cn } from '../../utils/cn.js';
|
|
|
5
5
|
const badgeVariants = cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2", {
|
|
6
6
|
variants: {
|
|
7
7
|
variant: {
|
|
8
|
-
default: "border-transparent bg-primary-600 text-white hover:bg-primary-700",
|
|
9
|
-
secondary: "border-transparent bg-secondary-600 text-white hover:bg-secondary-700",
|
|
10
|
-
success: "border-transparent bg-success-600 text-white hover:bg-success-700",
|
|
11
|
-
danger: "border-transparent bg-danger-600 text-white hover:bg-danger-700",
|
|
12
|
-
warning: "border-transparent bg-warning-600 text-white hover:bg-warning-700",
|
|
13
|
-
outline: "text-gray-700 border-gray-300",
|
|
8
|
+
default: "border-transparent bg-primary-600 dark:bg-primary-500 text-white hover:bg-primary-700 dark:hover:bg-primary-600",
|
|
9
|
+
secondary: "border-transparent bg-secondary-600 dark:bg-secondary-500 text-white hover:bg-secondary-700 dark:hover:bg-secondary-600",
|
|
10
|
+
success: "border-transparent bg-success-600 dark:bg-success-500 text-white hover:bg-success-700 dark:hover:bg-success-600",
|
|
11
|
+
danger: "border-transparent bg-danger-600 dark:bg-danger-500 text-white hover:bg-danger-700 dark:hover:bg-danger-600",
|
|
12
|
+
warning: "border-transparent bg-warning-600 dark:bg-warning-500 text-white hover:bg-warning-700 dark:hover:bg-warning-600",
|
|
13
|
+
outline: "text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600",
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
defaultVariants: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-primary-600 text-white hover:bg-primary-700\",\n secondary: \"border-transparent bg-secondary-600 text-white hover:bg-secondary-700\",\n success: \"border-transparent bg-success-600 text-white hover:bg-success-700\",\n danger: \"border-transparent bg-danger-600 text-white hover:bg-danger-700\",\n warning: \"border-transparent bg-warning-600 text-white hover:bg-warning-700\",\n outline: \"text-gray-700 border-gray-300\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };"],"names":["_jsx"],"mappings":";;;;AAIA,MAAM,aAAa,GAAG,GAAG,CACvB,+KAA+K,EAC/K;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Badge.js","sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-primary-600 dark:bg-primary-500 text-white hover:bg-primary-700 dark:hover:bg-primary-600\",\n secondary: \"border-transparent bg-secondary-600 dark:bg-secondary-500 text-white hover:bg-secondary-700 dark:hover:bg-secondary-600\",\n success: \"border-transparent bg-success-600 dark:bg-success-500 text-white hover:bg-success-700 dark:hover:bg-success-600\",\n danger: \"border-transparent bg-danger-600 dark:bg-danger-500 text-white hover:bg-danger-700 dark:hover:bg-danger-600\",\n warning: \"border-transparent bg-warning-600 dark:bg-warning-500 text-white hover:bg-warning-700 dark:hover:bg-warning-600\",\n outline: \"text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };"],"names":["_jsx"],"mappings":";;;;AAIA,MAAM,aAAa,GAAG,GAAG,CACvB,+KAA+K,EAC/K;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,iHAAiH;AAC1H,YAAA,SAAS,EAAE,yHAAyH;AACpI,YAAA,OAAO,EAAE,iHAAiH;AAC1H,YAAA,MAAM,EAAE,6GAA6G;AACrH,YAAA,OAAO,EAAE,iHAAiH;AAC1H,YAAA,OAAO,EAAE,uEAAuE;AACjF,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AACnB,KAAA;AACF,CAAA;AAOH,SAAS,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAc,EAAA;AACzD,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,KAAK,EAAA,CAAI;AAE5E;;;;"}
|
|
@@ -4,17 +4,17 @@ import { Slot } from '@radix-ui/react-slot';
|
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
5
5
|
import { cn } from '../../utils/cn.js';
|
|
6
6
|
|
|
7
|
-
const buttonVariants = cva("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", {
|
|
7
|
+
const buttonVariants = cva("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-900 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", {
|
|
8
8
|
variants: {
|
|
9
9
|
variant: {
|
|
10
|
-
primary: "bg-primary-600 text-white hover:bg-primary-700",
|
|
11
|
-
secondary: "bg-secondary-600 text-white hover:bg-secondary-700",
|
|
12
|
-
danger: "bg-danger-600 text-white hover:bg-danger-700",
|
|
13
|
-
success: "bg-success-600 text-white hover:bg-success-700",
|
|
14
|
-
warning: "bg-warning-600 text-white hover:bg-warning-700",
|
|
15
|
-
outline: "border border-primary-300 bg-white hover:bg-primary-50",
|
|
16
|
-
ghost: "bg-transparent hover:bg-primary-50",
|
|
17
|
-
link: "text-primary-600 underline-offset-4 hover:underline",
|
|
10
|
+
primary: "bg-primary-600 dark:bg-primary-500 text-white hover:bg-primary-700 dark:hover:bg-primary-600",
|
|
11
|
+
secondary: "bg-secondary-600 dark:bg-secondary-500 text-white hover:bg-secondary-700 dark:hover:bg-secondary-600",
|
|
12
|
+
danger: "bg-danger-600 dark:bg-danger-500 text-white hover:bg-danger-700 dark:hover:bg-danger-600",
|
|
13
|
+
success: "bg-success-600 dark:bg-success-500 text-white hover:bg-success-700 dark:hover:bg-success-600",
|
|
14
|
+
warning: "bg-warning-600 dark:bg-warning-500 text-white hover:bg-warning-700 dark:hover:bg-warning-600",
|
|
15
|
+
outline: "border border-primary-300 dark:border-primary-700 bg-white dark:bg-transparent dark:text-primary-400 hover:bg-primary-50 dark:hover:bg-primary-900/30",
|
|
16
|
+
ghost: "bg-transparent hover:bg-primary-50 dark:hover:bg-primary-900/30 dark:text-gray-300 dark:hover:text-primary-400",
|
|
17
|
+
link: "text-primary-600 dark:text-primary-400 underline-offset-4 hover:underline",
|
|
18
18
|
},
|
|
19
19
|
size: {
|
|
20
20
|
sm: "h-8 px-3 text-xs",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary: \"bg-primary-600 text-white hover:bg-primary-700\",\n secondary: \"bg-secondary-600 text-white hover:bg-secondary-700\",\n danger: \"bg-danger-600 text-white hover:bg-danger-700\",\n success: \"bg-success-600 text-white hover:bg-success-700\",\n warning: \"bg-warning-600 text-white hover:bg-warning-700\",\n outline: \"border border-primary-300 bg-white hover:bg-primary-50\",\n ghost: \"bg-transparent hover:bg-primary-50\",\n link: \"text-primary-600 underline-offset-4 hover:underline\",\n },\n size: {\n sm: \"h-8 px-3 text-xs\",\n md: \"h-10 px-4 py-2\",\n lg: \"h-11 px-8\",\n xl: \"h-12 px-10 text-base\",\n },\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };"],"names":["_jsx"],"mappings":";;;;;;AAKA,MAAM,cAAc,GAAG,GAAG,CACxB,
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-white dark:ring-offset-gray-900 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary: \"bg-primary-600 dark:bg-primary-500 text-white hover:bg-primary-700 dark:hover:bg-primary-600\",\n secondary: \"bg-secondary-600 dark:bg-secondary-500 text-white hover:bg-secondary-700 dark:hover:bg-secondary-600\",\n danger: \"bg-danger-600 dark:bg-danger-500 text-white hover:bg-danger-700 dark:hover:bg-danger-600\",\n success: \"bg-success-600 dark:bg-success-500 text-white hover:bg-success-700 dark:hover:bg-success-600\",\n warning: \"bg-warning-600 dark:bg-warning-500 text-white hover:bg-warning-700 dark:hover:bg-warning-600\",\n outline: \"border border-primary-300 dark:border-primary-700 bg-white dark:bg-transparent dark:text-primary-400 hover:bg-primary-50 dark:hover:bg-primary-900/30\",\n ghost: \"bg-transparent hover:bg-primary-50 dark:hover:bg-primary-900/30 dark:text-gray-300 dark:hover:text-primary-400\",\n link: \"text-primary-600 dark:text-primary-400 underline-offset-4 hover:underline\",\n },\n size: {\n sm: \"h-8 px-3 text-xs\",\n md: \"h-10 px-4 py-2\",\n lg: \"h-11 px-8\",\n xl: \"h-12 px-10 text-base\",\n },\n },\n defaultVariants: {\n variant: \"primary\",\n size: \"md\",\n },\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };"],"names":["_jsx"],"mappings":";;;;;;AAKA,MAAM,cAAc,GAAG,GAAG,CACxB,wVAAwV,EACxV;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,8FAA8F;AACvG,YAAA,SAAS,EAAE,sGAAsG;AACjH,YAAA,MAAM,EAAE,0FAA0F;AAClG,YAAA,OAAO,EAAE,8FAA8F;AACvG,YAAA,OAAO,EAAE,8FAA8F;AACvG,YAAA,OAAO,EAAE,uJAAuJ;AAChK,YAAA,KAAK,EAAE,gHAAgH;AACvH,YAAA,IAAI,EAAE,2EAA2E;AAClF,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,kBAAkB;AACtB,YAAA,EAAE,EAAE,gBAAgB;AACpB,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,sBAAsB;AAC3B,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AASH,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAC7B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;IAC/D,MAAM,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ;IACtC,QACEA,GAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAC3D,GAAG,EAAE,GAAG,EAAA,GACJ,KAAK,EAAA,CACT;AAEN,CAAC;AAEH,MAAM,CAAC,WAAW,GAAG,QAAQ;;;;"}
|
|
@@ -5,12 +5,12 @@ import { cn } from '../../utils/cn.js';
|
|
|
5
5
|
|
|
6
6
|
const cardVariants = cva(
|
|
7
7
|
// Mobile-first responsive, content-fitting, vertical stacking
|
|
8
|
-
"w-full max-w-full flex flex-col rounded-lg border bg-white text-gray-950 shadow-sm", {
|
|
8
|
+
"w-full max-w-full flex flex-col rounded-lg border bg-white dark:bg-gray-900 text-gray-950 dark:text-gray-50 shadow-sm", {
|
|
9
9
|
variants: {
|
|
10
10
|
variant: {
|
|
11
|
-
default: "border-gray-200",
|
|
12
|
-
elevated: "border-gray-200 shadow-md",
|
|
13
|
-
outlined: "border-2 border-primary-200",
|
|
11
|
+
default: "border-gray-200 dark:border-gray-800",
|
|
12
|
+
elevated: "border-gray-200 dark:border-gray-800 shadow-md",
|
|
13
|
+
outlined: "border-2 border-primary-200 dark:border-primary-800",
|
|
14
14
|
},
|
|
15
15
|
padding: {
|
|
16
16
|
none: "p-0",
|
|
@@ -30,7 +30,7 @@ const CardHeader = React.forwardRef(({ className, ...props }, ref) => (jsx("div"
|
|
|
30
30
|
CardHeader.displayName = "CardHeader";
|
|
31
31
|
const CardTitle = React.forwardRef(({ className, ...props }, ref) => (jsx("h3", { ref: ref, className: cn("text-2xl font-semibold leading-none tracking-tight", className), ...props })));
|
|
32
32
|
CardTitle.displayName = "CardTitle";
|
|
33
|
-
const CardDescription = React.forwardRef(({ className, ...props }, ref) => (jsx("p", { ref: ref, className: cn("text-sm text-gray-500", className), ...props })));
|
|
33
|
+
const CardDescription = React.forwardRef(({ className, ...props }, ref) => (jsx("p", { ref: ref, className: cn("text-sm text-gray-500 dark:text-gray-400", className), ...props })));
|
|
34
34
|
CardDescription.displayName = "CardDescription";
|
|
35
35
|
const CardContent = React.forwardRef(({ className, ...props }, ref) => (jsx("div", { ref: ref, className: cn("p-2 sm:p-4 md:p-6 pt-0", className), ...props })));
|
|
36
36
|
CardContent.displayName = "CardContent";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst cardVariants = cva(\n // Mobile-first responsive, content-fitting, vertical stacking\n \"w-full max-w-full flex flex-col rounded-lg border bg-white text-gray-950 shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-gray-200\",\n elevated: \"border-gray-200 shadow-md\",\n outlined: \"border-2 border-primary-200\",\n },\n padding: {\n none: \"p-0\",\n sm: \"p-2 sm:p-4\",\n md: \"p-3 sm:p-6\",\n lg: \"p-4 sm:p-8\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"md\",\n },\n }\n);\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, padding, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(cardVariants({ variant, padding, className }))}\n {...props}\n />\n )\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-2 sm:p-4 md:p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-gray-500\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-2 sm:p-4 md:p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-2 sm:p-4 md:p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n cardVariants,\n};"],"names":["_jsx"],"mappings":";;;;;AAIA,MAAM,YAAY,GAAG,GAAG;AACtB;AACA,
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../../../src/components/Card/Card.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst cardVariants = cva(\n // Mobile-first responsive, content-fitting, vertical stacking\n \"w-full max-w-full flex flex-col rounded-lg border bg-white dark:bg-gray-900 text-gray-950 dark:text-gray-50 shadow-sm\",\n {\n variants: {\n variant: {\n default: \"border-gray-200 dark:border-gray-800\",\n elevated: \"border-gray-200 dark:border-gray-800 shadow-md\",\n outlined: \"border-2 border-primary-200 dark:border-primary-800\",\n },\n padding: {\n none: \"p-0\",\n sm: \"p-2 sm:p-4\",\n md: \"p-3 sm:p-6\",\n lg: \"p-4 sm:p-8\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n padding: \"md\",\n },\n }\n);\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof cardVariants> {}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, padding, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(cardVariants({ variant, padding, className }))}\n {...props}\n />\n )\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-2 sm:p-4 md:p-6\", className)}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className\n )}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-gray-500 dark:text-gray-400\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-2 sm:p-4 md:p-6 pt-0\", className)} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-2 sm:p-4 md:p-6 pt-0\", className)}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n cardVariants,\n};"],"names":["_jsx"],"mappings":";;;;;AAIA,MAAM,YAAY,GAAG,GAAG;AACtB;AACA,uHAAuH,EACvH;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,sCAAsC;AAC/C,YAAA,QAAQ,EAAE,gDAAgD;AAC1D,YAAA,QAAQ,EAAE,qDAAqD;AAChE,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AACjB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,OAAO,EAAE,IAAI;AACd,KAAA;AACF,CAAA;AAOH,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAC3B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7CA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,KACxD,KAAK,EAAA,CACT,CACH;AAEH,IAAI,CAAC,WAAW,GAAG,MAAM;AAEzB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,6CAA6C,EAAE,SAAS,CAAC,EAAA,GACnE,KAAK,EAAA,CACT,CACH;AACD,UAAU,CAAC,WAAW,GAAG,YAAY;AAErC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,IAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,SAAS,CACV,EAAA,GACG,KAAK,EAAA,CACT,CACH;AACD,SAAS,CAAC,WAAW,GAAG,WAAW;AAEnC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAGtC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,GAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,SAAS,CAAC,EAAA,GAChE,KAAK,EAAA,CACT,CACH;AACD,eAAe,CAAC,WAAW,GAAG,iBAAiB;AAE/C,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,SAAS,CAAC,EAAA,GAAM,KAAK,EAAA,CAAI,CACjF;AACD,WAAW,CAAC,WAAW,GAAG,aAAa;AAEvC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC7BA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,SAAS,CAAC,EAAA,GAChE,KAAK,EAAA,CACT,CACH;AACD,UAAU,CAAC,WAAW,GAAG,YAAY;;;;"}
|
|
@@ -4,7 +4,7 @@ import { Check } from 'lucide-react';
|
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
5
5
|
import { cn } from '../../utils/cn.js';
|
|
6
6
|
|
|
7
|
-
const checkboxVariants = cva("peer h-4 w-4 shrink-0 rounded-sm border border-gray-300 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary-600 data-[state=checked]:text-white data-[state=checked]:border-primary-600", {
|
|
7
|
+
const checkboxVariants = cva("peer h-4 w-4 shrink-0 rounded-sm border border-gray-300 dark:border-gray-700 ring-offset-white dark:ring-offset-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary-600 dark:data-[state=checked]:bg-primary-500 data-[state=checked]:text-white data-[state=checked]:border-primary-600 dark:data-[state=checked]:border-primary-500", {
|
|
8
8
|
variants: {
|
|
9
9
|
size: {
|
|
10
10
|
sm: "h-3 w-3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Check } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst checkboxVariants = cva(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-gray-300 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary-600 data-[state=checked]:text-white data-[state=checked]:border-primary-600\",\n {\n variants: {\n size: {\n sm: \"h-3 w-3\",\n md: \"h-4 w-4\",\n lg: \"h-5 w-5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof checkboxVariants> {}\n\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, size, ...props }, ref) => {\n return (\n <div className=\"relative inline-flex items-center\">\n <input\n type=\"checkbox\"\n className={cn(checkboxVariants({ size }), \"appearance-none\", className)}\n ref={ref}\n data-state={props.checked ? \"checked\" : \"unchecked\"}\n {...props}\n />\n {props.checked && (\n <Check\n className={cn(\n \"absolute pointer-events-none text-current\",\n size === \"sm\" && \"h-2 w-2\",\n size === \"md\" && \"h-3 w-3\",\n size === \"lg\" && \"h-4 w-4\"\n )}\n />\n )}\n </div>\n );\n }\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox, checkboxVariants };"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAKA,MAAM,gBAAgB,GAAG,GAAG,CAC1B,
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Check } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../utils/cn\";\n\nconst checkboxVariants = cva(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-gray-300 dark:border-gray-700 ring-offset-white dark:ring-offset-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary-600 dark:data-[state=checked]:bg-primary-500 data-[state=checked]:text-white data-[state=checked]:border-primary-600 dark:data-[state=checked]:border-primary-500\",\n {\n variants: {\n size: {\n sm: \"h-3 w-3\",\n md: \"h-4 w-4\",\n lg: \"h-5 w-5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n }\n);\n\nexport interface CheckboxProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof checkboxVariants> {}\n\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, size, ...props }, ref) => {\n return (\n <div className=\"relative inline-flex items-center\">\n <input\n type=\"checkbox\"\n className={cn(checkboxVariants({ size }), \"appearance-none\", className)}\n ref={ref}\n data-state={props.checked ? \"checked\" : \"unchecked\"}\n {...props}\n />\n {props.checked && (\n <Check\n className={cn(\n \"absolute pointer-events-none text-current\",\n size === \"sm\" && \"h-2 w-2\",\n size === \"md\" && \"h-3 w-3\",\n size === \"lg\" && \"h-4 w-4\"\n )}\n />\n )}\n </div>\n );\n }\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox, checkboxVariants };"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAKA,MAAM,gBAAgB,GAAG,GAAG,CAC1B,2fAA2f,EAC3f;AACE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,SAAS;AACd,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACX,KAAA;AACF,CAAA;AAOH,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAC/B,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;AACrC,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,aAChDC,GAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,iBAAiB,EAAE,SAAS,CAAC,EACvE,GAAG,EAAE,GAAG,EAAA,YAAA,EACI,KAAK,CAAC,OAAO,GAAG,SAAS,GAAG,WAAW,EAAA,GAC/C,KAAK,EAAA,CACT,EACD,KAAK,CAAC,OAAO,KACZA,GAAA,CAAC,KAAK,IACJ,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,IAAI,KAAK,IAAI,IAAI,SAAS,EAC1B,IAAI,KAAK,IAAI,IAAI,SAAS,EAC1B,IAAI,KAAK,IAAI,IAAI,SAAS,CAC3B,GACD,CACH,CAAA,EAAA,CACG;AAEV,CAAC;AAEH,QAAQ,CAAC,WAAW,GAAG,UAAU;;;;"}
|
|
@@ -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: {
|
|
@@ -66,7 +66,7 @@ const ColumnFilter = ({ column, value, onChange, }) => {
|
|
|
66
66
|
};
|
|
67
67
|
if (!column.filterable)
|
|
68
68
|
return null;
|
|
69
|
-
return (jsxs("div", { className: "relative inline-block", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: () => setIsOpen(!isOpen), className: cn("p-1 h-6 w-6", value && "text-primary-600"), children: jsx(Filter, { className: "h-3 w-3" }) }), isOpen && (jsxs(Fragment, { children: [jsx("div", { className: "fixed inset-0 z-10", onClick: () => setIsOpen(false) }), jsxs("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]", children: [column.filterType === 'select' && column.filterOptions ? (jsx("div", { className: "space-y-2", children: column.filterOptions.map((option) => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: tempValue === option.value, onChange: () => setTempValue(tempValue === option.value ? '' : option.value) }), jsx("span", { className: "text-sm", children: option.label })] }, option.value))) })) : (jsx(Input, { placeholder: `Filter ${column.title}`, value: tempValue, onChange: (e) => setTempValue(e.target.value), className: "mb-2" })), jsxs("div", { className: "flex justify-end space-x-2 mt-3", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: handleClear, children: "Clear" }), jsx(Button, { variant: "primary", size: "sm", onClick: handleApply, children: "Apply" })] })] })] }))] }));
|
|
69
|
+
return (jsxs("div", { className: "relative inline-block", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: () => setIsOpen(!isOpen), className: cn("p-1 h-6 w-6", value && "text-primary-600"), children: jsx(Filter, { className: "h-3 w-3" }) }), isOpen && (jsxs(Fragment, { children: [jsx("div", { className: "fixed inset-0 z-10", onClick: () => setIsOpen(false) }), jsxs("div", { className: "absolute top-full left-0 z-20 mt-1 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-800 rounded-lg shadow-lg p-3 min-w-[200px]", children: [column.filterType === 'select' && column.filterOptions ? (jsx("div", { className: "space-y-2", children: column.filterOptions.map((option) => (jsxs("label", { className: "flex items-center space-x-2", children: [jsx(Checkbox, { checked: tempValue === option.value, onChange: () => setTempValue(tempValue === option.value ? '' : option.value) }), jsx("span", { className: "text-sm dark:text-gray-300", children: option.label })] }, option.value))) })) : (jsx(Input, { placeholder: `Filter ${column.title}`, value: tempValue, onChange: (e) => setTempValue(e.target.value), className: "mb-2" })), jsxs("div", { className: "flex justify-end space-x-2 mt-3", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: handleClear, children: "Clear" }), jsx(Button, { variant: "primary", size: "sm", onClick: handleApply, children: "Apply" })] })] })] }))] }));
|
|
70
70
|
};
|
|
71
71
|
// Pagination component
|
|
72
72
|
const TablePagination = ({ pagination, onChange }) => {
|
|
@@ -96,7 +96,7 @@ const TablePagination = ({ pagination, onChange }) => {
|
|
|
96
96
|
label: String(size),
|
|
97
97
|
value: String(size),
|
|
98
98
|
}));
|
|
99
|
-
return (jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-
|
|
99
|
+
return (jsxs("div", { className: "flex items-center justify-between px-4 py-3 bg-white dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800", children: [jsxs("div", { className: "flex items-center space-x-4", children: [jsxs("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: ["Showing ", startRecord, " to ", endRecord, " of ", total, " results"] }), showSizeChanger && (jsxs("div", { className: "flex items-center space-x-2", children: [jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: "Show" }), jsx(Select, { options: selectOptions, value: String(pageSize), onChange: e => onChange(1, Number(e.target.value)), variant: "default", selectSize: "sm", "aria-label": "Select number of items per page" }), jsx("span", { className: "text-sm text-gray-700 dark:text-gray-300", children: "per page" })] }))] }), jsxs("div", { className: "flex items-center space-x-1", children: [jsx(Button, { variant: "ghost", size: "sm", onClick: () => onChange(1, pageSize), disabled: current === 1, "aria-label": "First page", children: jsx(ChevronsLeft, { className: "h-4 w-4" }) }), jsx(Button, { variant: "ghost", size: "sm", onClick: () => onChange(current - 1, pageSize), disabled: current === 1, "aria-label": "Previous page", children: jsx(ChevronLeft, { className: "h-4 w-4" }) }), getPageNumbers().map(page => (jsx(Button, { variant: current === page ? "primary" : "ghost", size: "sm", onClick: () => onChange(page, pageSize), className: "min-w-[32px]", "aria-label": `Go to page ${page}`, children: page }, page))), jsx(Button, { variant: "ghost", size: "sm", onClick: () => onChange(current + 1, pageSize), disabled: current === totalPages, "aria-label": "Next page", children: jsx(ChevronRight, { className: "h-4 w-4" }) }), jsx(Button, { variant: "ghost", size: "sm", onClick: () => onChange(totalPages, pageSize), disabled: current === totalPages, "aria-label": "Last page", children: jsx(ChevronsRight, { className: "h-4 w-4" }) })] })] }));
|
|
100
100
|
};
|
|
101
101
|
const DataTable = ({ columns, dataSource, loading = false, rowKey = 'id', pagination = { current: 1, pageSize: 10, total: 0 }, rowSelection, size = 'middle', bordered = false, showHeader = true, title, footer, className, onSort, onFilter, onChange, ...props }) => {
|
|
102
102
|
const [sortConfig, setSortConfig] = useState({ key: '', direction: null });
|
|
@@ -220,12 +220,12 @@ 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
|
-
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
|
|
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 border-gray-200 dark:border-gray-800 last:border-b-0", children: [jsx("span", { className: "font-medium text-gray-700 dark:text-gray-300", children: column.title }), jsx("span", { className: "text-gray-900 dark:text-gray-100", children: column.render
|
|
229
229
|
? column.render(record[column.dataIndex], record, index)
|
|
230
230
|
: String(record[column.dataIndex] || '') })] }, column.key)))] }) }, key));
|
|
231
231
|
})) })) : (
|
|
@@ -236,12 +236,12 @@ const DataTable = ({ columns, dataSource, loading = false, rowKey = 'id', pagina
|
|
|
236
236
|
type: "header"
|
|
237
237
|
}), column.width && `w-[${column.width}]`), children: jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center space-x-2", children: [jsx("span", { children: column.title }), column.sortable && (jsxs("button", { onClick: () => handleSort(column.key), className: "flex flex-col items-center hover:text-primary-600", children: [jsx(ChevronUp, { className: cn("h-3 w-3", sortConfig.key === column.key && sortConfig.direction === 'asc'
|
|
238
238
|
? "text-primary-600"
|
|
239
|
-
: "text-gray-400") }), jsx(ChevronDown, { className: cn("h-3 w-3 -mt-1", sortConfig.key === column.key && sortConfig.direction === 'desc'
|
|
239
|
+
: "text-gray-400 dark:text-gray-500") }), jsx(ChevronDown, { className: cn("h-3 w-3 -mt-1", sortConfig.key === column.key && sortConfig.direction === 'desc'
|
|
240
240
|
? "text-primary-600"
|
|
241
|
-
: "text-gray-400") })] }))] }), jsx(ColumnFilter, { column: column, value: filters[column.key], onChange: (value) => handleFilter(column.key, value) })] }) }, column.key)))] }) })), jsx("tbody", { children: paginatedData.length === 0 ? (jsx("tr", { children: jsx("td", { colSpan: columns.length + (rowSelection ? 1 : 0), className: cn(cellVariants({ size, align: "center" }), "py-8"), children: jsxs("div", { className: "text-gray-500", children: [jsx("div", { className: "text-4xl mb-2", children: "\uD83D\uDCCB" }), jsx("div", { children: "No data available" })] }) }) })) : (paginatedData.map((record, index) => {
|
|
241
|
+
: "text-gray-400 dark:text-gray-500") })] }))] }), jsx(ColumnFilter, { column: column, value: filters[column.key], onChange: (value) => handleFilter(column.key, value) })] }) }, column.key)))] }) })), jsx("tbody", { children: paginatedData.length === 0 ? (jsx("tr", { children: jsx("td", { colSpan: columns.length + (rowSelection ? 1 : 0), className: cn(cellVariants({ size, align: "center" }), "py-8"), children: jsxs("div", { className: "text-gray-500", children: [jsx("div", { className: "text-4xl mb-2", children: "\uD83D\uDCCB" }), jsx("div", { children: "No data available" })] }) }) })) : (paginatedData.map((record, index) => {
|
|
242
242
|
const key = getRowKey(record, index);
|
|
243
243
|
const isSelected = selectedRowKeys.includes(key);
|
|
244
|
-
return (jsxs("tr", { className: cn("hover:bg-gray-50 transition-colors", isSelected && "bg-primary-50"), ...(props.onRow?.(record, index) ?? {}), children: [rowSelection && (jsx("td", { className: cn(cellVariants({ size })), children: jsx(Checkbox, { checked: isSelected, onChange: (e) => handleRowSelect(record, e.target.checked), ...rowSelection.getCheckboxProps?.(record) }) })), columns.map((column) => (jsx("td", { className: cn(cellVariants({
|
|
244
|
+
return (jsxs("tr", { className: cn("hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors", isSelected && "bg-primary-50 dark:bg-primary-900/20"), ...(props.onRow?.(record, index) ?? {}), children: [rowSelection && (jsx("td", { className: cn(cellVariants({ size })), children: jsx(Checkbox, { checked: isSelected, onChange: (e) => handleRowSelect(record, e.target.checked), ...rowSelection.getCheckboxProps?.(record) }) })), columns.map((column) => (jsx("td", { className: cn(cellVariants({
|
|
245
245
|
size,
|
|
246
246
|
align: column.align
|
|
247
247
|
})), children: column.render
|