@authdog/react-elements 0.0.25 → 0.0.27

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @authdog/react-elements@0.0.25 build /home/runner/work/web-sdk/web-sdk/packages/react-elements
2
+ > @authdog/react-elements@0.0.27 build /home/runner/work/web-sdk/web-sdk/packages/react-elements
3
3
  > pnpm tsup && pnpm build:styles
4
4
 
5
5
  CLI Building entry: src/index.ts, src/lib/utils.ts, src/components/ui/alert.tsx, src/components/ui/avatar.tsx, src/components/ui/badge.tsx, src/components/ui/button.tsx, src/components/ui/card.tsx, src/components/ui/dropdown-menu.tsx, src/components/ui/input.tsx, src/components/ui/label.tsx, src/components/ui/separator.tsx, src/components/ui/sheet.tsx
@@ -10,32 +10,7 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- ESM dist/index.mjs 13.87 KB
14
- ESM dist/lib/utils.mjs 166.00 B
15
- ESM dist/components/ui/alert.mjs 1.19 KB
16
- ESM dist/components/ui/avatar.mjs 749.00 B
17
- ESM dist/components/ui/badge.mjs 1.34 KB
18
- ESM dist/components/ui/button.mjs 1.36 KB
19
- ESM dist/components/ui/card.mjs 1.35 KB
20
- ESM dist/components/ui/dropdown-menu.mjs 5.37 KB
21
- ESM dist/components/ui/input.mjs 949.00 B
22
- ESM dist/components/ui/label.mjs 566.00 B
23
- ESM dist/components/ui/separator.mjs 604.00 B
24
- ESM dist/components/ui/sheet.mjs 2.68 KB
25
- ESM dist/index.mjs.map 47.03 KB
26
- ESM dist/lib/utils.mjs.map 415.00 B
27
- ESM dist/components/ui/alert.mjs.map 2.82 KB
28
- ESM dist/components/ui/avatar.mjs.map 2.13 KB
29
- ESM dist/components/ui/badge.mjs.map 2.63 KB
30
- ESM dist/components/ui/button.mjs.map 3.01 KB
31
- ESM dist/components/ui/card.mjs.map 3.54 KB
32
- ESM dist/components/ui/dropdown-menu.mjs.map 12.05 KB
33
- ESM dist/components/ui/input.mjs.map 1.67 KB
34
- ESM dist/components/ui/label.mjs.map 1.32 KB
35
- ESM dist/components/ui/separator.mjs.map 1.51 KB
36
- ESM dist/components/ui/sheet.mjs.map 6.49 KB
37
- ESM ⚡️ Build success in 229ms
38
- CJS dist/index.js 15.30 KB
13
+ CJS dist/index.js 17.15 KB
39
14
  CJS dist/lib/utils.js 620.00 B
40
15
  CJS dist/components/ui/alert.js 1.65 KB
41
16
  CJS dist/components/ui/avatar.js 1.34 KB
@@ -47,7 +22,7 @@
47
22
  CJS dist/components/ui/label.js 1.14 KB
48
23
  CJS dist/components/ui/separator.js 1.18 KB
49
24
  CJS dist/components/ui/sheet.js 3.36 KB
50
- CJS dist/index.js.map 46.86 KB
25
+ CJS dist/index.js.map 49.66 KB
51
26
  CJS dist/lib/utils.js.map 520.00 B
52
27
  CJS dist/components/ui/alert.js.map 3.01 KB
53
28
  CJS dist/components/ui/avatar.js.map 2.31 KB
@@ -59,12 +34,37 @@
59
34
  CJS dist/components/ui/label.js.map 1.45 KB
60
35
  CJS dist/components/ui/separator.js.map 1.64 KB
61
36
  CJS dist/components/ui/sheet.js.map 6.75 KB
62
- CJS ⚡️ Build success in 238ms
37
+ CJS ⚡️ Build success in 203ms
38
+ ESM dist/index.mjs 15.64 KB
39
+ ESM dist/lib/utils.mjs 166.00 B
40
+ ESM dist/components/ui/alert.mjs 1.19 KB
41
+ ESM dist/components/ui/avatar.mjs 749.00 B
42
+ ESM dist/components/ui/badge.mjs 1.34 KB
43
+ ESM dist/components/ui/button.mjs 1.36 KB
44
+ ESM dist/components/ui/card.mjs 1.35 KB
45
+ ESM dist/components/ui/dropdown-menu.mjs 5.37 KB
46
+ ESM dist/components/ui/input.mjs 949.00 B
47
+ ESM dist/components/ui/label.mjs 566.00 B
48
+ ESM dist/components/ui/separator.mjs 604.00 B
49
+ ESM dist/components/ui/sheet.mjs 2.68 KB
50
+ ESM dist/index.mjs.map 49.83 KB
51
+ ESM dist/lib/utils.mjs.map 415.00 B
52
+ ESM dist/components/ui/alert.mjs.map 2.82 KB
53
+ ESM dist/components/ui/avatar.mjs.map 2.13 KB
54
+ ESM dist/components/ui/badge.mjs.map 2.63 KB
55
+ ESM dist/components/ui/button.mjs.map 3.01 KB
56
+ ESM dist/components/ui/card.mjs.map 3.54 KB
57
+ ESM dist/components/ui/dropdown-menu.mjs.map 12.05 KB
58
+ ESM dist/components/ui/input.mjs.map 1.67 KB
59
+ ESM dist/components/ui/label.mjs.map 1.32 KB
60
+ ESM dist/components/ui/separator.mjs.map 1.51 KB
61
+ ESM dist/components/ui/sheet.mjs.map 6.49 KB
62
+ ESM ⚡️ Build success in 213ms
63
63
  DTS Build start
64
- DTS ⚡️ Build success in 10277ms
65
- DTS dist/index.d.mts 2.15 KB
66
- DTS dist/index.d.ts 2.15 KB
64
+ DTS ⚡️ Build success in 10258ms
65
+ DTS dist/index.d.mts 1.98 KB
66
+ DTS dist/index.d.ts 1.98 KB
67
67
 
68
- > @authdog/react-elements@0.0.25 build:styles /home/runner/work/web-sdk/web-sdk/packages/react-elements
68
+ > @authdog/react-elements@0.0.27 build:styles /home/runner/work/web-sdk/web-sdk/packages/react-elements
69
69
  > postcss src/global.css -o dist/styles.css
70
70
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @authdog/react-elements
2
2
 
3
+ ## 0.0.27
4
+
5
+ ### Patch Changes
6
+
7
+ - df1cbf4: handle photos, user payload in navbar and profile
8
+
9
+ ## 0.0.26
10
+
11
+ ### Patch Changes
12
+
13
+ - 799fb2e: display email/connected account in profile
14
+
3
15
  ## 0.0.25
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -19,16 +19,12 @@ interface NavItem {
19
19
  disabled?: boolean;
20
20
  }
21
21
  interface NavbarProps {
22
- items?: NavItem[];
22
+ items?: NavItem[] | undefined;
23
23
  children?: React__default.ReactNode;
24
24
  className?: string;
25
25
  logoText?: string;
26
26
  isLoading?: boolean;
27
- user?: {
28
- name?: string;
29
- email?: string;
30
- image?: string;
31
- };
27
+ user?: any;
32
28
  onNavigateHome?: () => void;
33
29
  onNavItemClick?: (href: string) => void;
34
30
  onProfileSelected?: () => void;
@@ -45,13 +41,9 @@ interface UserProfileProps {
45
41
  address: string;
46
42
  isPrimary?: boolean;
47
43
  }[];
48
- connectedAccounts?: {
49
- provider: string;
50
- email?: string;
51
- }[];
52
44
  handleAuthenticated?: () => void;
53
45
  }
54
- declare const UserProfile: ({ loading, user, emails, connectedAccounts, handleAuthenticated }: UserProfileProps) => react_jsx_runtime.JSX.Element;
46
+ declare const UserProfile: ({ loading, user, handleAuthenticated }: UserProfileProps) => react_jsx_runtime.JSX.Element;
55
47
 
