@flexkit/studio 0.0.17 → 0.0.19

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 (48) hide show
  1. package/dist/asset-TJGJREGN.js +2 -0
  2. package/dist/{asset-GMXBEENP.js.map → asset-TJGJREGN.js.map} +1 -1
  3. package/dist/astro.js +1 -1
  4. package/dist/chunk-665E4UDZ.js +2 -0
  5. package/dist/chunk-665E4UDZ.js.map +1 -0
  6. package/dist/chunk-6TSWBOSZ.js +2 -0
  7. package/dist/{chunk-5MTVN77Y.js.map → chunk-6TSWBOSZ.js.map} +1 -1
  8. package/dist/chunk-7TF7ZVID.js +2 -0
  9. package/dist/chunk-7TF7ZVID.js.map +1 -0
  10. package/dist/chunk-EELTSHST.js +2 -0
  11. package/dist/chunk-EELTSHST.js.map +1 -0
  12. package/dist/{chunk-QOSBN65B.js → chunk-NZI5JL7Y.js} +26 -1
  13. package/dist/chunk-R4MPNNRN.js +2 -0
  14. package/dist/chunk-R4MPNNRN.js.map +1 -0
  15. package/dist/chunk-TMK5LKFR.js +3 -0
  16. package/dist/chunk-TMK5LKFR.js.map +1 -0
  17. package/dist/chunk-WIUPQHZ5.js +2 -0
  18. package/dist/chunk-WIUPQHZ5.js.map +1 -0
  19. package/dist/index.css +78 -14
  20. package/dist/index.d.ts +13 -5
  21. package/dist/index.js +191 -145
  22. package/dist/index.js.map +1 -1
  23. package/dist/nextjs.js +1 -1
  24. package/dist/project-selector-FWU4PAAK.js +2 -0
  25. package/dist/project-selector-FWU4PAAK.js.map +1 -0
  26. package/dist/search-IM4OTYLW.js +2 -0
  27. package/dist/{search-JJI6BIRU.js.map → search-IM4OTYLW.js.map} +1 -1
  28. package/dist/tanstack-start.js +1 -1
  29. package/dist/{types.d-D7S0yibv.d.ts → types.d-DLhjvcTC.d.ts} +13 -5
  30. package/dist/ui.d.ts +2 -2
  31. package/dist/ui.js +1 -1
  32. package/dist/user-nav-UHNUTEUZ.js +2 -0
  33. package/dist/{user-nav-7U3KULA6.js.map → user-nav-UHNUTEUZ.js.map} +1 -1
  34. package/package.json +5 -5
  35. package/dist/asset-GMXBEENP.js +0 -2
  36. package/dist/chunk-5MTVN77Y.js +0 -2
  37. package/dist/chunk-7DMOGZE6.js +0 -2
  38. package/dist/chunk-7DMOGZE6.js.map +0 -1
  39. package/dist/chunk-7YBJLUUE.js +0 -3
  40. package/dist/chunk-7YBJLUUE.js.map +0 -1
  41. package/dist/chunk-WA4EGOM4.js +0 -2
  42. package/dist/chunk-WA4EGOM4.js.map +0 -1
  43. package/dist/chunk-WB6HSMJT.js +0 -2
  44. package/dist/chunk-WB6HSMJT.js.map +0 -1
  45. package/dist/project-selector-4G4WL2XQ.js +0 -2
  46. package/dist/project-selector-4G4WL2XQ.js.map +0 -1
  47. package/dist/search-JJI6BIRU.js +0 -2
  48. package/dist/user-nav-7U3KULA6.js +0 -2
@@ -0,0 +1,2 @@
1
+ import'./index.css';export{a as Asset}from'./chunk-R4MPNNRN.js';import'./chunk-RMSYYUQM.js';import'./chunk-TMK5LKFR.js';import'./chunk-WIUPQHZ5.js';import'./chunk-AXB7FQV2.js';//# sourceMappingURL=asset-TJGJREGN.js.map
2
+ //# sourceMappingURL=asset-TJGJREGN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"asset-GMXBEENP.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"asset-TJGJREGN.js"}
package/dist/astro.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  handleFlexkitRequest
3
- } from "./chunk-QOSBN65B.js";
3
+ } from "./chunk-NZI5JL7Y.js";
4
4
 
5
5
  // src/auth/astro-api.ts
