@flexkit/studio 0.0.14 → 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 (54) 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-HC5NUUAJ.js → chunk-6PYMDKS6.js} +2 -2
  5. package/dist/chunk-6PYMDKS6.js.map +1 -0
  6. package/dist/{chunk-2WWU4XFO.js → chunk-GLDDBGSW.js} +2 -2
  7. package/dist/{chunk-2WWU4XFO.js.map → chunk-GLDDBGSW.js.map} +1 -1
  8. package/dist/{chunk-HIMN6EYJ.js → chunk-L4ER5RUF.js} +2 -2
  9. package/dist/{chunk-HIMN6EYJ.js.map → chunk-L4ER5RUF.js.map} +1 -1
  10. package/dist/{chunk-TL6JXN6O.js → chunk-QOSBN65B.js} +23 -3
  11. package/dist/{chunk-OTQ3BR2A.js → chunk-SPWSXOXS.js} +2 -2
  12. package/dist/chunk-SPWSXOXS.js.map +1 -0
  13. package/dist/{chunk-OOYWOWHR.js → chunk-TEKVBWRU.js} +2 -2
  14. package/dist/{chunk-OOYWOWHR.js.map → chunk-TEKVBWRU.js.map} +1 -1
  15. package/dist/chunk-WA4EGOM4.js +2 -0
  16. package/dist/chunk-WA4EGOM4.js.map +1 -0
  17. package/dist/chunk-WB6HSMJT.js +2 -0
  18. package/dist/chunk-WB6HSMJT.js.map +1 -0
  19. package/dist/editor-F72NJQ25.js +2 -0
  20. package/dist/{editor-ZLTDOUPT.js.map → editor-F72NJQ25.js.map} +1 -1
  21. package/dist/icons.d.ts +1 -0
  22. package/dist/icons.js +2 -0
  23. package/dist/icons.js.map +1 -0
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.js +62 -62
  26. package/dist/index.js.map +1 -1
  27. package/dist/nextjs.js +1 -1
  28. package/dist/switch-HXXPL3GZ.js +2 -0
  29. package/dist/{switch-FU7XZ34K.js.map → switch-HXXPL3GZ.js.map} +1 -1
  30. package/dist/tanstack-start.js +1 -1
  31. package/dist/text-V5OWHWTK.js +2 -0
  32. package/dist/{text-DFG6LLN6.js.map → text-V5OWHWTK.js.map} +1 -1
  33. package/dist/textarea-JDQEV6HE.js +2 -0
  34. package/dist/{textarea-XFHA5IEI.js.map → textarea-JDQEV6HE.js.map} +1 -1
  35. package/dist/{types.d-CH6seXQw.d.ts → types.d-D7S0yibv.d.ts} +2 -2
  36. package/dist/ui.d.ts +4 -21
  37. package/dist/ui.js +1 -1
  38. package/dist/ui.js.map +1 -1
  39. package/dist/user-nav-7U3KULA6.js +2 -0
  40. package/dist/user-nav-7U3KULA6.js.map +1 -0
  41. package/package.json +8 -7
  42. package/dist/asset-65455B7V.js +0 -2
  43. package/dist/chunk-D5N42D57.js +0 -2
  44. package/dist/chunk-D5N42D57.js.map +0 -1
  45. package/dist/chunk-HC5NUUAJ.js.map +0 -1
  46. package/dist/chunk-NJN7EGGK.js +0 -2
  47. package/dist/chunk-NJN7EGGK.js.map +0 -1
  48. package/dist/chunk-OTQ3BR2A.js.map +0 -1
  49. package/dist/editor-ZLTDOUPT.js +0 -2
  50. package/dist/switch-FU7XZ34K.js +0 -2
  51. package/dist/text-DFG6LLN6.js +0 -2
  52. package/dist/textarea-XFHA5IEI.js +0 -2
  53. package/dist/user-nav-5LW5USDZ.js +0 -2
  54. 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.14",
3
+ "version": "0.0.16",
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",
@@ -28,6 +28,7 @@
28
28
  "./nextjs": "./dist/nextjs.js",
29
29
  "./astro": "./dist/astro.js",
30
30
  "./tanstack-start": "./dist/tanstack-start.js",
