@flexkit/studio 0.2.12 → 0.2.14
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.
- package/dist/activity-nav-button-7SVTTHBQ.js +2 -0
- package/dist/{activity-nav-button-LZESIQL2.js.map → activity-nav-button-7SVTTHBQ.js.map} +1 -1
- package/dist/astro.js +1 -1
- package/dist/{chat-page-EKOGKEFR.js → chat-page-L427VVVR.js} +3 -3
- package/dist/{chat-page-EKOGKEFR.js.map → chat-page-L427VVVR.js.map} +1 -1
- package/dist/chunk-2HYQVMP3.js +3 -0
- package/dist/chunk-2HYQVMP3.js.map +1 -0
- package/dist/chunk-5CVDMZUI.js +3 -0
- package/dist/chunk-5CVDMZUI.js.map +1 -0
- package/dist/chunk-6YJ3DLIU.js +2 -0
- package/dist/{chunk-OFJOZMCR.js.map → chunk-6YJ3DLIU.js.map} +1 -1
- package/dist/{chunk-BOXFB6E6.js → chunk-7ELMTFZ4.js} +2 -2
- package/dist/{chunk-BOXFB6E6.js.map → chunk-7ELMTFZ4.js.map} +1 -1
- package/dist/chunk-ALCK2BJY.js +2 -0
- package/dist/chunk-ALCK2BJY.js.map +1 -0
- package/dist/chunk-CAZ6EUR2.js +2 -0
- package/dist/chunk-CAZ6EUR2.js.map +1 -0
- package/dist/chunk-D5WYD5M4.js +2 -0
- package/dist/chunk-D5WYD5M4.js.map +1 -0
- package/dist/{chunk-2AVINVYN.js → chunk-GFAOY74A.js} +28 -18
- package/dist/chunk-MGXG5PWU.js +384 -0
- package/dist/chunk-MGXG5PWU.js.map +1 -0
- package/dist/{chunk-EWBEPYML.js → chunk-MJVWFANP.js} +3 -3
- package/dist/{chunk-EWBEPYML.js.map → chunk-MJVWFANP.js.map} +1 -1
- package/dist/chunk-NLRSLQUT.js +3 -0
- package/dist/chunk-NLRSLQUT.js.map +1 -0
- package/dist/{chunk-F2DHCPWW.js → chunk-P5ZRTZ5Z.js} +2 -2
- package/dist/{chunk-F2DHCPWW.js.map → chunk-P5ZRTZ5Z.js.map} +1 -1
- package/dist/{chunk-QQSI7BPK.js → chunk-R64ELY3B.js} +3 -3
- package/dist/{chunk-QQSI7BPK.js.map → chunk-R64ELY3B.js.map} +1 -1
- package/dist/chunk-U5D3EDCY.js +2 -0
- package/dist/chunk-U5D3EDCY.js.map +1 -0
- package/dist/chunk-W7Z4MY43.js +2 -0
- package/dist/{chunk-7IHEL6LU.js.map → chunk-W7Z4MY43.js.map} +1 -1
- package/dist/chunk-XWBACTNR.js +3 -0
- package/dist/{chunk-C47FNPLK.js.map → chunk-XWBACTNR.js.map} +1 -1
- package/dist/chunk-ZZRA4567.js +2 -0
- package/dist/{chunk-V64P56OA.js.map → chunk-ZZRA4567.js.map} +1 -1
- package/dist/electron.d.ts +103 -0
- package/dist/electron.js +131 -0
- package/dist/index.css +9 -0
- package/dist/index.d.ts +33 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/list-WJLU3K2X.js +2 -0
- package/dist/{list-DOTORSUC.js.map → list-WJLU3K2X.js.map} +1 -1
- package/dist/nextjs.js +1 -1
- package/dist/{pages-ILAXYS2J.js → pages-3EK5GS2T.js} +4 -4
- package/dist/{pages-ILAXYS2J.js.map → pages-3EK5GS2T.js.map} +1 -1
- package/dist/plugin-pages-PQO22EOE.js +2 -0
- package/dist/{plugin-pages-RKJRHKNL.js.map → plugin-pages-PQO22EOE.js.map} +1 -1
- package/dist/root-4EALW3G6.js +2 -0
- package/dist/{root-RE3ZNXQ3.js.map → root-4EALW3G6.js.map} +1 -1
- package/dist/root-BA7BLCFR.js +23 -0
- package/dist/root-BA7BLCFR.js.map +1 -0
- package/dist/root-YNGCF5QM.js +31 -0
- package/dist/{root-JB3NZZNZ.js.map → root-YNGCF5QM.js.map} +1 -1
- package/dist/root-ZF62TR5Z.js +2 -0
- package/dist/{root-76YQTZUI.js.map → root-ZF62TR5Z.js.map} +1 -1
- package/dist/search-QHMCAT7O.js +2 -0
- package/dist/{search-WUO6VWKU.js.map → search-QHMCAT7O.js.map} +1 -1
- package/dist/skills-pages-HIBSAVOP.js +2 -0
- package/dist/{skills-pages-POKCFHOL.js.map → skills-pages-HIBSAVOP.js.map} +1 -1
- package/dist/tanstack-start.js +1 -1
- package/dist/user-nav-36ACWXOW.js +2 -0
- package/dist/{user-nav-DCAHVWN7.js.map → user-nav-36ACWXOW.js.map} +1 -1
- package/package.json +10 -6
- package/dist/activity-nav-button-LZESIQL2.js +0 -2
- package/dist/chunk-2HSIWUH3.js +0 -3
- package/dist/chunk-2HSIWUH3.js.map +0 -1
- package/dist/chunk-6YOVF2AD.js +0 -384
- package/dist/chunk-6YOVF2AD.js.map +0 -1
- package/dist/chunk-7IHEL6LU.js +0 -2
- package/dist/chunk-ACS3TGGP.js +0 -2
- package/dist/chunk-ACS3TGGP.js.map +0 -1
- package/dist/chunk-C47FNPLK.js +0 -3
- package/dist/chunk-HYSTMQD7.js +0 -2
- package/dist/chunk-HYSTMQD7.js.map +0 -1
- package/dist/chunk-KXAGLQ2B.js +0 -2
- package/dist/chunk-KXAGLQ2B.js.map +0 -1
- package/dist/chunk-OFJOZMCR.js +0 -2
- package/dist/chunk-TYDYAOQ7.js +0 -3
- package/dist/chunk-TYDYAOQ7.js.map +0 -1
- package/dist/chunk-V64P56OA.js +0 -2
- package/dist/list-DOTORSUC.js +0 -2
- package/dist/plugin-pages-RKJRHKNL.js +0 -2
- package/dist/root-76YQTZUI.js +0 -2
- package/dist/root-A4VHAEK5.js +0 -23
- package/dist/root-A4VHAEK5.js.map +0 -1
- package/dist/root-JB3NZZNZ.js +0 -31
- package/dist/root-RE3ZNXQ3.js +0 -2
- package/dist/search-WUO6VWKU.js +0 -2
- package/dist/skills-pages-POKCFHOL.js +0 -2
- package/dist/user-nav-DCAHVWN7.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/asset-manager/tag-query.ts","../src/apps/asset-manager/sidebar.tsx","../src/apps/asset-manager/data-grid/asset-drop-zone.tsx","../src/apps/asset-manager/data-grid/asset-tag-dialogs.tsx","../src/apps/asset-manager/data-grid/asset-row-actions.tsx","../src/apps/asset-manager/data-grid/asset-grid.tsx","../src/apps/asset-manager/data-grid/data-table-toolbar.tsx","../src/apps/asset-manager/data-grid/use-asset-manager-upload.ts","../src/apps/asset-manager/data-grid/view-mode.ts","../src/apps/asset-manager/list.tsx","../src/apps/asset-manager/root.tsx"],"names":["tagQueryVariables","tagQueryOptions","Sidebar","scope","useAppContext","schema","useConfig","runMutation","setMutation","setOptions","useEntityMutation","newTagName","setNewTagName","useState","isDialogOpen","setIsDialogOpen","isDeleteOpen","setIsDeleteOpen","tagToDelete","setTagToDelete","isEditOpen","setIsEditOpen","tagToEdit","setTagToEdit","editTagName","setEditTagName","isSubmitting","setIsSubmitting","isDeleting","setIsDeleting","canMutate","useCanMutate","entityName","entityNamePlural","data","isLoading","useEntityQuery","tags","item","it","handleCreate","useCallback","name","_id","mutation","getEntityCreateMutation","entityQuery","getEntityQuery","refreshQuery","gql","resolve","handleDelete","getEntityDeleteMutation","reject","error","handleRename","dataToMutate","originalData","getEntityUpdateMutation","jsxs","jsx","TagIcon","TooltipProvider","Tooltip","TooltipTrigger","Dialog","DialogTrigger","Button","PlusIcon","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","e","DialogFooter","Loader2","TooltipContent","PermissionTooltip","ScrollArea","tag","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","hasFileDrag","event","AssetDropZone","children","disabled","onDropFiles","dragDepthRef","useRef","isDragActive","setIsDragActive","clearDragState","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","files","TAG_UPDATE_RESPONSE_FIELDS","AssetTagDialogs","assetIds","mode","onModeChange","onCompleted","patchAssets","usePatchEntityList","selectedTagIds","setSelectedTagIds","tagsData","allTags","useMemo","resetSelection","handleOpenChange","open","applyMutationResult","patches","asset","tagNames","handleAddTags","id","handleRemoveTags","isRemove","actionLabel","CommandDialog","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","prev","CommandSeparator","LoaderCircle","AssetRowActions","overlay","row","copiedField","setCopiedField","tagDialogMode","setTagDialogMode","dispatch","useDispatch","assetId","assetUrl","assetSchema","copyToClipboard","field","text","Fragment","EllipsisIcon","CheckIcon","CopyIcon","LinkIcon","MinusIcon","Trash2Icon","FileTypeIconCompat","FileTypeIcon","transparentImageBackground","getLoadMoreThreshold","clientHeight","formatAssetSize","bytes","AssetGrid","columns","hasMore","isLoadingMore","onLoadMore","onSortingChange","pageSize","sortingProp","toolbarComponent","scrollRef","schemaErrorMessage","useGraphQLError","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","useEffect","handleSortingChange","updater","table","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","rows","onLoadMoreRef","hasMoreRef","isLoadingMoreRef","checkLoadMore","container","scrollElement","scrollHeight","scrollTop","handleScroll","_","index","Skeleton","AssetGridCard","filename","getAssetFilename","mimeType","sizeLabel","metaLine","Checkbox","value","AssetGridMedia","isZoomOpen","setIsZoomOpen","isZoomImageLoaded","setIsZoomImageLoaded","url","isImageAsset","ext","getExtensionFromAsset","style","defaultStyles","thumbnailUrl","getAssetImageUrl","zoomUrl","handleThumbnailClick","handleZoomOpenChange","mimeTypes","ImagePlayIcon","ImageIcon","FilePlayIcon","LayersIcon","SplinePointerIcon","DataTableToolbar","isUploading","viewMode","onUploadClick","onViewModeChange","onSearchLoadingChange","onSearchWhereChange","isFiltered","projectId","useParams","search","setSearch","textWhereRef","filterWhereRef","getBaseSearchRequest","baseSearchRequest","searchQuery","setSearchQuery","results","useSearch","lastWhereRef","trimmedSearch","committedSearchQuery","isSearchPending","debouncedSetSearchQuery","debounce","query","selectedIds","t","tagOptions","emitCombinedWhere","clauses","combinedWhere","whereKey","clearSearch","handleBatchDelete","safeResults","nextWhere","r","tagClauses","orClauses","columnFiltersKey","mimeFilter","f","mimeValues","tagsFilter","tagValues","orTags","SearchIcon","ResetIcon","DataTableFacetedFilter","DataTableSortedBy","ListChecks","ToggleGroup","ToggleGroupItem","LayoutGrid","List","fn","ms","timeoutId","debounced","args","MAX_UPLOAD_BYTES","useAssetManagerUpload","uploadAssets","useUploadAssets","setIsUploading","runUpload","VIEW_MODE_STORAGE_KEY","getStoredViewMode","stored","setStoredViewMode","defaultSort","useLocation","entityId","currentProject","setSorting","setViewMode","columnsDefinition","useGridColumnsDefinition","searchWhere","setSearchWhere","isSearchLoading","setIsSearchLoading","uploadFiles","uploadFromDialog","where","whereBase","graphqlSort","primarySort","desc","entry","variables","handleViewModeChange","fetchMore","count","isProjectDisabled","isInitialLoading","rowsCount","handleLoadMore","loadingData","loadingColumns","getLoadingColumns","ProjectDisabled","SchemaError","DataTable","Outlet","column","Root","ResizablePanelGroup","ResizablePanel","ResizableHandle"],"mappings":"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","file":"root-A4VHAEK5.js","sourcesContent":["// All mounted tag menus use the same operation and variables so Apollo can\n// share an in-flight request and reuse the cached result.\nexport const tagQueryVariables = { where: {}, limit: 500, offset: 0, sort: [{ name: 'ASC' }] };\nexport const tagQueryOptions = { selection: 'display' as const, includeCount: false };\n","import { JSX, useCallback, useState } from 'react';\nimport { Loader2, PlusIcon, TagIcon, Ellipsis } from 'lucide-react';\nimport {\n Button,\n Input,\n ScrollArea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogDescription,\n DialogTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n PermissionTooltip,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../../ui';\nimport { gql } from '@apollo/client';\nimport { useAppContext } from '../../core/app-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { useEntityMutation } from '../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport {\n getEntityDeleteMutation,\n getEntityCreateMutation,\n getEntityQuery,\n getEntityUpdateMutation,\n} from '../../graphql-client/queries';\nimport { useConfig } from '../../core/config/config-context';\nimport type { FormEntityItem } from '../../graphql-client/types';\n\nimport { tagQueryOptions, tagQueryVariables } from './tag-query';\n\ntype TagItem = { _id: string; name: string };\n\nexport function Sidebar(): JSX.Element {\n const { scope } = useAppContext();\n const { currentProjectSchema: schema } = useConfig();\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [newTagName, setNewTagName] = useState<string>('');\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n const [isDeleteOpen, setIsDeleteOpen] = useState<boolean>(false);\n const [tagToDelete, setTagToDelete] = useState<TagItem | null>(null);\n const [isEditOpen, setIsEditOpen] = useState<boolean>(false);\n const [tagToEdit, setTagToEdit] = useState<TagItem | null>(null);\n const [editTagName, setEditTagName] = useState<string>('');\n const [isSubmitting, setIsSubmitting] = useState<boolean>(false);\n const [isDeleting, setIsDeleting] = useState<boolean>(false);\n const canMutate = useCanMutate();\n\n const entityName = '_tag';\n const entityNamePlural = '_tags';\n const { data, isLoading } = useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const tags: TagItem[] = (Array.isArray(data) ? (data as unknown[]) : []).map((item) => {\n const it = item as { _id: string; name: string };\n return { _id: it._id, name: it.name };\n });\n\n const handleCreate = useCallback(async (): Promise<void> => {\n const name = newTagName.trim();\n\n if (!name) {\n return;\n }\n\n setIsSubmitting(true);\n const _id = typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}`;\n const entityData: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const mutation = getEntityCreateMutation(entityNamePlural, schema, entityData, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setNewTagName('');\n setIsDialogOpen(false);\n resolve();\n },\n });\n runMutation(true);\n });\n setIsSubmitting(false);\n }, [entityNamePlural, runMutation, schema, scope, setMutation, setOptions, newTagName]);\n\n const handleDelete = useCallback(\n async (_id: string): Promise<void> => {\n setIsDeleting(true);\n const mutation = getEntityDeleteMutation(entityName, schema, _id);\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: _id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n runMutation(true);\n });\n setIsDeleting(false);\n },\n [entityName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions]\n );\n\n const handleRename = useCallback(async (): Promise<void> => {\n const name = editTagName.trim();\n\n if (!name || !tagToEdit) {\n return;\n }\n\n setIsSubmitting(true);\n\n const dataToMutate: FormEntityItem = { name: { value: name, disabled: false, scope: 'default' } };\n const originalData: FormEntityItem = {};\n const mutation = getEntityUpdateMutation(\n entityNamePlural,\n tagToEdit._id,\n scope,\n schema,\n originalData,\n dataToMutate\n );\n // Match the name-only tag query; no asset previews or counts are needed.\n const entityQuery = getEntityQuery(entityNamePlural, scope, schema, tagQueryOptions);\n const refreshQuery = gql`\n ${entityQuery.query}\n `;\n\n await new Promise<void>((resolve) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { eq: tagToEdit._id } } },\n refetchQueries: [refreshQuery],\n onCompleted: () => {\n setIsEditOpen(false);\n setTagToEdit(null);\n setEditTagName('');\n resolve();\n },\n });\n runMutation(true);\n });\n\n setIsSubmitting(false);\n }, [editTagName, entityNamePlural, runMutation, schema, scope, setMutation, setOptions, tagToEdit]);\n\n return (\n <div className=\"fk:flex fk:h-full fk:max-h-screen fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:h-12 fk:items-center fk:border-b fk:border-b-border fk:px-4 fk:lg:px-6\">\n <TagIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:px-4 fk:text-sm fk:font-semibold fk:tracking-tight\">Tags</span>\n {canMutate ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Dialog open={isDialogOpen} onOpenChange={setIsDialogOpen}>\n <DialogTrigger asChild>\n <Button variant=\"secondary\" size=\"icon\" className=\"fk:ml-auto fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>New tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Create a new tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={newTagName}\n placeholder=\"New tag name\"\n onChange={(e) => setNewTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleCreate();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button disabled={isSubmitting} onClick={handleCreate} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Add\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </TooltipTrigger>\n <TooltipContent>\n <p>Add tag</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"fk:ml-auto\">\n <PermissionTooltip disabled>\n <Button disabled variant=\"secondary\" size=\"icon\" className=\"fk:h-8 fk:w-8\">\n <PlusIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Add tag</span>\n </Button>\n </PermissionTooltip>\n </div>\n )}\n </div>\n\n <ScrollArea className=\"fk:h-full\">\n <div className=\"fk:flex fk:flex-col fk:gap-2 fk:px-4 fk:py-2\">\n {isLoading ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">Loading...</div>\n ) : tags.length === 0 ? (\n <div className=\"fk:text-sm fk:text-muted-foreground\">No tags yet</div>\n ) : (\n tags.map((tag) => (\n <div\n key={tag._id}\n className=\"fk:group fk:flex fk:items-center fk:justify-between fk:rounded-sm fk:border fk:border-border fk:bg-card fk:px-3 fk:py-1 fk:corner-squircle\"\n >\n <span className=\"fk:text-sm\">{tag.name}</span>\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${tag.name}`}\n disabled={!canMutate}\n title={canMutate ? `Actions for ${tag.name}` : undefined}\n variant=\"ghost\"\n size=\"icon\"\n className=\"fk:h-7 fk:w-7 fk:text-muted-foreground fk:hover:text-foreground\"\n >\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem\n onClick={() => {\n setTagToEdit(tag);\n setEditTagName(tag.name);\n setIsEditOpen(true);\n }}\n >\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n onClick={() => {\n setTagToDelete(tag);\n setIsDeleteOpen(true);\n }}\n >\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ))\n )}\n </div>\n </ScrollArea>\n <Dialog open={isEditOpen} onOpenChange={setIsEditOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Rename an existing tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:flex fk:gap-2\">\n <Input\n autoFocus\n value={editTagName}\n placeholder=\"Tag name\"\n onChange={(e) => setEditTagName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n void handleRename();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n disabled={isSubmitting}\n variant=\"secondary\"\n onClick={() => {\n setIsEditOpen(false);\n setTagToEdit(null);\n }}\n >\n Cancel\n </Button>\n <Button disabled={isSubmitting} onClick={handleRename} variant=\"default\">\n {isSubmitting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n <Dialog open={isDeleteOpen} onOpenChange={setIsDeleteOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete tag</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Confirm deletion of a tag</DialogDescription>\n </DialogHeader>\n <div className=\"fk:text-sm fk:text-muted-foreground\">\n Are you sure you want to delete the tag{' '}\n <span className=\"fk:font-semibold fk:text-foreground\">{tagToDelete?.name}</span>?\n </div>\n <DialogFooter>\n <Button\n disabled={isDeleting}\n variant=\"secondary\"\n onClick={() => {\n setIsDeleteOpen(false);\n setTagToDelete(null);\n }}\n >\n Cancel\n </Button>\n <Button\n disabled={isDeleting}\n variant=\"destructive\"\n onClick={() => {\n if (!tagToDelete) {\n return;\n }\n\n void (async () => {\n await handleDelete(tagToDelete._id);\n setIsDeleteOpen(false);\n setTagToDelete(null);\n })();\n }}\n >\n {isDeleting ? <Loader2 className=\"fk:h-4 fk:w-4 fk:mr-2 fk:animate-spin\" /> : null}\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useRef, useState, type DragEvent, type JSX, type ReactNode } from 'react';\n\ninterface AssetDropZoneProps {\n children: ReactNode;\n disabled?: boolean;\n onDropFiles: (files: File[]) => void;\n}\n\nfunction hasFileDrag(event: DragEvent<HTMLDivElement>): boolean {\n return Array.from(event.dataTransfer.types).includes('Files');\n}\n\nexport function AssetDropZone({ children, disabled = false, onDropFiles }: AssetDropZoneProps): JSX.Element {\n const dragDepthRef = useRef(0);\n const [isDragActive, setIsDragActive] = useState(false);\n\n function clearDragState(): void {\n dragDepthRef.current = 0;\n setIsDragActive(false);\n }\n\n function handleDragEnter(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current += 1;\n\n if (!disabled) {\n setIsDragActive(true);\n }\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = disabled ? 'none' : 'copy';\n }\n\n function handleDragLeave(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n dragDepthRef.current = Math.max(0, dragDepthRef.current - 1);\n\n if (dragDepthRef.current === 0) {\n setIsDragActive(false);\n }\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>): void {\n if (!hasFileDrag(event)) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n clearDragState();\n\n if (disabled) {\n return;\n }\n\n const files = Array.from(event.dataTransfer.files);\n\n if (files.length === 0) {\n return;\n }\n\n onDropFiles(files);\n }\n\n return (\n <div\n className=\"fk:relative fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">{children}</div>\n {isDragActive ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:inset-0 fk:z-30 fk:flex fk:items-center fk:justify-center fk:rounded-md fk:border-2 fk:border-dashed fk:border-primary fk:bg-background/80 fk:corner-squircle\"\n >\n <p className=\"fk:text-sm fk:font-medium fk:text-foreground\">Drop files to upload</p>\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useState, type JSX } from 'react';\nimport { LoaderCircle } from 'lucide-react';\nimport {\n Button,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../../ui';\nimport { gql } from '@apollo/client';\nimport { getEntityUpdateMutation } from '../../../graphql-client/queries';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useEntityMutation } from '../../../graphql-client/use-entity-mutation';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { usePatchEntityList } from '../../../graphql-client/use-patch-entity-list';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ntype TagItem = {\n _id: string;\n name: string;\n};\n\ntype WhereClause = { [key: string]: unknown };\n\ntype AssetTagMutationAsset = {\n _id?: string;\n _updatedAt?: string;\n tags?: TagItem[] | null;\n};\n\ntype AssetTagMutationData = {\n update_assets?: {\n _assets?: AssetTagMutationAsset[] | null;\n } | null;\n};\n\nexport type AssetTagDialogMode = 'add' | 'remove' | null;\n\nconst TAG_UPDATE_RESPONSE_FIELDS = `_updatedAt\n tags(limit: 3, offset: 0) {\n _id\n name\n }\n`;\n\ninterface AssetTagDialogsProps {\n assetIds: string[];\n mode: AssetTagDialogMode;\n onModeChange: (mode: AssetTagDialogMode) => void;\n onCompleted?: () => void;\n}\n\nexport function AssetTagDialogs({\n assetIds,\n mode,\n onModeChange,\n onCompleted,\n}: AssetTagDialogsProps): JSX.Element {\n const { scope } = useAppContext();\n const patchAssets = usePatchEntityList('_assets');\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const { currentProjectSchema: schema } = useConfig();\n const [selectedTagIds, setSelectedTagIds] = useState<string[]>([]);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((tag) => ({\n _id: (tag as TagItem)._id,\n name: (tag as TagItem).name,\n }));\n }, [tagsData]);\n\n const resetSelection = useCallback((): void => {\n setSelectedTagIds([]);\n }, []);\n\n const handleOpenChange = useCallback(\n (open: boolean): void => {\n if (!open && !isSubmitting) {\n onModeChange(null);\n resetSelection();\n }\n },\n [isSubmitting, onModeChange, resetSelection]\n );\n\n const applyMutationResult = useCallback(\n (data: unknown): void => {\n const assets = (data as AssetTagMutationData | null | undefined)?.update_assets?._assets ?? [];\n const patches = assets\n .filter((asset): asset is AssetTagMutationAsset & { _id: string } => typeof asset?._id === 'string')\n .map((asset) => {\n const tagNames = (Array.isArray(asset.tags) ? asset.tags : [])\n .map((tag) => tag.name)\n .filter(Boolean)\n .slice(0, 3)\n .join(', ');\n\n return {\n _id: asset._id,\n attributes: {\n tags: tagNames,\n ...(typeof asset._updatedAt === 'string' ? { _updatedAt: asset._updatedAt } : {}),\n },\n };\n });\n\n if (patches.length > 0) {\n patchAssets(patches);\n }\n },\n [patchAssets]\n );\n\n const handleAddTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n connect: selectedTagIds.map((id) => ({ _id: id })),\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const handleRemoveTags = useCallback(async (): Promise<void> => {\n if (assetIds.length === 0 || selectedTagIds.length === 0 || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const dataToMutate = {\n tags: {\n relationships: {\n disconnect: selectedTagIds,\n },\n disabled: false,\n scope,\n },\n } as unknown as WhereClause;\n\n const mutation = getEntityUpdateMutation(\n '_assets',\n assetIds[0] ?? '',\n scope,\n schema,\n {},\n dataToMutate as never,\n { responseFields: TAG_UPDATE_RESPONSE_FIELDS }\n );\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n setOptions({\n variables: { where: { _id: { in: assetIds } } },\n onCompleted: (data: unknown) => {\n applyMutationResult(data);\n resolve();\n },\n onError: (error: Error) => reject(error),\n });\n runMutation(true);\n });\n\n onCompleted?.();\n resetSelection();\n onModeChange(null);\n } catch {\n // Keep the dialog open so the user can retry.\n } finally {\n setIsSubmitting(false);\n }\n }, [\n applyMutationResult,\n assetIds,\n isSubmitting,\n onCompleted,\n onModeChange,\n resetSelection,\n runMutation,\n schema,\n scope,\n selectedTagIds,\n setMutation,\n setOptions,\n ]);\n\n const isRemove = mode === 'remove';\n let actionLabel = isRemove ? 'Remove tag(s)' : 'Add tag(s)';\n\n if (assetIds.length > 1) {\n actionLabel = isRemove ? 'Remove tag(s) from selected assets' : 'Add tag(s) to selected assets';\n }\n\n return (\n <CommandDialog open={mode !== null} onOpenChange={handleOpenChange}>\n <CommandInput placeholder=\"Search tags...\" />\n <CommandList className=\"fk:h-75\">\n <CommandEmpty>No tags found.</CommandEmpty>\n <CommandGroup heading=\"Tags\">\n {allTags.map((tag) => {\n const isSelected = selectedTagIds.includes(tag._id);\n\n return (\n <CommandItem\n disabled={isSubmitting}\n key={tag._id}\n onSelect={() => {\n if (isSubmitting) {\n return;\n }\n\n setSelectedTagIds((prev) =>\n isSelected ? prev.filter((id) => id !== tag._id) : [...prev, tag._id]\n );\n }}\n >\n <input className=\"fk:mr-2\" checked={isSelected} onChange={() => {}} type=\"checkbox\" />\n {tag.name}\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n <CommandSeparator />\n <div className=\"fk:p-2\">\n <Button\n className=\"fk:w-full\"\n disabled={selectedTagIds.length === 0 || isSubmitting}\n onClick={isRemove ? handleRemoveTags : handleAddTags}\n >\n {isSubmitting ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n {actionLabel}\n </Button>\n </div>\n </CommandDialog>\n );\n}\n","import { useState, type JSX } from 'react';\nimport {\n Check as CheckIcon,\n Copy as CopyIcon,\n Ellipsis as EllipsisIcon,\n Link as LinkIcon,\n MinusIcon,\n TagIcon,\n Trash2 as Trash2Icon,\n} from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { assetSchema } from '../../../entities/assets-schema';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../../../ui';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\n\ntype AssetRow = {\n _id?: string;\n url?: string | null;\n};\n\ninterface AssetRowActionsProps<TData> {\n overlay?: boolean;\n row: Row<TData>;\n}\n\nexport function AssetRowActions<TData>({ overlay = false, row }: AssetRowActionsProps<TData>): JSX.Element {\n const [copiedField, setCopiedField] = useState<'id' | 'url' | null>(null);\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const dispatch = useDispatch();\n const canMutate = useCanMutate();\n const asset = row.original as AssetRow;\n const assetId = asset._id ?? '';\n const assetUrl = asset.url ?? '';\n\n function handleDelete(): void {\n dispatch({ type: 'DeleteEntity', payload: { entityId: assetId, entityName: assetSchema.name } });\n }\n\n function copyToClipboard(field: 'id' | 'url', text: string): void {\n void navigator.clipboard.writeText(text);\n setCopiedField(field);\n window.setTimeout(() => setCopiedField(null), 1500);\n }\n\n // Pure white glyph; parent wrapper applies mix-blend-difference so it inverts over the asset.\n // A light hover fill also inverts, so the hit area reads as a contrast disc on any asset.\n const triggerClassName = overlay\n ? 'fk:flex fk:h-7 fk:w-7 fk:p-0 fk:text-white fk:group-hover:bg-background/10 fk:group-hover:text-white! fk:data-[state=open]:bg-background/15'\n : 'fk:flex fk:h-8 fk:w-8 fk:p-0 fk:data-[state=open]:bg-muted';\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className={triggerClassName} onClick={(event) => event.stopPropagation()} variant=\"ghost\">\n <EllipsisIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-45\">\n <DropdownMenuItem\n disabled={!assetId}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('id', assetId);\n }}\n >\n {copiedField === 'id' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <CopyIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy ID\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetUrl}\n onClick={(event) => {\n event.stopPropagation();\n copyToClipboard('url', assetUrl);\n }}\n >\n {copiedField === 'url' ? (\n <CheckIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n ) : (\n <LinkIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Copy URL\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('add');\n }}\n >\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Add tag\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n setTagDialogMode('remove');\n }}\n >\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"fk:text-destructive\"\n disabled={!assetId || !canMutate}\n onClick={(event) => {\n event.stopPropagation();\n handleDelete();\n }}\n >\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n {tagDialogMode !== null ? (\n <AssetTagDialogs assetIds={assetId ? [assetId] : []} mode={tagDialogMode} onModeChange={setTagDialogMode} />\n ) : null}\n </>\n );\n}\n","'use client';\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentType,\n type JSX,\n type MouseEvent,\n type ReactElement,\n type UIEvent,\n} from 'react';\nimport {\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n Table as ReactTable,\n Row,\n RowSelectionState,\n SortingState,\n Updater,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useGraphQLError } from '../../../graphql-client/graphql-context';\nimport type { AttributeValue } from '../../../graphql-client/types';\nimport {\n Checkbox,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Skeleton,\n} from '../../../ui';\nimport { LoaderCircle } from 'lucide-react';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetFilename, getAssetImageUrl, getExtensionFromAsset, isImageAsset } from './asset-url';\nimport { AssetRowActions } from './asset-row-actions';\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\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] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\ntype AssetRecord = {\n _id?: string;\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n size?: number | null;\n url?: string | null;\n};\n\ninterface AssetGridProps<TData extends AttributeValue, TValue> {\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n isLoading?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n onSortingChange?: (updater: Updater<SortingState>) => void;\n pageSize?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: ReactTable<AttributeValue>) => ReactElement;\n}\n\nfunction getLoadMoreThreshold(clientHeight: number): number {\n return Math.max(600, clientHeight);\n}\n\nfunction formatAssetSize(bytes: number | null | undefined): string {\n if (bytes == null || Number.isNaN(bytes)) {\n return '';\n }\n\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function AssetGrid<TData extends AttributeValue, TValue>({\n columns,\n data,\n entityName,\n hasMore = false,\n isLoading = false,\n isLoadingMore = false,\n onLoadMore,\n onSortingChange,\n pageSize,\n sorting: sortingProp,\n toolbarComponent,\n}: AssetGridProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0 });\n }, [entityName]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` from the toolbar; keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n });\n\n const { rows } = table.getRowModel();\n\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n const { scrollHeight, scrollTop, clientHeight } = scrollElement;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n if (distanceFromBottom >= getLoadMoreThreshold(clientHeight)) {\n return;\n }\n\n onLoadMoreRef.current();\n }, []);\n\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore]);\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4\">\n {toolbarComponent ? toolbarComponent(table) : null}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1\">\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n <div\n className=\"fk:h-full fk:overflow-auto fk:pt-px fk:pb-20 fk:-ml-0.5 fk:pr-3\"\n onScroll={handleScroll}\n ref={scrollRef}\n >\n {isLoading ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:gap-3\">\n {Array.from({ length: pageSize ?? 50 }, (_, index) => (\n <div className=\"fk:rounded-md fk:border fk:border-border fk:p-2 fk:corner-squircle\" key={`skeleton-${index}`}>\n <Skeleton className=\"fk:aspect-square fk:w-full fk:rounded-sm fk:corner-squircle\" />\n <Skeleton className=\"fk:mt-2 fk:h-3 fk:w-[75%]\" />\n <Skeleton className=\"fk:mt-1.5 fk:h-3 fk:w-[50%]\" />\n </div>\n ))}\n </div>\n ) : null}\n {!isLoading && rows.length === 0 ? (\n <div className=\"fk:flex fk:h-24 fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground\">\n No results.\n </div>\n ) : null}\n {!isLoading && rows.length > 0 ? (\n <div className=\"fk:grid fk:grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] fk:pl-0.5 fk:gap-3\">\n {rows.map((row) => (\n <AssetGridCard key={row.id} row={row} />\n ))}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n\nfunction AssetGridCard({ row }: { row: Row<AttributeValue> }): JSX.Element {\n const asset = row.original as AssetRecord;\n const filename = getAssetFilename(asset) || 'Untitled';\n const mimeType = asset.mimeType ?? '';\n const sizeLabel = formatAssetSize(asset.size);\n const isSelected = row.getIsSelected();\n const metaLine = [mimeType, sizeLabel].filter(Boolean).join(' · ');\n\n return (\n <div\n className={`fk:relative fk:rounded-md fk:border fk:p-2 fk:transition-colors ${\n isSelected\n ? 'fk:border-primary fk:ring-1 fk:ring-primary/40 fk:bg-muted/40'\n : 'fk:border-border fk:bg-background fk:hover:border-muted-foreground/30'\n } fk:corner-squircle`}\n data-state={isSelected ? 'selected' : undefined}\n >\n <div className=\"fk:absolute fk:left-3 fk:top-3 fk:z-10 fk:mix-blend-difference\">\n <Checkbox\n className=\"fk:border-white!\"\n aria-label={`Select ${filename}`}\n checked={isSelected}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n onClick={(event) => event.stopPropagation()}\n />\n </div>\n <div className=\"fk:group fk:absolute fk:right-2 fk:top-2 fk:z-10 fk:mix-blend-difference\">\n <AssetRowActions overlay row={row} />\n </div>\n <AssetGridMedia asset={asset} filename={filename} />\n <div className=\"fk:mt-2 fk:truncate fk:text-xs fk:font-medium\" title={filename}>\n {filename}\n </div>\n {metaLine ? (\n <div className=\"fk:mt-0.5 fk:truncate fk:text-[11px] fk:text-muted-foreground\" title={metaLine}>\n {metaLine}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction AssetGridMedia({ asset, filename }: { asset: AssetRecord; filename: string }): JSX.Element {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const [isZoomImageLoaded, setIsZoomImageLoaded] = useState(false);\n const url = asset.url ?? '';\n\n if (!url && !asset.path) {\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:corner-squircle\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">No preview</span>\n </div>\n );\n }\n\n const isImage = isImageAsset(asset);\n\n if (!isImage || !url) {\n const ext = getExtensionFromAsset(asset);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:flex fk:aspect-square fk:items-center fk:justify-center fk:rounded-sm fk:bg-muted fk:[&>svg]:h-12 fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 320, height: 320 });\n const zoomUrl = url;\n\n function handleThumbnailClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n setIsZoomImageLoaded(false);\n setIsZoomOpen(true);\n }\n\n function handleZoomOpenChange(open: boolean): void {\n setIsZoomOpen(open);\n\n if (!open) {\n setIsZoomImageLoaded(false);\n }\n }\n\n return (\n <>\n <button\n className={`fk:aspect-square fk:w-full fk:cursor-zoom-in fk:overflow-hidden fk:rounded-sm fk:border-0 fk:p-0 ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n type=\"button\"\n >\n <img alt={filename} className=\"fk:h-full fk:w-full fk:object-contain\" src={thumbnailUrl} />\n </button>\n <Dialog open={isZoomOpen} onOpenChange={handleZoomOpenChange}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <div className=\"fk:relative fk:flex fk:h-[min(85vh,56rem)] fk:w-full fk:items-center fk:justify-center fk:overflow-hidden fk:rounded-md fk:corner-squircle\">\n {!isZoomImageLoaded ? (\n <LoaderCircle\n aria-label=\"Loading image\"\n className=\"fk:absolute fk:h-8 fk:w-8 fk:animate-spin fk:text-muted-foreground\"\n />\n ) : null}\n <img\n alt={filename}\n className={`fk:max-h-full fk:max-w-full fk:object-contain fk:transition-opacity ${\n isZoomImageLoaded ? 'fk:opacity-100' : 'fk:opacity-0'\n }`}\n onError={() => setIsZoomImageLoaded(true)}\n onLoad={() => setIsZoomImageLoaded(true)}\n src={zoomUrl}\n />\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","'use client';\n\nimport { JSX, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n FilePlayIcon,\n ImageIcon,\n ImagePlayIcon,\n LayersIcon,\n LayoutGrid,\n List,\n ListChecks,\n MinusIcon,\n SplinePointerIcon,\n TagIcon,\n Trash2Icon,\n LoaderCircle,\n Search as SearchIcon,\n X as ResetIcon,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport type { Table as ReactTable } from '@tanstack/react-table';\nimport type { SearchRequestProps } from '../../../core/types';\nimport { DataTableFacetedFilter } from '../../../data-grid/data-table-faceted-filter';\nimport { DataTableSortedBy } from '../../../data-grid/data-table-sorted-by';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useDispatch } from '../../../entities/actions-context';\nimport { useEntityQuery } from '../../../graphql-client/use-entity-query';\nimport { useAppContext } from '../../../core/app-context';\nimport { useConfig } from '../../../core/config/config-context';\nimport { useSearch } from '../../../core/use-search';\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n PermissionTooltip,\n ToggleGroup,\n ToggleGroupItem,\n} from '../../../ui';\nimport type { AssetViewMode } from './view-mode';\nimport { AssetTagDialogs, type AssetTagDialogMode } from './asset-tag-dialogs';\nimport { tagQueryOptions, tagQueryVariables } from '../tag-query';\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isUploading?: boolean;\n table: ReactTable<TData>;\n viewMode: AssetViewMode;\n onUploadClick?: () => void;\n onViewModeChange: (mode: AssetViewMode) => void;\n onSearchLoadingChange?: (isLoading: boolean) => void;\n onSearchWhereChange?: (where: WhereClause) => void;\n}\n\ntype WhereClause = { [key: string]: unknown };\n\nconst mimeTypes = [\n {\n value: 'image/gif',\n label: 'GIF',\n icon: ImagePlayIcon,\n },\n {\n value: 'image/jpeg',\n label: 'JPEG',\n icon: ImageIcon,\n },\n {\n value: 'video/mp4',\n label: 'MP4',\n icon: FilePlayIcon,\n },\n {\n value: 'image/png',\n label: 'PNG',\n icon: LayersIcon,\n },\n {\n value: 'image/svg+xml',\n label: 'SVG',\n icon: SplinePointerIcon,\n },\n {\n value: 'image/webp',\n label: 'WebP',\n icon: ImageIcon,\n },\n];\n\nexport function DataTableToolbar<TData>({\n entityName,\n isUploading = false,\n table,\n viewMode,\n onUploadClick,\n onViewModeChange,\n onSearchLoadingChange,\n onSearchWhereChange,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0;\n const { projectId } = useParams();\n const dispatch = useDispatch();\n const { scope } = useAppContext();\n const [tagDialogMode, setTagDialogMode] = useState<AssetTagDialogMode>(null);\n const { currentProjectSchema: schema } = useConfig();\n const canMutate = useCanMutate();\n const [search, setSearch] = useState('');\n const textWhereRef = useRef<WhereClause>({});\n const filterWhereRef = useRef<WhereClause>({});\n\n function getBaseSearchRequest(): SearchRequestProps {\n return {\n searchRequests: {\n searches: [{ collection: '_assets' }, { collection: '_tags' }],\n },\n commonParams: { q: '' },\n };\n }\n\n const baseSearchRequest = useMemo(() => getBaseSearchRequest(), []);\n const [searchQuery, setSearchQuery] = useState<SearchRequestProps>(baseSearchRequest);\n const { results, isLoading } = useSearch(projectId ?? '', searchQuery);\n const lastWhereRef = useRef<string>('');\n const trimmedSearch = search.trim();\n const committedSearchQuery = searchQuery.commonParams.q ?? '';\n const isSearchPending = trimmedSearch.length > 0 && (isLoading || committedSearchQuery !== trimmedSearch);\n\n const debouncedSetSearchQuery = useMemo(\n () =>\n debounce((query: string) => {\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: query } });\n }, 300),\n [baseSearchRequest]\n );\n\n useEffect(() => {\n return () => {\n debouncedSetSearchQuery.cancel();\n };\n }, [debouncedSetSearchQuery]);\n\n // Collect selected entity ids from the table\n const selectedIds: string[] = table\n .getSelectedRowModel()\n .rows.map((row) => (row.original as unknown as { _id: string })._id);\n\n // Load tags for the selector (full tags collection, not derived from loaded assets)\n const { data: tagsData } = useEntityQuery({\n entityNamePlural: '_tags',\n schema,\n scope,\n variables: tagQueryVariables,\n ...tagQueryOptions,\n });\n const allTags = useMemo(() => {\n const items = Array.isArray(tagsData) ? (tagsData as unknown[]) : [];\n\n return items.map((t) => ({ _id: (t as { _id: string })._id, name: (t as { name: string }).name }));\n }, [tagsData]);\n\n const tagOptions = useMemo(() => {\n return allTags.map((t) => ({ value: t._id, label: t.name }));\n }, [allTags]);\n\n const emitCombinedWhere = useCallback((): void => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const clauses: WhereClause[] = [];\n\n if (Object.keys(textWhereRef.current).length > 0) {\n clauses.push(textWhereRef.current);\n }\n\n if (Object.keys(filterWhereRef.current).length > 0) {\n clauses.push(filterWhereRef.current);\n }\n\n const combinedWhere = clauses.length === 0 ? {} : clauses.length === 1 ? clauses[0] : { AND: clauses };\n const whereKey = JSON.stringify(combinedWhere);\n\n if (lastWhereRef.current !== whereKey) {\n lastWhereRef.current = whereKey;\n onSearchWhereChange(combinedWhere);\n }\n }, [onSearchWhereChange]);\n\n function clearSearch(): void {\n debouncedSetSearchQuery.cancel();\n setSearch('');\n setSearchQuery({ ...baseSearchRequest, commonParams: { q: '' } });\n textWhereRef.current = {};\n emitCombinedWhere();\n }\n\n async function handleBatchDelete(): Promise<void> {\n dispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} asset${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected assets? They will be deleted permanently.`\n : `Are you sure you want to delete the selected asset? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionCancel: () => {},\n dialogActionSubmit: () => {\n // One DeleteEntity action → one GraphQL mutation with `_id: { in: [...] }`.\n dispatch({\n type: 'DeleteEntity',\n _id: `delete-batch-${Date.now()}`,\n payload: { entityId: selectedIds, entityName, silent: true },\n });\n\n table.resetRowSelection();\n },\n },\n },\n });\n }\n\n useEffect(() => {\n onSearchLoadingChange?.(isSearchPending);\n }, [isSearchPending, onSearchLoadingChange]);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n if (trimmedSearch.length === 0) {\n textWhereRef.current = {};\n emitCombinedWhere();\n\n return;\n }\n\n // Wait for debounce + search results before applying text filters (avoids empty-table flash).\n if (isSearchPending) {\n return;\n }\n\n const safeResults = results ?? [];\n let nextWhere: WhereClause = {};\n\n if (safeResults.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else {\n // Prefer `_id: { in: [...] }` over one OR-eq per hit. Large OR trees break\n // offset pagination and were re-triggering endless fetchMore requests.\n const assetIds = safeResults.filter((r) => r._entityNamePlural === '_assets').map((r) => r._id);\n const tagClauses = safeResults\n .filter((r) => r._entityNamePlural === '_tags')\n .map((r) => ({ tags: { some: { _id: { eq: r._id } } } }));\n\n const orClauses: WhereClause[] = [];\n\n if (assetIds.length > 0) {\n orClauses.push({ _id: { in: assetIds } });\n }\n\n orClauses.push(...tagClauses);\n\n if (orClauses.length === 0) {\n nextWhere = { _id: { in: [] } };\n } else if (orClauses.length === 1) {\n nextWhere = orClauses[0] as WhereClause;\n } else {\n nextWhere = { OR: orClauses };\n }\n }\n\n textWhereRef.current = nextWhere;\n emitCombinedWhere();\n }, [emitCombinedWhere, isSearchPending, onSearchWhereChange, results, trimmedSearch]);\n\n // Watch column filter changes (e.g., mime type) and push server-side where\n const columnFiltersKey = JSON.stringify(table.getState().columnFilters);\n\n useEffect(() => {\n if (!onSearchWhereChange) {\n return;\n }\n\n const mimeFilter = table.getState().columnFilters.find((f) => f.id === 'mimeType');\n const mimeValues = (Array.isArray(mimeFilter?.value) ? (mimeFilter?.value as unknown[]) : []) as string[];\n\n const tagsFilter = table.getState().columnFilters.find((f) => f.id === 'tags');\n const tagValues = (Array.isArray(tagsFilter?.value) ? (tagsFilter?.value as unknown[]) : []) as string[];\n\n const clauses: WhereClause[] = [];\n\n if (mimeValues.length > 0) {\n clauses.push({ mimeType: { in: mimeValues } } as WhereClause);\n }\n\n if (tagValues.length > 0) {\n const orTags = tagValues.map((id) => ({ tags: { some: { _id: { eq: id } } } }));\n clauses.push(orTags.length === 1 ? orTags[0] : { OR: orTags });\n }\n\n if (clauses.length === 0) {\n filterWhereRef.current = {};\n } else if (clauses.length === 1) {\n filterWhereRef.current = clauses[0] as WhereClause;\n } else {\n filterWhereRef.current = { AND: clauses } as WhereClause;\n }\n\n emitCombinedWhere();\n }, [columnFiltersKey, emitCombinedWhere, onSearchWhereChange, table]);\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between fk:pr-3\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n <div className=\"fk:relative\">\n {isLoading ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n placeholder=\"Search assets...\"\n name=\"search-assets\"\n value={search}\n onChange={(e) => {\n const { value } = e.target;\n setSearch(value);\n\n if (value.trim().length === 0) {\n clearSearch();\n\n return;\n }\n\n debouncedSetSearchQuery(value.trim());\n }}\n className=\"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7\"\n />\n {search ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle\"\n onClick={clearSearch}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n ) : null}\n </div>\n {table.getColumn('mimeType') && (\n <DataTableFacetedFilter column={table.getColumn('mimeType')} options={mimeTypes} title=\"File type\" />\n )}\n {table.getColumn('tags') && (\n <DataTableFacetedFilter column={table.getColumn('tags')} options={tagOptions} title=\"Tags\" />\n )}\n {isFiltered && (\n <Button\n variant=\"ghost\"\n onClick={() => {\n table.resetColumnFilters();\n filterWhereRef.current = {};\n emitCombinedWhere();\n }}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3\"\n >\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n )}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <DropdownMenu>\n <PermissionTooltip disabled={!canMutate}>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-8 fk:mr-2 fk:lg:flex\" disabled={!canMutate} size=\"sm\" variant=\"secondary\">\n Actions <ListChecks className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n </DropdownMenuTrigger>\n </PermissionTooltip>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[240px]\">\n <DropdownMenuItem onClick={() => setTagDialogMode('add')}>\n <TagIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Add tag\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTagDialogMode('remove')}>\n <MinusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Remove tag\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleBatchDelete} className=\"fk:text-destructive\">\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" /> Delete asset{selectedIds.length > 1 ? 's' : ''} (\n {selectedIds.length})\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n ) : null}\n <div className=\"fk:ml-auto fk:flex fk:items-center fk:gap-2\">\n <ToggleGroup\n size=\"sm\"\n type=\"single\"\n value={viewMode}\n onValueChange={(value) => {\n if (value === 'list' || value === 'grid') {\n onViewModeChange(value);\n }\n }}\n >\n <ToggleGroupItem aria-label=\"Grid view\" value=\"grid\">\n <LayoutGrid className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n <ToggleGroupItem aria-label=\"List view\" value=\"list\">\n <List className=\"fk:h-4 fk:w-4\" />\n </ToggleGroupItem>\n </ToggleGroup>\n <PermissionTooltip disabled={!canMutate}>\n <Button\n aria-busy={isUploading}\n className=\"fk:h-8 fk:lg:flex\"\n disabled={!canMutate || isUploading}\n onClick={onUploadClick}\n size=\"sm\"\n variant=\"default\"\n >\n {isUploading ? <LoaderCircle className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" /> : null}\n Upload assets\n </Button>\n </PermissionTooltip>\n </div>\n\n {tagDialogMode !== null ? (\n <AssetTagDialogs\n assetIds={selectedIds}\n mode={tagDialogMode}\n onCompleted={() => table.resetRowSelection()}\n onModeChange={setTagDialogMode}\n />\n ) : null}\n </div>\n );\n}\n\ntype DebouncedFn<TArgs extends unknown[]> = ((...args: TArgs) => void) & {\n cancel: () => void;\n};\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = function (this: unknown, ...args: TArgs) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn.apply(this, args);\n }, ms);\n } as DebouncedFn<TArgs>;\n\n debounced.cancel = () => {\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n return debounced;\n}\n","import { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useCanMutate } from '../../../core/permissions';\nimport { useUploadAssets } from '../../../core/upload';\n\nconst MAX_UPLOAD_BYTES = 4 * 1024 * 1024;\n\nexport function useAssetManagerUpload(): {\n canMutate: boolean;\n isUploading: boolean;\n uploadFiles: (files: File[]) => Promise<void>;\n uploadFromDialog: () => Promise<void>;\n} {\n const { projectId } = useParams();\n const uploadAssets = useUploadAssets();\n const canMutate = useCanMutate();\n const [isUploading, setIsUploading] = useState(false);\n\n async function runUpload(files?: File[]): Promise<void> {\n if (!canMutate || isUploading) {\n return;\n }\n\n if (files && files.length === 0) {\n return;\n }\n\n try {\n await uploadAssets({\n files,\n maxBytes: MAX_UPLOAD_BYTES,\n multiple: true,\n onUploadStart: () => {\n setIsUploading(true);\n },\n projectId,\n });\n } finally {\n setIsUploading(false);\n }\n }\n\n return {\n canMutate,\n isUploading,\n uploadFiles: (files) => runUpload(files),\n uploadFromDialog: () => runUpload(),\n };\n}\n","export type AssetViewMode = 'list' | 'grid';\n\nconst VIEW_MODE_STORAGE_KEY = 'flexkit-asset-manager:viewMode';\n\nexport function getStoredViewMode(): AssetViewMode {\n if (typeof localStorage === 'undefined') {\n return 'grid';\n }\n\n try {\n const stored = localStorage.getItem(VIEW_MODE_STORAGE_KEY);\n\n if (stored === 'list' || stored === 'grid') {\n return stored;\n }\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n\n return 'grid';\n}\n\nexport function setStoredViewMode(mode: AssetViewMode): void {\n if (typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n localStorage.setItem(VIEW_MODE_STORAGE_KEY, mode);\n } catch {\n // Ignore storage access errors (private mode, blocked storage, etc.)\n }\n}\n","import { useCallback, useMemo, useState, type JSX } from 'react';\nimport { useLocation, Outlet } from 'react-router-dom';\nimport type { ColumnDef, SortingState, Updater } from '@tanstack/react-table';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { DataTable } from '../../data-grid/data-table';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton } from '../../ui';\nimport { AssetDropZone } from './data-grid/asset-drop-zone';\nimport { AssetGrid } from './data-grid/asset-grid';\nimport { DataTableToolbar } from './data-grid/data-table-toolbar';\nimport { AssetRowActions } from './data-grid/asset-row-actions';\nimport { useAssetManagerUpload } from './data-grid/use-asset-manager-upload';\nimport { getStoredViewMode, setStoredViewMode, type AssetViewMode } from './data-grid/view-mode';\n\ntype WhereClause = { [key: string]: unknown };\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const entityName = '_assets';\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const [sorting, setSorting] = useState<SortingState>([]);\n const [viewMode, setViewMode] = useState<AssetViewMode>(() => getStoredViewMode());\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: assetSchema.attributes,\n actionsComponent: (row) => <AssetRowActions row={row} />,\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const [searchWhere, setSearchWhere] = useState<WhereClause>({});\n const [isSearchLoading, setIsSearchLoading] = useState(false);\n const { canMutate, isUploading, uploadFiles, uploadFromDialog } = useAssetManagerUpload();\n\n const where = useMemo(() => {\n const whereBase = entityId ? { _id: { eq: entityId } } : { NOT: { path: { eq: null } } };\n\n if (!searchWhere || Object.keys(searchWhere).length === 0) {\n return whereBase;\n }\n\n if (entityId) {\n return whereBase; // ignore search when a single asset is selected via id\n }\n\n return { AND: [whereBase, searchWhere] } as WhereClause;\n }, [entityId, searchWhere]);\n\n const graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n\n const variables = useMemo(() => ({ where, offset: 0, limit: pageSize, sort: graphqlSort }), [where, graphqlSort]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n function handleViewModeChange(mode: AssetViewMode): void {\n setViewMode(mode);\n setStoredViewMode(mode);\n }\n\n const { isLoading, isLoadingMore, fetchMore, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n const isInitialLoading = isSearchLoading || (isLoading && (data == null || data.length === 0));\n\n const rowsCount = data?.length ?? 0;\n const hasMore = !isSearchLoading && count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const loadingData = useMemo(\n () => Array.from({ length: pageSize }, (_, index) => ({ _id: `loading-${index}` }) as AttributeValue),\n []\n );\n const loadingColumns = useMemo(() => getLoadingColumns(columnsDefinition), [columnsDefinition]);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:pl-3\">\n <SchemaError />\n <div className=\"fk:mb-4 fk:flex fk:items-center fk:gap-2 fk:pr-3\">\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Asset Manager</h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <AssetDropZone disabled={!canMutate || isUploading} onDropFiles={uploadFiles}>\n {viewMode === 'list' ? (\n <DataTable\n classNames={{ row: 'fk:h-20' }}\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n ) : (\n <AssetGrid\n columns={columnsDefinition}\n data={isInitialLoading ? [] : ((data ?? []) as AttributeValue[])}\n entityName={assetSchema.name}\n hasMore={hasMore}\n isLoading={isInitialLoading}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={assetSchema.name}\n isUploading={isUploading}\n table={table}\n viewMode={viewMode}\n onSearchLoadingChange={setIsSearchLoading}\n onSearchWhereChange={setSearchWhere}\n onUploadClick={uploadFromDialog}\n onViewModeChange={handleViewModeChange}\n />\n )}\n />\n )}\n </AssetDropZone>\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n","'use client';\n\nimport { JSX } from 'react';\nimport { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../../ui';\nimport { Sidebar } from './sidebar';\nimport { List } from './list';\n\nexport function Root(): JSX.Element {\n return (\n <ResizablePanelGroup orientation=\"horizontal\" className=\"fk:h-full\">\n <ResizablePanel className=\"fk:p-3\" defaultSize=\"82%\">\n <div className=\"fk:flex fk:flex-col fk:h-full\">\n <List />\n </div>\n </ResizablePanel>\n <ResizableHandle className=\"fk:hover:bg-blue-500 fk:transition-colors\" withHandle />\n <ResizablePanel defaultSize=\"18%\" minSize=\"10%\">\n <div className=\"fk:sm:hidden fk:md:block\">\n <Sidebar />\n </div>\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n}\n"]}
|
package/dist/root-JB3NZZNZ.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import'./index.css';import {f}from'./chunk-C47FNPLK.js';import'./chunk-TYDYAOQ7.js';import {x,y as y$1,ga,ha,ia,ja,z}from'./chunk-YCCFUGWJ.js';import {v,w,x as x$1}from'./chunk-32ZU4MLE.js';import'./chunk-HDOIOXMP.js';import'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import {b,c,e}from'./chunk-USNXQOMJ.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useMemo,useState,useRef,useEffect,Children,useCallback,Fragment as Fragment$1}from'react';import {createGraphiQLFetcher}from'@graphiql/toolkit';import {GraphiQLProvider,useEditorContext,useExecutionContext,useSchemaContext,useStorageContext,usePluginContext,useCopyQuery,useMergeQuery,usePrettifyEditors,useTheme,ToolbarButton,PrettifyIcon,MergeIcon,CopyIcon,Tooltip,UnStyledButton,PlusIcon,ReloadIcon,KeyboardShortcutIcon,SettingsIcon,Tabs,Tab,QueryEditor,ExecuteButton,VariableEditor,Spinner,ResponseEditor,Dialog,ButtonGroup,Button,isMacOs}from'@graphiql/react';import {HISTORY_PLUGIN,HistoryContextProvider}from'@graphiql/plugin-history';import {ChevronsRight,ChevronsLeft}from'lucide-react';import {jsx,Fragment,jsxs}from'react/jsx-runtime';import'@graphiql/react/style.css';import'@graphiql/plugin-history/style.css';function y({dangerouslyAssumeSchemaIsValid:t,confirmCloseTab:i,defaultQuery:n,defaultTabs:l,externalFragments:f,fetcher:s,getDefaultFieldNames:d,headers:E,inputValueDeprecation:k,introspectionQueryName:M,maxHistoryLength:h,onEditOperationName:A,onSchemaChange:O,onTabChange:B,onTogglePluginVisibility:T,operationName:L,plugins:p,query:C,response:v,schema:R,schemaDescription:I,shouldPersistHeaders:Q,storage:z,validationRules:w,variables:F,visiblePlugin:D,defaultHeaders:U,...m}){if(typeof s!="function")throw new TypeError("The `GraphiQL` component requires a `fetcher` function to be passed as prop.");let V=useMemo(()=>{let S=p??[];return S.some($=>$.title===HISTORY_PLUGIN.title)?S:[HISTORY_PLUGIN,...S]},[p]);return jsx(GraphiQLProvider,{getDefaultFieldNames:d,dangerouslyAssumeSchemaIsValid:t,defaultQuery:n,defaultHeaders:U,defaultTabs:l,externalFragments:f,fetcher:s,headers:E,inputValueDeprecation:k,introspectionQueryName:M,onEditOperationName:A,onSchemaChange:O,onTabChange:B,onTogglePluginVisibility:T,plugins:V,visiblePlugin:D,operationName:L,query:C,response:v,schema:R,schemaDescription:I,shouldPersistHeaders:Q,storage:z,validationRules:w,variables:F,children:jsx(HistoryContextProvider,{maxHistoryLength:h,children:jsx(lt,{confirmCloseTab:i,showPersistHeadersSettings:Q!==false,disableTabs:m.disableTabs??false,forcedTheme:m.forcedTheme,...m})})})}y.Toolbar=ge;y.Footer=ye;var at=["light","dark","system"],H="graphiql-session-tab-",pe="flexkit-explorer:layout",me=3;function it(t){if(typeof t=="number")return t;if(typeof t!="object"||t===null||!("asPercentage"in t))return;let i=t.asPercentage;if(typeof i=="number")return i}function ot(t){return !t||typeof t!="object"||Array.isArray(t)?false:Object.values(t).every(i=>typeof i=="number")}function nt(t){if(typeof window>"u")return;let i=window.localStorage.getItem(t);if(i)try{let n=JSON.parse(i);if(ot(n))return n}catch{return}}function rt(t,i){if(!(typeof window>"u"))try{window.localStorage.setItem(t,JSON.stringify(i));}catch{}}function lt(t){let i=useEditorContext({nonNull:true}),n=useExecutionContext({nonNull:true}),l=useSchemaContext({nonNull:true}),f=useStorageContext(),s=usePluginContext(),[d,E]=useState(false),k=useRef(null),M=useMemo(()=>nt(pe),[]),h=useMemo(()=>t.forcedTheme&&at.includes(t.forcedTheme)?t.forcedTheme:void 0,[t.forcedTheme]),A=useCopyQuery({onCopyQuery:t.onCopyQuery}),O=useMergeQuery(),B=usePrettifyEditors(),{setTheme:T}=useTheme(t.defaultTheme);useEffect(()=>{h==="system"?T(null):(h==="light"||h==="dark")&&T(h);},[h,T]),useEffect(()=>{s?.setVisiblePlugin(s.plugins[0]);},[s]);let[L,p]=useState(null),[C,v$1]=useState(null),R=Children.toArray(t.children),I=R.find(a=>be(a,y.Toolbar))??jsxs(Fragment,{children:[jsx(ToolbarButton,{onClick:B,label:"Prettify query (Shift-Ctrl-P)",children:jsx(PrettifyIcon,{className:"fk:w-6 fk:h-6 fk:block","aria-hidden":"true"})}),jsx(ToolbarButton,{onClick:O,label:"Merge fragments into query (Shift-Ctrl-M)",children:jsx(MergeIcon,{className:"fk:w-6 fk:h-6 fk:block","aria-hidden":"true"})}),jsx(ToolbarButton,{onClick:A,label:"Copy query (Shift-Ctrl-C)",children:jsx(CopyIcon,{className:"fk:w-6 fk:h-6 fk:block","aria-hidden":"true"})}),t.toolbar?.additionalContent,t.toolbar?.additionalComponent&&jsx(t.toolbar.additionalComponent,{})]}),Q=R.find(a=>be(a,y.Footer)),z$1=useCallback(()=>{try{f?.clear(),v$1("success");}catch{v$1("error");}},[f]),w$1=useCallback(a=>{i.setShouldPersistHeaders(a.currentTarget.dataset.value==="true");},[i]),F=()=>{i.addTab();},D=()=>{l.introspect();},U=a=>{i.moveTab(a);},m=useCallback(a=>{p(a.currentTarget.dataset.value);},[]),V=useCallback(a=>{let r=s,u=Number(a.currentTarget.dataset.index);if(!r)return;let x=r.plugins.find((mt,xe)=>u===xe)??null;if(x===r.visiblePlugin){r.setVisiblePlugin(null);return}r.setVisiblePlugin(x);},[s]),S=useCallback(a=>{a||p(null);},[]),$=useCallback(a=>{a||(p(null),v$1(null));},[]),ke=jsx(Tooltip,{label:"Add tab",children:jsx(UnStyledButton,{type:"button",className:"graphiql-tab-add",onClick:F,"aria-label":"Add tab",children:jsx(PlusIcon,{"aria-hidden":"true"})})}),Te=t.className?` ${t.className}`:"",_=t.confirmCloseTab,Ce=useCallback(async a=>{let r=a.currentTarget.previousSibling,u=Number(r.id.replace(H,""));(!_||await _(u))&&(i.activeTabIndex===u&&n.stop(),i.closeTab(u));},[_,i,n]),ve=useCallback(a=>{let r=Number(a.currentTarget.id.replace(H,""));n.stop(),i.changeTab(r);},[i,n]),Se=useCallback(a=>{rt(pe,a);},[]);return jsx(Tooltip.Provider,{children:jsxs("div",{className:`graphiql-container${Te}`,children:[jsxs(x,{className:"fk:h-full fk:max-h-full",defaultLayout:M,id:"explorer",onLayoutChanged:Se,orientation:"horizontal",children:[jsxs(y$1,{collapsible:true,collapsedSize:`${me}%`,defaultSize:"22%",id:"explorer-sidebar",minSize:"10%",onResize:a=>{let r=k.current;if(r){E(r.isCollapsed());return}let u=it(a);u!==void 0&&E(u<=me);},panelRef:k,children:[jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:pb-6",children:jsxs(ga,{className:"fk:w-full",defaultValue:s?.plugins[0].title,children:[jsxs("div",{className:`fk:flex fk:items-center fk:py-1 ${d?"":"fk:px-3"}`,children:[jsx(ha,{className:d?"fk:hidden":"",children:s?.plugins.map((a,r)=>{let x=`${a===s.visiblePlugin?"Hide":"Show"} ${a.title}`;return jsx(ia,{"aria-label":x,className:"fk:text-muted-foreground","data-index":r,onClick:V,value:a.title,children:jsx(a.icon,{"aria-hidden":"true"})},a.title)})}),jsxs(b,{children:[jsx(c,{asChild:true,children:jsx(b$1,{className:d?"fk:ml-1.5":"fk:ml-auto",onClick:()=>{let a=k.current;d?a?.expand():a?.collapse();},size:"icon",variant:"ghost",children:d?jsxs(Fragment,{children:[jsx(ChevronsRight,{className:"fk:w-4 fk:h-4"}),jsx("span",{className:"fk:sr-only",children:"Expand"})]}):jsxs(Fragment,{children:[jsx(ChevronsLeft,{className:"fk:w-4 fk:h-4"}),jsx("span",{className:"fk:sr-only",children:"Collapse"})]})})}),jsx(e,{children:d?"Expand":"Collapse"})]})]}),d?null:jsx(v,{}),s?.plugins.map(a=>jsx(ja,{className:`fk:flex fk:w-full fk:max-h-full fk:mt-0 ${d?"fk:hidden":""}`,value:a.title,children:jsxs(w,{className:"fk:flex fk:w-full fk:max-h-full fk:overflow-auto fk:pl-3 fk:pr-6 fk:pt-3 fk:pb-6 fk:mb-3 fk:[&>div>div]:block!",children:[jsx(a.content,{}),jsx(x$1,{orientation:"horizontal"})]})},a.title))]})}),jsx(Tooltip,{label:"Re-fetch GraphQL schema",children:jsx(UnStyledButton,{type:"button",disabled:l.isFetching,onClick:D,"aria-label":"Re-fetch GraphQL schema",children:jsx(ReloadIcon,{className:l.isFetching?"graphiql-spin":"","aria-hidden":"true"})})}),jsx(Tooltip,{label:"Open short keys dialog",children:jsx(UnStyledButton,{type:"button","data-value":"short-keys",onClick:m,"aria-label":"Open short keys dialog",children:jsx(KeyboardShortcutIcon,{"aria-hidden":"true"})})}),jsx(Tooltip,{label:"Open settings dialog",children:jsx(UnStyledButton,{type:"button","data-value":"settings",onClick:m,"aria-label":"Open settings dialog",children:jsx(SettingsIcon,{"aria-hidden":"true"})})})]}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(y$1,{className:"fk:bg-muted",defaultSize:"40%",id:"explorer-editor",children:jsxs("div",{className:"fk:flex fk:flex-col fk:h-full",children:[jsxs("div",{className:"fk:flex fk:items-center fk:py-1 fk:px-4 fk:gap-6 fk:bg-muted",children:[!t.disableTabs&&jsx(Tabs,{"aria-label":"Select active operation",className:"fk:p-1! fk:bg-muted fk:rounded-md",onReorder:U,values:i.tabs,children:i.tabs.length>0&&jsx(Fragment,{children:i.tabs.map((a,r)=>jsxs(Tab,{isActive:r===i.activeTabIndex,value:a,children:[jsx(Tab.Button,{"aria-controls":"graphiql-session",id:`${H}${r.toString()}`,onClick:ve,children:a.title}),jsx(Tab.Close,{onClick:Ce})]},a.id))})}),ke]}),jsx("div",{role:"tabpanel",id:"graphiql-session",className:"graphiql-session","aria-labelledby":`${H}${i.activeTabIndex}`,children:jsx("div",{className:`graphiql-editors${i.tabs.length===1?" full-height":""}`,children:jsxs(x,{orientation:"vertical",children:[jsxs(y$1,{className:"fk:flex fk:w-full fk:gap-x-4 fk:px-4 fk:py-2",defaultSize:"80%",children:[jsx(QueryEditor,{editorTheme:t.editorTheme,keyMap:t.keyMap,onCopyQuery:t.onCopyQuery,onEdit:t.onEditQuery,readOnly:t.readOnly}),jsxs("div",{className:"graphiql-toolbar",role:"toolbar","aria-label":"Editor Commands",children:[jsx(ExecuteButton,{}),I]})]}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsxs(y$1,{className:"fk:bg-muted fk:px-4 fk:pt-2",defaultSize:"20%",children:[jsx("div",{className:"fk:text-sm fk:font-medium fk:text-muted-foreground",children:"Variables"}),jsx(VariableEditor,{editorTheme:t.editorTheme,isHidden:false,keyMap:t.keyMap,onEdit:t.onEditVariables,readOnly:t.readOnly})]})]})})})]})}),jsx(z,{className:"fk:hover:bg-blue-500 fk:transition-colors",withHandle:true}),jsx(y$1,{className:"fk:px-5 fk:pt-10 fk:relative",defaultSize:"38%",id:"explorer-response",children:jsxs("div",{className:"graphiql-response fk:h-full",children:[n.isFetching?jsx(Spinner,{}):null,jsx(ResponseEditor,{editorTheme:t.editorTheme,responseTooltip:t.responseTooltip,keyMap:t.keyMap}),Q]})})]}),jsxs(Dialog,{open:L==="short-keys",onOpenChange:S,children:[jsxs("div",{className:"graphiql-dialog-header",children:[jsx(Dialog.Title,{className:"graphiql-dialog-title",children:"Short Keys"}),jsx(Dialog.Close,{})]}),jsx("div",{className:"graphiql-dialog-section",children:jsx(dt,{keyMap:t.keyMap||"sublime"})})]}),jsxs(Dialog,{open:L==="settings",onOpenChange:$,children:[jsxs("div",{className:"graphiql-dialog-header",children:[jsx(Dialog.Title,{className:"graphiql-dialog-title",children:"Settings"}),jsx(Dialog.Close,{})]}),t.showPersistHeadersSettings?jsxs("div",{className:"graphiql-dialog-section",children:[jsxs("div",{children:[jsx("div",{className:"graphiql-dialog-section-title",children:"Persist headers"}),jsxs("div",{className:"graphiql-dialog-section-caption",children:["Save headers upon reloading."," ",jsx("span",{className:"graphiql-warning-text",children:"Only enable if you trust this device."})]})]}),jsxs(ButtonGroup,{children:[jsx(Button,{type:"button",id:"enable-persist-headers",className:i.shouldPersistHeaders?"active":"","data-value":"true",onClick:w$1,children:"On"}),jsx(Button,{type:"button",id:"disable-persist-headers",className:i.shouldPersistHeaders?"":"active",onClick:w$1,children:"Off"})]})]}):null,f?jsxs("div",{className:"graphiql-dialog-section",children:[jsxs("div",{children:[jsx("div",{className:"graphiql-dialog-section-title",children:"Clear storage"}),jsx("div",{className:"graphiql-dialog-section-caption",children:"Remove all locally stored data and start fresh."})]}),jsx(Button,{type:"button",state:C||void 0,disabled:C==="success",onClick:z$1,children:{success:"Cleared data",error:"Failed"}[C]||"Clear data"})]}):null]})]})})}var Y=isMacOs?"\u2318":"Ctrl",st=Object.entries({"Search in editor":[Y,"F"],"Search in documentation":[Y,"K"],"Execute query":[Y,"Enter"],"Prettify editors":["Ctrl","Shift","P"],"Merge fragments definitions into operation definition":["Ctrl","Shift","M"],"Copy query":["Ctrl","Shift","C"],"Re-fetch schema using introspection":["Ctrl","Shift","R"]});function dt({keyMap:t}){return jsxs("div",{children:[jsxs("table",{className:"graphiql-table",children:[jsx("thead",{children:jsxs("tr",{children:[jsx("th",{children:"Short Key"}),jsx("th",{children:"Function"})]})}),jsx("tbody",{children:st.map(([i,n])=>jsxs("tr",{children:[jsx("td",{children:n.map((l,f,s)=>jsxs(Fragment$1,{children:[jsx("code",{className:"graphiql-key",children:l}),f!==s.length-1&&" + "]},l))}),jsx("td",{children:i})]},i))})]}),jsxs("p",{children:["The editors use"," ",jsx("a",{href:"https://codemirror.net/5/doc/manual.html#keymaps",target:"_blank",rel:"noopener noreferrer",children:"CodeMirror Key Maps"})," ","that add more short keys. This instance of Graph",jsx("em",{children:"i"}),"QL uses ",jsx("code",{children:t}),"."]})]})}function ge(t){return jsx(Fragment,{children:t.children})}ge.displayName="GraphiQLToolbar";function ye(t){return jsx("div",{className:"graphiql-footer",children:t.children})}ye.displayName="GraphiQLFooter";function be(t,i){let n=typeof t=="object"&&t!==null?t:null;if(!n)return false;let l=n.type;return typeof l=="object"&&l!==null&&"displayName"in l&&typeof l.displayName=="string"&&l.displayName===i.displayName?true:n.type===i}var ft=`# Welcome to Flexkit Explorer
|
|
2
|
-
#
|
|
3
|
-
# Explorer is an in-browser tool for writing, validating, and
|
|
4
|
-
# testing GraphQL queries against your Flexkit datasource.
|
|
5
|
-
#
|
|
6
|
-
# Type queries into this side of the screen, and you will see intelligent
|
|
7
|
-
# typeaheads aware of the current GraphQL schema and live syntax and
|
|
8
|
-
# validation errors highlighted within the text.
|
|
9
|
-
#
|
|
10
|
-
# GraphQL queries typically start with a "{" character. Lines that start
|
|
11
|
-
# with a # are ignored.
|
|
12
|
-
#
|
|
13
|
-
# An example GraphQL query might look like:
|
|
14
|
-
#
|
|
15
|
-
# {
|
|
16
|
-
# field(arg: "value") {
|
|
17
|
-
# subField
|
|
18
|
-
# }
|
|
19
|
-
# }
|
|
20
|
-
#
|
|
21
|
-
# Keyboard shortcuts:
|
|
22
|
-
#
|
|
23
|
-
# Prettify query: Shift-Ctrl-P (or press the prettify button)
|
|
24
|
-
#
|
|
25
|
-
# Merge fragments: Shift-Ctrl-M (or press the merge button)
|
|
26
|
-
#
|
|
27
|
-
# Run Query: Ctrl-Enter (or press the play button)
|
|
28
|
-
#
|
|
29
|
-
# Auto Complete: Ctrl-Space (or just start typing)
|
|
30
|
-
#`;function Qt(){let{currentProjectId:t}=f(),i=`/api/flexkit/${t}/graphql`,n=useMemo(()=>createGraphiQLFetcher({url:i}),[i]);return jsx(y,{fetcher:n,forcedTheme:"light",defaultQuery:ft})}export{Qt as Root};//# sourceMappingURL=root-JB3NZZNZ.js.map
|
|
31
|
-
//# sourceMappingURL=root-JB3NZZNZ.js.map
|
package/dist/root-RE3ZNXQ3.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import'./index.css';import {c}from'./chunk-2DXR5NJV.js';import {f}from'./chunk-C47FNPLK.js';import {h}from'./chunk-TYDYAOQ7.js';import {L,Y,P}from'./chunk-YCCFUGWJ.js';import'./chunk-32ZU4MLE.js';import'./chunk-HDOIOXMP.js';import'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {Outlet}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';var S="flexkit:sidebar:state";function A(){let[,a]=h(),{currentProject:t}=f(),c$1=t?.schema??[],u=t?.menuGroups??[],p=c(c$1,a.user?.spaces),f$1=document.cookie.split("; ").find(d=>d.startsWith(`${S}=`))?.split("=")[1]!=="false";return jsxs(L,{defaultOpen:f$1,children:[jsx(Y,{schema:p,menuGroups:u}),jsx(P,{children:jsx(Outlet,{})})]})}export{A as Root};//# sourceMappingURL=root-RE3ZNXQ3.js.map
|
|
2
|
-
//# sourceMappingURL=root-RE3ZNXQ3.js.map
|
package/dist/search-WUO6VWKU.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import'./index.css';import {a}from'./chunk-7IHEL6LU.js';import'./chunk-P6BZ4QP7.js';import'./chunk-C47FNPLK.js';import'./chunk-TYDYAOQ7.js';import {z,m,w,q,p,r,t,b as b$1}from'./chunk-32ZU4MLE.js';import {a as a$1,d,c,e,g}from'./chunk-HDOIOXMP.js';import'./chunk-U45E5X3H.js';import {b}from'./chunk-6NRQMG26.js';import {a as a$2}from'./chunk-O2QMYUPS.js';import {useState,useMemo,useRef}from'react';import {LoaderCircle,Search,X}from'lucide-react';import {Command}from'cmdk';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';var i="all";function ee(t){let n=t.replace(/([A-Z])/g," $1");return n.charAt(0).toUpperCase()+n.slice(1).trim()}function re(t){return t.filter(n=>n.attributes.some(a=>a.searchable))}function te(t,n){return n===i?t.map(a=>a.plural):t.filter(a=>a.plural===n).map(a=>a.plural)}function ne(t,n){return n===i?i:t.some(a=>a.plural===n)?n:i}function ae(t,n){return {searchRequests:{searches:t.map(a=>({collection:a}))},commonParams:{q:n}}}function oe(t){return t.menu?.label??ee(t.plural)}function be({onSelect:t$1,searchPlaceholder:n="Search...",noResultsMsg:a$3="Nothing found",className:_,onSearchChange:y,projectId:V,schema:v}){let[D,l]=useState(false),[s,S]=useState(""),[G,M]=useState(i),f=useMemo(()=>re(v),[v]),m$1=ne(f,G),C=useMemo(()=>te(f,m$1),[f,m$1]),X$1=useMemo(()=>ae(C,s),[C,s]),c$1=useRef(null),{results:k,isLoading:d$1}=a(V,X$1),j=D&&(k.length>0||!d$1),z$1=useNavigate();function F(e){S(e),e.length>0&&l(true),e.length===0&&l(false),y&&y(e);}function J(e){M(e),s.length>0&&l(true);}function U(){S(""),l(false),c$1.current&&(c$1.current.value="");let e=new URL(window.location.href);e.searchParams.has("id")&&(e.searchParams.delete("id"),z$1(e.pathname+e.search));}return jsxs(z,{children:[jsxs(a$1,{onValueChange:J,value:m$1,children:[jsx(d,{"aria-label":"Filter search by entity",className:"fk:w-36 fk:h-9 fk:py-1 fk:rounded-r-none fk:border-border fk:shadow-none fk:corner-squircle",children:jsx(c,{})}),jsxs(e,{children:[jsx(g,{value:i,children:"All"}),f.map(e=>jsx(g,{value:e.plural,children:oe(e)},e.plural))]})]}),jsxs(m,{className:"fk:relative fk:overflow-visible fk:h-auto fk:justify-center fk:rounded-none fk:bg-transparent fk:corner-squircle",onBlur:()=>{setTimeout(()=>{l(false);},300);},onKeyDown:e=>{e.key==="Escape"&&(e.preventDefault(),l(false));},shouldFilter:false,children:[jsxs("div",{className:a$2("fk:flex fk:items-center fk:border-y fk:border-r fk:border-border fk:rounded-r-md fk:bg-background fk:pl-3 fk:pr-2 fk:h-9 fk:md:w-25 fk:lg:w-75 fk:corner-squircle","fk:outline-none fk:transition-[color,box-shadow] fk:has-[input:focus-visible]:border-ring fk:has-[input:focus-visible]:ring-[3px] fk:has-[input:focus-visible]:ring-ring/50"),children:[d$1?jsx(LoaderCircle,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin"}):jsx(Search,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50"}),jsx(Command.Input,{className:a$2("fk:flex fk:h-9 fk:w-full fk:rounded-none fk:bg-transparent fk:py-1 fk:text-sm fk:outline-hidden fk:placeholder:text-muted-foreground fk:disabled:cursor-not-allowed fk:disabled:opacity-50 fk:corner-squircle",_),placeholder:n,onMouseDown:()=>{(c$1.current?.value.length??0)>0&&l(true);},onValueChange:F,ref:c$1,value:s}),s&&jsx(b,{"aria-label":"Clear search",className:"fk:flex fk:items-center fk:justify-center fk:ml-2 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle",onClick:U,type:"button",children:jsx(X,{className:"fk:h-4 fk:w-4"})})]}),jsx("div",{className:"fk:relative fk:max-w-150",children:jsx("div",{className:a$2("fk:mt-1 fk:animate-in fk:fade-in-0 fk:zoom-in-95 fk:absolute fk:top-0 fk:z-50 fk:w-full fk:rounded-md fk:bg-popover fk:outline-hidden fk:drop-shadow-md fk:border fk:border-border fk:corner-squircle",j?"fk:block":"fk:hidden"),children:jsxs(w,{className:"fk:max-h-55 fk:overflow-auto",children:[!d$1&&jsx(q,{children:a$3}),jsx(p,{children:jsxs(r,{children:[k.length>0&&jsx(t,{"aria-hidden":"true",className:"fk:hidden!",value:"-"}),k.map(e=>jsxs(t,{className:"fk:flex",value:e._id,onSelect:H=>{t$1({entityName:e._entityName,entityNamePlural:e._entityNamePlural,entityId:H});},children:[jsx("span",{className:"fk:basis-full",children:e[Object.keys(e)[3]]}),jsx(b$1,{className:"fk:py-px fk:text-[0.6875rem] fk:leading-3 fk:bg-teal-400",children:e._entityName})]},e._id))]})})]})})})]})]})}export{be as Search};//# sourceMappingURL=search-WUO6VWKU.js.map
|
|
2
|
-
//# sourceMappingURL=search-WUO6VWKU.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import'./index.css';import {b as b$1}from'./chunk-BOXFB6E6.js';import'./chunk-KXAGLQ2B.js';import {f,g,d as d$1}from'./chunk-2HSIWUH3.js';import {b}from'./chunk-V64P56OA.js';import {f as f$1}from'./chunk-C47FNPLK.js';import {h}from'./chunk-TYDYAOQ7.js';import {Rc,Tc,s,ma,oa,N,e as e$2,ga,ha,ia}from'./chunk-YCCFUGWJ.js';import {v,w,b as b$4}from'./chunk-32ZU4MLE.js';import {a,d,c,e,g as g$1}from'./chunk-HDOIOXMP.js';import {t}from'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';import {b as b$3,c as c$1,e as e$1}from'./chunk-USNXQOMJ.js';import {b as b$2}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useRef,useMemo,useEffect}from'react';import {Plus,LoaderCircle,Trash2,GraduationCapIcon,ArrowLeft,Info,PenLine,Eye}from'lucide-react';import Pt from'react-markdown';import {useNavigate,Link,useParams}from'react-router-dom';import ve from'swr';import At from'swr/infinite';import {history,defaultKeymap,historyKeymap,indentWithTab}from'@codemirror/commands';import {markdown}from'@codemirror/lang-markdown';import {languages}from'@codemirror/language-data';import {foldGutter,indentOnInput,bracketMatching,foldKeymap}from'@codemirror/language';import {highlightSelectionMatches,searchKeymap}from'@codemirror/search';import {Compartment,EditorState,Prec}from'@codemirror/state';import {EditorView,lineNumbers,highlightActiveLineGutter,highlightSpecialChars,drawSelection,dropCursor,highlightActiveLine,keymap,placeholder}from'@codemirror/view';import {tags}from'@lezer/highlight';import {createTheme}from'@uiw/codemirror-themes';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var je="var(--font-geist-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",Q="#212121",Y="#fafafa";function ze(t,i,o){return [t,EditorView.theme({"&":{backgroundColor:i},".cm-scroller":{backgroundColor:i},".cm-gutters":{backgroundColor:o}})]}var ce=ze(createTheme({settings:{background:Q,caret:"#f8f8f0",fontFamily:je,foreground:"#f8f8f2",gutterBackground:Q,gutterBorder:"transparent",gutterForeground:"#6d8a88",lineHighlight:"rgba(255, 255, 255, 0.1)",selection:"rgba(255, 255, 255, 0.1)",selectionMatch:"rgba(255, 255, 255, 0.2)"},styles:[{color:"#6272a4",tag:[tags.comment,tags.quote,tags.strikethrough]},{color:"#6272a4",tag:[tags.meta,tags.processingInstruction]},{color:"#f1fa8c",tag:tags.string},{color:"#f91f6f",tag:[tags.atom,tags.bool,tags.number,tags.heading]},{color:"#ff79c6",tag:[tags.keyword,tags.operator,tags.tagName]},{color:"#8be9fd",tag:[tags.typeName,tags.link,tags.url]},{color:"#009fb8",tag:[tags.className,tags.attributeName,tags.monospace]},{color:"#66d9ef",tag:[tags.propertyName,tags.function(tags.propertyName)]},{color:"#009fb8",tag:[tags.definition(tags.variableName),tags.function(tags.variableName)]},{color:"#0072f5",tag:[tags.strong,tags.emphasis]},{color:"#ff5555",tag:tags.invalid}],theme:"dark"}),Q,Q),de=ze(createTheme({settings:{background:Y,caret:"#526fff",fontFamily:je,foreground:"#383a42",gutterBackground:Y,gutterBorder:"transparent",gutterForeground:"#9d9d9f",lineHighlight:"#383a420c",selection:"#e5e5e6",selectionMatch:"#e5e5e6"},styles:[{color:"#a0a1a7",tag:[tags.comment,tags.quote,tags.strikethrough]},{color:"#a0a1a7",tag:[tags.meta,tags.processingInstruction]},{color:"#50a14f",tag:tags.string},{color:"#986801",tag:[tags.attributeName]},{color:"#a626a4",tag:tags.keyword},{color:"#0072f5",tag:[tags.operator,tags.strong,tags.emphasis]},{color:"#f91f6f",tag:[tags.atom,tags.bool,tags.number,tags.heading]},{color:"#c18401",tag:[tags.typeName,tags.className]},{color:"#009fb8",tag:[tags.tagName,tags.propertyName,tags.monospace]},{color:"#4078f2",tag:[tags.link,tags.url,tags.function(tags.variableName),tags.definition(tags.variableName)]},{color:"#f91f6f",tag:tags.invalid}],theme:"light"}),Y,Y);function me(){let t=document.documentElement;return t.getAttribute("data-theme")==="dark"||t.classList.contains("dark")||t.style.colorScheme==="dark"}var xt=EditorView.theme({"&":{fontSize:"13px",height:"100%",maxHeight:"100%",maxWidth:"100%",minHeight:"0",minWidth:"0",width:"100%"},"&.cm-focused":{outline:"none"},".cm-scroller":{height:"100%",lineHeight:"1.6",minHeight:"0",minWidth:"0",overflow:"auto",width:"100%"},".cm-content":{fontSize:"13px",fontStyle:"normal",fontWeight:"400",minWidth:"0 !important",padding:"12px 0"},".cm-line, .cm-line span":{fontSize:"inherit",fontStyle:"inherit",fontWeight:"inherit",lineHeight:"inherit"},".cm-gutters":{borderRight:"1px solid transparent"},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none"}});function ue(t){return [t?ce:de,xt]}function He(t){return [EditorState.readOnly.of(t),EditorView.editable.of(!t)]}function Oe(t){let i={"aria-multiline":"true",role:"textbox"};return t.ariaLabel&&(i["aria-label"]=t.ariaLabel),t.ariaLabelledBy&&(i["aria-labelledby"]=t.ariaLabelledBy),t.ariaDescribedBy&&(i["aria-describedby"]=t.ariaDescribedBy),t.ariaInvalid&&(i["aria-invalid"]="true"),t.readOnly&&(i["aria-readonly"]="true"),i}function Xe({ariaDescribedBy:t,ariaInvalid:i,ariaLabel:o,ariaLabelledBy:l,className:f,onBlur:d,onChange:k,onSave:u,placeholder:m,readOnly:c=false,value:p}){let h=useRef(null),y=useRef(null),L=useRef(new Compartment),P=useRef(new Compartment),N=useRef(new Compartment),C=useRef(d),w=useRef(k),I=useRef(u),v=useRef(p);return C.current=d,w.current=k,I.current=u,v.current=p,useEffect(()=>{let s=h.current;if(!s)return;let g=new EditorView({parent:s,state:EditorState.create({doc:v.current,extensions:[lineNumbers(),highlightActiveLineGutter(),highlightSpecialChars(),history(),foldGutter(),drawSelection(),dropCursor(),EditorState.allowMultipleSelections.of(true),indentOnInput(),bracketMatching(),highlightActiveLine(),highlightSelectionMatches(),EditorView.lineWrapping,markdown({codeLanguages:languages}),keymap.of([...defaultKeymap,...historyKeymap,...searchKeymap,...foldKeymap,indentWithTab]),Prec.highest(keymap.of([{key:"Mod-s",run:()=>(I.current?.(),true)}])),EditorView.updateListener.of(B=>{B.docChanged&&w.current?.(B.state.doc.toString()),B.focusChanged&&!B.view.hasFocus&&C.current?.();}),L.current.of(ue(me())),P.current.of(He(c)),N.current.of(EditorView.contentAttributes.of(Oe({ariaDescribedBy:t,ariaInvalid:i,ariaLabel:o,ariaLabelledBy:l,readOnly:c}))),...m?[placeholder(m)]:[]]})});y.current=g;let K=new ResizeObserver(()=>{g.requestMeasure();});K.observe(s);let G=new MutationObserver(()=>{g.dispatch({effects:L.current.reconfigure(ue(me()))});});return G.observe(document.documentElement,{attributeFilter:["class","data-theme","style"],attributes:true}),()=>{K.disconnect(),G.disconnect(),g.destroy(),y.current=null;}},[]),useEffect(()=>{let s=y.current;s&&s.dispatch({effects:L.current.reconfigure(ue(me()))});},[de,ce]),useEffect(()=>{let s=y.current;if(!s)return;let g=s.state.doc.toString();g!==p&&s.dispatch({changes:{from:0,to:g.length,insert:p}});},[p]),useEffect(()=>{let s=y.current;s&&s.dispatch({effects:[P.current.reconfigure(He(c)),N.current.reconfigure(EditorView.contentAttributes.of(Oe({ariaDescribedBy:t,ariaInvalid:i,ariaLabel:o,ariaLabelledBy:l,readOnly:c})))]});},[t,i,o,l,c]),jsx("div",{className:f??"fk:h-full fk:min-h-0 fk:min-w-0 fk:w-full fk:overflow-hidden",ref:h})}var Je=25,Bt=[{descriptionWidth:"fk:w-44",id:"skill-a",nameWidth:"fk:w-28"},{descriptionWidth:"fk:w-52",id:"skill-b",nameWidth:"fk:w-20"},{descriptionWidth:"fk:w-40",id:"skill-c",nameWidth:"fk:w-36"},{descriptionWidth:"fk:w-48",id:"skill-d",nameWidth:"fk:w-24"},{descriptionWidth:"fk:w-36",id:"skill-e",nameWidth:"fk:w-32"},{descriptionWidth:"fk:w-56",id:"skill-f",nameWidth:"fk:w-16"}];function Wt(){return jsxs("div",{"aria-busy":"true",className:"fk:grid fk:grid-cols-1 fk:gap-x-16 fk:gap-y-1 fk:lg:grid-cols-2",children:[jsx("span",{className:"fk:sr-only",children:"Loading skills"}),Bt.map(t$1=>jsxs("div",{className:"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:px-3 fk:py-2",children:[jsx(t,{className:"fk:size-10 fk:shrink-0 fk:rounded-lg"}),jsxs("span",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-1.5",children:[jsx(t,{className:`fk:h-4 ${t$1.nameWidth}`}),jsx(t,{className:`fk:h-4 ${t$1.descriptionWidth}`})]})]},t$1.id))]})}var Rt={code({children:t,className:i,node:o,...l}){return typeof i=="string"&&i.split(" ").some(d=>d.startsWith("language-"))?jsx("code",{className:i,...l,children:t}):jsx("code",{className:"fk:rounded fk:bg-muted fk:px-1.5 fk:py-0.5 fk:font-mono fk:text-[0.875em] fk:font-medium fk:before:content-none fk:after:content-none fk:corner-squircle",...l,children:t})}};function be(){let{currentProjectId:t}=f$1();return {api:useMemo(()=>t?d$1(t):null,[t]),projectId:t}}function ie({children:t}){return jsx("div",{className:"fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground fk:corner-squircle",children:t})}function jt({onVisible:t}){let i=useRef(null),o=useRef(t);return o.current=t,useEffect(()=>{let l=i.current;if(!l)return;let f=new IntersectionObserver(d=>{d.some(k=>k.isIntersecting)&&o.current();});return f.observe(l),()=>{f.disconnect();}},[]),jsx("div",{"aria-hidden":true,className:"fk:h-px",ref:i})}function zt(t,i){return t.visibility==="space"?(t.spaceId?i.get(t.spaceId):void 0)??"Space":t.visibility==="personal"?"Personal":"Project"}function Dt({skill:t}){return t.logoUrl?jsx("img",{alt:"",className:"fk:size-10 fk:shrink-0 fk:rounded-lg fk:corner-squircle",src:t.logoUrl}):jsx("span",{className:"fk:flex fk:size-10 fk:shrink-0 fk:items-center fk:justify-center fk:rounded-lg fk:bg-muted fk:text-muted-foreground fk:corner-squircle",children:jsx(GraduationCapIcon,{className:"fk:size-5"})})}function hi(){let{api:t,projectId:i}=be(),o=useNavigate(),[l,f$1]=useState(""),d=b(),k=l.trim().length>0,u=(s,g$1)=>!i||g$1&&!g$1.hasMore?null:g(i).skills({limit:Je,offset:s*Je,search:l.trim()||void 0}),{data:m,isLoading:c,setSize:p,size:h}=At(u,f),y=m?.flatMap(s=>s.skills)??[],P=m?.[m.length-1]?.hasMore??false,N=m!==void 0&&h>m.length,C=c&&y.length===0;if(!i||!t)return jsx(ie,{children:"Select a project to view skills."});function w(){p(s=>s+1);}let I="No skills yet.";k&&(I="No skills match your search.");let v=jsx("div",{className:"fk:grid fk:grid-cols-1 fk:gap-x-16 fk:gap-y-1 fk:lg:grid-cols-2",children:y.map(s=>jsxs("button",{type:"button",onClick:()=>o(s.id),className:"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-3 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:corner-squircle",children:[jsx(Dt,{skill:s}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:s.name}),jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:text-muted-foreground",children:s.description})]})]},s.id))});return C?v=jsx(Wt,{}):y.length===0&&(v=jsx(Rc,{children:jsx(Tc,{children:I})})),jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsx(b$1,{}),jsx("div",{className:"fk:min-h-0 fk:flex-1 fk:overflow-auto",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsxs("div",{children:[jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:"Skills for your agents"}),jsx("p",{className:"fk:mt-2 fk:text-muted-foreground",children:"Reusable Markdown instructions that agents load when relevant, or always when attached to an automation."})]}),jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:[jsx(s,{"aria-label":"Search skills",className:"fk:w-full fk:max-w-xs",placeholder:"Search skills\u2026",value:l,onChange:s=>{p(1),f$1(s.target.value);}}),d?jsx(b$2,{asChild:true,className:"fk:ml-auto",size:"sm",children:jsxs(Link,{to:"new",children:[jsx(Plus,{}),"New Skill"]})}):jsx(ma,{disabled:true,children:jsxs(b$2,{className:"fk:ml-auto",disabled:true,size:"sm",children:[jsx(Plus,{}),"New Skill"]})})]}),v,P&&!N?jsx(jt,{onVisible:w}):null,N?jsxs("div",{className:"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),jsx("span",{children:"Loading more skills..."})]}):null]})})]})}function te({className:t,id:i,message:o}){return jsx("p",{className:`fk:text-sm fk:text-destructive ${t??""}`,id:i,children:o})}function D({children:t,hint:i,htmlFor:o,id:l}){return jsxs("div",{className:"fk:mb-1.5 fk:pl-2.5 fk:flex fk:items-center fk:gap-1",children:[jsx(e$2,{htmlFor:o,id:l,children:t}),jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsx("button",{"aria-label":`About ${t.toLowerCase()}`,className:"fk:rounded-sm fk:text-muted-foreground hover:fk:text-foreground fk:corner-squircle",type:"button",children:jsx(Info,{className:"fk:size-3.5"})})}),jsx(e$1,{className:"fk:max-w-xs",children:i})]})]})}function Se({actions:t,title:i}){return jsxs(Fragment,{children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4",children:[jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsx(N,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h1",{className:"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:i}),t]}),jsx(b$2,{asChild:true,className:"fk:shrink-0 fk:w-fit",size:"sm",variant:"ghost",children:jsxs(Link,{relative:"path",to:"..",children:[jsx(ArrowLeft,{className:"fk:mr-2 fk:size-4"}),"Skills"]})})]})}function Ht(){return jsxs("div",{"aria-busy":"true",className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:overflow-hidden fk:pb-3",children:[jsx("span",{className:"fk:sr-only",children:"Loading skill"}),jsx(Se,{actions:jsx(t,{className:"fk:h-8 fk:w-24"}),title:jsx(t,{className:"fk:h-5 fk:w-40"})}),jsxs("div",{className:"fk:m-auto fk:flex fk:min-h-0 fk:w-full fk:max-w-6xl fk:flex-1 fk:flex-col fk:gap-8 fk:px-6",children:[jsxs("div",{className:"fk:grid fk:shrink-0 fk:gap-3 fk:lg:grid-cols-[minmax(0,1fr)_minmax(0,1.6fr)_auto]",children:[["name","description"].map(t$1=>jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t,{className:"fk:h-4 fk:w-20"}),jsx(t,{className:"fk:h-9 fk:w-full"})]},t$1)),jsxs("div",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx(t,{className:"fk:h-4 fk:w-20"}),jsx(t,{className:"fk:h-9 fk:w-32"})]})]}),jsxs("div",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col fk:gap-1.5",children:[jsx(t,{className:"fk:h-4 fk:w-16"}),jsx(t,{className:"fk:min-h-48 fk:flex-1 fk:rounded-md"})]})]})]})}function Ke({content:t,onBlur:i,onChange:o,onSave:l,readOnly:f=false,showContentError:d,validationMessage:k}){let[u,m]=useState("write"),c=t.length>5e4,p;return t.trim()?p=jsx(Pt,{components:Rt,children:t}):p=jsx("p",{className:"fk:text-muted-foreground",children:"Nothing to preview."}),jsxs("div",{className:"fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-1.5",children:[jsxs("div",{className:"fk:pl-3.25 fk:flex fk:shrink-0 fk:items-center fk:gap-1",children:[jsx(e$2,{htmlFor:"skill-content",id:"skill-content-label",children:"Content"}),jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsx("button",{"aria-label":"About skill content",className:"fk:rounded-sm fk:text-muted-foreground hover:fk:text-foreground fk:corner-squircle",type:"button",children:jsx(Info,{className:"fk:size-3.5"})})}),jsx(e$1,{className:"fk:max-w-sm",children:"The skill itself, in Markdown. Write it like instructions for a capable colleague: procedures, rules, examples, and edge cases. Attached skills are always loaded; other visible skills are loaded on demand."})]})]}),jsxs("div",{className:`fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:ml-0.75 fk:overflow-hidden fk:rounded-md fk:border ${d?"fk:border-destructive":""} fk:corner-squircle`,children:[jsxs("div",{className:"fk:flex fk:shrink-0 fk:items-center fk:justify-between fk:gap-2 fk:border-b fk:px-2.5 fk:py-1",children:[jsx(ga,{value:u,onValueChange:h=>{m(h==="preview"?"preview":"write");},children:jsxs(ha,{children:[jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsx("span",{className:"fk:inline-flex",children:jsx(ia,{"aria-label":"Write",className:"fk:px-2.5",value:"write",children:jsx(PenLine,{className:"fk:size-3.5"})})})}),jsx(e$1,{children:"Write"})]}),jsxs(b$3,{children:[jsx(c$1,{asChild:true,children:jsx("span",{className:"fk:inline-flex",children:jsx(ia,{"aria-label":"Preview",className:"fk:px-2.5",value:"preview",children:jsx(Eye,{className:"fk:size-3.5"})})})}),jsx(e$1,{children:"Preview"})]})]})}),jsxs("span",{className:c?"fk:text-xs fk:text-destructive":"fk:text-xs fk:text-muted-foreground",children:[t.length.toLocaleString()," / ",5e4.toLocaleString()]})]}),jsx("div",{className:"fk:min-h-0 fk:min-w-0 fk:flex-1 fk:overflow-hidden",hidden:u!=="write",children:jsx(Xe,{ariaDescribedBy:d?"skill-content-error":void 0,ariaInvalid:d,ariaLabelledBy:"skill-content-label",className:"fk:h-full fk:min-h-0 fk:min-w-0 fk:w-full fk:overflow-hidden",readOnly:f,value:t,onBlur:i,onChange:o,onSave:l})}),u==="preview"?jsx(w,{className:"fk:min-h-0 fk:flex-1",children:jsx("div",{className:"fk:prose fk:prose-sm fk:dark:prose-invert fk:max-w-none fk:px-4 fk:py-3",children:p})}):null,d&&k?jsx(te,{className:"fk:border-t fk:px-3 fk:py-2",id:"skill-content-error",message:k}):null]})]})}function Ge({api:t,mode:i,onSaved:o,projectId:l,skill:f$1}){let[d$1,k]=useState(f$1?.name??""),[u,m]=useState(f$1?.description??""),[c$1,p]=useState(f$1?.content??""),[h$1,y]=useState(f$1?.visibility??"project"),[L,P]=useState(f$1?.spaceId??null),[N,C]=useState(false),w=useRef(false),[I,v]=useState(""),[s$1,g$2]=useState({content:false,description:false,name:false}),K=useNavigate(),{data:G}=ve(g(l).spaces,f),[,B]=h(),H=b(),$e=B.user?.spaces??[],xe=(G?.spaces??[]).filter(a=>$e.includes(a.code)),ne="";c$1.trim()?c$1.length>5e4&&(ne=`Content must be at most ${String(5e4)} characters`):ne="Content is required";let b$1={content:ne,description:u.trim()?"":"Description is required",name:d$1.trim()?"":"Name is required",space:h$1==="space"&&!L?"Select a space":""},ae=!b$1.content&&!b$1.description&&!b$1.name&&!b$1.space,$=s$1.name&&!!b$1.name,U=s$1.description&&!!b$1.description,Ue=s$1.content&&!!b$1.content,Ze=i==="create"?"New Skill":f$1?.name??"Skill",se="Update skill";N?se="Saving...":i==="create"&&(se="Create skill");async function ye(){if(!H||w.current)return;if(!ae){g$2({content:true,description:true,name:true});return}w.current=true,C(true),v("");let a={content:c$1,description:u,name:d$1,spaceId:h$1==="space"?L:null,visibility:h$1};try{let M=i==="create"||!f$1?await t.createSkill(a):await t.updateSkill(f$1.id,a);if(!M.success){v(Array.isArray(M.errorMessage)?M.errorMessage.join(", "):M.errorMessage);return}oa.success(i==="create"||!f$1?"Skill created.":"Skill saved."),o(M.skill);}catch(M){v(M instanceof Error?M.message:"Failed to save skill.");}finally{w.current=false,C(false);}}async function Qe(a){a.preventDefault(),await ye();}async function Ye(){if(!(!f$1||!H||w.current)){w.current=true,C(true),v("");try{let a=await t.deleteSkill(f$1.id);if(!a.success){v(Array.isArray(a.errorMessage)?a.errorMessage.join(", "):a.errorMessage);return}K("..",{relative:"path"});}catch(a){v(a instanceof Error?a.message:"Failed to delete skill.");}finally{w.current=false,C(false);}}}return jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3",children:[jsx(Se,{actions:jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[ae?null:jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:"Complete the required fields to save"}),i==="edit"&&f$1?jsxs(b$2,{disabled:N||!H,size:"sm",type:"button",variant:"outline",onClick:()=>{Ye();},children:[jsx(Trash2,{}),"Delete"]}):null,jsx(ma,{disabled:!H,children:jsx(b$2,{disabled:N||!ae||!H,form:"skill-editor-form",size:"sm",type:"submit",children:se})})]}),title:Ze}),I?jsx("div",{className:"fk:shrink-0 fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:text-destructive fk:corner-squircle",children:I}):null,jsxs("form",{className:"fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-6 fk:w-full fk:max-w-6xl fk:m-auto fk:gap-8 fk:px-4",id:"skill-editor-form",onSubmit:a=>{Qe(a);},children:[jsxs("div",{className:"fk:grid fk:min-w-0 fk:shrink-0 fk:gap-3 fk:px-0.75 fk:lg:grid-cols-[minmax(0,1fr)_minmax(0,1.6fr)_auto]",children:[jsxs("div",{children:[jsx(D,{hint:"Identifying label for this skill",htmlFor:"skill-name",children:"Name"}),jsx(s,{"aria-describedby":$?"skill-name-error":void 0,"aria-invalid":$,className:$?"fk:border-destructive focus-visible:fk:ring-destructive":"",id:"skill-name",value:d$1,onBlur:()=>g$2(a=>({...a,name:true})),onChange:a=>k(a.target.value)}),$?jsx(te,{id:"skill-name-error",message:b$1.name}):null]}),jsxs("div",{children:[jsx(D,{hint:"One or two sentences describing when to use this skill. Agents rely on it to decide whether the skill applies to their current task.",htmlFor:"skill-description",children:"Description"}),jsx(s,{"aria-describedby":U?"skill-description-error":void 0,"aria-invalid":U,className:U?"fk:border-destructive focus-visible:fk:ring-destructive":"",id:"skill-description",placeholder:"e.g. Rules for writing product descriptions in our brand voice",value:u,onBlur:()=>g$2(a=>({...a,description:true})),onChange:a=>m(a.target.value)}),U?jsx(te,{id:"skill-description-error",message:b$1.description}):null]}),jsxs("div",{children:[jsx(D,{hint:"Who can see and use this skill. Space skills are only visible to members of the selected space and only usable by automations in that space; personal skills are private to you.",htmlFor:"skill-visibility",children:"Visibility"}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsxs(a,{value:h$1,onValueChange:a=>{y(a==="space"||a==="personal"?a:"project"),a!=="space"&&P(null);},children:[jsx(d,{"aria-label":"Visibility",className:"fk:w-fit fk:min-w-26",id:"skill-visibility",children:jsx(c,{})}),jsxs(e,{align:"start",children:[jsx(g$1,{value:"project",children:"Project"}),jsx(g$1,{disabled:xe.length===0,value:"space",children:"Space"}),jsx(g$1,{value:"personal",children:"Personal"})]})]}),h$1==="space"?jsxs(a,{value:L??"",onValueChange:a=>{P(a||null);},children:[jsx(d,{"aria-label":"Space",className:"fk:w-fit fk:min-w-34",children:jsx(c,{placeholder:"Select a space"})}),jsx(e,{align:"start",children:xe.map(a=>jsx(g$1,{value:a.id,children:a.label},a.id))})]}):null]}),h$1==="space"&&b$1.space?jsx(te,{message:b$1.space}):null]})]}),jsx(Ke,{content:c$1,showContentError:Ue,validationMessage:b$1.content,onBlur:()=>g$2(a=>({...a,content:true})),onChange:p,onSave:()=>{ye();}})]})]})}function Ot({projectId:t,skill:i,spaceLabelById:o}){let l=b(),f=useNavigate(),[d$1,k]=useState(false),[u,m]=useState("");async function c$1(){k(true),m("");let p;try{p=await fetch(`/api/flexkit/${t}/skills/${i.id}/fork`,{method:"POST",credentials:"include"});}catch{m("Unable to create a copy. Try again."),k(false);return}if(k(false),!p.ok){m("Unable to create a copy. Check your permissions.");return}f("..",{relative:"path"});}return jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3",children:[jsx(Se,{actions:jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsx(b$4,{variant:"secondary",children:i.source==="plugin"?"Plugin":"Code"}),i.source==="plugin"&&jsx(b$2,{type:"button",disabled:d$1||!l,onClick:()=>{c$1();},size:"sm",children:"Edit a copy"})]}),title:i.name}),jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:gap-3 fk:max-w-6xl fk:m-auto",children:[jsxs("div",{className:"fk:shrink-0 fk:rounded-md fk:border fk:bg-muted/30 fk:px-3 fk:py-2 fk:corner-squircle",children:[jsx("p",{className:"fk:text-sm fk:font-medium",children:"Version-controlled skill"}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:i.source==="plugin"?"This skill is managed by its plugin. Edit a copy to create a personal Studio skill.":"Edit this skill in your repository and re-sync it from the Custom Tools settings."})]}),jsxs("div",{className:"fk:grid fk:min-w-0 fk:shrink-0 fk:gap-3 fk:lg:grid-cols-[minmax(0,1fr)_minmax(0,1.6fr)_auto]",children:[jsxs("div",{children:[jsx(D,{hint:"Identifying label for this skill",htmlFor:"skill-name",children:"Name"}),jsx(s,{className:"fk:opacity-100!",disabled:true,id:"skill-name",value:i.name})]}),jsxs("div",{children:[jsx(D,{hint:"One or two sentences describing when to use this skill. Agents rely on it to decide whether the skill applies to their current task.",htmlFor:"skill-description",children:"Description"}),jsx(s,{className:"fk:opacity-100!",disabled:true,id:"skill-description",placeholder:"e.g. Rules for writing product descriptions in our brand voice",value:i.description})]}),jsxs("div",{children:[jsx(D,{hint:"Who can see and use this skill. Space skills are only visible to members of the selected space and only usable by automations in that space; personal skills are private to you.",htmlFor:"skill-visibility",children:"Visibility"}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-2",children:[jsxs(a,{disabled:true,value:i.visibility,children:[jsx(d,{"aria-label":"Visibility",className:"fk:w-fit fk:min-w-26 fk:opacity-100!",id:"skill-visibility",children:jsx(c,{})}),jsxs(e,{align:"start",children:[jsx(g$1,{value:"project",children:"Project"}),jsx(g$1,{disabled:!i.spaceId,value:"space",children:"Space"}),jsx(g$1,{value:"personal",children:"Personal"})]})]}),i.visibility==="space"?jsxs(a,{disabled:true,value:i.spaceId??"",children:[jsx(d,{"aria-label":"Space",className:"fk:w-fit fk:min-w-34 fk:opacity-100!",children:jsx(c,{placeholder:"Select a space"})}),jsx(e,{align:"start",children:jsx(g$1,{value:i.spaceId??"",children:zt(i,o)})})]}):null]})]})]}),u&&jsx("p",{role:"alert",children:u}),jsx(Ke,{content:i.content,readOnly:true})]})]})}function vi(){let{api:t,projectId:i}=be(),o=useNavigate();return !i||!t?jsx(ie,{children:"Select a project to create skills."}):jsx(Ge,{api:t,mode:"create",projectId:i,onSaved:()=>o("..",{relative:"path"})})}function bi(){let{api:t,projectId:i}=be(),{skillId:o}=useParams(),{data:l,error:f$1,isLoading:d,mutate:k}=ve(i&&o?g(i).skill(o):null,f),{data:u}=ve(i?g(i).spaces:null,f);if(!i||!t||!o)return jsx(ie,{children:"Select a skill."});if(f$1)return jsx(ie,{children:"Failed to load skill."});if(d||!l?.skill)return jsx(Ht,{});let m=new Map((u?.spaces??[]).map(c=>[c.id,c.label]));return l.skill.source!=="studio"?jsx(Ot,{projectId:i,skill:l.skill,spaceLabelById:m}):jsx(Ge,{api:t,mode:"edit",projectId:i,skill:l.skill,onSaved:c=>{c?k({skill:c},{revalidate:false}):k();}})}export{vi as CreateSkillPage,bi as SkillDetailPage,Ge as SkillForm,hi as SkillsPage};//# sourceMappingURL=skills-pages-POKCFHOL.js.map
|
|
2
|
-
//# sourceMappingURL=skills-pages-POKCFHOL.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import'./index.css';import {h}from'./chunk-TYDYAOQ7.js';import {t,e,g,a,b as b$2,c,h as h$1,n,o,k,j,p}from'./chunk-SZEGGBOC.js';import {b}from'./chunk-U45E5X3H.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r,setTheme:t$1}=b(),[C,n$1]=h();return C?jsx(t,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(e,{children:[jsx(g,{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:[n$1.user?.avatar_url?jsx(b$2,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(h$1,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(n,{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$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(o,{}),jsx(n,{children:"Theme"}),jsxs(k,{checked:r==="system",onCheckedChange:()=>{t$1("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(k,{checked:r==="dark",onCheckedChange:()=>{t$1("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(k,{checked:r==="light",onCheckedChange:()=>{t$1("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(o,{}),jsxs(j,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(p,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-DCAHVWN7.js.map
|
|
2
|
-
//# sourceMappingURL=user-nav-DCAHVWN7.js.map
|