hazo_auth 4.0.0 → 4.2.0

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.
Files changed (93) hide show
  1. package/README.md +312 -8
  2. package/SETUP_CHECKLIST.md +203 -0
  3. package/dist/app/api/hazo_auth/forgot_password/route.d.ts.map +1 -1
  4. package/dist/app/api/hazo_auth/forgot_password/route.js +15 -0
  5. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -1
  6. package/dist/app/api/hazo_auth/logout/route.js +31 -0
  7. package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
  8. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -1
  9. package/dist/app/api/hazo_auth/me/route.js +19 -1
  10. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts +2 -0
  11. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -1
  12. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +8 -0
  13. package/dist/components/layouts/forgot_password/index.d.ts +7 -1
  14. package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
  15. package/dist/components/layouts/forgot_password/index.js +7 -2
  16. package/dist/components/layouts/login/index.d.ts +13 -1
  17. package/dist/components/layouts/login/index.d.ts.map +1 -1
  18. package/dist/components/layouts/login/index.js +11 -2
  19. package/dist/components/layouts/my_settings/components/connected_accounts_section.d.ts +17 -0
  20. package/dist/components/layouts/my_settings/components/connected_accounts_section.d.ts.map +1 -0
  21. package/dist/components/layouts/my_settings/components/connected_accounts_section.js +17 -0
  22. package/dist/components/layouts/my_settings/components/set_password_section.d.ts +26 -0
  23. package/dist/components/layouts/my_settings/components/set_password_section.d.ts.map +1 -0
  24. package/dist/components/layouts/my_settings/components/set_password_section.js +127 -0
  25. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts +3 -0
  26. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -1
  27. package/dist/components/layouts/my_settings/hooks/use_my_settings.js +9 -0
  28. package/dist/components/layouts/my_settings/index.d.ts.map +1 -1
  29. package/dist/components/layouts/my_settings/index.js +4 -2
  30. package/dist/components/layouts/profile_stamp_test/index.d.ts +10 -0
  31. package/dist/components/layouts/profile_stamp_test/index.d.ts.map +1 -0
  32. package/dist/components/layouts/profile_stamp_test/index.js +51 -0
  33. package/dist/components/layouts/shared/components/google_icon.d.ts +12 -0
  34. package/dist/components/layouts/shared/components/google_icon.d.ts.map +1 -0
  35. package/dist/components/layouts/shared/components/google_icon.js +9 -0
  36. package/dist/components/layouts/shared/components/google_sign_in_button.d.ts +21 -0
  37. package/dist/components/layouts/shared/components/google_sign_in_button.d.ts.map +1 -0
  38. package/dist/components/layouts/shared/components/google_sign_in_button.js +50 -0
  39. package/dist/components/layouts/shared/components/oauth_divider.d.ts +13 -0
  40. package/dist/components/layouts/shared/components/oauth_divider.d.ts.map +1 -0
  41. package/dist/components/layouts/shared/components/oauth_divider.js +13 -0
  42. package/dist/components/layouts/shared/components/profile_stamp.d.ts +58 -0
  43. package/dist/components/layouts/shared/components/profile_stamp.d.ts.map +1 -0
  44. package/dist/components/layouts/shared/components/profile_stamp.js +72 -0
  45. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.d.ts.map +1 -1
  46. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +2 -2
  47. package/dist/components/layouts/shared/hooks/use_auth_status.d.ts +6 -0
  48. package/dist/components/layouts/shared/hooks/use_auth_status.d.ts.map +1 -1
  49. package/dist/components/layouts/shared/hooks/use_auth_status.js +8 -0
  50. package/dist/components/layouts/shared/index.d.ts +7 -0
  51. package/dist/components/layouts/shared/index.d.ts.map +1 -1
  52. package/dist/components/layouts/shared/index.js +4 -0
  53. package/dist/components/ui/button.d.ts +1 -1
  54. package/dist/components/ui/hover-card.d.ts +7 -0
  55. package/dist/components/ui/hover-card.d.ts.map +1 -0
  56. package/dist/components/ui/hover-card.js +29 -0
  57. package/dist/components/ui/index.d.ts +1 -0
  58. package/dist/components/ui/index.d.ts.map +1 -1
  59. package/dist/components/ui/index.js +1 -0
  60. package/dist/lib/auth/nextauth_config.d.ts +34 -0
  61. package/dist/lib/auth/nextauth_config.d.ts.map +1 -0
  62. package/dist/lib/auth/nextauth_config.js +171 -0
  63. package/dist/lib/config/default_config.d.ts +24 -0
  64. package/dist/lib/config/default_config.d.ts.map +1 -1
  65. package/dist/lib/config/default_config.js +14 -0
  66. package/dist/lib/index.d.ts +2 -0
  67. package/dist/lib/index.d.ts.map +1 -1
  68. package/dist/lib/index.js +1 -0
  69. package/dist/lib/login_config.server.d.ts +3 -0
  70. package/dist/lib/login_config.server.d.ts.map +1 -1
  71. package/dist/lib/login_config.server.js +4 -0
  72. package/dist/lib/oauth_config.server.d.ts +29 -0
  73. package/dist/lib/oauth_config.server.d.ts.map +1 -0
  74. package/dist/lib/oauth_config.server.js +40 -0
  75. package/dist/lib/services/login_service.d.ts.map +1 -1
  76. package/dist/lib/services/login_service.js +16 -1
  77. package/dist/lib/services/oauth_service.d.ts +88 -0
  78. package/dist/lib/services/oauth_service.d.ts.map +1 -0
  79. package/dist/lib/services/oauth_service.js +376 -0
  80. package/dist/lib/services/password_reset_service.d.ts +2 -0
  81. package/dist/lib/services/password_reset_service.d.ts.map +1 -1
  82. package/dist/lib/services/password_reset_service.js +10 -0
  83. package/dist/lib/services/registration_service.d.ts.map +1 -1
  84. package/dist/lib/services/registration_service.js +1 -0
  85. package/dist/lib/utils/password_validator.d.ts +13 -0
  86. package/dist/lib/utils/password_validator.d.ts.map +1 -0
  87. package/dist/lib/utils/password_validator.js +36 -0
  88. package/dist/server_pages/login.d.ts.map +1 -1
  89. package/dist/server_pages/login.js +6 -1
  90. package/dist/server_pages/login_client_wrapper.d.ts +5 -2
  91. package/dist/server_pages/login_client_wrapper.d.ts.map +1 -1
  92. package/dist/server_pages/login_client_wrapper.js +2 -2
  93. package/package.json +3 -1