31
+ "./icons": "./dist/icons.js",
31
32
  "./ui": "./dist/ui.js",
32
33
  "./tailwind.config": "./tailwind.config.ts",
33
34
  "./styles.css": "./dist/index.css"
@@ -42,6 +43,9 @@
42
43
  ],
43
44
  "tanstack-start": [
44
45
  "./dist/tanstack-start.d.ts"
46
+ ],
47
+ "icons": [
48
+ "./dist/icons.d.ts"
45
49
  ]
46
50
  }
47
51
  },
@@ -58,8 +62,6 @@
58
62
  "@types/ramda": "^0.29.7",
59
63
  "@types/react": "^18.2.0",
60
64
  "@types/react-dom": "^18.2.0",
61
- "@types/react-file-icon": "1.0.4",
62
- "@types/react-router-dom": "^5.3.3",
63
65
  "@types/uuid": "^9.0.6",
64
66
  "autoprefixer": "^10.4.16",
65
67
  "postcss": "^8.4.31",
@@ -120,8 +122,7 @@
120
122
  "graphql": "^16.8.1",
121
123
  "lexical": "^0.12.2",
122
124
  "lowlight": "3.1.0",
123
- "lucide-react": "0.555.0",
124
- "next-themes": "^0.2.1",
125
+ "lucide-react": "0.577.0",
125
126
  "novel": "1.0.2",
126
127
  "ramda": "^0.29.1",
127
128
  "react-day-picker": "^9.7.0",
@@ -131,7 +132,7 @@
131
132
  "react-resizable-panels": "^3.0.6",
132
133
  "react-router-dom": "^6.21.0",
133
134
  "sonner": "^1.4.3",
134
- "swr": "2.2.5",
135
+ "swr": "^2.4.1",
135
136
  "tailwind-merge": "^2.0.0",
136
137
  "tiptap-markdown": "0.8.10",
137
138
  "use-debounce": "10.0.3",
@@ -159,7 +160,7 @@
159
160
  },
