@flexkit/studio 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/asset-GMXBEENP.js +2 -0
  2. package/dist/{asset-65455B7V.js.map → asset-GMXBEENP.js.map} +1 -1
  3. package/dist/astro.js +1 -1
  4. package/dist/{chunk-2WWU4XFO.js → chunk-GLDDBGSW.js} +2 -2
  5. package/dist/{chunk-2WWU4XFO.js.map → chunk-GLDDBGSW.js.map} +1 -1
  6. package/dist/{chunk-HIMN6EYJ.js → chunk-L4ER5RUF.js} +2 -2
  7. package/dist/{chunk-HIMN6EYJ.js.map → chunk-L4ER5RUF.js.map} +1 -1
  8. package/dist/{chunk-TL6JXN6O.js → chunk-QOSBN65B.js} +23 -3
  9. package/dist/{chunk-OTQ3BR2A.js → chunk-SPWSXOXS.js} +2 -2
  10. package/dist/chunk-SPWSXOXS.js.map +1 -0
  11. package/dist/{chunk-OOYWOWHR.js → chunk-TEKVBWRU.js} +2 -2
  12. package/dist/{chunk-OOYWOWHR.js.map → chunk-TEKVBWRU.js.map} +1 -1
  13. package/dist/chunk-WA4EGOM4.js +2 -0
  14. package/dist/chunk-WA4EGOM4.js.map +1 -0
  15. package/dist/chunk-WB6HSMJT.js +2 -0
  16. package/dist/chunk-WB6HSMJT.js.map +1 -0
  17. package/dist/index.js +23 -23
  18. package/dist/index.js.map +1 -1
  19. package/dist/nextjs.js +1 -1
  20. package/dist/switch-HXXPL3GZ.js +2 -0
  21. package/dist/{switch-FU7XZ34K.js.map → switch-HXXPL3GZ.js.map} +1 -1
  22. package/dist/tanstack-start.js +1 -1
  23. package/dist/text-V5OWHWTK.js +2 -0
  24. package/dist/{text-DFG6LLN6.js.map → text-V5OWHWTK.js.map} +1 -1
  25. package/dist/textarea-JDQEV6HE.js +2 -0
  26. package/dist/{textarea-XFHA5IEI.js.map → textarea-JDQEV6HE.js.map} +1 -1
  27. package/dist/ui.d.ts +3 -20
  28. package/dist/ui.js +1 -1
  29. package/dist/ui.js.map +1 -1
  30. package/dist/user-nav-7U3KULA6.js +2 -0
  31. package/dist/user-nav-7U3KULA6.js.map +1 -0
  32. package/package.json +2 -5
  33. package/dist/asset-65455B7V.js +0 -2
  34. package/dist/chunk-D5N42D57.js +0 -2
  35. package/dist/chunk-D5N42D57.js.map +0 -1
  36. package/dist/chunk-NJN7EGGK.js +0 -2
  37. package/dist/chunk-NJN7EGGK.js.map +0 -1
  38. package/dist/chunk-OTQ3BR2A.js.map +0 -1
  39. package/dist/switch-FU7XZ34K.js +0 -2
  40. package/dist/text-DFG6LLN6.js +0 -2
  41. package/dist/textarea-XFHA5IEI.js +0 -2
  42. package/dist/user-nav-5LW5USDZ.js +0 -2
  43. package/dist/user-nav-5LW5USDZ.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as Asset}from'./chunk-D5N42D57.js';import'./chunk-RMSYYUQM.js';import'./chunk-7YBJLUUE.js';import'./chunk-AXB7FQV2.js';//# sourceMappingURL=asset-65455B7V.js.map