6
6
  function resultToResponse(result) {
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {d}from'./chunk-EELTSHST.js';import {c}from'./chunk-TMK5LKFR.js';import {createContext,useState,useCallback,useEffect,useMemo,useContext}from'react';import {jsx}from'react/jsx-runtime';import _ from'swr';import {useParams}from'react-router-dom';var Q=["light","dark"],C="(prefers-color-scheme: dark)",U=createContext(void 0);function W({attribute:e="data-theme",children:r,defaultTheme:t,disableTransitionOnChange:u=false,enableColorScheme:l=true,enableSystem:i=true,forcedTheme:n,storageKey:d="theme",themes:c=Q,value:f}){let[a,k]=useState(()=>J(d,t,i)),[m,w]=useState(()=>O()),v=E(n??a,i,m),P=useCallback(o=>{if(!n&&(k(o),!!h()))try{window.localStorage.setItem(d,o);}catch{}},[n,d]);useEffect(()=>{if(!h()||!i)return;let o=window.matchMedia(C);function g(s){w(s.matches?"dark":"light");}return w(o.matches?"dark":"light"),o.addEventListener("change",g),()=>{o.removeEventListener("change",g);}},[i]),useEffect(()=>{if(!h())return;let o=window.document.documentElement,s=E(n??a??t,i,m);if(!s)return;let b=u?D():void 0,I=f?Object.values(f):c,y=f?.[s]??s;e==="class"&&(o.classList.remove(...I),o.classList.add(y)),e!=="class"&&o.setAttribute(e,y),l&&(s==="dark"||s==="light")&&(o.style.colorScheme=s),b?.();},[e,t,u,l,i,n,m,a,c,f]);let R=useMemo(()=>({forcedTheme:n,resolvedTheme:v,setTheme:P,systemTheme:m,theme:n??a,themes:i?[...c,"system"]:c}),[i,n,v,P,m,a,c]);return jsx(U.Provider,{value:R,children:r})}function Y(){let e=useContext(U);if(!e)throw new Error("useTheme must be used within ThemeProvider");return e}function D(){let e=window.document.createElement("style");return e.appendChild(window.document.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),window.document.head.appendChild(e),()=>{window.getComputedStyle(window.document.body),window.setTimeout(()=>{e.remove();},0);}}function J(e,r,t){if(!h())return r??(t?"system":"light");try{let u=window.localStorage.getItem(e);if(u)return u}catch{}return r??(t?"system":"light")}function O(){if(h())return window.matchMedia(C).matches?"dark":"light"}function h(){return typeof window<"u"}function E(e,r,t){if(e)return e!=="system"?e:r?t??"light":"light"}function T(){let{projectId:e}=useParams(),{projects:r}=d(),t=r.find(n=>n.projectId===e)??r[0],{data:u,isLoading:l}=_(c(e??"").currentUser,n=>fetch(n,{mode:"cors",credentials:"include"}).then(d=>d.json()));return [l,{user:u,logout:async()=>{await fetch(c(e??"").logout(t?.basePath??"/"),{method:"POST",mode:"cors",credentials:"include"}),await fetch("/api/flexkit/logout",{method:"GET",credentials:"include"}),window.location.reload();}}]}var L=createContext([true,{user:null,logout:()=>Promise.resolve()}]);function ie({children:e}){let[r,t]=T();return jsx(L.Provider,{value:[r,t],children:e})}function se(){return useContext(L)}export{W as a,Y as b,ie as c,se as d};//# sourceMappingURL=chunk-665E4UDZ.js.map
2
+ //# sourceMappingURL=chunk-665E4UDZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/theme-context.tsx","../src/auth/use-auth-service.ts","../src/auth/auth-context.tsx"],"names":["DEFAULT_THEMES","MEDIA_QUERY","ThemeContext","createContext","ThemeProvider","attribute","children","defaultTheme","disableTransitionOnChange","enableColorScheme","enableSystem","forcedTheme","storageKey","themes","value","theme","setThemeState","useState","getInitialTheme","systemTheme","setSystemTheme","getSystemTheme","resolvedTheme","resolveTheme","setTheme","useCallback","nextTheme","isBrowser","useEffect","mediaQuery","handleChange","event","root","nextResolvedTheme","cleanupTransitions","disableTransitions","themeValues","attributeValue","context","useMemo","jsx","useTheme","useContext","style","storedTheme","useAuthService","projectId","useParams","projects","useConfig","currentProject","project","user","isLoadingUser","useSWR","apiPaths","url","res","AuthContext","AuthProvider","isLoading","auth","useAuth"],"mappings":"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","file":"chunk-665E4UDZ.js","sourcesContent":["'use client';\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\ntype SystemTheme = 'dark' | 'light';\n\ninterface ThemeValue {\n [themeName: string]: string;\n}\n\nexport interface UseThemeProps {\n themes: string[];\n forcedTheme?: string;\n setTheme: (theme: string) => void;\n theme?: string;\n resolvedTheme?: string;\n systemTheme?: SystemTheme;\n}\n\nexport interface ThemeProviderProps {\n themes?: string[];\n forcedTheme?: string;\n enableSystem?: boolean;\n disableTransitionOnChange?: boolean;\n enableColorScheme?: boolean;\n storageKey?: string;\n defaultTheme?: string;\n attribute?: string | 'class';\n value?: ThemeValue;\n children?: React.ReactNode;\n}\n\nconst DEFAULT_THEMES = ['light', 'dark'];\nconst MEDIA_QUERY = '(prefers-color-scheme: dark)';\nconst ThemeContext = createContext<UseThemeProps | undefined>(undefined);\n\nexport function ThemeProvider({\n attribute = 'data-theme',\n children,\n defaultTheme,\n disableTransitionOnChange = false,\n enableColorScheme = true,\n enableSystem = true,\n forcedTheme,\n storageKey = 'theme',\n themes = DEFAULT_THEMES,\n value,\n}: ThemeProviderProps): JSX.Element {\n const [theme, setThemeState] = useState<string | undefined>(() => getInitialTheme(storageKey, defaultTheme, enableSystem));\n const [systemTheme, setSystemTheme] = useState<SystemTheme | undefined>(() => getSystemTheme());\n const resolvedTheme = resolveTheme(forcedTheme ?? theme, enableSystem, systemTheme);\n\n const setTheme = useCallback(\n (nextTheme: string) => {\n if (forcedTheme) {\n return;\n }\n\n setThemeState(nextTheme);\n\n if (!isBrowser()) {\n return;\n }\n\n try {\n window.localStorage.setItem(storageKey, nextTheme);\n } catch {\n //\n }\n },\n [forcedTheme, storageKey]\n );\n\n useEffect(() => {\n if (!isBrowser() || !enableSystem) {\n return;\n }\n\n const mediaQuery = window.matchMedia(MEDIA_QUERY);\n\n function handleChange(event: MediaQueryListEvent): void {\n setSystemTheme(event.matches ? 'dark' : 'light');\n }\n\n setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, [enableSystem]);\n\n useEffect(() => {\n if (!isBrowser()) {\n return;\n }\n\n const root = window.document.documentElement;\n const selectedTheme = forcedTheme ?? theme ?? defaultTheme;\n const nextResolvedTheme = resolveTheme(selectedTheme, enableSystem, systemTheme);\n\n if (!nextResolvedTheme) {\n return;\n }\n\n const cleanupTransitions = disableTransitionOnChange ? disableTransitions() : undefined;\n const themeValues = value ? Object.values(value) : themes;\n const attributeValue = value?.[nextResolvedTheme] ?? nextResolvedTheme;\n\n if (attribute === 'class') {\n root.classList.remove(...themeValues);\n root.classList.add(attributeValue);\n }\n\n if (attribute !== 'class') {\n root.setAttribute(attribute, attributeValue);\n }\n\n if (enableColorScheme && (nextResolvedTheme === 'dark' || nextResolvedTheme === 'light')) {\n root.style.colorScheme = nextResolvedTheme;\n }\n\n cleanupTransitions?.();\n }, [\n attribute,\n defaultTheme,\n disableTransitionOnChange,\n enableColorScheme,\n enableSystem,\n forcedTheme,\n systemTheme,\n theme,\n themes,\n value,\n ]);\n\n const context = useMemo<UseThemeProps>(() => {\n return {\n forcedTheme,\n resolvedTheme,\n setTheme,\n systemTheme,\n theme: forcedTheme ?? theme,\n themes: enableSystem ? [...themes, 'system'] : themes,\n };\n }, [enableSystem, forcedTheme, resolvedTheme, setTheme, systemTheme, theme, themes]);\n\n return <ThemeContext.Provider value={context}>{children}</ThemeContext.Provider>;\n}\n\nexport function useTheme(): UseThemeProps {\n const context = useContext(ThemeContext);\n\n if (!context) {\n throw new Error('useTheme must be used within ThemeProvider');\n }\n\n return context;\n}\n\nfunction disableTransitions(): () => void {\n const style = window.document.createElement('style');\n style.appendChild(\n window.document.createTextNode(\n '*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}'\n )\n );\n window.document.head.appendChild(style);\n\n return () => {\n window.getComputedStyle(window.document.body);\n\n window.setTimeout(() => {\n style.remove();\n }, 0);\n };\n}\n\nfunction getInitialTheme(storageKey: string, defaultTheme: string | undefined, enableSystem: boolean): string {\n if (!isBrowser()) {\n return defaultTheme ?? (enableSystem ? 'system' : 'light');\n }\n\n try {\n const storedTheme = window.localStorage.getItem(storageKey);\n\n if (storedTheme) {\n return storedTheme;\n }\n } catch {\n //\n }\n\n return defaultTheme ?? (enableSystem ? 'system' : 'light');\n}\n\nfunction getSystemTheme(): SystemTheme | undefined {\n if (!isBrowser()) {\n return undefined;\n }\n\n return window.matchMedia(MEDIA_QUERY).matches ? 'dark' : 'light';\n}\n\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined';\n}\n\nfunction resolveTheme(\n theme: string | undefined,\n enableSystem: boolean,\n systemTheme: SystemTheme | undefined\n): string | undefined {\n if (!theme) {\n return undefined;\n }\n\n if (theme !== 'system') {\n return theme;\n }\n\n if (!enableSystem) {\n return 'light';\n }\n\n return systemTheme ?? 'light';\n}\n","'use client';\n\nimport useSWR from 'swr';\nimport { useParams } from 'react-router-dom';\nimport { apiPaths } from '../core/api-paths';\nimport { useConfig } from '../core/config/config-context';\nimport type { AuthService, User } from './types';\n\nexport default function useAuthService(): AuthService {\n const { projectId } = useParams();\n const { projects } = useConfig();\n const currentProject = projects.find((project) => project.projectId === projectId) ?? projects[0];\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(currentProject?.basePath ?? '/'), {\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"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a}from'./chunk-AXB7FQV2.js';import*as f from'react';import*as c from'@radix-ui/react-toggle';import {cva}from'class-variance-authority';import {jsx}from'react/jsx-runtime';import*as s from'@radix-ui/react-toggle-group';import*as k from'@radix-ui/react-separator';var p=cva("fk-inline-flex fk-items-center fk-justify-center fk-rounded-md fk-text-sm fk-font-medium fk-ring-offset-background fk-transition-colors hover:fk-bg-muted hover:fk-text-muted-foreground focus-visible:fk-outline-none focus-visible:fk-ring-2 focus-visible:fk-ring-ring focus-visible:fk-ring-offset-2 disabled:fk-pointer-events-none disabled:fk-opacity-50 data-[state=on]:fk-bg-accent data-[state=on]:fk-text-accent-foreground",{variants:{variant:{default:"fk-bg-transparent",outline:"fk-border fk-border-input fk-bg-transparent hover:fk-bg-accent hover:fk-text-accent-foreground"},size:{default:"fk-h-10 fk-px-3",sm:"fk-h-9 fk-px-2.5",lg:"fk-h-11 fk-px-5"}},defaultVariants:{variant:"default",size:"default"}}),v=f.forwardRef(({className:t,variant:e,size:o,...r},l)=>jsx(c.Root,{className:a(p({variant:e,size:o,className:t})),ref:l,...r}));v.displayName=c.Root.displayName;var T=f.createContext({size:"default",variant:"default"}),P=f.forwardRef(({className:t,variant:e,size:o,children:r,...l},m)=>jsx(s.Root,{className:a("fk-flex fk-items-center fk-justify-center fk-gap-1",t),ref:m,...l,children:jsx(T.Provider,{value:{variant:e,size:o},children:r})}));P.displayName=s.Root.displayName;var N=f.forwardRef(({className:t,children:e,variant:o,size:r,...l},m)=>{let b=f.useContext(T);return jsx(s.Item,{className:a(p({variant:b.variant||o,size:b.size||r}),t),ref:m,...l,children:e})});N.displayName=s.Item.displayName;var h=f.forwardRef(({className:t,orientation:e="horizontal",decorative:o=true,...r},l)=>jsx(k.Root,{className:a("fk-shrink-0 fk-bg-border",e==="horizontal"?"fk-h-[1px] fk-w-full":"fk-h-full fk-w-[1px]",t),decorative:o,orientation:e,ref:l,...r}));h.displayName=k.Root.displayName;var x=f.forwardRef(({className:t,onScroll:e,...o},r)=>jsx("div",{className:"fk-relative fk-h-full fk-w-full fk-overflow-auto fk-rounded-md fk-border-border fk-border",onScroll:e,ref:r,children:jsx("table",{className:a("fk-w-full fk-caption-bottom fk-text-sm",t),...o})}));x.displayName="Table";var L=f.forwardRef(({className:t,...e},o)=>jsx("thead",{className:a("fk-sticky fk-z-[1] fk-top-0 fk-bg-background/90 fk-backdrop-blur-[1px] [&_tr]:fk-border-border [&_tr]:fk-border-b",t),ref:o,...e}));L.displayName="TableHeader";var M=f.forwardRef(({className:t,...e},o)=>jsx("tbody",{className:a("[&_tr:last-child]:fk-border-0",t),ref:o,...e}));M.displayName="TableBody";var w=f.forwardRef(({className:t,...e},o)=>jsx("tfoot",{className:a("fk-border-border fk-border-t fk-bg-muted/50 fk-font-medium [&>tr]:last:fk-border-b-0",t),ref:o,...e}));w.displayName="TableFooter";var E=f.forwardRef(({className:t,...e},o)=>jsx("tr",{className:a("fk-border-border fk-border-b fk-transition-colors hover:fk-bg-muted/50 data-[state=selected]:fk-bg-muted",t),ref:o,...e}));E.displayName="TableRow";var C=f.forwardRef(({className:t,style:e,...o},r)=>jsx("th",{className:a("fk-h-10 fk-px-4 fk-text-left fk-align-middle fk-font-medium fk-text-muted-foreground [&:has([role=checkbox])]:fk-pr-0",t),ref:r,...o,style:e}));C.displayName="TableHead";var G=f.forwardRef(({className:t,...e},o)=>jsx("td",{className:a("fk-px-4 fk-py-1 fk-align-middle [&:has([role=checkbox])]:fk-pr-0",t),ref:o,...e}));G.displayName="TableCell";var S=f.forwardRef(({className:t,...e},o)=>jsx("caption",{className:a("fk-mt-4 fk-text-sm fk-text-muted-foreground",t),ref:o,...e}));S.displayName="TableCaption";export{p as a,v as b,P as c,N as d,h as e,x as f,L as g,M as h,w as i,E as j,C as k,G as l,S as m};//# sourceMappingURL=chunk-6TSWBOSZ.js.map
2
+ //# sourceMappingURL=chunk-6TSWBOSZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/primitives/toggle.tsx","../src/ui/primitives/toggle-group.tsx","../src/ui/primitives/separator.tsx","../src/ui/primitives/table.tsx"],"names":["toggleVariants","cva","Toggle","g","className","variant","size","props","ref","jsx","cn","ToggleGroupContext","n","ToggleGroup","children","ToggleGroupItem","context","Separator","u","orientation","decorative","Table","onScroll","TableHeader","TableBody","TableFooter","TableRow","TableHead","style","TableCell","TableCaption"],"mappings":"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","file":"chunk-5MTVN77Y.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\nconst toggleVariants = cva(\n 'fk-inline-flex fk-items-center fk-justify-center fk-rounded-md fk-text-sm fk-font-medium fk-ring-offset-background fk-transition-colors hover:fk-bg-muted hover:fk-text-muted-foreground focus-visible:fk-outline-none focus-visible:fk-ring-2 focus-visible:fk-ring-ring focus-visible:fk-ring-offset-2 disabled:fk-pointer-events-none disabled:fk-opacity-50 data-[state=on]:fk-bg-accent data-[state=on]:fk-text-accent-foreground',\n {\n variants: {\n variant: {\n 'default': 'fk-bg-transparent',\n outline: 'fk-border fk-border-input fk-bg-transparent hover:fk-bg-accent hover:fk-text-accent-foreground',\n },\n size: {\n 'default': 'fk-h-10 fk-px-3',\n sm: 'fk-h-9 fk-px-2.5',\n lg: 'fk-h-11 fk-px-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root className={cn(toggleVariants({ variant, size, className }))} ref={ref} {...props} />\n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n","'use client';\n\nimport * as React from 'react';\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\nimport { toggleVariants } from './toggle';\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n className={cn('fk-flex fk-items-center fk-justify-center fk-gap-1', className)}\n ref={ref}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n","'use client';\n\nimport * as React from 'react';\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport { cn } from 'src/ui/lib/utils';\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n className={cn(\n 'fk-shrink-0 fk-bg-border',\n orientation === 'horizontal' ? 'fk-h-[1px] fk-w-full' : 'fk-h-full fk-w-[1px]',\n className\n )}\n decorative={decorative}\n orientation={orientation}\n ref={ref}\n {...props}\n />\n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import * as React from 'react';\nimport { cn } from 'src/ui/lib/utils';\n\nconst Table = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, onScroll, ...props }, ref) => (\n <div\n className=\"fk-relative fk-h-full fk-w-full fk-overflow-x-auto fk-rounded-md fk-border-border fk-border\"\n onScroll={onScroll}\n ref={ref}\n >\n <table className={cn('fk-w-full fk-caption-bottom fk-text-sm', className)} {...props} />\n </div>\n )\n);\nTable.displayName = 'Table';\n\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <thead\n className={cn(\n 'fk-sticky fk-z-[1] fk-top-0 fk-bg-background/90 fk-backdrop-blur-[1px] [&_tr]:fk-border-border [&_tr]:fk-border-border [&_tr]:fk-border-b',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nTableHeader.displayName = 'TableHeader';\n\nconst TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tbody className={cn('[&_tr:last-child]:fk-border-0', className)} ref={ref} {...props} />\n )\n);\nTableBody.displayName = 'TableBody';\n\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tfoot\n className={cn('fk-border-border fk-border-t fk-bg-muted/50 fk-font-medium [&>tr]:last:fk-border-b-0', className)}\n ref={ref}\n {...props}\n />\n )\n);\nTableFooter.displayName = 'TableFooter';\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n className={cn(\n 'fk-border-border fk-border-b fk-transition-colors hover:fk-bg-muted/50 data-[state=selected]:fk-bg-muted',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nTableRow.displayName = 'TableRow';\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(\n ({ className, style, ...props }, ref) => {\n return (\n <th\n className={cn(\n 'fk-h-10 fk-px-4 fk-text-left fk-align-middle fk-font-medium fk-text-muted-foreground [&:has([role=checkbox])]:fk-pr-0',\n className\n )}\n ref={ref}\n {...props}\n style={style}\n />\n );\n }\n);\nTableHead.displayName = 'TableHead';\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <td\n className={cn('fk-px-4 fk-py-1 fk-align-middle [&:has([role=checkbox])]:fk-pr-0', className)}\n ref={ref}\n {...props}\n />\n )\n);\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption className={cn('fk-mt-4 fk-text-sm fk-text-muted-foreground', className)} ref={ref} {...props} />\n )\n);\nTableCaption.displayName = 'TableCaption';\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n"]}
1
+ {"version":3,"sources":["../src/ui/primitives/toggle.tsx","../src/ui/primitives/toggle-group.tsx","../src/ui/primitives/separator.tsx","../src/ui/primitives/table.tsx"],"names":["toggleVariants","cva","Toggle","g","className","variant","size","props","ref","jsx","cn","ToggleGroupContext","n","ToggleGroup","children","ToggleGroupItem","context","Separator","u","orientation","decorative","Table","onScroll","TableHeader","TableBody","TableFooter","TableRow","TableHead","style","TableCell","TableCaption"],"mappings":"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","file":"chunk-6TSWBOSZ.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as TogglePrimitive from '@radix-ui/react-toggle';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\n\nconst toggleVariants = cva(\n 'fk-inline-flex fk-items-center fk-justify-center fk-rounded-md fk-text-sm fk-font-medium fk-ring-offset-background fk-transition-colors hover:fk-bg-muted hover:fk-text-muted-foreground focus-visible:fk-outline-none focus-visible:fk-ring-2 focus-visible:fk-ring-ring focus-visible:fk-ring-offset-2 disabled:fk-pointer-events-none disabled:fk-opacity-50 data-[state=on]:fk-bg-accent data-[state=on]:fk-text-accent-foreground',\n {\n variants: {\n variant: {\n 'default': 'fk-bg-transparent',\n outline: 'fk-border fk-border-input fk-bg-transparent hover:fk-bg-accent hover:fk-text-accent-foreground',\n },\n size: {\n 'default': 'fk-h-10 fk-px-3',\n sm: 'fk-h-9 fk-px-2.5',\n lg: 'fk-h-11 fk-px-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root className={cn(toggleVariants({ variant, size, className }))} ref={ref} {...props} />\n));\n\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nexport { Toggle, toggleVariants };\n","'use client';\n\nimport * as React from 'react';\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cn } from '../lib/utils';\nimport { toggleVariants } from './toggle';\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n});\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n className={cn('fk-flex fk-items-center fk-justify-center fk-gap-1', className)}\n ref={ref}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n\n return (\n <ToggleGroupPrimitive.Item\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { ToggleGroup, ToggleGroupItem };\n","'use client';\n\nimport * as React from 'react';\nimport * as SeparatorPrimitive from '@radix-ui/react-separator';\nimport { cn } from 'src/ui/lib/utils';\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n className={cn(\n 'fk-shrink-0 fk-bg-border',\n orientation === 'horizontal' ? 'fk-h-[1px] fk-w-full' : 'fk-h-full fk-w-[1px]',\n className\n )}\n decorative={decorative}\n orientation={orientation}\n ref={ref}\n {...props}\n />\n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n\nexport { Separator };\n","import * as React from 'react';\nimport { cn } from 'src/ui/lib/utils';\n\nconst Table = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, onScroll, ...props }, ref) => (\n <div\n className=\"fk-relative fk-h-full fk-w-full fk-overflow-auto fk-rounded-md fk-border-border fk-border\"\n onScroll={onScroll}\n ref={ref}\n >\n <table className={cn('fk-w-full fk-caption-bottom fk-text-sm', className)} {...props} />\n </div>\n )\n);\nTable.displayName = 'Table';\n\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <thead\n className={cn(\n 'fk-sticky fk-z-[1] fk-top-0 fk-bg-background/90 fk-backdrop-blur-[1px] [&_tr]:fk-border-border [&_tr]:fk-border-b',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nTableHeader.displayName = 'TableHeader';\n\nconst TableBody = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tbody className={cn('[&_tr:last-child]:fk-border-0', className)} ref={ref} {...props} />\n )\n);\nTableBody.displayName = 'TableBody';\n\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, React.HTMLAttributes<HTMLTableSectionElement>>(\n ({ className, ...props }, ref) => (\n <tfoot\n className={cn('fk-border-border fk-border-t fk-bg-muted/50 fk-font-medium [&>tr]:last:fk-border-b-0', className)}\n ref={ref}\n {...props}\n />\n )\n);\nTableFooter.displayName = 'TableFooter';\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n className={cn(\n 'fk-border-border fk-border-b fk-transition-colors hover:fk-bg-muted/50 data-[state=selected]:fk-bg-muted',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nTableRow.displayName = 'TableRow';\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, React.ThHTMLAttributes<HTMLTableCellElement>>(\n ({ className, style, ...props }, ref) => {\n return (\n <th\n className={cn(\n 'fk-h-10 fk-px-4 fk-text-left fk-align-middle fk-font-medium fk-text-muted-foreground [&:has([role=checkbox])]:fk-pr-0',\n className\n )}\n ref={ref}\n {...props}\n style={style}\n />\n );\n }\n);\nTableHead.displayName = 'TableHead';\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, React.TdHTMLAttributes<HTMLTableCellElement>>(\n ({ className, ...props }, ref) => (\n <td\n className={cn('fk-px-4 fk-py-1 fk-align-middle [&:has([role=checkbox])]:fk-pr-0', className)}\n ref={ref}\n {...props}\n />\n )\n);\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, React.HTMLAttributes<HTMLTableCaptionElement>>(\n ({ className, ...props }, ref) => (\n <caption className={cn('fk-mt-4 fk-text-sm fk-text-muted-foreground', className)} ref={ref} {...props} />\n )\n);\nTableCaption.displayName = 'TableCaption';\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption };\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {d}from'./chunk-EELTSHST.js';import {c}from'./chunk-TMK5LKFR.js';import {createContext,useReducer,useContext}from'react';import {jsx}from'react/jsx-runtime';import $ from'swr';import {find,propEq}from'ramda';var D="core.context.scope:",x={breadcrumbs:[],isRouteLoading:false,pageTitle:"",scope:"",relationships:{}},C=createContext(x),b=createContext(()=>{});function O(t,e){let{type:o,payload:r}=e;switch(o){case "setScope":return typeof localStorage<"u"&&r.projectId&&localStorage.setItem(`${D}${r.projectId}`,r.scope),{...t,scope:r.scope};case "setRelationship":return {...t,relationships:{...t.relationships,...r}};default:throw Error(`Unknown action: ${o}`)}}function q({children:t}){let[e,o]=useReducer(O,x);return jsx(C.Provider,{value:e,children:jsx(b.Provider,{value:o,children:t})})}function I(){return useContext(C)}function K(){return useContext(b)}function B(t,e){let{scope:o}=I(),{projects:r,currentProjectId:u}=d(),{schema:s,scopes:l}=find(propEq(u??"","projectId"))(r),p=l?.find(m=>m.isDefault)?.name??"default",a=e?.commonParams.q?JSON.stringify(e):null,{data:n,error:h,isLoading:i}=$(a,()=>fetch(c(t).search,{headers:{"Content-Type":"application/json"},body:JSON.stringify(e),method:"POST",mode:"cors"}).then(m=>m.json()));return {results:J(n?.results??[],t,s,o,p)??[],error:h,isLoading:i}}function v(t){return t.find(e=>e.isPrimary)?.name??t[0]?.name}function J(t,e,o,r,u){return t?.filter(s=>s?.hits?.length>0).map(s=>{let l=s,p=l.collection.replace(`${e}_`,"").replace(/_\d+$/,""),a=find(propEq(p,"plural"))(o);if(!a)return [];let n=v(a?.attributes??[]),h=a?.name??p;return l.hits.map(({document:i})=>{let c=i[n],w=(c&&typeof c!="string"?c[r]??c[u]:null)??i[n],E=Object.entries(i).reduce((y,[d,f])=>{if(d!==n&&d!=="id"&&d!=="_updatedAt"){let T=typeof f!="string"?f[r]??f[u]:f;y[d]=T;}return y},{});return {_id:i.id,_entityName:h,_entityNamePlural:p,[n]:w,...E}})}).flat()}export{D as a,q as b,I as c,K as d,B as e};//# sourceMappingURL=chunk-7TF7ZVID.js.map
2
+ //# sourceMappingURL=chunk-7TF7ZVID.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/app-context.tsx","../src/core/use-search.tsx"],"names":["SCOPE_STORAGE_KEY","initialState","AppContext","createContext","AppDispatchContext","reducer","state","action","type","payload","AppProvider","children","dispatch","useReducer","jsx","useAppContext","useContext","useAppDispatch","useSearch","projectId","searchRequest","scope","projects","currentProjectId","useConfig","schema","scopes","find","propEq","defaultScope","s","swrKey","data","error","isLoading","useSWR","apiPaths","res","mapResults","getPrimaryAttributeName","schemaAttributes","attr","results","result","item","entityNamePlural","entitySchema","primaryAttributeName","entityName","document","primaryAttribute","primaryAttributeValue","attributes","acc","key","value","scopedValue"],"mappings":"2OAMO,IAAMA,CAAAA,CAAoB,sBAE3BC,CAAAA,CAAe,CACnB,WAAA,CAAa,EAAC,CACd,cAAA,CAAgB,MAChB,SAAA,CAAW,EAAA,CACX,KAAA,CAAO,EAAA,CACP,aAAA,CAAe,EACjB,CAAA,CAEMC,CAAAA,CAAaC,aAAAA,CAA8BF,CAAY,CAAA,CAEvDG,CAAAA,CAAqBD,cAAgE,IAAM,CAEjG,CAAC,EAED,SAASE,CAAAA,CAAQC,EAAuBC,CAAAA,CAAgE,CACtG,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAAC,CAAQ,CAAA,CAAIF,CAAAA,CAE1B,OAAQC,CAAAA,EACN,KAAK,WACH,OAAI,OAAO,YAAA,CAAiB,GAAA,EAAeC,CAAAA,CAAQ,SAAA,EACjD,aAAa,OAAA,CAAQ,CAAA,EAAGT,CAAiB,CAAA,EAAGS,CAAAA,CAAQ,SAAS,GAAIA,CAAAA,CAAQ,KAAK,CAAA,CAGzE,CACL,GAAGH,CAAAA,CACH,MAAOG,CAAAA,CAAQ,KACjB,CAAA,CACF,KAAK,iBAAA,CACH,OAAO,CACL,GAAGH,CAAAA,CACH,aAAA,CAAe,CAAE,GAAGA,CAAAA,CAAM,cAAe,GAAGG,CAAQ,CACtD,CAAA,CACF,QACE,MAAM,MAAM,CAAA,gBAAA,EAAmBD,CAAc,CAAA,CAAE,CACnD,CACF,CAEO,SAASE,CAAAA,CAAY,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAyC,CAC9E,GAAM,CAACL,CAAAA,CAAOM,CAAQ,CAAA,CAAIC,UAAAA,CAAWR,CAAAA,CAASJ,CAAY,EAE1D,OACEa,GAAAA,CAACZ,CAAAA,CAAW,QAAA,CAAX,CAAoB,KAAA,CAAOI,EAC1B,QAAA,CAAAQ,GAAAA,CAACV,CAAAA,CAAmB,QAAA,CAAnB,CAA4B,KAAA,CAAOQ,EAAW,QAAA,CAAAD,CAAAA,CAAS,CAAA,CAC1D,CAEJ,CAEO,SAASI,GAAgC,CAC9C,OAAOC,UAAAA,CAAWd,CAAU,CAC9B,CAEO,SAASe,CAAAA,EAAmE,CACjF,OAAOD,UAAAA,CAAWZ,CAAkB,CACtC,CC5CO,SAASc,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACwE,CACxE,GAAM,CAAE,KAAA,CAAAC,CAAM,CAAA,CAAIN,CAAAA,EAAc,CAC1B,CAAE,QAAA,CAAAO,CAAAA,CAAU,gBAAA,CAAAC,CAAiB,CAAA,CAAIC,CAAAA,GACjC,CAAE,MAAA,CAAAC,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAIC,KAAKC,MAAAA,CAAOL,CAAAA,EAAoB,EAAA,CAAI,WAAW,CAAC,CAAA,CAAED,CAAQ,CAAA,CAC/EO,CAAAA,CAAeH,CAAAA,EAAQ,IAAA,CAAMI,CAAAA,EAAMA,CAAAA,CAAE,SAAS,CAAA,EAAG,IAAA,EAAQ,SAAA,CACzDC,CAAAA,CAASX,CAAAA,EAAe,YAAA,CAAa,EAAI,IAAA,CAAK,SAAA,CAAUA,CAAa,CAAA,CAAI,IAAA,CACzE,CAAE,IAAA,CAAAY,CAAAA,CAAM,KAAA,CAAAC,CAAAA,CAAO,SAAA,CAAAC,CAAU,CAAA,CAAIC,CAAAA,CAAOJ,EAAQ,IAChD,KAAA,CAAMK,CAAAA,CAASjB,CAAS,CAAA,CAAE,MAAA,CAAQ,CAChC,OAAA,CAAS,CAAE,cAAA,CAAgB,kBAAmB,CAAA,CAC9C,IAAA,CAAM,KAAK,SAAA,CAAUC,CAAa,CAAA,CAClC,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,MACR,CAAC,CAAA,CAAE,IAAA,CAAMiB,CAAAA,EAAQA,CAAAA,CAAI,IAAA,EAAoD,CAC3E,CAAA,CAGA,OAAO,CAAE,OAAA,CAFOC,CAAAA,CAAWN,GAAM,OAAA,EAAW,EAAC,CAAGb,CAAAA,CAAWM,CAAAA,CAAQJ,CAAAA,CAAOQ,CAAY,CAAA,EAEzD,EAAC,CAAG,KAAA,CAAAI,CAAAA,CAAO,SAAA,CAAAC,CAAU,CACpD,CAMA,SAASK,CAAAA,CAAwBC,CAAAA,CAAuC,CACtE,OAAOA,EAAiB,IAAA,CAAMC,CAAAA,EAASA,CAAAA,CAAK,SAAS,CAAA,EAAG,IAAA,EAAQD,EAAiB,CAAC,CAAA,EAAG,IACvF,CAEA,SAASF,CAAAA,CACPI,EACAvB,CAAAA,CACAM,CAAAA,CACAJ,CAAAA,CACAQ,CAAAA,CACgC,CAChC,OAAOa,GACH,MAAA,CAAQC,CAAAA,EAAYA,CAAAA,EAA0B,IAAA,EAAM,MAAA,CAAS,CAAC,EAC/D,GAAA,CAAKA,CAAAA,EAAW,CACf,IAAMC,CAAAA,CAAOD,CAAAA,CACPE,EAAmBD,CAAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAA,EAAGzB,CAAS,CAAA,CAAA,CAAA,CAAK,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAS,EAAE,CAAA,CACnF2B,CAAAA,CAAenB,IAAAA,CAAaC,MAAAA,CAAOiB,CAAAA,CAAkB,QAAQ,CAAC,CAAA,CAAEpB,CAAM,CAAA,CAE5E,GAAI,CAACqB,CAAAA,CACH,OAAO,EAAC,CAGV,IAAMC,EAAuBR,CAAAA,CAAwBO,CAAAA,EAAc,UAAA,EAAc,EAAE,CAAA,CAC7EE,EAAaF,CAAAA,EAAc,IAAA,EAAQD,CAAAA,CAGzC,OAAOD,CAAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAE,QAAA,CAAAK,CAAS,CAAA,GAAM,CACrC,IAAMC,CAAAA,CAAmBD,CAAAA,CAASF,CAAoB,CAAA,CAKhDI,CAAAA,CAAAA,CAHJD,CAAAA,EAAoB,OAAOA,CAAAA,EAAqB,QAAA,CAC3CA,CAAAA,CAAiB7B,CAAK,CAAA,EAAK6B,CAAAA,CAAiBrB,CAAY,CAAA,CACzD,IAAA,GACkDoB,CAAAA,CAASF,CAAoB,CAAA,CAC/EK,CAAAA,CAAa,MAAA,CAAO,OAAA,CAAQH,CAAQ,CAAA,CAAE,MAAA,CAC1C,CAACI,CAAAA,CAA0E,CAACC,EAAKC,CAAK,CAAA,GAAM,CAC1F,GAAID,CAAAA,GAAQP,CAAAA,EAAwBO,IAAQ,IAAA,EAAQA,CAAAA,GAAQ,YAAA,CAAc,CACxE,IAAME,CAAAA,CAAc,OAAOD,CAAAA,EAAU,QAAA,CAAYA,CAAAA,CAAMlC,CAAK,CAAA,EAAKkC,CAAAA,CAAM1B,CAAY,CAAA,CAAK0B,CAAAA,CAExFF,CAAAA,CAAIC,CAAG,CAAA,CAAIE,EACb,CAEA,OAAOH,CACT,CAAA,CACA,EACF,CAAA,CAEA,OAAO,CACL,GAAA,CAAKJ,CAAAA,CAAS,EAAA,CACd,WAAA,CAAaD,CAAAA,CACb,iBAAA,CAAmBH,EACnB,CAACE,CAAoB,EAAGI,CAAAA,CACxB,GAAGC,CACL,CACF,CAAC,CACH,CAAC,CAAA,CACA,IAAA,EACL","file":"chunk-7TF7ZVID.js","sourcesContent":["'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, ReactNode } from 'react';\nimport type { ActionSetRelationship, ActionSetScope, AppContextType } from './types';\n\nexport const SCOPE_STORAGE_KEY = 'core.context.scope:';\n\nconst initialState = {\n breadcrumbs: [],\n isRouteLoading: false,\n pageTitle: '',\n scope: '',\n relationships: {},\n};\n\nconst AppContext = createContext<AppContextType>(initialState);\n\nconst AppDispatchContext = createContext<Dispatch<ActionSetRelationship | ActionSetScope>>(() => {\n /* void */\n});\n\nfunction reducer(state: AppContextType, action: ActionSetRelationship | ActionSetScope): AppContextType {\n const { type, payload } = action;\n\n switch (type) {\n case 'setScope':\n if (typeof localStorage !== 'undefined' && payload.projectId) {\n localStorage.setItem(`${SCOPE_STORAGE_KEY}${payload.projectId}`, payload.scope);\n }\n\n return {\n ...state,\n scope: payload.scope,\n };\n case 'setRelationship':\n return {\n ...state,\n relationships: { ...state.relationships, ...payload },\n };\n default:\n throw Error(`Unknown action: ${type as string}`);\n }\n}\n\nexport function AppProvider({ children }: { children: ReactNode }): JSX.Element {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AppContext.Provider value={state}>\n <AppDispatchContext.Provider value={dispatch}>{children}</AppDispatchContext.Provider>\n </AppContext.Provider>\n );\n}\n\nexport function useAppContext(): AppContextType {\n return useContext(AppContext);\n}\n\nexport function useAppDispatch(): Dispatch<ActionSetRelationship | ActionSetScope> {\n return useContext(AppDispatchContext);\n}\n","'use client';\n\nimport useSWR from 'swr';\nimport { find, propEq } from 'ramda';\nimport { apiPaths } from './api-paths';\nimport { useAppContext } from './app-context';\nimport { useConfig } from './config/config-context';\nimport type { SingleProject } from './config/types';\nimport type {\n Attribute,\n Entity,\n RawResultItem,\n RawSearchResultItems,\n SearchRequestProps,\n SearchResultItem,\n} from './types';\n\nexport function useSearch(\n projectId: string,\n searchRequest: SearchRequestProps | null\n): { results: SearchResultItem[] | []; error: Error; isLoading: boolean } {\n const { scope } = useAppContext();\n const { projects, currentProjectId } = useConfig();\n const { schema, scopes } = find(propEq(currentProjectId ?? '', 'projectId'))(projects) as SingleProject;\n const defaultScope = scopes?.find((s) => s.isDefault)?.name ?? 'default';\n const swrKey = searchRequest?.commonParams.q ? JSON.stringify(searchRequest) : null;\n const { data, error, isLoading } = useSWR(swrKey, () =>\n fetch(apiPaths(projectId).search, {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(searchRequest),\n method: 'POST',\n mode: 'cors',\n }).then((res) => res.json() as Promise<{ results: RawSearchResultItems }>)\n );\n const results = mapResults(data?.results ?? [], projectId, schema, scope, defaultScope);\n\n return { results: results ?? [], error, isLoading };\n}\n\n/**\n * Find the name of the attribute of an entity with isPrimary === true.\n * The value of that attribute is returned as the value for the relationship attribute\n */\nfunction getPrimaryAttributeName(schemaAttributes: Attribute[]): string {\n return schemaAttributes.find((attr) => attr.isPrimary)?.name ?? schemaAttributes[0]?.name;\n}\n\nfunction mapResults(\n results: RawSearchResultItems | undefined,\n projectId: string,\n schema: Entity[],\n scope: string,\n defaultScope: string\n): SearchResultItem[] | undefined {\n return results\n ?.filter((result) => (result as RawResultItem)?.hits?.length > 0)\n .map((result) => {\n const item = result as RawResultItem;\n const entityNamePlural = item.collection.replace(`${projectId}_`, '').replace(/_\\d+$/, '');\n const entitySchema = find<Entity>(propEq(entityNamePlural, 'plural'))(schema);\n\n if (!entitySchema) {\n return [];\n }\n\n const primaryAttributeName = getPrimaryAttributeName(entitySchema?.attributes ?? []);\n const entityName = entitySchema?.name ?? entityNamePlural;\n\n // iterate over the hits and return an object with the primary attribute value first and then the rest of the attributes.\n return item.hits.map(({ document }) => {\n const primaryAttribute = document[primaryAttributeName];\n const scopedPrimaryAttribute =\n primaryAttribute && typeof primaryAttribute !== 'string'\n ? (primaryAttribute[scope] ?? primaryAttribute[defaultScope])\n : null;\n const primaryAttributeValue = scopedPrimaryAttribute ?? document[primaryAttributeName];\n const attributes = Object.entries(document).reduce(\n (acc: Omit<SearchResultItem, '_id' | '_entityName' | '_entityNamePlural'>, [key, value]) => {\n if (key !== primaryAttributeName && key !== 'id' && key !== '_updatedAt') {\n const scopedValue = typeof value !== 'string' ? (value[scope] ?? value[defaultScope]) : value;\n\n acc[key] = scopedValue;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n _id: document.id,\n _entityName: entityName,\n _entityNamePlural: entityNamePlural,\n [primaryAttributeName]: primaryAttributeValue as string,\n ...attributes,\n };\n });\n })\n .flat();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {createContext,useMemo,useContext}from'react';import {path,has}from'ramda';import {useParams}from'react-router-dom';import {jsx}from'react/jsx-runtime';var g={name:"_asset",plural:"_assets",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},isEditable:true,dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:280},isEditable:true,dataType:"string",inputType:"text",previewType:"text",isPrimary:true,defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},isEditable:true,dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:80},isEditable:true,dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:80},isEditable:true,dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},isEditable:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",isHidden:true,isEditable:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Last Updated",scope:"global",options:{size:140},isEditable:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var d={name:"_tag",plural:"_tags",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},isEditable:true,dataType:"string",inputType:"text",previewType:"text",isPrimary:true,defaultValue:""},{name:"_updatedAt",label:"Last Updated",scope:"global",options:{size:140},isEditable:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};var T=createContext({contributions:{apps:[]},currentProjectId:void 0,currentProjectSchema:[],getContributionPointConfig:()=>[],plugins:[],projects:[]}),l=i=>Object.prototype.hasOwnProperty.call(i,"projectId"),y=i=>Object.prototype.hasOwnProperty.call(i,"contributes");function F({config:i,children:o}){let{projectId:n}=useParams(),t=useMemo(()=>{let e=s=>[...s.filter(f=>f.name!==g.name&&f.name!==d.name),g,d];return i.map(s=>({...s,schema:e(s.schema)}))},[i]),p=useMemo(()=>r(["plugins"],t),[t]),O=useMemo(()=>r(["plugins"],t.filter(e=>e.projectId===n)),[t,n]),m=p.filter(e=>!l(e)&&y(e)),u=O.filter(e=>!l(e)&&y(e)),c=useMemo(()=>({contributions:{apps:b("apps",[],u)},currentProjectId:n,currentProjectSchema:t.find(e=>e.projectId===n)?.schema??[],getContributionPointConfig:(e,s=[])=>b(e,s,u),plugins:m,projects:p.filter(e=>l(e))}),[m,n,u,p]);return jsx(T.Provider,{value:{...c,contributions:{...c.contributions,apps:c.contributions.apps}},children:o})}function R(){return useContext(T)}function r(i,o){return Array.isArray(o)?o.reduce((n,t)=>path(i,t)?[...n,t,...r(i,path(i,t)??[])]:[...n,t],[]):[o]}function b(i,o=[],n){let t=["contributes",i,...o];return r(t.flat(),n).filter(p=>has("component",p))}function N(i){let n=r(["plugins"],i).filter(t=>!l(t)&&y(t));return b("apps",[],n)}export{g as a,d as b,F as c,R as d,N as e};//# sourceMappingURL=chunk-EELTSHST.js.map
2
+ //# sourceMappingURL=chunk-EELTSHST.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","ConfigContext","createContext","hasProjectIdProperty","configItem","hasContributesProperty","ConfigProvider","config","children","currentProjectId","useParams","enhancedConfig","useMemo","upsertReservedEntities","schema","entity","project","globalFlattenedConfig","flattenConfigByProperty","currentProjectFlattenedConfig","item","allPlugins","currentProjectPlugins","globalConfig","_getContributionPointConfig","contributionPoint","subPath","jsx","useConfig","useContext","property","acc","curr","path","pathArray","has","getApps","plugins"],"mappings":"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","file":"chunk-EELTSHST.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 280,\n },\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n isPrimary: true,\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n isEditable: true,\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 80,\n },\n isEditable: true,\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 80,\n },\n isEditable: true,\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n isHidden: true,\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Last Updated',\n scope: 'global',\n options: {\n size: 140,\n },\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n isPrimary: true,\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Last Updated',\n scope: 'global',\n options: {\n size: 140,\n },\n isEditable: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport { has, path } from 'ramda';\nimport { useParams } from 'react-router-dom';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport type { AppOptions, PluginOptions, ProjectOptions } from './types';\nimport type { Entity } from '../types';\n\ntype Contributes = NonNullable<PluginOptions['contributes']>;\nexport interface ConfigContext {\n contributions: {\n apps: AppOptions[] | [];\n };\n currentProjectId?: string;\n currentProjectSchema: Entity[];\n getContributionPointConfig: <T extends keyof Contributes>(\n contributionPoint: T,\n subPath?: string[]\n ) => Contributes[T][] | [];\n plugins: PluginOptions[];\n projects: ProjectOptions[];\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n contributions: {\n apps: [],\n },\n currentProjectId: undefined,\n currentProjectSchema: [],\n getContributionPointConfig: () => [],\n plugins: [] as PluginOptions[],\n projects: [] as ProjectOptions[],\n});\nconst hasProjectIdProperty = (configItem: ProjectOptions | PluginOptions): boolean =>\n Object.prototype.hasOwnProperty.call(configItem, 'projectId');\nconst hasContributesProperty = (configItem: ProjectOptions | PluginOptions): boolean =>\n Object.prototype.hasOwnProperty.call(configItem, 'contributes');\n\nexport function ConfigProvider({\n config,\n children,\n}: {\n config: ProjectOptions[];\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const enhancedConfig = useMemo(() => {\n const upsertReservedEntities = (schema: Entity[]): Entity[] => {\n const withoutReserved = schema.filter(\n (entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name\n );\n\n return [...withoutReserved, assetSchema, tagSchema];\n };\n\n return config.map((project) => ({\n ...project,\n schema: upsertReservedEntities(project.schema),\n }));\n }, [config]);\n\n const globalFlattenedConfig = useMemo(() => flattenConfigByProperty(['plugins'], enhancedConfig), [enhancedConfig]);\n const currentProjectFlattenedConfig = useMemo(\n () =>\n flattenConfigByProperty(\n ['plugins'],\n enhancedConfig.filter((item) => item.projectId === currentProjectId)\n ),\n [enhancedConfig, currentProjectId]\n );\n const allPlugins = globalFlattenedConfig.filter(\n (item: ProjectOptions | PluginOptions) => !hasProjectIdProperty(item) && hasContributesProperty(item)\n ) as PluginOptions[];\n const currentProjectPlugins = currentProjectFlattenedConfig.filter(\n (item: ProjectOptions | PluginOptions) => !hasProjectIdProperty(item) && hasContributesProperty(item)\n ) as PluginOptions[];\n\n const globalConfig = useMemo(\n () => ({\n contributions: {\n apps: _getContributionPointConfig('apps', [], currentProjectPlugins),\n },\n currentProjectId,\n currentProjectSchema: enhancedConfig.find((item) => item.projectId === currentProjectId)?.schema ?? [],\n getContributionPointConfig: <T extends keyof Contributes>(\n contributionPoint: T,\n subPath: string[] = []\n ): Contributes[T][] =>\n _getContributionPointConfig(contributionPoint, subPath, currentProjectPlugins) as Contributes[T][],\n plugins: allPlugins,\n projects: globalFlattenedConfig.filter((item: ProjectOptions | PluginOptions) =>\n hasProjectIdProperty(item)\n ) as ProjectOptions[],\n }),\n [allPlugins, currentProjectId, currentProjectPlugins, globalFlattenedConfig]\n );\n\n return (\n <ConfigContext.Provider\n value={{\n ...globalConfig,\n contributions: {\n ...globalConfig.contributions,\n apps: globalConfig.contributions.apps as AppOptions[] | [],\n },\n }}\n >\n {children}\n </ConfigContext.Provider>\n );\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n\nfunction flattenConfigByProperty(\n property: string[],\n config: (ProjectOptions | PluginOptions)[]\n): (ProjectOptions | PluginOptions)[] | [] {\n if (!Array.isArray(config)) {\n return [config];\n }\n\n return config.reduce<(ProjectOptions | PluginOptions)[]>((acc, curr) => {\n if (path(property, curr)) {\n return [...acc, curr, ...flattenConfigByProperty(property, path(property, curr) ?? [])];\n }\n\n return [...acc, curr];\n }, []);\n}\n\nfunction _getContributionPointConfig<T extends keyof Contributes>(\n contributionPoint: T,\n subPath: string[] = [],\n config: PluginOptions[]\n): Contributes[T] {\n const pathArray = ['contributes', contributionPoint, ...subPath];\n\n return flattenConfigByProperty(pathArray.flat(), config).filter((item) => has('component', item)) as Contributes[T];\n}\n\nexport function getApps(config: ProjectOptions[]): AppOptions[] | [] {\n const flattenedConfig = flattenConfigByProperty(['plugins'], config);\n const plugins = flattenedConfig.filter(\n (item: ProjectOptions | PluginOptions) => !hasProjectIdProperty(item) && hasContributesProperty(item)\n ) as PluginOptions[];\n return _getContributionPointConfig('apps', [], plugins) as AppOptions[] | [];\n}\n"]}
@@ -1,3 +1,23 @@
1
+ // src/core/base-path.ts
2
+ function normalizeBasePath(basePath) {
3
+ if (!basePath || basePath === "/") {
4
+ return "/";
5
+ }
6
+ const normalizedPath = basePath.replace(/^\/+|\/+$/g, "");
7
+ return `/${normalizedPath}`;
8
+ }
9
+ function joinBasePath(basePath, ...segments) {
10
+ const normalizedBasePath = normalizeBasePath(basePath);
11
+ const normalizedSegments = segments.flatMap((segment) => segment.split("/")).filter(Boolean);
12
+ if (normalizedSegments.length === 0) {
13
+ return normalizedBasePath;
14
+ }
15
+ if (normalizedBasePath === "/") {
16
+ return `/${normalizedSegments.join("/")}`;
17
+ }
18
+ return `${normalizedBasePath}/${normalizedSegments.join("/")}`;
19
+ }
20
+
1
21
  // src/core/api-paths.ts
2
22
  var domain = "flexkit.io";
3
23
  var baseApiUrl = `https://${domain}`;
@@ -9,7 +29,12 @@ function apiPaths(projectId = "") {
9
29
  currentUser: `/api/flexkit/${projectId}/users/me`,
10
30
  loginOtpConfirm: `${baseProjectApiUrl(projectId)}/auth/otp/confirm`,
11
31
  loginOtpSend: `${baseProjectApiUrl(projectId)}/auth/otp/send`,
12
- logout: (basePath) => `/api/flexkit/${projectId}/auth/logout?redirect=/${basePath}/${projectId}`,
32
+ logout: (basePath) => {
33
+ const params = new URLSearchParams({
34
+ redirect: joinBasePath(basePath, projectId)
35
+ });
36
+ return `/api/flexkit/${projectId}/auth/logout?${params.toString()}`;
37
+ },
13
38
  search: `/api/flexkit/${projectId}/search`,
14
39
  sessionId: `${baseProjectApiUrl(projectId)}/api/auth/login/session`,
15
40
  upload: `/api/flexkit/${projectId}/upload`
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {a,b as b$1,c,d as d$1,e}from'./chunk-RMSYYUQM.js';import {b}from'./chunk-TMK5LKFR.js';import {defaultStyles,FileIcon}from'react-file-icon';import {useMemo,useState,useEffect}from'react';import {jsx,jsxs}from'react/jsx-runtime';var _=250,I=25e5,i=new Map,v=new Map,w=new Set,A=new Map;function d(e){if(A.has(e))return;let t=new Image;t.decoding="async",t.src=e,A.set(e,t);}function g(e){let t=i.get(e);t&&i.set(e,{...t,lastUsedAt:Date.now()});}function j(){if(i.size<=_)return;let e=Array.from(i.entries()).sort((n,r)=>n[1].lastUsedAt-r[1].lastUsedAt),t=Math.max(1,Math.ceil(_*.1));for(let n=0;n<t&&n<e.length;n+=1){let[r,o]=e[n];i.delete(r),URL.revokeObjectURL(o.objectUrl);}}async function N(e){if(w.has(e)){d(e);return}if(i.has(e)){g(e);return}let t=v.get(e);if(t){await t;return}let n=(async()=>{try{let r=await fetch(e,{mode:"cors",cache:"force-cache"});if(!r.ok){d(e);return}let o=await r.blob();if(o.size>I)return;let a=URL.createObjectURL(o);i.set(e,{objectUrl:a,byteSize:o.size,lastUsedAt:Date.now()}),j();}catch(r){r instanceof TypeError&&w.add(e),d(e);}})();v.set(e,n),await n,v.delete(e);}function U(e){let t=useMemo(()=>{if(!e)return null;let o=i.get(e);return o?(g(e),o.objectUrl):null},[e]),[n,r]=useState(t);return useEffect(()=>{if(!e){r(null);return}if(w.has(e)){d(e),r(null);return}let o=i.get(e);if(o){g(e),r(o.objectUrl);return}r(null);let a=false;return N(e).then(()=>{let f=i.get(e);f&&(a||(g(e),r(f.objectUrl)));}),()=>{a=true;}},[e]),n}var x="fk-bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] dark:fk-bg-[#222] dark:[--asset-checker:#2a2a2a]";function G({value:e}){return Array.isArray(e)?jsx(z,{value:e}):jsx(M,{value:e})}function M({value:e$1}){let t=e$1?.path??"",n=!!t,r=n&&/\.(png|jpe?g|gif|webp|avif|svg)$/i.test(t),o=l=>{let[u]=l.split("?"),y=u.split(".");return y.length>1?y.pop().toLowerCase():"file"},a$1=n?t.endsWith(".svg")?`${b}${t}`:`${b}${t}?w=84&h=84&f=webp`:null,f=n?t.endsWith(".svg")?`${b}${t}`:`${b}${t}?w=624&h=624&f=webp`:"",S=U(a$1);return n?jsx("div",{className:"fk-z-10",children:jsx(a,{children:r?jsxs(b$1,{children:[jsx(c,{asChild:true,children:jsx("img",{alt:"asset",className:`fk-w-7 fk-h-7 fk-cursor-zoom-in fk-overflow-hidden fk-rounded-md fk-object-contain ${x}`,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-overflow-hidden fk-rounded-md fk-object-contain ${x}`,decoding:"async",src:f})})})]}):jsxs(b$1,{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 l=o(t),u=defaultStyles[l];return jsx(FileIcon,{extension:l,...u||{}})})()})}),jsx(d$1,{children:jsx(e,{children:jsx("div",{className:"fk-text-sm fk-text-muted-foreground",children:"Preview not available"})})})]})})}):null}function z({value:e}){let t=e.filter(n=>!!n.path).slice(0,3);return t.length===0?null:jsxs("div",{className:"fk-flex fk-items-center",children:[jsx("div",{className:"fk-flex -fk-space-x-2",children:t.map(n=>jsx("img",{alt:"asset",className:`fk-h-7 fk-w-7 fk-overflow-hidden fk-rounded-md fk-object-contain ${x}`,decoding:"async",src:`${b}${n.path}?w=84&h=84&f=webp`},n._id))}),e.length>3?jsxs("span",{className:"fk-ml-2 fk-text-xs fk-text-muted-foreground",children:["+",e.length-3]}):null]})}export{G as a};//# sourceMappingURL=chunk-R4MPNNRN.js.map
2
+ //# sourceMappingURL=chunk-R4MPNNRN.js.map
@@ -0,0 +1 @@
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","transparentImageBackground","Asset","value","jsx","AssetStack","SingleAsset","path","hasPath","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","cachedThumbnailSrc","TooltipProvider","jsxs","Tooltip","TooltipTrigger","TooltipPortal","TooltipContent","ext","style","defaultStyles","FileTypeIcon","assets","asset"],"mappings":"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","file":"chunk-R4MPNNRN.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 { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { useCachedImageSrc } from '../../ui/hooks/use-cached-image-src';\n\nexport type Asset = {\n _id: string;\n path: string;\n};\n\nconst transparentImageBackground =\n 'fk-bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] dark:fk-bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: Asset | Asset[] }) {\n if (Array.isArray(value)) {\n return <AssetStack value={value} />;\n }\n\n return <SingleAsset value={value} />;\n}\n\nfunction SingleAsset({ 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('?');\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-overflow-hidden fk-rounded-md fk-object-contain ${transparentImageBackground}`}\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-overflow-hidden fk-rounded-md fk-object-contain ${transparentImageBackground}`}\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 <FileTypeIcon 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\nfunction AssetStack({ value }: { value: Asset[] }): JSX.Element | null {\n const assets = value.filter((asset) => Boolean(asset.path)).slice(0, 3);\n\n if (assets.length === 0) {\n return null;\n }\n\n return (\n <div className=\"fk-flex fk-items-center\">\n <div className=\"fk-flex -fk-space-x-2\">\n {assets.map((asset) => (\n <img\n alt=\"asset\"\n className={`fk-h-7 fk-w-7 fk-overflow-hidden fk-rounded-md fk-object-contain ${transparentImageBackground}`}\n decoding=\"async\"\n key={asset._id}\n src={`${IMAGES_BASE_URL}${asset.path}?w=84&h=84&f=webp`}\n />\n ))}\n </div>\n {value.length > 3 ? (\n <span className=\"fk-ml-2 fk-text-xs fk-text-muted-foreground\">+{value.length - 3}</span>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import'./index.css';import {b}from'./chunk-WIUPQHZ5.js';var n="flexkit.io",o=`https://${n}`,t=i=>i?`https://${i}.api.${n}`:o,l="https://flexkit.io/images/";function p(i=""){return {authProviders:`/api/flexkit/${i}/auth/providers`,completion:`/api/flexkit/${i}/completion`,currentUser:`/api/flexkit/${i}/users/me`,loginOtpConfirm:`${t(i)}/auth/otp/confirm`,loginOtpSend:`${t(i)}/auth/otp/send`,logout:r=>{let a=new URLSearchParams({redirect:b(r,i)});return `/api/flexkit/${i}/auth/logout?${a.toString()}`},search:`/api/flexkit/${i}/search`,sessionId:`${t(i)}/api/auth/login/session`,upload:`/api/flexkit/${i}/upload`}}
2
+ export{o as a,l as b,p as c};//# sourceMappingURL=chunk-TMK5LKFR.js.map
3
+ //# sourceMappingURL=chunk-TMK5LKFR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/api-paths.ts"],"names":["domain","baseApiUrl","baseProjectApiUrl","projectId","IMAGES_BASE_URL","apiPaths","basePath","params","joinBasePath"],"mappings":"wDAEA,IAAMA,EAAS,YAAA,CACFC,CAAAA,CAAa,WAAWD,CAAM,CAAA,CAAA,CACrCE,EAAqBC,CAAAA,EACzBA,CAAAA,CAAY,CAAA,QAAA,EAAWA,CAAS,QAAQH,CAAM,CAAA,CAAA,CAAKC,EAcxCG,CAAAA,CAAkB,6BAExB,SAASC,CAAAA,CAASF,CAAAA,CAAY,EAAA,CAAc,CACjD,OAAO,CACL,aAAA,CAAe,gBAAgBA,CAAS,CAAA,eAAA,CAAA,CACxC,WAAY,CAAA,aAAA,EAAgBA,CAAS,cACrC,WAAA,CAAa,CAAA,aAAA,EAAgBA,CAAS,CAAA,SAAA,CAAA,CACtC,eAAA,CAAiB,GAAGD,CAAAA,CAAkBC,CAAS,CAAC,CAAA,iBAAA,CAAA,CAChD,YAAA,CAAc,CAAA,EAAGD,CAAAA,CAAkBC,CAAS,CAAC,CAAA,cAAA,CAAA,CAC7C,OAASG,CAAAA,EAAqB,CAC5B,IAAMC,CAAAA,CAAS,IAAI,eAAA,CAAgB,CACjC,SAAUC,CAAAA,CAAaF,CAAAA,CAAUH,CAAS,CAC5C,CAAC,EAED,OAAO,CAAA,aAAA,EAAgBA,CAAS,CAAA,aAAA,EAAgBI,EAAO,QAAA,EAAU,EACnE,CAAA,CACA,MAAA,CAAQ,gBAAgBJ,CAAS,CAAA,OAAA,CAAA,CACjC,UAAW,CAAA,EAAGD,CAAAA,CAAkBC,CAAS,CAAC,CAAA,uBAAA,CAAA,CAC1C,OAAQ,CAAA,aAAA,EAAgBA,CAAS,SACnC,CACF","file":"chunk-TMK5LKFR.js","sourcesContent":["import { joinBasePath } from './base-path';\n\nconst domain = 'flexkit.io';\nexport const baseApiUrl = `https://${domain}`;\nconst baseProjectApiUrl = (projectId?: string): string =>\n projectId ? `https://${projectId}.api.${domain}` : baseApiUrl;\n\ninterface ApiPaths {\n authProviders: string;\n completion: string;\n currentUser: string;\n loginOtpConfirm: string;\n loginOtpSend: string;\n logout: (basePath: string) => string;\n search: string;\n sessionId: string;\n upload: string;\n}\n\nexport const IMAGES_BASE_URL = 'https://flexkit.io/images/';\n\nexport function apiPaths(projectId = ''): ApiPaths {\n return {\n authProviders: `/api/flexkit/${projectId}/auth/providers`,\n completion: `/api/flexkit/${projectId}/completion`,\n currentUser: `/api/flexkit/${projectId}/users/me`,\n loginOtpConfirm: `${baseProjectApiUrl(projectId)}/auth/otp/confirm`,\n loginOtpSend: `${baseProjectApiUrl(projectId)}/auth/otp/send`,\n logout: (basePath: string) => {\n const params = new URLSearchParams({\n redirect: joinBasePath(basePath, projectId),\n });\n\n return `/api/flexkit/${projectId}/auth/logout?${params.toString()}`;\n },\n search: `/api/flexkit/${projectId}/search`,\n sessionId: `${baseProjectApiUrl(projectId)}/api/auth/login/session`,\n upload: `/api/flexkit/${projectId}/upload`,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';function o(n){return !n||n==="/"?"/":`/${n.replace(/^\/+|\/+$/g,"")}`}function a(n,...e){let t=o(n),r=e.flatMap(i=>i.split("/")).filter(Boolean);return r.length===0?t:t==="/"?`/${r.join("/")}`:`${t}/${r.join("/")}`}export{o as a,a as b};//# sourceMappingURL=chunk-WIUPQHZ5.js.map
2
+ //# sourceMappingURL=chunk-WIUPQHZ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/base-path.ts"],"names":["normalizeBasePath","basePath","joinBasePath","segments","normalizedBasePath","normalizedSegments","segment"],"mappings":"oBAAO,SAASA,CAAAA,CAAkBC,CAAAA,CAA2B,CAC3D,OAAI,CAACA,CAAAA,EAAYA,CAAAA,GAAa,GAAA,CACrB,GAAA,CAKF,CAAA,CAAA,EAFgBA,CAAAA,CAAS,OAAA,CAAQ,YAAA,CAAc,EAAE,CAE/B,CAAA,CAC3B,CAEO,SAASC,CAAAA,CAAaD,CAAAA,CAAAA,GAAqBE,CAAAA,CAA4B,CAC5E,IAAMC,CAAAA,CAAqBJ,CAAAA,CAAkBC,CAAQ,CAAA,CAC/CI,CAAAA,CAAqBF,CAAAA,CAAS,OAAA,CAASG,CAAAA,EAAYA,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAE3F,OAAID,CAAAA,CAAmB,MAAA,GAAW,CAAA,CACzBD,CAAAA,CAGLA,CAAAA,GAAuB,GAAA,CAClB,CAAA,CAAA,EAAIC,CAAAA,CAAmB,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAGlC,CAAA,EAAGD,CAAkB,CAAA,CAAA,EAAIC,CAAAA,CAAmB,IAAA,CAAK,GAAG,CAAC,CAAA,CAC9D","file":"chunk-WIUPQHZ5.js","sourcesContent":["export function normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '/';\n }\n\n const normalizedPath = basePath.replace(/^\\/+|\\/+$/g, '');\n\n return `/${normalizedPath}`;\n}\n\nexport function joinBasePath(basePath: string, ...segments: string[]): string {\n const normalizedBasePath = normalizeBasePath(basePath);\n const normalizedSegments = segments.flatMap((segment) => segment.split('/')).filter(Boolean);\n\n if (normalizedSegments.length === 0) {\n return normalizedBasePath;\n }\n\n if (normalizedBasePath === '/') {\n return `/${normalizedSegments.join('/')}`;\n }\n\n return `${normalizedBasePath}/${normalizedSegments.join('/')}`;\n}\n"]}
package/dist/index.css CHANGED
@@ -1868,6 +1868,10 @@ body{
1868
1868
  height: 20px;
1869
1869
  }
1870
1870
 
1871
+ .fk-h-\[28rem\]{
1872
+ height: 28rem;
1873
+ }
1874
+
1871
1875
  .fk-h-\[30vh\]{
1872
1876
  height: 30vh;
1873
1877
  }
@@ -1880,6 +1884,10 @@ body{
1880
1884
  height: calc(100svh - 3.5rem);
1881
1885
  }
1882
1886
 
1887
+ .fk-h-\[calc\(100vh-10rem\)\]{
1888
+ height: calc(100vh - 10rem);
1889
+ }
1890
+
1883
1891
  .fk-h-\[calc\(100vh-3rem\)\]{
1884
1892
  height: calc(100vh - 3rem);
1885
1893
  }
@@ -1940,6 +1948,10 @@ body{
1940
1948
  min-height: 0px;
1941
1949
  }
1942
1950
 
1951
+ .fk-min-h-9{
1952
+ min-height: 2.25rem;
1953
+ }
1954
+
1943
1955
  .fk-min-h-\[150px\]{
1944
1956
  min-height: 150px;
1945
1957
  }
@@ -1960,10 +1972,6 @@ body{
1960
1972
  min-height: 80px;
1961
1973
  }
1962
1974
 
1963
- .fk-min-h-full{
1964
- min-height: 100%;
1965
- }
1966
-
1967
1975
  .fk-w-1\.5{
1968
1976
  width: 0.375rem;
1969
1977
  }
@@ -2326,6 +2334,10 @@ body{
2326
2334
  grid-template-columns: repeat(1, minmax(0, 1fr));
2327
2335
  }
2328
2336
 
2337
+ .fk-grid-cols-\[repeat\(auto-fill\,minmax\(8rem\,1fr\)\)\]{
2338
+ grid-template-columns: repeat(auto-fill,minmax(8rem,1fr));
2339
+ }
2340
+
2329
2341
  .fk-flex-row{
2330
2342
  flex-direction: row;
2331
2343
  }
@@ -2382,6 +2394,10 @@ body{
2382
2394
  gap: 0.625rem;
2383
2395
  }
2384
2396
 
2397
+ .fk-gap-3{
2398
+ gap: 0.75rem;
2399
+ }
2400
+
2385
2401
  .fk-gap-4{
2386
2402
  gap: 1rem;
2387
2403
  }
@@ -2395,6 +2411,12 @@ body{
2395
2411
  row-gap: 1.25rem;
2396
2412
  }
2397
2413
 
2414
+ .-fk-space-x-2 > :not([hidden]) ~ :not([hidden]){
2415
+ --tw-space-x-reverse: 0;
2416
+ margin-right: calc(-0.5rem * var(--tw-space-x-reverse));
2417
+ margin-left: calc(-0.5rem * calc(1 - var(--tw-space-x-reverse)));
2418
+ }
2419
+
2398
2420
  .fk-space-x-1 > :not([hidden]) ~ :not([hidden]){
2399
2421
  --tw-space-x-reverse: 0;
2400
2422
  margin-right: calc(0.25rem * var(--tw-space-x-reverse));
@@ -2437,12 +2459,6 @@ body{
2437
2459
  margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
2438
2460
  }
2439
2461
 
2440
- .fk-space-y-4 > :not([hidden]) ~ :not([hidden]){
2441
- --tw-space-y-reverse: 0;
2442
- margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
2443
- margin-bottom: calc(1rem * var(--tw-space-y-reverse));
2444
- }
2445
-
2446
2462
  .fk-space-y-6 > :not([hidden]) ~ :not([hidden]){
2447
2463
  --tw-space-y-reverse: 0;
2448
2464
  margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
@@ -2465,10 +2481,6 @@ body{
2465
2481
  overflow: visible;
2466
2482
  }
2467
2483
 
2468
- .fk-overflow-x-auto{
2469
- overflow-x: auto;
2470
- }
2471
-
2472
2484
  .fk-overflow-y-auto{
2473
2485
  overflow-y: auto;
2474
2486
  }
@@ -2635,6 +2647,11 @@ body{
2635
2647
  background-color: rgb(255 255 255 / var(--tw-bg-opacity)) !important;
2636
2648
  }
2637
2649
 
2650
+ .fk-bg-\[\#fafafa\]{
2651
+ --tw-bg-opacity: 1;
2652
+ background-color: rgb(250 250 250 / var(--tw-bg-opacity));
2653
+ }
2654
+
2638
2655
  .fk-bg-accent{
2639
2656
  background-color: hsl(var(--accent));
2640
2657
  }
@@ -2743,6 +2760,16 @@ body{
2743
2760
  background-color: transparent;
2744
2761
  }
2745
2762
 
2763
+ .fk-object-contain{
2764
+ -o-object-fit: contain;
2765
+ object-fit: contain;
2766
+ }
2767
+
2768
+ .fk-object-cover{
2769
+ -o-object-fit: cover;
2770
+ object-fit: cover;
2771
+ }
2772
+
2746
2773
  .fk-object-scale-down{
2747
2774
  -o-object-fit: scale-down;
2748
2775
  object-fit: scale-down;
@@ -2902,6 +2929,10 @@ body{
2902
2929
  padding-left: 0.75rem;
2903
2930
  }
2904
2931
 
2932
+ .fk-pl-4{
2933
+ padding-left: 1rem;
2934
+ }
2935
+
2905
2936
  .fk-pl-8{
2906
2937
  padding-left: 2rem;
2907
2938
  }
@@ -2918,6 +2949,10 @@ body{
2918
2949
  padding-right: 0.5rem;
2919
2950
  }
2920
2951
 
2952
+ .fk-pr-3{
2953
+ padding-right: 0.75rem;
2954
+ }
2955
+
2921
2956
  .fk-pr-4{
2922
2957
  padding-right: 1rem;
2923
2958
  }
@@ -2926,6 +2961,10 @@ body{
2926
2961
  padding-right: 1.5rem;
2927
2962
  }
2928
2963
 
2964
+ .fk-pr-9{
2965
+ padding-right: 2.25rem;
2966
+ }
2967
+
2929
2968
  .fk-pt-0\.5{
2930
2969
  padding-top: 0.125rem;
2931
2970
  }
@@ -3382,10 +3421,26 @@ body{
3382
3421
  animation-timing-function: linear;
3383
3422
  }
3384
3423
 
3424
+ .\[--asset-checker\:\#f0f0f0\]{
3425
+ --asset-checker: #f0f0f0;
3426
+ }
3427
+
3385
3428
  .\[--cell-size\:2rem\]{
3386
3429
  --cell-size: 2rem;
3387
3430
  }
3388
3431
 
3432
+ .\[background-image\:linear-gradient\(45deg\2c var\(--asset-checker\)_25\%\2c transparent_25\%\)\2c linear-gradient\(-45deg\2c var\(--asset-checker\)_25\%\2c transparent_25\%\)\2c linear-gradient\(45deg\2c transparent_75\%\2c var\(--asset-checker\)_75\%\)\2c linear-gradient\(-45deg\2c transparent_75\%\2c var\(--asset-checker\)_75\%\)\]{
3433
+ background-image: linear-gradient(45deg,var(--asset-checker) 25%,transparent 25%),linear-gradient(-45deg,var(--asset-checker) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--asset-checker) 75%),linear-gradient(-45deg,transparent 75%,var(--asset-checker) 75%);
3434
+ }
3435
+
3436
+ .\[background-position\:0_0\2c 0_4px\2c 4px_-4px\2c -4px_0px\]{
3437
+ background-position: 0 0,0 4px,4px -4px,-4px 0px;
3438
+ }
3439
+
3440
+ .\[background-size\:8px_8px\]{
3441
+ background-size: 8px 8px;
3442
+ }
3443
+
3389
3444
  .\[fk-animation-delay\:-0\.15s\]{
3390
3445
  fk-animation-delay: -0.15s;
3391
3446
  }
@@ -4595,6 +4650,11 @@ pre {
4595
4650
  color: hsl(var(--sidebar-accent-foreground));
4596
4651
  }
4597
4652
 
4653
+ .dark\:fk-bg-\[\#222\]:is([style="color-scheme: dark;"] *){
4654
+ --tw-bg-opacity: 1;
4655
+ background-color: rgb(34 34 34 / var(--tw-bg-opacity));
4656
+ }
4657
+
4598
4658
  .dark\:fk-text-background:is([style="color-scheme: dark;"] *){
4599
4659
  color: hsl(var(--background));
4600
4660
  }
@@ -4608,6 +4668,10 @@ pre {
4608
4668
  color: rgb(255 255 255 / 0.9);
4609
4669
  }
4610
4670
 
4671
+ .dark\:\[--asset-checker\:\#2a2a2a\]:is([style="color-scheme: dark;"] *){
4672
+ --asset-checker: #2a2a2a;
4673
+ }
4674
+
4611
4675
  .dark\:hover\:fk-bg-red-800:hover:is([style="color-scheme: dark;"] *){
4612
4676
  --tw-bg-opacity: 1;
4613
4677
  background-color: rgb(153 27 27 / var(--tw-bg-opacity));
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as React$1 from 'react';
2
2
  import React__default, { Dispatch, SetStateAction, UIEvent, ReactElement } from 'react';
3
- import { A as AppContextType, a as ActionSetRelationship, b as ActionSetScope, C as Config, c as AppOptions, E as Entity, P as PluginOptions, d as ProjectOptions, e as SearchRequestProps, f as SearchResultItem, U as UseEntityQueryParams, M as MappedEntityItem, F as FormEntityItem, I as ImageValue, g as Schema, h as EntityData, i as AttributeValue, j as Attribute, k as MultipleRelationshipConnection } from './types.d-D7S0yibv.js';
4
- export { D as DataType, l as FormFieldParams, m as FormFieldProps, n as FormFieldValue, L as LogoProps, o as ScopeType, S as SingleProject } from './types.d-D7S0yibv.js';
3
+ import { A as AppContextType, a as ActionSetRelationship, b as ActionSetScope, C as Config, c as AppOptions, E as Entity, P as PluginOptions, d as ProjectOptions, O as OrderedAssetValue, e as SearchRequestProps, f as SearchResultItem, U as UseEntityQueryParams, M as MappedEntityItem, F as FormEntityItem, I as ImageValue, g as Schema, h as EntityData, i as AttributeValue, j as Attribute, k as MultipleRelationshipConnection, l as SingleRelationshipConnection } from './types.d-DLhjvcTC.js';
4
+ export { D as DataType, m as FormFieldParams, n as FormFieldProps, o as FormFieldValue, L as LogoProps, p as ScopeType, S as SingleProject } from './types.d-DLhjvcTC.js';
5
5
  export { Outlet, useLocation, useParams } from 'react-router-dom';
6
- import { DocumentNode, ErrorLike } from '@apollo/client';
6
+ import { OperationVariables, DocumentNode, ErrorLike } from '@apollo/client';
7
7
  export { gql } from '@apollo/client';
8
8
  import { Column, Row, ColumnDef, Table, RowSelectionState } from '@tanstack/react-table';
9
9
  export { ColumnDef, ColumnFiltersState, Table as ReactTable, Row, RowSelectionState, SortingState, TableMeta, Updater, VisibilityState, flexRender, getCoreRowModel, getFacetedRowModel, getFacetedUniqueValues, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable } from '@tanstack/react-table';
@@ -60,13 +60,17 @@ type UploadedFileResult = {
60
60
  width?: number;
61
61
  height?: number;
62
62
  };
63
+ type UploadedAssetResult = UploadedFileResult & {
64
+ asset: OrderedAssetValue;
65
+ _id: string;
66
+ };
63
67
  type OpenFileDialogAndUploadOptions = {
64
68
  projectId: string | undefined;
65
69
  accept?: string;
66
70
  multiple?: boolean;
67
71
  maxBytes?: number;
68
72
  };
69
- declare function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedFileResult[]>;
73
+ declare function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]>;
70
74
 
71
75
  declare function ProjectDisabled(): JSX.Element;
72
76
 
@@ -113,7 +117,7 @@ type Props$1 = {
113
117
  declare function DefaultValueSwitch({ scope, checked, onChange }: Props$1): JSX.Element | null;
114
118
 
115
119
  type FetchMoreOptions = {
116
- variables: {
120
+ variables: OperationVariables & {
117
121
  options: {
118
122
  offset: number;
119
123
  limit: number;
@@ -127,6 +131,7 @@ declare function useEntityQuery({ entityNamePlural, schema, scope, variables, is
127
131
  isLoading: boolean;
128
132
  isProjectDisabled: boolean;
129
133
  isProjectReadOnly: boolean;
134
+ schemaErrorMessage: string | null;
130
135
  };
131
136
 
132
137
  type EntityMutationResponse = [
@@ -249,8 +254,11 @@ type ActionEditRelationship = {
249
254
  connectionName?: string;
250
255
  entityId?: string;
251
256
  entityName: string;
257
+ initialAssetPath?: string;
258
+ initialConnection?: SingleRelationshipConnection;
252
259
  relationshipId: string;
253
260
  mode: 'single' | 'multiple';
261
+ assetAccept?: string;
254
262
  };
255
263
  };
256
264
  type ActionDeleteEntity = {