160
161
  "scripts": {
161
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",
162
- "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",
163
164
  "lint": "eslint \"src/**/*.ts*\"",
164
165
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
165
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,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 +0,0 @@
1
- {"version":3,"sources":["../src/form/fields/editor/extensions.ts","../src/data-grid/preview-components/editor.tsx"],"names":["aiHighlight","AIHighlight","placeholder","Placeholder","tiptapLink","TiptapLink","cx","markdownExtension","Markdown","tiptapImage","TiptapImage","UploadImagesPlugin","taskList","TaskList","taskItem","TaskItem","horizontalRule","HorizontalRule","starterKit","StarterKit","codeBlockLowlight","CodeBlockLowlight","createLowlight","common","youtube","Youtube","twitter","Twitter","mathematics","Mathematics","characterCount","CharacterCount","defaultExtensions","TiptapUnderline","HighlightExtension","TextStyle","Color","CustomKeymap","GlobalDragHandle","MAX_LENGTH","Editor","value","textValue","generateText","jsx"],"mappings":"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","file":"chunk-HC5NUUAJ.js","sourcesContent":["import {\n AIHighlight,\n CharacterCount,\n CodeBlockLowlight,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n HighlightExtension,\n HorizontalRule,\n Placeholder,\n StarterKit,\n TaskItem,\n TaskList,\n TextStyle,\n TiptapImage,\n TiptapLink,\n TiptapUnderline,\n Twitter,\n Youtube,\n Mathematics,\n UploadImagesPlugin,\n} from 'novel';\nimport { Extensions } from '@tiptap/core';\nimport { Markdown } from 'tiptap-markdown';\nimport { cx } from 'class-variance-authority';\nimport { common, createLowlight } from 'lowlight';\n\n//TODO I am using cx here to get tailwind autocomplete working, idk if someone else can write a regex to just capture the class key in objects\nconst aiHighlight = AIHighlight;\n//You can overwrite the placeholder with your own configuration\nconst placeholder = Placeholder;\nconst tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n 'class': cx(\n 'fk-text-muted-foreground fk-underline fk-underline-offset-[3px] hover:fk-text-primary fk-transition-colors fk-cursor-pointer'\n ),\n },\n});\n\nconst markdownExtension = Markdown.configure({\n html: true,\n tightLists: true,\n tightListClass: 'tight',\n bulletListMarker: '-',\n linkify: false,\n breaks: false,\n transformPastedText: false,\n transformCopiedText: false,\n});\n\nconst tiptapImage = TiptapImage.extend({\n addProseMirrorPlugins() {\n return [\n UploadImagesPlugin({\n imageClass: cx('fk-opacity-40 fk-rounded-lg fk-border fk-border-stone-200'),\n }),\n ];\n },\n}).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cx('fk-rounded-lg fk-border fk-border-muted'),\n },\n});\n\nconst taskList = TaskList.configure({\n HTMLAttributes: {\n class: cx('fk-not-prose fk-pl-2 '),\n },\n});\nconst taskItem = TaskItem.configure({\n HTMLAttributes: {\n 'class': cx('fk-flex gap-2 fk-items-start fk-my-2'),\n },\n nested: true,\n});\n\nconst horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n 'class': cx('mt-4 mb-6 border-t border-muted-foreground'),\n },\n});\n\nconst starterKit = StarterKit.configure({\n bulletList: {\n HTMLAttributes: {\n 'class': cx('fk-list-disc fk-list-outside fk-leading-3 -fk-mt-2'),\n },\n },\n orderedList: {\n HTMLAttributes: {\n 'class': cx('fk-list-decimal fk-list-outside fk-leading-3 -fk-mt-2'),\n },\n },\n listItem: {\n HTMLAttributes: {\n 'class': cx('fk-leading-normal -fk-mb-2'),\n },\n },\n blockquote: {\n HTMLAttributes: {\n 'class': cx('fk-border-l-4 fk-border-primary'),\n },\n },\n codeBlock: false,\n code: {\n HTMLAttributes: {\n 'class': cx('fk-rounded-md fk-bg-muted fk-px-1.5 fk-py-1 fk-font-mono fk-font-medium'),\n spellcheck: 'false',\n },\n },\n horizontalRule: false,\n dropcursor: {\n color: '#DBEAFE',\n width: 4,\n },\n gapcursor: false,\n});\n\nconst codeBlockLowlight = CodeBlockLowlight.configure({\n // configure lowlight: common / all / use highlightJS in case there is a need to specify certain language grammars only\n // common: covers 37 language grammars which should be good enough in most cases\n lowlight: createLowlight(common),\n});\n\nconst youtube = Youtube.configure({\n HTMLAttributes: {\n 'class': cx('fk-rounded-lg fk-border fk-border-muted'),\n },\n inline: false,\n});\n\nconst twitter = Twitter.configure({\n HTMLAttributes: {\n 'class': cx('fk-not-prose'),\n },\n inline: false,\n});\n\nconst mathematics = Mathematics.configure({\n HTMLAttributes: {\n 'class': cx('fk-text-foreground fk-rounded fk-p-1 hover:fk-bg-muted fk-cursor-pointer'),\n },\n katexOptions: {\n throwOnError: false,\n },\n});\n\nconst characterCount = CharacterCount.configure();\n\nexport const defaultExtensions: Extensions = [\n starterKit,\n placeholder,\n tiptapLink,\n tiptapImage,\n taskList,\n taskItem,\n horizontalRule,\n aiHighlight,\n codeBlockLowlight,\n youtube,\n twitter,\n mathematics,\n characterCount,\n TiptapUnderline,\n markdownExtension,\n HighlightExtension,\n TextStyle,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n];\n","import { generateText } from '@tiptap/core';\nimport { defaultExtensions } from '../../form/fields/editor/extensions';\n\nconst MAX_LENGTH = 100;\n\n/**\n * Renders a preview of the editor content.\n */\nexport function Editor({ value }: { value: string }) {\n let textValue;\n\n try {\n textValue = generateText(JSON.parse(value), defaultExtensions).substring(0, MAX_LENGTH);\n } catch (e) {\n textValue = value?.substring(0, MAX_LENGTH) ?? '';\n }\n\n return <div className=\"fk-truncate\">{textValue}</div>;\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{b as Editor}from'./chunk-HC5NUUAJ.js';//# sourceMappingURL=editor-ZLTDOUPT.js.map
2
- //# sourceMappingURL=editor-ZLTDOUPT.js.map
@@ -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"]}