2
- //# sourceMappingURL=asset-65455B7V.js.map
@@ -1,2 +0,0 @@
1
- import'./index.css';import {a,b as b$2,c,d as d$1,e}from'./chunk-RMSYYUQM.js';import {b as b$1}from'./chunk-7YBJLUUE.js';import {defaultStyles,FileIcon}from'react-file-icon';import {useMemo,useState,useEffect}from'react';import {jsx,jsxs}from'react/jsx-runtime';var w=250,x=25e5,r=new Map,b=new Map,T=new Set,C=new Map;function d(t){if(C.has(t))return;let e=new Image;e.decoding="async",e.src=t,C.set(t,e);}function g(t){let e=r.get(t);e&&r.set(t,{...e,lastUsedAt:Date.now()});}function L(){if(r.size<=w)return;let t=Array.from(r.entries()).sort((n,o)=>n[1].lastUsedAt-o[1].lastUsedAt),e=Math.max(1,Math.ceil(w*.1));for(let n=0;n<e&&n<t.length;n+=1){let[o,s]=t[n];r.delete(o),URL.revokeObjectURL(s.objectUrl);}}async function M(t){if(T.has(t)){d(t);return}if(r.has(t)){g(t);return}let e=b.get(t);if(e){await e;return}let n=(async()=>{try{let o=await fetch(t,{mode:"cors",cache:"force-cache"});if(!o.ok){d(t);return}let s=await o.blob();if(s.size>x)return;let a=URL.createObjectURL(s);r.set(t,{objectUrl:a,byteSize:s.size,lastUsedAt:Date.now()}),L();}catch(o){o instanceof TypeError&&T.add(t),d(t);}})();b.set(t,n),await n,b.delete(t);}function U(t){let e=useMemo(()=>{if(!t)return null;let s=r.get(t);return s?(g(t),s.objectUrl):null},[t]),[n,o]=useState(e);return useEffect(()=>{if(!t){o(null);return}if(T.has(t)){d(t),o(null);return}let s=r.get(t);if(s){g(t),o(s.objectUrl);return}o(null);let a=false;return M(t).then(()=>{let l=r.get(t);l&&(a||(g(t),o(l.objectUrl)));}),()=>{a=true;}},[t]),n}var $=FileIcon;function D({value:t}){let e$1=t?.path??"",n=!!e$1,o=n&&/\.(png|jpe?g|gif|webp|avif|svg)$/i.test(e$1),s=f=>{let k=f.split("?")[0].split(".");return k.length>1?k.pop().toLowerCase():"file"},a$1=n?e$1.endsWith(".svg")?`${b$1}${e$1}`:`${b$1}${e$1}?w=84&h=84&f=webp`:null,l=n?e$1.endsWith(".svg")?`${b$1}${e$1}`:`${b$1}${e$1}?w=624&h=624&f=webp`:"",S=U(a$1);return n?jsx("div",{className:"fk-z-10",children:jsx(a,{children:o?jsxs(b$2,{children:[jsx(c,{asChild:true,children:jsx("img",{alt:"asset",className:"fk-w-7 fk-h-7 fk-cursor-zoom-in fk-bg-muted/40 fk-rounded-sm",decoding:"async",src:S??void 0})}),jsx(d$1,{children:jsx(e,{children:jsx("img",{alt:"asset",className:"fk-w-52 fk-h-52 fk-bg-muted/40 fk-rounded-sm",decoding:"async",src:l})})})]}):jsxs(b$2,{children:[jsx(c,{asChild:true,children:jsx("div",{className:"fk-w-7 fk-h-7 fk-rounded fk-bg-transparent fk-flex fk-items-center fk-justify-center [&>svg]:fk-h-full [&>svg]:fk-w-auto",children:(()=>{let f=s(e$1),y=defaultStyles[f];return jsx($,{extension:f,...y||{}})})()})}),jsx(d$1,{children:jsx(e,{children:jsx("div",{className:"fk-text-sm fk-text-muted-foreground",children:"Preview not available"})})})]})})}):null}export{D as a};//# sourceMappingURL=chunk-D5N42D57.js.map
2
- //# sourceMappingURL=chunk-D5N42D57.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/hooks/use-cached-image-src.ts","../src/data-grid/preview-components/asset.tsx"],"names":["MAX_CACHE_ENTRIES","MAX_SINGLE_BLOB_BYTES","blobUrlCache","inFlightLoads","corsBlockedUrls","preloadedImages","ensurePreloaded","url","img","touch","entry","evictIfNeeded","entries","a","b","evictCount","i","loadToCache","existing","promise","res","blob","objectUrl","err","useCachedImageSrc","initial","useMemo","cached","src","setSrc","useState","useEffect","isStale","next","FileTypeIconCompat","FileTypeIcon","Asset","value","path","hasPath","isImage","getExtensionFromPath","p","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","cachedThumbnailSrc","jsx","TooltipProvider","jsxs","Tooltip","TooltipTrigger","TooltipPortal","TooltipContent","ext","style","defaultStyles"],"mappings":"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","file":"chunk-D5N42D57.js","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\ntype CacheEntry = {\n objectUrl: string;\n byteSize: number;\n lastUsedAt: number;\n};\n\nconst MAX_CACHE_ENTRIES = 250;\nconst MAX_SINGLE_BLOB_BYTES = 2_500_000; // ~2.5MB\n\nconst blobUrlCache = new Map<string, CacheEntry>();\nconst inFlightLoads = new Map<string, Promise<void>>();\nconst corsBlockedUrls = new Set<string>();\nconst preloadedImages = new Map<string, HTMLImageElement>();\n\nfunction ensurePreloaded(url: string): void {\n if (preloadedImages.has(url)) {\n return;\n }\n\n const img = new Image();\n img.decoding = 'async';\n img.src = url;\n preloadedImages.set(url, img);\n}\n\nfunction touch(url: string): void {\n const entry = blobUrlCache.get(url);\n\n if (!entry) {\n return;\n }\n\n blobUrlCache.set(url, { ...entry, lastUsedAt: Date.now() });\n}\n\nfunction evictIfNeeded(): void {\n if (blobUrlCache.size <= MAX_CACHE_ENTRIES) {\n return;\n }\n\n const entries = Array.from(blobUrlCache.entries()).sort((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);\n const evictCount = Math.max(1, Math.ceil(MAX_CACHE_ENTRIES * 0.1));\n\n for (let i = 0; i < evictCount && i < entries.length; i += 1) {\n const [url, entry] = entries[i];\n blobUrlCache.delete(url);\n\n URL.revokeObjectURL(entry.objectUrl);\n }\n}\n\nasync function loadToCache(url: string): Promise<void> {\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n\n return;\n }\n\n if (blobUrlCache.has(url)) {\n touch(url);\n\n return;\n }\n\n const existing = inFlightLoads.get(url);\n\n if (existing) {\n await existing;\n\n return;\n }\n\n const promise = (async () => {\n try {\n const res = await fetch(url, {\n mode: 'cors',\n cache: 'force-cache',\n });\n\n if (!res.ok) {\n ensurePreloaded(url);\n\n return;\n }\n\n const blob = await res.blob();\n\n if (blob.size > MAX_SINGLE_BLOB_BYTES) {\n return;\n }\n\n const objectUrl = URL.createObjectURL(blob);\n blobUrlCache.set(url, { objectUrl, byteSize: blob.size, lastUsedAt: Date.now() });\n evictIfNeeded();\n } catch (err: unknown) {\n // Most common failure is CORS (TypeError: Failed to fetch). If so, avoid retrying.\n if (err instanceof TypeError) {\n corsBlockedUrls.add(url);\n }\n\n ensurePreloaded(url);\n }\n })();\n\n inFlightLoads.set(url, promise);\n\n await promise;\n\n inFlightLoads.delete(url);\n}\n\n/**\n * Keeps a stable, in-memory cached image src across virtualized unmount/remount cycles.\n * Falls back to the original URL if the image can’t be fetched (e.g. due to CORS).\n */\nexport function useCachedImageSrc(url: string | null | undefined): string | null {\n const initial = useMemo(() => {\n if (!url) {\n return null;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (!cached) {\n return null;\n }\n\n touch(url);\n\n return cached.objectUrl;\n }, [url]);\n\n const [src, setSrc] = useState<string | null>(initial);\n\n useEffect(() => {\n if (!url) {\n setSrc(null);\n\n return;\n }\n\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n setSrc(null);\n\n return;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (cached) {\n touch(url);\n setSrc(cached.objectUrl);\n\n return;\n }\n\n setSrc(null);\n let isStale = false;\n\n loadToCache(url).then(() => {\n const next = blobUrlCache.get(url);\n\n if (!next) {\n return;\n }\n\n if (isStale) {\n return;\n }\n\n touch(url);\n setSrc(next.objectUrl);\n });\n\n return () => {\n isStale = true;\n };\n }, [url]);\n\n return src;\n}\n","import { Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { IMAGES_BASE_URL } from '../../core/api-paths';\nimport type { ComponentType } from 'react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { useCachedImageSrc } from '../../ui/hooks/use-cached-image-src';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nexport type Asset = {\n _id: string;\n path: string;\n};\n\nexport function Asset({ value }: { value: Asset }) {\n const path = value?.path ?? '';\n const hasPath = Boolean(path);\n const isImage = hasPath && /\\.(png|jpe?g|gif|webp|avif|svg)$/i.test(path);\n\n const getExtensionFromPath = (p: string): string => {\n const clean = p.split('?')[0];\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n };\n\n const thumbnaillUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=84&h=84&f=webp`\n : null;\n\n const fullUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=624&h=624&f=webp`\n : '';\n\n const cachedThumbnailSrc = useCachedImageSrc(thumbnaillUrl);\n\n if (!hasPath) {\n return null;\n }\n\n return (\n <div className=\"fk-z-10\">\n <TooltipProvider>\n {isImage ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n alt=\"asset\"\n className=\"fk-w-7 fk-h-7 fk-cursor-zoom-in fk-bg-muted/40 fk-rounded-sm\"\n decoding=\"async\"\n src={cachedThumbnailSrc ?? undefined}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n alt=\"asset\"\n className=\"fk-w-52 fk-h-52 fk-bg-muted/40 fk-rounded-sm\"\n decoding=\"async\"\n src={fullUrl}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk-w-7 fk-h-7 fk-rounded fk-bg-transparent fk-flex fk-items-center fk-justify-center [&>svg]:fk-h-full [&>svg]:fk-w-auto\">\n {(() => {\n const ext = getExtensionFromPath(path);\n const style = (\n defaultStyles as Record<string, Record<string, string | number | boolean | undefined>>\n )[ext];\n\n return <FileTypeIconCompat extension={ext} {...(style || {})} />;\n })()}\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk-text-sm fk-text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n );\n}\n"]}
@@ -1,2 +0,0 @@
1
- import'./index.css';import {c as c$1}from'./chunk-7YBJLUUE.js';import {createContext,useContext}from'react';import c from'swr';import {useParams}from'react-router-dom';import {jsx}from'react/jsx-runtime';function i(){let{projectId:e}=useParams(),{data:t,isLoading:o}=c(c$1(e??"").currentUser,u=>fetch(u,{mode:"cors",credentials:"include"}).then(n=>n.json()));return [o,{user:t,logout:async()=>{await fetch(c$1(e??"").logout("/studio"),{method:"POST",mode:"cors",credentials:"include"}),await fetch("/api/flexkit/logout",{method:"GET",credentials:"include"}),window.location.reload();}}]}var s=createContext([true,{user:null,logout:()=>Promise.resolve()}]);function P({children:e}){let[t,o]=i();return jsx(s.Provider,{value:[t,o],children:e})}function x(){return useContext(s)}export{P as a,x as b};//# sourceMappingURL=chunk-NJN7EGGK.js.map
2
- //# sourceMappingURL=chunk-NJN7EGGK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/auth/use-auth-service.ts","../src/auth/auth-context.tsx"],"names":["useAuthService","projectId","useParams","user","isLoadingUser","useSWR","apiPaths","url","res","AuthContext","createContext","AuthProvider","children","isLoading","auth","jsx","useAuth","useContext"],"mappings":"4MAOe,SAARA,CAAAA,EAA+C,CACpD,GAAM,CAAE,SAAA,CAAAC,CAAU,CAAA,CAAIC,SAAAA,EAAU,CAC1B,CAAE,KAAMC,CAAAA,CAAM,SAAA,CAAWC,CAAc,CAAA,CAAIC,EAAOC,GAAAA,CAASL,CAAAA,EAAa,EAAE,CAAA,CAAE,YAAcM,CAAAA,EAC9F,KAAA,CAAMA,CAAAA,CAAK,CAAE,IAAA,CAAM,MAAA,CAAQ,WAAA,CAAa,SAAU,CAAC,CAAA,CAAE,IAAA,CAAMC,CAAAA,EAAQA,CAAAA,CAAI,MAAuB,CAChG,CAAA,CAGA,OAAO,CAFWJ,CAAAA,CAIhB,CACE,IAAA,CAAAD,CAAAA,CACA,MAAA,CAAQ,SAAY,CAElB,MAAM,MAAMG,GAAAA,CAASL,CAAAA,EAAa,EAAE,CAAA,CAAE,OAAO,SAAS,CAAA,CAAG,CACvD,MAAA,CAAQ,OACR,IAAA,CAAM,MAAA,CACN,WAAA,CAAa,SACf,CAAC,CAAA,CAGD,MAAM,KAAA,CAAM,sBAAuB,CAAE,MAAA,CAAQ,KAAA,CAAO,WAAA,CAAa,SAAU,CAAC,CAAA,CAE5E,MAAA,CAAO,QAAA,CAAS,SAClB,CACF,CACF,CACF,CC3BA,IAAMQ,CAAAA,CAAcC,aAAAA,CAAc,CAChC,IAAA,CACA,CACE,IAAA,CAAM,IAAA,CACN,MAAA,CAAQ,IAAM,QAAQ,OAAA,EACxB,CACF,CAAC,CAAA,CAEM,SAASC,CAAAA,CAAa,CAAE,SAAAC,CAAS,CAAA,CAA+C,CACrF,GAAM,CAACC,CAAAA,CAAWC,CAAI,CAAA,CAAId,CAAAA,GAE1B,OAAOe,GAAAA,CAACN,CAAAA,CAAY,QAAA,CAAZ,CAAqB,KAAA,CAAO,CAACI,CAAAA,CAAWC,CAAI,EAAI,QAAA,CAAAF,CAAAA,CAAS,CACnE,CAEO,SAASI,CAAAA,EAAuB,CACrC,OAAOC,UAAAA,CAAWR,CAAW,CAC/B","file":"chunk-NJN7EGGK.js","sourcesContent":["'use client';\n\nimport useSWR from 'swr';\nimport { useParams } from 'react-router-dom';\nimport { apiPaths } from '../core/api-paths';\nimport type { AuthService, User } from './types';\n\nexport default function useAuthService(): AuthService {\n const { projectId } = useParams();\n const { data: user, isLoading: isLoadingUser } = useSWR(apiPaths(projectId ?? '').currentUser, (url: string) =>\n fetch(url, { mode: 'cors', credentials: 'include' }).then((res) => res.json() as Promise<User>)\n );\n const isLoading = isLoadingUser;\n\n return [\n isLoading,\n {\n user,\n logout: async () => {\n // wipe remote session\n await fetch(apiPaths(projectId ?? '').logout('/studio'), {\n method: 'POST',\n mode: 'cors',\n credentials: 'include',\n });\n\n // delete first-party auth cookie\n await fetch('/api/flexkit/logout', { method: 'GET', credentials: 'include' });\n\n window.location.reload();\n },\n },\n ];\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport useAuthService from './use-auth-service';\nimport type { Auth, AuthService, User } from './types';\n\nconst AuthContext = createContext([\n true,\n {\n user: null as User | null,\n logout: () => Promise.resolve(),\n } as Auth,\n]);\n\nexport function AuthProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const [isLoading, auth] = useAuthService();\n\n return <AuthContext.Provider value={[isLoading, auth]}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuth(): AuthService {\n return useContext(AuthContext) as AuthService;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/primitives/label.tsx","../src/ui/primitives/form.tsx"],"names":["labelVariants","cva","Label","p","className","props","ref","jsx","cn","Form","FormProvider","FormFieldContext","FormField","Controller","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","formState","useFormContext","fieldState","id","FormItem","FormLabel","error","formItemId","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","children","body","errorObj"],"mappings":"oTAOA,IAAMA,CAAAA,CAAgBC,GAAAA,CACpB,oHACF,CAAA,CAEMC,CAAAA,CAAcC,aAGlB,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,GAAGC,CAAM,EAAGC,CAAAA,GAC1BC,GAAAA,CAAgB,CAAA,CAAA,IAAA,CAAf,CAAoB,SAAA,CAAWC,CAAAA,CAAGR,GAAc,CAAGI,CAAS,CAAA,CAAG,GAAA,CAAKE,CAAAA,CAAM,GAAGD,EAAO,CACtF,EACDH,CAAAA,CAAM,WAAA,CAA6B,CAAA,CAAA,IAAA,CAAK,WAAA,CCTxC,IAAMO,CAAAA,CAAOC,YAAAA,CASPC,EAAyB,CAAA,CAAA,aAAA,CAAqC,EAA2B,EAE/F,SAASC,CAAAA,CAGP,CAAE,GAAGP,CAAM,CAAA,CAAsD,CACjE,OACEE,GAAAA,CAACI,EAAiB,QAAA,CAAjB,CAA0B,KAAA,CAAO,CAAE,IAAA,CAAMN,CAAAA,CAAM,IAAK,CAAA,CACnD,QAAA,CAAAE,GAAAA,CAACM,UAAAA,CAAA,CAAY,GAAGR,EAAO,CAAA,CACzB,CAEJ,CAcA,IAAMS,CAAAA,CAAe,IAAsB,CACzC,IAAMC,CAAAA,CAAqB,CAAA,CAAA,UAAA,CAAWJ,CAAgB,CAAA,CAChDK,CAAAA,CAAoB,aAAWC,CAAe,CAAA,CAC9C,CAAE,aAAA,CAAAC,CAAAA,CAAe,SAAA,CAAAC,CAAU,CAAA,CAAIC,cAAAA,EAAe,CAE9CC,CAAAA,CAAaH,CAAAA,CAAcH,CAAAA,CAAa,KAAMI,CAAS,CAAA,CAE7D,GAAI,CAACJ,CAAAA,CAAa,IAAA,CAChB,MAAM,IAAI,KAAA,CAAM,gDAAgD,CAAA,CAGlE,GAAM,CAAE,GAAAO,CAAG,CAAA,CAAIN,CAAAA,CAEf,OAAO,CACL,EAAA,CAAAM,EACA,IAAA,CAAMP,CAAAA,CAAa,IAAA,CACnB,UAAA,CAAY,CAAA,EAAGO,CAAE,aACjB,iBAAA,CAAmB,CAAA,EAAGA,CAAE,CAAA,sBAAA,CAAA,CACxB,aAAA,CAAe,CAAA,EAAGA,CAAE,CAAA,kBAAA,CAAA,CACpB,GAAGD,CACL,CACF,CAAA,CAMMJ,CAAAA,CAAwB,gBAAoC,EAA0B,CAAA,CAEtFM,CAAAA,CAAiB,CAAA,CAAA,UAAA,CACrB,CAAC,CAAE,SAAA,CAAAnB,CAAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CAChC,IAAMgB,GAAAA,CAAW,CAAA,CAAA,KAAA,EAAM,CAEvB,OACEf,GAAAA,CAACU,EAAgB,QAAA,CAAhB,CAAyB,KAAA,CAAO,CAAE,EAAA,CAAAK,GAAG,EACpC,QAAA,CAAAf,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,CAAAA,CAAG,kCAAA,CAAoCJ,CAAS,CAAA,CAAG,GAAA,CAAKE,CAAAA,CAAM,GAAGD,CAAAA,CAAO,CAAA,CAC1F,CAEJ,CACF,EACAkB,CAAAA,CAAS,WAAA,CAAc,UAAA,CAEvB,IAAMC,EAAkB,CAAA,CAAA,UAAA,CAGtB,CAAC,CAAE,SAAA,CAAApB,CAAAA,CAAW,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CAClC,GAAM,CAAE,KAAA,CAAAmB,IAAO,UAAA,CAAAC,CAAW,CAAA,CAAIZ,CAAAA,EAAa,CAE3C,OAAOP,IAACL,CAAAA,CAAA,CAAM,SAAA,CAAWM,CAAAA,CAAGiB,GAAAA,EAAS,qBAAA,CAAuBrB,CAAS,CAAA,CAAG,OAAA,CAASsB,CAAAA,CAAY,GAAA,CAAKpB,CAAAA,CAAM,GAAGD,EAAO,CACpH,CAAC,EACDmB,CAAAA,CAAU,WAAA,CAAc,WAAA,KAElBG,CAAAA,CAAoB,CAAA,CAAA,UAAA,CACxB,CAAC,CAAE,GAAGtB,CAAM,EAAGC,CAAAA,GAAQ,CACrB,GAAM,CAAE,KAAA,CAAAmB,CAAAA,CAAO,WAAAC,CAAAA,CAAY,iBAAA,CAAAE,CAAAA,CAAmB,aAAA,CAAAC,CAAc,CAAA,CAAIf,GAAa,CAE7E,OACEP,GAAAA,CAACuB,IAAAA,CAAA,CACC,kBAAA,CAAmBL,EAA4B,CAAA,EAAGG,CAAiB,CAAA,CAAA,EAAIC,CAAa,CAAA,CAAA,CAAzDD,CAAAA,CAC3B,eAAc,CAAA,CAAQH,CAAAA,CACtB,EAAA,CAAIC,CAAAA,CACJ,GAAA,CAAKpB,CAAAA,CACJ,GAAGD,CAAAA,CACN,CAEJ,CACF,EACAsB,CAAAA,CAAY,WAAA,CAAc,cAE1B,IAAMI,CAAAA,CAAwB,CAAA,CAAA,UAAA,CAC5B,CAAC,CAAE,SAAA,CAAA3B,EAAW,GAAGC,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CAChC,GAAM,CAAE,iBAAA,CAAAsB,GAAkB,CAAA,CAAId,CAAAA,EAAa,CAE3C,OACEP,IAAC,GAAA,CAAA,CAAE,SAAA,CAAWC,CAAAA,CAAG,qCAAA,CAAuCJ,CAAS,CAAA,CAAG,GAAIwB,GAAAA,CAAmB,GAAA,CAAKtB,CAAAA,CAAM,GAAGD,CAAAA,CAAO,CAEpH,CACF,EACA0B,CAAAA,CAAgB,WAAA,CAAc,iBAAA,CAc9B,IAAMC,CAAAA,CAAoB,aACxB,CAAC,CAAE,SAAA,CAAA5B,CAAAA,CAAW,QAAA,CAAA6B,CAAAA,CAAU,GAAG5B,CAAM,CAAA,CAAGC,GAAAA,GAAQ,CAC1C,GAAM,CAAE,MAAAmB,CAAAA,CAAO,aAAA,CAAAI,CAAc,CAAA,CAAIf,CAAAA,EAAa,CAC1CoB,EAAOD,CAAAA,CAGX,GAAIR,CAAAA,CAAO,CACT,IAAMU,CAAAA,CAAWV,EAGbU,CAAAA,CAAS,OAAA,CACXD,CAAAA,CAAOC,CAAAA,CAAS,OAAA,CAGTA,CAAAA,CAAS,OAAO,OAAA,CACvBD,CAAAA,CAAOC,CAAAA,CAAS,KAAA,CAAM,OAAA,CAGfA,CAAAA,CAAS,OAAO,OAAA,EAAWA,CAAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAS,CAAA,CAClED,EAAOC,CAAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAGxBA,CAAAA,CAAS,OAAO,UAAA,EAAY,MAAA,EAAUA,CAAAA,CAAS,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,OAAS,CAAA,GACvFD,CAAAA,CAAOC,CAAAA,CAAS,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,EAE/C,CAOA,OAAKD,CAAAA,CAKH3B,GAAAA,CAAC,KACC,SAAA,CAAWC,CAAAA,CAAG,+CAAA,CAAiDJ,CAAS,CAAA,CACxE,EAAA,CAAIyB,EACJ,GAAA,CAAKvB,GAAAA,CACJ,GAAGD,CAAAA,CAEH,QAAA,CAAA6B,CAAAA,CACH,EAXO,IAaX,CACF,EACAF,CAAAA,CAAY,WAAA,CAAc,aAAA","file":"chunk-OTQ3BR2A.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from 'src/ui/lib/utils';\n\nconst labelVariants = cva(\n 'fk-w-fit fk-text-sm fk-font-medium fk-leading-none peer-disabled:fk-cursor-not-allowed peer-disabled:fk-opacity-70'\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root className={cn(labelVariants(), className)} ref={ref} {...props} />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from 'react';\nimport type * as LabelPrimitive from '@radix-ui/react-label';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Controller, FormProvider, useFormContext } from 'react-hook-form';\nimport type { ControllerProps, FieldPath, FieldError, FieldValues } from 'react-hook-form';\nimport { cn } from 'src/ui/lib/utils';\nimport { Label } from 'src/ui/primitives/label';\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);\n\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ ...props }: ControllerProps<TFieldValues, TName>): JSX.Element {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n}\n\ntype FormFieldState = {\n invalid: boolean;\n isDirty: boolean;\n isTouched: boolean;\n error?: FieldError | undefined;\n id: string;\n name: string;\n formItemId: string;\n formDescriptionId: string;\n formMessageId: string;\n};\n\nconst useFormField = (): FormFieldState => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const { getFieldState, formState } = useFormContext();\n\n const fieldState = getFieldState(fieldContext.name, formState);\n\n if (!fieldContext.name) {\n throw new Error('useFormField should be used within <FormField>');\n }\n\n const { id } = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);\n\nconst FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div className={cn('fk-flex fk-flex-col fk-space-y-2', className)} ref={ref} {...props} />\n </FormItemContext.Provider>\n );\n }\n);\nFormItem.displayName = 'FormItem';\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField();\n\n return <Label className={cn(error && 'fk-text-destructive', className)} htmlFor={formItemId} ref={ref} {...props} />;\n});\nFormLabel.displayName = 'FormLabel';\n\nconst FormControl = React.forwardRef<React.ElementRef<typeof Slot>, React.ComponentPropsWithoutRef<typeof Slot>>(\n ({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField();\n\n return (\n <Slot\n aria-describedby={!error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={Boolean(error)}\n id={formItemId}\n ref={ref}\n {...props}\n />\n );\n }\n);\nFormControl.displayName = 'FormControl';\n\nconst FormDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField();\n\n return (\n <p className={cn('fk-text-xs fk-text-muted-foreground', className)} id={formDescriptionId} ref={ref} {...props} />\n );\n }\n);\nFormDescription.displayName = 'FormDescription';\n\ninterface NestedError extends Record<string, any> {\n message?: string;\n value?: {\n message?: string;\n _errors?: string[];\n validation?: {\n errors?: Array<{ message: string }>;\n };\n };\n type?: string;\n}\n\nconst FormMessage = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField();\n let body = children;\n\n // Improved error message extraction\n if (error) {\n const errorObj = error as unknown as NestedError;\n\n // Check for direct message\n if (errorObj.message) {\n body = errorObj.message;\n }\n // Check for value.message\n else if (errorObj.value?.message) {\n body = errorObj.value.message;\n }\n // Check for nested value._errors (Zod array pattern)\n else if (errorObj.value?._errors && errorObj.value._errors.length > 0) {\n body = errorObj.value._errors[0];\n }\n // Try to extract from validation.errors (Zod pattern)\n else if (errorObj.value?.validation?.errors && errorObj.value.validation.errors.length > 0) {\n body = errorObj.value.validation.errors[0].message;\n }\n }\n\n // Log error for debugging\n if (error && !body && process.env.NODE_ENV !== 'production') {\n console.warn('FormMessage: Could not extract error message from', error);\n }\n\n if (!body) {\n return null;\n }\n\n return (\n <p\n className={cn('fk-text-sm fk-font-medium fk-text-destructive', className)}\n id={formMessageId}\n ref={ref}\n {...props}\n >\n {body}\n </p>\n );\n }\n);\nFormMessage.displayName = 'FormMessage';\n\nexport { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField };\n"]}
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as Switch}from'./chunk-OOYWOWHR.js';import'./chunk-AYKEFG4H.js';import'./chunk-OTQ3BR2A.js';import'./chunk-AXB7FQV2.js';//# sourceMappingURL=switch-FU7XZ34K.js.map
2
- //# sourceMappingURL=switch-FU7XZ34K.js.map
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as Text}from'./chunk-2WWU4XFO.js';import'./chunk-OX6FVDUT.js';import'./chunk-AYKEFG4H.js';import'./chunk-OTQ3BR2A.js';import'./chunk-AXB7FQV2.js';//# sourceMappingURL=text-DFG6LLN6.js.map
2
- //# sourceMappingURL=text-DFG6LLN6.js.map
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as Textarea}from'./chunk-HIMN6EYJ.js';import'./chunk-AYKEFG4H.js';import'./chunk-OTQ3BR2A.js';import'./chunk-AXB7FQV2.js';//# sourceMappingURL=textarea-XFHA5IEI.js.map
2
- //# sourceMappingURL=textarea-XFHA5IEI.js.map
@@ -1,2 +0,0 @@
1
- import'./index.css';import {b}from'./chunk-NJN7EGGK.js';import {a,b as b$2,c as c$1}from'./chunk-K5CEPNVI.js';import {r,c,d,b as b$1,k,o,p,m,l,q}from'./chunk-64KAF6GA.js';import'./chunk-7YBJLUUE.js';import'./chunk-AXB7FQV2.js';import {useTheme}from'next-themes';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';function _({projectId:g}){let{theme:r$1,setTheme:t}=useTheme(),[D,n]=b();return D?jsx(r,{className:"fk-h-8 fk-w-8 fk-rounded-full"}):jsxs(c,{children:[jsx(d,{asChild:true,children:jsx(b$1,{className:"fk-relative fk-h-8 fk-w-8 fk-rounded-full",variant:"ghost",children:jsxs(a,{className:"fk-h-8 fk-w-8",children:[jsx(b$2,{alt:"@shadcn",src:n.user?.avatar_url}),jsx(c$1,{children:n.user?.display_name.charAt(0).toUpperCase()??""})]})})}),jsxs(k,{align:"end",className:"fk-w-56",forceMount:true,children:[jsx(o,{className:"font-normal",children:jsxs("div",{className:"fk-flex fk-flex-col fk-space-y-1",children:[jsx("p",{className:"fk-text-sm fk-font-medium fk-leading-none",children:n.user?.display_name}),jsx("p",{className:"fk-text-xs fk-leading-none fk-text-muted-foreground",children:n.user?.email})]})}),jsx(p,{}),jsx(o,{children:"Theme"}),jsxs(m,{checked:r$1==="system",onCheckedChange:()=>{t("system");},children:[jsx(Monitor,{className:"fk-mr-2 fk-h-4 fk-w-4"}),jsx("span",{children:"System"})]}),jsxs(m,{checked:r$1==="dark",onCheckedChange:()=>{t("dark");},children:[jsx(Moon,{className:"fk-mr-2 fk-h-4 fk-w-4"}),jsx("span",{children:"Dark"})]}),jsxs(m,{checked:r$1==="light",onCheckedChange:()=>{t("light");},children:[jsx(Sun,{className:"fk-mr-2 fk-h-4 fk-w-4"}),jsx("span",{children:"Light"})]}),jsx(p,{}),jsxs(l,{onClick:()=>{n.logout(g).then(()=>{}).catch(()=>{});},children:["Log out",jsx(q,{children:"\u21E7\u2318Q"})]})]})]})}export{_ as UserNav};//# sourceMappingURL=user-nav-5LW5USDZ.js.map
2
- //# sourceMappingURL=user-nav-5LW5USDZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"2VAqBO,SAASA,CAAAA,CAAQ,CAAE,SAAA,CAAAC,CAAU,CAAA,CAAuB,CACzD,GAAM,CAAE,KAAA,CAAAC,GAAAA,CAAO,QAAA,CAAAC,CAAS,CAAA,CAAIC,QAAAA,EAAS,CAC/B,CAACC,CAAAA,CAAWC,CAAI,CAAA,CAAIC,CAAAA,EAAQ,CAElC,OAAIF,CAAAA,CACKG,GAAAA,CAACC,CAAAA,CAAA,CAAS,SAAA,CAAU,+BAAA,CAAgC,CAAA,CAI3DC,IAAAA,CAACC,CAAAA,CAAA,CACC,QAAA,CAAA,CAAAH,GAAAA,CAACI,CAAAA,CAAA,CAAoB,OAAA,CAAO,IAAA,CAC1B,QAAA,CAAAJ,GAAAA,CAACK,GAAAA,CAAA,CAAO,SAAA,CAAU,2CAAA,CAA4C,OAAA,CAAQ,OAAA,CACpE,QAAA,CAAAH,IAAAA,CAACI,CAAAA,CAAA,CAAO,SAAA,CAAU,eAAA,CAChB,QAAA,CAAA,CAAAN,GAAAA,CAACO,GAAAA,CAAA,CAAY,GAAA,CAAI,SAAA,CAAU,GAAA,CAAKT,CAAAA,CAAK,IAAA,EAAM,UAAA,CAAY,CAAA,CACvDE,GAAAA,CAACQ,GAAAA,CAAA,CAAgB,QAAA,CAAAV,CAAAA,CAAK,IAAA,EAAM,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,EAAK,EAAA,CAAG,CAAA,CAAA,CACzE,CAAA,CACF,CAAA,CACF,CAAA,CACAI,IAAAA,CAACO,CAAAA,CAAA,CAAoB,KAAA,CAAM,KAAA,CAAM,SAAA,CAAU,SAAA,CAAU,UAAA,CAAU,IAAA,CAC7D,QAAA,CAAA,CAAAT,GAAAA,CAACU,CAAAA,CAAA,CAAkB,SAAA,CAAU,aAAA,CAC3B,QAAA,CAAAR,IAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kCAAA,CACb,QAAA,CAAA,CAAAF,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,2CAAA,CAA6C,QAAA,CAAAF,CAAAA,CAAK,MAAM,YAAA,CAAa,CAAA,CAClFE,GAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,qDAAA,CAAuD,QAAA,CAAAF,CAAAA,CAAK,IAAA,EAAM,KAAA,CAAM,CAAA,CAAA,CACvF,CAAA,CACF,CAAA,CACAE,GAAAA,CAACW,CAAAA,CAAA,EAAsB,CAAA,CACvBX,GAAAA,CAACU,CAAAA,CAAA,CAAkB,QAAA,CAAA,OAAA,CAAK,CAAA,CACxBR,IAAAA,CAACU,CAAAA,CAAA,CACC,OAAA,CAASlB,GAAAA,GAAU,QAAA,CACnB,eAAA,CAAiB,IAAM,CACrBC,CAAAA,CAAS,QAAQ,EACnB,CAAA,CAEA,QAAA,CAAA,CAAAK,GAAAA,CAACa,OAAAA,CAAA,CAAQ,SAAA,CAAU,uBAAA,CAAwB,CAAA,CAC3Cb,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,QAAA,CAAM,CAAA,CAAA,CACd,CAAA,CACAE,IAAAA,CAACU,CAAAA,CAAA,CACC,OAAA,CAASlB,GAAAA,GAAU,MAAA,CACnB,eAAA,CAAiB,IAAM,CACrBC,CAAAA,CAAS,MAAM,EACjB,CAAA,CAEA,QAAA,CAAA,CAAAK,GAAAA,CAACc,IAAAA,CAAA,CAAK,UAAU,uBAAA,CAAwB,CAAA,CACxCd,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,MAAA,CAAI,CAAA,CAAA,CACZ,CAAA,CACAE,IAAAA,CAACU,CAAAA,CAAA,CACC,OAAA,CAASlB,GAAAA,GAAU,OAAA,CACnB,eAAA,CAAiB,IAAM,CACrBC,CAAAA,CAAS,OAAO,EAClB,CAAA,CAEA,QAAA,CAAA,CAAAK,GAAAA,CAACe,GAAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CAAwB,CAAA,CACvCf,GAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,OAAA,CAAK,CAAA,CAAA,CACb,CAAA,CACAA,GAAAA,CAACW,CAAAA,CAAA,EAAsB,CAAA,CACvBT,IAAAA,CAACc,CAAAA,CAAA,CACC,OAAA,CAAS,IAAM,CACblB,CAAAA,CACG,MAAA,CAAOL,CAAS,CAAA,CAChB,IAAA,CAAK,IAAM,CAEZ,CAAC,CAAA,CACA,KAAA,CAAM,IAAM,CAEb,CAAC,EACL,CAAA,CACD,QAAA,CAAA,CAAA,SAAA,CAECO,GAAAA,CAACiB,CAAAA,CAAA,CAAqB,QAAA,CAAA,eAAA,CAAG,CAAA,CAAA,CAC3B,CAAA,CAAA,CACF,GACF,CAEJ","file":"user-nav-5LW5USDZ.js","sourcesContent":["import { useTheme } from 'next-themes';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk-h-8 fk-w-8 fk-rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk-relative fk-h-8 fk-w-8 fk-rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk-h-8 fk-w-8\">\n <AvatarImage alt=\"@shadcn\" src={auth.user?.avatar_url} />\n <AvatarFallback>{auth.user?.display_name.charAt(0).toUpperCase() ?? ''}</AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk-w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk-flex fk-flex-col fk-space-y-1\">\n <p className=\"fk-text-sm fk-font-medium fk-leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk-text-xs fk-leading-none fk-text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk-mr-2 fk-h-4 fk-w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk-mr-2 fk-h-4 fk-w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk-mr-2 fk-h-4 fk-w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}