@flexkit/studio 0.0.15 → 0.0.17

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 (44) 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-HIMN6EYJ.js → chunk-L4ER5RUF.js} +2 -2
  5. package/dist/{chunk-HIMN6EYJ.js.map → chunk-L4ER5RUF.js.map} +1 -1
  6. package/dist/chunk-PHGUSZ22.js +2 -0
  7. package/dist/{chunk-2WWU4XFO.js.map → chunk-PHGUSZ22.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-XQO4VSS3.js +2 -0
  24. package/dist/{text-DFG6LLN6.js.map → text-XQO4VSS3.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 +4 -7
  33. package/dist/asset-65455B7V.js +0 -2
  34. package/dist/chunk-2WWU4XFO.js +0 -2
  35. package/dist/chunk-D5N42D57.js +0 -2
  36. package/dist/chunk-D5N42D57.js.map +0 -1
  37. package/dist/chunk-NJN7EGGK.js +0 -2
  38. package/dist/chunk-NJN7EGGK.js.map +0 -1
  39. package/dist/chunk-OTQ3BR2A.js.map +0 -1
  40. package/dist/switch-FU7XZ34K.js +0 -2
  41. package/dist/text-DFG6LLN6.js +0 -2
  42. package/dist/textarea-XFHA5IEI.js +0 -2
  43. package/dist/user-nav-5LW5USDZ.js +0 -2
  44. package/dist/user-nav-5LW5USDZ.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexkit/studio",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "Flexkit Studio - Build custom internal tools like PIMs, CRMs, and ERPs with a flexible React UI and a graph-backed API",
5
5
  "keywords": [
6
6
  "flexkit",
@@ -62,8 +62,6 @@
62
62
  "@types/ramda": "^0.29.7",
63
63
  "@types/react": "^18.2.0",
64
64
  "@types/react-dom": "^18.2.0",
65
- "@types/react-file-icon": "1.0.4",
66
- "@types/react-router-dom": "^5.3.3",
67
65
  "@types/uuid": "^9.0.6",
68
66
  "autoprefixer": "^10.4.16",
69
67
  "postcss": "^8.4.31",
@@ -74,8 +72,8 @@
74
72
  "tsup": "8.5.1",
75
73
  "typescript": "^5.3.3",
76
74
  "eslint-config-custom": "0.0.0",
77
- "tailwind-config": "0.0.1",
78
- "tsconfig": "0.0.0"
75
+ "tsconfig": "0.0.0",
76
+ "tailwind-config": "0.0.1"
79
77
  },
80
78
  "dependencies": {
81
79
  "@ai-sdk/react": "3.0.118",
@@ -125,7 +123,6 @@
125
123
  "lexical": "^0.12.2",
126
124
  "lowlight": "3.1.0",
127
125
  "lucide-react": "0.577.0",
128
- "next-themes": "^0.2.1",
129
126
  "novel": "1.0.2",
130
127
  "ramda": "^0.29.1",
131
128
  "react-day-picker": "^9.7.0",
@@ -163,7 +160,7 @@
163
160
  },
164
161
  "scripts": {
165
162
  "build": "tailwindcss -i ./src/styles.css -o dist/index.css && tsup --config tsup.config.ts && tsup src/nextjs.ts src/astro.ts src/tanstack-start.ts --format esm --dts --external react --external react-dom --no-config",
166
- "dev": "tailwindcss -i ./src/styles.css -o ./dist/index.css --watch & tsup --config tsup.config.ts --watch & tsup src/nextjs.ts src/astro.ts src/tanstack-start.ts --format esm --dts --external react --external react-dom --no-config --watch",
163
+ "dev": "tailwindcss -i ./src/styles.css -o ./dist/index.css --watch=always & tsup --config tsup.config.ts --watch & tsup src/nextjs.ts src/astro.ts src/tanstack-start.ts --format esm --dts --external react --external react-dom --no-config --watch",
167
164
  "lint": "eslint \"src/**/*.ts*\"",
168
165
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
169
166
  "ui:add": "pnpm dlx shadcn@latest add"
@@ -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}from'./chunk-OX6FVDUT.js';import {b}from'./chunk-AYKEFG4H.js';import {c,e,f,h,g,i}from'./chunk-OTQ3BR2A.js';import {useId}from'react';import {jsx,jsxs}from'react/jsx-runtime';function L({control:v,fieldSchema:f$1,setValue:r}){let{name:l,label:b$1,isEditable:h$1,options:t}=f$1,m=useId();function g$1(e,o){r(l,{...o,value:e.currentTarget.value});}function C(e,o){r(l,{...o,disabled:e});}return jsx(c,{control:v,name:l,render:({field:e$1})=>jsxs(e,{children:[jsx(f,{htmlFor:m,children:b$1}),t.comment?jsx(h,{children:t.comment}):null,jsx(g,{children:jsx(a,{className:`fk-w-full fk-mt-[0.1875rem] ${!e$1.value?.scope||e$1.value.scope==="default"?"fk-mb-3":""}`,disabled:h$1===false||e$1.value?.disabled,id:m,...e$1,onChange:o=>{g$1(o,e$1.value);},value:e$1.value?.value||""})}),jsx(b,{checked:e$1.value?.disabled??false,onChange:o=>{C(o,e$1.value);},scope:e$1.value?.scope}),jsx(i,{})]})})}export{L as a};//# sourceMappingURL=chunk-2WWU4XFO.js.map
2
- //# sourceMappingURL=chunk-2WWU4XFO.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":"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","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":"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","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"]}