@@ -0,0 +1,51 @@
1
+ // file_description: Test page layout for ProfileStamp component demonstrating various scenarios
2
+ // section: client_directive
3
+ "use client";
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ // section: imports
6
+ import { useState } from "react";
7
+ import { ProfileStamp } from "../shared/components/profile_stamp";
8
+ import { use_auth_status } from "../shared/hooks/use_auth_status";
9
+ import { Button } from "../../ui/button";
10
+ import { Card } from "../../ui/card";
11
+ // section: component
12
+ /**
13
+ * ProfileStampTestLayout - Test page for ProfileStamp component
14
+ * Demonstrates various scenarios and configurations
15
+ */
16
+ export function ProfileStampTestLayout({ className }) {
17
+ const authStatus = use_auth_status();
18
+ const [showCustomFields, setShowCustomFields] = useState(true);
19
+ // Sample custom fields for testing
20
+ const sampleCustomFields = [
21
+ { label: "Role", value: "Administrator" },
22
+ { label: "Department", value: "Engineering" },
23
+ { label: "Joined", value: "Jan 2024" },
24
+ ];
25
+ return (_jsxs("div", { className: `cls_profile_stamp_test_layout w-full max-w-4xl mx-auto p-6 ${className || ""}`, children: [_jsx("h1", { className: "text-2xl font-bold mb-6", children: "ProfileStamp Component Test" }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-2", children: "Current Auth Status" }), _jsxs("div", { className: "grid grid-cols-2 gap-2 text-sm", children: [_jsx("div", { children: "Authenticated:" }), _jsx("div", { className: authStatus.authenticated ? "text-green-600" : "text-red-600", children: authStatus.authenticated ? "Yes" : "No" }), _jsx("div", { children: "User ID:" }), _jsx("div", { children: authStatus.user_id || "N/A" }), _jsx("div", { children: "Name:" }), _jsx("div", { children: authStatus.name || "N/A" }), _jsx("div", { children: "Email:" }), _jsx("div", { children: authStatus.email || "N/A" }), _jsx("div", { children: "Profile Picture URL:" }), _jsx("div", { className: "truncate", children: authStatus.profile_picture_url || "N/A" }), _jsx("div", { children: "Profile Source:" }), _jsx("div", { children: authStatus.profile_source || "N/A" })] })] }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Size Variants" }), _jsxs("div", { className: "flex items-end gap-6", children: [_jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx(ProfileStamp, { size: "sm" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "sm (24px)" })] }), _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx(ProfileStamp, { size: "default" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "default (32px)" })] }), _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx(ProfileStamp, { size: "lg" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "lg (40px)" })] })] })] }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "With Custom Fields" }), _jsx("div", { className: "flex items-center gap-4 mb-4", children: _jsx(Button, { variant: showCustomFields ? "default" : "outline", size: "sm", onClick: () => setShowCustomFields(!showCustomFields), children: showCustomFields ? "Hide Custom Fields" : "Show Custom Fields" }) }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(ProfileStamp, { size: "lg", custom_fields: showCustomFields ? sampleCustomFields : [] }), _jsxs("span", { className: "text-sm text-muted-foreground", children: ["Hover to see ", showCustomFields ? "name, email, and custom fields" : "name and email only"] })] }), showCustomFields && (_jsx("div", { className: "mt-4 p-3 bg-muted rounded-md", children: _jsxs("div", { className: "text-xs font-mono", children: ["custom_fields=", JSON.stringify(sampleCustomFields, null, 2)] }) }))] }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Display Options" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx(ProfileStamp, { show_name: true, show_email: true }), _jsx("span", { className: "text-sm text-muted-foreground", children: "show_name=true, show_email=true (default)" })] }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(ProfileStamp, { show_name: true, show_email: false }), _jsx("span", { className: "text-sm text-muted-foreground", children: "show_name=true, show_email=false" })] }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(ProfileStamp, { show_name: false, show_email: true }), _jsx("span", { className: "text-sm text-muted-foreground", children: "show_name=false, show_email=true" })] }), _jsxs("div", { className: "flex items-center gap-4", children: [_jsx(ProfileStamp, { show_name: false, show_email: false }), _jsx("span", { className: "text-sm text-muted-foreground", children: "show_name=false, show_email=false (no hover card)" })] })] })] }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Inline Usage Example (Note Attribution)" }), _jsx("div", { className: "border rounded-lg p-4 bg-background", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(ProfileStamp, { size: "default" }), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex items-center gap-2 mb-1", children: [_jsx("span", { className: "font-medium text-sm", children: authStatus.name || "User" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "2 hours ago" })] }), _jsx("p", { className: "text-sm text-foreground", children: "This is an example note with a ProfileStamp component showing who added it. Hover over the profile picture to see more details about the user." })] })] }) })] }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Comment Thread Example" }), _jsx("div", { className: "space-y-4", children: [
26
+ { time: "3 hours ago", text: "Great progress on the project!" },
27
+ { time: "2 hours ago", text: "I agree, the new features look amazing." },
28
+ { time: "1 hour ago", text: "Let me know if you need any help with the deployment." },
29
+ ].map((comment, index) => (_jsxs("div", { className: "flex items-start gap-3 border-b pb-4 last:border-b-0", children: [_jsx(ProfileStamp, { size: "sm", custom_fields: [{ label: "Comment", value: `#${index + 1}` }] }), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex items-center gap-2 mb-1", children: [_jsx("span", { className: "font-medium text-sm", children: authStatus.name || "User" }), _jsx("span", { className: "text-xs text-muted-foreground", children: comment.time })] }), _jsx("p", { className: "text-sm text-foreground", children: comment.text })] })] }, index))) })] }), _jsxs(Card, { className: "p-4 mb-6", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "API Response Fields" }), _jsx("p", { className: "text-sm text-muted-foreground mb-3", children: "The /api/hazo_auth/me endpoint now returns these profile picture fields:" }), _jsx("div", { className: "p-3 bg-muted rounded-md font-mono text-xs", children: _jsx("pre", { children: `{
30
+ "profile_picture_url": "${authStatus.profile_picture_url || "null"}",
31
+ "profile_image": "${authStatus.profile_image || "null"}", // alias
32
+ "avatar_url": "${authStatus.avatar_url || "null"}", // alias
33
+ "image": "${authStatus.image || "null"}" // alias
34
+ }` }) })] }), _jsxs(Card, { className: "p-4", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Usage Code Example" }), _jsx("div", { className: "p-3 bg-muted rounded-md font-mono text-xs overflow-x-auto", children: _jsx("pre", { children: `// Basic usage
35
+ import { ProfileStamp } from "hazo_auth/client";
36
+
37
+ <ProfileStamp />
38
+
39
+ // With all options
40
+ <ProfileStamp
41
+ size="lg"
42
+ show_name={true}
43
+ show_email={true}
44
+ custom_fields={[
45
+ { label: "Role", value: "Admin" },
46
+ { label: "Department", value: "IT" }
47
+ ]}
48
+ className="my-custom-class"
49
+ />` }) })] })] }));
50
+ }
51
+ export default ProfileStampTestLayout;
@@ -0,0 +1,12 @@
1
+ export type GoogleIconProps = {
2
+ className?: string;
3
+ width?: number;
4
+ height?: number;
5
+ };
6
+ /**
7
+ * Google logo SVG component
8
+ * Uses official Google brand colors
9
+ */
10
+ export declare function GoogleIcon({ className, width, height, }: GoogleIconProps): import("react/jsx-runtime").JSX.Element;
11
+ export default GoogleIcon;
12
+ //# sourceMappingURL=google_icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google_icon.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/google_icon.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAc,EACd,KAAU,EACV,MAAW,GACZ,EAAE,eAAe,2CA6BjB;AAED,eAAe,UAAU,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Google logo SVG component
4
+ * Uses official Google brand colors
5
+ */
6
+ export function GoogleIcon({ className = "", width = 20, height = 20, }) {
7
+ return (_jsxs("svg", { className: className, width: width, height: height, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [_jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z", fill: "#4285F4" }), _jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }), _jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: "#FBBC05" }), _jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })] }));
8
+ }
9
+ export default GoogleIcon;
@@ -0,0 +1,21 @@
1
+ export type GoogleSignInButtonProps = {
2
+ /** Text displayed on the button */
3
+ label?: string;
4
+ /** Custom click handler - if not provided, redirects to Google OAuth */
5
+ onClick?: () => void;
6
+ /** Disable the button */
7
+ disabled?: boolean;
8
+ /** Additional CSS classes */
9
+ className?: string;
10
+ /** Callback URL after OAuth (default: /api/hazo_auth/oauth/google/callback) */
11
+ callbackUrl?: string;
12
+ };
13
+ /**
14
+ * Google Sign-In button component
15
+ * Displays the Google logo with configurable text
16
+ * Initiates the Google OAuth flow when clicked
17
+ * Uses next-auth/react signIn function for proper OAuth flow
18
+ */
19
+ export declare function GoogleSignInButton({ label, onClick, disabled, className, callbackUrl, }: GoogleSignInButtonProps): import("react/jsx-runtime").JSX.Element;
20
+ export default GoogleSignInButton;
21
+ //# sourceMappingURL=google_sign_in_button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google_sign_in_button.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/google_sign_in_button.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,uBAAuB,GAAG;IACpC,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAA8B,EAC9B,OAAO,EACP,QAAgB,EAChB,SAAS,EACT,WAAoD,GACrD,EAAE,uBAAuB,2CAmDzB;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,50 @@
1
+ // file_description: Google Sign-In button component with official Google icon
2
+ // section: client_directive
3
+ "use client";
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ // section: imports
6
+ import { Button } from "../../../ui/button";
7
+ import { GoogleIcon } from "./google_icon";
8
+ import { cn } from "../../../../lib/utils";
9
+ import { useState } from "react";
10
+ import { Loader2 } from "lucide-react";
11
+ import { signIn } from "next-auth/react";
12
+ // section: component
13
+ /**
14
+ * Google Sign-In button component
15
+ * Displays the Google logo with configurable text
16
+ * Initiates the Google OAuth flow when clicked
17
+ * Uses next-auth/react signIn function for proper OAuth flow
18
+ */
19
+ export function GoogleSignInButton({ label = "Continue with Google", onClick, disabled = false, className, callbackUrl = "/api/hazo_auth/oauth/google/callback", }) {
20
+ const [isLoading, setIsLoading] = useState(false);
21
+ const handleClick = async () => {
22
+ if (disabled || isLoading)
23
+ return;
24
+ if (onClick) {
25
+ onClick();
26
+ }
27
+ else {
28
+ setIsLoading(true);
29
+ try {
30
+ // Use next-auth/react signIn function for proper OAuth flow
31
+ // redirect: true (default) lets NextAuth handle the full flow
32
+ // including the redirect callback which goes to our custom callback URL
33
+ console.log("[GoogleSignInButton] Starting Google OAuth with callbackUrl:", callbackUrl);
34
+ await signIn("google", {
35
+ callbackUrl,
36
+ redirect: true,
37
+ });
38
+ // Note: redirect: true means this code won't execute after success
39
+ // as the browser will be redirected
40
+ }
41
+ catch (error) {
42
+ console.error("[GoogleSignInButton] Sign-in exception:", error);
43
+ alert(`Google Sign-In Exception: ${error}`);
44
+ setIsLoading(false);
45
+ }
46
+ }
47
+ };
48
+ return (_jsxs(Button, { type: "button", variant: "outline", onClick: handleClick, disabled: disabled || isLoading, className: cn("cls_google_sign_in_button w-full flex items-center justify-center gap-3 h-11 border-slate-300 hover:bg-slate-50 hover:border-slate-400 transition-colors", className), "aria-label": label, children: [isLoading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin text-slate-600", "aria-hidden": "true" })) : (_jsx(GoogleIcon, { className: "h-5 w-5" })), _jsx("span", { className: "text-slate-700 font-medium", children: isLoading ? "Signing in..." : label })] }));
49
+ }
50
+ export default GoogleSignInButton;
@@ -0,0 +1,13 @@
1
+ export type OAuthDividerProps = {
2
+ /** Text displayed in the divider */
3
+ text?: string;
4
+ /** Additional CSS classes */
5
+ className?: string;
6
+ };
7
+ /**
8
+ * Visual divider component to separate OAuth buttons from email/password form
9
+ * Displays a horizontal line with text in the center
10
+ */
11
+ export declare function OAuthDivider({ text, className, }: OAuthDividerProps): import("react/jsx-runtime").JSX.Element;
12
+ export default OAuthDivider;
13
+ //# sourceMappingURL=oauth_divider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth_divider.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/oauth_divider.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAA+B,EAC/B,SAAS,GACV,EAAE,iBAAiB,2CAoBnB;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // file_description: Visual divider between OAuth buttons and email/password form
3
+ // section: imports
4
+ import { cn } from "../../../../lib/utils";
5
+ // section: component
6
+ /**
7
+ * Visual divider component to separate OAuth buttons from email/password form
8
+ * Displays a horizontal line with text in the center
9
+ */
10
+ export function OAuthDivider({ text = "or continue with email", className, }) {
11
+ return (_jsxs("div", { className: cn("cls_oauth_divider relative my-6", className), role: "separator", "aria-orientation": "horizontal", children: [_jsx("div", { className: "absolute inset-0 flex items-center", "aria-hidden": "true", children: _jsx("span", { className: "w-full border-t border-slate-200" }) }), _jsx("div", { className: "relative flex justify-center text-sm", children: _jsx("span", { className: "bg-white px-3 text-slate-500", children: text }) })] }));
12
+ }
13
+ export default OAuthDivider;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Custom field to display in the hover card
3
+ */
4
+ export type ProfileStampCustomField = {
5
+ label: string;
6
+ value: string;
7
+ };
8
+ /**
9
+ * Props for the ProfileStamp component
10
+ */
11
+ export type ProfileStampProps = {
12
+ /**
13
+ * Size variant for the avatar
14
+ * - sm: h-6 w-6 (24px)
15
+ * - default: h-8 w-8 (32px)
16
+ * - lg: h-10 w-10 (40px)
17
+ */
18
+ size?: "sm" | "default" | "lg";
19
+ /**
20
+ * Custom fields to display in the hover card
21
+ */
22
+ custom_fields?: ProfileStampCustomField[];
23
+ /**
24
+ * Additional CSS classes to apply to the wrapper
25
+ */
26
+ className?: string;
27
+ /**
28
+ * Whether to show the user's name in the hover card (default: true)
29
+ */
30
+ show_name?: boolean;
31
+ /**
32
+ * Whether to show the user's email in the hover card (default: true)
33
+ */
34
+ show_email?: boolean;
35
+ };
36
+ /**
37
+ * ProfileStamp component - displays a circular profile picture with a hover card
38
+ * showing the user's name, email, and any custom fields.
39
+ *
40
+ * Use this component to add profile attribution to notes, comments, or any
41
+ * user-generated content in your application.
42
+ *
43
+ * @example
44
+ * // Basic usage
45
+ * <ProfileStamp />
46
+ *
47
+ * @example
48
+ * // With custom fields
49
+ * <ProfileStamp
50
+ * size="lg"
51
+ * custom_fields={[
52
+ * { label: "Role", value: "Admin" },
53
+ * { label: "Department", value: "Engineering" }
54
+ * ]}
55
+ * />
56
+ */
57
+ export declare function ProfileStamp({ size, custom_fields, className, show_name, show_email, }: ProfileStampProps): import("react/jsx-runtime").JSX.Element;
58
+ //# sourceMappingURL=profile_stamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile_stamp.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/profile_stamp.tsx"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,aAAa,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC1C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAGF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAgB,EAChB,aAAkB,EAClB,SAAS,EACT,SAAgB,EAChB,UAAiB,GAClB,EAAE,iBAAiB,2CAwInB"}
@@ -0,0 +1,72 @@
1
+ // file_description: ProfileStamp component - circular profile picture with hover card showing user details
2
+ // section: client_directive
3
+ "use client";
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ // section: imports
6
+ import { Avatar, AvatarImage, AvatarFallback } from "../../../ui/avatar";
7
+ import { HoverCard, HoverCardTrigger, HoverCardContent, } from "../../../ui/hover-card";
8
+ import { use_auth_status } from "../hooks/use_auth_status";
9
+ // section: component
10
+ /**
11
+ * ProfileStamp component - displays a circular profile picture with a hover card
12
+ * showing the user's name, email, and any custom fields.
13
+ *
14
+ * Use this component to add profile attribution to notes, comments, or any
15
+ * user-generated content in your application.
16
+ *
17
+ * @example
18
+ * // Basic usage
19
+ * <ProfileStamp />
20
+ *
21
+ * @example
22
+ * // With custom fields
23
+ * <ProfileStamp
24
+ * size="lg"
25
+ * custom_fields={[
26
+ * { label: "Role", value: "Admin" },
27
+ * { label: "Department", value: "Engineering" }
28
+ * ]}
29
+ * />
30
+ */
31
+ export function ProfileStamp({ size = "default", custom_fields = [], className, show_name = true, show_email = true, }) {
32
+ const authStatus = use_auth_status();
33
+ // Avatar size classes
34
+ const avatarSizeClasses = {
35
+ sm: "h-6 w-6",
36
+ default: "h-8 w-8",
37
+ lg: "h-10 w-10",
38
+ };
39
+ // Get initials from name or email
40
+ const getInitials = () => {
41
+ var _a, _b;
42
+ if (authStatus.name) {
43
+ const parts = authStatus.name.trim().split(" ");
44
+ if (parts.length >= 2) {
45
+ return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();
46
+ }
47
+ return ((_a = authStatus.name[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || "";
48
+ }
49
+ if (authStatus.email) {
50
+ return ((_b = authStatus.email[0]) === null || _b === void 0 ? void 0 : _b.toUpperCase()) || "";
51
+ }
52
+ return "?";
53
+ };
54
+ // Show loading skeleton
55
+ if (authStatus.loading) {
56
+ return (_jsx("div", { className: `cls_profile_stamp inline-block ${className || ""}`, children: _jsx("div", { className: `${avatarSizeClasses[size]} rounded-full bg-[var(--hazo-bg-emphasis)] animate-pulse`, "aria-label": "Loading profile" }) }));
57
+ }
58
+ // Not authenticated - show placeholder
59
+ if (!authStatus.authenticated) {
60
+ return (_jsx("div", { className: `cls_profile_stamp inline-block ${className || ""}`, children: _jsx(Avatar, { className: `cls_profile_stamp_avatar ${avatarSizeClasses[size]}`, children: _jsx(AvatarFallback, { className: "cls_profile_stamp_fallback bg-[var(--hazo-bg-emphasis)] text-[var(--hazo-text-muted)]", children: "?" }) }) }));
61
+ }
62
+ // Check if there's any content to show in the hover card
63
+ const hasHoverContent = (show_name && authStatus.name) ||
64
+ (show_email && authStatus.email) ||
65
+ custom_fields.length > 0;
66
+ // If no hover content, just show the avatar without hover card
67
+ if (!hasHoverContent) {
68
+ return (_jsx("div", { className: `cls_profile_stamp inline-block ${className || ""}`, children: _jsxs(Avatar, { className: `cls_profile_stamp_avatar ${avatarSizeClasses[size]}`, children: [_jsx(AvatarImage, { src: authStatus.profile_picture_url, alt: authStatus.name ? `Profile picture of ${authStatus.name}` : "Profile picture", className: "cls_profile_stamp_image" }), _jsx(AvatarFallback, { className: "cls_profile_stamp_fallback bg-[var(--hazo-bg-emphasis)] text-[var(--hazo-text-muted)]", children: getInitials() })] }) }));
69
+ }
70
+ // Authenticated with hover content - show avatar with hover card
71
+ return (_jsx("div", { className: `cls_profile_stamp inline-block ${className || ""}`, children: _jsxs(HoverCard, { children: [_jsx(HoverCardTrigger, { asChild: true, children: _jsx("button", { type: "button", className: "cls_profile_stamp_trigger cursor-pointer focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary rounded-full", "aria-label": `View profile information for ${authStatus.name || authStatus.email || "user"}`, children: _jsxs(Avatar, { className: `cls_profile_stamp_avatar ${avatarSizeClasses[size]}`, children: [_jsx(AvatarImage, { src: authStatus.profile_picture_url, alt: authStatus.name ? `Profile picture of ${authStatus.name}` : "Profile picture", className: "cls_profile_stamp_image" }), _jsx(AvatarFallback, { className: "cls_profile_stamp_fallback bg-[var(--hazo-bg-emphasis)] text-[var(--hazo-text-muted)]", children: getInitials() })] }) }) }), _jsx(HoverCardContent, { align: "start", className: "cls_profile_stamp_hover_card w-auto min-w-[200px]", children: _jsxs("div", { className: "cls_profile_stamp_hover_content flex flex-col gap-2", children: [show_name && authStatus.name && (_jsx("div", { className: "cls_profile_stamp_name text-sm font-semibold text-foreground", children: authStatus.name })), show_email && authStatus.email && (_jsx("div", { className: "cls_profile_stamp_email text-sm text-muted-foreground", children: authStatus.email })), custom_fields.length > 0 && (_jsx("div", { className: "cls_profile_stamp_custom_fields flex flex-col gap-1 pt-2 border-t", children: custom_fields.map((field, index) => (_jsxs("div", { className: "cls_profile_stamp_custom_field flex justify-between gap-4 text-sm", children: [_jsxs("span", { className: "cls_profile_stamp_field_label text-muted-foreground", children: [field.label, ":"] }), _jsx("span", { className: "cls_profile_stamp_field_value text-foreground font-medium", children: field.value })] }, `${field.label}-${index}`))) }))] }) })] }) }));
72
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar_layout_wrapper.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/sidebar_layout_wrapper.tsx"],"names":[],"mappings":"AAwBA,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAqL3E"}
1
+ {"version":3,"file":"sidebar_layout_wrapper.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/sidebar_layout_wrapper.tsx"],"names":[],"mappings":"AAwBA,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAiM3E"}
@@ -5,11 +5,11 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  // section: imports
6
6
  import Link from "next/link";
7
7
  import { Sidebar, SidebarContent, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarTrigger, SidebarInset, } from "../../../ui/sidebar";
8
- import { LogIn, UserPlus, BookOpen, ExternalLink, Database, KeyRound, MailCheck, Key, User, ShieldCheck } from "lucide-react";
8
+ import { LogIn, UserPlus, BookOpen, ExternalLink, Database, KeyRound, MailCheck, Key, User, ShieldCheck, CircleUserRound } from "lucide-react";
9
9
  import { use_auth_status } from "../hooks/use_auth_status";
10
10
  import { ProfilePicMenu } from "./profile_pic_menu";
11
11
  // section: component
12
12
  export function SidebarLayoutWrapper({ children }) {
13
13
  const authStatus = use_auth_status();
14
- return (_jsx(SidebarProvider, { children: _jsxs("div", { className: "cls_sidebar_layout_wrapper flex min-h-screen w-full", children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeader, { className: "cls_sidebar_layout_header", children: _jsx("div", { className: "cls_sidebar_layout_title flex items-center gap-2 px-2 py-4", children: _jsx("h1", { className: "cls_sidebar_layout_title_text text-lg font-semibold text-sidebar-foreground", children: "hazo auth" }) }) }), _jsxs(SidebarContent, { className: "cls_sidebar_layout_content", children: [_jsxs(SidebarGroup, { className: "cls_sidebar_layout_test_group", children: [_jsx(SidebarGroupLabel, { className: "cls_sidebar_layout_group_label", children: "Test components" }), _jsxs(SidebarMenu, { className: "cls_sidebar_layout_test_menu", children: [_jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_login_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/login", className: "cls_sidebar_layout_test_login_link flex items-center gap-2", "aria-label": "Test login layout component", children: [_jsx(LogIn, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test login" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_register_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/register", className: "cls_sidebar_layout_test_register_link flex items-center gap-2", "aria-label": "Test register layout component", children: [_jsx(UserPlus, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test register" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_forgot_password_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/forgot_password", className: "cls_sidebar_layout_test_forgot_password_link flex items-center gap-2", "aria-label": "Test forgot password layout component", children: [_jsx(KeyRound, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test forgot password" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_reset_password_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/reset_password", className: "cls_sidebar_layout_test_reset_password_link flex items-center gap-2", "aria-label": "Test reset password layout component", children: [_jsx(Key, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test reset password" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_email_verification_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/verify_email", className: "cls_sidebar_layout_test_email_verification_link flex items-center gap-2", "aria-label": "Test email verification layout component", children: [_jsx(MailCheck, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test email verification" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_sqlite_admin_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_connect/sqlite_admin", className: "cls_sidebar_layout_sqlite_admin_link flex items-center gap-2", "aria-label": "Open SQLite admin UI to browse and edit database", children: [_jsx(Database, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "SQLite Admin" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_user_management_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/user_management", className: "cls_sidebar_layout_user_management_link flex items-center gap-2", "aria-label": "Open User Management to manage users, roles, and permissions", children: [_jsx(User, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "User Management" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_rbac_test_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/rbac_test", className: "cls_sidebar_layout_rbac_test_link flex items-center gap-2", "aria-label": "Test RBAC and HRBAC access control", children: [_jsx(ShieldCheck, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "RBAC/HRBAC Test" })] }) }) })] })] }), _jsx(ProfilePicMenu, { variant: "sidebar", avatar_size: "sm", className: "cls_sidebar_layout_profile_menu", sidebar_group_label: "Account" }), _jsxs(SidebarGroup, { className: "cls_sidebar_layout_resources_group", children: [_jsx(SidebarGroupLabel, { className: "cls_sidebar_layout_group_label", children: "Resources" }), _jsxs(SidebarMenu, { className: "cls_sidebar_layout_resources_menu", children: [_jsx(SidebarMenuItem, { className: "cls_sidebar_layout_storybook_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs("a", { href: "http://localhost:6006", target: "_blank", rel: "noopener noreferrer", className: "cls_sidebar_layout_storybook_link flex items-center gap-2", "aria-label": "Open Storybook preview for reusable components", children: [_jsx(BookOpen, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Storybook" }), _jsx(ExternalLink, { className: "ml-auto h-3 w-3", "aria-hidden": "true" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_docs_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs("a", { href: "https://ui.shadcn.com/docs", target: "_blank", rel: "noopener noreferrer", className: "cls_sidebar_layout_docs_link flex items-center gap-2", "aria-label": "Review shadcn documentation for styling guidance", children: [_jsx(BookOpen, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Shadcn docs" }), _jsx(ExternalLink, { className: "ml-auto h-3 w-3", "aria-hidden": "true" })] }) }) })] })] })] })] }), _jsxs(SidebarInset, { className: "cls_sidebar_layout_inset", children: [_jsxs("header", { className: "cls_sidebar_layout_main_header flex h-16 shrink-0 items-center gap-2 border-b px-4", children: [_jsx(SidebarTrigger, { className: "cls_sidebar_layout_trigger" }), _jsx("div", { className: "cls_sidebar_layout_main_header_content flex flex-1 items-center gap-2", children: _jsx("h2", { className: "cls_sidebar_layout_main_title text-lg font-semibold text-foreground", children: "hazo reusable ui library workspace" }) }), _jsx(ProfilePicMenu, { className: "cls_sidebar_layout_auth_status", avatar_size: "sm" })] }), _jsx("main", { className: "cls_sidebar_layout_main_content flex flex-1 items-center justify-center p-6", children: children })] })] }) }));
14
+ return (_jsx(SidebarProvider, { children: _jsxs("div", { className: "cls_sidebar_layout_wrapper flex min-h-screen w-full", children: [_jsxs(Sidebar, { children: [_jsx(SidebarHeader, { className: "cls_sidebar_layout_header", children: _jsx("div", { className: "cls_sidebar_layout_title flex items-center gap-2 px-2 py-4", children: _jsx("h1", { className: "cls_sidebar_layout_title_text text-lg font-semibold text-sidebar-foreground", children: "hazo auth" }) }) }), _jsxs(SidebarContent, { className: "cls_sidebar_layout_content", children: [_jsxs(SidebarGroup, { className: "cls_sidebar_layout_test_group", children: [_jsx(SidebarGroupLabel, { className: "cls_sidebar_layout_group_label", children: "Test components" }), _jsxs(SidebarMenu, { className: "cls_sidebar_layout_test_menu", children: [_jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_login_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/login", className: "cls_sidebar_layout_test_login_link flex items-center gap-2", "aria-label": "Test login layout component", children: [_jsx(LogIn, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test login" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_register_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/register", className: "cls_sidebar_layout_test_register_link flex items-center gap-2", "aria-label": "Test register layout component", children: [_jsx(UserPlus, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test register" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_forgot_password_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/forgot_password", className: "cls_sidebar_layout_test_forgot_password_link flex items-center gap-2", "aria-label": "Test forgot password layout component", children: [_jsx(KeyRound, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test forgot password" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_reset_password_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/reset_password", className: "cls_sidebar_layout_test_reset_password_link flex items-center gap-2", "aria-label": "Test reset password layout component", children: [_jsx(Key, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test reset password" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_test_email_verification_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/verify_email", className: "cls_sidebar_layout_test_email_verification_link flex items-center gap-2", "aria-label": "Test email verification layout component", children: [_jsx(MailCheck, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Test email verification" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_sqlite_admin_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_connect/sqlite_admin", className: "cls_sidebar_layout_sqlite_admin_link flex items-center gap-2", "aria-label": "Open SQLite admin UI to browse and edit database", children: [_jsx(Database, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "SQLite Admin" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_user_management_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/user_management", className: "cls_sidebar_layout_user_management_link flex items-center gap-2", "aria-label": "Open User Management to manage users, roles, and permissions", children: [_jsx(User, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "User Management" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_rbac_test_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/rbac_test", className: "cls_sidebar_layout_rbac_test_link flex items-center gap-2", "aria-label": "Test RBAC and HRBAC access control", children: [_jsx(ShieldCheck, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "RBAC/HRBAC Test" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_profile_stamp_test_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs(Link, { href: "/hazo_auth/profile_stamp_test", className: "cls_sidebar_layout_profile_stamp_test_link flex items-center gap-2", "aria-label": "Test ProfileStamp component", children: [_jsx(CircleUserRound, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "ProfileStamp Test" })] }) }) })] })] }), _jsx(ProfilePicMenu, { variant: "sidebar", avatar_size: "sm", className: "cls_sidebar_layout_profile_menu", sidebar_group_label: "Account" }), _jsxs(SidebarGroup, { className: "cls_sidebar_layout_resources_group", children: [_jsx(SidebarGroupLabel, { className: "cls_sidebar_layout_group_label", children: "Resources" }), _jsxs(SidebarMenu, { className: "cls_sidebar_layout_resources_menu", children: [_jsx(SidebarMenuItem, { className: "cls_sidebar_layout_storybook_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs("a", { href: "http://localhost:6006", target: "_blank", rel: "noopener noreferrer", className: "cls_sidebar_layout_storybook_link flex items-center gap-2", "aria-label": "Open Storybook preview for reusable components", children: [_jsx(BookOpen, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Storybook" }), _jsx(ExternalLink, { className: "ml-auto h-3 w-3", "aria-hidden": "true" })] }) }) }), _jsx(SidebarMenuItem, { className: "cls_sidebar_layout_docs_item", children: _jsx(SidebarMenuButton, { asChild: true, children: _jsxs("a", { href: "https://ui.shadcn.com/docs", target: "_blank", rel: "noopener noreferrer", className: "cls_sidebar_layout_docs_link flex items-center gap-2", "aria-label": "Review shadcn documentation for styling guidance", children: [_jsx(BookOpen, { className: "h-4 w-4", "aria-hidden": "true" }), _jsx("span", { children: "Shadcn docs" }), _jsx(ExternalLink, { className: "ml-auto h-3 w-3", "aria-hidden": "true" })] }) }) })] })] })] })] }), _jsxs(SidebarInset, { className: "cls_sidebar_layout_inset", children: [_jsxs("header", { className: "cls_sidebar_layout_main_header flex h-16 shrink-0 items-center gap-2 border-b px-4", children: [_jsx(SidebarTrigger, { className: "cls_sidebar_layout_trigger" }), _jsx("div", { className: "cls_sidebar_layout_main_header_content flex flex-1 items-center gap-2", children: _jsx("h2", { className: "cls_sidebar_layout_main_title text-lg font-semibold text-foreground", children: "hazo reusable ui library workspace" }) }), _jsx(ProfilePicMenu, { className: "cls_sidebar_layout_auth_status", avatar_size: "sm" })] }), _jsx("main", { className: "cls_sidebar_layout_main_content flex flex-1 items-center justify-center p-6", children: children })] })] }) }));
15
15
  }
@@ -6,10 +6,16 @@ export type AuthStatusData = {
6
6
  email_verified?: boolean;
7
7
  last_logon?: string;
8
8
  profile_picture_url?: string;
9
+ profile_image?: string;
10
+ avatar_url?: string;
11
+ image?: string;
9
12
  profile_source?: "upload" | "library" | "gravatar" | "custom";
10
13
  permissions?: string[];
11
14
  permission_ok?: boolean;
12
15
  missing_permissions?: string[];
16
+ auth_providers?: string;
17
+ has_password?: boolean;
18
+ google_connected?: boolean;
13
19
  loading: boolean;
14
20
  };
15
21
  export type AuthStatus = AuthStatusData & {
@@ -1 +1 @@
1
- {"version":3,"file":"use_auth_status.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/hooks/use_auth_status.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAMF;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAGD,wBAAgB,eAAe,IAAI,UAAU,CAmE5C"}
1
+ {"version":3,"file":"use_auth_status.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/hooks/use_auth_status.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAMF;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAGD,wBAAgB,eAAe,IAAI,UAAU,CA2E5C"}
@@ -40,10 +40,18 @@ export function use_auth_status() {
40
40
  email_verified: data.email_verified,
41
41
  last_logon: data.last_logon,
42
42
  profile_picture_url: data.profile_picture_url,
43
+ // Populate aliases for profile_picture_url
44
+ profile_image: data.profile_image,
45
+ avatar_url: data.avatar_url,
46
+ image: data.image,
43
47
  profile_source: data.profile_source,
44
48
  permissions: data.permissions || [],
45
49
  permission_ok: (_a = data.permission_ok) !== null && _a !== void 0 ? _a : true,
46
50
  missing_permissions: data.missing_permissions,
51
+ // OAuth-related fields
52
+ auth_providers: data.auth_providers,
53
+ has_password: data.has_password,
54
+ google_connected: data.google_connected,
47
55
  loading: false,
48
56
  });
49
57
  }
@@ -6,10 +6,17 @@ export { FormHeader } from "./components/form_header";
6
6
  export { LogoutButton } from "./components/logout_button";
7
7
  export { PasswordField } from "./components/password_field";
8
8
  export { ProfilePicMenu } from "./components/profile_pic_menu";
9
+ export { ProfileStamp } from "./components/profile_stamp";
10
+ export type { ProfileStampProps, ProfileStampCustomField } from "./components/profile_stamp";
9
11
  export { StandaloneLayoutWrapper } from "./components/standalone_layout_wrapper";
10
12
  export { TwoColumnAuthLayout } from "./components/two_column_auth_layout";
11
13
  export { UnauthorizedGuard } from "./components/unauthorized_guard";
12
14
  export { VisualPanel } from "./components/visual_panel";
15
+ export { GoogleIcon } from "./components/google_icon";
16
+ export { GoogleSignInButton } from "./components/google_sign_in_button";
17
+ export type { GoogleSignInButtonProps } from "./components/google_sign_in_button";
18
+ export { OAuthDivider } from "./components/oauth_divider";
19
+ export type { OAuthDividerProps } from "./components/oauth_divider";
13
20
  export { use_auth_status } from "./hooks/use_auth_status";
14
21
  export { use_hazo_auth, trigger_hazo_auth_refresh } from "./hooks/use_hazo_auth";
15
22
  export type { UseHazoAuthOptions, UseHazoAuthResult } from "./hooks/use_hazo_auth";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/shared/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGnF,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/shared/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGnF,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
@@ -10,11 +10,15 @@ export { LogoutButton } from "./components/logout_button";
10
10
  export { PasswordField } from "./components/password_field";
11
11
  // ProfilePicMenuWrapper - NOT exported (server component - imports .server files)
12
12
  export { ProfilePicMenu } from "./components/profile_pic_menu";
13
+ export { ProfileStamp } from "./components/profile_stamp";
13
14
  // SidebarLayoutWrapper - NOT exported (test workspace component only)
14
15
  export { StandaloneLayoutWrapper } from "./components/standalone_layout_wrapper";
15
16
  export { TwoColumnAuthLayout } from "./components/two_column_auth_layout";
16
17
  export { UnauthorizedGuard } from "./components/unauthorized_guard";
17
18
  export { VisualPanel } from "./components/visual_panel";
19
+ export { GoogleIcon } from "./components/google_icon";
20
+ export { GoogleSignInButton } from "./components/google_sign_in_button";
21
+ export { OAuthDivider } from "./components/oauth_divider";
18
22
  // section: hook_exports
19
23
  export { use_auth_status } from "./hooks/use_auth_status";
20
24
  export { use_hazo_auth, trigger_hazo_auth_refresh } from "./hooks/use_hazo_auth";
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { type VariantProps } from "class-variance-authority";
3
3
  declare const buttonVariants: (props?: ({
4
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
4
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
5
5
  size?: "default" | "sm" | "lg" | "icon" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
3
+ declare const HoverCard: React.FC<HoverCardPrimitive.HoverCardProps>;
4
+ declare const HoverCardTrigger: React.ForwardRefExoticComponent<HoverCardPrimitive.HoverCardTriggerProps & React.RefAttributes<HTMLAnchorElement>>;
5
+ declare const HoverCardContent: React.ForwardRefExoticComponent<Omit<HoverCardPrimitive.HoverCardContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
6
+ export { HoverCard, HoverCardTrigger, HoverCardContent };
7
+ //# sourceMappingURL=hover-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-card.d.ts","sourceRoot":"","sources":["../../../src/components/ui/hover-card.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,4BAA4B,CAAA;AAKhE,QAAA,MAAM,SAAS,6CAA0B,CAAA;AAEzC,QAAA,MAAM,gBAAgB,oHAA6B,CAAA;AAEnD,QAAA,MAAM,gBAAgB,oKAcpB,CAAA;AAIF,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,29 @@
1
+ // file_description: HoverCard component from shadcn/ui using Radix UI
2
+ // section: client_directive
3
+ "use client";
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ // section: imports
17
+ import * as React from "react";
18
+ import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
19
+ import { cn } from "../../lib/utils";
20
+ // section: components
21
+ const HoverCard = HoverCardPrimitive.Root;
22
+ const HoverCardTrigger = HoverCardPrimitive.Trigger;
23
+ const HoverCardContent = React.forwardRef((_a, ref) => {
24
+ var { className, align = "center", sideOffset = 4 } = _a, props = __rest(_a, ["className", "align", "sideOffset"]);
25
+ return (_jsx(HoverCardPrimitive.Content, Object.assign({ ref: ref, align: align, sideOffset: sideOffset, className: cn("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]", className) }, props)));
26
+ });
27
+ HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
28
+ // section: exports
29
+ export { HoverCard, HoverCardTrigger, HoverCardContent };
@@ -5,6 +5,7 @@ export * from "./checkbox";
5
5
  export * from "./dialog";
6
6
  export * from "./dropdown-menu";
7
7
  export * from "./hazo_ui_tooltip";
8
+ export * from "./hover-card";
8
9
  export * from "./input";
9
10
  export * from "./label";
10
11
  export * from "./separator";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAEA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"AAEA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
@@ -7,6 +7,7 @@ export * from "./checkbox";
7
7
  export * from "./dialog";
8
8
  export * from "./dropdown-menu";
9
9
  export * from "./hazo_ui_tooltip";
10
+ export * from "./hover-card";
10
11
  export * from "./input";
11
12
  export * from "./label";
12
13
  export * from "./separator";
@@ -0,0 +1,34 @@
1
+ import type { AuthOptions } from "next-auth";
2
+ export type NextAuthCallbackUser = {
3
+ id?: string;
4
+ email?: string | null;
5
+ name?: string | null;
6
+ image?: string | null;
7
+ };
8
+ export type NextAuthCallbackAccount = {
9
+ provider: string;
10
+ providerAccountId: string;
11
+ type: string;
12
+ access_token?: string;
13
+ id_token?: string;
14
+ expires_at?: number;
15
+ };
16
+ export type NextAuthCallbackProfile = {
17
+ sub?: string;
18
+ name?: string;
19
+ email?: string;
20
+ picture?: string;
21
+ email_verified?: boolean;
22
+ };
23
+ /**
24
+ * Gets NextAuth.js configuration with enabled OAuth providers
25
+ * Providers are dynamically configured based on hazo_auth_config.ini settings
26
+ * @returns NextAuth configuration object
27
+ */
28
+ export declare function get_nextauth_config(): AuthOptions;
29
+ /**
30
+ * Checks if any OAuth providers are configured and enabled
31
+ * @returns true if at least one OAuth provider is available
32
+ */
33
+ export declare function has_oauth_providers(): boolean;
34
+ //# sourceMappingURL=nextauth_config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextauth_config.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/nextauth_config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,WAAW,CAAC;AAStD,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAGF;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAwKjD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAW7C"}