56
48
  interface PlaceholderAlertProps {
57
49
  title?: string;
package/dist/index.d.ts CHANGED
@@ -19,16 +19,12 @@ interface NavItem {
19
19
  disabled?: boolean;
20
20
  }
21
21
  interface NavbarProps {
22
- items?: NavItem[];
22
+ items?: NavItem[] | undefined;
23
23
  children?: React__default.ReactNode;
24
24
  className?: string;
25
25
  logoText?: string;
26
26
  isLoading?: boolean;
27
- user?: {
28
- name?: string;
29
- email?: string;
30
- image?: string;
31
- };
27
+ user?: any;
32
28
  onNavigateHome?: () => void;
33
29
  onNavItemClick?: (href: string) => void;
34
30
  onProfileSelected?: () => void;
@@ -45,13 +41,9 @@ interface UserProfileProps {
45
41
  address: string;
46
42
  isPrimary?: boolean;
47
43
  }[];
48
- connectedAccounts?: {
49
- provider: string;
50
- email?: string;
51
- }[];
52
44
  handleAuthenticated?: () => void;
53
45
  }
54
- declare const UserProfile: ({ loading, user, emails, connectedAccounts, handleAuthenticated }: UserProfileProps) => react_jsx_runtime.JSX.Element;
46
+ declare const UserProfile: ({ loading, user, handleAuthenticated }: UserProfileProps) => react_jsx_runtime.JSX.Element;
55
47
 
56
48
  interface PlaceholderAlertProps {
57
49
  title?: string;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- "use strict";var fe=Object.create;var M=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames;var he=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var xe=(e,o)=>{for(var n in o)M(e,n,{get:o[n],enumerable:!0})},O=(e,o,n,m)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of ge(o))!be.call(e,s)&&s!==n&&M(e,s,{get:()=>o[s],enumerable:!(m=ve(o,s))||m.enumerable});return e};var D=(e,o,n)=>(n=e!=null?fe(he(e)):{},O(o||!e||!e.__esModule?M(n,"default",{value:e,enumerable:!0}):n,e)),we=e=>O(M({},"__esModule",{value:!0}),e);var Re={};xe(Re,{Button:()=>c,Navbar:()=>ne,PlaceholderAlert:()=>pe,UserProfile:()=>ie});module.exports=we(Re);var H=D(require("react")),W=require("@radix-ui/react-slot"),$=require("class-variance-authority");var U=require("clsx"),j=require("tailwind-merge");function i(...e){return(0,j.twMerge)((0,U.clsx)(e))}var q=require("react/jsx-runtime"),Pe=(0,$.cva)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),c=H.forwardRef(({className:e,variant:o,size:n,asChild:m=!1,...s},v)=>(0,q.jsx)(m?W.Slot:"button",{className:i(Pe({variant:o,size:n,className:e})),ref:v,...s}));c.displayName="Button";var ae=require("react"),x=require("lucide-react");var h=D(require("@radix-ui/react-avatar"));var k=require("react/jsx-runtime");function S({className:e,...o}){return(0,k.jsx)(h.Root,{"data-slot":"avatar",className:i("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...o})}function R({className:e,...o}){return(0,k.jsx)(h.Image,{"data-slot":"avatar-image",className:i("aspect-square size-full",e),...o})}function I({className:e,...o}){return(0,k.jsx)(h.Fallback,{"data-slot":"avatar-fallback",className:i("bg-muted flex size-full items-center justify-center rounded-full",e),...o})}var r=D(require("@radix-ui/react-dropdown-menu")),L=require("lucide-react");var u=require("react/jsx-runtime");function X({...e}){return(0,u.jsx)(r.Root,{"data-slot":"dropdown-menu",...e})}function J({...e}){return(0,u.jsx)(r.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function K({className:e,sideOffset:o=4,...n}){return(0,u.jsx)(r.Portal,{children:(0,u.jsx)(r.Content,{"data-slot":"dropdown-menu-content",sideOffset:o,className:i("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...n})})}function Q({...e}){return(0,u.jsx)(r.Group,{"data-slot":"dropdown-menu-group",...e})}function E({className:e,inset:o,variant:n="default",...m}){return(0,u.jsx)(r.Item,{"data-slot":"dropdown-menu-item","data-inset":o,"data-variant":n,className:i("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...m})}function Y({className:e,inset:o,...n}){return(0,u.jsx)(r.Label,{"data-slot":"dropdown-menu-label","data-inset":o,className:i("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...n})}function _({className:e,...o}){return(0,u.jsx)(r.Separator,{"data-slot":"dropdown-menu-separator",className:i("bg-border -mx-1 my-1 h-px",e),...o})}var d=D(require("@radix-ui/react-dialog")),Z=require("lucide-react");var l=require("react/jsx-runtime"),ye=Z.X;function ee({...e}){return(0,l.jsx)(d.Root,{"data-slot":"sheet",...e})}function te({...e}){return(0,l.jsx)(d.Trigger,{"data-slot":"sheet-trigger",...e})}function Ne({...e}){return(0,l.jsx)(d.Portal,{"data-slot":"sheet-portal",...e})}function Ce({className:e,...o}){return(0,l.jsx)(d.Overlay,{"data-slot":"sheet-overlay",className:i("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...o})}function oe({className:e,children:o,side:n="right",...m}){return(0,l.jsxs)(Ne,{children:[(0,l.jsx)(Ce,{}),(0,l.jsxs)(d.Content,{"data-slot":"sheet-content",className:i("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",n==="right"&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",n==="left"&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",n==="top"&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",n==="bottom"&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",e),...m,children:[o,(0,l.jsxs)(d.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[(0,l.jsx)(ye,{className:"size-4"}),(0,l.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}var T=require("react"),A=require("react/jsx-runtime"),Me={className:"mr-2 h-4 w-4","aria-hidden":"true"},De=e=>{let[o,n]=(0,T.useState)(!1);return(0,T.useEffect)(()=>{n(!0)},[]),o?(0,A.jsx)(e,{...Me}):(0,A.jsx)("span",{className:"mr-2 h-4 w-4","aria-hidden":"true"})},b=({Icon:e})=>(0,A.jsx)("span",{className:"inline-flex items-center justify-center",children:De(e)});var a=require("react/jsx-runtime");function ne({items:e=[],children:o,className:n,logoText:m="ACME Corp",user:s={name:"John Doe",email:"john@example.com",image:"https://i.pravatar.cc/150?u=a042581f4e29026704d"},onNavigateHome:v=()=>console.log("Navigating to home"),onNavItemClick:N=G=>console.log(`Navigating to ${G}`),onProfileSelected:P,onLogout:V=()=>console.log("Logout clicked"),isLoading:y=!1,identityHost:C="https://stg-id.authdog.xyz",environmentId:g="58be35b0-708f-49f6-84f0-6695d307d997"}){let[G,F]=(0,ae.useState)(!1),ue=s!=null&&s.name!==null&&s.name!==void 0;return(0,a.jsx)("header",{className:i("border-b bg-background",n),children:(0,a.jsxs)("div",{className:"container flex h-16 items-center justify-between px-4 md:px-6",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("span",{className:"text-xl font-bold cursor-pointer",onClick:v,children:m}),(0,a.jsx)("nav",{className:"hidden md:flex gap-6",children:e?.map((p,B)=>(0,a.jsx)("span",{onClick:()=>{p.disabled||N(p.href)},className:i("text-sm font-medium transition-colors hover:text-primary cursor-pointer",p.disabled&&"cursor-not-allowed opacity-80"),children:p.title},B))})]}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[o,ue?(0,a.jsxs)(X,{children:[(0,a.jsx)(J,{asChild:!0,children:(0,a.jsx)(c,{variant:"ghost",className:"relative h-8 w-8 rounded-full",disabled:y,children:(0,a.jsx)(S,{className:"h-8 w-8",children:y?(0,a.jsx)("div",{className:"h-8 w-8 animate-pulse bg-muted rounded-full"}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(R,{src:s.image||"/placeholder.svg",alt:s.name}),(0,a.jsx)(I,{children:s.name?.charAt(0)})]})})})}),(0,a.jsx)(K,{className:"w-56",align:"end",forceMount:!0,children:y?(0,a.jsxs)("div",{className:"p-4",children:[(0,a.jsx)("div",{className:"h-4 w-3/4 animate-pulse bg-muted rounded mb-2"}),(0,a.jsx)("div",{className:"h-3 w-1/2 animate-pulse bg-muted rounded"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Y,{className:"font-normal",children:(0,a.jsxs)("div",{className:"flex flex-col space-y-1",children:[(0,a.jsx)("p",{className:"text-sm font-medium leading-none",children:s.name}),(0,a.jsx)("p",{className:"text-xs leading-none text-muted-foreground",children:s.email})]})}),(0,a.jsx)(_,{}),(0,a.jsx)(Q,{children:(0,a.jsxs)(E,{onClick:P,children:[(0,a.jsx)(b,{Icon:x.User}),(0,a.jsx)("span",{children:"Profile"})]})}),(0,a.jsx)(_,{}),(0,a.jsxs)(E,{onClick:V,children:[(0,a.jsx)(b,{Icon:x.LogOut}),(0,a.jsx)("span",{children:"Log out"})]})]})})]}):(0,a.jsx)(c,{variant:"default","aria-label":"Sign in",onClick:()=>{if(!g)throw new Error("Environment ID is required");if(!C)throw new Error("Identity Host is required");let p=`${C}/signin/${g}`;window.open(p,"_blank")},children:"Sign in"}),(0,a.jsxs)(ee,{open:G,onOpenChange:F,children:[(0,a.jsx)(te,{asChild:!0,children:(0,a.jsx)(c,{variant:"ghost",size:"icon",className:"md:hidden","aria-label":"Open Menu",children:(0,a.jsx)(b,{Icon:x.Menu})})}),(0,a.jsx)(oe,{side:"left",className:"pr-0",children:(0,a.jsx)("nav",{className:"grid gap-2 py-6",children:e?.map((p,B)=>(0,a.jsx)("a",{href:p.href,className:i("flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent",p.disabled&&"cursor-not-allowed opacity-80"),onClick:()=>F(!1),children:p.title},B))})})]})]})]})})}var w=require("react");var re=require("lucide-react"),t=require("react/jsx-runtime"),ie=({loading:e,user:o,emails:n=[],connectedAccounts:m=[{provider:"Google OAuth2.0",email:"john@example.com"}],handleAuthenticated:s})=>{let[v,N]=(0,w.useState)(!1),[P,V]=(0,w.useState)("profile");(0,w.useEffect)(()=>{N(!0)},[]),(0,w.useEffect)(()=>{!e&&!o&&s&&s()},[e,o,s]);let y={className:"mr-2 h-4 w-4","aria-hidden":"true"},C=g=>v?(0,t.jsx)(g,{...y}):null;return!v||e?(0,t.jsx)("div",{children:"Loading..."}):o?(0,t.jsxs)("div",{className:"grid grid-cols-[16rem,1fr] h-screen bg-gray-100",children:[(0,t.jsxs)("div",{className:"h-full border-r p-6 bg-white flex flex-col min-w-0",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)("h1",{className:"text-xl font-bold",children:"Account"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Manage your account info."})]}),(0,t.jsx)("nav",{className:"space-y-1 flex-1",children:(0,t.jsxs)("button",{onClick:()=>V("profile"),className:`flex items-center w-full px-3 py-2 text-sm rounded-md ${P==="profile"?"bg-gray-100 text-gray-900":"text-gray-700 hover:bg-gray-50"}`,children:[C(re.User),"Profile"]})})]}),(0,t.jsxs)("div",{className:"h-full p-10 overflow-y-auto min-w-0 bg-white",children:[(0,t.jsx)("div",{className:"flex justify-between items-center mb-6",children:(0,t.jsx)("h2",{className:"text-xl font-semibold",children:P==="profile"?"Profile details":"Security settings"})}),P==="profile"?(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Profile"}),(0,t.jsx)("div",{className:"flex items-center justify-between",children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsxs)(S,{className:"h-12 w-12 mr-4 border",children:[(0,t.jsx)(R,{src:o.images?.[0]?.value,alt:"Profile picture"}),(0,t.jsx)(I,{children:o.displayName?.split(" ").map(g=>g[0]).join("")})]}),(0,t.jsx)("span",{className:"font-medium",children:o.displayName})]})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Email addresses"}),(0,t.jsx)("div",{className:"space-y-3"})]})]}):(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Two-factor authentication"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium",children:"Two-factor authentication"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Add an extra layer of security to your account"})]}),(0,t.jsx)(c,{variant:"outline",size:"sm",children:"Enable"})]})})]},"two-factor"),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Password"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium",children:"Change password"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Last changed 3 months ago"})]}),(0,t.jsx)(c,{variant:"outline",size:"sm",children:"Change"})]})})]},"password"),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Active sessions"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium",children:"Current session"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Chrome on Windows \u2022 Active now"})]}),(0,t.jsx)(c,{variant:"outline",size:"sm",children:"Sign out"})]})})]},"sessions")]})]})]}):(0,t.jsx)("div",{children:"No user"})};var ce=require("lucide-react");var se=require("class-variance-authority");var z=require("react/jsx-runtime"),Se=(0,se.cva)("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function de({className:e,variant:o,...n}){return(0,z.jsx)("div",{"data-slot":"alert",role:"alert",className:i(Se({variant:o}),e),...n})}function le({className:e,...o}){return(0,z.jsx)("div",{"data-slot":"alert-title",className:i("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...o})}function me({className:e,...o}){return(0,z.jsx)("div",{"data-slot":"alert-description",className:i("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...o})}var f=require("react/jsx-runtime"),pe=e=>{let o=e.title??"Placeholder Alert",n=e.description??"This is a placeholder alert.";return(0,f.jsx)("div",{className:"grid w-full max-w-xl items-start gap-4",children:(0,f.jsxs)(de,{children:[(0,f.jsx)(b,{Icon:ce.CheckCircle2Icon}),(0,f.jsx)(le,{children:o}),(0,f.jsx)(me,{children:n})]})})};
2
+ "use strict";var be=Object.create;var N=Object.defineProperty;var xe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Ne=(e,o)=>{for(var r in o)N(e,r,{get:o[r],enumerable:!0})},O=(e,o,r,d)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of ye(o))!Pe.call(e,s)&&s!==r&&N(e,s,{get:()=>o[s],enumerable:!(d=xe(o,s))||d.enumerable});return e};var C=(e,o,r)=>(r=e!=null?be(we(e)):{},O(o||!e||!e.__esModule?N(r,"default",{value:e,enumerable:!0}):r,e)),Ce=e=>O(N({},"__esModule",{value:!0}),e);var ze={};Ne(ze,{Button:()=>c,Navbar:()=>re,PlaceholderAlert:()=>ge,UserProfile:()=>me});module.exports=Ce(ze);var H=C(require("react")),W=require("@radix-ui/react-slot"),$=require("class-variance-authority");var j=require("clsx"),U=require("tailwind-merge");function n(...e){return(0,U.twMerge)((0,j.clsx)(e))}var q=require("react/jsx-runtime"),Me=(0,$.cva)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),c=H.forwardRef(({className:e,variant:o,size:r,asChild:d=!1,...s},v)=>(0,q.jsx)(d?W.Slot:"button",{className:n(Me({variant:o,size:r,className:e})),ref:v,...s}));c.displayName="Button";var ae=require("react"),x=require("lucide-react");var h=C(require("@radix-ui/react-avatar"));var R=require("react/jsx-runtime");function M({className:e,...o}){return(0,R.jsx)(h.Root,{"data-slot":"avatar",className:n("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...o})}function D({className:e,...o}){return(0,R.jsx)(h.Image,{"data-slot":"avatar-image",className:n("aspect-square size-full",e),...o})}function S({className:e,...o}){return(0,R.jsx)(h.Fallback,{"data-slot":"avatar-fallback",className:n("bg-muted flex size-full items-center justify-center rounded-full",e),...o})}var i=C(require("@radix-ui/react-dropdown-menu")),B=require("lucide-react");var f=require("react/jsx-runtime");function X({...e}){return(0,f.jsx)(i.Root,{"data-slot":"dropdown-menu",...e})}function J({...e}){return(0,f.jsx)(i.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function K({className:e,sideOffset:o=4,...r}){return(0,f.jsx)(i.Portal,{children:(0,f.jsx)(i.Content,{"data-slot":"dropdown-menu-content",sideOffset:o,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...r})})}function Q({...e}){return(0,f.jsx)(i.Group,{"data-slot":"dropdown-menu-group",...e})}function L({className:e,inset:o,variant:r="default",...d}){return(0,f.jsx)(i.Item,{"data-slot":"dropdown-menu-item","data-inset":o,"data-variant":r,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...d})}function Y({className:e,inset:o,...r}){return(0,f.jsx)(i.Label,{"data-slot":"dropdown-menu-label","data-inset":o,className:n("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...r})}function E({className:e,...o}){return(0,f.jsx)(i.Separator,{"data-slot":"dropdown-menu-separator",className:n("bg-border -mx-1 my-1 h-px",e),...o})}var l=C(require("@radix-ui/react-dialog")),Z=require("lucide-react");var m=require("react/jsx-runtime"),De=Z.X;function ee({...e}){return(0,m.jsx)(l.Root,{"data-slot":"sheet",...e})}function te({...e}){return(0,m.jsx)(l.Trigger,{"data-slot":"sheet-trigger",...e})}function Se({...e}){return(0,m.jsx)(l.Portal,{"data-slot":"sheet-portal",...e})}function Re({className:e,...o}){return(0,m.jsx)(l.Overlay,{"data-slot":"sheet-overlay",className:n("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...o})}function oe({className:e,children:o,side:r="right",...d}){return(0,m.jsxs)(Se,{children:[(0,m.jsx)(Re,{}),(0,m.jsxs)(l.Content,{"data-slot":"sheet-content",className:n("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",r==="right"&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",r==="left"&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",r==="top"&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",r==="bottom"&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",e),...d,children:[o,(0,m.jsxs)(l.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[(0,m.jsx)(De,{className:"size-4"}),(0,m.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}var I=require("react"),k=require("react/jsx-runtime"),ke={className:"mr-2 h-4 w-4","aria-hidden":"true"},Ie=e=>{let[o,r]=(0,I.useState)(!1);return(0,I.useEffect)(()=>{r(!0)},[]),o?(0,k.jsx)(e,{...ke}):(0,k.jsx)("span",{className:"mr-2 h-4 w-4","aria-hidden":"true"})},b=({Icon:e})=>(0,k.jsx)("span",{className:"inline-flex items-center justify-center",children:Ie(e)});var a=require("react/jsx-runtime");function re({items:e=[],children:o,className:r,logoText:d="ACME Corp",user:s={name:"John Doe",email:"john@example.com",image:"https://i.pravatar.cc/150?u=a042581f4e29026704d"},onNavigateHome:v=()=>console.log("Navigating to home"),onNavItemClick:w=V=>console.log(`Navigating to ${V}`),onProfileSelected:T,onLogout:z=()=>console.log("Logout clicked"),isLoading:p=!1,identityHost:P="https://stg-id.authdog.xyz",environmentId:_="58be35b0-708f-49f6-84f0-6695d307d997"}){let[V,F]=(0,ae.useState)(!1),he=s!=null&&s.id!==null&&s.id!==void 0;return(0,a.jsx)("header",{className:n("border-b bg-background",r),children:(0,a.jsxs)("div",{className:"container flex h-16 items-center justify-between px-4 md:px-6",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("span",{className:"text-xl font-bold cursor-pointer",onClick:v,children:d}),(0,a.jsx)("nav",{className:"hidden md:flex gap-6",children:e?.map((u,G)=>(0,a.jsx)("span",{onClick:()=>{u.disabled||w(u.href)},className:n("text-sm font-medium transition-colors hover:text-primary cursor-pointer",u.disabled&&"cursor-not-allowed opacity-80"),children:u.title},G))})]}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[o,he?(0,a.jsxs)(X,{children:[(0,a.jsx)(J,{asChild:!0,children:(0,a.jsx)(c,{variant:"ghost",className:"relative h-8 w-8 rounded-full",disabled:p,children:(0,a.jsx)(M,{className:"h-8 w-8",children:p?(0,a.jsx)("div",{className:"h-8 w-8 animate-pulse bg-muted rounded-full"}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(D,{src:s.photos?.[0]?.value||"/placeholder.svg",alt:s.displayName}),(0,a.jsx)(S,{children:s.displayName?.charAt(0)})]})})})}),(0,a.jsx)(K,{className:"w-56",align:"end",forceMount:!0,children:p?(0,a.jsxs)("div",{className:"p-4",children:[(0,a.jsx)("div",{className:"h-4 w-3/4 animate-pulse bg-muted rounded mb-2"}),(0,a.jsx)("div",{className:"h-3 w-1/2 animate-pulse bg-muted rounded"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Y,{className:"font-normal",children:(0,a.jsxs)("div",{className:"flex flex-col space-y-1",children:[(0,a.jsx)("p",{className:"text-sm font-medium leading-none",children:s.displayName}),(0,a.jsx)("p",{className:"text-xs leading-none text-muted-foreground",children:s.emails?.[0]?.value})]})}),(0,a.jsx)(E,{}),(0,a.jsx)(Q,{children:(0,a.jsxs)(L,{onClick:T,children:[(0,a.jsx)(b,{Icon:x.User}),(0,a.jsx)("span",{children:"Profile"})]})}),(0,a.jsx)(E,{}),(0,a.jsxs)(L,{onClick:z,children:[(0,a.jsx)(b,{Icon:x.LogOut}),(0,a.jsx)("span",{children:"Log out"})]})]})})]}):(0,a.jsx)(c,{variant:"default","aria-label":"Sign in",onClick:()=>{if(!_)throw new Error("Environment ID is required");if(!P)throw new Error("Identity Host is required");let u=`${P}/signin/${_}`;window.open(u,"_blank")},children:"Sign in"}),(0,a.jsxs)(ee,{open:V,onOpenChange:F,children:[(0,a.jsx)(te,{asChild:!0,children:(0,a.jsx)(c,{variant:"ghost",size:"icon",className:"md:hidden","aria-label":"Open Menu",children:(0,a.jsx)(b,{Icon:x.Menu})})}),(0,a.jsx)(oe,{side:"left",className:"pr-0",children:(0,a.jsx)("nav",{className:"grid gap-2 py-6",children:e?.map((u,G)=>(0,a.jsx)("a",{href:u.href,className:n("flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent",u.disabled&&"cursor-not-allowed opacity-80"),onClick:()=>F(!1),children:u.title},G))})})]})]})]})})}var y=require("react");var ne=require("@radix-ui/react-slot"),ie=require("class-variance-authority");var de=require("react/jsx-runtime"),Ae=(0,ie.cva)("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}});function se({className:e,variant:o,asChild:r=!1,...d}){return(0,de.jsx)(r?ne.Slot:"span",{"data-slot":"badge",className:n(Ae({variant:o}),e),...d})}var le=require("lucide-react"),t=require("react/jsx-runtime"),me=({loading:e,user:o,handleAuthenticated:r})=>{let[d,s]=(0,y.useState)(!1),[v,w]=(0,y.useState)("profile");(0,y.useEffect)(()=>{s(!0)},[]),(0,y.useEffect)(()=>{!e&&r&&r()},[e,o,r]);let T={className:"mr-2 h-4 w-4","aria-hidden":"true"},z=p=>d?(0,t.jsx)(p,{...T}):null;return!d||e?(0,t.jsx)("div",{children:"Loading..."}):o?(0,t.jsxs)("div",{className:"grid grid-cols-[16rem,1fr] h-screen bg-gray-100",children:[(0,t.jsxs)("div",{className:"h-full border-r p-6 bg-white flex flex-col min-w-0",children:[(0,t.jsxs)("div",{className:"mb-6",children:[(0,t.jsx)("h1",{className:"text-xl font-bold",children:"Account"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Manage your account info."})]}),(0,t.jsx)("nav",{className:"space-y-1 flex-1",children:(0,t.jsxs)("button",{onClick:()=>w("profile"),className:`flex items-center w-full px-3 py-2 text-sm rounded-md ${v==="profile"?"bg-gray-100 text-gray-900":"text-gray-700 hover:bg-gray-50"}`,children:[z(le.User),"Profile"]})})]}),(0,t.jsxs)("div",{className:"h-full p-10 overflow-y-auto min-w-0 bg-white",children:[(0,t.jsx)("div",{className:"flex justify-between items-center mb-6",children:(0,t.jsx)("h2",{className:"text-xl font-semibold",children:v==="profile"?"Profile details":"Security settings"})}),v==="profile"?(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Profile"}),(0,t.jsx)("div",{className:"flex items-center justify-between",children:(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsxs)(M,{className:"h-12 w-12 mr-4 border",children:[(0,t.jsx)(D,{src:o.photos?.[0]?.value,alt:"Profile picture"}),(0,t.jsx)(S,{children:o.displayName?.split(" ").map(p=>p[0]).join("")})]}),(0,t.jsx)("span",{className:"font-medium",children:o.displayName})]})})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Email addresses"}),(0,t.jsx)("div",{className:"space-y-3",children:o.emails.map((p,P)=>(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{children:p.value}),P===0&&(0,t.jsx)(se,{variant:"outline",className:"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100",children:"Primary"})]},p.value))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Connected accounts"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("div",{className:"flex items-center",children:(0,t.jsx)("div",{className:"mr-2",children:(0,t.jsx)("span",{children:o.provider})})}),(0,t.jsx)("span",{className:"text-sm text-gray-500",children:o?.emails?.[0]?.value})]},o.provider)})]})]}):(0,t.jsxs)("div",{className:"space-y-8",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Two-factor authentication"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium",children:"Two-factor authentication"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Add an extra layer of security to your account"})]}),(0,t.jsx)(c,{variant:"outline",size:"sm",children:"Enable"})]})})]},"two-factor"),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Password"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium",children:"Change password"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Last changed 3 months ago"})]}),(0,t.jsx)(c,{variant:"outline",size:"sm",children:"Change"})]})})]},"password"),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"text-sm font-medium mb-4",children:"Active sessions"}),(0,t.jsx)("div",{className:"space-y-3",children:(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("p",{className:"font-medium",children:"Current session"}),(0,t.jsx)("p",{className:"text-sm text-gray-500",children:"Chrome on Windows \u2022 Active now"})]}),(0,t.jsx)(c,{variant:"outline",size:"sm",children:"Sign out"})]})})]},"sessions")]})]})]}):(0,t.jsx)("div",{children:"No user"})};var ve=require("lucide-react");var ce=require("class-variance-authority");var A=require("react/jsx-runtime"),Te=(0,ce.cva)("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function pe({className:e,variant:o,...r}){return(0,A.jsx)("div",{"data-slot":"alert",role:"alert",className:n(Te({variant:o}),e),...r})}function ue({className:e,...o}){return(0,A.jsx)("div",{"data-slot":"alert-title",className:n("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...o})}function fe({className:e,...o}){return(0,A.jsx)("div",{"data-slot":"alert-description",className:n("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...o})}var g=require("react/jsx-runtime"),ge=e=>{let o=e.title??"Placeholder Alert",r=e.description??"This is a placeholder alert.";return(0,g.jsx)("div",{className:"grid w-full max-w-xl items-start gap-4",children:(0,g.jsxs)(pe,{children:[(0,g.jsx)(b,{Icon:ve.CheckCircle2Icon}),(0,g.jsx)(ue,{children:o}),(0,g.jsx)(fe,{children:r})]})})};
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/core/navbar.tsx","../src/components/ui/avatar.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/sheet.tsx","../src/components/icons.tsx","../src/components/core/user-profile.tsx","../src/components/core/placeholder-alert.tsx","../src/components/ui/alert.tsx"],"sourcesContent":["export {Button} from \"./components/ui/button\";\nexport {Navbar} from \"./components/core/navbar\";\nexport {UserProfile} from \"./components/core/user-profile\";\nexport {PlaceholderAlert} from \"./components/core/placeholder-alert\";","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\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 };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useState } from \"react\"\nimport { User, LogOut, Menu } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\"\nimport { Sheet, SheetContent, SheetTrigger } from \"../../components/ui/sheet\"\nimport { IconWrapper } from \"../icons\"\n\ninterface NavItem {\n title: string\n href: string\n disabled?: boolean\n}\n\ninterface NavbarProps {\n items?: NavItem[]\n children?: React.ReactNode\n className?: string\n logoText?: string\n isLoading?: boolean\n user?: {\n name?: string\n email?: string\n image?: string\n }\n onNavigateHome?: () => void;\n onNavItemClick?: (href: string) => void;\n onProfileSelected?: () => void;\n onLogout?: () => void;\n // signinUrl?: string;\n identityHost?: string;\n environmentId?: string;\n}\n\nexport function Navbar({\n items = [\n // { title: \"Dashboard\", href: \"/dashboard\" },\n // { title: \"Projects\", href: \"/projects\" },\n // { title: \"Team\", href: \"/team\" },\n // { title: \"Reports\", href: \"/reports\" },\n ],\n children,\n className,\n logoText = \"ACME Corp\",\n user = {\n name: \"John Doe\",\n email: \"john@example.com\",\n image: \"https://i.pravatar.cc/150?u=a042581f4e29026704d\",\n },\n onNavigateHome = () => console.log(\"Navigating to home\"),\n onNavItemClick = (href: string) => console.log(`Navigating to ${href}`),\n onProfileSelected,\n onLogout = () => console.log(\"Logout clicked\"),\n isLoading = false,\n identityHost = \"https://stg-id.authdog.xyz\",\n environmentId = \"58be35b0-708f-49f6-84f0-6695d307d997\",\n}: NavbarProps) {\n const [open, setOpen] = useState(false)\n const isAuthenticated = user !== null && user !== undefined && user.name !== null && user.name !== undefined;\n return (\n <header className={cn(\"border-b bg-background\", className)}>\n <div className=\"container flex h-16 items-center justify-between px-4 md:px-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-xl font-bold cursor-pointer\" onClick={onNavigateHome}>{logoText}</span>\n <nav className=\"hidden md:flex gap-6\">\n {items?.map((item, index) => (\n <span\n key={index}\n onClick={() => {\n if (!item.disabled) {\n onNavItemClick(item.href)\n }\n }}\n className={cn(\n \"text-sm font-medium transition-colors hover:text-primary cursor-pointer\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n >\n {item.title}\n </span>\n ))}\n </nav>\n </div>\n <div className=\"flex items-center gap-4\">\n {children}\n\n\n {\n isAuthenticated ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"relative h-8 w-8 rounded-full\" disabled={isLoading}>\n <Avatar className=\"h-8 w-8\">\n {isLoading ? (\n <div className=\"h-8 w-8 animate-pulse bg-muted rounded-full\" />\n ) : (\n <>\n <AvatarImage src={user.image || \"/placeholder.svg\"} alt={user.name} />\n <AvatarFallback>{user.name?.charAt(0)}</AvatarFallback>\n </>\n )}\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"end\" forceMount>\n {isLoading ? (\n <div className=\"p-4\">\n <div className=\"h-4 w-3/4 animate-pulse bg-muted rounded mb-2\" />\n <div className=\"h-3 w-1/2 animate-pulse bg-muted rounded\" />\n </div>\n ) : (\n <>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.name}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onProfileSelected}>\n <IconWrapper Icon={User} />\n <span>Profile</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onLogout}>\n <IconWrapper Icon={LogOut} />\n <span>Log out</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n \n : (\n <Button variant=\"default\" aria-label=\"Sign in\" onClick={() => {\n if (!environmentId) {\n throw new Error(\"Environment ID is required\");\n }\n\n if (!identityHost) {\n throw new Error(\"Identity Host is required\");\n }\n \n const signinUrl = `${identityHost}/signin/${environmentId}`;\n window.open(signinUrl, \"_blank\");\n }}>\n Sign in\n </Button>\n )\n }\n \n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"md:hidden\" aria-label=\"Open Menu\">\n <IconWrapper Icon={Menu} />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"pr-0\">\n <nav className=\"grid gap-2 py-6\">\n {items?.map((item, index) => (\n <a\n key={index}\n href={item.href}\n className={cn(\n \"flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n onClick={() => setOpen(false)}\n >\n {item.title}\n </a>\n ))}\n </nav>\n </SheetContent>\n </Sheet>\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst CheckIcon = Check as ComponentType<React.SVGProps<SVGSVGElement>>\nconst CircleIcon = Circle as ComponentType<React.SVGProps<SVGSVGElement>>\nconst ChevronRightIcon = ChevronRight as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst XIcon = X as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { LucideProps } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\n\nconst iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n}\n\nexport const renderIcon = ((Icon: any) => {\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted) {\n return <span className=\"mr-2 h-4 w-4\" aria-hidden=\"true\" />\n }\n\n return <Icon {...iconProps} />\n}) as React.FC<{\n Icon: any\n}>\n\nexport const IconWrapper = ({ Icon }: { Icon: any }) => {\n return (\n <span className=\"inline-flex items-center justify-center\">\n {renderIcon(Icon)}\n </span>\n )\n}","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport { Card } from \"../../components/ui/card\"\nimport { Badge } from \"../../components/ui/badge\"\nimport { PlusCircle, User, Shield, X, LucideProps } from \"lucide-react\"\n\nexport interface UserProfileProps {\n loading: boolean;\n user: any;\n emails?: { address: string; isPrimary?: boolean }[];\n connectedAccounts?: { provider: string; email?: string }[];\n handleAuthenticated?: () => void;\n}\n\nexport const UserProfile = ({\n loading,\n user,\n emails = [],\n connectedAccounts = [\n {\n provider: \"Google OAuth2.0\",\n email: \"john@example.com\",\n },\n ],\n handleAuthenticated\n}: UserProfileProps) => {\n const [isMounted, setIsMounted] = useState(false)\n const [activeTab, setActiveTab] = useState<\"profile\" | \"security\">(\"profile\");\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n if (!loading && !user && handleAuthenticated) {\n handleAuthenticated();\n }\n }, [loading, user, handleAuthenticated]);\n\n const iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n }\n\n const renderIcon = (Icon: any) => {\n if (!isMounted) return null\n return <Icon {...iconProps} />\n }\n\n if (!isMounted || loading) {\n return <div>Loading...</div>\n }\n\n if (!user) {\n return <div>No user</div>\n }\n \n return (\n <div className=\"grid grid-cols-[16rem,1fr] h-screen bg-gray-100\">\n <div className=\"h-full border-r p-6 bg-white flex flex-col min-w-0\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-bold\">Account</h1>\n <p className=\"text-sm text-gray-500\">Manage your account info.</p>\n </div>\n\n <nav className=\"space-y-1 flex-1\">\n <button\n onClick={() => setActiveTab(\"profile\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"profile\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(User)}\n Profile\n </button>\n {/* <button\n onClick={() => setActiveTab(\"security\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"security\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(Shield)}\n Security\n </button> */}\n </nav>\n </div>\n\n <div className=\"h-full p-10 overflow-y-auto min-w-0 bg-white\">\n <div className=\"flex justify-between items-center mb-6\">\n <h2 className=\"text-xl font-semibold\">\n {activeTab === \"profile\" ? \"Profile details\" : \"Security settings\"}\n </h2>\n {/* <button className=\"text-gray-500 hover:text-gray-700\">\n {renderIcon(X)}\n </button> */}\n </div>\n\n {activeTab === \"profile\" ? (\n <div className=\"space-y-8\">\n {/* Profile Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Profile</h3>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <Avatar className=\"h-12 w-12 mr-4 border\">\n <AvatarImage src={user.images?.[0]?.value} alt=\"Profile picture\" />\n <AvatarFallback>{user.displayName?.split(\" \").map((n: string) => n[0]).join(\"\")}</AvatarFallback>\n </Avatar>\n <span className=\"font-medium\">{user.displayName}</span>\n </div>\n {/* <Button variant=\"outline\" size=\"sm\">\n Edit profile\n </Button> */}\n </div>\n </div>\n\n {/* Email Addresses Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Email addresses</h3>\n <div className=\"space-y-3\">\n {/* {(emails.length > 0 ? emails : [{ address: user.email, isPrimary: true }]).map((email, i) => (\n <div className=\"flex items-center justify-between\" key={email.address}>\n <span>{email.address}</span>\n {email.isPrimary && (\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n )}\n </div>\n ))} */}\n {/* <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add email address\n </Button> */}\n </div>\n </div>\n\n {/* Phone Number Section */}\n {/* <div>\n <h3 className=\"text-sm font-medium mb-4\">Phone number</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span>+1 (555) 123-4567</span>\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add phone number\n </Button>\n </div>\n </div> */}\n\n {/* Connected Accounts Section */}\n {/* <div>\n <h3 className=\"text-sm font-medium mb-4\">Connected accounts</h3>\n <div className=\"space-y-3\">\n {connectedAccounts.length > 0 && connectedAccounts.map((acc, i) => (\n <div className=\"flex items-center justify-between\" key={acc.provider + acc.email}>\n <div className=\"flex items-center\">\n <div className=\"mr-2\">\n <span>{acc.provider}</span>\n </div>\n </div>\n <span className=\"text-sm text-gray-500\">{acc.email}</span>\n </div>\n )) }\n \n </div>\n </div> */}\n </div>\n ) : (\n <div className=\"space-y-8\">\n {/* Security Settings */}\n <div key=\"two-factor\">\n <h3 className=\"text-sm font-medium mb-4\">Two-factor authentication</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Two-factor authentication</p>\n <p className=\"text-sm text-gray-500\">Add an extra layer of security to your account</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Enable\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"password\">\n <h3 className=\"text-sm font-medium mb-4\">Password</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Change password</p>\n <p className=\"text-sm text-gray-500\">Last changed 3 months ago</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Change\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"sessions\">\n <h3 className=\"text-sm font-medium mb-4\">Active sessions</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Current session</p>\n <p className=\"text-sm text-gray-500\">Chrome on Windows • Active now</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Sign out\n </Button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* <div className=\"absolute bottom-4 text-xs text-gray-500 flex items-center\">\n Secured by\n <span className=\"ml-1 font-medium flex items-center\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mr-1\"\n >\n <path d=\"M8 0L14.9282 4V12L8 16L1.07179 12V4L8 0Z\" fill=\"#6C47FF\" />\n </svg>\n Authdog\n </span>\n </div> */}\n </div>\n )\n}\n","import { CheckCircle2Icon } from \"lucide-react\"\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\"\nimport { IconWrapper } from \"../icons\"\n\ninterface PlaceholderAlertProps {\n title?: string;\n description?: string;\n}\n\nexport const PlaceholderAlert = (props: PlaceholderAlertProps) => {\n const title = props.title ?? \"Placeholder Alert\";\n const description = props.description ?? \"This is a placeholder alert.\";\n\n return ( \n <div className=\"grid w-full max-w-xl items-start gap-4\">\n <Alert>\n <IconWrapper Icon={CheckCircle2Icon} />\n <AlertTitle>{title}</AlertTitle>\n <AlertDescription>\n {description}\n </AlertDescription>\n </Alert>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n"],"mappings":"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","names":["index_exports","__export","Button","Navbar","PlaceholderAlert","UserProfile","__toCommonJS","React","import_react_slot","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","inputs","import_jsx_runtime","buttonVariants","Button","className","variant","size","asChild","props","ref","cn","import_react","import_lucide_react","AvatarPrimitive","import_jsx_runtime","Avatar","className","props","cn","AvatarImage","AvatarFallback","DropdownMenuPrimitive","import_lucide_react","import_jsx_runtime","DropdownMenu","props","DropdownMenuTrigger","props","DropdownMenuContent","className","sideOffset","cn","DropdownMenuGroup","DropdownMenuItem","inset","variant","DropdownMenuLabel","className","inset","props","cn","DropdownMenuSeparator","SheetPrimitive","import_lucide_react","import_jsx_runtime","XIcon","Sheet","props","SheetTrigger","SheetPortal","props","SheetOverlay","className","cn","SheetContent","children","side","XIcon","import_react","import_jsx_runtime","iconProps","renderIcon","Icon","isMounted","setIsMounted","IconWrapper","import_jsx_runtime","Navbar","items","children","className","logoText","user","onNavigateHome","onNavItemClick","href","onProfileSelected","onLogout","isLoading","identityHost","environmentId","open","setOpen","isAuthenticated","cn","item","index","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuGroup","DropdownMenuItem","IconWrapper","signinUrl","Sheet","SheetTrigger","SheetContent","import_react","import_lucide_react","import_jsx_runtime","UserProfile","loading","user","emails","connectedAccounts","handleAuthenticated","isMounted","setIsMounted","activeTab","setActiveTab","iconProps","renderIcon","Icon","Avatar","AvatarImage","AvatarFallback","n","Button","import_lucide_react","import_class_variance_authority","import_jsx_runtime","alertVariants","Alert","className","variant","props","cn","AlertTitle","AlertDescription","import_jsx_runtime","PlaceholderAlert","props","title","description","Alert","IconWrapper","AlertTitle","AlertDescription"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/core/navbar.tsx","../src/components/ui/avatar.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/sheet.tsx","../src/components/icons.tsx","../src/components/core/user-profile.tsx","../src/components/ui/badge.tsx","../src/components/core/placeholder-alert.tsx","../src/components/ui/alert.tsx"],"sourcesContent":["export {Button} from \"./components/ui/button\";\nexport {Navbar} from \"./components/core/navbar\";\nexport {UserProfile} from \"./components/core/user-profile\";\nexport {PlaceholderAlert} from \"./components/core/placeholder-alert\";","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\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 };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useState } from \"react\"\nimport { User, LogOut, Menu } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\"\nimport { Sheet, SheetContent, SheetTrigger } from \"../../components/ui/sheet\"\nimport { IconWrapper } from \"../icons\"\n\ninterface NavItem {\n title: string\n href: string\n disabled?: boolean\n}\n\ninterface NavbarProps {\n items?: NavItem[] | undefined;\n children?: React.ReactNode\n className?: string\n logoText?: string\n isLoading?: boolean\n user?: any;\n onNavigateHome?: () => void;\n onNavItemClick?: (href: string) => void;\n onProfileSelected?: () => void;\n onLogout?: () => void;\n // signinUrl?: string;\n identityHost?: string;\n environmentId?: string;\n}\n\nexport function Navbar({\n items = [\n // { title: \"Dashboard\", href: \"/dashboard\" },\n // { title: \"Projects\", href: \"/projects\" },\n // { title: \"Team\", href: \"/team\" },\n // { title: \"Reports\", href: \"/reports\" },\n ],\n children,\n className,\n logoText = \"ACME Corp\",\n user = {\n name: \"John Doe\",\n email: \"john@example.com\",\n image: \"https://i.pravatar.cc/150?u=a042581f4e29026704d\",\n },\n onNavigateHome = () => console.log(\"Navigating to home\"),\n onNavItemClick = (href: string) => console.log(`Navigating to ${href}`),\n onProfileSelected,\n onLogout = () => console.log(\"Logout clicked\"),\n isLoading = false,\n identityHost = \"https://stg-id.authdog.xyz\",\n environmentId = \"58be35b0-708f-49f6-84f0-6695d307d997\",\n}: NavbarProps) {\n const [open, setOpen] = useState(false)\n const isAuthenticated = user !== null && user !== undefined && user.id !== null && user.id !== undefined;\n return (\n <header className={cn(\"border-b bg-background\", className)}>\n <div className=\"container flex h-16 items-center justify-between px-4 md:px-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-xl font-bold cursor-pointer\" onClick={onNavigateHome}>{logoText}</span>\n <nav className=\"hidden md:flex gap-6\">\n {items?.map((item, index) => (\n <span\n key={index}\n onClick={() => {\n if (!item.disabled) {\n onNavItemClick(item.href)\n }\n }}\n className={cn(\n \"text-sm font-medium transition-colors hover:text-primary cursor-pointer\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n >\n {item.title}\n </span>\n ))}\n </nav>\n </div>\n <div className=\"flex items-center gap-4\">\n {children}\n\n\n\n\n {\n isAuthenticated ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"relative h-8 w-8 rounded-full\" disabled={isLoading}>\n <Avatar className=\"h-8 w-8\">\n {isLoading ? (\n <div className=\"h-8 w-8 animate-pulse bg-muted rounded-full\" />\n ) : (\n <>\n <AvatarImage src={user.photos?.[0]?.value || \"/placeholder.svg\"} alt={user.displayName} />\n <AvatarFallback>{user.displayName?.charAt(0)}</AvatarFallback>\n </>\n )}\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"end\" forceMount>\n {isLoading ? (\n <div className=\"p-4\">\n <div className=\"h-4 w-3/4 animate-pulse bg-muted rounded mb-2\" />\n <div className=\"h-3 w-1/2 animate-pulse bg-muted rounded\" />\n </div>\n ) : (\n <>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.displayName}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.emails?.[0]?.value}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onProfileSelected}>\n <IconWrapper Icon={User} />\n <span>Profile</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onLogout}>\n <IconWrapper Icon={LogOut} />\n <span>Log out</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n \n : (\n <Button variant=\"default\" aria-label=\"Sign in\" onClick={() => {\n if (!environmentId) {\n throw new Error(\"Environment ID is required\");\n }\n\n if (!identityHost) {\n throw new Error(\"Identity Host is required\");\n }\n \n const signinUrl = `${identityHost}/signin/${environmentId}`;\n window.open(signinUrl, \"_blank\");\n }}>\n Sign in\n </Button>\n )\n }\n \n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"md:hidden\" aria-label=\"Open Menu\">\n <IconWrapper Icon={Menu} />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"pr-0\">\n <nav className=\"grid gap-2 py-6\">\n {items?.map((item, index) => (\n <a\n key={index}\n href={item.href}\n className={cn(\n \"flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n onClick={() => setOpen(false)}\n >\n {item.title}\n </a>\n ))}\n </nav>\n </SheetContent>\n </Sheet>\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst CheckIcon = Check as ComponentType<React.SVGProps<SVGSVGElement>>\nconst CircleIcon = Circle as ComponentType<React.SVGProps<SVGSVGElement>>\nconst ChevronRightIcon = ChevronRight as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst XIcon = X as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { LucideProps } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\n\nconst iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n}\n\nexport const renderIcon = ((Icon: any) => {\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted) {\n return <span className=\"mr-2 h-4 w-4\" aria-hidden=\"true\" />\n }\n\n return <Icon {...iconProps} />\n}) as React.FC<{\n Icon: any\n}>\n\nexport const IconWrapper = ({ Icon }: { Icon: any }) => {\n return (\n <span className=\"inline-flex items-center justify-center\">\n {renderIcon(Icon)}\n </span>\n )\n}","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport { Badge } from \"../../components/ui/badge\"\nimport { User, LucideProps } from \"lucide-react\"\n\nexport interface UserProfileProps {\n loading: boolean;\n user: any;\n emails?: { address: string; isPrimary?: boolean }[];\n handleAuthenticated?: () => void;\n}\n\nexport const UserProfile = ({\n loading,\n user,\n handleAuthenticated\n}: UserProfileProps) => {\n const [isMounted, setIsMounted] = useState(false)\n const [activeTab, setActiveTab] = useState<\"profile\" | \"security\">(\"profile\");\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n if (!loading && handleAuthenticated) {\n handleAuthenticated();\n }\n }, [loading, user, handleAuthenticated]);\n\n const iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n }\n\n const renderIcon = (Icon: any) => {\n if (!isMounted) return null\n return <Icon {...iconProps} />\n }\n\n if (!isMounted || loading) {\n return <div>Loading...</div>\n }\n\n if (!user) {\n return <div>No user</div>\n }\n \n return (\n <div className=\"grid grid-cols-[16rem,1fr] h-screen bg-gray-100\">\n <div className=\"h-full border-r p-6 bg-white flex flex-col min-w-0\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-bold\">Account</h1>\n <p className=\"text-sm text-gray-500\">Manage your account info.</p>\n </div>\n\n <nav className=\"space-y-1 flex-1\">\n <button\n onClick={() => setActiveTab(\"profile\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"profile\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(User)}\n Profile\n </button>\n {/* <button\n onClick={() => setActiveTab(\"security\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"security\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(Shield)}\n Security\n </button> */}\n </nav>\n </div>\n\n <div className=\"h-full p-10 overflow-y-auto min-w-0 bg-white\">\n <div className=\"flex justify-between items-center mb-6\">\n <h2 className=\"text-xl font-semibold\">\n {activeTab === \"profile\" ? \"Profile details\" : \"Security settings\"}\n </h2>\n {/* <button className=\"text-gray-500 hover:text-gray-700\">\n {renderIcon(X)}\n </button> */}\n </div>\n\n {activeTab === \"profile\" ? (\n <div className=\"space-y-8\">\n {/* Profile Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Profile</h3>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <Avatar className=\"h-12 w-12 mr-4 border\">\n <AvatarImage src={user.photos?.[0]?.value} alt=\"Profile picture\" />\n <AvatarFallback>{user.displayName?.split(\" \").map((n: string) => n[0]).join(\"\")}</AvatarFallback>\n </Avatar>\n <span className=\"font-medium\">{user.displayName}</span>\n </div>\n {/* <Button variant=\"outline\" size=\"sm\">\n Edit profile\n </Button> */}\n </div>\n </div>\n\n {/* Email Addresses Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Email addresses</h3>\n <div className=\"space-y-3\">\n\n {/* {JSON.stringify(user)} */}\n\n {/* {(emails.length > 0 ? emails : [{ address: user.email, isPrimary: true }]).map((email, i) => (\n <div className=\"flex items-center justify-between\" key={email.address}>\n <span>{email.address}</span>\n {email.isPrimary && (\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n )}\n </div>\n ))} */}\n\n {\n user.emails.map((email: any, idx: number) => (\n <div className=\"flex items-center justify-between\" key={email.value}>\n <span>{email.value}</span>\n {idx === 0 && (\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n )}\n </div>\n ))\n }\n {/* <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add email address\n </Button> */}\n </div>\n </div>\n\n {/* Phone Number Section */}\n {/* <div>\n <h3 className=\"text-sm font-medium mb-4\">Phone number</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span>+1 (555) 123-4567</span>\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add phone number\n </Button>\n </div>\n </div> */}\n\n {/* Connected Accounts Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Connected accounts</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\" key={user.provider}>\n <div className=\"flex items-center\">\n <div className=\"mr-2\">\n <span>{user.provider}</span>\n </div>\n </div>\n <span className=\"text-sm text-gray-500\">{user?.emails?.[0]?.value}</span>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"space-y-8\">\n {/* Security Settings */}\n <div key=\"two-factor\">\n <h3 className=\"text-sm font-medium mb-4\">Two-factor authentication</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Two-factor authentication</p>\n <p className=\"text-sm text-gray-500\">Add an extra layer of security to your account</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Enable\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"password\">\n <h3 className=\"text-sm font-medium mb-4\">Password</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Change password</p>\n <p className=\"text-sm text-gray-500\">Last changed 3 months ago</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Change\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"sessions\">\n <h3 className=\"text-sm font-medium mb-4\">Active sessions</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Current session</p>\n <p className=\"text-sm text-gray-500\">Chrome on Windows • Active now</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Sign out\n </Button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* <div className=\"absolute bottom-4 text-xs text-gray-500 flex items-center\">\n Secured by\n <span className=\"ml-1 font-medium flex items-center\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mr-1\"\n >\n <path d=\"M8 0L14.9282 4V12L8 16L1.07179 12V4L8 0Z\" fill=\"#6C47FF\" />\n </svg>\n Authdog\n </span>\n </div> */}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import { CheckCircle2Icon } from \"lucide-react\"\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\"\nimport { IconWrapper } from \"../icons\"\n\ninterface PlaceholderAlertProps {\n title?: string;\n description?: string;\n}\n\nexport const PlaceholderAlert = (props: PlaceholderAlertProps) => {\n const title = props.title ?? \"Placeholder Alert\";\n const description = props.description ?? \"This is a placeholder alert.\";\n\n return ( \n <div className=\"grid w-full max-w-xl items-start gap-4\">\n <Alert>\n <IconWrapper Icon={CheckCircle2Icon} />\n <AlertTitle>{title}</AlertTitle>\n <AlertDescription>\n {description}\n </AlertDescription>\n </Alert>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n"],"mappings":"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","names":["index_exports","__export","Button","Navbar","PlaceholderAlert","UserProfile","__toCommonJS","React","import_react_slot","import_class_variance_authority","import_clsx","import_tailwind_merge","cn","inputs","import_jsx_runtime","buttonVariants","Button","className","variant","size","asChild","props","ref","cn","import_react","import_lucide_react","AvatarPrimitive","import_jsx_runtime","Avatar","className","props","cn","AvatarImage","AvatarFallback","DropdownMenuPrimitive","import_lucide_react","import_jsx_runtime","DropdownMenu","props","DropdownMenuTrigger","props","DropdownMenuContent","className","sideOffset","cn","DropdownMenuGroup","DropdownMenuItem","inset","variant","DropdownMenuLabel","className","inset","props","cn","DropdownMenuSeparator","SheetPrimitive","import_lucide_react","import_jsx_runtime","XIcon","Sheet","props","SheetTrigger","SheetPortal","props","SheetOverlay","className","cn","SheetContent","children","side","XIcon","import_react","import_jsx_runtime","iconProps","renderIcon","Icon","isMounted","setIsMounted","IconWrapper","import_jsx_runtime","Navbar","items","children","className","logoText","user","onNavigateHome","onNavItemClick","href","onProfileSelected","onLogout","isLoading","identityHost","environmentId","open","setOpen","isAuthenticated","cn","item","index","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuGroup","DropdownMenuItem","IconWrapper","signinUrl","Sheet","SheetTrigger","SheetContent","import_react","import_react_slot","import_class_variance_authority","import_jsx_runtime","badgeVariants","Badge","className","variant","asChild","props","cn","import_lucide_react","import_jsx_runtime","UserProfile","loading","user","handleAuthenticated","isMounted","setIsMounted","activeTab","setActiveTab","iconProps","renderIcon","Icon","Avatar","AvatarImage","AvatarFallback","n","email","idx","Badge","Button","import_lucide_react","import_class_variance_authority","import_jsx_runtime","alertVariants","Alert","className","variant","props","cn","AlertTitle","AlertDescription","import_jsx_runtime","PlaceholderAlert","props","title","description","Alert","IconWrapper","AlertTitle","AlertDescription"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import*as E from"react";import{Slot as oe}from"@radix-ui/react-slot";import{cva as ae}from"class-variance-authority";import{clsx as ee}from"clsx";import{twMerge as te}from"tailwind-merge";function r(...e){return te(ee(e))}import{jsx as re}from"react/jsx-runtime";var ne=ae("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),p=E.forwardRef(({className:e,variant:t,size:i,asChild:u=!1,...d},g)=>re(u?oe:"button",{className:r(ne({variant:t,size:i,className:e})),ref:g,...d}));p.displayName="Button";import{useState as fe}from"react";import{User as ve,LogOut as ge,Menu as he}from"lucide-react";import*as b from"@radix-ui/react-avatar";import{jsx as A}from"react/jsx-runtime";function C({className:e,...t}){return A(b.Root,{"data-slot":"avatar",className:r("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...t})}function M({className:e,...t}){return A(b.Image,{"data-slot":"avatar-image",className:r("aspect-square size-full",e),...t})}function D({className:e,...t}){return A(b.Fallback,{"data-slot":"avatar-fallback",className:r("bg-muted flex size-full items-center justify-center rounded-full",e),...t})}import*as n from"@radix-ui/react-dropdown-menu";import{Check as Ee,ChevronRight as _e,Circle as Fe}from"lucide-react";import{jsx as f,jsxs as je}from"react/jsx-runtime";function _({...e}){return f(n.Root,{"data-slot":"dropdown-menu",...e})}function F({...e}){return f(n.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function O({className:e,sideOffset:t=4,...i}){return f(n.Portal,{children:f(n.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:r("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...i})})}function U({...e}){return f(n.Group,{"data-slot":"dropdown-menu-group",...e})}function T({className:e,inset:t,variant:i="default",...u}){return f(n.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":i,className:r("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...u})}function j({className:e,inset:t,...i}){return f(n.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:r("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...i})}function z({className:e,...t}){return f(n.Separator,{"data-slot":"dropdown-menu-separator",className:r("bg-border -mx-1 my-1 h-px",e),...t})}import*as l from"@radix-ui/react-dialog";import{X as ie}from"lucide-react";import{jsx as v,jsxs as V}from"react/jsx-runtime";var se=ie;function H({...e}){return v(l.Root,{"data-slot":"sheet",...e})}function W({...e}){return v(l.Trigger,{"data-slot":"sheet-trigger",...e})}function de({...e}){return v(l.Portal,{"data-slot":"sheet-portal",...e})}function le({className:e,...t}){return v(l.Overlay,{"data-slot":"sheet-overlay",className:r("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t})}function $({className:e,children:t,side:i="right",...u}){return V(de,{children:[v(le,{}),V(l.Content,{"data-slot":"sheet-content",className:r("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",i==="right"&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",i==="left"&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",i==="top"&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",i==="bottom"&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",e),...u,children:[t,V(l.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[v(se,{className:"size-4"}),v("span",{className:"sr-only",children:"Close"})]})]})]})}import{useEffect as me,useState as ce}from"react";import{jsx as G}from"react/jsx-runtime";var pe={className:"mr-2 h-4 w-4","aria-hidden":"true"},ue=e=>{let[t,i]=ce(!1);return me(()=>{i(!0)},[]),t?G(e,{...pe}):G("span",{className:"mr-2 h-4 w-4","aria-hidden":"true"})},x=({Icon:e})=>G("span",{className:"inline-flex items-center justify-center",children:ue(e)});import{Fragment as q,jsx as o,jsxs as m}from"react/jsx-runtime";function be({items:e=[],children:t,className:i,logoText:u="ACME Corp",user:d={name:"John Doe",email:"john@example.com",image:"https://i.pravatar.cc/150?u=a042581f4e29026704d"},onNavigateHome:g=()=>console.log("Navigating to home"),onNavItemClick:y=I=>console.log(`Navigating to ${I}`),onProfileSelected:w,onLogout:R=()=>console.log("Logout clicked"),isLoading:P=!1,identityHost:N="https://stg-id.authdog.xyz",environmentId:h="58be35b0-708f-49f6-84f0-6695d307d997"}){let[I,L]=fe(!1),Z=d!=null&&d.name!==null&&d.name!==void 0;return o("header",{className:r("border-b bg-background",i),children:m("div",{className:"container flex h-16 items-center justify-between px-4 md:px-6",children:[m("div",{className:"flex items-center gap-4",children:[o("span",{className:"text-xl font-bold cursor-pointer",onClick:g,children:u}),o("nav",{className:"hidden md:flex gap-6",children:e?.map((c,k)=>o("span",{onClick:()=>{c.disabled||y(c.href)},className:r("text-sm font-medium transition-colors hover:text-primary cursor-pointer",c.disabled&&"cursor-not-allowed opacity-80"),children:c.title},k))})]}),m("div",{className:"flex items-center gap-4",children:[t,Z?m(_,{children:[o(F,{asChild:!0,children:o(p,{variant:"ghost",className:"relative h-8 w-8 rounded-full",disabled:P,children:o(C,{className:"h-8 w-8",children:P?o("div",{className:"h-8 w-8 animate-pulse bg-muted rounded-full"}):m(q,{children:[o(M,{src:d.image||"/placeholder.svg",alt:d.name}),o(D,{children:d.name?.charAt(0)})]})})})}),o(O,{className:"w-56",align:"end",forceMount:!0,children:P?m("div",{className:"p-4",children:[o("div",{className:"h-4 w-3/4 animate-pulse bg-muted rounded mb-2"}),o("div",{className:"h-3 w-1/2 animate-pulse bg-muted rounded"})]}):m(q,{children:[o(j,{className:"font-normal",children:m("div",{className:"flex flex-col space-y-1",children:[o("p",{className:"text-sm font-medium leading-none",children:d.name}),o("p",{className:"text-xs leading-none text-muted-foreground",children:d.email})]})}),o(z,{}),o(U,{children:m(T,{onClick:w,children:[o(x,{Icon:ve}),o("span",{children:"Profile"})]})}),o(z,{}),m(T,{onClick:R,children:[o(x,{Icon:ge}),o("span",{children:"Log out"})]})]})})]}):o(p,{variant:"default","aria-label":"Sign in",onClick:()=>{if(!h)throw new Error("Environment ID is required");if(!N)throw new Error("Identity Host is required");let c=`${N}/signin/${h}`;window.open(c,"_blank")},children:"Sign in"}),m(H,{open:I,onOpenChange:L,children:[o(W,{asChild:!0,children:o(p,{variant:"ghost",size:"icon",className:"md:hidden","aria-label":"Open Menu",children:o(x,{Icon:he})})}),o($,{side:"left",className:"pr-0",children:o("nav",{className:"grid gap-2 py-6",children:e?.map((c,k)=>o("a",{href:c.href,className:r("flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent",c.disabled&&"cursor-not-allowed opacity-80"),onClick:()=>L(!1),children:c.title},k))})})]})]})]})})}import{useEffect as X,useState as J}from"react";import{User as xe}from"lucide-react";import{jsx as a,jsxs as s}from"react/jsx-runtime";var we=({loading:e,user:t,emails:i=[],connectedAccounts:u=[{provider:"Google OAuth2.0",email:"john@example.com"}],handleAuthenticated:d})=>{let[g,y]=J(!1),[w,R]=J("profile");X(()=>{y(!0)},[]),X(()=>{!e&&!t&&d&&d()},[e,t,d]);let P={className:"mr-2 h-4 w-4","aria-hidden":"true"},N=h=>g?a(h,{...P}):null;return!g||e?a("div",{children:"Loading..."}):t?s("div",{className:"grid grid-cols-[16rem,1fr] h-screen bg-gray-100",children:[s("div",{className:"h-full border-r p-6 bg-white flex flex-col min-w-0",children:[s("div",{className:"mb-6",children:[a("h1",{className:"text-xl font-bold",children:"Account"}),a("p",{className:"text-sm text-gray-500",children:"Manage your account info."})]}),a("nav",{className:"space-y-1 flex-1",children:s("button",{onClick:()=>R("profile"),className:`flex items-center w-full px-3 py-2 text-sm rounded-md ${w==="profile"?"bg-gray-100 text-gray-900":"text-gray-700 hover:bg-gray-50"}`,children:[N(xe),"Profile"]})})]}),s("div",{className:"h-full p-10 overflow-y-auto min-w-0 bg-white",children:[a("div",{className:"flex justify-between items-center mb-6",children:a("h2",{className:"text-xl font-semibold",children:w==="profile"?"Profile details":"Security settings"})}),w==="profile"?s("div",{className:"space-y-8",children:[s("div",{children:[a("h3",{className:"text-sm font-medium mb-4",children:"Profile"}),a("div",{className:"flex items-center justify-between",children:s("div",{className:"flex items-center",children:[s(C,{className:"h-12 w-12 mr-4 border",children:[a(M,{src:t.images?.[0]?.value,alt:"Profile picture"}),a(D,{children:t.displayName?.split(" ").map(h=>h[0]).join("")})]}),a("span",{className:"font-medium",children:t.displayName})]})})]}),s("div",{children:[a("h3",{className:"text-sm font-medium mb-4",children:"Email addresses"}),a("div",{className:"space-y-3"})]})]}):s("div",{className:"space-y-8",children:[s("div",{children:[a("h3",{className:"text-sm font-medium mb-4",children:"Two-factor authentication"}),a("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[s("div",{children:[a("p",{className:"font-medium",children:"Two-factor authentication"}),a("p",{className:"text-sm text-gray-500",children:"Add an extra layer of security to your account"})]}),a(p,{variant:"outline",size:"sm",children:"Enable"})]})})]},"two-factor"),s("div",{children:[a("h3",{className:"text-sm font-medium mb-4",children:"Password"}),a("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[s("div",{children:[a("p",{className:"font-medium",children:"Change password"}),a("p",{className:"text-sm text-gray-500",children:"Last changed 3 months ago"})]}),a(p,{variant:"outline",size:"sm",children:"Change"})]})})]},"password"),s("div",{children:[a("h3",{className:"text-sm font-medium mb-4",children:"Active sessions"}),a("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[s("div",{children:[a("p",{className:"font-medium",children:"Current session"}),a("p",{className:"text-sm text-gray-500",children:"Chrome on Windows \u2022 Active now"})]}),a(p,{variant:"outline",size:"sm",children:"Sign out"})]})})]},"sessions")]})]})]}):a("div",{children:"No user"})};import{CheckCircle2Icon as Ne}from"lucide-react";import{cva as Pe}from"class-variance-authority";import{jsx as B}from"react/jsx-runtime";var ye=Pe("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function K({className:e,variant:t,...i}){return B("div",{"data-slot":"alert",role:"alert",className:r(ye({variant:t}),e),...i})}function Q({className:e,...t}){return B("div",{"data-slot":"alert-title",className:r("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...t})}function Y({className:e,...t}){return B("div",{"data-slot":"alert-description",className:r("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...t})}import{jsx as S,jsxs as Me}from"react/jsx-runtime";var Ce=e=>{let t=e.title??"Placeholder Alert",i=e.description??"This is a placeholder alert.";return S("div",{className:"grid w-full max-w-xl items-start gap-4",children:Me(K,{children:[S(x,{Icon:Ne}),S(Q,{children:t}),S(Y,{children:i})]})})};export{p as Button,be as Navbar,Ce as PlaceholderAlert,we as UserProfile};
2
+ import*as E from"react";import{Slot as ae}from"@radix-ui/react-slot";import{cva as re}from"class-variance-authority";import{clsx as te}from"clsx";import{twMerge as oe}from"tailwind-merge";function n(...e){return oe(te(e))}import{jsx as ie}from"react/jsx-runtime";var ne=re("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3",lg:"h-11 rounded-md px-8",icon:"h-10 w-10"}},defaultVariants:{variant:"default",size:"default"}}),f=E.forwardRef(({className:e,variant:t,size:r,asChild:m=!1,...d},g)=>ie(m?ae:"button",{className:n(ne({variant:t,size:r,className:e})),ref:g,...d}));f.displayName="Button";import{useState as ve}from"react";import{User as ge,LogOut as he,Menu as be}from"lucide-react";import*as b from"@radix-ui/react-avatar";import{jsx as I}from"react/jsx-runtime";function P({className:e,...t}){return I(b.Root,{"data-slot":"avatar",className:n("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...t})}function N({className:e,...t}){return I(b.Image,{"data-slot":"avatar-image",className:n("aspect-square size-full",e),...t})}function C({className:e,...t}){return I(b.Fallback,{"data-slot":"avatar-fallback",className:n("bg-muted flex size-full items-center justify-center rounded-full",e),...t})}import*as i from"@radix-ui/react-dropdown-menu";import{Check as Ue,ChevronRight as He,Circle as We}from"lucide-react";import{jsx as v,jsxs as Xe}from"react/jsx-runtime";function _({...e}){return v(i.Root,{"data-slot":"dropdown-menu",...e})}function F({...e}){return v(i.Trigger,{"data-slot":"dropdown-menu-trigger",...e})}function O({className:e,sideOffset:t=4,...r}){return v(i.Portal,{children:v(i.Content,{"data-slot":"dropdown-menu-content",sideOffset:t,className:n("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",e),...r})})}function j({...e}){return v(i.Group,{"data-slot":"dropdown-menu-group",...e})}function A({className:e,inset:t,variant:r="default",...m}){return v(i.Item,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":r,className:n("focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),...m})}function U({className:e,inset:t,...r}){return v(i.Label,{"data-slot":"dropdown-menu-label","data-inset":t,className:n("px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",e),...r})}function T({className:e,...t}){return v(i.Separator,{"data-slot":"dropdown-menu-separator",className:n("bg-border -mx-1 my-1 h-px",e),...t})}import*as l from"@radix-ui/react-dialog";import{X as se}from"lucide-react";import{jsx as h,jsxs as z}from"react/jsx-runtime";var de=se;function H({...e}){return h(l.Root,{"data-slot":"sheet",...e})}function W({...e}){return h(l.Trigger,{"data-slot":"sheet-trigger",...e})}function le({...e}){return h(l.Portal,{"data-slot":"sheet-portal",...e})}function me({className:e,...t}){return h(l.Overlay,{"data-slot":"sheet-overlay",className:n("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",e),...t})}function $({className:e,children:t,side:r="right",...m}){return z(le,{children:[h(me,{}),z(l.Content,{"data-slot":"sheet-content",className:n("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",r==="right"&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",r==="left"&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",r==="top"&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",r==="bottom"&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",e),...m,children:[t,z(l.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[h(de,{className:"size-4"}),h("span",{className:"sr-only",children:"Close"})]})]})]})}import{useEffect as ce,useState as pe}from"react";import{jsx as V}from"react/jsx-runtime";var ue={className:"mr-2 h-4 w-4","aria-hidden":"true"},fe=e=>{let[t,r]=pe(!1);return ce(()=>{r(!0)},[]),t?V(e,{...ue}):V("span",{className:"mr-2 h-4 w-4","aria-hidden":"true"})},x=({Icon:e})=>V("span",{className:"inline-flex items-center justify-center",children:fe(e)});import{Fragment as q,jsx as a,jsxs as c}from"react/jsx-runtime";function xe({items:e=[],children:t,className:r,logoText:m="ACME Corp",user:d={name:"John Doe",email:"john@example.com",image:"https://i.pravatar.cc/150?u=a042581f4e29026704d"},onNavigateHome:g=()=>console.log("Navigating to home"),onNavItemClick:y=R=>console.log(`Navigating to ${R}`),onProfileSelected:D,onLogout:S=()=>console.log("Logout clicked"),isLoading:p=!1,identityHost:w="https://stg-id.authdog.xyz",environmentId:B="58be35b0-708f-49f6-84f0-6695d307d997"}){let[R,L]=ve(!1),ee=d!=null&&d.id!==null&&d.id!==void 0;return a("header",{className:n("border-b bg-background",r),children:c("div",{className:"container flex h-16 items-center justify-between px-4 md:px-6",children:[c("div",{className:"flex items-center gap-4",children:[a("span",{className:"text-xl font-bold cursor-pointer",onClick:g,children:m}),a("nav",{className:"hidden md:flex gap-6",children:e?.map((u,k)=>a("span",{onClick:()=>{u.disabled||y(u.href)},className:n("text-sm font-medium transition-colors hover:text-primary cursor-pointer",u.disabled&&"cursor-not-allowed opacity-80"),children:u.title},k))})]}),c("div",{className:"flex items-center gap-4",children:[t,ee?c(_,{children:[a(F,{asChild:!0,children:a(f,{variant:"ghost",className:"relative h-8 w-8 rounded-full",disabled:p,children:a(P,{className:"h-8 w-8",children:p?a("div",{className:"h-8 w-8 animate-pulse bg-muted rounded-full"}):c(q,{children:[a(N,{src:d.photos?.[0]?.value||"/placeholder.svg",alt:d.displayName}),a(C,{children:d.displayName?.charAt(0)})]})})})}),a(O,{className:"w-56",align:"end",forceMount:!0,children:p?c("div",{className:"p-4",children:[a("div",{className:"h-4 w-3/4 animate-pulse bg-muted rounded mb-2"}),a("div",{className:"h-3 w-1/2 animate-pulse bg-muted rounded"})]}):c(q,{children:[a(U,{className:"font-normal",children:c("div",{className:"flex flex-col space-y-1",children:[a("p",{className:"text-sm font-medium leading-none",children:d.displayName}),a("p",{className:"text-xs leading-none text-muted-foreground",children:d.emails?.[0]?.value})]})}),a(T,{}),a(j,{children:c(A,{onClick:D,children:[a(x,{Icon:ge}),a("span",{children:"Profile"})]})}),a(T,{}),c(A,{onClick:S,children:[a(x,{Icon:he}),a("span",{children:"Log out"})]})]})})]}):a(f,{variant:"default","aria-label":"Sign in",onClick:()=>{if(!B)throw new Error("Environment ID is required");if(!w)throw new Error("Identity Host is required");let u=`${w}/signin/${B}`;window.open(u,"_blank")},children:"Sign in"}),c(H,{open:R,onOpenChange:L,children:[a(W,{asChild:!0,children:a(f,{variant:"ghost",size:"icon",className:"md:hidden","aria-label":"Open Menu",children:a(x,{Icon:be})})}),a($,{side:"left",className:"pr-0",children:a("nav",{className:"grid gap-2 py-6",children:e?.map((u,k)=>a("a",{href:u.href,className:n("flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent",u.disabled&&"cursor-not-allowed opacity-80"),onClick:()=>L(!1),children:u.title},k))})})]})]})]})})}import{useEffect as J,useState as K}from"react";import{Slot as ye}from"@radix-ui/react-slot";import{cva as we}from"class-variance-authority";import{jsx as Ne}from"react/jsx-runtime";var Pe=we("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}});function X({className:e,variant:t,asChild:r=!1,...m}){return Ne(r?ye:"span",{"data-slot":"badge",className:n(Pe({variant:t}),e),...m})}import{User as Ce}from"lucide-react";import{jsx as o,jsxs as s}from"react/jsx-runtime";var Me=({loading:e,user:t,handleAuthenticated:r})=>{let[m,d]=K(!1),[g,y]=K("profile");J(()=>{d(!0)},[]),J(()=>{!e&&r&&r()},[e,t,r]);let D={className:"mr-2 h-4 w-4","aria-hidden":"true"},S=p=>m?o(p,{...D}):null;return!m||e?o("div",{children:"Loading..."}):t?s("div",{className:"grid grid-cols-[16rem,1fr] h-screen bg-gray-100",children:[s("div",{className:"h-full border-r p-6 bg-white flex flex-col min-w-0",children:[s("div",{className:"mb-6",children:[o("h1",{className:"text-xl font-bold",children:"Account"}),o("p",{className:"text-sm text-gray-500",children:"Manage your account info."})]}),o("nav",{className:"space-y-1 flex-1",children:s("button",{onClick:()=>y("profile"),className:`flex items-center w-full px-3 py-2 text-sm rounded-md ${g==="profile"?"bg-gray-100 text-gray-900":"text-gray-700 hover:bg-gray-50"}`,children:[S(Ce),"Profile"]})})]}),s("div",{className:"h-full p-10 overflow-y-auto min-w-0 bg-white",children:[o("div",{className:"flex justify-between items-center mb-6",children:o("h2",{className:"text-xl font-semibold",children:g==="profile"?"Profile details":"Security settings"})}),g==="profile"?s("div",{className:"space-y-8",children:[s("div",{children:[o("h3",{className:"text-sm font-medium mb-4",children:"Profile"}),o("div",{className:"flex items-center justify-between",children:s("div",{className:"flex items-center",children:[s(P,{className:"h-12 w-12 mr-4 border",children:[o(N,{src:t.photos?.[0]?.value,alt:"Profile picture"}),o(C,{children:t.displayName?.split(" ").map(p=>p[0]).join("")})]}),o("span",{className:"font-medium",children:t.displayName})]})})]}),s("div",{children:[o("h3",{className:"text-sm font-medium mb-4",children:"Email addresses"}),o("div",{className:"space-y-3",children:t.emails.map((p,w)=>s("div",{className:"flex items-center justify-between",children:[o("span",{children:p.value}),w===0&&o(X,{variant:"outline",className:"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100",children:"Primary"})]},p.value))})]}),s("div",{children:[o("h3",{className:"text-sm font-medium mb-4",children:"Connected accounts"}),o("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[o("div",{className:"flex items-center",children:o("div",{className:"mr-2",children:o("span",{children:t.provider})})}),o("span",{className:"text-sm text-gray-500",children:t?.emails?.[0]?.value})]},t.provider)})]})]}):s("div",{className:"space-y-8",children:[s("div",{children:[o("h3",{className:"text-sm font-medium mb-4",children:"Two-factor authentication"}),o("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[s("div",{children:[o("p",{className:"font-medium",children:"Two-factor authentication"}),o("p",{className:"text-sm text-gray-500",children:"Add an extra layer of security to your account"})]}),o(f,{variant:"outline",size:"sm",children:"Enable"})]})})]},"two-factor"),s("div",{children:[o("h3",{className:"text-sm font-medium mb-4",children:"Password"}),o("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[s("div",{children:[o("p",{className:"font-medium",children:"Change password"}),o("p",{className:"text-sm text-gray-500",children:"Last changed 3 months ago"})]}),o(f,{variant:"outline",size:"sm",children:"Change"})]})})]},"password"),s("div",{children:[o("h3",{className:"text-sm font-medium mb-4",children:"Active sessions"}),o("div",{className:"space-y-3",children:s("div",{className:"flex items-center justify-between",children:[s("div",{children:[o("p",{className:"font-medium",children:"Current session"}),o("p",{className:"text-sm text-gray-500",children:"Chrome on Windows \u2022 Active now"})]}),o(f,{variant:"outline",size:"sm",children:"Sign out"})]})})]},"sessions")]})]})]}):o("div",{children:"No user"})};import{CheckCircle2Icon as Re}from"lucide-react";import{cva as De}from"class-variance-authority";import{jsx as G}from"react/jsx-runtime";var Se=De("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",{variants:{variant:{default:"bg-card text-card-foreground",destructive:"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90"}},defaultVariants:{variant:"default"}});function Q({className:e,variant:t,...r}){return G("div",{"data-slot":"alert",role:"alert",className:n(Se({variant:t}),e),...r})}function Y({className:e,...t}){return G("div",{"data-slot":"alert-title",className:n("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",e),...t})}function Z({className:e,...t}){return G("div",{"data-slot":"alert-description",className:n("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed",e),...t})}import{jsx as M,jsxs as Ie}from"react/jsx-runtime";var ke=e=>{let t=e.title??"Placeholder Alert",r=e.description??"This is a placeholder alert.";return M("div",{className:"grid w-full max-w-xl items-start gap-4",children:Ie(Q,{children:[M(x,{Icon:Re}),M(Y,{children:t}),M(Z,{children:r})]})})};export{f as Button,xe as Navbar,ke as PlaceholderAlert,Me as UserProfile};
3
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/core/navbar.tsx","../src/components/ui/avatar.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/sheet.tsx","../src/components/icons.tsx","../src/components/core/user-profile.tsx","../src/components/core/placeholder-alert.tsx","../src/components/ui/alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\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 };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useState } from \"react\"\nimport { User, LogOut, Menu } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\"\nimport { Sheet, SheetContent, SheetTrigger } from \"../../components/ui/sheet\"\nimport { IconWrapper } from \"../icons\"\n\ninterface NavItem {\n title: string\n href: string\n disabled?: boolean\n}\n\ninterface NavbarProps {\n items?: NavItem[]\n children?: React.ReactNode\n className?: string\n logoText?: string\n isLoading?: boolean\n user?: {\n name?: string\n email?: string\n image?: string\n }\n onNavigateHome?: () => void;\n onNavItemClick?: (href: string) => void;\n onProfileSelected?: () => void;\n onLogout?: () => void;\n // signinUrl?: string;\n identityHost?: string;\n environmentId?: string;\n}\n\nexport function Navbar({\n items = [\n // { title: \"Dashboard\", href: \"/dashboard\" },\n // { title: \"Projects\", href: \"/projects\" },\n // { title: \"Team\", href: \"/team\" },\n // { title: \"Reports\", href: \"/reports\" },\n ],\n children,\n className,\n logoText = \"ACME Corp\",\n user = {\n name: \"John Doe\",\n email: \"john@example.com\",\n image: \"https://i.pravatar.cc/150?u=a042581f4e29026704d\",\n },\n onNavigateHome = () => console.log(\"Navigating to home\"),\n onNavItemClick = (href: string) => console.log(`Navigating to ${href}`),\n onProfileSelected,\n onLogout = () => console.log(\"Logout clicked\"),\n isLoading = false,\n identityHost = \"https://stg-id.authdog.xyz\",\n environmentId = \"58be35b0-708f-49f6-84f0-6695d307d997\",\n}: NavbarProps) {\n const [open, setOpen] = useState(false)\n const isAuthenticated = user !== null && user !== undefined && user.name !== null && user.name !== undefined;\n return (\n <header className={cn(\"border-b bg-background\", className)}>\n <div className=\"container flex h-16 items-center justify-between px-4 md:px-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-xl font-bold cursor-pointer\" onClick={onNavigateHome}>{logoText}</span>\n <nav className=\"hidden md:flex gap-6\">\n {items?.map((item, index) => (\n <span\n key={index}\n onClick={() => {\n if (!item.disabled) {\n onNavItemClick(item.href)\n }\n }}\n className={cn(\n \"text-sm font-medium transition-colors hover:text-primary cursor-pointer\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n >\n {item.title}\n </span>\n ))}\n </nav>\n </div>\n <div className=\"flex items-center gap-4\">\n {children}\n\n\n {\n isAuthenticated ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"relative h-8 w-8 rounded-full\" disabled={isLoading}>\n <Avatar className=\"h-8 w-8\">\n {isLoading ? (\n <div className=\"h-8 w-8 animate-pulse bg-muted rounded-full\" />\n ) : (\n <>\n <AvatarImage src={user.image || \"/placeholder.svg\"} alt={user.name} />\n <AvatarFallback>{user.name?.charAt(0)}</AvatarFallback>\n </>\n )}\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"end\" forceMount>\n {isLoading ? (\n <div className=\"p-4\">\n <div className=\"h-4 w-3/4 animate-pulse bg-muted rounded mb-2\" />\n <div className=\"h-3 w-1/2 animate-pulse bg-muted rounded\" />\n </div>\n ) : (\n <>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.name}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onProfileSelected}>\n <IconWrapper Icon={User} />\n <span>Profile</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onLogout}>\n <IconWrapper Icon={LogOut} />\n <span>Log out</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n \n : (\n <Button variant=\"default\" aria-label=\"Sign in\" onClick={() => {\n if (!environmentId) {\n throw new Error(\"Environment ID is required\");\n }\n\n if (!identityHost) {\n throw new Error(\"Identity Host is required\");\n }\n \n const signinUrl = `${identityHost}/signin/${environmentId}`;\n window.open(signinUrl, \"_blank\");\n }}>\n Sign in\n </Button>\n )\n }\n \n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"md:hidden\" aria-label=\"Open Menu\">\n <IconWrapper Icon={Menu} />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"pr-0\">\n <nav className=\"grid gap-2 py-6\">\n {items?.map((item, index) => (\n <a\n key={index}\n href={item.href}\n className={cn(\n \"flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n onClick={() => setOpen(false)}\n >\n {item.title}\n </a>\n ))}\n </nav>\n </SheetContent>\n </Sheet>\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst CheckIcon = Check as ComponentType<React.SVGProps<SVGSVGElement>>\nconst CircleIcon = Circle as ComponentType<React.SVGProps<SVGSVGElement>>\nconst ChevronRightIcon = ChevronRight as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst XIcon = X as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { LucideProps } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\n\nconst iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n}\n\nexport const renderIcon = ((Icon: any) => {\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted) {\n return <span className=\"mr-2 h-4 w-4\" aria-hidden=\"true\" />\n }\n\n return <Icon {...iconProps} />\n}) as React.FC<{\n Icon: any\n}>\n\nexport const IconWrapper = ({ Icon }: { Icon: any }) => {\n return (\n <span className=\"inline-flex items-center justify-center\">\n {renderIcon(Icon)}\n </span>\n )\n}","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport { Card } from \"../../components/ui/card\"\nimport { Badge } from \"../../components/ui/badge\"\nimport { PlusCircle, User, Shield, X, LucideProps } from \"lucide-react\"\n\nexport interface UserProfileProps {\n loading: boolean;\n user: any;\n emails?: { address: string; isPrimary?: boolean }[];\n connectedAccounts?: { provider: string; email?: string }[];\n handleAuthenticated?: () => void;\n}\n\nexport const UserProfile = ({\n loading,\n user,\n emails = [],\n connectedAccounts = [\n {\n provider: \"Google OAuth2.0\",\n email: \"john@example.com\",\n },\n ],\n handleAuthenticated\n}: UserProfileProps) => {\n const [isMounted, setIsMounted] = useState(false)\n const [activeTab, setActiveTab] = useState<\"profile\" | \"security\">(\"profile\");\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n if (!loading && !user && handleAuthenticated) {\n handleAuthenticated();\n }\n }, [loading, user, handleAuthenticated]);\n\n const iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n }\n\n const renderIcon = (Icon: any) => {\n if (!isMounted) return null\n return <Icon {...iconProps} />\n }\n\n if (!isMounted || loading) {\n return <div>Loading...</div>\n }\n\n if (!user) {\n return <div>No user</div>\n }\n \n return (\n <div className=\"grid grid-cols-[16rem,1fr] h-screen bg-gray-100\">\n <div className=\"h-full border-r p-6 bg-white flex flex-col min-w-0\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-bold\">Account</h1>\n <p className=\"text-sm text-gray-500\">Manage your account info.</p>\n </div>\n\n <nav className=\"space-y-1 flex-1\">\n <button\n onClick={() => setActiveTab(\"profile\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"profile\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(User)}\n Profile\n </button>\n {/* <button\n onClick={() => setActiveTab(\"security\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"security\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(Shield)}\n Security\n </button> */}\n </nav>\n </div>\n\n <div className=\"h-full p-10 overflow-y-auto min-w-0 bg-white\">\n <div className=\"flex justify-between items-center mb-6\">\n <h2 className=\"text-xl font-semibold\">\n {activeTab === \"profile\" ? \"Profile details\" : \"Security settings\"}\n </h2>\n {/* <button className=\"text-gray-500 hover:text-gray-700\">\n {renderIcon(X)}\n </button> */}\n </div>\n\n {activeTab === \"profile\" ? (\n <div className=\"space-y-8\">\n {/* Profile Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Profile</h3>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <Avatar className=\"h-12 w-12 mr-4 border\">\n <AvatarImage src={user.images?.[0]?.value} alt=\"Profile picture\" />\n <AvatarFallback>{user.displayName?.split(\" \").map((n: string) => n[0]).join(\"\")}</AvatarFallback>\n </Avatar>\n <span className=\"font-medium\">{user.displayName}</span>\n </div>\n {/* <Button variant=\"outline\" size=\"sm\">\n Edit profile\n </Button> */}\n </div>\n </div>\n\n {/* Email Addresses Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Email addresses</h3>\n <div className=\"space-y-3\">\n {/* {(emails.length > 0 ? emails : [{ address: user.email, isPrimary: true }]).map((email, i) => (\n <div className=\"flex items-center justify-between\" key={email.address}>\n <span>{email.address}</span>\n {email.isPrimary && (\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n )}\n </div>\n ))} */}\n {/* <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add email address\n </Button> */}\n </div>\n </div>\n\n {/* Phone Number Section */}\n {/* <div>\n <h3 className=\"text-sm font-medium mb-4\">Phone number</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span>+1 (555) 123-4567</span>\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add phone number\n </Button>\n </div>\n </div> */}\n\n {/* Connected Accounts Section */}\n {/* <div>\n <h3 className=\"text-sm font-medium mb-4\">Connected accounts</h3>\n <div className=\"space-y-3\">\n {connectedAccounts.length > 0 && connectedAccounts.map((acc, i) => (\n <div className=\"flex items-center justify-between\" key={acc.provider + acc.email}>\n <div className=\"flex items-center\">\n <div className=\"mr-2\">\n <span>{acc.provider}</span>\n </div>\n </div>\n <span className=\"text-sm text-gray-500\">{acc.email}</span>\n </div>\n )) }\n \n </div>\n </div> */}\n </div>\n ) : (\n <div className=\"space-y-8\">\n {/* Security Settings */}\n <div key=\"two-factor\">\n <h3 className=\"text-sm font-medium mb-4\">Two-factor authentication</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Two-factor authentication</p>\n <p className=\"text-sm text-gray-500\">Add an extra layer of security to your account</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Enable\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"password\">\n <h3 className=\"text-sm font-medium mb-4\">Password</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Change password</p>\n <p className=\"text-sm text-gray-500\">Last changed 3 months ago</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Change\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"sessions\">\n <h3 className=\"text-sm font-medium mb-4\">Active sessions</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Current session</p>\n <p className=\"text-sm text-gray-500\">Chrome on Windows • Active now</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Sign out\n </Button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* <div className=\"absolute bottom-4 text-xs text-gray-500 flex items-center\">\n Secured by\n <span className=\"ml-1 font-medium flex items-center\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mr-1\"\n >\n <path d=\"M8 0L14.9282 4V12L8 16L1.07179 12V4L8 0Z\" fill=\"#6C47FF\" />\n </svg>\n Authdog\n </span>\n </div> */}\n </div>\n )\n}\n","import { CheckCircle2Icon } from \"lucide-react\"\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\"\nimport { IconWrapper } from \"../icons\"\n\ninterface PlaceholderAlertProps {\n title?: string;\n description?: string;\n}\n\nexport const PlaceholderAlert = (props: PlaceholderAlertProps) => {\n const title = props.title ?? \"Placeholder Alert\";\n const description = props.description ?? \"This is a placeholder alert.\";\n\n return ( \n <div className=\"grid w-full max-w-xl items-start gap-4\">\n <Alert>\n <IconWrapper Icon={CheckCircle2Icon} />\n <AlertTitle>{title}</AlertTitle>\n <AlertDescription>\n {description}\n </AlertDescription>\n </Alert>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n"],"mappings":"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","names":["React","Slot","cva","clsx","twMerge","cn","inputs","jsx","buttonVariants","cva","Button","className","variant","size","asChild","props","ref","Slot","cn","useState","User","LogOut","Menu","AvatarPrimitive","jsx","Avatar","className","props","cn","AvatarImage","AvatarFallback","DropdownMenuPrimitive","Check","ChevronRight","Circle","jsx","jsxs","DropdownMenu","props","jsx","DropdownMenuTrigger","props","jsx","DropdownMenuContent","className","sideOffset","cn","DropdownMenuGroup","DropdownMenuItem","inset","variant","DropdownMenuLabel","className","inset","props","jsx","cn","DropdownMenuSeparator","SheetPrimitive","X","jsx","jsxs","XIcon","X","Sheet","props","SheetTrigger","SheetPortal","props","jsx","SheetOverlay","className","cn","SheetContent","children","side","jsxs","XIcon","useEffect","useState","jsx","iconProps","renderIcon","Icon","isMounted","setIsMounted","IconWrapper","Fragment","jsx","jsxs","Navbar","items","children","className","logoText","user","onNavigateHome","onNavItemClick","href","onProfileSelected","onLogout","isLoading","identityHost","environmentId","open","setOpen","useState","isAuthenticated","cn","item","index","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuGroup","DropdownMenuItem","IconWrapper","User","LogOut","signinUrl","Sheet","SheetTrigger","Menu","SheetContent","useEffect","useState","User","jsx","jsxs","UserProfile","loading","user","emails","connectedAccounts","handleAuthenticated","isMounted","setIsMounted","useState","activeTab","setActiveTab","useEffect","iconProps","renderIcon","Icon","Avatar","AvatarImage","AvatarFallback","n","Button","CheckCircle2Icon","cva","jsx","alertVariants","cva","Alert","className","variant","props","cn","AlertTitle","AlertDescription","jsx","jsxs","PlaceholderAlert","props","title","description","Alert","IconWrapper","CheckCircle2Icon","AlertTitle","AlertDescription"]}
1
+ {"version":3,"sources":["../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/core/navbar.tsx","../src/components/ui/avatar.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/sheet.tsx","../src/components/icons.tsx","../src/components/core/user-profile.tsx","../src/components/ui/badge.tsx","../src/components/core/placeholder-alert.tsx","../src/components/ui/alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\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 };\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useState } from \"react\"\nimport { User, LogOut, Menu } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../components/ui/dropdown-menu\"\nimport { Sheet, SheetContent, SheetTrigger } from \"../../components/ui/sheet\"\nimport { IconWrapper } from \"../icons\"\n\ninterface NavItem {\n title: string\n href: string\n disabled?: boolean\n}\n\ninterface NavbarProps {\n items?: NavItem[] | undefined;\n children?: React.ReactNode\n className?: string\n logoText?: string\n isLoading?: boolean\n user?: any;\n onNavigateHome?: () => void;\n onNavItemClick?: (href: string) => void;\n onProfileSelected?: () => void;\n onLogout?: () => void;\n // signinUrl?: string;\n identityHost?: string;\n environmentId?: string;\n}\n\nexport function Navbar({\n items = [\n // { title: \"Dashboard\", href: \"/dashboard\" },\n // { title: \"Projects\", href: \"/projects\" },\n // { title: \"Team\", href: \"/team\" },\n // { title: \"Reports\", href: \"/reports\" },\n ],\n children,\n className,\n logoText = \"ACME Corp\",\n user = {\n name: \"John Doe\",\n email: \"john@example.com\",\n image: \"https://i.pravatar.cc/150?u=a042581f4e29026704d\",\n },\n onNavigateHome = () => console.log(\"Navigating to home\"),\n onNavItemClick = (href: string) => console.log(`Navigating to ${href}`),\n onProfileSelected,\n onLogout = () => console.log(\"Logout clicked\"),\n isLoading = false,\n identityHost = \"https://stg-id.authdog.xyz\",\n environmentId = \"58be35b0-708f-49f6-84f0-6695d307d997\",\n}: NavbarProps) {\n const [open, setOpen] = useState(false)\n const isAuthenticated = user !== null && user !== undefined && user.id !== null && user.id !== undefined;\n return (\n <header className={cn(\"border-b bg-background\", className)}>\n <div className=\"container flex h-16 items-center justify-between px-4 md:px-6\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-xl font-bold cursor-pointer\" onClick={onNavigateHome}>{logoText}</span>\n <nav className=\"hidden md:flex gap-6\">\n {items?.map((item, index) => (\n <span\n key={index}\n onClick={() => {\n if (!item.disabled) {\n onNavItemClick(item.href)\n }\n }}\n className={cn(\n \"text-sm font-medium transition-colors hover:text-primary cursor-pointer\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n >\n {item.title}\n </span>\n ))}\n </nav>\n </div>\n <div className=\"flex items-center gap-4\">\n {children}\n\n\n\n\n {\n isAuthenticated ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"relative h-8 w-8 rounded-full\" disabled={isLoading}>\n <Avatar className=\"h-8 w-8\">\n {isLoading ? (\n <div className=\"h-8 w-8 animate-pulse bg-muted rounded-full\" />\n ) : (\n <>\n <AvatarImage src={user.photos?.[0]?.value || \"/placeholder.svg\"} alt={user.displayName} />\n <AvatarFallback>{user.displayName?.charAt(0)}</AvatarFallback>\n </>\n )}\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56\" align=\"end\" forceMount>\n {isLoading ? (\n <div className=\"p-4\">\n <div className=\"h-4 w-3/4 animate-pulse bg-muted rounded mb-2\" />\n <div className=\"h-3 w-1/2 animate-pulse bg-muted rounded\" />\n </div>\n ) : (\n <>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.displayName}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.emails?.[0]?.value}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem onClick={onProfileSelected}>\n <IconWrapper Icon={User} />\n <span>Profile</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={onLogout}>\n <IconWrapper Icon={LogOut} />\n <span>Log out</span>\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n \n : (\n <Button variant=\"default\" aria-label=\"Sign in\" onClick={() => {\n if (!environmentId) {\n throw new Error(\"Environment ID is required\");\n }\n\n if (!identityHost) {\n throw new Error(\"Identity Host is required\");\n }\n \n const signinUrl = `${identityHost}/signin/${environmentId}`;\n window.open(signinUrl, \"_blank\");\n }}>\n Sign in\n </Button>\n )\n }\n \n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"md:hidden\" aria-label=\"Open Menu\">\n <IconWrapper Icon={Menu} />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"pr-0\">\n <nav className=\"grid gap-2 py-6\">\n {items?.map((item, index) => (\n <a\n key={index}\n href={item.href}\n className={cn(\n \"flex w-full items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-accent\",\n item.disabled && \"cursor-not-allowed opacity-80\"\n )}\n onClick={() => setOpen(false)}\n >\n {item.title}\n </a>\n ))}\n </nav>\n </SheetContent>\n </Sheet>\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n \"relative flex size-8 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n \"bg-muted flex size-full items-center justify-center rounded-full\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst CheckIcon = Check as ComponentType<React.SVGProps<SVGSVGElement>>\nconst CircleIcon = Circle as ComponentType<React.SVGProps<SVGSVGElement>>\nconst ChevronRightIcon = ChevronRight as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute left-2 flex size-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"text-muted-foreground ml-auto text-xs tracking-widest\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto size-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\nimport type { ComponentType } from \"react\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst XIcon = X as ComponentType<React.SVGProps<SVGSVGElement>>\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n side === \"right\" &&\n \"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm\",\n side === \"left\" &&\n \"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm\",\n side === \"top\" &&\n \"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b\",\n side === \"bottom\" &&\n \"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t\",\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-1.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\"text-foreground font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import { LucideProps } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\n\nconst iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n}\n\nexport const renderIcon = ((Icon: any) => {\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted) {\n return <span className=\"mr-2 h-4 w-4\" aria-hidden=\"true\" />\n }\n\n return <Icon {...iconProps} />\n}) as React.FC<{\n Icon: any\n}>\n\nexport const IconWrapper = ({ Icon }: { Icon: any }) => {\n return (\n <span className=\"inline-flex items-center justify-center\">\n {renderIcon(Icon)}\n </span>\n )\n}","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { Avatar, AvatarFallback, AvatarImage } from \"../../components/ui/avatar\"\nimport { Button } from \"../../components/ui/button\"\nimport { Badge } from \"../../components/ui/badge\"\nimport { User, LucideProps } from \"lucide-react\"\n\nexport interface UserProfileProps {\n loading: boolean;\n user: any;\n emails?: { address: string; isPrimary?: boolean }[];\n handleAuthenticated?: () => void;\n}\n\nexport const UserProfile = ({\n loading,\n user,\n handleAuthenticated\n}: UserProfileProps) => {\n const [isMounted, setIsMounted] = useState(false)\n const [activeTab, setActiveTab] = useState<\"profile\" | \"security\">(\"profile\");\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n useEffect(() => {\n if (!loading && handleAuthenticated) {\n handleAuthenticated();\n }\n }, [loading, user, handleAuthenticated]);\n\n const iconProps: LucideProps = {\n className: \"mr-2 h-4 w-4\",\n \"aria-hidden\": \"true\"\n }\n\n const renderIcon = (Icon: any) => {\n if (!isMounted) return null\n return <Icon {...iconProps} />\n }\n\n if (!isMounted || loading) {\n return <div>Loading...</div>\n }\n\n if (!user) {\n return <div>No user</div>\n }\n \n return (\n <div className=\"grid grid-cols-[16rem,1fr] h-screen bg-gray-100\">\n <div className=\"h-full border-r p-6 bg-white flex flex-col min-w-0\">\n <div className=\"mb-6\">\n <h1 className=\"text-xl font-bold\">Account</h1>\n <p className=\"text-sm text-gray-500\">Manage your account info.</p>\n </div>\n\n <nav className=\"space-y-1 flex-1\">\n <button\n onClick={() => setActiveTab(\"profile\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"profile\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(User)}\n Profile\n </button>\n {/* <button\n onClick={() => setActiveTab(\"security\")}\n className={`flex items-center w-full px-3 py-2 text-sm rounded-md ${\n activeTab === \"security\" ? \"bg-gray-100 text-gray-900\" : \"text-gray-700 hover:bg-gray-50\"\n }`}\n >\n {renderIcon(Shield)}\n Security\n </button> */}\n </nav>\n </div>\n\n <div className=\"h-full p-10 overflow-y-auto min-w-0 bg-white\">\n <div className=\"flex justify-between items-center mb-6\">\n <h2 className=\"text-xl font-semibold\">\n {activeTab === \"profile\" ? \"Profile details\" : \"Security settings\"}\n </h2>\n {/* <button className=\"text-gray-500 hover:text-gray-700\">\n {renderIcon(X)}\n </button> */}\n </div>\n\n {activeTab === \"profile\" ? (\n <div className=\"space-y-8\">\n {/* Profile Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Profile</h3>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\">\n <Avatar className=\"h-12 w-12 mr-4 border\">\n <AvatarImage src={user.photos?.[0]?.value} alt=\"Profile picture\" />\n <AvatarFallback>{user.displayName?.split(\" \").map((n: string) => n[0]).join(\"\")}</AvatarFallback>\n </Avatar>\n <span className=\"font-medium\">{user.displayName}</span>\n </div>\n {/* <Button variant=\"outline\" size=\"sm\">\n Edit profile\n </Button> */}\n </div>\n </div>\n\n {/* Email Addresses Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Email addresses</h3>\n <div className=\"space-y-3\">\n\n {/* {JSON.stringify(user)} */}\n\n {/* {(emails.length > 0 ? emails : [{ address: user.email, isPrimary: true }]).map((email, i) => (\n <div className=\"flex items-center justify-between\" key={email.address}>\n <span>{email.address}</span>\n {email.isPrimary && (\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n )}\n </div>\n ))} */}\n\n {\n user.emails.map((email: any, idx: number) => (\n <div className=\"flex items-center justify-between\" key={email.value}>\n <span>{email.value}</span>\n {idx === 0 && (\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n )}\n </div>\n ))\n }\n {/* <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add email address\n </Button> */}\n </div>\n </div>\n\n {/* Phone Number Section */}\n {/* <div>\n <h3 className=\"text-sm font-medium mb-4\">Phone number</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span>+1 (555) 123-4567</span>\n <Badge variant=\"outline\" className=\"text-xs bg-gray-100 text-gray-700 hover:bg-gray-100\">\n Primary\n </Badge>\n </div>\n <Button variant=\"ghost\" size=\"sm\" className=\"flex items-center text-gray-700\">\n {renderIcon(PlusCircle)}\n Add phone number\n </Button>\n </div>\n </div> */}\n\n {/* Connected Accounts Section */}\n <div>\n <h3 className=\"text-sm font-medium mb-4\">Connected accounts</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\" key={user.provider}>\n <div className=\"flex items-center\">\n <div className=\"mr-2\">\n <span>{user.provider}</span>\n </div>\n </div>\n <span className=\"text-sm text-gray-500\">{user?.emails?.[0]?.value}</span>\n </div>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"space-y-8\">\n {/* Security Settings */}\n <div key=\"two-factor\">\n <h3 className=\"text-sm font-medium mb-4\">Two-factor authentication</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Two-factor authentication</p>\n <p className=\"text-sm text-gray-500\">Add an extra layer of security to your account</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Enable\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"password\">\n <h3 className=\"text-sm font-medium mb-4\">Password</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Change password</p>\n <p className=\"text-sm text-gray-500\">Last changed 3 months ago</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Change\n </Button>\n </div>\n </div>\n </div>\n\n <div key=\"sessions\">\n <h3 className=\"text-sm font-medium mb-4\">Active sessions</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">Current session</p>\n <p className=\"text-sm text-gray-500\">Chrome on Windows • Active now</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n Sign out\n </Button>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* <div className=\"absolute bottom-4 text-xs text-gray-500 flex items-center\">\n Secured by\n <span className=\"ml-1 font-medium flex items-center\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mr-1\"\n >\n <path d=\"M8 0L14.9282 4V12L8 16L1.07179 12V4L8 0Z\" fill=\"#6C47FF\" />\n </svg>\n Authdog\n </span>\n </div> */}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant,\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","import { CheckCircle2Icon } from \"lucide-react\"\nimport { Alert, AlertDescription, AlertTitle } from \"../../components/ui/alert\"\nimport { IconWrapper } from \"../icons\"\n\ninterface PlaceholderAlertProps {\n title?: string;\n description?: string;\n}\n\nexport const PlaceholderAlert = (props: PlaceholderAlertProps) => {\n const title = props.title ?? \"Placeholder Alert\";\n const description = props.description ?? \"This is a placeholder alert.\";\n\n return ( \n <div className=\"grid w-full max-w-xl items-start gap-4\">\n <Alert>\n <IconWrapper Icon={CheckCircle2Icon} />\n <AlertTitle>{title}</AlertTitle>\n <AlertDescription>\n {description}\n </AlertDescription>\n </Alert>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@authdog/react-elements/lib/utils\"\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Alert, AlertTitle, AlertDescription }\n"],"mappings":"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","names":["React","Slot","cva","clsx","twMerge","cn","inputs","jsx","buttonVariants","cva","Button","className","variant","size","asChild","props","ref","Slot","cn","useState","User","LogOut","Menu","AvatarPrimitive","jsx","Avatar","className","props","cn","AvatarImage","AvatarFallback","DropdownMenuPrimitive","Check","ChevronRight","Circle","jsx","jsxs","DropdownMenu","props","jsx","DropdownMenuTrigger","props","jsx","DropdownMenuContent","className","sideOffset","cn","DropdownMenuGroup","DropdownMenuItem","inset","variant","DropdownMenuLabel","className","inset","props","jsx","cn","DropdownMenuSeparator","SheetPrimitive","X","jsx","jsxs","XIcon","X","Sheet","props","SheetTrigger","SheetPortal","props","jsx","SheetOverlay","className","cn","SheetContent","children","side","jsxs","XIcon","useEffect","useState","jsx","iconProps","renderIcon","Icon","isMounted","setIsMounted","IconWrapper","Fragment","jsx","jsxs","Navbar","items","children","className","logoText","user","onNavigateHome","onNavItemClick","href","onProfileSelected","onLogout","isLoading","identityHost","environmentId","open","setOpen","useState","isAuthenticated","cn","item","index","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuGroup","DropdownMenuItem","IconWrapper","User","LogOut","signinUrl","Sheet","SheetTrigger","Menu","SheetContent","useEffect","useState","Slot","cva","jsx","badgeVariants","cva","Badge","className","variant","asChild","props","Slot","cn","User","jsx","jsxs","UserProfile","loading","user","handleAuthenticated","isMounted","setIsMounted","useState","activeTab","setActiveTab","useEffect","iconProps","renderIcon","Icon","Avatar","AvatarImage","AvatarFallback","n","email","idx","Badge","Button","CheckCircle2Icon","cva","jsx","alertVariants","cva","Alert","className","variant","props","cn","AlertTitle","AlertDescription","jsx","jsxs","PlaceholderAlert","props","title","description","Alert","IconWrapper","CheckCircle2Icon","AlertTitle","AlertDescription"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@authdog/react-elements",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.mts",
@@ -26,16 +26,12 @@ interface NavItem {
26
26
  }
27
27
 
28
28
  interface NavbarProps {
29
- items?: NavItem[]
29
+ items?: NavItem[] | undefined;
30
30
  children?: React.ReactNode
31
31
  className?: string
32
32
  logoText?: string
33
33
  isLoading?: boolean
34
- user?: {
35
- name?: string
36
- email?: string
37
- image?: string
38
- }
34
+ user?: any;
39
35
  onNavigateHome?: () => void;
40
36
  onNavItemClick?: (href: string) => void;
41
37
  onProfileSelected?: () => void;
@@ -69,7 +65,7 @@ export function Navbar({
69
65
  environmentId = "58be35b0-708f-49f6-84f0-6695d307d997",
70
66
  }: NavbarProps) {
71
67
  const [open, setOpen] = useState(false)
72
- const isAuthenticated = user !== null && user !== undefined && user.name !== null && user.name !== undefined;
68
+ const isAuthenticated = user !== null && user !== undefined && user.id !== null && user.id !== undefined;
73
69
  return (
74
70
  <header className={cn("border-b bg-background", className)}>
75
71
  <div className="container flex h-16 items-center justify-between px-4 md:px-6">
@@ -98,6 +94,8 @@ export function Navbar({
98
94
  {children}
99
95
 
100
96
 
97
+
98
+
101
99
  {
102
100
  isAuthenticated ? (
103
101
  <DropdownMenu>
@@ -108,8 +106,8 @@ export function Navbar({
108
106
  <div className="h-8 w-8 animate-pulse bg-muted rounded-full" />
109
107
  ) : (
110
108
  <>
111
- <AvatarImage src={user.image || "/placeholder.svg"} alt={user.name} />
112
- <AvatarFallback>{user.name?.charAt(0)}</AvatarFallback>
109
+ <AvatarImage src={user.photos?.[0]?.value || "/placeholder.svg"} alt={user.displayName} />
110
+ <AvatarFallback>{user.displayName?.charAt(0)}</AvatarFallback>
113
111
  </>
114
112
  )}
115
113
  </Avatar>
@@ -125,8 +123,8 @@ export function Navbar({
125
123
  <>
126
124
  <DropdownMenuLabel className="font-normal">
127
125
  <div className="flex flex-col space-y-1">
128
- <p className="text-sm font-medium leading-none">{user.name}</p>
129
- <p className="text-xs leading-none text-muted-foreground">{user.email}</p>
126
+ <p className="text-sm font-medium leading-none">{user.displayName}</p>
127
+ <p className="text-xs leading-none text-muted-foreground">{user.emails?.[0]?.value}</p>
130
128
  </div>
131
129
  </DropdownMenuLabel>
132
130
  <DropdownMenuSeparator />
@@ -3,28 +3,19 @@
3
3
  import { useEffect, useState } from "react"
4
4
  import { Avatar, AvatarFallback, AvatarImage } from "../../components/ui/avatar"
5
5
  import { Button } from "../../components/ui/button"
6
- import { Card } from "../../components/ui/card"
7
6
  import { Badge } from "../../components/ui/badge"
8
- import { PlusCircle, User, Shield, X, LucideProps } from "lucide-react"
7
+ import { User, LucideProps } from "lucide-react"
9
8
 
10
9
  export interface UserProfileProps {
11
10
  loading: boolean;
12
11
  user: any;
13
12
  emails?: { address: string; isPrimary?: boolean }[];
14
- connectedAccounts?: { provider: string; email?: string }[];
15
13
  handleAuthenticated?: () => void;
16
14
  }
17
15
 
18
16
  export const UserProfile = ({
19
17
  loading,
20
18
  user,
21
- emails = [],
22
- connectedAccounts = [
23
- {
24
- provider: "Google OAuth2.0",
25
- email: "john@example.com",
26
- },
27
- ],
28
19
  handleAuthenticated
29
20
  }: UserProfileProps) => {
30
21
  const [isMounted, setIsMounted] = useState(false)
@@ -35,7 +26,7 @@ export const UserProfile = ({
35
26
  }, []);
36
27
 
37
28
  useEffect(() => {
38
- if (!loading && !user && handleAuthenticated) {
29
+ if (!loading && handleAuthenticated) {
39
30
  handleAuthenticated();
40
31
  }
41
32
  }, [loading, user, handleAuthenticated]);
@@ -106,7 +97,7 @@ export const UserProfile = ({
106
97
  <div className="flex items-center justify-between">
107
98
  <div className="flex items-center">
108
99
  <Avatar className="h-12 w-12 mr-4 border">
109
- <AvatarImage src={user.images?.[0]?.value} alt="Profile picture" />
100
+ <AvatarImage src={user.photos?.[0]?.value} alt="Profile picture" />
110
101
  <AvatarFallback>{user.displayName?.split(" ").map((n: string) => n[0]).join("")}</AvatarFallback>
111
102
  </Avatar>
112
103
  <span className="font-medium">{user.displayName}</span>
@@ -121,6 +112,9 @@ export const UserProfile = ({
121
112
  <div>
122
113
  <h3 className="text-sm font-medium mb-4">Email addresses</h3>
123
114
  <div className="space-y-3">
115
+
116
+ {/* {JSON.stringify(user)} */}
117
+
124
118
  {/* {(emails.length > 0 ? emails : [{ address: user.email, isPrimary: true }]).map((email, i) => (
125
119
  <div className="flex items-center justify-between" key={email.address}>
126
120
  <span>{email.address}</span>
@@ -131,6 +125,19 @@ export const UserProfile = ({
131
125
  )}
132
126
  </div>
133
127
  ))} */}
128
+
129
+ {
130
+ user.emails.map((email: any, idx: number) => (
131
+ <div className="flex items-center justify-between" key={email.value}>
132
+ <span>{email.value}</span>
133
+ {idx === 0 && (
134
+ <Badge variant="outline" className="text-xs bg-gray-100 text-gray-700 hover:bg-gray-100">
135
+ Primary
136
+ </Badge>
137
+ )}
138
+ </div>
139
+ ))
140
+ }
134
141
  {/* <Button variant="ghost" size="sm" className="flex items-center text-gray-700">
135
142
  {renderIcon(PlusCircle)}
136
143
  Add email address
@@ -156,22 +163,19 @@ export const UserProfile = ({
156
163
  </div> */}
157
164
 
158
165
  {/* Connected Accounts Section */}
159
- {/* <div>
166
+ <div>
160
167
  <h3 className="text-sm font-medium mb-4">Connected accounts</h3>
161
168
  <div className="space-y-3">
162
- {connectedAccounts.length > 0 && connectedAccounts.map((acc, i) => (
163
- <div className="flex items-center justify-between" key={acc.provider + acc.email}>
169
+ <div className="flex items-center justify-between" key={user.provider}>
164
170
  <div className="flex items-center">
165
171
  <div className="mr-2">
166
- <span>{acc.provider}</span>
172
+ <span>{user.provider}</span>
167
173
  </div>
168
174
  </div>
169
- <span className="text-sm text-gray-500">{acc.email}</span>
175
+ <span className="text-sm text-gray-500">{user?.emails?.[0]?.value}</span>
170
176
  </div>
171
- )) }
172
-
173
177
  </div>
174
- </div> */}
178
+ </div>
175
179
  </div>
176
180
  ) : (
177
181
  <div className="space-y-8">
package/src/types.ts ADDED
File without changes