sanity-plugin-media

6.1.56.1.6
dist/index.js.map
~dist/index.js.mapModified
+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["ReactNode","createContext","useContext","useMemo","AssetSourceComponentProps","ContextProps","isMultiSelect","onSelect","Props","children","AssetSourceDispatchContext","undefined","AssetBrowserDispatchProvider","props","$","_c","t0","t1","contextValue","t2","useAssetSourceActions","context","Error","useEffect","useState","useRootPortalElement","$","_c","container","_temp","t0","t1","classList","add","document","body","appendChild","removeChild","createElement","TypedUseSelectorHook","useSelector","RootReducerState","useTypedSelector","SanityClient","useClient","useVersionedClient","$","_c","t0","Symbol","for","apiVersion","OrderDirection","ORDER_DICTIONARY","Record","asc","desc","_createdAt","_updatedAt","mimeType","originalFilename","size","getOrderTitle","field","direction","groq","SearchFacetDivider","SearchFacetInputProps","SearchFacetName","SearchFacetOperators","divider","type","inputs","Record","altText","assetTypes","field","name","operatorType","operatorTypes","title","value","creditLine","description","folder","fileName","height","inCurrentDocument","options","selectOnly","inUse","isOpaque","orientation","size","modifier","modifiers","fieldModifier","fieldName","tag","width","operators","doesNotInclude","fn","undefined","label","doesNotReference","_field","empty","_value","hideInput","equalTo","greaterThan","greaterThanOrEqualTo","includes","is","isNot","lessThan","lessThanOrEqualTo","notEmpty","references","AssetSourceComponentProps","divider","inputs","SearchFacetInputProps","SearchFacetDivider","SearchFacetGroup","OrderDirection","SUPPORTED_ASSET_TYPES","const","ORDER_OPTIONS","direction","field","FACETS","tag","inUse","inCurrentDocument","title","folder","altText","creditLine","description","isOpaque","fileName","size","type","orientation","width","height","GRID_TEMPLATE_COLUMNS","SMALL","LARGE","FOLDERS_PANEL_WIDTH","FOLDER_DOCUMENT_NAME","PANEL_HEIGHT","TAG_DOCUMENT_NAME","TAGS_PANEL_WIDTH","iif","Observable","of","throwError","delay","mergeMap","debugThrottle","throttled","source","T","pipe","v","Math","random","message","statusCode","groq","operators","TAG_DOCUMENT_NAME","AssetType","SearchFacetInputProps","buildExcludeTagsFragment","excludeTagSlugs","serializedExcludeTagSlugs","length","JSON","stringify","undefined","constructFilter","assetTypes","currentFolderId","searchFacets","searchQuery","documentAssetTypes","map","type","baseFilter","excludeTagsFragment","searchFacetFragments","reduce","acc","facet","field","modifier","modifiers","operatorType","value","operator","currentModifier","find","m","name","facetField","fieldModifier","fragment","fn","push","options","currentOptionValue","l","folderFilter","constructedQuery","trim","join","Asset","AssetRef","_ref","_type","ImageNode","asset","findImageAssets","document","Record","newAsset","assetToReplaceId","matchedTopLevelFields","Set","repointNestedImages","map","field","node","topLevelField","candidate","assetRef","hasMatchingAssetRef","_id","add","key","value","Object","entries","SanityClient","groq","from","Observable","of","throwError","mergeMap","TAG_DOCUMENT_NAME","HttpError","checkTagName","client","name","source","T","pipe","fetch","existingTagCount","message","statusCode","TagSelectOption","TagItem","getTagSelectOptions","tags","reduce","acc","val","tag","push","label","name","current","value","_id","createAction","AssetItem","HttpError","Tag","ASSETS_ACTIONS","tagsAddComplete","prepare","assets","tag","payload","tagsAddError","error","tagsAddRequest","tagsRemoveComplete","tagsRemoveError","tagsRemoveRequest","createAction","AssetItem","DIALOG_ACTIONS","showFolderCreate","prepare","parentFolderId","payload","showFolderMove","assets","folderId","showFolderRename","showTagCreate","showTagEdit","tagId","createSelector","createSlice","isAnyOf","PayloadAction","ClientError","Transaction","groq","Selector","ofType","from","Observable","of","bufferTime","catchError","filter","mergeMap","switchMap","withLatestFrom","TAG_DOCUMENT_NAME","checkTagName","debugThrottle","Asset","HttpError","MyEpic","TagSelectOption","Tag","TagItem","getTagSelectOptions","ASSETS_ACTIONS","DIALOG_ACTIONS","RootReducerState","TagsReducerState","allIds","byIds","Record","creating","creatingError","fetchCount","fetching","fetchingError","panelVisible","initialState","undefined","tagsSlice","name","extraReducers","builder","addCase","showTagCreate","state","showTagEdit","action","tagId","payload","error","addMatcher","tagsAddComplete","tagsAddError","tagsRemoveComplete","tagsRemoveError","tag","_id","updating","tagsAddRequest","tagsRemoveRequest","reducers","createComplete","assetId","includes","push","_type","picked","createError","createRequest","_action","deleteComplete","deleteIndex","indexOf","splice","deleteError","deleteRequest","Object","keys","forEach","key","fetchComplete","tags","length","fetchError","fetchRequest","reducer","query","prepare","listenerCreateQueue","_state","listenerCreateQueueComplete","listenerDeleteQueue","listenerDeleteQueueComplete","tagIds","listenerUpdateQueue","listenerUpdateQueueComplete","panelVisibleSet","sort","a","b","tagA","current","tagB","updateComplete","closeDialogId","updateError","updateRequest","formData","tagsCreateEpic","action$","state$","client","pipe","actions","match","debug","badConnection","observable","create","result","message","statusCode","tagsDeleteEpic","fetch","tagName","assets","patches","map","asset","id","patch","ifRevisionID","_rev","unset","transaction","reduce","tx","delete","commit","tagsFetchEpic","items","tagsListenerCreateQueueEpic","tagsListenerDeleteQueueEpic","tagsListenerUpdateQueueEpic","tagsSortEpic","type","tagsUpdateEpic","set","updatedTag","selectTagsByIds","selectTagsAllIds","selectTags","selectTagById","selectTagSelectOptions","opt","media","acc","v","tagItem","_ref","tagsActions","PayloadAction","createSelector","createSlice","uuid","EMPTY","of","filter","mergeMap","withLatestFrom","MyEpic","SearchFacetInputProps","SearchFacetOperatorType","WithId","tagsActions","RootReducerState","SearchState","facets","query","initialState","searchSlice","name","reducers","facetsAdd","state","action","facet","push","payload","id","facetsClear","facetsRemoveByName","facetName","facetsRemoveByTag","tagId","type","operatorType","value","facetsRemoveById","facetId","facetsUpdate","modifier","find","f","facetsUpdateById","forEach","index","querySet","searchQuery","searchFacetTagUpdateEpic","action$","state$","pipe","updateComplete","match","tag","currentSearchFacetTag","search","tagItem","tags","byIds","_id","actions","label","current","selectIsSearchFacetTag","_state","searchFacets","some","searchActions","reducer","createAction","SanityAssetDocument","SanityImageAssetDocument","UPLOADS_ACTIONS","uploadComplete","prepare","asset","payload","createSelector","createSlice","PayloadAction","AttributeSet","ClientError","Patch","SanityDocument","Transaction","groq","nanoid","Selector","ofType","EMPTY","from","of","bufferTime","catchError","concatMap","debounceTime","filter","mergeMap","switchMap","withLatestFrom","getOrderTitle","ORDER_OPTIONS","debugThrottle","Asset","AssetItem","AssetType","BrowserView","HttpError","MyEpic","Order","OrderDirection","Tag","constructFilter","findImageAssets","searchActions","RootReducerState","UPLOADS_ACTIONS","ASSETS_ACTIONS","ItemError","description","id","referencingIDs","type","AssetsReducerState","allIds","assetTypes","byIds","Record","excludeTagSlugs","fetchCount","fetching","fetchingError","lastPicked","order","pageIndex","pageSize","view","defaultOrder","direction","field","initialState","undefined","title","assetsSlice","name","extraReducers","builder","addCase","uploadComplete","state","action","asset","payload","_id","_type","picked","updating","tagsAddComplete","assets","forEach","tagsAddError","tagsAddRequest","tagsRemoveComplete","tagsRemoveError","tagsRemoveRequest","reducers","clear","deleteComplete","assetIds","deleteIndex","indexOf","splice","Math","floor","length","deleteError","error","itemErrors","response","body","items","map","item","deleteRequest","closeDialogId","Object","keys","key","fetchComplete","includes","push","existing","fetchError","folderSetComplete","folderId","assetId","opt","media","folder","_ref","_weak","folderSetError","message","folderSetRequest","fetchRequest","reducer","_action","params","query","prepare","queryFilter","selector","sort","replace","pipe","insertUploads","results","entries","hash","listenerCreateQueue","_state","listenerCreateQueueComplete","listenerDeleteQueue","listenerDeleteQueueComplete","listenerUpdateQueue","listenerUpdateQueueComplete","loadNextPage","loadPageIndex","orderSet","pick","pickAll","pickClear","values","pickRange","endId","startId","startIndex","findIndex","endIndex","indices","a","b","slice","tagA","tagB","updateComplete","updateError","updateImageReferences","updateImageReferencesComplete","updateRequest","formData","viewSet","assetsDeleteEpic","action$","_state$","client","assetsActions","match","observable","delete","JSON","stringify","assetsFetchEpic","state$","debug","badConnection","fetch","result","statusCode","assetsFetchPageIndexEpic","start","end","documentId","selected","document","documentAssetIds","constructedFilter","currentFolderId","folders","searchFacets","search","facets","searchQuery","assetsFetchNextPageEpic","assetsFetchAfterDeleteAllEpic","nextPageIndex","filterAssetWithoutTag","tag","tagIndex","tags","t","patchOperationTagAppend","patch","setIfMissing","append","_key","patchOperationTagUnset","ifRevisionId","_rev","unset","patchOperationFolderSet","nextPatch","set","assetsOrderSetEpic","assetsSearchEpic","facetsAdd","facetsClear","facetsRemoveById","facetsRemoveByName","facetsRemoveByTag","facetsUpdate","facetsUpdateById","querySet","assetsListenerCreateQueueEpic","actions","assetsListenerDeleteQueueEpic","assetsListenerUpdateQueueEpic","assetsSortEpic","assetsTagsAddEpic","pickedAssets","selectAssetsPicked","pickedAssetsFiltered","transaction","reduce","tx","pickedAsset","commit","assetsTagsRemoveEpic","assetsFolderSetEpic","assetsFolderSetRefreshEpic","assetsUnpickEpic","assetsUpdateEpic","updatedAsset","assetsUpdateImageReferencesEpic","documents","patchedCount","clonedDocument","parse","assetsToReplace","patchSet","assign","originalAsset","selectAssetsByIds","selectAssetsAllIds","selectAssetById","selectAssets","selectAssetsLength","selectAssetsPickedLength","assetsPicked","createSelector","createSlice","PayloadAction","ClientError","Patch","groq","nanoid","from","of","catchError","debounceTime","filter","map","mergeMap","switchMap","withLatestFrom","FOLDER_DOCUMENT_NAME","debugThrottle","FolderDoc","FolderTreeItem","FolderTreeNode","HttpError","MyEpic","buildExcludeTagsFragment","assetsActions","RootReducerState","UPLOADS_ACTIONS","FoldersReducerState","byId","Record","childrenByParentId","rootIds","exactCountByFolderId","unfiledCount","currentFolderId","currentFolderUnfiled","panelVisible","fetching","fetchCount","fetchingError","creating","creatingError","deletingId","deleteError","renaming","renameError","initialState","undefined","indexFolders","folders","forEach","folder","_id","parentKey","parentId","push","sortByName","ids","sort","a","b","name","localeCompare","numeric","sensitivity","Object","values","foldersSlice","reducers","createComplete","state","_action","createError","action","error","payload","createRequest","currentFolderClear","currentFolderSet","folderId","currentFolderShowUnfiled","deleteComplete","deletedIds","clearedCurrentFolder","removed","Set","has","deleteRequest","fetchComplete","length","fetchError","fetchRequest","panelVisibleSet","renameComplete","renameRequest","foldersFetchEpic","action$","state$","client","pipe","actions","match","debug","badConnection","assetTypes","assets","type","excludeTagsFragment","excludeTagSlugs","excludeTagsClause","observable","fetch","count","JSON","stringify","result","f","folderIds","Boolean","message","statusCode","foldersRefreshEpic","folderSetComplete","listenerCreateQueueComplete","listenerDeleteQueueComplete","listenerUpdateQueueComplete","updateComplete","uploadComplete","foldersCurrentFolderEpic","clear","pickClear","loadPageIndex","pageIndex","patchOperationAssetFolderUnset","patch","unset","patchOperationFolderParentSet","set","parent","_ref","_type","_weak","foldersCreateEpic","trim","siblingIds","collision","some","id","toLowerCase","newId","doc","create","foldersDeleteEpic","childFolderIds","tx","transaction","asset","childFolderId","delete","commit","foldersRenameEpic","selectById","selectChildrenByParentId","selectRootIds","selectExactCountByFolderId","selectCurrentFolderId","selectCurrentFolderUnfiled","buildFolderPath","segments","cursor","seen","add","unshift","join","selectFolderPathById","_state","selectFolderTree","buildNode","children","exactCount","totalCount","reduce","sum","child","path","selectCurrentFolderSegments","chain","depth","FoldersIndex","selectFoldersIndex","selectCurrentFolderChildren","split","stack","cur","pop","kids","selectCanDeleteFolder","foldersActions","reducer","createSlice","PayloadAction","pluralize","ofType","EMPTY","of","filter","mergeMap","AssetItem","Dialog","MyEpic","Tag","assetsActions","ASSETS_ACTIONS","foldersActions","tagsActions","DIALOG_ACTIONS","DialogReducerState","items","initialState","dialogSlice","name","extraReducers","builder","addCase","showFolderCreate","state","action","parentFolderId","payload","push","id","type","showFolderMove","assets","folderId","showFolderRename","showTagCreate","showTagEdit","tagId","createComplete","item","renameComplete","reducers","clear","inlineTagCreate","assetId","tag","forEach","lastCreatedTag","label","current","value","_id","inlineTagRemove","tagIds","lastRemovedTagIds","remove","showConfirmAssetsTagAdd","assetsPicked","closeDialogId","suffix","length","confirmCallbackAction","tagsAddRequest","confirmText","title","headerTitle","tone","showConfirmAssetsTagRemove","tagsRemoveRequest","showConfirmDeleteAssets","deleteRequest","map","assetItem","asset","description","showConfirmDeleteFolder","folderName","showConfirmDeleteTag","showAllAssetsDialog","some","showAssetEdit","showSearchFacets","showFolders","showTags","dialogClearOnAssetUpdateEpic","action$","pipe","deleteComplete","folderSetComplete","updateComplete","dialogId","actions","dialogTagCreateEpic","match","dialogTagDeleteEpic","listenerDeleteQueueComplete","dialogActions","reducer","createGlobalStyle","css","customScrollbar","GlobalStyle","PropsWithChildren","createContext","useContext","useMemo","DropzoneOptions","MediaToolOptions","Locale","ContextProps","dropzone","Pick","components","createTagsOnUpload","creditLine","directUploads","excludeTagSlugs","locales","ToolOptionsContext","Props","options","ToolOptionsProvider","children","value","creditLineExcludeSources","excludeSources","Array","isArray","maxSize","maximumUploadSize","details","enabled","excludeTags","length","useToolOptions","context","Error","z","localizedStringSchema","locales","id","length","string","trim","optional","shape","Record","ZodTypeAny","locale","object","passthrough","tagOptionSchema","label","min","message","value","getAssetFormSchema","altText","creditLine","description","opt","media","tags","array","nullable","originalFilename","title","assetFormSchema","tagFormSchema","name","folderFormSchema","SanityDocument","getUniqueDocuments","documents","draftIds","reduce","acc","doc","_id","startsWith","concat","slice","filteredDocuments","filter","includes","ImageAsset","imageDprUrl","asset","options","width","height","dpi","window","devicePixelRatio","Math","round","imgH","max","undefined","imgW","urlParams","URLSearchParams","append","toString","url","FormData","Record","sanitizeFormData","formData","Object","keys","reduce","acc","key","val","constructor","Array","length","trim","Asset","FileAsset","ImageAsset","isFileAsset","asset","_type","isImageAsset","zodResolver","FieldValues","Resolver","zodFormResolver","schema","TFieldValues","Parameters","ImageAsset","getAssetResolution","asset","metadata","dimensions","width","height","usePortal","PopoverProps","usePortalPopoverProps","$","_c","portal","t0","element","animate","constrainSize","floatingBoundary","referenceBoundary","ClipboardIcon","Button","Text","Popover","copy","useEffect","useRef","useState","usePortalPopoverProps","Props","disabled","url","ButtonAssetCopy","t0","$","_c","popoverProps","refPopoverTimeout","popoverVisible","setPopoverVisible","t1","current","clearTimeout","setTimeout","handleClick","t2","t3","Symbol","for","t4","t5","t6","DownloadIcon","Box","Button","Flex","Inline","Stack","Text","format","filesize","ReactNode","Asset","AssetItem","getAssetResolution","isImageAsset","ButtonAssetCopy","Props","asset","item","Row","t0","$","_c","label","value","t1","Symbol","for","opacity","width","t2","t3","textAlign","t4","t5","AssetMetadata","props","exif","metadata","originalFilename","url","window","location","href","handleDownload","size","base","round","mimeType","t6","extension","toUpperCase","t7","t8","t9","t10","DateTimeOriginal","FNumber","FocalLength","ExposureTime","ISO","background","height","Date","t11","updating","t12","t13","t14","t15","t16","Dialog","SanityDialog","ComponentProps","props","$","_c","t0","Symbol","for","position","t1","SanityDocument","Box","Button","Card","Stack","Text","Preview","SchemaType","useSchema","useIntentLink","Props","documents","isLoading","DocumentList","t0","$","_c","schema","t1","Symbol","for","length","map","doc","_id","get","_type","t2","ReferringDocument","props","schemaType","intent","params","id","onClick","width","Box","Flex","Theme","MouseEvent","defaultStyles","FileIcon","ReactFileIcon","DefaultExtensionType","styled","css","Props","extension","onClick","e","width","Container","theme","sanity","fonts","text","family","props","$","_c","t0","Symbol","for","height","t1","t2","t3","t4","Flex","Asset","FileIcon","Props","asset","FileAssetPreview","props","$","_c","mimeType","search","t0","Symbol","for","height","t1","width","t2","url","extension","Box","Button","Text","Tooltip","format","ReactNode","Props","disabled","isValid","lastUpdated","onClick","FormSubmitButton","props","$","_c","content","t0","Symbol","for","t1","Date","t2","maxWidth","t3","window","hues","ThemeColorSchemeKey","studioTheme","color","themeColor","SCHEME_COLORS","bg","dark","gray","hex","light","bg2","inputEnabledBorder","default","input","enabled","border","inputHoveredBorder","hovered","mutedHoveredBg","primary","muted","mutedHoveredFg","fg","mutedSelectedBg","selected","spotBlue","spot","blue","SchemeColorKey","getSchemeColor","scheme","colorKey","ThemeColorSchemeKey","MouseEvent","styled","css","getSchemeColor","Props","onClick","e","$showCheckerboard","$scheme","src","style","Image","img","attrs","crossOrigin","const","props","ErrorOutlineIcon","Box","Inline","Text","Tooltip","styled","Props","description","error","label","name","StyledErrorOutlineIcon","theme","color","sanity","spot","red","FormFieldInputLabel","props","$","_c","t0","t1","marginRight","t2","t3","t4","AddIcon","ChevronDownIcon","CloseIcon","Box","Card","Flex","rem","studioTheme","Text","ThemeColorSchemeKey","components","StylesConfig","Virtuoso","getSchemeColor","radius","themeRadius","space","themeSpace","reactSelectStyles","scheme","control","styles","isFocused","boxShadow","indicatorsContainer","isDisabled","opacity","input","color","fontFamily","fonts","text","family","marginLeft","menuList","multiValue","backgroundColor","borderRadius","multiValueLabel","fontSize","padding","multiValueRemove","noOptionsMessage","lineHeight","option","placeholder","valueContainer","margin","DropdownIndicator","props","$","_c","t0","Symbol","for","t1","Menu","children","MenuList","Array","isArray","height","length","index","item","t2","MultiValueLabel","MultiValueRemove","Option","data","__isNew__","marginRight","reactSelectComponents","IndicatorSeparator","Box","Controller","CreatableSelect","useColorSchemeValue","useTypedSelector","reactSelectComponents","reactSelectStyles","TagSelectOption","FormFieldInputLabel","Props","control","description","disabled","error","label","name","onCreateTag","tagName","options","value","placeholder","FormFieldInputTags","props","$","_c","scheme","creating","_temp","tagsFetching","_temp2","t0","Symbol","for","zIndex","t1","t2","t3","field","onBlur","onChange","controllerValue","_temp3","t4","state","tags","state_0","fetching","Box","TextInput","ChangeEventHandler","FocusEventHandler","Ref","FormFieldInputLabel","Props","description","disabled","error","label","name","onBlur","HTMLInputElement","onChange","placeholder","value","ref","FormFieldInputText","props","$","_c","rest","t0","t1","t2","Box","TextArea","ChangeEventHandler","FocusEventHandler","Ref","FormFieldInputLabel","Props","description","disabled","error","label","name","onBlur","HTMLTextAreaElement","onChange","placeholder","rows","value","ref","FormFieldInputTextarea","props","$","_c","rest","t0","t1","t2","FolderIcon","TrashIcon","Box","Button","Card","Flex","Stack","Tab","TabList","TabPanel","Text","useState","Control","FieldErrors","UseFormRegister","Asset","AssetFormData","Locale","TagSelectOption","FormFieldInputLabel","FormFieldInputTags","FormFieldInputText","FormFieldInputTextarea","LocalizedErrors","Record","message","toStringField","value","found","Object","values","find","v","undefined","truncateFolderPath","path","segments","split","filter","Boolean","length","slice","join","DetailsProps","formUpdating","handleCreateTag","title","control","errors","register","allTagOptions","assetTagOptions","currentAsset","folderPath","folderMissing","onChangeFolder","onRemoveFolder","creditLine","enabled","excludeSources","locales","Details","hasLocales","activeLocaleTab","setActiveLocaleTab","folderId","opt","media","folder","_ref","folderLabel","tags","minWidth","overflowX","whiteSpace","overflowY","originalFilename","map","locale","idx","id","const","altText","description","includes","name","MutationEvent","Box","Button","Card","Flex","Stack","Tab","TabList","TabPanel","Text","groq","ReactNode","useCallback","useEffect","useMemo","useRef","useState","SubmitHandler","useForm","useFormState","useDispatch","WithReferringDocuments","useColorSchemeValue","useDocumentStore","useToolOptions","getAssetFormSchema","useTypedSelector","useVersionedClient","assetsActions","selectAssetById","dialogActions","DIALOG_ACTIONS","selectFolderPathById","selectTags","selectTagSelectOptions","tagsActions","Asset","AssetFormData","DialogAssetEditProps","TagSelectOption","getTagSelectOptions","getUniqueDocuments","imageDprUrl","sanitizeFormData","isFileAsset","isImageAsset","zodFormResolver","AssetMetadata","Dialog","DocumentList","FileAssetPreview","FormSubmitButton","Image","Details","DetailsProps","renderDefaultDetails","props","Props","children","dialog","DialogAssetEdit","$","_c","t0","assetId","id","lastCreatedTag","lastRemovedTagIds","client","scheme","documentStore","dispatch","t1","state","String","assetItem","tags","assetUpdatedPrev","undefined","assetSnapshot","setAssetSnapshot","asset","tabSection","setTabSection","currentAsset","t2","allTagOptions","t3","assetTagOptions","currentFolderId","opt","media","folder","_ref","t4","state_0","currentFolderPath","creditLine","components","t5","locales","t6","details","CustomDetails","t7","imageDescription","raw","metadata","image","ImageDescription","length","makeLocaleObj","field","t8","fallback","obj","i","locale","altText","description","originalFilename","title","flattenField","_temp2","generateDefaultValues","t9","t10","t11","defaultValues","mode","resolver","control","getValues","handleSubmit","register","reset","setValue","t12","errors","isDirty","isValid","formUpdating","updating","t13","remove","handleClose","t14","showConfirmDeleteAssets","assets","closeDialogId","_id","handleDelete","t15","Symbol","for","update","result","transition","handleAssetUpdate","t16","tagName","createRequest","name","handleCreateTag","t17","showFolderMove","folderId","handleChangeFolder","t18","folderSetRequest","handleRemoveFolder","t19","bb0","isLocaleObj","_temp3","fields","_type","anyLocalized","some","f","configuredIds","Set","map","_temp4","f_0","Object","keys","k","has","hasOrphanedLocales","t20","cleanField","field_1","Array","isArray","obj_0","Record","sorted","sort","k_0","find","_temp5","configuredIds_0","_temp6","cleaned","key","val","entries","patch","set","commit","handleCleanupLocales","t21","formData","sanitizedFormData","updateRequest","_temp7","onSubmit","t22","subscriptionAsset","listen","subscribe","unsubscribe","t23","t24","t25","t26","existingTags","updatedTags","concat","shouldDirty","t27","t28","existingTags_0","updatedTags_0","filter","tag_0","includes","tag","value","t29","current","_updatedAt","t30","t31","t32","t33","t34","t35","t36","t37","t38","t39","footer","t40","t41","folderPath","folderMissing","onChangeFolder","onRemoveFolder","detailsProps","t42","t43","t44","t45","isLoading","referringDocuments","uniqueReferringDocuments","display","t46","aspectRatio","t47","t48","isOpaque","height","width","t49","t50","t51","t52","t53","_temp","v","field_0","fallback_0","values","v_0","l","v_1","l_0","_weak","createSelector","CardAssetData","CardFolderData","CardUploadData","selectCurrentFolderChildren","RootReducerState","selectCombinedItems","state","assets","allIds","uploads","assetIds","uploadIds","folderChildren","assetItems","map","id","type","folderItems","folder","folderId","name","path","totalCount","uploadItems","combinedItems","isHotkey","RefObject","useCallback","useEffect","useRef","useKeyPress","hotkey","onPress","$","_c","keyPressed","t0","e","current","downHandler","t1","Symbol","for","upHandler","t2","t3","window","addEventListener","removeEventListener","CheckmarkCircleIcon","EditIcon","WarningFilledIcon","Box","Checkbox","Container","Flex","Spinner","Text","Theme","ThemeColorSchemeKey","useToast","Tooltip","memo","MouseEvent","RefObject","useDispatch","useColorSchemeValue","styled","css","PANEL_HEIGHT","useAssetSourceActions","useKeyPress","useTypedSelector","assetsActions","selectAssetById","selectAssetsPicked","dialogActions","getSchemeColor","imageDprUrl","isFileAsset","isImageAsset","FileIcon","Image","Props","id","selected","source","CardWrapper","CardContainer","$picked","theme","$updating","sanity","color","spot","orange","ContextActionContainer","$scheme","StyledWarningOutlineIcon","red","CardAsset","props","$","_c","scheme","toast","shiftPressed","dispatch","lastPicked","_temp","assetsPicked","t0","state_0","state","item","t1","state_1","dialog","items","find","_temp2","type","assetId","undefined","dialogReplaceAssetId","asset","error","isOpaque","metadata","picked","updating","assetToReplaceId","length","_id","t2","state_2","assetToReplace","isMultiSelect","onSelect","t3","updateImageReferences","push","status","title","clear","handleReplaceAsset","t4","e","stopPropagation","kind","value","current","pickRange","startId","endId","pick","showAssetEdit","handleAssetClick","t5","e_0","handleContextActionClick","opacityContainer","opacityPreview","t6","t7","cursor","position","t8","t9","height","opacity","t10","extension","t11","width","draggable","transition","t12","t13","left","top","t14","t15","t16","t17","flexShrink","pointerEvents","transform","t18","originalFilename","t19","t20","right","t21","assets","d","Box","Card","Flex","Stack","Text","useDispatch","useColorSchemeValue","css","styled","foldersActions","getSchemeColor","Props","folderId","name","totalCount","CardWrapper","FolderCard","FolderGlyph","theme","sanity","color","spot","yellow","CardFolder","t0","$","_c","dispatch","scheme","t1","currentFolderSet","t2","t3","background","border","t4","Symbol","for","t5","lineHeight","minHeight","wordBreak","t6","t7","t8","t9","t10","t11","Observable","from","of","mergeMap","PREVIEW_WIDTH","createBlob","img","HTMLImageElement","Promise","Blob","resolve","imageAspect","width","height","canvas","HTMLCanvasElement","document","createElement","Math","max","ctx","getContext","drawImage","toBlob","err","console","warn","createImageEl","file","File","blobUrlLarge","window","URL","createObjectURL","Image","onload","revokeObjectURL","src","generatePreviewBlobUrl","imageEl","blob","Error","generatePreviewBlobUrl$","pipe","Subject","Subscription","Observable","from","first","mergeMap","DEFAULT_CONCURRENCY","remove","array","Array","T","item","index","indexOf","splice","createThrottler","concurrency","currentSubscriptions","pendingObservables","ready$","request","observable","observer","length","scheduleAndWait$","pipe","subscribe","subscription","push","unsubscribe","next","shift","asObservable","obs","withMaxConcurrency","func","args","throttler","SanityAssetDocument","SanityClient","SanityImageAssetDocument","Observable","of","throwError","map","mergeMap","HttpError","withMaxConcurrency","fetchExisting$","client","type","hash","observable","fetch","documentType","readFile$","file","File","ArrayBuffer","subscriber","reader","FileReader","onload","next","result","complete","onerror","err","error","readAsArrayBuffer","abort","hexFromBuffer","buffer","Array","prototype","call","Uint8Array","x","toString","slice","join","hashFile$","window","crypto","subtle","message","statusCode","pipe","arrayBuffer","digest","uploadSanityAsset$","assetType","existingAsset","assets","upload","extract","preserveFilename","event","asset","body","document","id","_id","uploadAsset$","createSelector","createSlice","PayloadAction","ClientError","SanityAssetDocument","SanityImageAssetDocument","groq","EMPTY","from","merge","of","catchError","delay","filter","mergeMap","takeUntil","withLatestFrom","HttpError","MyEpic","SanityUploadProgressEvent","UploadItem","constructFilter","generatePreviewBlobUrl$","hashFile$","uploadAsset$","assetsActions","RootReducerState","UPLOADS_ACTIONS","UploadsReducerState","allIds","byIds","Record","initialState","uploadsSlice","name","extraReducers","builder","addCase","uploadComplete","state","action","asset","payload","sha1hash","status","reducers","checkRequest","_state","_action","assets","checkComplete","results","assetHashes","Object","keys","forEach","hash","deleteIndex","indexOf","splice","blobUrl","objectUrl","window","URL","revokeObjectURL","previewReady","uploadCancel","uploadError","error","uploadRequest","file","File","forceAsAssetType","uploadProgress","event","uploadHash","percent","uploadStart","uploadItem","includes","push","uploadsAssetStartEpic","action$","_state$","client","pipe","uploadsActions","match","url","assetType","v","type","folderId","patch","_id","setIfMissing","opt","set","_ref","_type","_weak","commit","stage","message","statusCode","uploadsAssetUploadEpic","state$","exists","uploads","folders","currentFolderId","size","uploadsCompleteQueueEpic","uploadsCheckRequestEpic","documentIds","map","constructedFilter","assetTypes","excludeTagSlugs","searchFacets","search","facets","searchQuery","query","observable","fetch","resultHashes","checkedResults","reduce","acc","insertUploads","selectUploadById","uploadId","actions","reducer","CloseIcon","Box","Button","Flex","Text","filesize","useDispatch","useColorSchemeValue","styled","PANEL_HEIGHT","useTypedSelector","selectUploadById","uploadsActions","getSchemeColor","FileIcon","Image","Props","id","CardWrapper","CardUpload","props","$","_c","scheme","dispatch","t0","state","item","t1","size","base","round","fileSize","percentLoaded","Math","percent","isComplete","status","isUploading","isQueued","t2","hash","uploadCancel","handleCancelUpload","t3","t4","background","border","height","position","t5","t6","bottom","left","width","transform","transformOrigin","transition","t7","Symbol","for","t8","assetType","objectUrl","opacity","t9","t10","top","boxShadow","t11","t12","t13","name","t14","flexShrink","t15","t16","t17","memo","VirtuosoGrid","styled","useTypedSelector","CardAssetData","CardFolderData","CardUploadData","CardAsset","CardFolder","CardUpload","Props","items","onLoadMore","source","CARD_HEIGHT","CARD_WIDTH","VirtualCell","t0","$","_c","item","selected","type","t1","id","folderId","name","totalCount","StyledItemContainer","div","ItemContainer","props","ref","rest","context","StyledListContainer","ListContainer","AssetGridVirtualized","selectedAssets","_temp","map","_temp2","selectedIds","length","index","t2","Symbol","for","Item","List","t3","index_0","item_0","includes","t4","overflowX","overflowY","t5","state","assets","asset","_id","Box","Text","useEffect","useRef","useState","useDispatch","useStore","useTypedSelector","assetsActions","foldersActions","searchActions","selectCombinedItems","RootReducerState","SearchFacetInputProps","WithId","isImageAsset","AssetGridVirtualized","omitFacetId","facet","id","_id","withoutId","ReplaceAssetsOverview","$","_c","dispatch","store","combinedItems","assetsById","_temp","fetchCount","_temp2","fetching","_temp3","fetchingError","_temp4","pageSize","_temp5","searchQuery","_temp6","searchFacets","_temp7","currentFolderId","_temp8","currentFolderUnfiled","_temp9","assetToReplaceId","_temp1","savedBrowserStateRef","t0","length","Boolean","awaitingRefetch","setAwaitingRefetch","t1","t2","dialog","dialog_0","folders","search","getState","query","facets","dialogItem","items","find","_temp10","current","assetId","type","undefined","folderId","folderUnfiled","querySet","facetsClear","currentFolderClear","saved","hadScope","facetsAdd","currentFolderSet","currentFolderShowUnfiled","pick","picked","t3","t4","previousIds","assets","allIds","awaitingSettle","subscribe","isFetching","listCleared","scopeActive","t5","t6","item_1","item","asset","filter","reducedItems","hasFetchedOnce","hasMorePages","isEmpty","t7","loadNextPage","t8","handleLoadMoreItems","t9","state","byIds","state_0","state_1","state_2","state_3","state_4","state_5","state_6","state_7","_temp0","state_8","item_0","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogAllAssetsProps","Dialog","ReplaceAssetsOverview","Props","children","dialog","DialogAllAssets","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","height","t3","WarningOutlineIcon","Box","Button","Flex","Stack","Text","ReactNode","useDispatch","dialogActions","DialogConfirmProps","Dialog","Props","children","dialog","DialogConfirm","props","$","_c","dispatch","t0","id","remove","handleClose","t1","closeDialogId","confirmCallbackAction","handleConfirm","t2","confirmText","tone","Footer","t3","headerTitle","Header","t4","t5","t6","title","t7","description","t8","t9","Box","Flex","Text","ReactNode","useEffect","SubmitHandler","useForm","useDispatch","folderFormSchema","useTypedSelector","dialogActions","foldersActions","selectFolderPathById","DialogFolderCreateProps","FolderFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogFolderCreate","props","$","_c","t0","parentFolderId","id","dispatch","creating","_temp","creatingError","_temp2","t1","state_1","state","parentPath","t2","Symbol","for","name","t3","defaultValues","mode","resolver","formState","t4","handleSubmit","register","setError","errors","isDirty","isValid","t5","clear","handleClose","t6","formData","sanitizedFormData","createRequest","parentId","onSubmit","t7","t8","message","t9","Footer","t10","t11","t12","display","t13","t14","t15","t16","t17","t18","folders","state_0","Box","Button","Flex","Inline","Stack","Text","Tree","TreeItem","pluralize","ReactNode","useMemo","useState","useDispatch","useTypedSelector","assetsActions","dialogActions","selectFolderTree","DialogFolderMoveProps","FolderTreeNode","Dialog","getExpandedIdSet","folderId","byId","Record","parentId","expanded","Set","cursor","node","add","Props","children","dialog","FolderNodeProps","expandedIds","onSelect","selectedId","FolderNode","t0","$","_c","hasChildren","length","selected","id","t1","has","t2","t3","name","totalCount","t4","t5","map","childNode","t6","FolderTreeProps","folderTree","FolderTree","DialogFolderMove","dispatch","_temp","assets","setSelectedId","selectedFolder","remove","handleClose","folderSetRequest","closeDialogId","handleMove","t7","t8","t9","t10","t11","t12","t13","t14","t15","Symbol","for","maxHeight","overflowY","t16","t17","t18","t19","t20","t21","state","folders","Box","Flex","Text","ReactNode","useEffect","SubmitHandler","useForm","useDispatch","folderFormSchema","useTypedSelector","dialogActions","foldersActions","selectFolderPathById","DialogFolderRenameProps","FolderFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogFolderRename","t0","$","_c","folderId","id","dispatch","renaming","_temp","renameError","_temp2","t1","state_1","state","folders","byId","folder","t2","state_2","folderPath","currentName","name","t3","includes","slice","lastIndexOf","parentPath","t4","t5","Symbol","for","t6","defaultValues","mode","resolver","formState","t7","handleSubmit","register","setError","errors","isDirty","isValid","t8","remove","handleClose","t9","formData","sanitizedFormData","renameRequest","onSubmit","t10","t11","message","t12","t13","t14","t15","t16","display","t17","t18","t19","t20","t21","t22","t23","state_0","AddIcon","EditIcon","FolderIcon","TrashIcon","Box","Button","Container","Flex","Inline","Label","Text","Tree","TreeItem","Tooltip","ReactNode","useMemo","useDispatch","PANEL_HEIGHT","useTypedSelector","dialogActions","DIALOG_ACTIONS","foldersActions","selectCanDeleteFolder","selectFolderTree","FolderTreeNode","getExpandedIdSet","folderId","byId","Record","parentId","expanded","Set","cursor","node","add","FolderNodeProps","currentFolderId","expandedIds","onSelect","FolderHeaderActionProps","disabled","icon","onClick","tone","tooltip","FolderHeaderAction","t0","$","_c","t1","t2","undefined","t3","t4","t5","window","FolderItemTextProps","name","totalCount","FolderItemText","Symbol","for","boxSizing","display","maxWidth","minWidth","overflow","paddingRight","position","width","alignItems","paddingLeft","gap","flexShrink","lineHeight","textOverflow","whiteSpace","t6","fontSize","opacity","right","top","transform","t7","t8","FolderNode","hasChildren","children","length","selected","id","has","map","childNode","FolderView","dispatch","_temp","_temp2","canDeleteFolder","fetching","_temp3","folderTree","currentFolder","Array","from","join","treeKey","hasFolders","currentFolderSet","handleFolderSelect","showConfirmDeleteFolder","folderName","handleFolderDelete","borderBottom","height","showFolderRename","t9","t10","showFolderCreate","parentFolderId","t11","t12","t13","t14","currentFolderClear","t15","t16","t17","t18","t19","t20","t21","t22","state","folders","state_0","state_1","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogFoldersProps","Dialog","FolderView","Props","children","dialog","DialogFolders","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","height","minHeight","t3","CloseIcon","Box","Flex","Label","rem","Text","ThemeColorSchemeKey","ReactNode","useDispatch","useColorSchemeValue","styled","css","searchActions","SearchFacetInputProps","WithId","getSchemeColor","Props","children","facet","Container","$scheme","theme","sanity","radius","SearchFacet","props","$","_c","scheme","dispatch","t0","id","facetsRemoveById","facetId","handleClose","t1","Symbol","for","t2","t3","t4","t5","t6","whiteSpace","t7","title","t8","t9","t10","t11","TextInput","ChangeEvent","Props","onValueChange","value","TextInputNumber","props","$","_c","remainingProps","t0","t1","t2","e","val","target","regex","test","parseInt","handleChange","SelectIcon","Box","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","operators","usePortalPopoverProps","searchActions","SearchFacetInputNumberModifier","SearchFacetInputNumberProps","SearchFacetOperatorType","WithId","SearchFacet","TextInputNumber","Props","facet","SearchFacetNumber","t0","$","_c","dispatch","popoverProps","modifiers","t1","modifier","find","name","selectedModifier","t2","id","operatorType","facetsUpdateById","handleOperatorItemClick","t3","modifier_0","handleModifierClick","t4","value","handleValueChange","selectedOperatorType","t5","operatorTypes","label","map","operatorType_0","index","selected","t6","Symbol","for","maxWidth","t7","t8","t9","title","modifier_1","selected_0","t10","SelectIcon","Box","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","operators","usePortalPopoverProps","searchActions","SearchFacetInputSelectListItemProps","SearchFacetInputSelectProps","SearchFacetOperatorType","WithId","SearchFacet","Props","facet","SearchFacetSelect","t0","$","_c","dispatch","popoverProps","options","t1","value","find","v","name","selectedItem","t2","option","facetsUpdate","handleListItemClick","t3","operatorType","handleOperatorItemClick","selectedOperatorType","t4","operatorTypes","label","map","operatorType_0","index","selected","t5","title","t6","t7","item","selected_0","t8","t9","t10","SelectIcon","Box","Button","TextInput","Menu","MenuButton","MenuDivider","MenuItem","ChangeEvent","useDispatch","operators","usePortalPopoverProps","searchActions","SearchFacetInputStringProps","SearchFacetOperatorType","WithId","SearchFacet","Props","facet","SearchFacetString","t0","$","_c","dispatch","popoverProps","t1","id","operatorType","facetsUpdateById","handleOperatorItemClick","t2","e","value","target","handleChange","selectedOperatorType","t3","operatorTypes","label","map","operatorType_0","index","selected","t4","hideInput","maxWidth","t5","CloseIcon","Box","Card","rem","studioTheme","Text","ThemeColorSchemeKey","components","StylesConfig","Virtuoso","getSchemeColor","fonts","radius","themeRadius","space","themeSpace","themeTextSizes","text","sizes","reactSelectStyles","scheme","control","styles","isDisabled","isFocused","boxShadow","fontSize","input","color","fontFamily","family","marginLeft","menuList","padding","noOptionsMessage","lineHeight","option","backgroundColor","placeholder","paddingLeft","singleValue","alignItems","display","height","valueContainer","margin","ClearIndicator","props","$","_c","t0","Symbol","for","transform","t1","t2","Menu","children","MenuList","Array","isArray","length","index","item","NoOptionsMessage","Option","SingleValue","reactSelectComponents","DropdownIndicator","IndicatorSeparator","SelectIcon","Box","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","Select","useColorSchemeValue","operators","useToolOptions","usePortalPopoverProps","useTypedSelector","searchActions","selectTags","reactSelectComponents","reactSelectStyles","TagSelectOption","SearchFacetInputSearchableProps","SearchFacetOperatorType","WithId","getTagSelectOptions","SearchFacet","Props","facet","SearchFacetTags","t0","$","_c","scheme","dispatch","excludeTagSlugs","tagsAll","_temp","t1","length","filter","t","includes","tag","name","current","tags","tagsFetching","_temp2","t2","allTagOptions","popoverProps","t3","id","option","facetsUpdateById","value","handleChange","t4","operatorType","handleOperatorItemClick","selectedOperatorType","t5","operatorTypes","label","map","operatorType_0","index","selected","minWidth","t6","hideInput","width","_temp3","t7","state","state_0","fetching","Box","Flex","Inline","rem","Theme","styled","css","useTypedSelector","SearchFacetNumber","SearchFacetSelect","SearchFacetString","SearchFacetTags","Props","layout","StackContainer","theme","sanity","space","SearchFacets","props","$","_c","t0","undefined","searchFacets","_temp","t1","map","_temp2","Items","length","t2","Error","state","search","facets","facet","key","id","type","AddIcon","Button","Flex","Menu","MenuButton","MenuDivider","MenuGroup","MenuItem","useDispatch","FACETS","useToolOptions","usePortalPopoverProps","useTypedSelector","searchActions","SearchFacetDivider","SearchFacetGroup","SearchFacetInputProps","SearchFacetsControl","$","_c","dispatch","assetTypes","_temp","searchFacets","_temp2","selectedDocument","_temp3","popoverProps","creditLine","isTool","T0","T1","T2","t0","t1","t2","enabled","t3","facet","type","name","selectOnly","matchingAssetTypes","filter","assetType","includes","length","filteredFacets","_temp4","hasSearchFacets","renderMenuFacets","facets_0","t4","level","undefined","facets","map","facet_1","index_0","index","title","disabled","operatorTypes","find","v","facetsAdd","t5","placement","t6","facetsClear","t7","state","assets","state_0","search","state_1","selected","document","facet_0","previousFacet","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogSearchFacetsProps","Dialog","SearchFacets","SearchFacetsControl","Props","children","dialog","DialogSearchFacets","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","t3","Box","Flex","ReactNode","useEffect","SubmitHandler","useForm","useDispatch","tagFormSchema","useTypedSelector","dialogActions","tagsActions","DialogTagCreateProps","TagFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogTagCreate","props","$","_c","t0","id","dispatch","creating","_temp","creatingError","_temp2","t1","Symbol","for","name","t2","defaultValues","mode","resolver","formState","t3","handleSubmit","register","setError","errors","isDirty","isValid","formUpdating","t4","clear","handleClose","t5","formData","sanitizedFormData","createRequest","onSubmit","t6","t7","message","t8","Footer","t9","t10","t11","display","t12","t13","t14","t15","t16","state","tags","state_0","MutationEvent","Box","Button","Card","Flex","Text","groq","ReactNode","useCallback","useEffect","useState","SubmitHandler","useForm","useDispatch","tagFormSchema","useTypedSelector","useVersionedClient","dialogActions","selectTagById","tagsActions","DialogTagEditProps","Tag","TagFormData","sanitizeFormData","zodFormResolver","Dialog","FormFieldInputText","FormSubmitButton","Props","children","dialog","DialogTagEdit","props","$","_c","t0","id","tagId","client","dispatch","t1","state","String","tagItem","tagSnapshot","setTagSnapshot","tag","currentTag","generateDefaultValues","_temp","t2","t3","t4","Symbol","for","t5","defaultValues","mode","resolver","formState","t6","handleSubmit","register","reset","setError","errors","isDirty","isValid","formUpdating","updating","t7","remove","handleClose","t8","formData","sanitizedFormData","updateRequest","closeDialogId","_id","name","_type","current","onSubmit","t9","showConfirmDeleteTag","handleDelete","t10","update","result","transition","handleTagUpdate","t11","error","message","t12","t13","t14","subscriptionAsset","listen","subscribe","unsubscribe","t15","t16","t17","_updatedAt","Footer","t18","t19","t20","t21","display","t22","t23","t24","t25","t26","ArrowDownIcon","ArrowUpIcon","CloseIcon","EditIcon","SearchIcon","TrashIcon","Box","Button","Container","Flex","Text","Tooltip","ReactNode","useDispatch","styled","inputs","PANEL_HEIGHT","useTypedSelector","selectAssetsPicked","dialogActions","DIALOG_ACTIONS","searchActions","selectIsSearchFacetTag","SearchFacetInputSearchableProps","TagActions","TagItem","Props","actions","tag","TagContainer","ButtonContainer","TagButtonProps","disabled","icon","onClick","tone","tooltip","TagButton","props","$","_c","t0","t1","t2","window","Tag","dispatch","assetsPicked","_id","state","isSearchFacetTag","facetsRemoveByTag","tagId","handleSearchFacetTagRemove","showConfirmAssetsTagAdd","handleShowAddTagToAssetsDialog","t3","showConfirmAssetsTagRemove","handleShowRemoveTagFromAssetsDialog","t4","showConfirmDeleteTag","handleShowTagDeleteDialog","t5","showTagEdit","handleShowTagEditDialog","t6","name","current","searchFacet","value","label","facetsUpdate","operatorType","facetsAdd","facet","handleSearchFacetTagAddOrUpdate","t7","updating","t8","opacity","userSelect","t9","t10","t11","Symbol","for","flexShrink","t12","includes","t13","t14","t15","t16","t17","t18","Flex","Label","memo","useState","Virtuoso","PANEL_HEIGHT","useTypedSelector","selectAssetsPicked","TagActions","TagItem","Tag","VirtualRow","t0","$","_c","isScrolling","item","t1","Symbol","for","height","t2","t3","undefined","actions","tag","_id","TagsVirtualized","tags","assetsPicked","setIsScrolling","items","pickedTagIds","reduce","_temp2","pickedTagIdsUnique","Set","acc_0","tagId","tagIsInEveryAsset","every","assetItem","tagIndex","asset","opt","media","findIndex","tag_0","_ref","acc","appliedToAll","push","appliedToSome","tagIdsSegmented","tagsAppliedToAll","filter","tag_1","includes","map","_temp3","tagsAppliedToSome","tag_2","_temp4","tagsUnused","tag_3","_temp5","length","_temp6","index","index_0","flex","overflowX","t4","_temp","val","assetTagIds","concat","tagItem","tagItem_0","tagItem_1","tagItem_2","ComposeIcon","Box","Button","Flex","Inline","Label","useDispatch","useColorSchemeValue","PANEL_HEIGHT","useTypedSelector","DIALOG_ACTIONS","getSchemeColor","Props","allowCreate","light","title","TagViewHeader","t0","$","_c","scheme","dispatch","tagsCreating","_temp","tagsFetching","_temp2","t1","showTagCreate","handleTagCreate","t2","t3","background","borderBottom","flexShrink","height","t4","t5","opacity","t6","t7","boxShadow","t8","state","tags","creating","state_0","fetching","Box","Flex","Text","useToolOptions","useTypedSelector","selectAssetsPickedLength","selectTags","TagsVirtualized","TagViewHeader","TagView","$","_c","numPickedAssets","excludeTagSlugs","tagsAll","t0","length","filter","t","includes","tag","name","current","tags","fetching","_temp","fetchCount","_temp2","fetchComplete","hasTags","hasPicked","t1","t2","t3","t4","t5","state","state_0","Box","ReactNode","useCallback","useDispatch","dialogActions","DialogTagsProps","Dialog","TagView","Props","children","dialog","DialogTags","props","$","_c","t0","id","dispatch","t1","clear","handleClose","t2","Symbol","for","height","minHeight","t3","useTypedSelector","Dialog","DialogAssetEdit","DialogAllAssets","DialogConfirm","DialogFolderCreate","DialogFolderMove","DialogFolderRename","DialogFolders","DialogSearchFacets","DialogTagCreate","DialogTagEdit","DialogTags","Dialogs","$","_c","currentDialogs","_temp","t0","renderDialogs","dialogs","index","length","dialog","childDialogs","type","state","items","useToast","useEffect","useTypedSelector","Notifications","$","_c","items","_temp","toast","t0","t1","length","lastItem","push","closable","status","title","state","notifications","PayloadAction","createSlice","DebugReducerState","badConnection","enabled","initialState","debugSlice","name","reducers","setBadConnection","state","action","payload","toggleEnabled","debugActions","actions","reducer","PayloadAction","createSlice","UnknownAction","pluralize","ofType","of","bufferTime","filter","mergeMap","HttpError","ImageAsset","MyEpic","assetsActions","ASSETS_ACTIONS","foldersActions","tagsActions","uploadsActions","Notification","asset","status","title","NotificationsReducerState","items","messageFromGenericErrorPayload","payload","error","String","message","initialState","notificationsSlice","name","reducers","add","state","action","push","notificationsAssetsDeleteCompleteEpic","action$","pipe","deleteComplete","match","assetIds","deletedCount","length","actions","notificationsAssetsDeleteErrorEpic","deleteError","count","notificationsAssetsUploadCompleteEpic","checkComplete","results","Object","keys","notificationsAssetsTagsAddCompleteEpic","tagsAddComplete","assets","notificationsAssetsTagsRemoveCompleteEpic","tagsRemoveComplete","notificationsAssetsUpdateCompleteEpic","updateComplete","updatedCount","notificationsGenericErrorEpic","fetchError","type","updateError","createError","renameError","uploadError","notificationsTagCreateCompleteEpic","createComplete","notificationsTagDeleteCompleteEpic","notificationsTagUpdateCompleteEpic","notificationsFolderCreateCompleteEpic","notificationsFolderDeleteCompleteEpic","notificationsFolderRenameCompleteEpic","renameComplete","notificationsActions","reducer","createSlice","SanityAssetDocument","SanityDocument","SanityImageAssetDocument","SelectedReducerState","assets","document","documentAssetIds","initialState","undefined","selectedSlice","name","reducers","reducer","Reducer","StateFromReducersMapObject","combineReducers","combineEpics","assetsReducer","assetsDeleteEpic","assetsFetchAfterDeleteAllEpic","assetsFetchEpic","assetsFolderSetEpic","assetsFolderSetRefreshEpic","assetsFetchNextPageEpic","assetsFetchPageIndexEpic","assetsListenerCreateQueueEpic","assetsListenerDeleteQueueEpic","assetsListenerUpdateQueueEpic","assetsOrderSetEpic","assetsSearchEpic","assetsSortEpic","assetsTagsAddEpic","assetsTagsRemoveEpic","assetsUnpickEpic","assetsUpdateEpic","assetsUpdateImageReferencesEpic","debugReducer","dialogReducer","dialogClearOnAssetUpdateEpic","dialogTagCreateEpic","dialogTagDeleteEpic","foldersReducer","foldersCurrentFolderEpic","foldersCreateEpic","foldersDeleteEpic","foldersFetchEpic","foldersRefreshEpic","foldersRenameEpic","notificationsReducer","notificationsAssetsDeleteErrorEpic","notificationsAssetsDeleteCompleteEpic","notificationsAssetsTagsAddCompleteEpic","notificationsAssetsTagsRemoveCompleteEpic","notificationsAssetsUpdateCompleteEpic","notificationsFolderCreateCompleteEpic","notificationsFolderDeleteCompleteEpic","notificationsFolderRenameCompleteEpic","notificationsGenericErrorEpic","notificationsTagCreateCompleteEpic","notificationsTagDeleteCompleteEpic","notificationsTagUpdateCompleteEpic","searchReducer","searchFacetTagUpdateEpic","selectedReducer","tagsReducer","tagsCreateEpic","tagsDeleteEpic","tagsFetchEpic","tagsListenerCreateQueueEpic","tagsListenerDeleteQueueEpic","tagsListenerUpdateQueueEpic","tagsSortEpic","tagsUpdateEpic","uploadsReducer","uploadsAssetStartEpic","uploadsAssetUploadEpic","uploadsCheckRequestEpic","uploadsCompleteQueueEpic","rootEpic","reducers","assets","debug","dialog","folders","notifications","search","selected","tags","uploads","ReducersMapObject","rootReducer","SanityDocument","isPlainObject","value","Array","isArray","getAssetIds","node","Record","acc","forEach","v","_type","_ref","push","Object","values","val","getDocumentAssetIds","document","assetIds","Set","sort","SUPPORTED_ASSET_TYPES","AssetType","isSupportedAssetType","assetType","supported","includes","configureStore","Store","UnknownAction","SanityClient","ReactNode","useState","Provider","createEpicMiddleware","AssetSourceComponentProps","SanityDocument","rootEpic","rootReducer","initialState","assetsInitialState","RootReducerState","getDocumentAssetIds","isSupportedAssetType","Props","assetType","children","client","document","excludeTagSlugs","selectedAssets","createReduxStore","props","epicMiddleware","dependencies","store","reducer","middleware","getDefaultMiddleware","serializableCheck","thunk","prepend","devTools","preloadedState","assets","assetTypes","length","debug","badConnection","enabled","dialog","items","folders","byId","childrenByParentId","rootIds","exactCountByFolderId","unfiledCount","currentFolderId","currentFolderUnfiled","panelVisible","fetching","fetchCount","creating","renaming","notifications","search","facets","query","selected","documentAssetIds","tags","allIds","byIds","uploads","run","ReduxProvider","t0","$","_c","t1","t2","PortalProvider","useEffect","useRef","useDispatch","AssetSourceComponentProps","SanityDocument","useFormValue","AssetBrowserDispatchProvider","useRootPortalElement","useTypedSelector","useVersionedClient","assetsActions","dialogActions","foldersActions","tagsActions","GlobalStyle","constructFilter","Dialogs","Notifications","ReduxProvider","EditAssetDialog","t0","$","_c","assetId","onClose","dispatch","openDialogCount","_temp","hasOpenedRef","t1","t2","queryFilter","assetTypes","searchFacets","fetchRequest","params","showAssetEdit","t3","t4","current","t5","Symbol","for","EditAssetTool","props","selectedAssets","portalElement","currentDocument","client","_id","undefined","t6","t7","onSelect","t8","assetType","state","dialog","items","length","ThLargeIcon","ThListIcon","Button","Inline","useDispatch","useTypedSelector","assetsActions","ButtonViewGroup","$","_c","dispatch","view","_temp","t0","Symbol","for","whiteSpace","t1","t2","viewSet","t3","borderBottomRightRadius","borderTopRightRadius","t4","t5","t6","t7","borderBottomLeftRadius","borderTopLeftRadius","t8","t9","state","assets","SortIcon","Button","Menu","MenuButton","MenuDivider","MenuItem","useDispatch","getOrderTitle","ORDER_OPTIONS","usePortalPopoverProps","useTypedSelector","assetsActions","OrderSelect","$","_c","dispatch","order","_temp","popoverProps","t0","direction","field","t1","t2","map","item","index","selected","orderSet","minWidth","t3","t4","state","assets","Box","useNProgress","Props","loading","Progress","props","$","_c","t0","animationDuration","isAnimating","isFinished","progress","t1","t2","t3","opacity","transition","t4","t5","t6","height","background","position","left","top","width","t7","TagIcon","$","_c","t0","Symbol","for","CloseIcon","SearchIcon","Box","Flex","TextInput","ChangeEvent","useDispatch","useTypedSelector","searchActions","TextInputSearch","$","_c","searchQuery","_temp","dispatch","t0","e","querySet","currentTarget","value","handleChange","t1","handleClear","t2","Symbol","for","position","t3","t4","length","cursor","height","opacity","right","top","width","zIndex","t5","state","search","query","FolderIcon","Box","Button","Flex","Inline","useMediaIndex","useDispatch","useTypedSelector","dialogActions","foldersActions","tagsActions","ButtonViewGroup","OrderSelect","Progress","SearchFacets","SearchFacetsControl","TagIcon","TextInputSearch","Controls","$","_c","dispatch","fetching","_temp","foldersPanelVisible","_temp2","pageIndex","_temp3","searchFacets","_temp4","tagsPanelVisible","_temp5","mediaIndex","t0","showSearchFacets","handleShowSearchFacetDialog","t1","showFolders","handleShowFoldersDialog","t2","showTags","handleShowTagsDialog","t3","panelVisibleSet","panelVisible","toggleFoldersPanel","t4","toggleTagsPanelToggle","t5","Symbol","for","borderBottom","zIndex","t6","t7","t8","alignItems","flex","height","justifyContent","position","width","t9","minWidth","t10","t11","t12","t13","t14","whiteSpace","t15","length","t16","t17","t18","t19","t20","t21","t22","t23","t24","t25","t26","t27","t28","t29","t30","transform","t31","t32","t33","t34","t35","t36","state","assets","state_0","folders","state_1","state_2","search","facets","state_3","tags","PlugIcon","Box","Flex","Switch","Text","Tooltip","ChangeEvent","useDispatch","useKeyPress","useTypedSelector","debugActions","DebugControls","$","_c","dispatch","badConnection","_temp","debugEnabled","_temp2","t0","e","checked","target","setBadConnection","handleChange","t1","toggleEnabled","handleToggleControls","t2","Symbol","for","bottom","left","pointerEvents","position","width","t3","t4","t5","t6","t7","t8","t9","state","debug","state_0","enabled","Box","Button","Inline","Text","useDispatch","useTypedSelector","foldersActions","selectCurrentFolderSegments","FolderBreadcrumbs","$","_c","dispatch","currentFolderId","_temp","segments","t0","Symbol","for","t1","currentFolderClear","t2","t3","segment","id","currentFolderSet","folderId","name","map","state","folders","Box","FOLDERS_PANEL_WIDTH","useTypedSelector","FolderView","FolderPanel","$","_c","foldersPanelVisible","_temp","t0","Symbol","for","position","width","t1","borderRight","height","left","overflowX","overflowY","top","state","folders","panelVisible","ReactNode","createContext","useContext","useMemo","ContextProps","open","Props","children","DropzoneDispatchContext","undefined","DropzoneDispatchProvider","props","$","_c","t0","contextValue","t1","useDropzoneActions","context","Error","ArrowRightIcon","CloseIcon","UploadIcon","Box","Button","Flex","Inline","Text","pluralize","useAssetSourceActions","useDropzoneActions","useToolOptions","useTypedSelector","Props","onClose","Header","props","$","_c","open","onSelect","assetTypes","_temp","selectedDocument","_temp2","directUploads","t0","Symbol","for","whiteSpace","t1","join","t2","t3","margin","textTransform","_type","t4","t5","length","t6","flexShrink","t7","t8","state","assets","state_0","selected","document","ChevronDownIcon","ChevronUpIcon","Box","Label","useDispatch","useTypedSelector","assetsActions","Props","field","title","TableHeaderItem","props","$","_c","dispatch","order","_temp","isActive","t0","direction","orderSet","handleClick","t1","t2","undefined","t3","t4","cursor","display","whiteSpace","t5","Symbol","for","marginRight","t6","t7","t8","t9","t10","state","assets","Checkbox","Flex","Grid","useMediaIndex","ThemeColorSchemeKey","MouseEvent","useDispatch","useColorSchemeValue","styled","css","GRID_TEMPLATE_COLUMNS","PANEL_HEIGHT","useAssetSourceActions","useTypedSelector","assetsActions","selectAssetsLength","selectAssetsPickedLength","getSchemeColor","TableHeaderItem","ContextActionContainer","$scheme","TableHeader","$","_c","scheme","dispatch","fetching","_temp","itemsLength","numPickedAssets","mediaIndex","onSelect","allSelected","t0","e","stopPropagation","pickClear","pickAll","handleContextActionClick","t1","t2","t3","t4","alignItems","background","borderBottom","columnGap","gridTemplateColumns","LARGE","height","letterSpacing","position","textTransform","top","visibility","width","zIndex","t5","pointerEvents","transform","t10","t11","t12","t13","t6","t7","t8","t9","Symbol","for","t14","state","assets","CheckmarkCircleIcon","EditIcon","WarningFilledIcon","Box","Checkbox","Container","Flex","Grid","Spinner","Text","ThemeColorSchemeKey","useMediaIndex","Tooltip","formatRelative","filesize","memo","MouseEvent","RefObject","useCallback","useEffect","useRef","useState","useDispatch","WithReferringDocuments","useColorSchemeValue","styled","css","GRID_TEMPLATE_COLUMNS","useAssetSourceActions","useKeyPress","useTypedSelector","assetsActions","selectAssetById","dialogActions","getAssetResolution","getSchemeColor","getUniqueDocuments","imageDprUrl","isFileAsset","isImageAsset","FileIcon","Image","REFERENCE_COUNT_VISIBILITY_DELAY","Props","id","selected","ContainerGrid","$selected","$scheme","$updating","ContextActionContainer","StyledWarningIcon","theme","color","sanity","spot","red","TableRowAsset","props","$","_c","scheme","shiftPressed","referenceCountVisible","setReferenceCountVisible","refCountVisibleTimeout","dispatch","lastPicked","_temp","t0","state_0","state","item","mediaIndex","asset","error","isOpaque","metadata","picked","updating","isMultiSelect","onSelect","t1","e","stopPropagation","showAssetEdit","assetId","_id","current","pickRange","startId","endId","pick","handleContextActionClick","t2","e_0","kind","value","handleClick","opacityCell","opacityPreview","t3","t4","Symbol","for","setTimeout","clearTimeout","t5","undefined","t6","t7","SMALL","LARGE","t8","t9","columnGap","rowGap","gridTemplateColumns","gridTemplateRows","t10","t11","alignItems","gridColumn","gridRowStart","gridRowEnd","height","justifyContent","opacity","position","t12","flexShrink","pointerEvents","transform","t13","t14","width","t15","t16","t17","extension","t18","t19","t20","left","top","t21","t22","t23","t24","t25","gridRow","t26","lineHeight","t27","originalFilename","t28","t29","t30","t31","t32","t33","t34","t35","t36","t37","t38","display","t39","t40","mimeType","t41","t42","t43","t44","t45","size","base","round","t46","t47","t48","t49","t50","t51","t52","t53","_updatedAt","Date","t54","t55","t56","t57","t58","t59","_temp2","t60","t61","t62","t63","t64","t65","t66","assets","isLoading","referringDocuments","uniqueDocuments","Array","isArray","length","Box","Flex","Grid","Stack","Text","useMediaIndex","useDispatch","useColorSchemeValue","css","styled","GRID_TEMPLATE_COLUMNS","foldersActions","getSchemeColor","Props","folderId","name","totalCount","ContainerGrid","theme","sanity","color","card","enabled","bg","FolderBadge","spot","yellow","TableRowFolder","t0","$","_c","dispatch","mediaIndex","scheme","t1","currentFolderSet","t2","t3","t4","SMALL","LARGE","t5","t6","background","gridColumnGap","gridTemplateColumns","gridTemplateRows","t7","Symbol","for","t8","gridColumn","height","width","t9","t10","t11","t12","gridRow","t13","lineHeight","t14","t15","t16","t17","t18","t19","display","t20","t21","t22","t23","t24","t25","t26","t27","t28","CloseIcon","Box","Button","Flex","Grid","Stack","Text","useMediaIndex","filesize","useDispatch","useColorSchemeValue","GRID_TEMPLATE_COLUMNS","useTypedSelector","selectUploadById","uploadsActions","getSchemeColor","FileIcon","Image","Props","id","TableRowUpload","props","$","_c","scheme","dispatch","t0","state","item","mediaIndex","t1","size","base","round","fileSize","percentLoaded","Math","percent","isComplete","status","isUploading","isQueued","t2","hash","uploadCancel","handleCancelUpload","t3","t4","t5","SMALL","LARGE","t6","t7","alignItems","background","columnGap","rowGap","gridTemplateColumns","gridTemplateRows","height","position","t8","t9","bottom","left","width","transform","transformOrigin","transition","t10","t11","t12","gridColumn","gridRowStart","gridRowEnd","t13","Symbol","for","t14","assetType","objectUrl","opacity","t15","t16","top","boxShadow","t17","t18","t19","t20","t21","t22","gridRow","marginLeft","t23","name","t24","t25","t26","t27","Box","memo","GroupedVirtuoso","useTypedSelector","CardAssetData","CardFolderData","CardUploadData","TableHeader","TableRowAsset","TableRowFolder","TableRowUpload","Props","items","onLoadMore","VirtualRow","t0","$","_c","item","selected","type","t1","Symbol","for","height","t2","id","folderId","name","totalCount","AssetTableVirtualized","props","selectedAssets","_temp","map","_temp2","selectedIds","length","index","Array","fill","t3","index_0","item_0","includes","t4","overflowX","t5","_temp3","state","assets","asset","_id","Box","Text","useMediaIndex","useEffect","useDispatch","useTypedSelector","assetsActions","foldersActions","selectCombinedItems","tagsActions","AssetGridVirtualized","AssetTableVirtualized","Items","$","_c","dispatch","fetchCount","_temp","fetching","_temp2","foldersPanelVisible","_temp3","tagsPanelVisible","_temp4","view","_temp5","combinedItems","mediaIndex","hasFetchedOnce","hasItems","length","t0","loadNextPage","handleLoadMoreItems","t1","t2","panelVisibleSet","panelVisible","isEmpty","t3","Symbol","for","width","t4","state","assets","state_0","state_1","folders","state_2","tags","state_3","Box","Button","Flex","Label","pluralize","useDispatch","useColorSchemeValue","PANEL_HEIGHT","useAssetSourceActions","useTypedSelector","assetsActions","selectAssetsPicked","dialogActions","DIALOG_ACTIONS","getSchemeColor","isImageAsset","PickedBar","$","_c","scheme","dispatch","assetsPicked","currentFolderId","_temp","isMultiSelect","onSelect","t0","length","asset","canReplace","t1","pickClear","handlePickClear","t2","showConfirmDeleteAssets","assets","handleDeletePicked","t3","_id","assetId","showAllAssetsDialog","handleReplaceImages","t4","showFolderMove","folderId","handleMovePicked","t5","folderSetRequest","handleRemovePickedFromFolder","t6","pickedAssetIds","map","_temp2","handleInsertPicked","t7","t8","background","borderBottom","height","position","width","t9","Symbol","for","color","t10","t11","t12","t13","boxShadow","t14","t15","t16","t17","t18","t19","t20","state","folders","item","kind","const","value","Box","TAGS_PANEL_WIDTH","useTypedSelector","TagView","TagsPanel","$","_c","tagsPanelVisible","_temp","t0","Symbol","for","position","width","t1","borderLeft","height","overflowX","overflowY","right","top","state","tags","panelVisible","white","Flex","Text","ReactNode","DropEvent","DropzoneOptions","useDropzone","useDispatch","styled","useAssetSourceActions","DropzoneDispatchProvider","useToolOptions","useTypedSelector","notificationsActions","uploadsActions","Props","children","UploadContainer","div","DragActiveContainer","filterFiles","fileList","FileList","files","Array","from","filteredFiles","File","file","slice","arrayBuffer","push","UploadDropzone","props","$","_c","dropzone","t0","directUploads","maxSize","onSelect","dispatch","assetTypes","_temp","isImageAssetType","length","t1","acceptedFiles","forEach","uploadRequest","forceAsAssetType","undefined","handleDrop","t2","rejections","errorCodes","flatMap","_temp3","includes","add","status","title","handleDropRejected","t3","event","type","dataTransfer","target","HTMLInputElement","handleFileGetter","t4","t5","t6","t7","accept","getFilesFromEvent","noClick","noDrag","onDrop","onDropRejected","disabled","getRootProps","getInputProps","isDragActive","open","t8","t9","t10","t11","color","hex","t12","t13","state","assets","_temp2","code","errors","map","MutationEvent","SanityClient","groq","useEffect","useDispatch","useSelector","Dispatch","AssetSourceComponentProps","inputs","FOLDER_DOCUMENT_NAME","TAG_DOCUMENT_NAME","assetsActions","foldersActions","searchActions","tagsActions","RootReducerState","Asset","Tag","getMediaTagNames","schemaType","mediaTags","options","length","unique","Set","map","t","trim","filter","Boolean","Array","from","createAssetHandler","dispatch","update","documentId","result","transition","listenerCreateQueue","asset","listenerDeleteQueue","assetId","listenerUpdateQueue","createTagHandler","tag","tagId","useBrowserInit","client","tagsByIds","state","tags","byIds","tagsFetchCount","fetchCount","tagNames","hasMediaTags","facetsClear","fetchRequest","assetSubscription","listen","subscribe","tagSubscription","folderSubscription","unsubscribe","tagFacetInput","type","resolvedTags","name","Object","values","find","item","current","NonNullable","tagItem","facetsAdd","facet","operatorType","value","label","_id","Card","Flex","PortalProvider","useState","AssetSourceComponentProps","SanityDocument","AssetBrowserDispatchProvider","useToolOptions","useVersionedClient","GlobalStyle","Controls","DebugControls","Dialogs","FolderBreadcrumbs","FolderPanel","Header","Items","Notifications","PickedBar","ReduxProvider","TagsPanel","UploadDropzone","useBrowserInit","Props","assetType","document","isMultiSelect","onClose","onSelect","selectedAssets","schemaType","BrowserContent","t0","$","_c","client","portalElement","setPortalElement","t1","t2","Symbol","for","t3","t4","t5","t6","t7","t8","position","t9","t10","Browser","props","excludeTagSlugs","Box","Portal","PortalProvider","useLayer","SyntheticEvent","AssetSourceComponentProps","SanityDocument","useFormValue","useKeyPress","useRootPortalElement","Browser","FormBuilderTool","props","$","_c","onClose","portalElement","t0","Symbol","for","currentDocument","selectionType","schemaJsonType","schemaType","jsonType","isMultiSelect","handleStopPropagation","_temp","zIndex","t1","bottom","height","left","position","top","width","t2","t3","t4","event","nativeEvent","stopImmediatePropagation","stopPropagation","Flex","Browser","Tool","$","_c","t0","Symbol","for","FolderIcon","FOLDER_DOCUMENT_NAME","title","icon","name","type","fields","to","weak","preview","select","parentName","prepare","selection","media","subtitle","undefined","TagIcon","TAG_DOCUMENT_NAME","title","icon","name","type","fields","preview","select","prepare","selection","media","current","EditIcon","ImageIcon","AssetSource","Tool","SanityTool","definePlugin","EditAssetTool","FormBuilderTool","ToolOptionsProvider","mediaFolder","mediaTag","MediaToolOptions","plugin","icon","name","title","mediaAssetSource","component","editMediaAssetSource","tool","__internalApplicationType","media","options","studio","components","layout","props","renderDefault","form","file","assetSources","prev","image","schema","types","tools","SanityClient","groq","nanoid","TAG_DOCUMENT_NAME","Tag","ApplyMediaTagsOptions","client","assetId","mediaTags","createTagsOnUpload","pendingByAsset","Map","Promise","applyMediaTags","options","chain","get","resolve","then","doApplyMediaTags","cleanup","catch","finally","delete","set","length","resolvedTags","all","map","tagName","existingTag","fetch","newTag","create","_type","name","current","validTags","filter","tag","existing","tagIds","useCdn","existingIds","Set","tagReferences","has","_id","_key","_ref","const","_weak","patch","setIfMissing","opt","append","commit","useToast","useEffect","useRef","InputProps","useToolOptions","useVersionedClient","applyMediaTags","AssetValue","_type","asset","_ref","AutoTagInputProps","mediaTags","AutoTagInput","props","$","_c","renderDefault","schemaType","value","mediaTagsProp","toast","options","client","createTagsOnUpload","prevAssetRef","undefined","isInitialMount","currentAssetRef","t0","t1","current","previousRef","length","assetId","catch","err","console","error","label","push","closable","status","title","join","t2","t3","FieldDefinitionBase","FileDefinition","ImageDefinition","WidenInitialValue","WidenValidation","AutoTagInput","ImageMediaFieldConfig","Omit","name","mediaTags","options","FileMediaFieldConfig","ImageMediaFieldResult","components","input","FileMediaFieldResult","mediaField","config","rest","Record"],"sources":["../src/contexts/AssetSourceDispatchContext.tsx","../src/hooks/useRootPortalElement.ts","../src/hooks/useTypedSelector.ts","../src/hooks/useVersionedClient.ts","../src/config/orders.ts","../src/config/searchFacets.ts","../src/constants.ts","../src/operators/debugThrottle.ts","../src/utils/constructFilter.ts","../src/utils/ReplaceImages.ts","../src/operators/checkTagName.ts","../src/utils/getTagSelectOptions.ts","../src/modules/assets/actions.ts","../src/modules/dialog/actions.ts","../src/modules/tags/index.ts","../src/modules/search/index.ts","../src/modules/uploads/actions.ts","../src/modules/assets/index.ts","../src/modules/folders/index.ts","../src/modules/dialog/index.ts","../src/styled/GlobalStyles/index.tsx","../src/contexts/ToolOptionsContext.tsx","../src/formSchema/index.ts","../src/utils/getUniqueDocuments.ts","../src/utils/imageDprUrl.ts","../src/utils/sanitizeFormData.ts","../src/utils/typeGuards.ts","../src/utils/zodFormResolver.ts","../src/utils/getAssetResolution.ts","../src/hooks/usePortalPopoverProps.ts","../src/components/ButtonAssetCopy/index.tsx","../src/components/AssetMetadata/index.tsx","../src/components/Dialog/index.tsx","../src/components/DocumentList/index.tsx","../src/components/FileIcon/index.tsx","../src/components/FileAssetPreview/index.tsx","../src/components/FormSubmitButton/index.tsx","../src/utils/getSchemeColor.ts","../src/components/Image/index.tsx","../src/components/FormFieldInputLabel/index.tsx","../src/styled/react-select/creatable.tsx","../src/components/FormFieldInputTags/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/components/FormFieldInputTextarea/index.tsx","../src/components/DialogAssetEdit/Details.tsx","../src/components/DialogAssetEdit/index.tsx","../src/modules/selectors.ts","../src/hooks/useKeyPress.ts","../src/components/CardAsset/index.tsx","../src/components/CardFolder/index.tsx","../src/utils/generatePreviewBlobUrl.ts","../src/utils/withMaxConcurrency.ts","../src/utils/uploadSanityAsset.ts","../src/modules/uploads/index.ts","../src/components/CardUpload/index.tsx","../src/components/AssetGridVirtualized/index.tsx","../src/components/ReplaceAssetsOverView/index.tsx","../src/components/DialogAssetsOverView/index.tsx","../src/components/DialogConfirm/index.tsx","../src/components/DialogFolderCreate/index.tsx","../src/components/DialogFolderMove/index.tsx","../src/components/DialogFolderRename/index.tsx","../src/components/FolderView/index.tsx","../src/components/DialogFolders/index.tsx","../src/components/SearchFacet/index.tsx","../src/components/TextInputNumber/index.tsx","../src/components/SearchFacetNumber/index.tsx","../src/components/SearchFacetSelect/index.tsx","../src/components/SearchFacetString/index.tsx","../src/styled/react-select/single.tsx","../src/components/SearchFacetTags/index.tsx","../src/components/SearchFacets/index.tsx","../src/components/SearchFacetsControl/index.tsx","../src/components/DialogSearchFacets/index.tsx","../src/components/DialogTagCreate/index.tsx","../src/components/DialogTagEdit/index.tsx","../src/components/Tag/index.tsx","../src/components/TagsVirtualized/index.tsx","../src/components/TagViewHeader/index.tsx","../src/components/TagView/index.tsx","../src/components/DialogTags/index.tsx","../src/components/Dialogs/index.tsx","../src/components/Notifications/index.tsx","../src/modules/debug/index.ts","../src/modules/notifications/index.ts","../src/modules/selected/index.ts","../src/modules/index.ts","../src/utils/getDocumentAssetIds.ts","../src/utils/isSupportedAssetType.ts","../src/components/ReduxProvider/index.tsx","../src/components/EditAssetTool/index.tsx","../src/components/ButtonViewGroup/index.tsx","../src/components/OrderSelect/index.tsx","../src/components/Progress/index.tsx","../src/components/TagIcon/index.tsx","../src/components/TextInputSearch/index.tsx","../src/components/Controls/index.tsx","../src/components/DebugControls/index.tsx","../src/components/FolderBreadcrumbs/index.tsx","../src/components/FolderPanel/index.tsx","../src/contexts/DropzoneDispatchContext.tsx","../src/components/Header/index.tsx","../src/components/TableHeaderItem/index.tsx","../src/components/TableHeader/index.tsx","../src/components/TableRowAsset/index.tsx","../src/components/TableRowFolder/index.tsx","../src/components/TableRowUpload/index.tsx","../src/components/AssetTableVirtualized/index.tsx","../src/components/Items/index.tsx","../src/components/PickedBar/index.tsx","../src/components/TagsPanel/index.tsx","../src/components/UploadDropzone/index.tsx","../src/components/Browser/useBrowserInit.ts","../src/components/Browser/index.tsx","../src/components/FormBuilderTool/index.tsx","../src/components/Tool/index.tsx","../src/schemas/folder.ts","../src/schemas/tag.ts","../src/plugin.tsx","../src/utils/applyMediaTags.ts","../src/components/AutoTagInputWrapper/index.tsx","../src/utils/mediaField.ts"],"sourcesContent":["import {type ReactNode, createContext, useContext, useMemo} from 'react'\nimport type {AssetSourceComponentProps} from 'sanity'\n\ntype ContextProps = {\n  isMultiSelect: boolean\n  onSelect?: AssetSourceComponentProps['onSelect']\n}\n\ntype Props = {\n  children: ReactNode\n  isMultiSelect?: boolean\n  onSelect?: AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider = (props: Props) => {\n  const {children, isMultiSelect = false, onSelect} = props\n\n  const contextValue: ContextProps = useMemo(\n    () => ({\n      isMultiSelect,\n      onSelect,\n    }),\n    [isMultiSelect, onSelect],\n  )\n\n  return (\n    <AssetSourceDispatchContext.Provider value={contextValue}>\n      {children}\n    </AssetSourceDispatchContext.Provider>\n  )\n}\n\nexport const useAssetSourceActions = () => {\n  const context = useContext(AssetSourceDispatchContext)\n  if (context === undefined) {\n    throw new Error('useAssetSourceActions must be used within an AssetSourceDispatchProvider')\n  }\n  return context\n}\n","import {useEffect, useState} from 'react'\n\n/**\n * Creates a detached `.media-portal` element appended to `document.body` for the\n * lifetime of the component, used as a portal target for the plugin's dialogs\n * and overlays. The element is removed on unmount.\n */\nconst useRootPortalElement = (): HTMLDivElement => {\n  const [container] = useState(() => document.createElement('div'))\n\n  useEffect(() => {\n    container.classList.add('media-portal')\n    document.body.appendChild(container)\n    return () => {\n      document.body.removeChild(container)\n    }\n  }, [container])\n\n  return container\n}\n\nexport default useRootPortalElement\n","import {type TypedUseSelectorHook, useSelector} from 'react-redux'\n\nimport type {RootReducerState} from '../modules/types'\n\nconst useTypedSelector: TypedUseSelectorHook<RootReducerState> = useSelector\n\nexport default useTypedSelector\n","import type {SanityClient} from '@sanity/client'\nimport {useClient} from 'sanity'\n\nconst useVersionedClient = (): SanityClient => useClient({apiVersion: '2025-10-02'})\n\nexport default useVersionedClient\n","import type {OrderDirection} from '../types'\n\nconst ORDER_DICTIONARY: Record<string, {asc: string; desc: string}> = {\n  _createdAt: {\n    asc: 'Last created: Oldest first',\n    desc: 'Last created: Newest first',\n  },\n  _updatedAt: {\n    asc: 'Last updated: Oldest first',\n    desc: 'Last updated: Newest first',\n  },\n  mimeType: {\n    asc: 'MIME type: A to Z',\n    desc: 'MIME type: Z to A',\n  },\n  originalFilename: {\n    asc: 'File name: A to Z',\n    desc: 'File name: Z to A',\n  },\n  size: {\n    asc: 'File size: Smallest first',\n    desc: 'File size: Largest first',\n  },\n}\n\nexport const getOrderTitle = (field: string, direction: OrderDirection): string => {\n  return ORDER_DICTIONARY[field]![direction]\n}\n","import groq from 'groq'\n\nimport type {\n  SearchFacetDivider,\n  SearchFacetInputProps,\n  SearchFacetName,\n  SearchFacetOperators,\n} from '../types'\n\nexport const divider: SearchFacetDivider = {type: 'divider'}\n\nexport const inputs: Record<SearchFacetName, SearchFacetInputProps> = {\n  altText: {\n    assetTypes: ['file', 'image'],\n    field: 'altText',\n    name: 'altText',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Alt text',\n    type: 'string',\n    value: '',\n  },\n  creditLine: {\n    assetTypes: ['file', 'image'],\n    field: 'creditLine',\n    name: 'creditLine',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Credit',\n    type: 'string',\n    value: '',\n  },\n  description: {\n    assetTypes: ['file', 'image'],\n    field: 'description',\n    name: 'description',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Description',\n    type: 'string',\n    value: '',\n  },\n  folder: {\n    assetTypes: ['file', 'image'],\n    field: 'opt.media.folder._ref',\n    name: 'folder',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty'],\n    title: 'Folder',\n    type: 'string',\n    value: '',\n  },\n  fileName: {\n    assetTypes: ['file', 'image'],\n    field: 'originalFilename',\n    name: 'filename',\n    operatorType: 'includes',\n    operatorTypes: ['includes', 'doesNotInclude'],\n    title: 'File name',\n    type: 'string',\n    value: '',\n  },\n  height: {\n    assetTypes: ['image'],\n    field: 'metadata.dimensions.height',\n    name: 'height',\n    operatorType: 'greaterThan',\n    operatorTypes: [\n      'greaterThan',\n      'greaterThanOrEqualTo',\n      'lessThan',\n      'lessThanOrEqualTo',\n      null,\n      'equalTo',\n    ],\n    title: 'Height',\n    type: 'number',\n    value: 400,\n  },\n  inCurrentDocument: {\n    assetTypes: ['file', 'image'],\n    name: 'inCurrentDocument',\n    operatorType: 'is',\n    options: [\n      {\n        name: 'true',\n        title: 'True',\n        value: groq`_id in $documentAssetIds`,\n      },\n      {\n        name: 'false',\n        title: 'False',\n        value: groq`!(_id in $documentAssetIds)`,\n      },\n    ],\n    selectOnly: true,\n    title: 'In use in current document',\n    type: 'select',\n    value: 'true',\n  },\n  inUse: {\n    assetTypes: ['file', 'image'],\n    name: 'inUse',\n    operatorType: 'is',\n    options: [\n      {\n        name: 'true',\n        title: 'True',\n        value: groq`count(*[references(^._id)]) > 0`,\n      },\n      {\n        name: 'false',\n        title: 'False',\n        value: groq`count(*[references(^._id)]) == 0`,\n      },\n    ],\n    title: 'In use',\n    type: 'select',\n    value: 'true',\n  },\n  isOpaque: {\n    assetTypes: ['image'],\n    field: 'metadata.isOpaque',\n    name: 'isOpaque',\n    operatorType: 'equalTo',\n    options: [\n      {\n        name: 'true',\n        title: 'True',\n        value: `false`,\n      },\n      {\n        name: 'false',\n        title: 'False',\n        value: `true`,\n      },\n    ],\n    title: 'Has transparency',\n    type: 'select',\n    value: 'true',\n  },\n  orientation: {\n    assetTypes: ['image'],\n    name: 'orientation',\n    operatorType: 'is',\n    operatorTypes: ['is', 'isNot'],\n    options: [\n      {\n        name: 'portrait',\n        title: 'Portrait',\n        value: 'metadata.dimensions.aspectRatio < 1',\n      },\n      {\n        name: 'landscape',\n        title: 'Landscape',\n        value: 'metadata.dimensions.aspectRatio > 1',\n      },\n      {\n        name: 'square',\n        title: 'Square',\n        value: 'metadata.dimensions.aspectRatio == 1',\n      },\n    ],\n    title: 'Orientation',\n    type: 'select',\n    value: 'portrait',\n  },\n  size: {\n    assetTypes: ['file', 'image'],\n    field: 'size',\n    modifier: 'kb',\n    modifiers: [\n      {\n        name: 'kb',\n        title: 'KB',\n        fieldModifier: (fieldName) => `round(${fieldName} / 1000)`,\n      },\n      {\n        name: 'mb',\n        title: 'MB',\n        fieldModifier: (fieldName) => `round(${fieldName} / 1000000)`,\n      },\n    ],\n    name: 'size',\n    operatorType: 'greaterThan',\n    operatorTypes: [\n      'greaterThan',\n      'greaterThanOrEqualTo',\n      'lessThan',\n      'lessThanOrEqualTo',\n      null,\n      'equalTo',\n    ],\n    title: 'File size',\n    type: 'number',\n    value: 0,\n  },\n  tag: {\n    assetTypes: ['file', 'image'],\n    field: 'opt.media.tags',\n    name: 'tag',\n    operatorType: 'references',\n    operatorTypes: ['references', 'doesNotReference', null, 'empty', 'notEmpty'],\n    title: 'Tags',\n    type: 'searchable',\n  },\n  title: {\n    assetTypes: ['file', 'image'],\n    field: 'title',\n    name: 'title',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Title',\n    type: 'string',\n    value: '',\n  },\n  type: {\n    assetTypes: ['file', 'image'],\n    name: 'type',\n    operatorType: 'is',\n    operatorTypes: ['is', 'isNot'],\n    options: [\n      {\n        name: 'image',\n        title: 'Image',\n        value: 'mimeType match \"image*\"',\n      },\n      {\n        name: 'video',\n        title: 'Video',\n        value: 'mimeType match \"video*\"',\n      },\n      {\n        name: 'audio',\n        title: 'Audio',\n        value: 'mimeType match \"audio*\"',\n      },\n      {\n        name: 'pdf',\n        title: 'PDF',\n        value: 'mimeType == \"application/pdf\"',\n      },\n    ],\n    title: 'File type',\n    type: 'select',\n    value: 'image',\n  },\n  width: {\n    assetTypes: ['image'],\n    field: 'metadata.dimensions.width',\n    name: 'width',\n    operatorType: 'greaterThan',\n    operatorTypes: [\n      'greaterThan',\n      'greaterThanOrEqualTo',\n      'lessThan',\n      'lessThanOrEqualTo',\n      null,\n      'equalTo',\n    ],\n    title: 'Width',\n    type: 'number',\n    value: 400,\n  },\n}\n\nexport const operators: SearchFacetOperators = {\n  doesNotInclude: {\n    fn: (value, field) => (value ? `!(${field} match '*${value}*')` : undefined),\n    label: 'does not include',\n  },\n  doesNotReference: {\n    fn: (value, _field) => (value ? `!references('${value}')` : undefined),\n    label: 'does not include',\n  },\n  empty: {\n    fn: (_value, field) => `!defined(${field})`,\n    hideInput: true,\n    label: 'is empty',\n  },\n  equalTo: {\n    fn: (value, field) => (value ? `${field} == ${value}` : undefined),\n    label: 'is equal to',\n  },\n  greaterThan: {\n    fn: (value, field) => (value ? `${field} > ${value}` : undefined),\n    label: 'is greater than',\n  },\n  greaterThanOrEqualTo: {\n    fn: (value, field) => (value ? `${field} >= ${value}` : undefined),\n    label: 'is greater than or equal to',\n  },\n  includes: {\n    fn: (value, field) => (value ? `${field} match '*${value}*'` : undefined),\n    label: 'includes',\n  },\n  is: {\n    fn: (value, _field) => `${value}`,\n    label: 'is',\n  },\n  isNot: {\n    fn: (value, _field) => `!(${value})`,\n    label: 'is not',\n  },\n  lessThan: {\n    fn: (value, field) => (value ? `${field} < ${value}` : undefined),\n    label: 'is less than',\n  },\n  lessThanOrEqualTo: {\n    fn: (value, field) => (value ? `${field} <= ${value}` : undefined),\n    label: 'is less than or equal to',\n  },\n  notEmpty: {\n    fn: (_value, field) => `defined(${field})`,\n    hideInput: true,\n    label: 'is not empty',\n  },\n  references: {\n    fn: (value, _field) => (value ? `references('${value}')` : undefined),\n    label: 'includes',\n  },\n}\n","import type {AssetSourceComponentProps} from 'sanity'\n\nimport {divider, inputs} from './config/searchFacets'\nimport type {\n  SearchFacetInputProps,\n  SearchFacetDivider,\n  SearchFacetGroup,\n  OrderDirection,\n} from './types'\n\nexport const SUPPORTED_ASSET_TYPES = [\n  'file',\n  'image',\n] as const satisfies AssetSourceComponentProps['assetType'][]\n\n// Sort order dropdown options\n// null values are represented as menu dividers\nexport const ORDER_OPTIONS: ({direction: OrderDirection; field: string} | null)[] = [\n  {\n    direction: 'desc',\n    field: '_createdAt',\n  },\n  {\n    direction: 'asc',\n    field: '_createdAt',\n  },\n  // Divider\n  null,\n  {\n    direction: 'desc',\n    field: '_updatedAt',\n  },\n  {\n    direction: 'asc' as OrderDirection,\n    field: '_updatedAt',\n  },\n  // Divider\n  null,\n  {\n    direction: 'asc',\n    field: 'originalFilename',\n  },\n  {\n    direction: 'desc',\n    field: 'originalFilename',\n  },\n  // Divider\n  null,\n  {\n    direction: 'desc',\n    field: 'size',\n  },\n  {\n    direction: 'asc',\n    field: 'size',\n  },\n]\n\nexport const FACETS: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[] = [\n  inputs.tag,\n  divider,\n  inputs.inUse,\n  inputs.inCurrentDocument,\n  divider,\n  inputs.title,\n  inputs.folder,\n  inputs.altText,\n  inputs.creditLine,\n  inputs.description,\n  divider,\n  inputs.isOpaque,\n  divider,\n  inputs.fileName,\n  inputs.size,\n  inputs.type,\n  divider,\n  inputs.orientation,\n  inputs.width,\n  inputs.height,\n]\n\nexport const GRID_TEMPLATE_COLUMNS = {\n  SMALL: '3rem 100px auto 1.5rem',\n  LARGE: '3rem 100px auto 5.5rem 5.5rem 3.5rem 8.5rem 4.75rem 2rem',\n}\nexport const FOLDERS_PANEL_WIDTH = 260 // px\nexport const FOLDER_DOCUMENT_NAME = 'media.folder'\nexport const PANEL_HEIGHT = 32 // px\nexport const TAG_DOCUMENT_NAME = 'media.tag'\nexport const TAGS_PANEL_WIDTH = 250 // px\n","import {iif, type Observable, of, throwError} from 'rxjs'\nimport {delay, mergeMap} from 'rxjs/operators'\n\nconst debugThrottle = (throttled?: boolean) => {\n  return function <T>(source: Observable<T>): Observable<T> {\n    return iif(\n      () => !!throttled,\n      source.pipe(\n        delay(3000),\n        mergeMap((v) => {\n          if (Math.random() > 0.5) {\n            return throwError(() => ({\n              message: 'Test error',\n              statusCode: 500,\n            }))\n          }\n          return of(v)\n        }),\n      ),\n      source,\n    )\n  }\n}\n\nexport default debugThrottle\n","import groq from 'groq'\n\nimport {operators} from '../config/searchFacets'\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {AssetType, SearchFacetInputProps} from '../types'\n\n/** GROQ fragment that excludes assets tagged with any of the given media.tag slugs. */\nexport const buildExcludeTagsFragment = (excludeTagSlugs?: string[]): string | undefined => {\n  const serializedExcludeTagSlugs = excludeTagSlugs?.length\n    ? JSON.stringify(excludeTagSlugs)\n    : undefined\n\n  return serializedExcludeTagSlugs\n    ? groq`!(defined(opt.media.tags) && count(opt.media.tags[@._ref in *[_type == \"${TAG_DOCUMENT_NAME}\" && name.current in ${serializedExcludeTagSlugs}]._id]) > 0)`\n    : undefined\n}\n\nconst constructFilter = ({\n  assetTypes,\n  currentFolderId,\n  excludeTagSlugs,\n  searchFacets,\n  searchQuery,\n}: {\n  assetTypes: AssetType[]\n  currentFolderId?: string | null\n  excludeTagSlugs?: string[]\n  searchFacets: SearchFacetInputProps[]\n  searchQuery?: string\n}): string => {\n  // Fetch asset types depending on current context.\n  // Either limit to a specific type (if being used as a custom asset source) or fetch both files and images (if being used as a tool)\n  // Sanity will crash if you try and insert incompatible asset types into fields!\n  const documentAssetTypes = assetTypes.map((type) => `sanity.${type}Asset`)\n\n  const baseFilter = groq`\n    _type in ${JSON.stringify(documentAssetTypes)} && !(_id in path(\"drafts.**\"))\n  `\n\n  const excludeTagsFragment = buildExcludeTagsFragment(excludeTagSlugs)\n\n  const searchFacetFragments = searchFacets.reduce((acc: string[], facet) => {\n    if (facet.type === 'number') {\n      const {field, modifier, modifiers, operatorType, value} = facet\n      const operator = operators[operatorType]\n\n      // Get current modifier\n      const currentModifier = modifiers?.find((m) => m.name === modifier)\n\n      // Apply field modifier function (if present)\n      const facetField = currentModifier?.fieldModifier\n        ? currentModifier.fieldModifier(field)\n        : field\n\n      const fragment = operator.fn(value, facetField)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    if (facet.type === 'searchable') {\n      const {field, operatorType, value} = facet\n      const operator = operators[operatorType]\n\n      const fragment = operator.fn(value?.value, field)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    if (facet.type === 'select') {\n      const {field, operatorType, options, value} = facet\n      const operator = operators[operatorType]\n\n      const currentOptionValue = options?.find((l) => l.name === value)?.value\n\n      const fragment = operator.fn(currentOptionValue, field)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    if (facet.type === 'string') {\n      const {field, operatorType, value} = facet\n      const operator = operators[operatorType]\n\n      const fragment = operator.fn(value, field)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    return acc\n  }, [])\n\n  // All assets (no folder selected) should not apply a folder filter. A specific\n  // folder shows only assets pointing at it.\n  const folderFilter: string | undefined = currentFolderId\n    ? `opt.media.folder._ref == ${JSON.stringify(currentFolderId)}`\n    : undefined\n\n  // Join separate filter fragments\n  const constructedQuery = [\n    // Base filter\n    baseFilter,\n    ...(excludeTagsFragment ? [excludeTagsFragment] : []),\n    // Search query (if present)\n    // NOTE: Currently this only searches direct fields on sanity.fileAsset/sanity.imageAsset and NOT referenced tags\n    // It's possible to add this by adding the following line to the searchQuery, but it's quite slow\n    // references(*[_type == \"media.tag\" && name.current == \"${searchQuery.trim()}\"]._id)\n    ...(searchQuery\n      ? [\n          groq`[_id, altText, assetId, creditLine, description, originalFilename, title, url] match '*${searchQuery.trim()}*'`,\n        ]\n      : []),\n    ...(folderFilter ? [folderFilter] : []),\n    // Search facets\n    ...searchFacetFragments,\n  ].join(' && ')\n\n  return constructedQuery\n}\n\nexport default constructFilter\n","import type {Asset} from '../types'\n\ntype AssetRef = {\n  _ref?: unknown\n  _type?: unknown\n}\n\ntype ImageNode = {\n  _type?: unknown\n  asset?: AssetRef\n}\n\n/**\n * Re-points every image asset in `document` that references `assetToReplaceId`\n * at `newAsset`, mutating the document in place, and returns one patch object\n * per affected top-level field in the form `{[field]: <full mutated field value>}`.\n *\n * Each patch carries the entire (mutated) top-level field value rather than just\n * the matched image node, so `client.patch().set()` updates the references\n * without discarding sibling data — including deeply nested image fields.\n *\n * NOTE: ported from sanity-plugin-media#236. Because of GROQ limitations the\n * matching image objects are filtered out of the document manually rather than\n * via a projection.\n */\nexport function findImageAssets(\n  document: Record<string, unknown>,\n  newAsset: Asset,\n  assetToReplaceId: string,\n): Record<string, unknown>[] {\n  const matchedTopLevelFields = new Set<string>()\n  repointNestedImages(document, newAsset, assetToReplaceId, '', matchedTopLevelFields)\n  return [...matchedTopLevelFields].map((field) => ({[field]: document[field]}))\n}\n\nfunction repointNestedImages(\n  node: unknown,\n  newAsset: Asset,\n  assetToReplaceId: string,\n  topLevelField: string,\n  matchedTopLevelFields: Set<string>,\n): void {\n  if (typeof node !== 'object' || node === null) {\n    return\n  }\n\n  const candidate = node as ImageNode\n  // Match built-in `image` nodes and custom image schema types (e.g. `mainImage`),\n  // which store their type name in `_type` rather than `\"image\"`. Skip file fields.\n  const assetRef = candidate.asset\n  const hasMatchingAssetRef = assetRef?._type === 'reference' && assetRef._ref === assetToReplaceId\n  if (hasMatchingAssetRef && candidate._type !== 'file' && assetRef) {\n    assetRef._ref = newAsset._id\n    if (topLevelField) {\n      matchedTopLevelFields.add(topLevelField)\n    }\n  }\n\n  for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n    if (typeof value === 'object' && value !== null) {\n      // Once we descend past the document root, keep attributing matches to the\n      // top-level field so the patch replaces that whole field.\n      repointNestedImages(\n        value,\n        newAsset,\n        assetToReplaceId,\n        topLevelField || key,\n        matchedTopLevelFields,\n      )\n    }\n  }\n}\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {from, Observable, of, throwError} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {HttpError} from '../types'\n\nconst checkTagName = (client: SanityClient, name: string) => {\n  return function <T>(source: Observable<T>): Observable<boolean> {\n    return source.pipe(\n      mergeMap(() => {\n        return from(\n          client.fetch(groq`count(*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $name])`, {\n            name,\n          }),\n        ) as Observable<number>\n      }),\n      mergeMap((existingTagCount: number) => {\n        if (existingTagCount > 0) {\n          return throwError(\n            () =>\n              ({\n                message: 'Tag already exists',\n                statusCode: 409,\n              }) satisfies HttpError,\n          )\n        }\n\n        return of(true)\n      }),\n    )\n  }\n}\n\nexport default checkTagName\n","import type {TagSelectOption, TagItem} from '../types'\n\nconst getTagSelectOptions = (tags: TagItem[]): TagSelectOption[] => {\n  return tags.reduce((acc: TagSelectOption[], val) => {\n    const tag = val?.tag\n    if (tag) {\n      acc.push({\n        label: tag?.name?.current,\n        value: tag?._id,\n      })\n    }\n    return acc\n  }, [])\n}\n\nexport default getTagSelectOptions\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem, HttpError, Tag} from '../../types'\n\nexport const ASSETS_ACTIONS = {\n  tagsAddComplete: createAction(\n    'actions/tagsAddComplete',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n  tagsAddError: createAction(\n    'actions/tagsAddError',\n    function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n      return {payload: {assets, error, tag}}\n    },\n  ),\n  tagsAddRequest: createAction(\n    'actions/tagsAddRequest',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n  tagsRemoveComplete: createAction(\n    'actions/tagsRemoveComplete',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n  tagsRemoveError: createAction(\n    'actions/tagsRemoveError',\n    function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n      return {payload: {assets, error, tag}}\n    },\n  ),\n  tagsRemoveRequest: createAction(\n    'actions/tagsRemoveRequest',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n}\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem} from '../../types'\n\nexport const DIALOG_ACTIONS = {\n  showFolderCreate: createAction(\n    'dialog/showFolderCreate',\n    function prepare({parentFolderId}: {parentFolderId?: string | null} = {}) {\n      return {\n        payload: {parentFolderId},\n      }\n    },\n  ),\n  showFolderMove: createAction(\n    'dialog/showFolderMove',\n    function prepare({assets, folderId}: {assets: AssetItem[]; folderId?: string | null}) {\n      return {\n        payload: {assets, folderId},\n      }\n    },\n  ),\n  showFolderRename: createAction(\n    'dialog/showFolderRename',\n    function prepare({folderId}: {folderId: string}) {\n      return {\n        payload: {folderId},\n      }\n    },\n  ),\n  showTagCreate: createAction('dialog/showTagCreate'),\n  showTagEdit: createAction('dialog/showTagEdit', function prepare({tagId}: {tagId: string}) {\n    return {\n      payload: {tagId},\n    }\n  }),\n}\n","import {createSelector, createSlice, isAnyOf, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {from, Observable, of} from 'rxjs'\nimport {bufferTime, catchError, filter, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../../constants'\nimport checkTagName from '../../operators/checkTagName'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {Asset, HttpError, MyEpic, TagSelectOption, Tag, TagItem} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {DIALOG_ACTIONS} from '../dialog/actions'\nimport type {RootReducerState} from '../types'\n\ntype TagsReducerState = {\n  allIds: string[]\n  byIds: Record<string, TagItem>\n  creating: boolean\n  creatingError?: HttpError\n  fetchCount: number\n  fetching: boolean\n  fetchingError?: HttpError\n  // totalCount: number\n  panelVisible: boolean\n}\n\nconst initialState = {\n  allIds: [],\n  byIds: {},\n  creating: false,\n  creatingError: undefined,\n  fetchCount: -1,\n  fetching: false,\n  fetchingError: undefined,\n  panelVisible: true,\n} as TagsReducerState\n\nconst tagsSlice = createSlice({\n  name: 'tags',\n  initialState,\n  extraReducers: (builder) => {\n    builder\n      .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n        delete state.creatingError\n      })\n      .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n        const {tagId} = action.payload\n        delete state.byIds[tagId]!.error\n      })\n      .addMatcher(\n        isAnyOf(\n          ASSETS_ACTIONS.tagsAddComplete,\n          ASSETS_ACTIONS.tagsAddError,\n          ASSETS_ACTIONS.tagsRemoveComplete,\n          ASSETS_ACTIONS.tagsRemoveError,\n        ),\n        (state, action) => {\n          const {tag} = action.payload\n          state.byIds[tag._id]!.updating = false\n        },\n      )\n      .addMatcher(\n        isAnyOf(ASSETS_ACTIONS.tagsAddRequest, ASSETS_ACTIONS.tagsRemoveRequest),\n        (state, action) => {\n          const {tag} = action.payload\n          state.byIds[tag._id]!.updating = true\n        },\n      )\n  },\n  reducers: {\n    createComplete(state, action: PayloadAction<{assetId?: string; tag: Tag}>) {\n      const {tag} = action.payload\n      state.creating = false\n      if (!state.allIds.includes(tag._id)) {\n        state.allIds.push(tag._id)\n      }\n      state.byIds[tag._id] = {\n        _type: 'tag',\n        picked: false,\n        tag,\n        updating: false,\n      }\n    },\n    createError(state, action: PayloadAction<{error: HttpError; name: string}>) {\n      state.creating = false\n      state.creatingError = action.payload.error\n    },\n    createRequest(state, _action: PayloadAction<{assetId?: string; name: string}>) {\n      state.creating = true\n      delete state.creatingError\n    },\n    deleteComplete(state, action: PayloadAction<{tagId: string}>) {\n      const {tagId} = action.payload\n      const deleteIndex = state.allIds.indexOf(tagId)\n      if (deleteIndex >= 0) {\n        state.allIds.splice(deleteIndex, 1)\n      }\n      delete state.byIds[tagId]\n    },\n    deleteError(state, action: PayloadAction<{error: HttpError; tag: Tag}>) {\n      const {error, tag} = action.payload\n\n      const tagId = tag?._id\n      state.byIds[tagId]!.error = error\n      state.byIds[tagId]!.updating = false\n    },\n    deleteRequest(state, action: PayloadAction<{tag: Tag}>) {\n      const tagId = action.payload?.tag?._id\n      state.byIds[tagId]!.picked = false\n      state.byIds[tagId]!.updating = true\n\n      Object.keys(state.byIds).forEach((key) => {\n        delete state.byIds[key]!.error\n      })\n    },\n    fetchComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n      const {tags} = action.payload\n\n      tags?.forEach((tag) => {\n        state.allIds.push(tag._id)\n        state.byIds[tag._id] = {\n          _type: 'tag',\n          picked: false,\n          tag,\n          updating: false,\n        }\n      })\n\n      state.fetching = false\n      state.fetchCount = tags.length || 0\n      delete state.fetchingError\n    },\n    fetchError(state, action: PayloadAction<{error: HttpError}>) {\n      const {error} = action.payload\n      state.fetching = false\n      state.fetchingError = error\n    },\n    fetchRequest: {\n      reducer: (state, _action: PayloadAction<{query: string}>) => {\n        state.fetching = true\n        delete state.fetchingError\n      },\n      prepare: () => {\n        // Construct query\n        const query = groq`\n          {\n            \"items\": *[\n              _type == \"${TAG_DOCUMENT_NAME}\"\n              && !(_id in path(\"drafts.**\"))\n            ] {\n              _createdAt,\n              _updatedAt,\n              _id,\n              _rev,\n              _type,\n              name\n            } | order(name.current asc),\n          }\n        `\n        return {payload: {query}}\n      },\n    },\n    // Queue batch tag creation\n    listenerCreateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n      //\n    },\n    // Apply created tags (via sanity real-time events)\n    listenerCreateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n      const {tags} = action.payload\n\n      tags?.forEach((tag) => {\n        state.byIds[tag._id] = {\n          _type: 'tag',\n          picked: false,\n          tag,\n          updating: false,\n        }\n        if (!state.allIds.includes(tag._id)) {\n          state.allIds.push(tag._id)\n        }\n      })\n    },\n    // Queue batch tag deletion\n    listenerDeleteQueue(_state, _action: PayloadAction<{tagId: string}>) {\n      //\n    },\n    // Apply deleted tags (via sanity real-time events)\n    listenerDeleteQueueComplete(state, action: PayloadAction<{tagIds: string[]}>) {\n      const {tagIds} = action.payload\n\n      tagIds?.forEach((tagId) => {\n        const deleteIndex = state.allIds.indexOf(tagId)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n        delete state.byIds[tagId]\n      })\n    },\n    // Queue batch tag updates\n    listenerUpdateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n      //\n    },\n    // Apply updated tags (via sanity real-time events)\n    listenerUpdateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n      const {tags} = action.payload\n\n      tags?.forEach((tag) => {\n        if (state.byIds[tag._id]) {\n          state.byIds[tag._id]!.tag = tag\n        }\n      })\n    },\n    // Set tag panel visibility\n    panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n      const {panelVisible} = action.payload\n      state.panelVisible = panelVisible\n    },\n    // Sort all tags by name\n    sort(state) {\n      state.allIds.sort((a, b) => {\n        const tagA = state.byIds[a]!.tag.name.current\n        const tagB = state.byIds[b]!.tag.name.current\n\n        if (tagA < tagB) {\n          return -1\n        } else if (tagA > tagB) {\n          return 1\n        }\n        return 0\n      })\n    },\n    updateComplete(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n      const {tag} = action.payload\n      state.byIds[tag._id]!.tag = tag\n      state.byIds[tag._id]!.updating = false\n    },\n    updateError(state, action: PayloadAction<{tag: Tag; error: HttpError}>) {\n      const {error, tag} = action.payload\n      const tagId = tag?._id\n      state.byIds[tagId]!.error = error\n      state.byIds[tagId]!.updating = false\n    },\n    updateRequest(\n      state,\n      action: PayloadAction<{\n        closeDialogId?: string\n        formData: Record<string, any>\n        tag: Tag\n      }>,\n    ) {\n      const {tag} = action.payload\n      state.byIds[tag?._id]!.updating = true\n    },\n  },\n})\n\n// Epics\n\n// On tag create request:\n// - async check to see if tag already exists\n// - throw if tag already exists\n// - otherwise, create new tag\nexport const tagsCreateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.createRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assetId, name} = action.payload\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        checkTagName(client, name),\n        mergeMap(() =>\n          client.observable.create({\n            _type: TAG_DOCUMENT_NAME,\n            name: {\n              _type: 'slug',\n              current: name,\n            },\n          }),\n        ),\n        mergeMap((result) => of(tagsSlice.actions.createComplete({assetId, tag: result as Tag}))),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.createError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              name,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// On tag delete request\n// - find referenced assets\n// - remove tag from referenced assets in a sanity transaction\nexport const tagsDeleteEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.deleteRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {tag} = action.payload\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Fetch assets which reference this tag\n        mergeMap(() =>\n          client.observable.fetch<Asset[]>(\n            groq`*[\n              _type in [\"sanity.fileAsset\", \"sanity.imageAsset\"]\n              && references(*[_type == \"media.tag\" && name.current == $tagName]._id)\n            ] {\n              _id,\n              _rev,\n              opt\n            }`,\n            {tagName: tag.name.current},\n          ),\n        ),\n        // Create transaction which remove tag references from all matched assets and delete tag\n        mergeMap((assets) => {\n          const patches = assets.map((asset) => ({\n            id: asset._id,\n            patch: {\n              // this will cause the transaction to fail if the document has been modified since it was fetched.\n              ifRevisionID: asset._rev,\n              unset: [`opt.media.tags[_ref == \"${tag._id}\"]`],\n            },\n          }))\n\n          const transaction: Transaction = patches.reduce(\n            (tx, patch) => tx.patch(patch.id, patch.patch),\n            client.transaction(),\n          )\n\n          transaction.delete(tag._id)\n\n          return from(transaction.commit())\n        }),\n        // Dispatch complete action\n        mergeMap(() => of(tagsSlice.actions.deleteComplete({tagId: tag._id}))),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.deleteError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// Async fetch tags\nexport const tagsFetchEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.fetchRequest.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) => {\n      const {query} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Fetch tags\n        mergeMap(() =>\n          client.observable.fetch<{\n            items: Tag[]\n          }>(query),\n        ),\n        // Dispatch complete action\n        mergeMap((result) => {\n          const {items} = result\n          return of(tagsSlice.actions.fetchComplete({tags: items}))\n        }),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.fetchError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// TODO: merge all buffer epics\n// Buffer tag creation via sanity subscriber\nexport const tagsListenerCreateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsSlice.actions.listenerCreateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const tags = actions?.map((action) => action.payload.tag)\n      return of(tagsSlice.actions.listenerCreateQueueComplete({tags}))\n    }),\n  )\n\n// TODO: merge all buffer epics\n// Buffer tag deletion via sanity subscriber\nexport const tagsListenerDeleteQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsSlice.actions.listenerDeleteQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const tagIds = actions?.map((action) => action.payload.tagId)\n      return of(tagsSlice.actions.listenerDeleteQueueComplete({tagIds}))\n    }),\n  )\n\n// TODO: merge all buffer epics\n// Buffer tag update via sanity subscriber\nexport const tagsListenerUpdateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsSlice.actions.listenerUpdateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const tags = actions?.map((action) => action.payload.tag)\n      return of(tagsSlice.actions.listenerUpdateQueueComplete({tags}))\n    }),\n  )\n\n// On successful tag creation or updates:\n// - Re-sort all tags\nexport const tagsSortEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      tagsSlice.actions.listenerCreateQueueComplete.type,\n      tagsSlice.actions.listenerUpdateQueueComplete.type,\n    ),\n    bufferTime(1000),\n    filter((actions) => actions.length > 0),\n    mergeMap(() => of(tagsSlice.actions.sort())),\n  )\n\n// On tag update request\n// - check if tag name already exists\n// - throw if tag already exists\n// - otherwise, patch document\nexport const tagsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.updateRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {closeDialogId, formData, tag} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Check if tag name is available, throw early if not\n        checkTagName(client, formData?.['name']?.current),\n        // Patch document (Update tag)\n        mergeMap(\n          () =>\n            from(\n              client\n                .patch(tag._id)\n                .set({name: {_type: 'slug', current: formData?.['name'].current}})\n                .commit(),\n            ) as Observable<Tag>,\n        ),\n        // Dispatch complete action\n        mergeMap((updatedTag: Tag) => {\n          return of(\n            tagsSlice.actions.updateComplete({\n              closeDialogId,\n              tag: updatedTag,\n            }),\n          )\n        }),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.updateError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// Selectors\n\nconst selectTagsByIds = (state: RootReducerState) => state.tags.byIds\n\nconst selectTagsAllIds = (state: RootReducerState) => state.tags.allIds\n\nexport const selectTags: Selector<RootReducerState, TagItem[]> = createSelector(\n  [selectTagsByIds, selectTagsAllIds],\n  (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectTagById = createSelector(\n  [selectTagsByIds, (_state: RootReducerState, tagId: string) => tagId],\n  (byIds, tagId) => byIds[tagId],\n)\n\n// TODO: use createSelector\n// Map tag references to react-select options, skipping over items with no linked tags\nexport const selectTagSelectOptions =\n  (asset?: Asset) =>\n  (state: RootReducerState): TagSelectOption[] | null => {\n    const tags = asset?.opt?.media?.tags?.reduce((acc: TagItem[], v) => {\n      const tagItem = state.tags.byIds[v._ref]\n      if (tagItem?.tag) {\n        acc.push(tagItem)\n      }\n      return acc\n    }, [])\n\n    if (tags && tags?.length > 0) {\n      return getTagSelectOptions(tags)\n    }\n\n    return null\n  }\n\nexport const tagsActions = {...tagsSlice.actions}\n\nexport default tagsSlice.reducer\n","import {type PayloadAction, createSelector, createSlice} from '@reduxjs/toolkit'\nimport {uuid} from '@sanity/uuid'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap, withLatestFrom} from 'rxjs/operators'\n\nimport type {MyEpic, SearchFacetInputProps, SearchFacetOperatorType, WithId} from '../../types'\nimport {tagsActions} from '../tags'\nimport type {RootReducerState} from '../types'\n\n// TODO: don't store non-serializable data in the search store\n// (The main offender is `fieldModifier` which is currently a function)\n\ntype SearchState = {\n  facets: WithId<SearchFacetInputProps>[]\n  query: string\n}\n\nconst initialState = {\n  facets: [],\n  query: '',\n} as SearchState\n\nconst searchSlice = createSlice({\n  name: 'search',\n  initialState,\n  reducers: {\n    // Add search facet\n    facetsAdd(state, action: PayloadAction<{facet: SearchFacetInputProps}>) {\n      state.facets.push({...action.payload.facet, id: uuid()})\n    },\n    // Clear all search facets\n    facetsClear(state) {\n      state.facets = []\n    },\n    // Remove search facet by name\n    facetsRemoveByName(state, action: PayloadAction<{facetName: string}>) {\n      state.facets = state.facets.filter((facet) => facet.name !== action.payload.facetName)\n    },\n    // Remove search facet by name\n    facetsRemoveByTag(state, action: PayloadAction<{tagId: string}>) {\n      state.facets = state.facets.filter(\n        (facet) =>\n          !(\n            facet.name === 'tag' &&\n            facet.type === 'searchable' &&\n            (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n            facet.value?.value === action.payload.tagId\n          ),\n      )\n    },\n    // Remove search facet by name\n    facetsRemoveById(state, action: PayloadAction<{facetId: string}>) {\n      state.facets = state.facets.filter((facet) => facet.id !== action.payload.facetId)\n    },\n    // Update an existing search facet\n    facetsUpdate(\n      state,\n      action: PayloadAction<{\n        modifier?: string\n        name: string\n        operatorType?: SearchFacetOperatorType\n        value?: any // TODO: type correctly\n      }>,\n    ) {\n      const {modifier, name, operatorType, value} = action.payload\n\n      const facet = state.facets.find((f) => f.name === name)\n\n      if (!facet) {\n        return\n      }\n\n      if (facet.type === 'number' && modifier) {\n        facet.modifier = modifier\n      }\n      if (operatorType) {\n        facet.operatorType = operatorType\n      }\n      if (typeof value !== 'undefined') {\n        facet.value = value\n      }\n\n      state.facets = state.facets.filter((f) => f.name !== facet.name || f.id === facet.id)\n    },\n    // Update an existing search facet\n    facetsUpdateById(\n      state,\n      action: PayloadAction<{\n        modifier?: string\n        id: string\n        operatorType?: SearchFacetOperatorType\n        value?: any // TODO: type correctly\n      }>,\n    ) {\n      const {modifier, id, operatorType, value} = action.payload\n\n      state.facets.forEach((facet, index) => {\n        if (facet.id === id) {\n          if (facet.type === 'number' && modifier) {\n            facet.modifier = modifier\n          }\n          if (operatorType) {\n            facet.operatorType = operatorType\n          }\n          if (typeof value !== 'undefined') {\n            state.facets[index]!.value = value\n          }\n        }\n      })\n    },\n    // Update existing search query\n    querySet(state, action: PayloadAction<{searchQuery: string}>) {\n      state.query = action.payload?.searchQuery\n    },\n  },\n})\n\n// Epics\n\n// On tag update success -> update existing tag search facet (if present)\nexport const searchFacetTagUpdateEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(tagsActions.updateComplete.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {tag} = action.payload\n\n      const currentSearchFacetTag = state.search.facets?.find((facet) => facet.name === 'tag')\n      const tagItem = state.tags.byIds[tag._id]\n\n      if (currentSearchFacetTag?.type === 'searchable') {\n        if (currentSearchFacetTag.value?.value === tag._id) {\n          return of(\n            searchSlice.actions.facetsUpdate({\n              name: 'tag',\n              value: {\n                label: tagItem?.tag?.name?.current,\n                value: tagItem?.tag?._id,\n              },\n            }),\n          )\n        }\n      }\n\n      return EMPTY\n    }),\n  )\n\n// Selectors\nexport const selectIsSearchFacetTag = createSelector(\n  [\n    (state: RootReducerState) => state.search.facets,\n    (_state: RootReducerState, tagId: string) => tagId,\n  ],\n  (searchFacets, tagId) =>\n    searchFacets.some(\n      (facet) =>\n        facet.name === 'tag' &&\n        facet.type === 'searchable' &&\n        (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n        facet.value?.value === tagId,\n    ),\n)\n\nexport const searchActions = {...searchSlice.actions}\n\nexport default searchSlice.reducer\n","import {createAction} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\n\nexport const UPLOADS_ACTIONS = {\n  uploadComplete: createAction(\n    'uploads/uploadComplete',\n    function prepare({asset}: {asset: SanityAssetDocument | SanityImageAssetDocument}) {\n      return {\n        payload: {asset},\n      }\n    },\n  ),\n}\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {AttributeSet, ClientError, Patch, SanityDocument, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, from, of} from 'rxjs'\nimport {\n  bufferTime,\n  catchError,\n  concatMap,\n  debounceTime,\n  filter,\n  mergeMap,\n  switchMap,\n  withLatestFrom,\n} from 'rxjs/operators'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {\n  Asset,\n  AssetItem,\n  AssetType,\n  BrowserView,\n  HttpError,\n  MyEpic,\n  Order,\n  OrderDirection,\n  Tag,\n} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {findImageAssets} from '../../utils/ReplaceImages'\nimport {searchActions} from '../search'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\nimport {ASSETS_ACTIONS} from './actions'\ntype ItemError = {\n  description: string\n  id: string\n  referencingIDs: string[]\n  type: string // 'documentHasExistingReferencesError'\n}\n\nexport type AssetsReducerState = {\n  allIds: string[]\n  assetTypes: AssetType[]\n  byIds: Record<string, AssetItem>\n  excludeTagSlugs: string[]\n  fetchCount: number\n  fetching: boolean\n  fetchingError?: HttpError\n  lastPicked?: string\n  order: Order\n  pageIndex: number\n  pageSize: number\n  view: BrowserView\n  // totalCount: number\n}\n\nconst defaultOrder = ORDER_OPTIONS[0] as {\n  direction: OrderDirection\n  field: string\n}\n\n/**\n * NOTE:\n * `fetchCount` returns the number of items retrieved in the most recent fetch.\n * This is a temporary workaround to be able to determine when there are no more items to retrieve.\n * Typically this would be done by deriving the total number of assets upfront, but currently such\n * queries in GROQ aren't fast enough to use on large datasets (1000s of entries).\n *\n * TODO:\n * When the query engine has been improved and above queries are faster, remove all instances of\n * of `fetchCount` and reinstate `totalCount` across the board.\n */\n\nexport const initialState = {\n  allIds: [],\n  assetTypes: [],\n  byIds: {},\n  excludeTagSlugs: [],\n  fetchCount: -1,\n  fetching: false,\n  fetchingError: undefined,\n  lastPicked: undefined,\n  order: {\n    direction: defaultOrder.direction,\n    field: defaultOrder.field,\n    title: getOrderTitle(defaultOrder.field, defaultOrder.direction),\n  },\n  pageIndex: 0,\n  pageSize: 100,\n  // totalCount: -1,\n  view: 'grid',\n} as AssetsReducerState\n\nconst assetsSlice = createSlice({\n  name: 'assets',\n  initialState,\n  extraReducers: (builder) => {\n    builder //\n      .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n        const {asset} = action.payload\n\n        state.byIds[asset._id] = {\n          _type: 'asset',\n          asset: asset as Asset,\n          picked: false,\n          updating: false,\n        }\n      })\n      .addCase(ASSETS_ACTIONS.tagsAddComplete, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsAddError, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsAddRequest, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = true\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsRemoveComplete, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsRemoveError, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsRemoveRequest, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = true\n        })\n      })\n  },\n  reducers: {\n    // Clear asset order\n    clear(state) {\n      state.allIds = []\n    },\n    // Remove assets and update page index\n    deleteComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n      const {assetIds} = action.payload\n\n      assetIds?.forEach((id) => {\n        const deleteIndex = state.allIds.indexOf(id)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n        delete state.byIds[id]\n      })\n\n      state.pageIndex = Math.floor(state.allIds.length / state.pageSize) - 1\n    },\n    deleteError(state, action: PayloadAction<{assetIds: string[]; error: ClientError}>) {\n      const {assetIds, error} = action.payload\n      const itemErrors: ItemError[] = error?.response?.body?.error?.items?.map(\n        (item: any) => item.error,\n      )\n\n      assetIds?.forEach((id) => {\n        state.byIds[id]!.updating = false\n      })\n      itemErrors?.forEach((item) => {\n        state.byIds[item.id]!.error = item.description\n      })\n    },\n    deleteRequest(state, action: PayloadAction<{assets: Asset[]; closeDialogId?: string}>) {\n      const {assets} = action.payload\n      assets.forEach((asset) => {\n        state.byIds[asset?._id]!.updating = true\n      })\n\n      Object.keys(state.byIds).forEach((key) => {\n        delete state.byIds[key]!.error\n      })\n    },\n    fetchComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n      const assets = action.payload?.assets || []\n\n      if (assets) {\n        assets.forEach((asset) => {\n          if (!state.allIds.includes(asset._id)) {\n            state.allIds.push(asset._id)\n          }\n          const existing = state.byIds[asset._id]\n          // Preserve pick/updating across search refreshes (e.g. replace dialog clearing filters)\n          state.byIds[asset._id] = {\n            _type: 'asset',\n            asset: asset,\n            picked: existing?.picked ?? false,\n            updating: existing?.updating ?? false,\n            ...(existing?.error ? {error: existing.error} : {}),\n          }\n        })\n      }\n\n      state.fetching = false\n      state.fetchCount = assets.length || 0\n      delete state.fetchingError\n    },\n    fetchError(state, action: PayloadAction<HttpError>) {\n      const error = action.payload\n      state.fetching = false\n      state.fetchingError = error\n    },\n    folderSetComplete(\n      state,\n      action: PayloadAction<{assetIds: string[]; folderId: string | null; closeDialogId?: string}>,\n    ) {\n      const {assetIds, folderId} = action.payload\n\n      assetIds.forEach((assetId) => {\n        if (state.byIds[assetId]?.asset) {\n          state.byIds[assetId].asset.opt = state.byIds[assetId].asset.opt || {}\n          state.byIds[assetId].asset.opt.media = state.byIds[assetId].asset.opt.media || {}\n          state.byIds[assetId].asset.opt.media.folder = folderId\n            ? {_ref: folderId, _type: 'reference', _weak: true}\n            : undefined\n          state.byIds[assetId].updating = false\n        }\n      })\n    },\n    folderSetError(state, action: PayloadAction<{assetIds: string[]; error: HttpError}>) {\n      const {assetIds, error} = action.payload\n\n      assetIds.forEach((assetId) => {\n        if (state.byIds[assetId]) {\n          state.byIds[assetId].error = error.message\n          state.byIds[assetId].updating = false\n        }\n      })\n    },\n    folderSetRequest(\n      state,\n      action: PayloadAction<{\n        assets: AssetItem[]\n        folderId: string | null\n        closeDialogId?: string\n      }>,\n    ) {\n      action.payload.assets.forEach((asset) => {\n        const item = state.byIds[asset.asset._id]\n        if (item) {\n          item.updating = true\n        }\n      })\n    },\n    fetchRequest: {\n      reducer: (state, _action: PayloadAction<{params: Record<string, any>; query: string}>) => {\n        state.fetching = true\n        delete state.fetchingError\n      },\n      prepare: ({\n        params = {},\n        queryFilter,\n        selector = ``,\n        sort = groq`order(_updatedAt desc)`,\n      }: {\n        params?: Record<string, any>\n        queryFilter: string\n        replace?: boolean\n        selector?: string\n        sort?: string\n      }) => {\n        const pipe = sort || selector ? '|' : ''\n\n        // Construct query\n        const query = groq`\n          {\n            \"items\": *[${queryFilter}] {\n              _id,\n              _type,\n              _createdAt,\n              _updatedAt,\n              altText,\n              creditLine,\n              description,\n              extension,\n              metadata {\n                dimensions,\n                exif,\n                image,\n                isOpaque,\n              },\n              mimeType,\n              opt {\n                media\n              },\n              originalFilename,\n              size,\n              source {\n                name,\n                id,\n                url,\n              },\n              title,\n              url\n            } ${pipe} ${sort} ${selector},\n          }\n        `\n\n        return {payload: {params, query}}\n      },\n    },\n    insertUploads(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n      const {results} = action.payload\n\n      Object.entries(results).forEach(([hash, assetId]) => {\n        if (assetId && !state.allIds.includes(hash)) {\n          state.allIds.push(assetId)\n        }\n      })\n    },\n    listenerCreateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n      //\n    },\n    listenerCreateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n      const {assets} = action.payload\n      assets?.forEach((asset) => {\n        if (state.byIds[asset?._id]?.asset) {\n          state.byIds[asset._id]!.asset = asset\n        }\n      })\n    },\n    listenerDeleteQueue(_state, _action: PayloadAction<{assetId: string}>) {\n      //\n    },\n    listenerDeleteQueueComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n      const {assetIds} = action.payload\n      assetIds?.forEach((assetId) => {\n        const deleteIndex = state.allIds.indexOf(assetId)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n        delete state.byIds[assetId]\n      })\n    },\n    listenerUpdateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n      //\n    },\n    listenerUpdateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n      const {assets} = action.payload\n      assets?.forEach((asset) => {\n        if (state.byIds[asset?._id]?.asset) {\n          state.byIds[asset._id]!.asset = asset\n        }\n      })\n    },\n    loadNextPage() {\n      //\n    },\n    loadPageIndex(state, action: PayloadAction<{pageIndex: number}>) {\n      //\n      state.pageIndex = action.payload.pageIndex\n    },\n    orderSet(state, action: PayloadAction<{order: Order}>) {\n      state.order = action.payload?.order\n      state.pageIndex = 0\n    },\n    pick(state, action: PayloadAction<{assetId: string; picked: boolean}>) {\n      const {assetId, picked} = action.payload\n      const item = state.byIds[assetId]\n      if (!item) {\n        return\n      }\n\n      item.picked = picked\n      state.lastPicked = picked ? assetId : undefined\n    },\n    pickAll(state) {\n      state.allIds.forEach((id) => {\n        state.byIds[id]!.picked = true\n      })\n    },\n    pickClear(state) {\n      state.lastPicked = undefined\n      Object.values(state.byIds).forEach((asset) => {\n        state.byIds[asset.asset._id]!.picked = false\n      })\n    },\n    pickRange(state, action: PayloadAction<{endId: string; startId: string}>) {\n      const startIndex = state.allIds.findIndex((id) => id === action.payload.startId)\n      const endIndex = state.allIds.findIndex((id) => id === action.payload.endId)\n\n      // Sort numerically, ascending order\n      const indices = [startIndex, endIndex].sort((a, b) => a - b)\n\n      state.allIds.slice(indices[0], indices[1]! + 1).forEach((key) => {\n        state.byIds[key]!.picked = true\n      })\n      state.lastPicked = state.allIds[endIndex]\n    },\n    sort(state) {\n      state.allIds.sort((a, b) => {\n        const tagA = state.byIds[a]!.asset[state.order.field]\n        const tagB = state.byIds[b]!.asset[state.order.field]\n\n        if (tagA < tagB) {\n          return state.order.direction === 'asc' ? -1 : 1\n        } else if (tagA > tagB) {\n          return state.order.direction === 'asc' ? 1 : -1\n        }\n        return 0\n      })\n    },\n    updateComplete(state, action: PayloadAction<{asset: Asset; closeDialogId?: string}>) {\n      const {asset} = action.payload\n      state.byIds[asset._id]!.updating = false\n      state.byIds[asset._id]!.asset = asset\n    },\n    updateError(state, action: PayloadAction<{asset: Asset; error: HttpError}>) {\n      const {asset, error} = action.payload\n\n      const assetId = asset?._id\n      state.byIds[assetId]!.error = error.message\n      state.byIds[assetId]!.updating = false\n    },\n    updateImageReferences(state, action: PayloadAction<{asset: Asset; id: string}>) {\n      const {id: assetId} = action.payload\n      const item = state.byIds[assetId]\n      if (!item) {\n        return\n      }\n      item.updating = true\n      delete item.error\n    },\n    updateImageReferencesComplete(state, action: PayloadAction<{id: string}>) {\n      const {id} = action.payload\n      const item = state.byIds[id]\n      if (!item) {\n        return\n      }\n      item.updating = false\n      delete item.error\n    },\n    updateRequest(\n      state,\n      action: PayloadAction<{asset: Asset; closeDialogId?: string; formData: Record<string, any>}>,\n    ) {\n      const assetId = action.payload?.asset?._id\n      state.byIds[assetId]!.updating = true\n    },\n    viewSet(state, action: PayloadAction<{view: BrowserView}>) {\n      state.view = action.payload?.view\n    },\n  },\n})\n\n// Epics\n\nexport const assetsDeleteEpic: MyEpic = (action$, _state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.deleteRequest.match),\n    mergeMap((action) => {\n      const {assets} = action.payload\n      const assetIds = assets.map((asset) => asset._id)\n      return of(assets).pipe(\n        mergeMap(() =>\n          client.observable.delete({\n            query: groq`*[_id in ${JSON.stringify(assetIds)}]`,\n          }),\n        ),\n        mergeMap(() => of(assetsActions.deleteComplete({assetIds}))),\n        catchError((error: ClientError) => {\n          return of(assetsActions.deleteError({assetIds, error}))\n        }),\n      )\n    }),\n  )\n\nexport const assetsFetchEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.fetchRequest.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) => {\n      const params = action.payload?.params\n      const query = action.payload?.query\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() =>\n          client.observable.fetch<{\n            items: Asset[]\n          }>(query, params),\n        ),\n        mergeMap((result) => {\n          const {\n            items,\n            // totalCount\n          } = result\n          return of(assetsActions.fetchComplete({assets: items}))\n        }),\n        catchError((error: ClientError) =>\n          of(\n            assetsActions.fetchError({\n              message: error?.message || 'Internal error',\n              statusCode: error?.statusCode || 500,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const assetsFetchPageIndexEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(assetsActions.loadPageIndex.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) => {\n      const pageSize = state.assets.pageSize\n      const start = action.payload.pageIndex * pageSize\n      const end = start + pageSize\n\n      // Document ID can be null when operating on pristine / unsaved drafts\n      const documentId = state?.selected.document?._id\n      const documentAssetIds = state?.selected?.documentAssetIds\n\n      const constructedFilter = constructFilter({\n        assetTypes: state.assets.assetTypes,\n        currentFolderId: state.folders.currentFolderId,\n        excludeTagSlugs: state.assets.excludeTagSlugs,\n        searchFacets: state.search.facets,\n        searchQuery: state.search.query,\n      })\n\n      const params = {\n        ...(documentId ? {documentId} : {}),\n        documentAssetIds,\n      }\n\n      return of(\n        assetsActions.fetchRequest({\n          params,\n          queryFilter: constructedFilter,\n          selector: groq`[${start}...${end}]`,\n          sort: groq`order(${state.assets?.order?.field} ${state.assets?.order?.direction})`,\n        }),\n      )\n    }),\n  )\n\nexport const assetsFetchNextPageEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(assetsActions.loadNextPage.match),\n    withLatestFrom(state$),\n    switchMap(([_action, state]) =>\n      of(assetsActions.loadPageIndex({pageIndex: state.assets.pageIndex + 1})),\n    ),\n  )\n\nexport const assetsFetchAfterDeleteAllEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(assetsActions.deleteComplete.match),\n    withLatestFrom(state$),\n    switchMap(([_action, state]) => {\n      if (state.assets.allIds.length === 0) {\n        const nextPageIndex = Math.floor(state.assets.allIds.length / state.assets.pageSize)\n        return of(assetsActions.loadPageIndex({pageIndex: nextPageIndex}))\n      }\n\n      return EMPTY\n    }),\n  )\n\nconst filterAssetWithoutTag = (tag: Tag) => (asset: AssetItem) => {\n  const tagIndex = asset?.asset?.opt?.media?.tags?.findIndex((t) => t._ref === tag?._id) ?? -1\n  return tagIndex < 0\n}\n\nconst patchOperationTagAppend =\n  ({tag}: {tag: Tag}) =>\n  (patch: Patch) =>\n    patch\n      .setIfMissing({opt: {}})\n      .setIfMissing({'opt.media': {}})\n      .setIfMissing({'opt.media.tags': []})\n      .append('opt.media.tags', [{_key: nanoid(), _ref: tag?._id, _type: 'reference', _weak: true}])\n\nconst patchOperationTagUnset =\n  ({asset, tag}: {asset: AssetItem; tag: Tag}) =>\n  (patch: Patch) =>\n    patch.ifRevisionId(asset?.asset?._rev).unset([`opt.media.tags[_ref == \"${tag._id}\"]`])\n\nconst patchOperationFolderSet =\n  ({asset, folderId}: {asset: AssetItem; folderId: string | null}) =>\n  (patch: Patch) => {\n    const nextPatch = patch.ifRevisionId(asset?.asset?._rev).setIfMissing({opt: {}}).setIfMissing({\n      'opt.media': {},\n    })\n\n    if (folderId) {\n      return nextPatch.set({\n        'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n      })\n    }\n\n    return nextPatch.unset(['opt.media.folder'])\n  }\n\nexport const assetsOrderSetEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.orderSet.match),\n    mergeMap(() => {\n      return of(\n        assetsActions.clear(), //\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      )\n    }),\n  )\n\nexport const assetsSearchEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      searchActions.facetsAdd.type,\n      searchActions.facetsClear.type,\n      searchActions.facetsRemoveById.type,\n      searchActions.facetsRemoveByName.type,\n      searchActions.facetsRemoveByTag.type,\n      searchActions.facetsUpdate.type,\n      searchActions.facetsUpdateById.type,\n      searchActions.querySet.type,\n    ),\n    debounceTime(400),\n    mergeMap(() => {\n      return of(\n        assetsActions.clear(), //\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      )\n    }),\n  )\n\nexport const assetsListenerCreateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.listenerCreateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const assets = actions?.map((action) => action.payload.asset)\n      return of(assetsActions.listenerCreateQueueComplete({assets}))\n    }),\n  )\n\nexport const assetsListenerDeleteQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.listenerDeleteQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const assetIds = actions?.map((action) => action.payload.assetId)\n      return of(assetsActions.listenerDeleteQueueComplete({assetIds}))\n    }),\n  )\n\nexport const assetsListenerUpdateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.listenerUpdateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const assets = actions?.map((action) => action.payload.asset)\n      return of(assetsActions.listenerUpdateQueueComplete({assets}))\n    }),\n  )\n\n// Re-sort on all updates (immediate and batched listener events)\nexport const assetsSortEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.insertUploads.type,\n      assetsActions.listenerUpdateQueueComplete.type,\n      assetsActions.updateComplete.type,\n    ),\n    mergeMap(() => of(assetsActions.sort())),\n  )\n\nexport const assetsTagsAddEpic: MyEpic = (action$, state$, {client}) => {\n  return action$.pipe(\n    filter(ASSETS_ACTIONS.tagsAddRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets, tag} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Add tag references to all picked assets\n        mergeMap(() => {\n          const pickedAssets = selectAssetsPicked(state)\n\n          // Filter out picked assets which already include tag\n          const pickedAssetsFiltered = pickedAssets?.filter(filterAssetWithoutTag(tag))\n\n          const transaction: Transaction = pickedAssetsFiltered.reduce(\n            (tx, pickedAsset) => tx.patch(pickedAsset?.asset?._id, patchOperationTagAppend({tag})),\n            client.transaction(),\n          )\n\n          return from(transaction.commit())\n        }),\n        // Dispatch complete action\n        mergeMap(() => of(ASSETS_ACTIONS.tagsAddComplete({assets, tag}))),\n        catchError((error: ClientError) =>\n          of(\n            ASSETS_ACTIONS.tagsAddError({\n              assets,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n}\n\nexport const assetsTagsRemoveEpic: MyEpic = (action$, state$, {client}) => {\n  return action$.pipe(\n    filter(ASSETS_ACTIONS.tagsRemoveRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets, tag} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Remove tag references from all picked assets\n        mergeMap(() => {\n          const pickedAssets = selectAssetsPicked(state)\n\n          const transaction: Transaction = pickedAssets.reduce(\n            (tx, pickedAsset) =>\n              tx.patch(pickedAsset?.asset?._id, patchOperationTagUnset({asset: pickedAsset, tag})),\n            client.transaction(),\n          )\n\n          return from(transaction.commit())\n        }),\n        // Dispatch complete action\n        mergeMap(() => of(ASSETS_ACTIONS.tagsRemoveComplete({assets, tag}))),\n        catchError((error: ClientError) =>\n          of(\n            ASSETS_ACTIONS.tagsRemoveError({\n              assets,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n}\n\nexport const assetsFolderSetEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.folderSetRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets, closeDialogId, folderId} = action.payload\n      const assetIds = assets.map((asset) => asset.asset._id)\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => {\n          const transaction: Transaction = assets.reduce(\n            (tx, asset) => tx.patch(asset.asset._id, patchOperationFolderSet({asset, folderId})),\n            client.transaction(),\n          )\n\n          return from(transaction.commit())\n        }),\n        mergeMap(() =>\n          of(\n            assetsActions.folderSetComplete({\n              assetIds,\n              closeDialogId,\n              folderId,\n            }),\n          ),\n        ),\n        catchError((error: ClientError) =>\n          of(\n            assetsActions.folderSetError({\n              assetIds,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const assetsFolderSetRefreshEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.folderSetComplete.match),\n    mergeMap(() =>\n      of(\n        assetsActions.pickClear(),\n        assetsActions.clear(),\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      ),\n    ),\n  )\n\nexport const assetsUnpickEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.orderSet.type,\n      assetsActions.viewSet.type,\n      searchActions.facetsAdd.type,\n      searchActions.facetsClear.type,\n      searchActions.facetsRemoveById.type,\n      searchActions.facetsRemoveByName.type,\n      searchActions.facetsRemoveByTag.type,\n      searchActions.facetsUpdate.type,\n      searchActions.facetsUpdateById.type,\n      searchActions.querySet.type,\n    ),\n    mergeMap(() => {\n      return of(assetsActions.pickClear())\n    }),\n  )\n\nexport const assetsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.updateRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {asset, closeDialogId, formData} = action.payload\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() =>\n          from(\n            client\n              .patch(asset._id)\n              .setIfMissing({opt: {}})\n              .setIfMissing({'opt.media': {}})\n              .set(formData)\n              .commit(),\n          ),\n        ),\n        mergeMap((updatedAsset: any) =>\n          of(\n            assetsActions.updateComplete({\n              asset: updatedAsset,\n              closeDialogId,\n            }),\n          ),\n        ),\n        catchError((error: ClientError) =>\n          of(\n            assetsActions.updateError({\n              asset,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const assetsUpdateImageReferencesEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.updateImageReferences.match),\n    withLatestFrom(state$),\n    // Queue replaces so a later action still runs (exhaustMap would drop it after\n    // the reducer already set `updating`, leaving a stuck spinner). Same-asset\n    // double-clicks are blocked in the UI when the original is already updating.\n    concatMap(([action, state]) => {\n      const {asset, id} = action.payload\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => client.observable.fetch<SanityDocument[]>(groq`*[references($id)]`, {id})),\n        mergeMap((documents) => {\n          // Patch every referencing document in one transaction so we never leave\n          // references split across old/new assets if a later commit would fail.\n          let patchedCount = 0\n          const transaction: Transaction = documents.reduce((tx, document) => {\n            const clonedDocument = JSON.parse(JSON.stringify(document)) as Record<string, unknown>\n            const assetsToReplace = findImageAssets(clonedDocument, asset, id)\n            if (assetsToReplace.length === 0) {\n              return tx\n            }\n            patchedCount += 1\n            const patchSet = Object.assign({}, ...assetsToReplace) as AttributeSet\n            return tx.patch(document._id, (patch) =>\n              patch.ifRevisionId(document._rev).set(patchSet),\n            )\n          }, client.transaction())\n\n          if (patchedCount === 0) {\n            return of(assetsActions.updateImageReferencesComplete({id}))\n          }\n\n          return from(transaction.commit()).pipe(\n            mergeMap(() => of(assetsActions.updateImageReferencesComplete({id}))),\n          )\n        }),\n        catchError((error: ClientError) => {\n          // The asset marked as `updating` is the original (being replaced), keyed\n          // by `id` — not the replacement `asset` that was clicked. Attach the error\n          // to (and clear the spinner on) the original asset.\n          const originalAsset = state.assets.byIds[id]?.asset ?? asset\n          return of(\n            assetsActions.updateError({\n              asset: originalAsset,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          )\n        }),\n      )\n    }),\n  )\n\n// Selectors\n\nconst selectAssetsByIds = (state: RootReducerState) => state.assets.byIds\n\nconst selectAssetsAllIds = (state: RootReducerState) => state.assets.allIds\n\nexport const selectAssetById = createSelector(\n  [\n    (state: RootReducerState) => state.assets.byIds,\n    (_state: RootReducerState, assetId: string) => assetId,\n  ],\n  (byIds, assetId) => {\n    const asset = byIds[assetId]\n    return asset ? asset : undefined\n  },\n)\n\nconst selectAssets: Selector<RootReducerState, AssetItem[]> = createSelector(\n  [selectAssetsByIds, selectAssetsAllIds],\n  (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectAssetsLength = createSelector([selectAssets], (assets) => assets.length)\n\nexport const selectAssetsPicked = createSelector([selectAssets], (assets) =>\n  assets.filter((item) => item?.picked),\n)\n\nexport const selectAssetsPickedLength = createSelector(\n  [selectAssetsPicked],\n  (assetsPicked) => assetsPicked.length,\n)\n\nexport const assetsActions = {...assetsSlice.actions}\n\nexport default assetsSlice.reducer\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Patch} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport {from, of} from 'rxjs'\nimport {\n  catchError,\n  debounceTime,\n  filter,\n  map,\n  mergeMap,\n  switchMap,\n  withLatestFrom,\n} from 'rxjs/operators'\n\nimport {FOLDER_DOCUMENT_NAME} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {FolderDoc, FolderTreeItem, FolderTreeNode, HttpError, MyEpic} from '../../types'\nimport {buildExcludeTagsFragment} from '../../utils/constructFilter'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\n\ntype FoldersReducerState = {\n  byId: Record<string, FolderDoc>\n  childrenByParentId: Record<string, string[]>\n  rootIds: string[]\n  exactCountByFolderId: Record<string, number>\n  unfiledCount: number\n  currentFolderId: string | null\n  currentFolderUnfiled: boolean\n  panelVisible: boolean\n  fetching: boolean\n  fetchCount: number\n  fetchingError?: HttpError\n  creating: boolean\n  creatingError?: HttpError\n  deletingId?: string\n  deleteError?: HttpError\n  renaming: boolean\n  renameError?: HttpError\n}\n\nconst initialState: FoldersReducerState = {\n  byId: {},\n  childrenByParentId: {},\n  rootIds: [],\n  exactCountByFolderId: {},\n  unfiledCount: 0,\n  currentFolderId: null,\n  currentFolderUnfiled: false,\n  panelVisible: false,\n  fetching: false,\n  fetchCount: -1,\n  fetchingError: undefined,\n  creating: false,\n  creatingError: undefined,\n  deletingId: undefined,\n  deleteError: undefined,\n  renaming: false,\n  renameError: undefined,\n}\n\nconst indexFolders = (folders: FolderDoc[]) => {\n  const byId: Record<string, FolderDoc> = {}\n  const childrenByParentId: Record<string, string[]> = {}\n  const rootIds: string[] = []\n\n  folders.forEach((folder) => {\n    byId[folder._id] = folder\n  })\n\n  // Resolve parent ids that reference unknown folders to null (defensive — orphan folders surface at root).\n  folders.forEach((folder) => {\n    const parentKey = folder.parentId && byId[folder.parentId] ? folder.parentId : null\n    if (parentKey === null) {\n      rootIds.push(folder._id)\n    } else {\n      if (!childrenByParentId[parentKey]) {\n        childrenByParentId[parentKey] = []\n      }\n      childrenByParentId[parentKey].push(folder._id)\n    }\n  })\n\n  const sortByName = (ids: string[]) =>\n    ids.sort((a, b) =>\n      (byId[a]?.name || '').localeCompare(byId[b]?.name || '', undefined, {\n        numeric: true,\n        sensitivity: 'base',\n      }),\n    )\n\n  sortByName(rootIds)\n  Object.values(childrenByParentId).forEach((ids) => sortByName(ids))\n\n  return {byId, childrenByParentId, rootIds}\n}\n\nconst foldersSlice = createSlice({\n  name: 'folders',\n  initialState,\n  reducers: {\n    createComplete(state, _action: PayloadAction<{folder: FolderDoc}>) {\n      state.creating = false\n    },\n    createError(state, action: PayloadAction<{error: HttpError}>) {\n      state.creating = false\n      state.creatingError = action.payload.error\n    },\n    createRequest(state, _action: PayloadAction<{name: string; parentId?: string | null}>) {\n      state.creating = true\n      delete state.creatingError\n    },\n    currentFolderClear(state) {\n      state.currentFolderId = null\n      state.currentFolderUnfiled = false\n    },\n    currentFolderSet(state, action: PayloadAction<{folderId: string}>) {\n      state.currentFolderId = action.payload.folderId\n      state.currentFolderUnfiled = false\n    },\n    currentFolderShowUnfiled(state) {\n      state.currentFolderId = null\n      state.currentFolderUnfiled = true\n    },\n    deleteComplete(\n      state,\n      action: PayloadAction<{\n        folderId: string\n        deletedIds: string[]\n        clearedCurrentFolder?: boolean\n      }>,\n    ) {\n      state.deletingId = undefined\n      const removed = new Set(action.payload.deletedIds)\n      if (state.currentFolderId && removed.has(state.currentFolderId)) {\n        state.currentFolderId = null\n        state.currentFolderUnfiled = false\n      }\n    },\n    deleteError(state, action: PayloadAction<{error: HttpError; folderId: string}>) {\n      state.deletingId = undefined\n      state.deleteError = action.payload.error\n    },\n    deleteRequest(state, action: PayloadAction<{folderId: string}>) {\n      state.deletingId = action.payload.folderId\n      delete state.deleteError\n    },\n    fetchComplete(\n      state,\n      action: PayloadAction<{\n        folders: FolderDoc[]\n        exactCountByFolderId: Record<string, number>\n        unfiledCount: number\n        clearedCurrentFolder?: boolean\n      }>,\n    ) {\n      const {byId, childrenByParentId, rootIds} = indexFolders(action.payload.folders)\n      state.byId = byId\n      state.childrenByParentId = childrenByParentId\n      state.rootIds = rootIds\n      state.exactCountByFolderId = action.payload.exactCountByFolderId\n      state.unfiledCount = action.payload.unfiledCount\n      state.fetching = false\n      state.fetchCount = action.payload.folders.length\n      delete state.fetchingError\n\n      if (state.currentFolderId && !byId[state.currentFolderId]) {\n        state.currentFolderId = null\n        state.currentFolderUnfiled = false\n      }\n    },\n    fetchError(state, action: PayloadAction<{error: HttpError}>) {\n      state.fetching = false\n      state.fetchingError = action.payload.error\n    },\n    fetchRequest(state) {\n      state.fetching = true\n      delete state.fetchingError\n    },\n    panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n      state.panelVisible = action.payload.panelVisible\n    },\n    renameComplete(state, _action: PayloadAction<{folderId: string; name: string}>) {\n      state.renaming = false\n    },\n    renameError(state, action: PayloadAction<{error: HttpError}>) {\n      state.renaming = false\n      state.renameError = action.payload.error\n    },\n    renameRequest(state, _action: PayloadAction<{folderId: string; name: string}>) {\n      state.renaming = true\n      delete state.renameError\n    },\n  },\n})\n\nexport const foldersFetchEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.fetchRequest.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) =>\n      of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => {\n          const assetTypes = state.assets.assetTypes.map((type) => `sanity.${type}Asset`)\n          const excludeTagsFragment = buildExcludeTagsFragment(state.assets.excludeTagSlugs)\n          const excludeTagsClause = excludeTagsFragment ? `&& ${excludeTagsFragment}` : ''\n          return client.observable.fetch<{\n            folders: {_id: string; name?: string; parentId?: string | null; count: number}[]\n            unfiledCount: number\n          }>(\n            groq`{\n              \"folders\": *[\n                _type == \"${FOLDER_DOCUMENT_NAME}\"\n                && !(_id in path(\"drafts.**\"))\n              ] {\n                _id,\n                name,\n                \"parentId\": parent._ref,\n                \"count\": count(*[\n                  _type in ${JSON.stringify(assetTypes)}\n                  && !(_id in path(\"drafts.**\"))\n                  && opt.media.folder._ref == ^._id\n                  ${excludeTagsClause}\n                ])\n              },\n              \"unfiledCount\": count(*[\n                _type in ${JSON.stringify(assetTypes)}\n                && !(_id in path(\"drafts.**\"))\n                && !defined(opt.media.folder._ref)\n                ${excludeTagsClause}\n              ])\n            }`,\n          )\n        }),\n        mergeMap((result) => {\n          const folders: FolderDoc[] = result.folders.map((f) => ({\n            _id: f._id,\n            name: f.name || '',\n            parentId: f.parentId || null,\n          }))\n          const exactCountByFolderId: Record<string, number> = {}\n          result.folders.forEach(({_id, count}) => {\n            exactCountByFolderId[_id] = count\n          })\n          const folderIds = new Set(folders.map((folder) => folder._id))\n          const clearedCurrentFolder = Boolean(\n            state.folders.currentFolderId && !folderIds.has(state.folders.currentFolderId),\n          )\n          return of(\n            foldersSlice.actions.fetchComplete({\n              folders,\n              exactCountByFolderId,\n              unfiledCount: result.unfiledCount,\n              clearedCurrentFolder,\n            }),\n          )\n        }),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.fetchError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      ),\n    ),\n  )\n\nexport const foldersRefreshEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(\n      (action) =>\n        assetsActions.deleteComplete.match(action) ||\n        assetsActions.folderSetComplete.match(action) ||\n        foldersSlice.actions.createComplete.match(action) ||\n        foldersSlice.actions.deleteComplete.match(action) ||\n        foldersSlice.actions.renameComplete.match(action) ||\n        assetsActions.listenerCreateQueueComplete.match(action) ||\n        assetsActions.listenerDeleteQueueComplete.match(action) ||\n        assetsActions.listenerUpdateQueueComplete.match(action) ||\n        assetsActions.updateComplete.match(action) ||\n        UPLOADS_ACTIONS.uploadComplete.match(action),\n    ),\n    debounceTime(300),\n    mergeMap(() => of(foldersSlice.actions.fetchRequest())),\n  )\n\nexport const foldersCurrentFolderEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(\n      (action) =>\n        foldersSlice.actions.currentFolderClear.match(action) ||\n        foldersSlice.actions.currentFolderSet.match(action) ||\n        foldersSlice.actions.currentFolderShowUnfiled.match(action) ||\n        (foldersSlice.actions.deleteComplete.match(action) &&\n          Boolean(action.payload.clearedCurrentFolder)) ||\n        (foldersSlice.actions.fetchComplete.match(action) &&\n          Boolean(action.payload.clearedCurrentFolder)),\n    ),\n    mergeMap(() =>\n      of(\n        assetsActions.clear(),\n        assetsActions.pickClear(),\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      ),\n    ),\n  )\n\nconst patchOperationAssetFolderUnset = (patch: Patch) => patch.unset(['opt.media.folder'])\n\nconst patchOperationFolderParentSet =\n  ({parentId}: {parentId: string | null}) =>\n  (patch: Patch) => {\n    if (parentId) {\n      return patch.set({parent: {_ref: parentId, _type: 'reference', _weak: true}})\n    }\n\n    return patch.unset(['parent'])\n  }\n\nexport const foldersCreateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.createRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const name = action.payload.name.trim()\n      const parentId = action.payload.parentId || null\n\n      if (!name) {\n        return of(\n          foldersSlice.actions.createError({\n            error: {message: 'Folder name cannot be empty', statusCode: 400},\n          }),\n        )\n      }\n\n      const siblingIds = parentId\n        ? state.folders.childrenByParentId[parentId] || []\n        : state.folders.rootIds\n      const collision = siblingIds.some(\n        (id) => state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n      )\n      if (collision) {\n        return of(\n          foldersSlice.actions.createError({\n            error: {message: 'A folder with this name already exists here', statusCode: 409},\n          }),\n        )\n      }\n\n      const newId = `${FOLDER_DOCUMENT_NAME}.${nanoid()}`\n      const doc: {\n        _id: string\n        _type: string\n        name: string\n        parent?: {_ref: string; _type: 'reference'; _weak: true}\n      } = {\n        _id: newId,\n        _type: FOLDER_DOCUMENT_NAME,\n        name,\n      }\n      if (parentId) {\n        doc.parent = {_ref: parentId, _type: 'reference', _weak: true}\n      }\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => client.observable.create(doc)),\n        mergeMap(() =>\n          of(\n            foldersSlice.actions.createComplete({folder: {_id: newId, name, parentId}}),\n            foldersSlice.actions.currentFolderSet({folderId: newId}),\n          ),\n        ),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.createError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const foldersDeleteEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.deleteRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const folderId = action.payload.folderId\n      const childFolderIds = state.folders.childrenByParentId[folderId] || []\n      const parentId = state.folders.byId[folderId]?.parentId ?? null\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() =>\n          client.observable.fetch<{assets: {_id: string}[]}>(\n            groq`{\n              \"assets\": *[\n                _type in ${JSON.stringify(\n                  state.assets.assetTypes.map((type) => `sanity.${type}Asset`),\n                )}\n                && !(_id in path(\"drafts.**\"))\n                && opt.media.folder._ref == $folderId\n              ] {\n                _id\n              }\n            }`,\n            {folderId},\n          ),\n        ),\n        mergeMap((result) => {\n          const tx = client.transaction()\n          // Deleting a folder only removes the folder document. Assets keep living in the\n          // library with their folder assignment cleared, and direct child folders are promoted\n          // to the deleted folder's parent (or root).\n          result.assets.forEach((asset) => tx.patch(asset._id, patchOperationAssetFolderUnset))\n          childFolderIds.forEach((childFolderId) =>\n            tx.patch(childFolderId, patchOperationFolderParentSet({parentId})),\n          )\n          tx.delete(folderId)\n\n          return from(tx.commit()).pipe(\n            map(() =>\n              foldersSlice.actions.deleteComplete({\n                folderId,\n                deletedIds: [folderId],\n                clearedCurrentFolder: state.folders.currentFolderId === folderId,\n              }),\n            ),\n          )\n        }),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.deleteError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              folderId,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const foldersRenameEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.renameRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {folderId} = action.payload\n      const name = action.payload.name.trim()\n      const folder = state.folders.byId[folderId]\n\n      if (!folder) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'Folder not found', statusCode: 404},\n          }),\n        )\n      }\n\n      if (!name) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'Folder name cannot be empty', statusCode: 400},\n          }),\n        )\n      }\n\n      if (name === folder.name) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'Folder name has not changed', statusCode: 400},\n          }),\n        )\n      }\n\n      const siblingIds = folder.parentId\n        ? state.folders.childrenByParentId[folder.parentId] || []\n        : state.folders.rootIds\n      const collision = siblingIds.some(\n        (id) =>\n          id !== folderId && state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n      )\n      if (collision) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'A folder with this name already exists here', statusCode: 409},\n          }),\n        )\n      }\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => client.observable.patch(folderId).set({name}).commit()),\n        mergeMap(() => of(foldersSlice.actions.renameComplete({folderId, name}))),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.renameError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nconst selectById = (state: RootReducerState) => state.folders.byId\nconst selectChildrenByParentId = (state: RootReducerState) => state.folders.childrenByParentId\nconst selectRootIds = (state: RootReducerState) => state.folders.rootIds\nconst selectExactCountByFolderId = (state: RootReducerState) => state.folders.exactCountByFolderId\nconst selectCurrentFolderId = (state: RootReducerState) => state.folders.currentFolderId\nconst selectCurrentFolderUnfiled = (state: RootReducerState) => state.folders.currentFolderUnfiled\n\nconst buildFolderPath = (folderId: string, byId: Record<string, FolderDoc>): string => {\n  const segments: string[] = []\n  let cursor: string | null = folderId\n  const seen = new Set<string>()\n  while (cursor && !seen.has(cursor)) {\n    const folder: FolderDoc | undefined = byId[cursor]\n    if (!folder) break\n    seen.add(cursor)\n    segments.unshift(folder.name)\n    cursor = folder.parentId\n  }\n  return segments.join('/')\n}\n\nexport const selectFolderPathById = createSelector(\n  [selectById, (_state: RootReducerState, folderId: string | null | undefined) => folderId],\n  (byId, folderId) => (folderId ? buildFolderPath(folderId, byId) : ''),\n)\n\nexport const selectFolderTree = createSelector(\n  [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n  (byId, childrenByParentId, rootIds, exactCountByFolderId): FolderTreeNode[] => {\n    const buildNode = (folderId: string): FolderTreeNode => {\n      const folder = byId[folderId]\n      const children = (childrenByParentId[folderId] || []).map(buildNode)\n      const exactCount = exactCountByFolderId[folderId] || 0\n      const totalCount = children.reduce((sum, child) => sum + child.totalCount, exactCount)\n      return {\n        children,\n        exactCount,\n        id: folderId,\n        name: folder?.name || '',\n        parentId: folder?.parentId ?? null,\n        path: buildFolderPath(folderId, byId),\n        totalCount,\n      }\n    }\n\n    return rootIds.map(buildNode)\n  },\n)\n\nexport const selectCurrentFolderSegments = createSelector(\n  [selectById, selectCurrentFolderId],\n  (byId, currentFolderId): FolderTreeItem[] => {\n    if (!currentFolderId) return []\n    const chain: string[] = []\n    let cursor: string | null = currentFolderId\n    const seen = new Set<string>()\n    while (cursor && !seen.has(cursor)) {\n      const folder: FolderDoc | undefined = byId[cursor]\n      if (!folder) break\n      seen.add(cursor)\n      chain.unshift(cursor)\n      cursor = folder.parentId\n    }\n    return chain.map((id, depth) => ({\n      depth,\n      exactCount: 0,\n      id,\n      name: byId[id]?.name || '',\n      parentId: byId[id]?.parentId ?? null,\n      path: buildFolderPath(id, byId),\n      totalCount: 0,\n    }))\n  },\n)\n\ntype FoldersIndex = {\n  byId: Record<string, FolderDoc>\n  childrenByParentId: Record<string, string[]>\n  rootIds: string[]\n  exactCountByFolderId: Record<string, number>\n}\n\nconst selectFoldersIndex = createSelector(\n  [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n  (byId, childrenByParentId, rootIds, exactCountByFolderId): FoldersIndex => ({\n    byId,\n    childrenByParentId,\n    rootIds,\n    exactCountByFolderId,\n  }),\n)\n\nexport const selectCurrentFolderChildren = createSelector(\n  [selectFoldersIndex, selectCurrentFolderId, selectCurrentFolderUnfiled],\n  (\n    {byId, childrenByParentId, rootIds, exactCountByFolderId},\n    currentFolderId,\n    currentFolderUnfiled,\n  ): FolderTreeItem[] => {\n    if (currentFolderUnfiled || !currentFolderId) return []\n    const ids = currentFolderId ? childrenByParentId[currentFolderId] || [] : rootIds\n    const depth = currentFolderId ? buildFolderPath(currentFolderId, byId).split('/').length : 0\n    return ids.map((id) => {\n      const folder = byId[id]\n      // Sum totalCount over the subtree.\n      const stack = [id]\n      let totalCount = 0\n      while (stack.length) {\n        const cur = stack.pop()!\n        totalCount += exactCountByFolderId[cur] || 0\n        const kids = childrenByParentId[cur]\n        if (kids) stack.push(...kids)\n      }\n      return {\n        depth,\n        exactCount: exactCountByFolderId[id] || 0,\n        id,\n        name: folder?.name || '',\n        parentId: folder?.parentId ?? null,\n        path: buildFolderPath(id, byId),\n        totalCount,\n      }\n    })\n  },\n)\n\nexport const selectCanDeleteFolder = createSelector(\n  [selectCurrentFolderId],\n  (currentFolderId) => !!currentFolderId,\n)\n\nexport const foldersActions = {...foldersSlice.actions}\n\nexport default foldersSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\n\nimport type {AssetItem, Dialog, MyEpic, Tag} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {DIALOG_ACTIONS} from './actions'\n\ntype DialogReducerState = {\n  items: Dialog[]\n}\n\nconst initialState = {\n  items: [],\n} as DialogReducerState\n\nconst dialogSlice = createSlice({\n  name: 'dialog',\n  initialState,\n  extraReducers: (builder) => {\n    builder\n      .addCase(DIALOG_ACTIONS.showFolderCreate, (state, action) => {\n        const {parentFolderId} = action.payload\n        state.items.push({\n          parentFolderId,\n          id: 'folderCreate',\n          type: 'folderCreate',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showFolderMove, (state, action) => {\n        const {assets, folderId} = action.payload\n        state.items.push({\n          assets,\n          folderId,\n          id: 'folderMove',\n          type: 'folderMove',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showFolderRename, (state, action) => {\n        const {folderId} = action.payload\n        state.items.push({\n          folderId,\n          id: 'folderRename',\n          type: 'folderRename',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n        state.items.push({\n          id: 'tagCreate',\n          type: 'tagCreate',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n        const {tagId} = action.payload\n        state.items.push({\n          id: tagId,\n          tagId,\n          type: 'tagEdit',\n        })\n      })\n      .addCase(foldersActions.createComplete, (state) => {\n        state.items = state.items.filter((item) => item.id !== 'folderCreate')\n      })\n      .addCase(foldersActions.renameComplete, (state) => {\n        state.items = state.items.filter((item) => item.id !== 'folderRename')\n      })\n  },\n  reducers: {\n    // Clear all dialogs\n    clear(state) {\n      state.items = []\n    },\n    // Add newly created inline tag to assetEdit dialog\n    inlineTagCreate(state, action: PayloadAction<{assetId: string; tag: Tag}>) {\n      const {assetId, tag} = action.payload\n\n      state.items.forEach((item) => {\n        if (item.type === 'assetEdit' && item.assetId === assetId) {\n          item.lastCreatedTag = {\n            label: tag.name.current,\n            value: tag._id,\n          }\n        }\n      })\n    },\n    // Remove inline tags from assetEdit dialog\n    inlineTagRemove(state, action: PayloadAction<{tagIds: string[]}>) {\n      const {tagIds} = action.payload\n\n      state.items.forEach((item) => {\n        if (item.type === 'assetEdit') {\n          item.lastRemovedTagIds = tagIds\n        }\n      })\n    },\n    // Remove dialog by id\n    remove(state, action: PayloadAction<{id: string}>) {\n      const id = action.payload?.id\n      state.items = state.items.filter((item) => item.id !== id)\n    },\n    showConfirmAssetsTagAdd(\n      state,\n      action: PayloadAction<{\n        assetsPicked: AssetItem[]\n        closeDialogId?: string\n        tag: Tag\n      }>,\n    ) {\n      const {assetsPicked, closeDialogId, tag} = action.payload\n\n      const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: ASSETS_ACTIONS.tagsAddRequest({\n          assets: assetsPicked,\n          tag,\n        }),\n        confirmText: `Yes, add tag to ${suffix}`,\n        title: `Add tag ${tag.name.current} to ${suffix}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm tag addition',\n        tone: 'primary',\n        type: 'confirm',\n      })\n    },\n    showConfirmAssetsTagRemove(\n      state,\n      action: PayloadAction<{\n        assetsPicked: AssetItem[]\n        closeDialogId?: string\n        tag: Tag\n      }>,\n    ) {\n      const {assetsPicked, closeDialogId, tag} = action.payload\n\n      const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: ASSETS_ACTIONS.tagsRemoveRequest({assets: assetsPicked, tag}),\n        confirmText: `Yes, remove tag from ${suffix}`,\n        headerTitle: 'Confirm tag removal',\n        id: 'confirm',\n        title: `Remove tag ${tag.name.current} from ${suffix}?`,\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showConfirmDeleteAssets(\n      state,\n      action: PayloadAction<{assets: AssetItem[]; closeDialogId?: string}>,\n    ) {\n      const {assets, closeDialogId} = action.payload\n\n      const suffix = `${assets.length} ${pluralize('asset', assets.length)}`\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: assetsActions.deleteRequest({\n          assets: assets.map((assetItem) => assetItem.asset),\n        }),\n        confirmText: `Yes, delete ${suffix}`,\n        description: 'This operation cannot be reversed. Are you sure you want to continue?',\n        title: `Permanently delete ${suffix}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm deletion',\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showConfirmDeleteFolder(\n      state,\n      action: PayloadAction<{closeDialogId?: string; folderId: string; folderName: string}>,\n    ) {\n      const {closeDialogId, folderId, folderName} = action.payload\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: foldersActions.deleteRequest({folderId}),\n        confirmText: `Yes, delete folder`,\n        description:\n          'This deletes only the selected folder. Assets in this folder will stay in the library and have their folder assignment removed. Nested folders will move up one level.',\n        title: `Delete ${folderName}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm folder deletion',\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showConfirmDeleteTag(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n      const {closeDialogId, tag} = action.payload\n\n      const suffix = 'tag'\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: tagsActions.deleteRequest({tag}),\n        confirmText: `Yes, delete ${suffix}`,\n        description: 'This operation cannot be reversed. Are you sure you want to continue?',\n        title: `Permanently delete ${suffix}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm deletion',\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showAllAssetsDialog(state, action: PayloadAction<{assetId: string}>) {\n      if (state.items.some((item) => item.type === 'dialogAllAssets')) {\n        return\n      }\n      state.items.push({\n        assetId: action.payload.assetId,\n        id: 'dialogAllAssets',\n        type: 'dialogAllAssets',\n      })\n    },\n    showAssetEdit(state, action: PayloadAction<{assetId: string}>) {\n      const {assetId} = action.payload\n      state.items.push({\n        assetId,\n        id: assetId,\n        type: 'assetEdit',\n      })\n    },\n    showSearchFacets(state) {\n      state.items.push({\n        id: 'searchFacets',\n        type: 'searchFacets',\n      })\n    },\n    showFolders(state) {\n      state.items.push({\n        id: 'folders',\n        type: 'folders',\n      })\n    },\n    showTags(state) {\n      state.items.push({\n        id: 'tags',\n        type: 'tags',\n      })\n    },\n  },\n})\n\n// Epics\n\nexport const dialogClearOnAssetUpdateEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.deleteComplete.type,\n      assetsActions.folderSetComplete.type,\n      assetsActions.updateComplete.type,\n      tagsActions.deleteComplete.type,\n      tagsActions.updateComplete.type,\n    ),\n    filter(\n      (action: {\n        payload: {closeDialogId?: string}\n      }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,\n    ),\n    mergeMap((action) => {\n      const dialogId = action?.payload?.closeDialogId\n      if (dialogId) {\n        return of(dialogSlice.actions.remove({id: dialogId}))\n      }\n      return EMPTY\n    }),\n  )\n\nexport const dialogTagCreateEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.createComplete.match),\n    mergeMap((action) => {\n      const {assetId, tag} = action?.payload || {}\n\n      if (assetId) {\n        return of(dialogSlice.actions.inlineTagCreate({tag, assetId}))\n      }\n\n      if (tag._id) {\n        return of(dialogSlice.actions.remove({id: 'tagCreate'}))\n      }\n\n      return EMPTY\n    }),\n  )\n\nexport const dialogTagDeleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.listenerDeleteQueueComplete.match),\n    mergeMap((action) => {\n      const {tagIds} = action?.payload || {}\n\n      return of(dialogSlice.actions.inlineTagRemove({tagIds}))\n    }),\n  )\n\nexport const dialogActions = {...dialogSlice.actions}\n\nexport default dialogSlice.reducer\n","import {createGlobalStyle, css} from 'styled-components'\n\nconst customScrollbar = css`\n  ::-webkit-scrollbar {\n    width: 14px;\n  }\n\n  ::-webkit-scrollbar-thumb {\n    border-radius: 10px;\n    border: 4px solid rgba(0, 0, 0, 0);\n    background: var(--card-border-color);\n    background-clip: padding-box;\n\n    &:hover {\n      background: var(--card-muted-fg-color);\n      background-clip: padding-box;\n    }\n  }\n`\n\nconst GlobalStyle = createGlobalStyle`\n  .media__custom-scrollbar {\n    ${customScrollbar}\n  }\n\n  // @sanity/ui overrides\n\n  // Custom scrollbar on Box (used in Dialogs)\n  div[data-ui=\"Box\"] {\n    ${customScrollbar}\n  }\n\n  // Dialog background color\n  div[data-ui=\"Dialog\"] {\n    background-color: rgba(15, 17, 18, 0.9);\n  }\n\n`\n\nexport default GlobalStyle\n","import {type PropsWithChildren, createContext, useContext, useMemo} from 'react'\nimport type {DropzoneOptions} from 'react-dropzone'\n\nimport type {MediaToolOptions, Locale} from '../types'\n\ntype ContextProps = {\n  dropzone: Pick<DropzoneOptions, 'maxSize'>\n  components: MediaToolOptions['components']\n  createTagsOnUpload: boolean\n  creditLine: MediaToolOptions['creditLine']\n  directUploads: MediaToolOptions['directUploads']\n  excludeTagSlugs: string[]\n  locales?: Locale[]\n}\n\nconst ToolOptionsContext = createContext<ContextProps | null>(null)\n\ntype Props = {\n  options?: MediaToolOptions | void\n}\n\nexport const ToolOptionsProvider = ({options, children}: PropsWithChildren<Props>) => {\n  const value = useMemo<ContextProps>(() => {\n    let creditLineExcludeSources\n\n    if (options?.creditLine?.excludeSources) {\n      creditLineExcludeSources = Array.isArray(options?.creditLine?.excludeSources)\n        ? options.creditLine.excludeSources\n        : [options?.creditLine?.excludeSources]\n    }\n\n    return {\n      dropzone: {maxSize: options?.maximumUploadSize},\n      components: {\n        details: options?.components?.details,\n      },\n      createTagsOnUpload: options?.createTagsOnUpload ?? true,\n      creditLine: {\n        enabled: options?.creditLine?.enabled || false,\n        excludeSources: creditLineExcludeSources,\n      },\n      directUploads: options?.directUploads ?? true,\n      excludeTagSlugs: options?.excludeTags?.length ? [...options.excludeTags] : [],\n      locales: options?.locales,\n    }\n    // oxlint-disable-next-line react/preserve-manual-memoization\n  }, [\n    options?.creditLine?.enabled,\n    options?.components,\n    options?.createTagsOnUpload,\n    options?.creditLine?.excludeSources,\n    options?.excludeTags,\n    options?.maximumUploadSize,\n    options?.directUploads,\n    options?.locales,\n  ])\n\n  return <ToolOptionsContext.Provider value={value}>{children}</ToolOptionsContext.Provider>\n}\n\nexport const useToolOptions = () => {\n  const context = useContext(ToolOptionsContext)\n\n  if (!context) {\n    throw new Error('useToolOptions must be used within an ToolOptionsProvider')\n  }\n\n  return context\n}\n","import * as z from 'zod'\n\n// Helper to generate localized string schema\nfunction localizedStringSchema(locales?: {id: string}[]) {\n  if (!locales || locales.length === 0) {\n    return z.string().trim().optional()\n  }\n  const shape: Record<string, z.ZodTypeAny> = {}\n  for (const locale of locales) {\n    shape[locale.id] = z.string().trim().optional()\n  }\n  return z.object(shape).passthrough()\n}\n\nexport const tagOptionSchema = z.object({\n  label: z.string().trim().min(1, {message: 'Label cannot be empty'}),\n  value: z.string().trim().min(1, {message: 'Value cannot be empty'}),\n})\n\nexport function getAssetFormSchema(locales?: {id: string}[]) {\n  return z.object({\n    altText: localizedStringSchema(locales),\n    creditLine: localizedStringSchema(locales),\n    description: localizedStringSchema(locales),\n    opt: z.object({\n      media: z.object({\n        tags: z.array(tagOptionSchema).nullable(),\n      }),\n    }),\n    originalFilename: z.string().trim().min(1, {message: 'Filename cannot be empty'}),\n    title: localizedStringSchema(locales),\n  })\n}\n\nexport const assetFormSchema = getAssetFormSchema()\n\nexport const tagFormSchema = z.object({\n  name: z.string().min(1, {message: 'Name cannot be empty'}),\n})\n\nexport const folderFormSchema = z.object({\n  name: z.string().trim().min(1, {message: 'Name cannot be empty'}),\n})\n","import type {SanityDocument} from '@sanity/client'\n\nexport function getUniqueDocuments(documents: SanityDocument[]): SanityDocument[] {\n  const draftIds = documents.reduce(\n    (acc: string[], doc: SanityDocument) =>\n      doc._id.startsWith('drafts.') ? acc.concat(doc._id.slice(7)) : acc,\n    [],\n  )\n\n  const filteredDocuments: SanityDocument[] = documents.filter(\n    (doc: SanityDocument) => !draftIds.includes(doc._id),\n  )\n\n  return filteredDocuments\n}\n","import type {ImageAsset} from '../types'\n\nconst imageDprUrl = (\n  asset: ImageAsset,\n  options: {\n    width: number\n    height?: number\n  },\n): string => {\n  const dpi =\n    typeof window === 'undefined' || !window.devicePixelRatio\n      ? 1\n      : Math.round(window.devicePixelRatio)\n  const imgH = options?.height ? options?.height * Math.max(1, dpi) : undefined\n  const imgW = options.width * Math.max(1, dpi)\n\n  const urlParams = new URLSearchParams()\n  urlParams.append('fit', 'max')\n  urlParams.append('w', imgW.toString())\n  if (imgH) {\n    urlParams.append('h', imgH.toString())\n  }\n\n  return `${asset.url}?${urlParams.toString()}`\n}\n\nexport default imageDprUrl\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n  return Object.keys(formData).reduce((acc: FormData, key) => {\n    const val = formData[key]\n\n    // TODO: refactor\n    if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n      acc[key] = sanitizeFormData(val)\n    } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n      acc[key] = null\n    } else if (typeof val === 'string' && val) {\n      acc[key] = formData[key].trim()\n    } else {\n      acc[key] = formData[key]\n    }\n\n    return acc\n  }, {})\n}\n\nexport default sanitizeFormData\n","import type {Asset, FileAsset, ImageAsset} from '../types'\n\nexport const isFileAsset = (asset: Asset): asset is FileAsset => {\n  return (asset as FileAsset)._type === 'sanity.fileAsset'\n}\n\nexport const isImageAsset = (asset: Asset): asset is ImageAsset => {\n  return (asset as ImageAsset)._type === 'sanity.imageAsset'\n}\n","import {zodResolver} from '@hookform/resolvers/zod'\nimport type {FieldValues, Resolver} from 'react-hook-form'\n\n/**\n * `@hookform/resolvers/zod` resolves its own `zod` typings through dependency\n * hoisting, which in this monorepo lands on zod v4, while this plugin authors its\n * form schemas with zod v3. The resolver accepts v3 schema instances correctly at\n * runtime, so this thin wrapper only bridges the type-only v3/v4 mismatch. The\n * react-hook-form field types stay fully checked at the call sites.\n */\nexport default function zodFormResolver<TFieldValues extends FieldValues>(\n  schema: unknown,\n): Resolver<TFieldValues> {\n  return zodResolver(\n    schema as Parameters<typeof zodResolver>[0],\n  ) as unknown as Resolver<TFieldValues>\n}\n","import type {ImageAsset} from '../types'\n\nconst getAssetResolution = (asset: ImageAsset) => {\n  return `${asset.metadata.dimensions.width}x${asset.metadata.dimensions.height}px`\n}\n\nexport default getAssetResolution\n","import {usePortal} from '@sanity/ui'\nimport {type PopoverProps} from '@sanity/ui/popover'\n\nexport function usePortalPopoverProps(): PopoverProps {\n  const portal = usePortal()\n\n  return {\n    animate: true,\n    constrainSize: true,\n    floatingBoundary: portal.element,\n    portal: true,\n    referenceBoundary: portal.element,\n  }\n}\n","import {ClipboardIcon} from '@sanity/icons/Clipboard'\nimport {Button, Text} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport copy from 'copy-to-clipboard'\nimport {useEffect, useRef, useState} from 'react'\n\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\n\ntype Props = {\n  disabled?: boolean\n  url: string\n}\n\nconst ButtonAssetCopy = ({disabled, url}: Props) => {\n  const popoverProps = usePortalPopoverProps()\n  const refPopoverTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n  const [popoverVisible, setPopoverVisible] = useState(false)\n\n  const handleClick = () => {\n    if (refPopoverTimeout.current) {\n      clearTimeout(refPopoverTimeout.current)\n    }\n\n    setPopoverVisible(true)\n    copy(url)\n\n    refPopoverTimeout.current = setTimeout(() => {\n      setPopoverVisible(false)\n    }, 1250)\n  }\n\n  // Effects\n  useEffect(() => {\n    return () => {\n      if (refPopoverTimeout.current) {\n        clearTimeout(refPopoverTimeout.current)\n      }\n    }\n  }, [])\n\n  return (\n    <Popover\n      content={\n        <Text muted size={1}>\n          Copied!\n        </Text>\n      }\n      open={popoverVisible}\n      padding={2}\n      placement=\"top\"\n      radius={1}\n      {...popoverProps}\n    >\n      <Button\n        disabled={disabled}\n        fontSize={1}\n        icon={ClipboardIcon}\n        mode=\"ghost\"\n        onClick={handleClick}\n        text=\"Copy URL\"\n      />\n    </Popover>\n  )\n}\n\nexport default ButtonAssetCopy\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {Box, Button, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {format} from 'date-fns/format'\nimport filesize from 'filesize'\nimport {type ReactNode} from 'react'\n\nimport type {Asset, AssetItem} from '../../types'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport ButtonAssetCopy from '../ButtonAssetCopy'\n\ntype Props = {\n  asset: Asset\n  item?: AssetItem\n}\n\nconst Row = ({label, value}: {label: string; value: ReactNode}) => {\n  return (\n    <Flex justify=\"space-between\">\n      <Text\n        size={1}\n        style={{\n          opacity: 0.8,\n          width: '40%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {label}\n      </Text>\n      <Text\n        size={1}\n        style={{\n          opacity: 0.4,\n          textAlign: 'right',\n          width: '60%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {value}\n      </Text>\n    </Flex>\n  )\n}\n\nconst AssetMetadata = (props: Props) => {\n  const {asset, item} = props\n\n  const exif = asset?.metadata?.exif\n\n  // Callbacks\n  const handleDownload = () => {\n    window.location.href = `${asset.url}?dl=${asset.originalFilename}`\n  }\n\n  return (\n    <Box marginTop={3}>\n      {/* Base */}\n      <Box>\n        <Stack gap={3}>\n          <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n          <Row label=\"MIME type\" value={asset?.mimeType} />\n          <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n          {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n        </Stack>\n      </Box>\n      {/* EXIF */}\n      {exif &&\n        (exif.DateTimeOriginal ||\n          exif.FNumber ||\n          exif.FocalLength ||\n          exif.ExposureTime ||\n          exif.ISO) && (\n          <>\n            {/* Divider */}\n            <Box\n              marginY={4}\n              style={{\n                background: 'var(--card-border-color)',\n                height: '1px',\n                width: '100%',\n              }}\n            />\n            <Box>\n              <Stack gap={3}>\n                {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n                {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n                {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n                {exif.ExposureTime && (\n                  <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n                )}\n                {exif.DateTimeOriginal && (\n                  <Row\n                    label=\"Original date\"\n                    value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n                  />\n                )}\n              </Stack>\n            </Box>\n          </>\n        )}\n\n      {/* Asset actions */}\n      <Box marginTop={5}>\n        <Inline gap={2}>\n          {/* Download */}\n          <Button\n            disabled={!item || item?.updating}\n            fontSize={1}\n            icon={DownloadIcon}\n            mode=\"ghost\"\n            onClick={handleDownload}\n            text=\"Download\"\n          />\n          {/* Copy to clipboard */}\n          <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n        </Inline>\n      </Box>\n    </Box>\n  )\n}\n\nexport default AssetMetadata\n","import {Dialog as SanityDialog} from '@sanity/ui'\nimport {type ComponentProps} from 'react'\n\nconst Dialog = (props: ComponentProps<typeof SanityDialog>) => {\n  // HACK: Temporarily force fixed positioning on all @sanity/ui <Dialog /> components.\n  // The studio is currently setting absolute positioning on all root-level dialogs on the mobile breakpoint,\n  // causing unwanted scroll behaviour.\n  return <SanityDialog {...props} style={{position: 'fixed'}} />\n}\n\nexport default Dialog\n","import type {SanityDocument} from '@sanity/client'\nimport {Box, Button, Card, Stack, Text} from '@sanity/ui'\nimport {Preview, type SchemaType, useSchema} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\n\ntype Props = {\n  documents: SanityDocument[]\n  isLoading: boolean\n}\n\nconst DocumentList = ({documents, isLoading}: Props) => {\n  const schema = useSchema()\n\n  if (isLoading) {\n    return (\n      <Text muted size={1}>\n        Loading...\n      </Text>\n    )\n  }\n\n  if (documents.length === 0) {\n    return (\n      <Text muted size={1}>\n        No documents are referencing this asset\n      </Text>\n    )\n  }\n\n  return (\n    <Card flex={1} marginBottom={2} padding={2} radius={2} shadow={1}>\n      <Stack gap={2}>\n        {documents?.map((doc) => (\n          <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n        ))}\n      </Stack>\n    </Card>\n  )\n}\n\nconst ReferringDocument = (props: {doc: SanityDocument; schemaType?: SchemaType}) => {\n  const {doc, schemaType} = props\n\n  const {onClick} = useIntentLink({\n    intent: 'edit',\n    params: {id: doc._id},\n  })\n\n  return schemaType ? (\n    <Button key={doc._id} mode=\"bleed\" onClick={onClick} padding={2} style={{width: '100%'}}>\n      <Preview layout=\"default\" schemaType={schemaType} value={doc} />\n    </Button>\n  ) : (\n    <Box padding={2}>\n      <Text size={1}>\n        A document of the unknown type <em>{doc._type}</em>\n      </Text>\n    </Box>\n  )\n}\n\nexport default DocumentList\n","import {Box, Flex, type Theme} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {defaultStyles, FileIcon as ReactFileIcon} from 'react-file-icon'\nimport type {DefaultExtensionType} from 'react-file-icon'\nimport {styled, css} from 'styled-components'\n\ntype Props = {\n  extension?: string\n  onClick?: (e: MouseEvent) => void\n  width: string\n}\n\n// Force react-file-icon styles\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled(Box)(({theme}: {theme: Theme}) => {\n  return css`\n    text {\n      font-family: ${\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.fonts.text.family\n      } !important;\n      font-size: 8px !important;\n      font-weight: 500 !important;\n    }\n  `\n})\n\nconst FileIcon = (props: Props) => {\n  const {extension, onClick, width} = props\n\n  return (\n    <Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n      <Container style={{width}}>\n        {extension ? (\n          <ReactFileIcon\n            extension={extension}\n            {...defaultStyles[extension as DefaultExtensionType]}\n          />\n        ) : (\n          <ReactFileIcon />\n        )}\n      </Container>\n    </Flex>\n  )\n}\n\nexport default FileIcon\n","import {Flex} from '@sanity/ui'\n\nimport type {Asset} from '../../types'\nimport FileIcon from '../FileIcon'\n\ntype Props = {\n  asset: Asset\n}\n\nconst FileAssetPreview = (props: Props) => {\n  const {asset} = props\n\n  if (asset.mimeType.search('audio') === 0) {\n    return (\n      <Flex align=\"center\" justify=\"center\" style={{height: '100%'}}>\n        <audio controls src={asset.url} style={{width: '100%'}} />\n      </Flex>\n    )\n  }\n\n  if (asset.mimeType.search('video') === 0) {\n    return (\n      <video\n        controls\n        src={asset.url}\n        style={{\n          height: '100%',\n          width: '100%',\n        }}\n      />\n    )\n  }\n\n  return <FileIcon extension={asset.extension} width=\"50%\" />\n}\n\nexport default FileAssetPreview\n","import {Box, Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {format} from 'date-fns/format'\nimport {type ReactNode} from 'react'\n\ntype Props = {\n  disabled: boolean\n  isValid: boolean\n  lastUpdated?: string\n  onClick: () => void\n}\n\nconst FormSubmitButton = (props: Props) => {\n  const {disabled, isValid, lastUpdated, onClick} = props\n\n  let content: ReactNode\n  if (isValid) {\n    if (lastUpdated) {\n      content = (\n        <>\n          Last updated\n          <br /> {format(new Date(lastUpdated), 'PPp')}\n        </>\n      )\n    } else {\n      content = 'No unpublished changes'\n    }\n  } else {\n    content =\n      'There are validation errors that need to be fixed before this document can be published'\n  }\n\n  return (\n    <Tooltip\n      animate\n      content={\n        <Box padding={3} style={{maxWidth: '185px'}}>\n          <Text muted size={1}>\n            {content}\n          </Text>\n        </Box>\n      }\n      disabled={'ontouchstart' in window}\n      placement=\"top\"\n      portal\n    >\n      <Box>\n        <Button\n          disabled={disabled}\n          fontSize={1}\n          onClick={onClick}\n          text=\"Save and close\"\n          tone=\"primary\"\n        />\n      </Box>\n    </Tooltip>\n  )\n}\n\nexport default FormSubmitButton\n","import {hues} from '@sanity/color'\nimport {type ThemeColorSchemeKey, studioTheme} from '@sanity/ui'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {color: themeColor} = studioTheme\n\nconst SCHEME_COLORS = {\n  bg: {\n    dark: hues.gray[950].hex,\n    light: hues.gray[50].hex,\n  },\n  bg2: {\n    dark: hues.gray[900].hex,\n    light: hues.gray[100].hex,\n  },\n  inputEnabledBorder: {\n    dark: themeColor.dark.default.input.default.enabled.border,\n    light: themeColor.light.default.input.default.enabled.border,\n  },\n  inputHoveredBorder: {\n    dark: themeColor.dark.default.input.default.hovered.border,\n    light: themeColor.light.default.input.default.hovered.border,\n  },\n  mutedHoveredBg: {\n    dark: themeColor.dark.primary.muted.primary.hovered.bg,\n    light: themeColor.light.primary.muted.primary.hovered.bg,\n  },\n  mutedHoveredFg: {\n    dark: themeColor.dark.primary.muted.primary.hovered.fg,\n    light: themeColor.light.primary.muted.primary.hovered.fg,\n  },\n  mutedSelectedBg: {\n    dark: themeColor.dark.primary.muted.primary.selected.bg,\n    light: themeColor.light.primary.muted.primary.selected.bg,\n  },\n  spotBlue: {\n    dark: themeColor.dark.primary.spot.blue,\n    light: themeColor.light.primary.spot.blue,\n  },\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n  return SCHEME_COLORS[colorKey]?.[scheme]\n}\n","import type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport type {MouseEvent} from 'react'\nimport {styled, css} from 'styled-components'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  onClick?: (e: MouseEvent) => void\n  $showCheckerboard?: boolean\n  $scheme?: ThemeColorSchemeKey\n  src: string\n  style?: any\n}\n\nconst Image = styled.img.attrs({crossOrigin: 'anonymous' as const})<Props>`\n  --checkerboard-color: ${(props) =>\n    props.$scheme ? getSchemeColor(props.$scheme, 'bg2') : 'inherit'};\n\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: contain;\n\n  ${(props) =>\n    props.$showCheckerboard &&\n    css`\n      background-image:\n        linear-gradient(45deg, var(--checkerboard-color) 25%, transparent 25%),\n        linear-gradient(-45deg, var(--checkerboard-color) 25%, transparent 25%),\n        linear-gradient(45deg, transparent 75%, var(--checkerboard-color) 75%),\n        linear-gradient(-45deg, transparent 75%, var(--checkerboard-color) 75%);\n      background-size: 20px 20px;\n      background-position:\n        0 0,\n        0 10px,\n        10px -10px,\n        -10px 0;\n    `}\n`\n\nexport default Image\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {styled} from 'styled-components'\n\ntype Props = {\n  description?: string\n  error?: string\n  label: string\n  name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n  return {\n    // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n    color: theme.sanity.color.spot.red,\n  }\n})\n\nconst FormFieldInputLabel = (props: Props) => {\n  const {description, error, label, name} = props\n\n  return (\n    <>\n      {/* Label */}\n      <Box marginY={3}>\n        <Inline gap={2}>\n          <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n            {label}\n          </Text>\n\n          {/* Error icon + tooltip */}\n          {error && (\n            <Text size={1}>\n              <Tooltip\n                animate\n                content={\n                  <Box padding={2}>\n                    <Text muted size={1}>\n                      <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n                      {error}\n                    </Text>\n                  </Box>\n                }\n                fallbackPlacements={['top', 'left']}\n                placement=\"right\"\n                portal\n              >\n                <StyledErrorOutlineIcon />\n              </Tooltip>\n            </Text>\n          )}\n        </Inline>\n      </Box>\n\n      {/* Description */}\n      {description && (\n        <Box marginY={3}>\n          <Text as=\"label\" htmlFor={name} muted size={1}>\n            {description}\n          </Text>\n        </Box>\n      )}\n    </>\n  )\n}\n\nexport default FormFieldInputLabel\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, Flex, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {radius: themeRadius, space: themeSpace} = studioTheme\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n  return {\n    control: (styles, {isFocused}) => {\n      let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n      if (isFocused) {\n        boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n        0 0 0 1px var(--card-bg-color),\n        0 0 0 3px var(--card-focus-ring-color) !important`\n      }\n\n      return {\n        ...styles,\n        'backgroundColor': 'var(--card-bg-color)',\n        'color': 'inherit',\n        'border': 'none',\n        'borderRadius': themeRadius[1],\n        boxShadow,\n        'margin': 0,\n        'minHeight': '35px',\n        'outline': 'none',\n        'padding': rem(themeSpace[1]!),\n        'transition': 'none',\n        '&:hover': {\n          boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n        },\n      }\n    },\n    indicatorsContainer: (styles, {isDisabled}) => ({\n      ...styles,\n      opacity: isDisabled ? 0.25 : 1,\n    }),\n    input: (styles) => ({\n      ...styles,\n      color: 'var(--card-fg-color)',\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    menuList: (styles) => ({\n      ...styles,\n    }),\n    multiValue: (styles, {isDisabled}) => ({\n      ...styles,\n      backgroundColor: getSchemeColor(scheme, 'mutedHoveredBg'),\n      borderRadius: themeRadius[2],\n      opacity: isDisabled ? 0.5 : 1,\n    }),\n    multiValueLabel: () => ({\n      color: getSchemeColor(scheme, 'mutedHoveredFg'),\n      fontSize: 'inherit',\n      padding: 0,\n    }),\n    multiValueRemove: (styles) => ({\n      ...styles,\n      'borderTopLeftRadius': 0,\n      'borderBottomLeftRadius': 0,\n      'svg': {color: getSchemeColor(scheme, 'mutedHoveredFg')},\n      '&:hover': {\n        backgroundColor: getSchemeColor(scheme, 'mutedSelectedBg'),\n      },\n    }),\n    noOptionsMessage: (styles) => ({\n      ...styles,\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      lineHeight: '1em',\n    }),\n    option: (styles, {isFocused}) => ({\n      ...styles,\n      'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n      'borderRadius': themeRadius[2],\n      'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n      'padding': `${rem(themeSpace[1]!)} ${rem(themeSpace[2]!)}`,\n      '&:hover': {\n        backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n        color: getSchemeColor(scheme, 'bg'),\n      },\n    }),\n    placeholder: (styles) => ({\n      ...styles,\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    valueContainer: (styles) => ({\n      ...styles,\n      margin: 0,\n      padding: 0,\n    }),\n  }\n}\n\nconst DropdownIndicator = (props: any) => {\n  return (\n    <components.DropdownIndicator {...props}>\n      <Box paddingX={2}>\n        <Text size={1}>\n          <ChevronDownIcon />\n        </Text>\n      </Box>\n    </components.DropdownIndicator>\n  )\n}\n\nconst Menu = (props: any) => {\n  return (\n    <components.Menu {...props}>\n      <Card radius={1} shadow={2}>\n        {props.children}\n      </Card>\n    </components.Menu>\n  )\n}\n\nconst MenuList = (props: any) => {\n  const {children} = props\n\n  const MAX_ROWS = 5\n  const OPTION_HEIGHT = 37\n\n  if (Array.isArray(children)) {\n    const height =\n      children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n    return (\n      <Virtuoso\n        className=\"media__custom-scrollbar\"\n        itemContent={(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }}\n        style={{height}}\n        totalCount={children.length}\n      />\n    )\n  }\n  return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst MultiValueLabel = (props: any) => {\n  return (\n    <Box padding={2} paddingRight={1}>\n      <Text size={1} weight=\"medium\">\n        <components.MultiValueLabel {...props} />\n      </Text>\n    </Box>\n  )\n}\n\nconst MultiValueRemove = (props: any) => {\n  return (\n    <components.MultiValueRemove {...props}>\n      <CloseIcon color=\"#1f2123\" />\n    </components.MultiValueRemove>\n  )\n}\n\nconst Option = (props: any) => {\n  return (\n    <Box paddingX={1} paddingY={1}>\n      <components.Option {...props}>\n        <Flex align=\"center\">\n          {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n          {props.children}\n        </Flex>\n      </components.Option>\n    </Box>\n  )\n}\n\nexport const reactSelectComponents = {\n  DropdownIndicator,\n  IndicatorSeparator: null,\n  Menu,\n  MenuList,\n  MultiValueLabel,\n  MultiValueRemove,\n  Option,\n}\n","import {Box} from '@sanity/ui'\nimport {Controller} from 'react-hook-form'\nimport CreatableSelect from 'react-select/creatable'\nimport {useColorSchemeValue} from 'sanity'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/creatable'\nimport type {TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n  control: any\n  description?: string\n  disabled?: boolean\n  error?: string\n  label: string\n  name: string\n  onCreateTag: (tagName: string) => void\n  options: {\n    label: string\n    value: string\n  }[]\n  placeholder?: string\n  value?: TagSelectOption[] | null\n}\n\nconst FormFieldInputTags = (props: Props) => {\n  const {\n    control,\n    description,\n    disabled,\n    error,\n    label,\n    name,\n    onCreateTag,\n    options,\n    placeholder,\n    value,\n  } = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const creating = useTypedSelector((state) => state.tags.creating)\n  const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n  return (\n    <Box\n      // HACK: force stacking context to ensure react-select dropdown sits above other fields\n      style={{zIndex: 2}}\n    >\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n      {/* Select */}\n      <Controller\n        control={control}\n        defaultValue={value}\n        name={name}\n        render={({field}) => {\n          const {onBlur, onChange, value: controllerValue} = field\n          // TODO: investigate overriding `onChange` and updating form state manually.\n          // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n          // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n          // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n          //\n          // To illustrate this issue:\n          // - Edit an asset with no tags\n          // - Add a new tag (either an existing one, or create one inline)\n          // - Remove the tag you've just created\n          //\n          // At this point, the form will still be marked as dirty when it shouldnt be\n          return (\n            <CreatableSelect\n              components={reactSelectComponents}\n              instanceId=\"tags\"\n              isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n              isDisabled={creating || disabled || tagsFetching}\n              isLoading={creating}\n              isMulti\n              name={name}\n              noOptionsMessage={() => 'No tags'}\n              onBlur={onBlur}\n              onChange={onChange}\n              onCreateOption={onCreateTag}\n              options={options}\n              placeholder={tagsFetching ? 'Loading...' : placeholder}\n              styles={reactSelectStyles(scheme)}\n              value={controllerValue}\n            />\n          )\n        }}\n      />\n    </Box>\n  )\n}\n\nexport default FormFieldInputTags\n","import {Box, TextInput} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n  description?: string\n  disabled?: boolean\n  error?: string\n  label: string\n  name: string\n  onBlur?: FocusEventHandler<HTMLInputElement>\n  onChange?: ChangeEventHandler<HTMLInputElement>\n  placeholder?: string\n  value?: string\n  ref?: Ref<HTMLInputElement>\n}\n\nconst FormFieldInputText = (props: Props) => {\n  const {\n    description,\n    disabled,\n    error,\n    label,\n    name,\n    onBlur,\n    onChange,\n    placeholder,\n    value,\n    ref,\n    ...rest\n  } = props\n\n  return (\n    <Box>\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n      {/* Input */}\n      <TextInput\n        {...rest}\n        autoComplete=\"off\"\n        autoFocus\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n      />\n    </Box>\n  )\n}\n\nexport default FormFieldInputText\n","import {Box, TextArea} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n  description?: string\n  disabled?: boolean\n  error?: string\n  label: string\n  name: string\n  onBlur?: FocusEventHandler<HTMLTextAreaElement>\n  onChange?: ChangeEventHandler<HTMLTextAreaElement>\n  placeholder?: string\n  rows?: number\n  value?: string\n  ref?: Ref<HTMLTextAreaElement>\n}\n\nconst FormFieldInputTextarea = (props: Props) => {\n  const {\n    description,\n    disabled,\n    error,\n    label,\n    name,\n    onBlur,\n    onChange,\n    placeholder,\n    rows,\n    value,\n    ref,\n    ...rest\n  } = props\n\n  return (\n    <Box>\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n      {/* Input */}\n      <TextArea\n        {...rest}\n        autoComplete=\"off\"\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n        rows={rows}\n      />\n    </Box>\n  )\n}\n\nexport default FormFieldInputTextarea\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type Control, type FieldErrors, type UseFormRegister} from 'react-hook-form'\n\nimport type {Asset, AssetFormData, Locale, TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\nimport FormFieldInputTags from '../FormFieldInputTags'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormFieldInputTextarea from '../FormFieldInputTextarea'\n\ntype LocalizedErrors = Record<string, {message?: string} | undefined>\n\n// When locales are not configured, extract a plain string from a potentially localized field\nfunction toStringField(value: unknown): string | undefined {\n  if (typeof value === 'string') return value\n  if (typeof value === 'object' && value !== null) {\n    const found = Object.values(value as Record<string, string>).find((v) => v)\n    return found || undefined\n  }\n  return undefined\n}\n\nfunction truncateFolderPath(path?: string): string | undefined {\n  const segments = path?.split('/').filter(Boolean)\n  if (!segments || segments.length <= 3) return path\n  return [segments[0], '...', ...segments.slice(-2)].join('/')\n}\n\nexport type DetailsProps = {\n  formUpdating: boolean\n  handleCreateTag: (title: string) => void\n  control: Control<AssetFormData>\n  errors: FieldErrors<AssetFormData>\n  register: UseFormRegister<AssetFormData>\n  allTagOptions: TagSelectOption[]\n  assetTagOptions: TagSelectOption[] | null\n  currentAsset: Asset\n  folderPath?: string\n  folderMissing?: boolean\n  onChangeFolder: () => void\n  onRemoveFolder: () => void\n  creditLine?: {\n    enabled: boolean\n    excludeSources?: string | string[] | undefined\n  }\n  locales?: Locale[]\n}\n\nexport default function Details({\n  formUpdating,\n  handleCreateTag,\n  control,\n  errors,\n  register,\n  allTagOptions,\n  assetTagOptions,\n  currentAsset,\n  folderPath,\n  folderMissing,\n  onChangeFolder,\n  onRemoveFolder,\n  creditLine,\n  locales,\n}: DetailsProps) {\n  'use no memo'\n  // React Compiler memoizes the register() field JSX using asset-derived deps only.\n  // That can leave Save stuck disabled while the DOM still updates (uncontrolled inputs).\n  // Tags work because they use Controller; string fields use register and need this opt-out.\n\n  const hasLocales = locales && locales.length > 0\n  const [activeLocaleTab, setActiveLocaleTab] = useState(0)\n  const folderId = currentAsset?.opt?.media?.folder?._ref\n  const folderLabel =\n    truncateFolderPath(folderPath) || (folderMissing ? 'Folder no longer exists' : 'No folder')\n\n  return (\n    <Stack gap={3}>\n      {/* Tags */}\n      <FormFieldInputTags\n        control={control}\n        disabled={formUpdating}\n        error={errors?.opt?.media?.tags?.message}\n        label=\"Tags\"\n        name=\"opt.media.tags\"\n        onCreateTag={handleCreateTag}\n        options={allTagOptions}\n        placeholder=\"Select or create...\"\n        value={assetTagOptions}\n      />\n      {/* Folder */}\n      <Box>\n        <FormFieldInputLabel label=\"Folder\" name=\"folder\" />\n        <Card border padding={2} radius={2}>\n          <Flex align=\"center\" gap={3} justify=\"space-between\">\n            <Flex\n              align=\"center\"\n              gap={2}\n              flex={1}\n              style={{minWidth: 0, overflowX: 'auto', whiteSpace: 'nowrap', overflowY: 'hidden'}}\n            >\n              <FolderIcon />\n              <Text muted={!folderId} size={1}>\n                {folderLabel}\n              </Text>\n            </Flex>\n            {folderId && (\n              <Button\n                aria-label=\"Remove from folder\"\n                disabled={formUpdating}\n                fontSize={1}\n                icon={TrashIcon}\n                mode=\"bleed\"\n                onClick={onRemoveFolder}\n                padding={2}\n                tone=\"critical\"\n                type=\"button\"\n              />\n            )}\n            <Button\n              padding={2}\n              disabled={formUpdating}\n              fontSize={1}\n              mode=\"ghost\"\n              onClick={onChangeFolder}\n              text={folderId ? 'Change folder' : 'Add to folder'}\n              type=\"button\"\n            />\n          </Flex>\n        </Card>\n      </Box>\n      {/* Filename */}\n      <FormFieldInputText\n        {...register('originalFilename')}\n        disabled={formUpdating}\n        error={errors?.originalFilename?.message}\n        label=\"Filename\"\n        name=\"originalFilename\"\n        value={currentAsset?.originalFilename}\n      />\n      {/* Localized fields grouped by language */}\n      {hasLocales ? (\n        <Card marginTop={2} shadow={1} padding={3} radius={1}>\n          <Stack gap={2}>\n            <TabList gap={2}>\n              {locales.map((locale, idx) => (\n                <Tab\n                  key={locale.id}\n                  id={`locale-tab-${locale.id}`}\n                  aria-controls={`locale-panel-${locale.id}`}\n                  selected={activeLocaleTab === idx}\n                  onClick={() => setActiveLocaleTab(idx)}\n                  label={locale.title}\n                />\n              ))}\n            </TabList>\n            {locales.map((locale, idx) => (\n              <TabPanel\n                key={locale.id}\n                id={`locale-panel-${locale.id}`}\n                aria-labelledby={`locale-tab-${locale.id}`}\n                hidden={activeLocaleTab !== idx}\n              >\n                <Stack gap={3}>\n                  <FormFieldInputText\n                    {...register(`title.${locale.id}` as const)}\n                    disabled={formUpdating}\n                    error={(errors?.title as LocalizedErrors)?.[locale.id]?.message}\n                    label=\"Title\"\n                    name={`title.${locale.id}`}\n                  />\n                  <FormFieldInputText\n                    {...register(`altText.${locale.id}` as const)}\n                    disabled={formUpdating}\n                    error={(errors?.altText as LocalizedErrors)?.[locale.id]?.message}\n                    label=\"Alt Text\"\n                    name={`altText.${locale.id}`}\n                  />\n                  <FormFieldInputTextarea\n                    {...register(`description.${locale.id}` as const)}\n                    disabled={formUpdating}\n                    error={(errors?.description as LocalizedErrors)?.[locale.id]?.message}\n                    label=\"Description\"\n                    name={`description.${locale.id}`}\n                    rows={5}\n                  />\n                  {creditLine?.enabled && (\n                    <FormFieldInputText\n                      {...register(`creditLine.${locale.id}` as const)}\n                      error={(errors?.creditLine as LocalizedErrors)?.[locale.id]?.message}\n                      label=\"Credit\"\n                      name={`creditLine.${locale.id}`}\n                      disabled={\n                        formUpdating ||\n                        creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n                      }\n                    />\n                  )}\n                </Stack>\n              </TabPanel>\n            ))}\n          </Stack>\n        </Card>\n      ) : (\n        <>\n          <FormFieldInputText\n            {...register('title')}\n            disabled={formUpdating}\n            error={errors?.title?.message}\n            label=\"Title\"\n            name=\"title\"\n            value={toStringField(currentAsset?.title)}\n          />\n          <FormFieldInputText\n            {...register('altText')}\n            disabled={formUpdating}\n            error={errors?.altText?.message}\n            label=\"Alt Text\"\n            name=\"altText\"\n            value={toStringField(currentAsset?.altText)}\n          />\n          <FormFieldInputTextarea\n            {...register('description')}\n            disabled={formUpdating}\n            error={errors?.description?.message}\n            label=\"Description\"\n            name=\"description\"\n            rows={5}\n          />\n          {creditLine?.enabled && (\n            <FormFieldInputText\n              {...register('creditLine')}\n              error={errors?.creditLine?.message}\n              label=\"Credit\"\n              name=\"creditLine\"\n              value={toStringField(currentAsset?.creditLine)}\n              disabled={\n                formUpdating || creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n              }\n            />\n          )}\n        </>\n      )}\n    </Stack>\n  )\n}\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {type SubmitHandler, useForm, useFormState} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue, useDocumentStore} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {getAssetFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {selectFolderPathById} from '../../modules/folders'\nimport {selectTags, selectTagSelectOptions, tagsActions} from '../../modules/tags'\nimport type {Asset, AssetFormData, DialogAssetEditProps, TagSelectOption} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport AssetMetadata from '../AssetMetadata'\nimport Dialog from '../Dialog'\nimport DocumentList from '../DocumentList'\nimport FileAssetPreview from '../FileAssetPreview'\nimport FormSubmitButton from '../FormSubmitButton'\nimport Image from '../Image'\nimport Details, {type DetailsProps} from './Details'\n\nfunction renderDefaultDetails(props: DetailsProps) {\n  return <Details {...props} />\n}\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogAssetEditProps\n}\n\nconst DialogAssetEdit = (props: Props) => {\n  const {\n    children,\n    dialog: {assetId, id, lastCreatedTag, lastRemovedTagIds},\n  } = props\n\n  const client = useVersionedClient()\n  const scheme = useColorSchemeValue()\n\n  const documentStore = useDocumentStore()\n\n  const dispatch = useDispatch()\n  const assetItem = useTypedSelector((state) => selectAssetById(state, String(assetId))) // TODO: check casting\n  const tags = useTypedSelector(selectTags)\n\n  const assetUpdatedPrev = useRef<string | undefined>(undefined)\n\n  // Generate a snapshot of the current asset\n  const [assetSnapshot, setAssetSnapshot] = useState(assetItem?.asset)\n  const [tabSection, setTabSection] = useState<'details' | 'references'>('details')\n\n  const currentAsset = assetItem ? assetItem?.asset : assetSnapshot\n  const allTagOptions = getTagSelectOptions(tags)\n\n  const assetTagOptions = useTypedSelector(selectTagSelectOptions(currentAsset))\n  const currentFolderId = currentAsset?.opt?.media?.folder?._ref ?? null\n  const currentFolderPath = useTypedSelector((state) =>\n    selectFolderPathById(state, currentFolderId),\n  )\n\n  // Check if credit line options are configured\n  const {creditLine, components: {details: CustomDetails} = {}, locales} = useToolOptions()\n\n  const generateDefaultValues = useCallback(\n    (asset?: Asset): AssetFormData => {\n      let imageDescription: string | undefined\n      if (asset && isImageAsset(asset)) {\n        const raw = asset.metadata?.image?.['ImageDescription']\n        if (typeof raw === 'string') {\n          imageDescription = raw\n        }\n      }\n\n      if (locales && locales.length > 0) {\n        const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n          const obj: Record<string, string> = {}\n          for (let i = 0; i < locales.length; i++) {\n            const locale = locales[i]!\n            // Prefer key presence over truthiness so an intentional empty string\n            // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n            if (typeof field === 'object' && field && locale.id in field) {\n              obj[locale.id] = field[locale.id] ?? ''\n            } else if (typeof field === 'string') {\n              // Only populate the first locale to avoid spreading a legacy value\n              // across all languages; the user should fill in other translations manually\n              obj[locale.id] = i === 0 ? field : ''\n            } else if (typeof field === 'object' && field) {\n              // Localized object present but this locale key is missing: leave empty.\n              // Do not apply EXIF fallback to partial translations.\n              obj[locale.id] = ''\n            } else {\n              // No description set at all — EXIF fallback only for the first locale.\n              obj[locale.id] = i === 0 ? fallback : ''\n            }\n          }\n          return obj\n        }\n        return {\n          altText: makeLocaleObj(asset?.altText),\n          creditLine: makeLocaleObj(asset?.creditLine),\n          description: makeLocaleObj(asset?.description, imageDescription),\n          originalFilename: asset?.originalFilename || '',\n          opt: {media: {tags: assetTagOptions}},\n          title: makeLocaleObj(asset?.title),\n        }\n      }\n      // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n      const flattenField = (field: unknown, fallback = ''): string => {\n        if (typeof field === 'string') return field\n        if (typeof field === 'object' && field !== null) {\n          const values = Object.values(field as Record<string, string>)\n          return values.find((v) => v) || fallback\n        }\n        return fallback\n      }\n      return {\n        altText: flattenField(asset?.altText),\n        creditLine: flattenField(asset?.creditLine),\n        description: flattenField(asset?.description, imageDescription),\n        originalFilename: asset?.originalFilename || '',\n        opt: {media: {tags: assetTagOptions}},\n        title: flattenField(asset?.title),\n      }\n    },\n    [assetTagOptions, locales],\n  )\n\n  const {control, getValues, handleSubmit, register, reset, setValue} = useForm<AssetFormData>({\n    defaultValues: generateDefaultValues(assetItem?.asset),\n    mode: 'onChange',\n    resolver: zodFormResolver<AssetFormData>(getAssetFormSchema(locales)),\n  })\n\n  // Subscribe via useFormState so React Compiler cannot skip formState Proxy reads\n  // that gate the Save button (isDirty / isValid).\n  const {errors, isDirty, isValid} = useFormState({control})\n\n  const formUpdating = !assetItem || assetItem?.updating\n\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.remove({id}))\n  }, [dispatch, id])\n\n  const handleDelete = useCallback(() => {\n    if (!assetItem?.asset) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteAssets({\n        assets: [assetItem],\n        closeDialogId: assetItem?.asset._id,\n      }),\n    )\n  }, [assetItem, dispatch])\n\n  const handleAssetUpdate = useCallback((update: MutationEvent) => {\n    const {result, transition} = update\n    if (result && transition === 'update') {\n      // Regenerate asset snapshot\n      setAssetSnapshot(result as Asset)\n    }\n  }, [])\n\n  const handleCreateTag = useCallback(\n    (tagName: string) => {\n      // Dispatch action to create new tag\n      dispatch(\n        tagsActions.createRequest({\n          assetId: currentAsset?._id,\n          name: tagName,\n        }),\n      )\n    },\n    [currentAsset?._id, dispatch],\n  )\n\n  const handleChangeFolder = useCallback(() => {\n    if (!assetItem) {\n      return\n    }\n\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n  }, [assetItem, currentFolderId, dispatch])\n\n  const handleRemoveFolder = useCallback(() => {\n    if (!assetItem || !currentFolderId) {\n      return\n    }\n\n    dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n  }, [assetItem, currentFolderId, dispatch])\n\n  // Detect if asset has localized fields (objects) with keys not in the configured locales\n  const hasOrphanedLocales = useMemo(() => {\n    if (!currentAsset) return false\n    const isLocaleObj = (v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)\n    const fields = [\n      currentAsset.title,\n      currentAsset.altText,\n      currentAsset.description,\n      ...(currentAsset._type === 'sanity.imageAsset' ? [currentAsset.creditLine] : []),\n    ]\n    const anyLocalized = fields.some((f) => isLocaleObj(f))\n    if (!anyLocalized) return false\n    if (!locales || locales.length === 0) return true\n    const configuredIds = new Set(locales.map((l) => l.id))\n    return fields.some((f) => {\n      if (!isLocaleObj(f)) return false\n      return Object.keys(f as object).some((k) => !configuredIds.has(k))\n    })\n  }, [currentAsset, locales])\n\n  const handleCleanupLocales = useCallback(async () => {\n    if (!currentAsset) return\n\n    const cleanField = (field: unknown): unknown => {\n      if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n      const obj = field as Record<string, string>\n      if (!locales || locales.length === 0) {\n        // Pick the first non-empty value sorted by key for determinism\n        const sorted = Object.keys(obj).sort()\n        return sorted.map((k) => obj[k]).find((v) => v) || ''\n      }\n      const configuredIds = new Set(locales.map((l) => l.id))\n      const cleaned: Record<string, string> = {}\n      for (const [key, val] of Object.entries(obj)) {\n        if (configuredIds.has(key)) cleaned[key] = val\n      }\n      return cleaned\n    }\n\n    await client\n      .patch(currentAsset._id)\n      .set({\n        title: cleanField(currentAsset.title),\n        altText: cleanField(currentAsset.altText),\n        description: cleanField(currentAsset.description),\n        ...(currentAsset._type === 'sanity.imageAsset' && {\n          creditLine: cleanField(currentAsset.creditLine),\n        }),\n      })\n      .commit()\n  }, [client, currentAsset, locales])\n\n  // Submit react-hook-form\n  const onSubmit: SubmitHandler<AssetFormData> = useCallback(\n    (formData) => {\n      if (!assetItem?.asset) {\n        return\n      }\n\n      const sanitizedFormData = sanitizeFormData(formData)\n\n      // Keep an intentionally cleared description as '' (not null) so the EXIF\n      // ImageDescription fallback does not refill it the next time the dialog opens.\n      if (formData.description === '') {\n        sanitizedFormData['description'] = ''\n      }\n\n      dispatch(\n        assetsActions.updateRequest({\n          asset: assetItem?.asset,\n          closeDialogId: assetItem?.asset._id,\n          formData: {\n            ...sanitizedFormData,\n            // Map tags to sanity references\n            opt: {\n              media: {\n                ...sanitizedFormData['opt'].media,\n                tags:\n                  sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n                    _ref: tag.value,\n                    _type: 'reference',\n                    _weak: true,\n                  })) || null,\n                // Preserve the folder reference — it is managed separately and must\n                // not be wiped when patching opt.media via .set().\n                ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n              },\n            },\n          },\n        }),\n      )\n    },\n    [assetItem?.asset, currentAsset, dispatch],\n  )\n\n  // Listen for asset mutations and update snapshot\n  useEffect(() => {\n    if (!assetItem?.asset) {\n      return undefined\n    }\n\n    // Remember that Sanity listeners ignore joins, order clauses and projections\n    const subscriptionAsset = client\n      .listen(groq`*[_id == $id]`, {id: assetItem?.asset._id})\n      .subscribe(handleAssetUpdate)\n\n    return () => {\n      subscriptionAsset?.unsubscribe()\n    }\n  }, [assetItem?.asset, client, handleAssetUpdate])\n\n  // Update tags form field (react-select) when a new _inline_ tag has been created\n  useEffect(() => {\n    if (lastCreatedTag) {\n      const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n      const updatedTags = existingTags.concat([lastCreatedTag])\n      setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n    }\n  }, [getValues, lastCreatedTag, setValue])\n\n  // Update tags form field (react-select) when an _inline_ tag has been removed elsewhere\n  useEffect(() => {\n    if (lastRemovedTagIds) {\n      const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n      const updatedTags = existingTags.filter((tag) => {\n        return !lastRemovedTagIds.includes(tag.value)\n      })\n\n      setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n    }\n  }, [getValues, lastRemovedTagIds, setValue])\n\n  // Reset react-hook-form local state on mount and every time the asset has been updated elsewhere\n  useEffect(() => {\n    if (assetUpdatedPrev.current !== assetItem?.asset._updatedAt) {\n      reset(generateDefaultValues(assetItem?.asset))\n    }\n    assetUpdatedPrev.current = assetItem?.asset._updatedAt\n  }, [assetItem?.asset, generateDefaultValues, reset])\n\n  const footer = (\n    <Box padding={3}>\n      <Stack gap={3}>\n        {hasOrphanedLocales && (\n          <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n            <Flex align=\"center\" justify=\"space-between\" gap={3}>\n              <Text size={1}>\n                This asset has localized fields that are no longer configured. Clean them up to\n                avoid validation errors.\n              </Text>\n              <Button\n                fontSize={1}\n                mode=\"ghost\"\n                onClick={handleCleanupLocales}\n                text=\"Cleanup localized fields\"\n                tone=\"caution\"\n              />\n            </Flex>\n          </Card>\n        )}\n        <Flex justify=\"space-between\">\n          {/* Delete button */}\n          <Button\n            disabled={formUpdating}\n            fontSize={1}\n            mode=\"bleed\"\n            onClick={handleDelete}\n            text=\"Delete\"\n            tone=\"critical\"\n          />\n\n          {/* Submit button */}\n          <FormSubmitButton\n            disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n            isValid={isValid}\n            lastUpdated={currentAsset?._updatedAt}\n            onClick={handleSubmit(onSubmit)}\n          />\n        </Flex>\n      </Stack>\n    </Box>\n  )\n\n  if (!currentAsset) {\n    return null\n  }\n\n  const detailsProps = {\n    control,\n    errors,\n    formUpdating,\n    register,\n    setValue,\n    assetTagOptions,\n    allTagOptions,\n    handleCreateTag,\n    currentAsset,\n    folderPath: currentFolderPath,\n    folderMissing: !!currentFolderId && !currentFolderPath,\n    onChangeFolder: handleChangeFolder,\n    onRemoveFolder: handleRemoveFolder,\n    creditLine,\n    locales,\n  }\n\n  return (\n    <Dialog animate footer={footer} header=\"Asset details\" id={id} onClose={handleClose} width={3}>\n      {/*\n        We reverse direction to ensure the download button doesn't appear (in the DOM) before other tabbable items.\n        This ensures that the dialog doesn't scroll down to the download button (which on smaller screens, can sometimes\n        be below the fold).\n      */}\n      <Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n        <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n          <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n            // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n            documentStore={documentStore}\n            id={currentAsset._id}\n          >\n            {({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList gap={2}>\n                    <Tab\n                      aria-controls=\"details-panel\"\n                      disabled={formUpdating}\n                      id=\"details-tab\"\n                      label=\"Details\"\n                      onClick={() => setTabSection('details')}\n                      selected={tabSection === 'details'}\n                      size={2}\n                    />\n                    <Tab\n                      aria-controls=\"references-panel\"\n                      disabled={formUpdating}\n                      id=\"references-tab\"\n                      label={`References${\n                        !isLoading && Array.isArray(uniqueReferringDocuments)\n                          ? ` (${uniqueReferringDocuments.length})`\n                          : ''\n                      }`}\n                      onClick={() => setTabSection('references')}\n                      selected={tabSection === 'references'}\n                      size={2}\n                    />\n                  </TabList>\n\n                  {/* Form fields */}\n                  <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n                    {/* Deleted notification */}\n                    {!assetItem && (\n                      <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n                        <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n                      </Card>\n                    )}\n\n                    {/* Hidden button to enable enter key submissions */}\n                    <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n                    {/* Panel: details */}\n                    <TabPanel\n                      aria-labelledby=\"details\"\n                      hidden={tabSection !== 'details'}\n                      id=\"details-panel\"\n                    >\n                      {CustomDetails ? (\n                        <CustomDetails\n                          {...detailsProps}\n                          renderDefaultDetails={renderDefaultDetails}\n                        />\n                      ) : (\n                        <Details {...detailsProps} />\n                      )}\n                    </TabPanel>\n\n                    {/* Panel: References */}\n                    <TabPanel\n                      aria-labelledby=\"references\"\n                      hidden={tabSection !== 'references'}\n                      id=\"references-panel\"\n                    >\n                      <Box marginTop={5}>\n                        {assetItem?.asset && (\n                          <DocumentList\n                            documents={uniqueReferringDocuments}\n                            isLoading={isLoading}\n                          />\n                        )}\n                      </Box>\n                    </TabPanel>\n                  </Box>\n                </>\n              )\n            }}\n          </WithReferringDocuments>\n        </Box>\n\n        <Box flex={1} padding={4}>\n          <Box style={{aspectRatio: '1'}}>\n            {/* File */}\n            {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n            {/* Image */}\n            {isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )}\n          </Box>\n\n          {/* Metadata */}\n          {currentAsset && (\n            <Box marginTop={4}>\n              <AssetMetadata asset={currentAsset} item={assetItem} />\n            </Box>\n          )}\n        </Box>\n      </Flex>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogAssetEdit\n","import {createSelector} from '@reduxjs/toolkit'\n\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../types'\nimport {selectCurrentFolderChildren} from './folders'\nimport type {RootReducerState} from './types'\n\nexport const selectCombinedItems = createSelector(\n  [\n    (state: RootReducerState) => state.assets.allIds,\n    (state: RootReducerState) => state.uploads.allIds,\n    selectCurrentFolderChildren,\n  ],\n  (assetIds, uploadIds, folderChildren) => {\n    const assetItems = assetIds.map((id): CardAssetData => ({id, type: 'asset'}))\n    const folderItems = folderChildren.map((folder): CardFolderData => ({\n      id: `folder:${folder.id}`,\n      folderId: folder.id,\n      name: folder.name,\n      path: folder.path,\n      totalCount: folder.totalCount,\n      type: 'folder',\n    }))\n    const uploadItems = uploadIds.map((id): CardUploadData => ({id, type: 'upload'}))\n    const combinedItems: (CardAssetData | CardFolderData | CardUploadData)[] = [\n      ...folderItems,\n      ...uploadItems,\n      ...assetItems,\n    ]\n    return combinedItems\n  },\n)\n","import {isHotkey} from 'is-hotkey-esm'\nimport {type RefObject, useCallback, useEffect, useRef} from 'react'\n\nconst useKeyPress = (hotkey: string, onPress?: () => void): RefObject<boolean> => {\n  const keyPressed = useRef(false)\n\n  // If pressed key is our target key then set to true\n  const downHandler = useCallback(\n    (e: KeyboardEvent) => {\n      if (isHotkey(hotkey, e)) {\n        keyPressed.current = true\n        if (onPress) {\n          onPress()\n        }\n      }\n    },\n    [hotkey, onPress],\n  )\n\n  // If released key is our target key then set to false\n  const upHandler = useCallback(() => {\n    keyPressed.current = false\n  }, [])\n\n  // Add event listeners\n  useEffect(() => {\n    window.addEventListener('keydown', downHandler)\n    window.addEventListener('keyup', upHandler)\n    // Remove event listeners on cleanup\n    return () => {\n      window.removeEventListener('keydown', downHandler)\n      window.removeEventListener('keyup', upHandler)\n    }\n  }, [downHandler, upHandler])\n\n  return keyPressed\n}\n\nexport default useKeyPress\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n  Box,\n  Checkbox,\n  Container,\n  Flex,\n  Spinner,\n  Text,\n  type Theme,\n  type ThemeColorSchemeKey,\n} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n  id: string\n  selected: boolean\n  source?: string\n}\n\nconst CardWrapper = styled(Flex)`\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n`\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst CardContainer = styled(Flex)<{$picked?: boolean; theme: Theme; $updating?: boolean}>(({\n  $picked,\n  theme,\n  $updating,\n}) => {\n  return css`\n    border: 1px solid transparent;\n    height: 100%;\n    pointer-events: ${$updating ? 'none' : 'auto'};\n    position: relative;\n    transition: all 300ms;\n    user-select: none;\n    width: 100%;\n\n    border: ${\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      $picked ? `1px solid ${theme.sanity.color.spot.orange} !important` : '1px solid inherit'\n    };\n\n    ${\n      !$updating &&\n      css`\n        @media (hover: hover) and (pointer: fine) {\n          &:hover {\n            border: 1px solid var(--card-border-color);\n          }\n        }\n      `\n    }\n  `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n  $scheme,\n}) => {\n  return css`\n    cursor: pointer;\n    height: ${PANEL_HEIGHT}px;\n    transition: all 300ms;\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${getSchemeColor($scheme, 'bg')};\n      }\n    }\n  `\n})\n\nconst StyledWarningOutlineIcon = styled(WarningFilledIcon)(({theme}) => {\n  return {\n    // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n    color: theme.sanity.color.spot.red,\n  }\n})\n\nconst CardAsset = (props: Props) => {\n  const {id, selected, source} = props\n\n  const scheme = useColorSchemeValue()\n  const toast = useToast()\n\n  // Refs\n  const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n  // Redux\n  const dispatch = useDispatch()\n  const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const item = useTypedSelector((state) => selectAssetById(state, id))\n  // Dialog carries the replace target so search refetch (which clears allIds/picks) is safe.\n  const dialogReplaceAssetId = useTypedSelector((state) => {\n    if (source !== 'replace-asset') {\n      return undefined\n    }\n    const dialog = state.dialog.items.find((d) => d.type === 'dialogAllAssets')\n    return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n  })\n\n  const asset = item?.asset\n  const error = item?.error\n  const isOpaque = item?.asset?.metadata?.isOpaque\n  const picked = item?.picked\n  const updating = item?.updating\n\n  // Prefer dialog assetId; fall back to the single currently-picked asset (not lastPicked).\n  const assetToReplaceId =\n    dialogReplaceAssetId ??\n    (source === 'replace-asset' && assetsPicked.length === 1\n      ? assetsPicked[0]?.asset._id\n      : undefined)\n\n  const assetToReplace = useTypedSelector((state) =>\n    assetToReplaceId ? selectAssetById(state, assetToReplaceId) : undefined,\n  )\n\n  const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n  // Short circuit if no asset is available\n  if (!asset) {\n    return null\n  }\n\n  const handleReplaceAsset = () => {\n    if (!assetToReplaceId || !isImageAsset(asset) || assetToReplace?.updating) {\n      return\n    }\n\n    dispatch(assetsActions.updateImageReferences({asset, id: assetToReplaceId}))\n    toast.push({\n      status: 'info',\n      title:\n        'Updating in progress. Depending on the amount of changes, this could take a few minutes.',\n    })\n    dispatch(dialogActions.clear())\n  }\n\n  // Callbacks\n  const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n    e.stopPropagation()\n\n    if (source === 'replace-asset') {\n      handleReplaceAsset()\n      return\n    }\n\n    if (selected) {\n      return\n    }\n\n    if (onSelect && !isMultiSelect) {\n      onSelect([\n        {\n          kind: 'assetDocumentId',\n          value: asset._id,\n        },\n      ])\n    } else if (onSelect && isMultiSelect) {\n      if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    } else if (shiftPressed.current) {\n      if (picked) {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      } else {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      }\n    } else {\n      dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n    }\n  }\n\n  const handleContextActionClick = (e: MouseEvent) => {\n    e.stopPropagation()\n\n    if (source === 'replace-asset') {\n      handleReplaceAsset()\n      return\n    }\n\n    if (selected) {\n      return\n    }\n\n    if (onSelect && !isMultiSelect) {\n      dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n    } else if (shiftPressed.current && !picked) {\n      dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n    } else {\n      dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n    }\n  }\n\n  const opacityContainer = updating ? 0.5 : 1\n  const opacityPreview = selected || updating ? 0.25 : 1\n\n  return (\n    <CardWrapper padding={1}>\n      <CardContainer direction=\"column\" $picked={picked} $updating={item.updating}>\n        {/* Image */}\n        <Box\n          flex={1}\n          style={{\n            cursor: selected ? 'default' : 'pointer',\n            position: 'relative',\n          }}\n        >\n          <div\n            data-testid={`media-asset-card-${asset._id}`}\n            onClick={handleAssetClick}\n            style={{height: '100%', opacity: opacityPreview}}\n          >\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 250, width: 250})}\n                style={{\n                  draggable: false,\n                  transition: 'opacity 1000ms',\n                }}\n              />\n            )}\n          </div>\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                opacity: opacityContainer,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n        </Box>\n\n        {/* Footer */}\n        <ContextActionContainer\n          align=\"center\"\n          onClick={handleContextActionClick}\n          paddingX={1}\n          $scheme={scheme}\n          style={{opacity: opacityContainer}}\n        >\n          {onSelect && !isMultiSelect ? (\n            <EditIcon\n              style={{\n                flexShrink: 0,\n                opacity: 0.5,\n              }}\n            />\n          ) : (\n            <Checkbox\n              checked={picked}\n              readOnly\n              style={{\n                flexShrink: 0,\n                pointerEvents: 'none',\n                transform: 'scale(0.8)',\n              }}\n            />\n          )}\n\n          <Box marginLeft={2}>\n            <Text muted size={0} textOverflow=\"ellipsis\">\n              {asset.originalFilename}\n            </Text>\n          </Box>\n        </ContextActionContainer>\n\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box\n            padding={3}\n            style={{\n              position: 'absolute',\n              right: 0,\n              top: 0,\n            }}\n          >\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningOutlineIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </CardContainer>\n    </CardWrapper>\n  )\n}\n\nexport default memo(CardAsset)\n","import {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  folderId: string\n  name: string\n  totalCount: number\n}\n\nconst CardWrapper = styled(Flex)`\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n`\n\nconst FolderCard = styled(Card)`\n  cursor: pointer;\n  height: 100%;\n  transition: border-color 200ms ease;\n  width: 100%;\n\n  @media (hover: hover) and (pointer: fine) {\n    &:hover {\n      border-color: var(--card-border-color);\n    }\n  }\n`\n\nconst FolderGlyph = styled(Box)(\n  ({theme}) => css`\n    align-items: flex-end;\n    background: linear-gradient(\n      180deg,\n      ${\n          // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n          theme.sanity.color.spot.yellow\n        }\n        0%,\n      ${\n          // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n          theme.sanity.color.spot.yellow\n        }\n        100%\n    );\n    border-radius: 8px;\n    display: flex;\n    height: 72px;\n    position: relative;\n    width: 96px;\n\n    &::before {\n      background: ${\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.color.spot.yellow\n      };\n      border-radius: 8px 8px 0 0;\n      content: '';\n      height: 18px;\n      left: 0;\n      position: absolute;\n      top: -8px;\n      width: 38px;\n    }\n  `,\n)\n\nconst CardFolder = ({folderId, name, totalCount}: Props) => {\n  const dispatch = useDispatch()\n  const scheme = useColorSchemeValue()\n\n  return (\n    <CardWrapper padding={1}>\n      <FolderCard\n        onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n        padding={3}\n        radius={2}\n        style={{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n        }}\n      >\n        <Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n          <Flex align=\"center\" flex={1} justify=\"center\">\n            <FolderGlyph />\n          </Flex>\n\n          <Stack gap={2}>\n            <Text\n              size={1}\n              style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n              weight=\"semibold\"\n            >\n              {name}\n            </Text>\n            <Text muted size={0} style={{lineHeight: '1.2em'}}>\n              {totalCount} item{totalCount === 1 ? '' : 's'}\n            </Text>\n          </Stack>\n        </Flex>\n      </FolderCard>\n    </CardWrapper>\n  )\n}\n\nexport default CardFolder\n","import {Observable, from, of} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nconst PREVIEW_WIDTH = 180 // px\n\nconst createBlob = (img: HTMLImageElement): Promise<Blob | null> => {\n  return new Promise((resolve) => {\n    const imageAspect = img.width / img.height\n\n    // Create a canvas element which we'll use to generate a low resolution preview.\n    // Ensure that the canvas is at least 1 pixel high as blob generation will fail otherwise.\n    const canvas: HTMLCanvasElement = document.createElement('canvas')\n    canvas.width = PREVIEW_WIDTH\n    canvas.height = Math.max(PREVIEW_WIDTH / imageAspect, 1)\n\n    // Fail silently if we're unable to generate a preview image.\n    // This can often be the case when trying to render SVGs containing `<foreignObject>` elements.\n    try {\n      const ctx = canvas.getContext('2d')\n      ctx?.drawImage(img, 0, 0, PREVIEW_WIDTH, PREVIEW_WIDTH / imageAspect)\n      canvas.toBlob(resolve, 'image/jpeg')\n    } catch (err) {\n      console.warn(`Unable to generate preview image:`, err)\n    }\n  })\n}\n\nconst createImageEl = (file: File): Promise<HTMLImageElement> => {\n  return new Promise((resolve) => {\n    const blobUrlLarge = window.URL.createObjectURL(file)\n    const img = new Image()\n    img.onload = () => {\n      window.URL.revokeObjectURL(blobUrlLarge)\n      resolve(img)\n    }\n    img.src = blobUrlLarge\n  })\n}\n\nconst generatePreviewBlobUrl = async (file: File): Promise<string> => {\n  const imageEl = await createImageEl(file)\n  const blob = await createBlob(imageEl)\n\n  if (!blob) {\n    throw Error('Unable to generate file Blob')\n  }\n\n  return window.URL.createObjectURL(blob)\n}\n\nexport const generatePreviewBlobUrl$ = (file: File): Observable<string> => {\n  return of(null).pipe(mergeMap(() => from(generatePreviewBlobUrl(file))))\n}\n","import {Subject, Subscription, Observable, from} from 'rxjs'\n// Takes a observable-returning function and returns a new function that limits on the number of\n// concurrent observables.\nimport {first, mergeMap} from 'rxjs/operators'\n\nconst DEFAULT_CONCURRENCY = 4\n\nfunction remove<T>(array: Array<T>, item: T): Array<T> {\n  const index = array.indexOf(item)\n  if (index > -1) {\n    array.splice(index, 1)\n  }\n  return array\n}\n\nexport const createThrottler = (concurrency: number = DEFAULT_CONCURRENCY) => {\n  const currentSubscriptions: Array<Subscription> = []\n  const pendingObservables: Array<Observable<any>> = []\n  const ready$ = new Subject()\n\n  function request(observable: Observable<any>): Observable<any> {\n    return new Observable((observer) => {\n      if (currentSubscriptions.length >= concurrency) {\n        return scheduleAndWait$(observable)\n          .pipe(mergeMap(request)) //\n          .subscribe(observer)\n      }\n      const subscription = observable.subscribe(observer)\n      currentSubscriptions.push(subscription)\n      return () => {\n        remove(currentSubscriptions, subscription)\n        remove(pendingObservables, observable)\n        subscription.unsubscribe()\n        while (pendingObservables.length > 0 && currentSubscriptions.length < concurrency) {\n          ready$.next(pendingObservables.shift())\n        }\n      }\n    })\n  }\n\n  function scheduleAndWait$(observable: Observable<any>): Observable<any> {\n    pendingObservables.push(observable)\n    return ready$.asObservable().pipe(first((obs) => obs === observable))\n  }\n\n  return request\n}\n\nexport const withMaxConcurrency = (\n  func: (...args: any[]) => Observable<any>,\n  concurrency: number = DEFAULT_CONCURRENCY,\n) => {\n  const throttler = createThrottler(concurrency)\n  return (...args: Array<any>) => from(throttler(func(...args)))\n}\n","// Sourced from:\n// https://github.com/sanity-io/sanity/blob/ccb777e115a8cdf20d81a9a2bc9d8c228568faff/packages/%40sanity/form-builder/src/sanity/inputs/client-adapters/assets.ts\n\nimport type {SanityAssetDocument, SanityClient, SanityImageAssetDocument} from '@sanity/client'\nimport {Observable, of, throwError} from 'rxjs'\nimport {map, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError} from '../types'\nimport {withMaxConcurrency} from './withMaxConcurrency'\n\nconst fetchExisting$ = (client: SanityClient, type: string, hash: string) => {\n  return client.observable.fetch('*[_type == $documentType && sha1hash == $hash][0]', {\n    documentType: type,\n    hash,\n  })\n}\n\nconst readFile$ = (file: File): Observable<ArrayBuffer> => {\n  return new Observable((subscriber) => {\n    const reader = new FileReader()\n    reader.onload = () => {\n      subscriber.next(reader.result as ArrayBuffer)\n      subscriber.complete()\n    }\n    reader.onerror = (err) => {\n      subscriber.error(err)\n    }\n    reader.readAsArrayBuffer(file)\n    return () => {\n      reader.abort()\n    }\n  })\n}\n\nconst hexFromBuffer = (buffer: ArrayBuffer): string => {\n  return Array.prototype.map\n    .call(new Uint8Array(buffer), (x) => `00${x.toString(16)}`.slice(-2))\n    .join('')\n}\n\nexport const hashFile$ = (file: File): Observable<string> => {\n  if (!window.crypto || !window.crypto.subtle || !window.FileReader) {\n    return throwError(() => ({\n      message: 'Unable to generate hash: uploads are only allowed in secure contexts',\n      statusCode: 500,\n    }))\n  }\n  return readFile$(file).pipe(\n    mergeMap((arrayBuffer) => window.crypto.subtle.digest('SHA-1', arrayBuffer)),\n    map(hexFromBuffer),\n  )\n}\n\nconst uploadSanityAsset$ = (\n  client: SanityClient,\n  assetType: 'file' | 'image',\n  file: File,\n  hash: string,\n) => {\n  return of(null).pipe(\n    // NOTE: the sanity api will still dedupe unique files, but this saves us from uploading the asset file entirely\n    mergeMap(() => fetchExisting$(client, `sanity.${assetType}Asset`, hash)),\n    // Cancel if the asset already exists\n    mergeMap((existingAsset: SanityAssetDocument | SanityImageAssetDocument | null) => {\n      if (existingAsset) {\n        return throwError(\n          () =>\n            ({\n              message: 'Asset already exists',\n              statusCode: 409,\n            }) satisfies HttpError,\n        )\n      }\n\n      return of(null)\n    }),\n    mergeMap(() => {\n      // Begin upload if no existing asset found\n      return client.observable.assets\n        .upload(assetType, file, {\n          extract: ['blurhash', 'exif', 'image', 'location', 'lqip', 'palette'],\n          preserveFilename: true,\n        })\n        .pipe(\n          map((event) =>\n            event.type === 'response'\n              ? {\n                  // rewrite to a 'complete' event\n                  asset: event.body.document,\n                  id: event.body.document._id,\n                  type: 'complete',\n                }\n              : event,\n          ),\n        )\n    }),\n  )\n}\n\nexport const uploadAsset$ = withMaxConcurrency(uploadSanityAsset$)\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\nimport groq from 'groq'\nimport {EMPTY, from, merge, of} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\n\nimport type {HttpError, MyEpic, SanityUploadProgressEvent, UploadItem} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {generatePreviewBlobUrl$} from '../../utils/generatePreviewBlobUrl'\nimport {hashFile$, uploadAsset$} from '../../utils/uploadSanityAsset'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from './actions'\n\nexport type UploadsReducerState = {\n  allIds: string[]\n  byIds: Record<string, UploadItem>\n}\n\nconst initialState = {\n  allIds: [],\n  byIds: {},\n} as UploadsReducerState\n\nconst uploadsSlice = createSlice({\n  name: 'uploads',\n  initialState,\n  extraReducers: (builder) => {\n    builder //\n      .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n        const {asset} = action.payload\n        if (state.byIds[asset.sha1hash]) {\n          state.byIds[asset.sha1hash]!.status = 'complete'\n        }\n      })\n  },\n  reducers: {\n    checkRequest(\n      _state,\n      _action: PayloadAction<{assets: (SanityAssetDocument | SanityImageAssetDocument)[]}>,\n    ) {\n      //\n    },\n    checkComplete(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n      const {results} = action.payload\n\n      const assetHashes = Object.keys(results)\n\n      assetHashes.forEach((hash) => {\n        const deleteIndex = state.allIds.indexOf(hash)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n\n        if (state.byIds[hash]) {\n          const blobUrl = state.byIds[hash].objectUrl\n          if (blobUrl) {\n            window.URL.revokeObjectURL(blobUrl)\n          }\n\n          delete state.byIds[hash]\n        }\n      })\n    },\n    previewReady(state, action: PayloadAction<{hash: string; blobUrl: string}>) {\n      const {blobUrl, hash} = action.payload\n      if (state.byIds[hash]) {\n        state.byIds[hash].objectUrl = blobUrl\n      }\n    },\n    uploadCancel(state, action: PayloadAction<{hash: string}>) {\n      const {hash} = action.payload\n      const deleteIndex = state.allIds.indexOf(hash)\n      if (deleteIndex >= 0) {\n        state.allIds.splice(deleteIndex, 1)\n      }\n      if (state.byIds[hash]) {\n        delete state.byIds[hash]\n      }\n    },\n    uploadError(state, action: PayloadAction<{error: HttpError; hash: string}>) {\n      const {hash} = action.payload\n      const deleteIndex = state.allIds.indexOf(hash)\n      if (deleteIndex >= 0) {\n        state.allIds.splice(deleteIndex, 1)\n      }\n      delete state.byIds[hash]\n    },\n    uploadRequest(\n      _state,\n      _action: PayloadAction<{file: File; forceAsAssetType?: 'file' | 'image'}>,\n    ) {\n      //\n    },\n    uploadProgress(\n      state,\n      action: PayloadAction<{event: SanityUploadProgressEvent; uploadHash: string}>,\n    ) {\n      const {event, uploadHash} = action.payload\n      state.byIds[uploadHash]!.percent = event.percent\n      state.byIds[uploadHash]!.status = 'uploading'\n    },\n    uploadStart(state, action: PayloadAction<{file: File; uploadItem: UploadItem}>) {\n      const {uploadItem} = action.payload\n      if (!state.allIds.includes(uploadItem.hash)) {\n        state.allIds.push(uploadItem.hash)\n      }\n      state.byIds[uploadItem.hash] = uploadItem\n    },\n  },\n})\n\n// Epics\n\nexport const uploadsAssetStartEpic: MyEpic = (action$, _state$, {client}) =>\n  action$.pipe(\n    filter(uploadsActions.uploadStart.match),\n    mergeMap((action) => {\n      const {file, uploadItem} = action.payload\n\n      return merge(\n        // Generate low res preview\n        of(null).pipe(\n          mergeMap(() => generatePreviewBlobUrl$(file)),\n          mergeMap((url) => {\n            return of(\n              uploadsActions.previewReady({\n                blobUrl: url,\n                hash: uploadItem.hash,\n              }),\n            )\n          }),\n        ),\n        // Upload asset and receive progress / complete events\n        of(null).pipe(\n          // delay(500000), // debug uploads\n          mergeMap(() => uploadAsset$(client, uploadItem.assetType, file, uploadItem.hash)),\n          takeUntil(\n            action$.pipe(\n              filter(uploadsActions.uploadCancel.match),\n              filter((v) => v.payload.hash === uploadItem.hash),\n            ),\n          ),\n          mergeMap((event) => {\n            if (event?.type === 'complete') {\n              const folderId = uploadItem.folderId || null\n\n              if (!folderId) {\n                return of(\n                  UPLOADS_ACTIONS.uploadComplete({\n                    asset: event.asset,\n                  }),\n                )\n              }\n\n              return from(\n                client\n                  .patch(event.asset._id)\n                  .setIfMissing({opt: {}})\n                  .setIfMissing({'opt.media': {}})\n                  .set({\n                    'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n                  })\n                  .commit(),\n              ).pipe(\n                mergeMap((asset) =>\n                  of(\n                    UPLOADS_ACTIONS.uploadComplete({\n                      asset: asset as SanityAssetDocument | SanityImageAssetDocument,\n                    }),\n                  ),\n                ),\n              )\n            }\n            if (event?.type === 'progress' && event?.stage === 'upload') {\n              return of(\n                uploadsActions.uploadProgress({\n                  event,\n                  uploadHash: uploadItem.hash,\n                }),\n              )\n            }\n            return EMPTY\n          }),\n          catchError((error: ClientError) =>\n            of(\n              uploadsActions.uploadError({\n                error: {\n                  message: error?.message || 'Internal error',\n                  statusCode: error?.statusCode || 500,\n                },\n                hash: uploadItem.hash,\n              }),\n            ),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const uploadsAssetUploadEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(uploadsActions.uploadRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {file, forceAsAssetType} = action.payload\n\n      return of(action).pipe(\n        // Generate SHA1 hash from local file\n        // This will throw in insecure contexts (non-localhost / https)\n        mergeMap(() => hashFile$(file)),\n        // Ignore if the file exists and is currently being uploaded\n        filter((hash) => {\n          const exists = !!state.uploads.byIds[hash]\n          return !exists\n        }),\n        // Dispatch start action and begin upload process\n        mergeMap((hash) => {\n          const assetType = forceAsAssetType || (file.type.indexOf('image') >= 0 ? 'image' : 'file')\n          const uploadItem = {\n            _type: 'upload',\n            assetType,\n            folderId: state.folders.currentFolderId,\n            hash,\n            name: file.name,\n            size: file.size,\n            status: 'queued',\n          } as UploadItem\n          return of(uploadsActions.uploadStart({file, uploadItem}))\n        }),\n      )\n    }),\n  )\n\nexport const uploadsCompleteQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(UPLOADS_ACTIONS.uploadComplete.match),\n    mergeMap((action) => {\n      return of(\n        uploadsActions.checkRequest({\n          assets: [action.payload.asset],\n        }),\n      )\n    }),\n  )\n\nexport const uploadsCheckRequestEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(uploadsActions.checkRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets} = action.payload\n\n      const documentIds = assets.map((asset) => asset._id)\n\n      const constructedFilter = constructFilter({\n        assetTypes: state.assets.assetTypes,\n        currentFolderId: state.folders.currentFolderId,\n        excludeTagSlugs: state.assets.excludeTagSlugs,\n        searchFacets: state.search.facets,\n        searchQuery: state.search.query,\n      })\n\n      const query = groq`\n        *[${constructedFilter} && _id in $documentIds].sha1hash\n      `\n\n      return of(action).pipe(\n        delay(1000), // give Sanity some time to register the recently uploaded asset\n        mergeMap(() => client.observable.fetch<string[]>(query, {documentIds})),\n        mergeMap((resultHashes) => {\n          const checkedResults = assets.reduce((acc: Record<string, string | null>, asset) => {\n            acc[asset.sha1hash] = resultHashes.includes(asset.sha1hash) ? asset._id : null\n            return acc\n          }, {})\n\n          return of(\n            uploadsActions.checkComplete({results: checkedResults}), //\n            assetsActions.insertUploads({results: checkedResults}),\n          )\n        }),\n      )\n    }),\n  )\n\n// Selectors\n\nexport const selectUploadById = createSelector(\n  [\n    (state: RootReducerState) => state.uploads.byIds,\n    (_state: RootReducerState, uploadId: string) => uploadId,\n  ],\n  (byIds, uploadId) => byIds[uploadId],\n)\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\nexport default uploadsSlice.reducer\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n  id: string\n}\n\nconst CardWrapper = styled(Flex)`\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n`\n\nconst CardUpload = (props: Props) => {\n  const {id} = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const item = useTypedSelector((state) => selectUploadById(state, id))\n\n  if (!item) {\n    return null\n  }\n\n  const fileSize = filesize(item.size, {base: 10, round: 0})\n  const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n  const isComplete = item.status === 'complete'\n  const isUploading = item.status === 'uploading'\n  const isQueued = item.status === 'queued'\n\n  let status\n  if (isComplete) {\n    status = 'Verifying'\n  }\n  if (isUploading) {\n    status = `${percentLoaded}%`\n  }\n  if (isQueued) {\n    status = 'Queued'\n  }\n\n  // Callbacks\n  const handleCancelUpload = () => {\n    dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n  }\n\n  return (\n    <CardWrapper padding={1}>\n      <Flex\n        direction=\"column\"\n        flex={1}\n        style={{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n          height: '100%',\n          position: 'relative',\n        }}\n      >\n        {/* Progress bar */}\n        <div\n          style={{\n            background: 'var(--card-fg-color)',\n            bottom: 0,\n            height: '1px',\n            left: 0,\n            position: 'absolute',\n            width: '100%',\n            transform: `scaleX(${percentLoaded * 0.01})`,\n            transformOrigin: 'bottom left',\n            transition: 'all 1000ms ease-out',\n          }}\n        />\n\n        <Box flex={1} style={{position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{\n                opacity: 0.4,\n              }}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"80px\" />\n            </div>\n          )}\n\n          {/*\n          Cancel upload button.\n          Assets will only have a `complete` status _after_ it has been created on your dataset.\n          As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n          has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n        */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              direction=\"column\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={4}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n\n        {/* Footer */}\n        <Flex\n          align=\"center\"\n          justify=\"space-between\"\n          paddingX={2}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Box flex={1} marginRight={1}>\n            <Text size={0} textOverflow=\"ellipsis\">\n              {item.name} ({fileSize})\n            </Text>\n          </Box>\n          <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n            {status}\n          </Text>\n        </Flex>\n      </Flex>\n    </CardWrapper>\n  )\n}\n\nexport default CardUpload\n","import {memo} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport CardAsset from '../CardAsset'\nimport CardFolder from '../CardFolder'\nimport CardUpload from '../CardUpload'\n\ntype Props = {\n  items: (CardAssetData | CardFolderData | CardUploadData)[]\n  onLoadMore?: () => void\n  source?: string\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = memo(\n  ({\n    item,\n    selected,\n    source,\n  }: {\n    item: CardAssetData | CardFolderData | CardUploadData\n    selected: boolean\n    source?: string\n  }) => {\n    if (item?.type === 'asset') {\n      return <CardAsset id={item.id} selected={selected} source={source} />\n    }\n\n    if (item?.type === 'folder') {\n      return <CardFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n    }\n\n    if (item?.type === 'upload') {\n      return <CardUpload id={item.id} />\n    }\n\n    return null\n  },\n)\n\nconst StyledItemContainer = styled.div`\n  height: ${CARD_HEIGHT}px;\n  width: ${CARD_WIDTH}px;\n`\n\nconst ItemContainer = (props: any) => {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n  const {context, ref, ...rest} = props\n  return <StyledItemContainer ref={ref} {...rest} />\n}\n\nconst StyledListContainer = styled.div`\n  display: grid;\n  grid-template-columns: repeat(auto-fill, ${CARD_WIDTH}px);\n  grid-template-rows: repeat(auto-fill, ${CARD_HEIGHT}px);\n  justify-content: center;\n  margin: 0 auto;\n`\n\nconst ListContainer = (props: any) => {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n  const {context, ref, ...rest} = props\n  return <StyledListContainer ref={ref} {...rest} />\n}\n\nconst AssetGridVirtualized = (props: Props) => {\n  const {items, onLoadMore, source} = props\n\n  // Redux\n  const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n  const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n  const totalCount = items?.length\n\n  if (totalCount === 0) {\n    return null\n  }\n\n  return (\n    <VirtuosoGrid\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        return item?.id ?? index\n      }}\n      components={{\n        Item: ItemContainer,\n        List: ListContainer,\n      }}\n      endReached={onLoadMore}\n      itemContent={(index) => {\n        const item = items[index]!\n        const selected = selectedIds.includes(item.id)\n        return <VirtualCell item={item} selected={selected} source={source} />\n      }}\n      overscan={48}\n      style={{overflowX: 'hidden', overflowY: 'scroll'}}\n      totalCount={totalCount}\n    />\n  )\n}\n\nexport default AssetGridVirtualized\n","import {Box, Text} from '@sanity/ui'\nimport {useEffect, useRef, useState} from 'react'\nimport {useDispatch, useStore} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport type {RootReducerState} from '../../modules/types'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\n\nfunction omitFacetId(facet: WithId<SearchFacetInputProps>): SearchFacetInputProps {\n  // Strip the runtime `id` so facetsAdd can assign a fresh one on restore.\n  const {id: _id, ...withoutId} = facet\n  void _id\n  return withoutId\n}\n\nconst ReplaceAssetsOverview = () => {\n  const dispatch = useDispatch()\n  const store = useStore<RootReducerState>()\n  const combinedItems = useTypedSelector(selectCombinedItems)\n  const assetsById = useTypedSelector((state) => state.assets.byIds)\n  const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const fetchingError = useTypedSelector((state) => state.assets.fetchingError)\n  const pageSize = useTypedSelector((state) => state.assets.pageSize)\n  const searchQuery = useTypedSelector((state) => state.search.query)\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const currentFolderUnfiled = useTypedSelector((state) => state.folders.currentFolderUnfiled)\n\n  // Prefer the dialog's assetId — search refetch clears `allIds` / can drop picks.\n  const assetToReplaceId = useTypedSelector((state) => {\n    const dialog = state.dialog.items.find((item) => item.type === 'dialogAllAssets')\n    return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n  })\n\n  const savedBrowserStateRef = useRef<{\n    assetId: string | undefined\n    query: string\n    facets: WithId<SearchFacetInputProps>[]\n    folderId: string | null\n    folderUnfiled: boolean\n  } | null>(null)\n\n  // Clearing the search only triggers a refetch after `assetsSearchEpic`'s debounce, so the\n  // stale results stay in the store for a moment. Track that gap to avoid rendering the\n  // empty state before the unscoped results arrive.\n  const [awaitingRefetch, setAwaitingRefetch] = useState(\n    () =>\n      searchQuery.length > 0 ||\n      searchFacets.length > 0 ||\n      Boolean(currentFolderId) ||\n      currentFolderUnfiled,\n  )\n\n  // Clear the browser search, facets and folder scope so the picker is not limited to the\n  // result set the user used to find the asset. Restore them when the dialog closes.\n  useEffect(() => {\n    const {dialog, folders, search} = store.getState()\n    const {query, facets} = search\n    const dialogItem = dialog.items.find((item) => item.type === 'dialogAllAssets')\n\n    savedBrowserStateRef.current = {\n      assetId: dialogItem?.type === 'dialogAllAssets' ? dialogItem.assetId : undefined,\n      query,\n      facets,\n      folderId: folders.currentFolderId,\n      folderUnfiled: folders.currentFolderUnfiled,\n    }\n\n    if (query.length > 0) {\n      dispatch(searchActions.querySet({searchQuery: ''}))\n    }\n    if (facets.length > 0) {\n      dispatch(searchActions.facetsClear())\n    }\n    if (folders.currentFolderId || folders.currentFolderUnfiled) {\n      dispatch(foldersActions.currentFolderClear())\n    }\n\n    return () => {\n      const saved = savedBrowserStateRef.current\n      if (!saved) {\n        return\n      }\n\n      const hadScope =\n        saved.query.length > 0 ||\n        saved.facets.length > 0 ||\n        Boolean(saved.folderId) ||\n        saved.folderUnfiled\n\n      if (saved.query.length > 0) {\n        dispatch(searchActions.querySet({searchQuery: saved.query}))\n      }\n      for (const facet of saved.facets) {\n        dispatch(searchActions.facetsAdd({facet: omitFacetId(facet)}))\n      }\n      if (saved.folderId) {\n        dispatch(foldersActions.currentFolderSet({folderId: saved.folderId}))\n      } else if (saved.folderUnfiled) {\n        dispatch(foldersActions.currentFolderShowUnfiled())\n      }\n\n      // Changing the search or folder runs epics that clear picks — put the asset being\n      // replaced back so closing the dialog keeps the browser selection.\n      if (hadScope && saved.assetId) {\n        dispatch(assetsActions.pick({assetId: saved.assetId, picked: true}))\n      }\n    }\n  }, [dispatch, store])\n\n  // Every rescoped refetch is preceded by `assetsActions.clear()`, so wait for the asset\n  // list to be emptied and the following fetch to settle. Watching `fetching` alone is not\n  // enough: `assetsFetchEpic` uses `switchMap`, so replacing an in-flight request leaves\n  // `fetching` true throughout. Clearing a folder scope and a search at the same time\n  // produces two refetches (the folder one immediately, the search one after its debounce),\n  // so each list clear re-arms the wait rather than resolving it for good.\n  useEffect(() => {\n    let previousIds = store.getState().assets.allIds\n    let awaitingSettle = false\n\n    return store.subscribe(() => {\n      const {allIds, fetching: isFetching} = store.getState().assets\n      const listCleared = allIds !== previousIds && allIds.length === 0\n      previousIds = allIds\n\n      if (listCleared) {\n        awaitingSettle = true\n        setAwaitingRefetch(true)\n        return\n      }\n      if (awaitingSettle && !isFetching) {\n        awaitingSettle = false\n        setAwaitingRefetch(false)\n      }\n    })\n  }, [store])\n\n  const scopeActive =\n    searchQuery.length > 0 ||\n    searchFacets.length > 0 ||\n    Boolean(currentFolderId) ||\n    currentFolderUnfiled\n\n  // Only image assets can replace image refs; exclude uploads and the asset being replaced.\n  const reducedItems = combinedItems.filter((item) => {\n    if (item.type !== 'asset' || item.id === assetToReplaceId) {\n      return false\n    }\n    const asset = assetsById[item.id]?.asset\n    return asset ? isImageAsset(asset) : false\n  })\n\n  const hasFetchedOnce = fetchCount >= 0\n  const hasMorePages = fetchCount === pageSize\n  // Don't treat a scoped / stale / mid-fetch / incomplete page as \"no replacements\".\n  const isEmpty =\n    reducedItems.length === 0 &&\n    hasFetchedOnce &&\n    !fetching &&\n    !scopeActive &&\n    !awaitingRefetch &&\n    !hasMorePages\n\n  // Keep loading pages until we find image candidates or exhaust results. A failed fetch\n  // leaves `fetchCount` untouched, so stop paging on error instead of retrying forever.\n  useEffect(() => {\n    if (\n      scopeActive ||\n      fetching ||\n      awaitingRefetch ||\n      fetchingError ||\n      reducedItems.length > 0 ||\n      !hasFetchedOnce ||\n      !hasMorePages\n    ) {\n      return\n    }\n    dispatch(assetsActions.loadNextPage())\n  }, [\n    dispatch,\n    scopeActive,\n    fetching,\n    awaitingRefetch,\n    fetchingError,\n    reducedItems.length,\n    hasFetchedOnce,\n    hasMorePages,\n  ])\n\n  const handleLoadMoreItems = () => {\n    if (!fetching) {\n      dispatch(assetsActions.loadNextPage())\n    }\n  }\n\n  return (\n    <Box height=\"fill\">\n      {isEmpty ? (\n        <Box padding={5}>\n          <Text size={1} weight=\"semibold\">\n            There are no replacement images\n          </Text>\n        </Box>\n      ) : (\n        <Box height=\"fill\">\n          <AssetGridVirtualized\n            items={reducedItems}\n            onLoadMore={handleLoadMoreItems}\n            source=\"replace-asset\"\n          />\n        </Box>\n      )}\n    </Box>\n  )\n}\n\nexport default ReplaceAssetsOverview\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogAllAssetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport ReplaceAssetsOverview from '../ReplaceAssetsOverView'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogAllAssetsProps\n}\n\nconst DialogAllAssets = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog header=\"Choose a replacement image\" id={id} onClose={handleClose} width={3}>\n      <Box padding={4} style={{height: '50vh'}}>\n        <ReplaceAssetsOverview />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogAllAssets\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Flex, Stack, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogConfirmProps} from '../../types'\nimport Dialog from '../Dialog'\n\ntype Props = {\n  children?: ReactNode\n  dialog: DialogConfirmProps\n}\n\nconst DialogConfirm = (props: Props) => {\n  const {children, dialog} = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id: dialog?.id}))\n  }\n\n  const handleConfirm = () => {\n    // Close target dialog, if provided\n    if (dialog?.closeDialogId) {\n      dispatch(dialogActions.remove({id: dialog?.closeDialogId}))\n    }\n\n    if (dialog?.confirmCallbackAction) {\n      dispatch(dialog.confirmCallbackAction)\n    }\n\n    // Close self\n    handleClose()\n  }\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"space-between\">\n        <Button fontSize={1} mode=\"bleed\" onClick={handleClose} text=\"Cancel\" />\n        <Button\n          fontSize={1}\n          onClick={handleConfirm}\n          text={dialog?.confirmText}\n          tone={dialog?.tone}\n        />\n      </Flex>\n    </Box>\n  )\n\n  const Header = () => (\n    <Flex align=\"center\">\n      <Box paddingX={1}>\n        <WarningOutlineIcon />\n      </Box>\n      <Box marginLeft={2}>{dialog?.headerTitle}</Box>\n    </Flex>\n  )\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      // oxlint-disable-next-line react/static-components\n      header={<Header />}\n      id=\"confirm\"\n      onClose={handleClose}\n      width={1}\n    >\n      <Box paddingX={4} paddingY={4}>\n        <Stack gap={3}>\n          {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n          {dialog?.description && (\n            <Text muted size={1}>\n              <em>{dialog.description}</em>\n            </Text>\n          )}\n        </Stack>\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogConfirm\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderCreateProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFolderCreateProps\n}\n\nconst DialogFolderCreate = (props: Props) => {\n  const {\n    children,\n    dialog: {parentFolderId, id},\n  } = props\n\n  const dispatch = useDispatch()\n  const creating = useTypedSelector((state) => state.folders.creating)\n  const creatingError = useTypedSelector((state) => state.folders.creatingError)\n  const parentPath = useTypedSelector((state) => selectFolderPathById(state, parentFolderId))\n\n  const {\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    setError,\n  } = useForm<FolderFormData>({\n    defaultValues: {\n      name: '',\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n  })\n\n  const handleClose = () => {\n    dispatch(dialogActions.clear())\n  }\n\n  const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      foldersActions.createRequest({\n        name: sanitizedFormData['name'],\n        parentId: parentFolderId || null,\n      }),\n    )\n  }\n\n  useEffect(() => {\n    if (creatingError) {\n      setError('name', {message: creatingError.message})\n    }\n  }, [creatingError, setError])\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"flex-end\">\n        <FormSubmitButton\n          disabled={creating || !isDirty || !isValid}\n          isValid={isValid}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Create Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {parentPath && (\n          <Box marginBottom={3}>\n            <Text muted size={1}>\n              Creating inside {parentPath}\n            </Text>\n          </Box>\n        )}\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={creating}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolderCreate\n","import {Box, Button, Flex, Inline, Stack, Text, Tree, TreeItem} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {type ReactNode, useMemo, useState} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectFolderTree} from '../../modules/folders'\nimport type {DialogFolderMoveProps, FolderTreeNode} from '../../types'\nimport Dialog from '../Dialog'\n\nconst getExpandedIdSet = (\n  folderId: string | null,\n  byId: Record<string, {parentId: string | null}>,\n) => {\n  const expanded = new Set<string>()\n  let cursor: string | null = folderId\n  while (cursor) {\n    const node = byId[cursor]\n    if (!node) break\n    expanded.add(cursor)\n    cursor = node.parentId\n  }\n  return expanded\n}\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFolderMoveProps\n}\n\ntype FolderNodeProps = {\n  expandedIds: Set<string>\n  node: FolderTreeNode\n  onSelect: (folderId: string) => void\n  selectedId: string | null\n}\n\nconst FolderNode = ({expandedIds, node, onSelect, selectedId}: FolderNodeProps) => {\n  const hasChildren = node.children.length > 0\n  const selected = selectedId === node.id\n\n  return (\n    <TreeItem\n      expanded={expandedIds.has(node.id)}\n      id={node.id}\n      onClick={() => onSelect(node.id)}\n      selected={selected}\n      text={`${node.name} (${node.totalCount})`}\n      weight={selected ? 'semibold' : 'medium'}\n    >\n      {hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n            selectedId={selectedId}\n          />\n        ))}\n    </TreeItem>\n  )\n}\n\ntype FolderTreeProps = {\n  expandedIds: Set<string>\n  folderTree: FolderTreeNode[]\n  onSelect: (folderId: string) => void\n  selectedId: string | null\n}\n\nconst FolderTree = ({expandedIds, folderTree, onSelect, selectedId}: FolderTreeProps) => (\n  <Tree gap={1}>\n    {folderTree.map((node) => (\n      <FolderNode\n        expandedIds={expandedIds}\n        key={node.id}\n        node={node}\n        onSelect={onSelect}\n        selectedId={selectedId}\n      />\n    ))}\n  </Tree>\n)\n\nconst DialogFolderMove = ({children, dialog}: Props) => {\n  const dispatch = useDispatch()\n  const folderTree = useTypedSelector(selectFolderTree)\n  const byId = useTypedSelector((state) => state.folders.byId)\n  const {assets, folderId, id} = dialog\n  const [selectedId, setSelectedId] = useState<string | null>(folderId || null)\n  const selectedFolder = selectedId ? byId[selectedId] : null\n  const expandedIds = useMemo(() => getExpandedIdSet(folderId || null, byId), [byId, folderId])\n\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id}))\n  }\n\n  const handleMove = () => {\n    if (!selectedId) {\n      return\n    }\n\n    dispatch(\n      assetsActions.folderSetRequest({\n        assets,\n        closeDialogId: id,\n        folderId: selectedId,\n      }),\n    )\n  }\n\n  return (\n    <Dialog\n      animate\n      footer={\n        <Box padding={3}>\n          <Flex justify=\"flex-end\" gap={2}>\n            <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n            <Button\n              disabled={!selectedId}\n              mode=\"default\"\n              onClick={handleMove}\n              text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n              tone=\"primary\"\n            />\n          </Flex>\n        </Box>\n      }\n      header=\"Move to Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Stack gap={4} padding={4}>\n        <Text size={1}>\n          Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n        </Text>\n\n        <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n          <FolderTree\n            expandedIds={expandedIds}\n            folderTree={folderTree}\n            onSelect={setSelectedId}\n            selectedId={selectedId}\n          />\n\n          {folderTree.length === 0 && (\n            <Box marginTop={3}>\n              <Text muted size={1}>\n                No folders yet.\n              </Text>\n            </Box>\n          )}\n        </Box>\n\n        {selectedFolder && (\n          <Inline gap={2}>\n            <Text muted size={1}>\n              Destination:\n            </Text>\n            <Text size={1} weight=\"semibold\">\n              {selectedFolder.name}\n            </Text>\n          </Inline>\n        )}\n      </Stack>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolderMove\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderRenameProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFolderRenameProps\n}\n\nconst DialogFolderRename = ({children, dialog}: Props) => {\n  const {folderId, id} = dialog\n  const dispatch = useDispatch()\n  const renaming = useTypedSelector((state) => state.folders.renaming)\n  const renameError = useTypedSelector((state) => state.folders.renameError)\n  const folder = useTypedSelector((state) => state.folders.byId[folderId])\n  const folderPath = useTypedSelector((state) => selectFolderPathById(state, folderId))\n  const currentName = folder?.name || ''\n  const parentPath = folderPath.includes('/')\n    ? folderPath.slice(0, folderPath.lastIndexOf('/'))\n    : null\n\n  const {\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    setError,\n  } = useForm<FolderFormData>({\n    defaultValues: {\n      name: currentName,\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n  })\n\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id}))\n  }\n\n  const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      foldersActions.renameRequest({\n        name: sanitizedFormData['name'],\n        folderId,\n      }),\n    )\n  }\n\n  useEffect(() => {\n    if (renameError) {\n      setError('name', {message: renameError.message})\n    }\n  }, [renameError, setError])\n\n  return (\n    <Dialog\n      animate\n      footer={\n        <Box padding={3}>\n          <Flex justify=\"flex-end\">\n            <FormSubmitButton\n              disabled={renaming || !isDirty || !isValid}\n              isValid={isValid}\n              onClick={handleSubmit(onSubmit)}\n            />\n          </Flex>\n        </Box>\n      }\n      header=\"Rename Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        <Box marginBottom={3}>\n          <Text muted size={1}>\n            {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n          </Text>\n        </Box>\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={renaming}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolderRename\n","import {AddIcon} from '@sanity/icons/Add'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Inline, Label, Text, Tree, TreeItem} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode, useMemo} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {foldersActions, selectCanDeleteFolder, selectFolderTree} from '../../modules/folders'\nimport type {FolderTreeNode} from '../../types'\n\nconst getExpandedIdSet = (\n  folderId: string | null,\n  byId: Record<string, {parentId: string | null}>,\n) => {\n  const expanded = new Set<string>()\n  let cursor: string | null = folderId\n  while (cursor) {\n    const node = byId[cursor]\n    if (!node) break\n    expanded.add(cursor)\n    cursor = node.parentId\n  }\n  return expanded\n}\n\ntype FolderNodeProps = {\n  currentFolderId: string | null\n  expandedIds: Set<string>\n  node: FolderTreeNode\n  onSelect: (folderId: string) => void\n}\n\ntype FolderHeaderActionProps = {\n  disabled?: boolean\n  icon: ReactNode\n  onClick: () => void\n  tone?: 'critical' | 'default' | 'primary'\n  tooltip: string\n}\n\nconst FolderHeaderAction = ({\n  disabled = false,\n  icon,\n  onClick,\n  tone = 'default',\n  tooltip,\n}: FolderHeaderActionProps) => (\n  <Tooltip\n    animate\n    content={\n      <Container padding={2} width={0}>\n        <Text muted size={1}>\n          {tooltip}\n        </Text>\n      </Container>\n    }\n    disabled={typeof window !== 'undefined' && 'ontouchstart' in window}\n    placement=\"top\"\n    portal\n  >\n    <Button\n      aria-label={tooltip}\n      disabled={disabled}\n      fontSize={1}\n      icon={icon}\n      mode=\"bleed\"\n      onClick={onClick}\n      padding={2}\n      tone={tone}\n    />\n  </Tooltip>\n)\n\ntype FolderItemTextProps = {\n  name: string\n  totalCount: number\n}\n\n/**\n * this uses some hacky css to get the desired layout\n * The tree item is a text container, so we need to use a span to wrap the content\n */\nconst FolderItemText = ({name, totalCount}: FolderItemTextProps) => (\n  <span\n    style={{\n      boxSizing: 'border-box',\n      display: 'block',\n      maxWidth: '100%',\n      minWidth: 0,\n      overflow: 'hidden',\n      paddingRight: '2rem',\n      position: 'relative',\n      width: '100%',\n    }}\n  >\n    <span\n      style={{\n        alignItems: 'center',\n        display: 'flex',\n        paddingLeft: '0.25rem',\n        gap: '0.5rem',\n        minWidth: 0,\n        overflow: 'hidden',\n      }}\n    >\n      <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n        <FolderIcon />\n      </span>\n      <span\n        style={{\n          display: 'block',\n          minWidth: 0,\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        {name}\n      </span>\n    </span>\n    <span\n      style={{\n        fontSize: '0.75rem',\n        opacity: 0.78,\n        position: 'absolute',\n        right: 0,\n        top: '50%',\n        transform: 'translateY(-50%)',\n      }}\n    >\n      {totalCount}\n    </span>\n  </span>\n)\n\nconst FolderNode = ({currentFolderId, expandedIds, node, onSelect}: FolderNodeProps) => {\n  const hasChildren = node.children.length > 0\n  const selected = currentFolderId === node.id\n\n  return (\n    <TreeItem\n      expanded={expandedIds.has(node.id)}\n      id={node.id}\n      onClick={() => onSelect(node.id)}\n      selected={selected}\n      text={<FolderItemText name={node.name} totalCount={node.totalCount} />}\n      weight={selected ? 'semibold' : 'medium'}\n    >\n      {hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            currentFolderId={currentFolderId}\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n          />\n        ))}\n    </TreeItem>\n  )\n}\n\nconst FolderView = () => {\n  const dispatch = useDispatch()\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const byId = useTypedSelector((state) => state.folders.byId)\n  const canDeleteFolder = useTypedSelector(selectCanDeleteFolder)\n  const fetching = useTypedSelector((state) => state.folders.fetching)\n  const folderTree = useTypedSelector(selectFolderTree)\n  const currentFolder = currentFolderId ? byId[currentFolderId] : null\n  const expandedIds = useMemo(\n    () => getExpandedIdSet(currentFolderId, byId),\n    [byId, currentFolderId],\n  )\n  const treeKey = useMemo(() => Array.from(expandedIds).join('|') || 'root', [expandedIds])\n\n  const hasFolders = folderTree.length > 0\n\n  const handleFolderSelect = (folderId: string) => {\n    dispatch(foldersActions.currentFolderSet({folderId}))\n  }\n\n  const handleFolderDelete = () => {\n    if (!currentFolderId || !currentFolder) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteFolder({\n        folderId: currentFolderId,\n        folderName: currentFolder.name,\n      }),\n    )\n  }\n\n  return (\n    <Flex direction=\"column\" flex={1} height=\"fill\">\n      <Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingX={3}\n        style={{\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Box flex={1}>\n          <Inline gap={2}>\n            <Label size={0}>Folders</Label>\n            {fetching && (\n              <Label size={0} style={{opacity: 0.3}}>\n                Loading...\n              </Label>\n            )}\n          </Inline>\n        </Box>\n\n        <Inline gap={1}>\n          {currentFolderId && (\n            <FolderHeaderAction\n              icon={<EditIcon />}\n              onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n              tone=\"primary\"\n              tooltip=\"Rename folder\"\n            />\n          )}\n\n          <FolderHeaderAction\n            icon={<AddIcon />}\n            onClick={() =>\n              dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n            }\n            tone=\"primary\"\n            tooltip=\"Create folder\"\n          />\n\n          {currentFolderId && canDeleteFolder && (\n            <FolderHeaderAction\n              icon={<TrashIcon />}\n              onClick={handleFolderDelete}\n              tone=\"critical\"\n              tooltip=\"Delete folder\"\n            />\n          )}\n        </Inline>\n      </Flex>\n\n      <Box padding={2}>\n        <Box>\n          <Tree gap={1} key={treeKey}>\n            <TreeItem\n              id=\"__all-assets\"\n              onClick={() => dispatch(foldersActions.currentFolderClear())}\n              selected={currentFolderId === null}\n              text=\"All assets\"\n              weight={currentFolderId === null ? 'semibold' : 'medium'}\n            />\n\n            {folderTree.map((node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            ))}\n          </Tree>\n\n          {!hasFolders && !fetching && (\n            <Box marginTop={3} paddingX={1}>\n              <Text muted size={1}>\n                <em>No folders</em>\n              </Text>\n            </Box>\n          )}\n        </Box>\n      </Box>\n    </Flex>\n  )\n}\n\nexport default FolderView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogFoldersProps} from '../../types'\nimport Dialog from '../Dialog'\nimport FolderView from '../FolderView'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFoldersProps\n}\n\nconst DialogFolders = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  const dispatch = useDispatch()\n\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog animate header=\"Folders\" id={id} onClose={handleClose} width={1}>\n      <Box\n        style={{\n          height: '100%',\n          minHeight: '420px',\n        }}\n      >\n        <FolderView />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolders\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Flex, Label, rem, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  children: ReactNode\n  facet: WithId<SearchFacetInputProps>\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled<typeof Box, {$scheme: ThemeColorSchemeKey}>(Box)(({$scheme, theme}) => {\n  return css`\n    background: ${getSchemeColor($scheme, 'bg')};\n    border-radius: ${\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      rem(theme.sanity.radius[2]!)\n    };\n  `\n})\n\nconst SearchFacet = (props: Props) => {\n  const {children, facet} = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n\n  const handleClose = () => {\n    dispatch(searchActions.facetsRemoveById({facetId: facet.id}))\n  }\n\n  return (\n    <Container padding={[2, 2, 1]} $scheme={scheme}>\n      <Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n        {/* Title */}\n        <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n          <Label\n            size={0}\n            style={{\n              whiteSpace: 'nowrap',\n            }}\n          >\n            {facet.title}\n          </Label>\n        </Box>\n\n        <Flex align=\"center\">\n          {children}\n\n          {/* Close button */}\n          <Box marginLeft={1} paddingX={2}>\n            <Text muted size={0}>\n              <CloseIcon onClick={handleClose} />\n            </Text>\n          </Box>\n        </Flex>\n      </Flex>\n    </Container>\n  )\n}\n\nexport default SearchFacet\n","import {TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\n\n// TODO: use correct type\ntype Props = any & {\n  onValueChange: (value: number) => void\n  value?: number\n}\n\nconst TextInputNumber = (props: Props) => {\n  const {onValueChange, value, ...remainingProps} = props\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    const val = e.target.value\n    const regex = /^[0-9\\b]+$/\n\n    // Test for number and strip leading zeroes\n    if (val === '' || regex.test(val)) {\n      onValueChange(parseInt(val, 10) || '')\n    }\n  }\n\n  return (\n    <TextInput\n      {...remainingProps}\n      onChange={handleChange} //\n      value={value ?? ''}\n    />\n  )\n}\n\nexport default TextInputNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n  SearchFacetInputNumberModifier,\n  SearchFacetInputNumberProps,\n  SearchFacetOperatorType,\n  WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\nimport TextInputNumber from '../TextInputNumber'\n\ntype Props = {\n  facet: WithId<SearchFacetInputNumberProps>\n}\n\nconst SearchFacetNumber = ({facet}: Props) => {\n  // Redux\n  const dispatch = useDispatch()\n\n  const popoverProps = usePortalPopoverProps()\n\n  const modifiers = facet?.modifiers\n  const selectedModifier = facet?.modifier\n    ? modifiers?.find((modifier) => modifier.name === facet?.modifier)\n    : modifiers?.[0]\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n  }\n\n  const handleModifierClick = (modifier: SearchFacetInputNumberModifier) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, modifier: modifier.name}))\n  }\n\n  const handleValueChange = (value: number) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, value}))\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet.operatorType ?? 'greaterThan'\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      <Box marginX={1} style={{maxWidth: '50px'}}>\n        <TextInputNumber\n          fontSize={1}\n          onValueChange={handleValueChange}\n          padding={2}\n          radius={2}\n          width={2}\n          value={facet?.value}\n        />\n      </Box>\n\n      {/* Modifiers */}\n      {modifiers && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={selectedModifier?.title}\n            />\n          }\n          id=\"modifier\"\n          menu={\n            <Menu>\n              {modifiers.map((modifier) => {\n                const selected = modifier.name === facet.modifier\n                return (\n                  <MenuItem\n                    disabled={selected}\n                    fontSize={1}\n                    key={modifier.name}\n                    onClick={() => handleModifierClick(modifier)}\n                    padding={2}\n                    text={modifier.title}\n                  />\n                )\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n  SearchFacetInputSelectListItemProps,\n  SearchFacetInputSelectProps,\n  SearchFacetOperatorType,\n  WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n  facet: WithId<SearchFacetInputSelectProps>\n}\n\nconst SearchFacetSelect = ({facet}: Props) => {\n  // Redux\n  const dispatch = useDispatch()\n\n  const popoverProps = usePortalPopoverProps()\n\n  const options = facet?.options\n\n  const selectedItem = options?.find((v) => v.name === facet?.value)\n\n  const handleListItemClick = (option: SearchFacetInputSelectListItemProps) => {\n    dispatch(searchActions.facetsUpdate({name: facet.name, value: option.name}))\n  }\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdate({name: facet.name, operatorType}))\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet?.operatorType ?? 'is'\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Box marginRight={1}>\n              <Button\n                fontSize={1}\n                iconRight={SelectIcon}\n                padding={2}\n                text={operators[selectedOperatorType].label}\n              />\n            </Box>\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* List */}\n      <MenuButton\n        button={\n          <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n        }\n        id=\"list\"\n        menu={\n          <Menu>\n            {options?.map((item) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(item)}\n                  padding={2}\n                  text={item.title}\n                />\n              )\n            })}\n          </Menu>\n        }\n        popover={popoverProps}\n      />\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetSelect\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputStringProps, SearchFacetOperatorType, WithId} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n  facet: WithId<SearchFacetInputStringProps>\n}\n\nconst SearchFacetString = ({facet}: Props) => {\n  // Redux\n  const dispatch = useDispatch()\n\n  const popoverProps = usePortalPopoverProps()\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n  }\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, value: e.target.value}))\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      {!operators[selectedOperatorType].hideInput && (\n        <Box marginLeft={1} style={{maxWidth: '125px'}}>\n          <TextInput\n            fontSize={1}\n            onChange={handleChange}\n            padding={2}\n            radius={2}\n            width={2}\n            value={facet?.value}\n          />\n        </Box>\n      )}\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetString\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {fonts, radius: themeRadius, space: themeSpace} = studioTheme\nconst themeTextSizes = fonts.text.sizes\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n  return {\n    control: (styles, {isDisabled, isFocused}) => {\n      let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n      if (isFocused) {\n        boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n        0 0 0 1px ${getSchemeColor(scheme, 'bg2')},\n        0 0 0 3px var(--card-focus-ring-color) !important`\n      }\n\n      return {\n        ...styles,\n        'backgroundColor': 'var(--card-bg-color)',\n        'color': 'inherit',\n        'border': 'none',\n        'borderRadius': themeRadius[2],\n        boxShadow,\n        'fontSize': themeTextSizes[1]!.fontSize,\n        'minHeight': '25px',\n        'opacity': isDisabled ? 0.5 : 'inherit',\n        'outline': 'none',\n        'transition': 'none',\n        '&:hover': {\n          boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n        },\n      }\n    },\n    input: (styles) => ({\n      ...styles,\n      color: 'var(--card-fg-color)',\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      fontSize: themeTextSizes[1]!.fontSize,\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    menuList: (styles) => ({\n      ...styles,\n      padding: 0,\n    }),\n    noOptionsMessage: (styles) => ({\n      ...styles,\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      fontSize: themeTextSizes[1]!.fontSize,\n      lineHeight: '1em',\n    }),\n    option: (styles, {isFocused}) => ({\n      ...styles,\n      'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n      'borderRadius': themeRadius[2],\n      'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n      'fontSize': themeTextSizes[1]!.fontSize,\n      'lineHeight': '1em',\n      'margin': 0,\n      'padding': rem(themeSpace[1]!),\n      '&:hover': {\n        backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n        color: getSchemeColor(scheme, 'bg'),\n      },\n    }),\n    placeholder: (styles) => ({\n      ...styles,\n      fontSize: themeTextSizes[1]!.fontSize,\n      marginLeft: rem(themeSpace[2]!),\n      paddingLeft: 0,\n    }),\n    singleValue: (styles) => ({\n      ...styles,\n      alignItems: 'center',\n      display: 'inline-flex',\n      height: '100%',\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    valueContainer: (styles) => ({\n      ...styles,\n      margin: 0,\n      padding: 0,\n    }),\n  }\n}\n\nconst ClearIndicator = (props: any) => {\n  return (\n    <components.ClearIndicator {...props}>\n      <Box\n        paddingRight={1}\n        style={{\n          transform: 'scale(0.85)',\n        }}\n      >\n        <Text muted size={0}>\n          <CloseIcon />\n        </Text>\n      </Box>\n    </components.ClearIndicator>\n  )\n}\n\nconst Menu = (props: any) => {\n  return (\n    <components.Menu {...props}>\n      <Card radius={1} shadow={2}>\n        {props.children}\n      </Card>\n    </components.Menu>\n  )\n}\n\nconst MenuList = (props: any) => {\n  const {children} = props\n\n  const MAX_ROWS = 5\n  const OPTION_HEIGHT = 33\n\n  if (Array.isArray(children)) {\n    const height =\n      children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n    return (\n      <Virtuoso\n        className=\"media__custom-scrollbar\"\n        itemContent={(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }}\n        style={{height}}\n        totalCount={children.length}\n      />\n    )\n  }\n  return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst NoOptionsMessage = (props: any) => {\n  return <components.NoOptionsMessage {...props}>{props.children}</components.NoOptionsMessage>\n}\n\nconst Option = (props: any) => {\n  return (\n    <Box padding={1}>\n      <components.Option {...props}>\n        <Box paddingY={1}>\n          <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n            {props.children}\n          </Text>\n        </Box>\n      </components.Option>\n    </Box>\n  )\n}\n\nconst SingleValue = (props: any) => {\n  return (\n    <components.SingleValue {...props}>\n      <Text size={1} textOverflow=\"ellipsis\">\n        {props.children}\n      </Text>\n    </components.SingleValue>\n  )\n}\n\nexport const reactSelectComponents = {\n  ClearIndicator,\n  DropdownIndicator: null,\n  IndicatorSeparator: null,\n  Menu,\n  MenuList,\n  NoOptionsMessage,\n  Option,\n  SingleValue,\n}\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\nimport Select from 'react-select'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {operators} from '../../config/searchFacets'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport {selectTags} from '../../modules/tags'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/single'\nimport type {\n  TagSelectOption,\n  SearchFacetInputSearchableProps,\n  SearchFacetOperatorType,\n  WithId,\n} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n  facet: WithId<SearchFacetInputSearchableProps>\n}\n\nconst SearchFacetTags = ({facet}: Props) => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const {excludeTagSlugs} = useToolOptions()\n  const tagsAll = useTypedSelector((state) => selectTags(state))\n  const tags =\n    excludeTagSlugs.length > 0\n      ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n      : tagsAll\n  const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n  const allTagOptions = getTagSelectOptions(tags)\n\n  const popoverProps = usePortalPopoverProps()\n\n  const handleChange = (option: TagSelectOption) => {\n    dispatch(\n      searchActions.facetsUpdateById({\n        id: facet.id,\n        value: option,\n      }),\n    )\n  }\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(\n      searchActions.facetsUpdateById({\n        id: facet.id,\n        operatorType,\n      }),\n    )\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      gap={4}\n                      style={{minWidth: '150px'}}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      {!operators[selectedOperatorType].hideInput && (\n        <Box marginX={1} style={{width: '160px'}}>\n          <Select\n            components={reactSelectComponents}\n            instanceId=\"facet-searchable\"\n            isClearable\n            isDisabled={tagsFetching}\n            isSearchable\n            name=\"tags\"\n            noOptionsMessage={() => 'No tags'}\n            onChange={(value: any) => handleChange(value as TagSelectOption)}\n            options={allTagOptions}\n            placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n            styles={reactSelectStyles(scheme)}\n            value={facet?.value}\n          />\n        </Box>\n      )}\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetTags\n","import {Box, Flex, Inline, rem, type Theme} from '@sanity/ui'\nimport {styled, css} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport SearchFacetNumber from '../SearchFacetNumber'\nimport SearchFacetSelect from '../SearchFacetSelect'\nimport SearchFacetString from '../SearchFacetString'\nimport SearchFacetTags from '../SearchFacetTags'\n\ntype Props = {\n  layout?: 'inline' | 'stack'\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst StackContainer = styled(Flex)(({theme}: {theme: Theme}) => {\n  return css`\n    > * {\n      margin-bottom: ${rem(\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.space[2]!,\n      )};\n    }\n  `\n})\n\nconst SearchFacets = (props: Props) => {\n  const {layout = 'inline'} = props\n\n  // Redux\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n\n  const Items = searchFacets.map((facet) => {\n    const key = facet.id\n    if (facet.type === 'number') {\n      return <SearchFacetNumber facet={facet} key={key} />\n    }\n\n    if (facet.type === 'searchable') {\n      return <SearchFacetTags facet={facet} key={key} />\n    }\n\n    if (facet.type === 'select') {\n      return <SearchFacetSelect facet={facet} key={key} />\n    }\n\n    if (facet.type === 'string') {\n      return <SearchFacetString facet={facet} key={key} />\n    }\n\n    return null\n  })\n\n  if (layout === 'inline') {\n    if (searchFacets.length === 0) {\n      return null\n    }\n\n    return (\n      <Box marginBottom={2}>\n        <Inline gap={2}>{Items}</Inline>\n      </Box>\n    )\n  }\n\n  if (layout === 'stack') {\n    return (\n      <StackContainer align=\"flex-start\" direction=\"column\">\n        {Items}\n      </StackContainer>\n    )\n  }\n\n  throw Error('Invalid layout')\n}\n\nexport default SearchFacets\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Button, Flex} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuGroup, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {FACETS} from '../../constants'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetDivider, SearchFacetGroup, SearchFacetInputProps} from '../../types'\n\nconst SearchFacetsControl = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n  const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n  const popoverProps = usePortalPopoverProps()\n\n  const {creditLine} = useToolOptions()\n\n  const isTool = !selectedDocument\n\n  const filteredFacets = FACETS\n    // Filter facets based on current context, whether it's invoked as a tool, or via selection through via custom asset source.\n    .filter((facet) => {\n      // Remove credit line filter if it's not enabled\n      if (!creditLine?.enabled && facet?.type === 'string' && facet?.name === 'creditLine') {\n        return false\n      }\n\n      if (facet.type === 'group' || facet.type === 'divider') {\n        return true\n      }\n\n      if (isTool) {\n        return !facet?.selectOnly\n      }\n\n      const matchingAssetTypes = facet.assetTypes.filter((assetType) =>\n        assetTypes.includes(assetType),\n      )\n      return matchingAssetTypes.length > 0\n    })\n    // Remove adjacent and leading / trailing dividers\n    .filter((facet, index, facets) => {\n      const previousFacet = facets[index - 1]\n      // Ignore leading + trailing dividers\n      if (facet.type === 'divider' && (index === 0 || index === facets.length - 1)) {\n        return false\n      }\n      // Ignore adjacent dividers\n      if (facet.type === 'divider' && previousFacet?.type === 'divider') {\n        return false\n      }\n      return true\n    })\n\n  const hasSearchFacets = filteredFacets.length > 0\n\n  const renderMenuFacets = (\n    facets: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[],\n    level: number = 0,\n  ) => {\n    return (\n      <>\n        {facets?.map((facet, index) => {\n          if (facet.type === 'divider') {\n            return <MenuDivider key={index} />\n          }\n\n          // Recursively render menu facets\n          if (facet.type === 'group') {\n            return (\n              <MenuGroup key={`group-${level}-${index}`} text={facet.title} title={facet.title}>\n                {renderMenuFacets(facet.facets, level + 1)}\n              </MenuGroup>\n            )\n          }\n\n          if (facet) {\n            const disabled =\n              !facet.operatorTypes && !!searchFacets.find((v) => v.name === facet.name)\n\n            return (\n              <MenuItem\n                disabled={disabled}\n                fontSize={1}\n                key={facet.name}\n                onClick={() => dispatch(searchActions.facetsAdd({facet}))}\n                padding={2}\n                text={facet.title}\n              />\n            )\n          }\n\n          return null\n        })}\n      </>\n    )\n  }\n\n  return (\n    <Flex>\n      {/* Add filter button */}\n      <MenuButton\n        button={\n          <Button\n            disabled={!hasSearchFacets}\n            fontSize={1}\n            icon={AddIcon}\n            mode=\"bleed\"\n            gap={2}\n            text=\"Add filter\"\n            tone=\"primary\"\n          />\n        }\n        id=\"facets\"\n        menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n        popover={{\n          ...popoverProps,\n          placement: 'right-start',\n        }}\n      />\n\n      {/* Clear facets button */}\n      {searchFacets.length > 0 && (\n        <Button\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={() => dispatch(searchActions.facetsClear())}\n          text=\"Clear\"\n        />\n      )}\n    </Flex>\n  )\n}\n\nexport default SearchFacetsControl\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogSearchFacetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogSearchFacetsProps\n}\n\nconst DialogSearchFacets = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog animate header=\"Filters\" id={id} onClose={handleClose} width={1}>\n      <Box padding={3}>\n        <SearchFacets layout=\"stack\" />\n        <SearchFacetsControl />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogSearchFacets\n","import {Box, Flex} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {tagsActions} from '../../modules/tags'\nimport type {DialogTagCreateProps, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogTagCreateProps\n}\n\nconst DialogTagCreate = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  const dispatch = useDispatch()\n\n  const creating = useTypedSelector((state) => state.tags.creating)\n  const creatingError = useTypedSelector((state) => state.tags.creatingError)\n\n  const {\n    // Read the formState before render to subscribe the form state through Proxy\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    setError,\n  } = useForm<TagFormData>({\n    defaultValues: {\n      name: '',\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<TagFormData>(tagFormSchema),\n  })\n\n  const formUpdating = creating\n\n  const handleClose = () => {\n    dispatch(dialogActions.clear())\n  }\n\n  // - submit react-hook-form\n  const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n\n    dispatch(tagsActions.createRequest({name: sanitizedFormData['name']}))\n  }\n\n  useEffect(() => {\n    if (creatingError) {\n      setError('name', {\n        message: creatingError?.message,\n      })\n    }\n  }, [creatingError, setError])\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"flex-end\">\n        {/* Submit button */}\n        <FormSubmitButton\n          disabled={formUpdating || !isDirty || !isValid}\n          isValid={isValid}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Create Tag\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      {/* Form fields */}\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogTagCreate\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useState} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectTagById, tagsActions} from '../../modules/tags'\nimport type {DialogTagEditProps, Tag, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogTagEditProps\n}\n\nconst DialogTagEdit = (props: Props) => {\n  const {\n    children,\n    dialog: {id, tagId},\n  } = props\n\n  const client = useVersionedClient()\n\n  const dispatch = useDispatch()\n  const tagItem = useTypedSelector((state) => selectTagById(state, String(tagId))) // TODO: double check string cast\n\n  // - Generate a snapshot of the current tag\n  const [tagSnapshot, setTagSnapshot] = useState(tagItem?.tag)\n\n  const currentTag = tagItem ? tagItem?.tag : tagSnapshot\n  const generateDefaultValues = useCallback(\n    (tag?: Tag) => ({\n      name: tag?.name?.current || '',\n    }),\n    [],\n  )\n\n  const {\n    // Read the formState before render to subscribe the form state through Proxy\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    reset,\n    setError,\n  } = useForm<TagFormData>({\n    defaultValues: generateDefaultValues(tagItem?.tag),\n    mode: 'onChange',\n    resolver: zodFormResolver<TagFormData>(tagFormSchema),\n  })\n\n  const formUpdating = !tagItem || tagItem?.updating\n\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id}))\n  }\n\n  // Submit react-hook-form\n  const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n    if (!tagItem?.tag) {\n      return\n    }\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      tagsActions.updateRequest({\n        closeDialogId: tagItem?.tag?._id,\n        formData: {\n          name: {\n            _type: 'slug',\n            current: sanitizedFormData['name'],\n          },\n        },\n        tag: tagItem?.tag,\n      }),\n    )\n  }\n\n  const handleDelete = () => {\n    if (!tagItem?.tag) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteTag({\n        closeDialogId: tagItem?.tag?._id,\n        tag: tagItem?.tag,\n      }),\n    )\n  }\n\n  const handleTagUpdate = useCallback(\n    (update: MutationEvent) => {\n      const {result, transition} = update\n      if (result && transition === 'update') {\n        // Regenerate snapshot\n        setTagSnapshot(result as Tag)\n        // Reset react-hook-form\n        reset(generateDefaultValues(result as Tag))\n      }\n    },\n    [reset, generateDefaultValues],\n  )\n\n  useEffect(() => {\n    if (tagItem?.error) {\n      setError('name', {\n        message: tagItem.error?.message,\n      })\n    }\n  }, [setError, tagItem?.error])\n\n  // - Listen for asset mutations and update snapshot\n  useEffect(() => {\n    if (!tagItem?.tag) {\n      return undefined\n    }\n\n    // Remember that Sanity listeners ignore joins, order clauses and projections\n    const subscriptionAsset = client\n      .listen(groq`*[_id == $id]`, {id: tagItem?.tag._id})\n      .subscribe(handleTagUpdate)\n\n    return () => {\n      subscriptionAsset?.unsubscribe()\n    }\n  }, [client, handleTagUpdate, tagItem?.tag])\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"space-between\">\n        {/* Delete button */}\n        <Button\n          disabled={formUpdating}\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={handleDelete}\n          text=\"Delete\"\n          tone=\"critical\"\n        />\n\n        {/* Submit button */}\n        <FormSubmitButton\n          disabled={formUpdating || !isDirty || !isValid}\n          isValid={isValid}\n          lastUpdated={tagItem?.tag?._updatedAt}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )\n\n  if (!currentTag) {\n    return null\n  }\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Edit Tag\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      {/* Form fields */}\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Deleted notification */}\n        {!tagItem && (\n          <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n            <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n          </Card>\n        )}\n\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogTagEdit\n","import {ArrowDownIcon} from '@sanity/icons/ArrowDown'\nimport {ArrowUpIcon} from '@sanity/icons/ArrowUp'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {inputs} from '../../config/searchFacets'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {searchActions, selectIsSearchFacetTag} from '../../modules/search'\nimport type {SearchFacetInputSearchableProps, TagActions, TagItem} from '../../types'\n\ntype Props = {\n  actions?: TagActions[]\n  tag: TagItem\n}\n\nconst TagContainer = styled(Flex)`\n  height: ${PANEL_HEIGHT}px;\n`\n\nconst ButtonContainer = styled(Flex)`\n  @media (pointer: fine) {\n    visibility: hidden;\n  }\n\n  @media (hover: hover) and (pointer: fine) {\n    ${TagContainer}:hover & {\n      visibility: visible;\n    }\n  }\n`\n\ntype TagButtonProps = {\n  disabled?: boolean\n  icon: ReactNode\n  onClick: () => void\n  tone?: 'critical' | 'primary'\n  tooltip: string\n}\n\nconst TagButton = (props: TagButtonProps) => {\n  const {disabled, icon, onClick, tone, tooltip} = props\n\n  return (\n    <Tooltip\n      animate\n      content={\n        <Container padding={2} width={0}>\n          <Text muted size={1}>\n            {tooltip}\n          </Text>\n        </Container>\n      }\n      disabled={'ontouchstart' in window}\n      placement=\"top\"\n      portal\n    >\n      <Button\n        disabled={disabled}\n        fontSize={1}\n        icon={icon}\n        mode=\"bleed\"\n        onClick={onClick}\n        padding={2}\n        tone={tone}\n      />\n    </Tooltip>\n  )\n}\n\nconst Tag = (props: Props) => {\n  const {actions, tag} = props\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const isSearchFacetTag = useTypedSelector((state) => selectIsSearchFacetTag(state, tag?.tag?._id))\n\n  // Callbacks\n  const handleSearchFacetTagRemove = () => {\n    dispatch(searchActions.facetsRemoveByTag({tagId: tag.tag._id}))\n  }\n\n  const handleShowAddTagToAssetsDialog = () => {\n    dispatch(dialogActions.showConfirmAssetsTagAdd({assetsPicked, tag: tag.tag}))\n  }\n\n  const handleShowRemoveTagFromAssetsDialog = () => {\n    dispatch(dialogActions.showConfirmAssetsTagRemove({assetsPicked, tag: tag.tag}))\n  }\n\n  const handleShowTagDeleteDialog = () => {\n    dispatch(dialogActions.showConfirmDeleteTag({tag: tag.tag}))\n  }\n\n  const handleShowTagEditDialog = () => {\n    dispatch(DIALOG_ACTIONS.showTagEdit({tagId: tag?.tag?._id}))\n  }\n\n  const handleSearchFacetTagAddOrUpdate = () => {\n    const searchFacet = {\n      ...inputs.tag,\n      value: {\n        label: tag?.tag?.name?.current,\n        value: tag?.tag?._id,\n      },\n    } as SearchFacetInputSearchableProps\n\n    if (isSearchFacetTag) {\n      dispatch(\n        searchActions.facetsUpdate({\n          name: 'tag',\n          operatorType: 'references',\n          value: searchFacet.value,\n        }),\n      )\n    } else {\n      dispatch(searchActions.facetsAdd({facet: searchFacet}))\n    }\n  }\n\n  return (\n    <TagContainer align=\"center\" flex={1} justify=\"space-between\" paddingLeft={3}>\n      <Box flex={1}>\n        <Text\n          muted\n          size={1}\n          style={{\n            opacity: tag?.updating ? 0.5 : 1.0,\n            userSelect: 'none',\n          }}\n          textOverflow=\"ellipsis\"\n        >\n          {tag?.tag?.name?.current}\n        </Text>\n      </Box>\n\n      <ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n        {/* Search facet toggle */}\n        {actions?.includes('search') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n            onClick={\n              isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n            }\n            tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n          />\n        )}\n        {/* Edit icon */}\n        {actions?.includes('edit') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<EditIcon />}\n            onClick={handleShowTagEditDialog}\n            tone=\"primary\"\n            tooltip=\"Edit tag\"\n          />\n        )}\n        {/* Apply to all */}\n        {actions?.includes('applyAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowUpIcon />}\n            onClick={handleShowAddTagToAssetsDialog}\n            tone=\"primary\"\n            tooltip=\"Add tag to selected assets\"\n          />\n        )}\n        {/* Remove from all */}\n        {actions?.includes('removeAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowDownIcon />}\n            onClick={handleShowRemoveTagFromAssetsDialog}\n            tone=\"critical\"\n            tooltip=\"Remove tag from selected assets\"\n          />\n        )}\n\n        {/* Delete icon */}\n        {actions?.includes('delete') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<TrashIcon />}\n            onClick={handleShowTagDeleteDialog}\n            tone=\"critical\"\n            tooltip=\"Delete tag\"\n          />\n        )}\n      </ButtonContainer>\n    </TagContainer>\n  )\n}\n\nexport default Tag\n","import {Flex, Label} from '@sanity/ui'\nimport {memo, useState} from 'react'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport type {TagActions, TagItem} from '../../types'\nimport Tag from '../Tag'\n\nconst VirtualRow = memo(\n  ({\n    isScrolling,\n    item,\n  }: {\n    isScrolling?: boolean\n    item:\n      | string\n      | (TagItem & {\n          actions: TagActions[]\n        })\n  }) => {\n    // Render label\n    if (typeof item === 'string') {\n      return (\n        <Flex\n          align=\"center\"\n          justify=\"space-between\"\n          key={item}\n          paddingX={3}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Label size={0}>{item}</Label>\n        </Flex>\n      )\n    }\n\n    // Render tag - only display actions if we're not in the process of scrolling\n    return <Tag actions={isScrolling ? undefined : item.actions} key={item.tag?._id} tag={item} />\n  },\n)\n\nconst TagsVirtualized = ({tags}: {tags: TagItem[]}) => {\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n\n  // State\n  const [isScrolling, setIsScrolling] = useState(false)\n\n  // TODO: refactor, there's most certainly a more performant way to do this\n\n  // Filter out all tag IDS used (across all) and dedupe\n  const pickedTagIds = assetsPicked?.reduce((acc: string[], val) => {\n    const assetTagIds = val?.asset?.opt?.media?.tags?.map((tag) => tag._ref) || []\n    acc = acc.concat(assetTagIds)\n    return acc\n  }, [])\n  const pickedTagIdsUnique = [...new Set(pickedTagIds)]\n\n  // Segment tags into two buckets:\n  // 1. those which exist in all picked assets ('applied to all')\n  // 2. those which exist in some picked assets ('applied to some')\n  const tagIdsSegmented = pickedTagIdsUnique.reduce(\n    (acc: {appliedToAll: string[]; appliedToSome: string[]}, tagId) => {\n      const tagIsInEveryAsset = assetsPicked.every((assetItem) => {\n        const tagIndex =\n          assetItem.asset.opt?.media?.tags?.findIndex((tag) => tag._ref === tagId) ?? -1\n        return tagIndex >= 0\n      })\n\n      if (tagIsInEveryAsset) {\n        acc.appliedToAll.push(tagId)\n      } else {\n        acc.appliedToSome.push(tagId)\n      }\n\n      return acc\n    },\n    {\n      appliedToAll: [],\n      appliedToSome: [],\n    },\n  )\n\n  const tagsAppliedToAll = tags\n    .filter((tag) => tagIdsSegmented.appliedToAll.includes(tag.tag._id))\n    .map((tagItem) => ({\n      ...tagItem,\n      actions: ['delete', 'edit', 'removeAll', 'search'] as TagActions[],\n    }))\n  const tagsAppliedToSome = tags\n    .filter((tag) => tagIdsSegmented.appliedToSome.includes(tag.tag._id))\n    .map((tagItem) => ({\n      ...tagItem,\n      actions: ['applyAll', 'delete', 'edit', 'removeAll', 'search'] as TagActions[],\n    }))\n  const tagsUnused = tags\n    .filter((tag) => !pickedTagIdsUnique.includes(tag.tag._id))\n    .map((tagItem) => ({\n      ...tagItem,\n      actions: ['applyAll', 'delete', 'edit', 'search'] as TagActions[],\n    }))\n\n  let items: (\n    | string\n    | (TagItem & {\n        actions: TagActions[]\n      })\n  )[] = []\n  if (assetsPicked.length === 0) {\n    items = tags.map((tagItem) => ({\n      ...tagItem,\n      actions: ['delete', 'edit', 'search'] as TagActions[],\n    }))\n  } else {\n    if (tagsAppliedToAll?.length > 0) {\n      items = [\n        ...items, //\n        assetsPicked.length === 1 ? 'Used' : 'Used by all',\n        ...tagsAppliedToAll,\n      ]\n    }\n    if (tagsAppliedToSome?.length > 0) {\n      items = [\n        ...items, //\n        'Used by some',\n        ...tagsAppliedToSome,\n      ]\n    }\n    if (tagsUnused?.length > 0) {\n      items = [\n        ...items, //\n        'Unused',\n        ...tagsUnused,\n      ]\n    }\n  }\n\n  return (\n    <Virtuoso\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        if (typeof item === 'string') {\n          return item\n        }\n        return item!.tag._id\n      }}\n      isScrolling={setIsScrolling}\n      itemContent={(index) => {\n        return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n      }}\n      style={{flex: 1, overflowX: 'hidden'}}\n      totalCount={items.length}\n    />\n  )\n}\n\nexport default TagsVirtualized\n","import {ComposeIcon} from '@sanity/icons/Compose'\nimport {Box, Button, Flex, Inline, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  allowCreate?: boolean\n  light?: boolean\n  title: string\n}\n\nconst TagViewHeader = ({allowCreate, light, title}: Props) => {\n  const scheme = useColorSchemeValue()\n\n  const dispatch = useDispatch()\n  const tagsCreating = useTypedSelector((state) => state.tags.creating)\n  const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n  const handleTagCreate = () => {\n    dispatch(DIALOG_ACTIONS.showTagCreate())\n  }\n\n  return (\n    <>\n      <Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingLeft={3}\n        style={{\n          background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Inline gap={2}>\n          <Label size={0}>{title}</Label>\n          {tagsFetching && (\n            <Label size={0} style={{opacity: 0.3}}>\n              Loading...\n            </Label>\n          )}\n        </Inline>\n        {/* Create new tag button */}\n        {allowCreate && (\n          <Box marginRight={1}>\n            <Button\n              disabled={tagsCreating}\n              fontSize={1} //\n              icon={ComposeIcon}\n              mode=\"bleed\"\n              onClick={handleTagCreate}\n              style={{\n                background: 'transparent',\n                boxShadow: 'none',\n              }}\n            />\n          </Box>\n        )}\n      </Flex>\n    </>\n  )\n}\n\nexport default TagViewHeader\n","import {Box, Flex, Text} from '@sanity/ui'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPickedLength} from '../../modules/assets'\nimport {selectTags} from '../../modules/tags'\nimport TagsVirtualized from '../TagsVirtualized'\nimport TagViewHeader from '../TagViewHeader'\n\nconst TagView = () => {\n  const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n  const {excludeTagSlugs} = useToolOptions()\n  const tagsAll = useTypedSelector(selectTags)\n  const tags =\n    excludeTagSlugs.length > 0\n      ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n      : tagsAll\n  const fetching = useTypedSelector((state) => state.tags.fetching)\n  const fetchCount = useTypedSelector((state) => state.tags.fetchCount)\n  const fetchComplete = fetchCount !== -1\n  const hasTags = !fetching && tags?.length > 0\n  const hasPicked = !!(numPickedAssets > 0)\n\n  return (\n    <Flex direction=\"column\" flex={1} height=\"fill\">\n      <TagViewHeader\n        allowCreate\n        light={hasPicked}\n        title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n      />\n\n      {fetchComplete && !hasTags && (\n        <Box padding={3}>\n          <Text muted size={1}>\n            <em>No tags</em>\n          </Text>\n        </Box>\n      )}\n\n      {hasTags && <TagsVirtualized tags={tags} />}\n    </Flex>\n  )\n}\n\nexport default TagView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogTagsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport TagView from '../TagView'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogTagsProps\n}\n\nconst DialogTags = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog animate header=\"All Tags\" id={id} onClose={handleClose} width={1}>\n      <Box\n        style={{\n          height: '100%',\n          minHeight: '420px', // explicit height required as <TagView> is virtualized\n        }}\n      >\n        <TagView />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogTags\n","import useTypedSelector from '../../hooks/useTypedSelector'\nimport type {Dialog} from '../../types'\nimport DialogAssetEdit from '../DialogAssetEdit'\nimport DialogAllAssets from '../DialogAssetsOverView'\nimport DialogConfirm from '../DialogConfirm'\nimport DialogFolderCreate from '../DialogFolderCreate'\nimport DialogFolderMove from '../DialogFolderMove'\nimport DialogFolderRename from '../DialogFolderRename'\nimport DialogFolders from '../DialogFolders'\nimport DialogSearchFacets from '../DialogSearchFacets'\nimport DialogTagCreate from '../DialogTagCreate'\nimport DialogTagEdit from '../DialogTagEdit'\nimport DialogTags from '../DialogTags'\n\nconst Dialogs = () => {\n  // Redux\n  const currentDialogs = useTypedSelector((state) => state.dialog.items)\n\n  const renderDialogs = (dialogs: Dialog[], index: number) => {\n    if (dialogs.length === 0 || index >= dialogs.length) {\n      return null\n    }\n\n    const dialog = dialogs[index]!\n    const childDialogs = renderDialogs(dialogs, index + 1)\n\n    if (dialog.type === 'assetEdit') {\n      return (\n        <DialogAssetEdit dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogAssetEdit>\n      )\n    }\n\n    if (dialog.type === 'confirm') {\n      return (\n        <DialogConfirm dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogConfirm>\n      )\n    }\n\n    if (dialog.type === 'folderCreate') {\n      return (\n        <DialogFolderCreate dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolderCreate>\n      )\n    }\n\n    if (dialog.type === 'folderMove') {\n      return (\n        <DialogFolderMove dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolderMove>\n      )\n    }\n\n    if (dialog.type === 'folderRename') {\n      return (\n        <DialogFolderRename dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolderRename>\n      )\n    }\n\n    if (dialog.type === 'folders') {\n      return (\n        <DialogFolders dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolders>\n      )\n    }\n\n    if (dialog.type === 'searchFacets') {\n      return (\n        <DialogSearchFacets dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogSearchFacets>\n      )\n    }\n\n    if (dialog.type === 'tagCreate') {\n      return (\n        <DialogTagCreate dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogTagCreate>\n      )\n    }\n\n    if (dialog.type === 'tagEdit') {\n      return (\n        <DialogTagEdit dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogTagEdit>\n      )\n    }\n\n    if (dialog.type === 'tags') {\n      return (\n        <DialogTags dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogTags>\n      )\n    }\n\n    if (dialog.type === 'dialogAllAssets') {\n      return (\n        <DialogAllAssets dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogAllAssets>\n      )\n    }\n\n    return null\n  }\n\n  return renderDialogs(currentDialogs, 0)\n}\n\nexport default Dialogs\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect} from 'react'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\nconst Notifications = () => {\n  const items = useTypedSelector((state) => state.notifications.items)\n  const toast = useToast()\n\n  useEffect(() => {\n    if (items.length > 0) {\n      const lastItem = items[items.length - 1]!\n      toast.push({\n        closable: true,\n        status: lastItem.status,\n        title: lastItem.title,\n      })\n    }\n  }, [items, toast])\n\n  return null\n}\n\nexport default Notifications\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\n\ntype DebugReducerState = {\n  badConnection: boolean\n  enabled: boolean\n}\n\nconst initialState = {\n  badConnection: false,\n  enabled: false,\n} as DebugReducerState\n\nconst debugSlice = createSlice({\n  name: 'debug',\n  initialState,\n  reducers: {\n    setBadConnection(state, action: PayloadAction<boolean>) {\n      state.badConnection = action.payload\n    },\n    toggleEnabled(state) {\n      state.enabled = !state.enabled\n    },\n  },\n})\n\nexport const debugActions = {...debugSlice.actions}\n\nexport default debugSlice.reducer\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\nimport type {UnknownAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {bufferTime, filter, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError, ImageAsset, MyEpic} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {uploadsActions} from '../uploads'\n\ntype Notification = {\n  asset?: ImageAsset\n  status?: 'error' | 'warning' | 'success' | 'info'\n  title?: string\n}\n\ntype NotificationsReducerState = {\n  items: Notification[]\n}\n\nfunction messageFromGenericErrorPayload(payload: unknown): string {\n  if (!payload || typeof payload !== 'object') {\n    return 'Unknown error'\n  }\n  if (\n    'error' in payload &&\n    payload.error &&\n    typeof payload.error === 'object' &&\n    payload.error !== null &&\n    'message' in payload.error\n  ) {\n    return String((payload.error as HttpError).message)\n  }\n  if ('message' in payload && typeof (payload as HttpError).message === 'string') {\n    return String((payload as HttpError).message)\n  }\n  return 'Unknown error'\n}\n\nconst initialState = {\n  items: [],\n} as NotificationsReducerState\n\nconst notificationsSlice = createSlice({\n  name: 'notifications',\n  initialState,\n  reducers: {\n    add(state, action: PayloadAction<Notification>) {\n      const {asset, status, title} = action.payload\n      state.items.push({\n        asset,\n        status,\n        title,\n      })\n    },\n  },\n})\n\n// Epics\n\nexport const notificationsAssetsDeleteCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.deleteComplete.match),\n    mergeMap((action) => {\n      const {assetIds} = action.payload\n      const deletedCount = assetIds.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `${deletedCount} ${pluralize('asset', deletedCount)} deleted`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsDeleteErrorEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.deleteError.match),\n    mergeMap((action) => {\n      const {assetIds} = action.payload\n      const count = assetIds.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'error',\n          title: `Unable to delete ${count} ${pluralize(\n            'asset',\n            count,\n          )}. Please review any asset errors and try again.`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsUploadCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(uploadsActions.checkComplete.match),\n    mergeMap((action) => {\n      const {results} = action.payload\n\n      const count = Object.keys(results).length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `Uploaded ${count} ${pluralize('asset', count)}`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsTagsAddCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(ASSETS_ACTIONS.tagsAddComplete.match),\n    mergeMap((action) => {\n      const count = action?.payload?.assets?.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `Tag added to ${count} ${pluralize('asset', count)}`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsTagsRemoveCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(ASSETS_ACTIONS.tagsRemoveComplete.match),\n    mergeMap((action) => {\n      const count = action?.payload?.assets?.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `Tag removed from ${count} ${pluralize('asset', count)}`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsUpdateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.updateComplete.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const updatedCount = actions.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `${updatedCount} ${pluralize('asset', updatedCount)} updated`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsGenericErrorEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.fetchError.type,\n      assetsActions.updateError.type,\n      tagsActions.createError.type,\n      tagsActions.deleteError.type,\n      tagsActions.fetchError.type,\n      tagsActions.updateError.type,\n      foldersActions.createError.type,\n      foldersActions.deleteError.type,\n      foldersActions.renameError.type,\n      uploadsActions.uploadError.type,\n    ),\n    mergeMap((action: UnknownAction) => {\n      const title = `An error occurred: ${messageFromGenericErrorPayload(action['payload'])}`\n      return of(\n        notificationsSlice.actions.add({\n          status: 'error',\n          title,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsTagCreateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.createComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag created`}))),\n  )\n\nexport const notificationsTagDeleteCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.deleteComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag deleted`}))),\n  )\n\nexport const notificationsTagUpdateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.updateComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag updated`}))),\n  )\n\nexport const notificationsFolderCreateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(foldersActions.createComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder created`}))),\n  )\n\nexport const notificationsFolderDeleteCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(foldersActions.deleteComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder deleted`}))),\n  )\n\nexport const notificationsFolderRenameCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(foldersActions.renameComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder renamed`}))),\n  )\n\nexport const notificationsActions = {...notificationsSlice.actions}\n\nexport default notificationsSlice.reducer\n","import {createSlice} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityDocument, SanityImageAssetDocument} from '@sanity/client'\n\ntype SelectedReducerState = {\n  assets: (SanityAssetDocument | SanityImageAssetDocument)[]\n  document?: SanityDocument\n  documentAssetIds?: string[]\n}\n\nconst initialState = {\n  assets: [],\n  document: undefined,\n  documentAssetIds: [],\n} as SelectedReducerState\n\nconst selectedSlice = createSlice({\n  name: 'selected',\n  initialState,\n  reducers: {},\n})\n\nexport default selectedSlice.reducer\n","import {type Reducer, type StateFromReducersMapObject, combineReducers} from '@reduxjs/toolkit'\nimport {combineEpics} from 'redux-observable'\n\nimport assetsReducer, {\n  assetsDeleteEpic,\n  assetsFetchAfterDeleteAllEpic,\n  assetsFetchEpic,\n  assetsFolderSetEpic,\n  assetsFolderSetRefreshEpic,\n  assetsFetchNextPageEpic,\n  assetsFetchPageIndexEpic,\n  assetsListenerCreateQueueEpic,\n  assetsListenerDeleteQueueEpic,\n  assetsListenerUpdateQueueEpic,\n  assetsOrderSetEpic,\n  assetsSearchEpic,\n  assetsSortEpic,\n  assetsTagsAddEpic,\n  assetsTagsRemoveEpic,\n  assetsUnpickEpic,\n  assetsUpdateEpic,\n  assetsUpdateImageReferencesEpic,\n} from './assets'\nimport debugReducer from './debug'\nimport dialogReducer, {\n  dialogClearOnAssetUpdateEpic,\n  dialogTagCreateEpic,\n  dialogTagDeleteEpic,\n} from './dialog'\nimport foldersReducer, {\n  foldersCurrentFolderEpic,\n  foldersCreateEpic,\n  foldersDeleteEpic,\n  foldersFetchEpic,\n  foldersRefreshEpic,\n  foldersRenameEpic,\n} from './folders'\nimport notificationsReducer, {\n  notificationsAssetsDeleteErrorEpic,\n  notificationsAssetsDeleteCompleteEpic,\n  notificationsAssetsTagsAddCompleteEpic,\n  notificationsAssetsTagsRemoveCompleteEpic,\n  notificationsAssetsUpdateCompleteEpic,\n  notificationsFolderCreateCompleteEpic,\n  notificationsFolderDeleteCompleteEpic,\n  notificationsFolderRenameCompleteEpic,\n  notificationsGenericErrorEpic,\n  notificationsTagCreateCompleteEpic,\n  notificationsTagDeleteCompleteEpic,\n  notificationsTagUpdateCompleteEpic,\n} from './notifications'\nimport searchReducer, {searchFacetTagUpdateEpic} from './search'\nimport selectedReducer from './selected'\nimport tagsReducer, {\n  tagsCreateEpic,\n  tagsDeleteEpic,\n  tagsFetchEpic,\n  tagsListenerCreateQueueEpic,\n  tagsListenerDeleteQueueEpic,\n  tagsListenerUpdateQueueEpic,\n  tagsSortEpic,\n  tagsUpdateEpic,\n} from './tags'\nimport uploadsReducer, {\n  uploadsAssetStartEpic,\n  uploadsAssetUploadEpic,\n  uploadsCheckRequestEpic,\n  uploadsCompleteQueueEpic,\n} from './uploads'\n\nexport const rootEpic = combineEpics(\n  assetsDeleteEpic,\n  assetsFetchEpic,\n  assetsFetchAfterDeleteAllEpic,\n  assetsFetchNextPageEpic,\n  assetsFetchPageIndexEpic,\n  assetsFolderSetEpic,\n  assetsFolderSetRefreshEpic,\n  assetsListenerCreateQueueEpic,\n  assetsListenerDeleteQueueEpic,\n  assetsListenerUpdateQueueEpic,\n  assetsOrderSetEpic,\n  assetsSearchEpic,\n  assetsSortEpic,\n  assetsTagsAddEpic,\n  assetsTagsRemoveEpic,\n  assetsUnpickEpic,\n  assetsUpdateEpic,\n  assetsUpdateImageReferencesEpic,\n  dialogClearOnAssetUpdateEpic,\n  dialogTagCreateEpic,\n  dialogTagDeleteEpic,\n  foldersCurrentFolderEpic,\n  foldersCreateEpic,\n  foldersDeleteEpic,\n  foldersFetchEpic,\n  foldersRefreshEpic,\n  foldersRenameEpic,\n  notificationsAssetsDeleteErrorEpic,\n  notificationsAssetsDeleteCompleteEpic,\n  notificationsAssetsTagsAddCompleteEpic,\n  notificationsAssetsTagsRemoveCompleteEpic,\n  notificationsAssetsUpdateCompleteEpic,\n  notificationsFolderCreateCompleteEpic,\n  notificationsFolderDeleteCompleteEpic,\n  notificationsFolderRenameCompleteEpic,\n  notificationsGenericErrorEpic,\n  notificationsTagCreateCompleteEpic,\n  notificationsTagDeleteCompleteEpic,\n  notificationsTagUpdateCompleteEpic,\n  searchFacetTagUpdateEpic,\n  tagsCreateEpic,\n  tagsDeleteEpic,\n  tagsFetchEpic,\n  tagsListenerCreateQueueEpic,\n  tagsListenerDeleteQueueEpic,\n  tagsListenerUpdateQueueEpic,\n  tagsSortEpic,\n  tagsUpdateEpic,\n  uploadsAssetStartEpic,\n  uploadsAssetUploadEpic,\n  uploadsCheckRequestEpic,\n  uploadsCompleteQueueEpic,\n)\n\nconst reducers = {\n  assets: assetsReducer,\n  debug: debugReducer,\n  dialog: dialogReducer,\n  folders: foldersReducer,\n  notifications: notificationsReducer,\n  search: searchReducer,\n  selected: selectedReducer,\n  tags: tagsReducer,\n  uploads: uploadsReducer,\n}\n\ntype ReducersMapObject = typeof reducers\n\n// Workaround to avoid `$CombinedState` ts errors\n// source: https://github.com/reduxjs/redux-toolkit/issues/2068#issuecomment-1130796500\n// TODO: remove once we use `redux-toolkit` v2\nexport const rootReducer: Reducer<StateFromReducersMapObject<ReducersMapObject>> =\n  combineReducers(reducers)\n","import type {SanityDocument} from '@sanity/client'\n\nconst isPlainObject = (value: any) =>\n  value !== null && typeof value === 'object' && !Array.isArray(value)\n\n// Recursively search node for any linked asset ids (`asset._type === 'reference'`)\nconst getAssetIds = (node: Record<string, any>, acc: string[] = []) => {\n  if (Array.isArray(node)) {\n    node.forEach((v) => {\n      getAssetIds(v, acc)\n    })\n  }\n\n  if (isPlainObject(node)) {\n    if (node?.['asset']?._type === 'reference' && node?.['asset']?._ref) {\n      acc.push(node['asset']._ref)\n    }\n\n    Object.values(node).forEach((val) => {\n      getAssetIds(val, acc)\n    })\n  }\n\n  return acc\n}\n\n// Retrieve all linked asset ids from a Sanity document\nconst getDocumentAssetIds = (document: SanityDocument): string[] => {\n  const assetIds = getAssetIds(document)\n\n  // Sort and dedupe\n  return [...new Set(assetIds.sort())]\n}\n\nexport default getDocumentAssetIds\n","import {SUPPORTED_ASSET_TYPES} from '../constants'\nimport type {AssetType} from '../types'\n\n/**\n * Determines whether or not the provided asset type (eg 'image', 'file', 'arbitrary')\n * is a supported asset type for this plugin.\n *\n * @param assetType - The asset type to check.\n * @returns True if the asset type is supported, false otherwise.\n * @internal\n */\nexport function isSupportedAssetType(assetType?: string): assetType is AssetType {\n  const supported: string[] = SUPPORTED_ASSET_TYPES\n  return assetType ? supported.includes(assetType) : false\n}\n","import {configureStore, type Store, type UnknownAction} from '@reduxjs/toolkit'\nimport type {SanityClient} from '@sanity/client'\nimport {type ReactNode, useState} from 'react'\nimport {Provider} from 'react-redux'\nimport {createEpicMiddleware} from 'redux-observable'\nimport type {AssetSourceComponentProps, SanityDocument} from 'sanity'\n\nimport {rootEpic, rootReducer} from '../../modules'\nimport {initialState as assetsInitialState} from '../../modules/assets'\n// import {assetsActions} from '../../modules/assets'\n// import {searchActions} from '../../modules/search'\n// import {uploadsActions} from '../../modules/uploads'\nimport type {RootReducerState} from '../../modules/types'\nimport getDocumentAssetIds from '../../utils/getDocumentAssetIds'\nimport {isSupportedAssetType} from '../../utils/isSupportedAssetType'\n\ntype Props = {\n  assetType?: AssetSourceComponentProps['assetType']\n  children?: ReactNode\n  client: SanityClient\n  document?: SanityDocument\n  excludeTagSlugs?: string[]\n  selectedAssets?: AssetSourceComponentProps['selectedAssets']\n}\n\nfunction createReduxStore(props: Props): Store {\n  const epicMiddleware = createEpicMiddleware<UnknownAction, UnknownAction, RootReducerState>({\n    dependencies: {\n      client: props.client,\n    },\n  })\n\n  const store = configureStore({\n    reducer: rootReducer,\n    middleware: (getDefaultMiddleware) =>\n      getDefaultMiddleware({\n        /*\n        serializableCheck: {\n          ignoredActions: [\n            assetsActions.deleteError.type,\n            uploadsActions.uploadRequest.type,\n            uploadsActions.uploadStart.type,\n          ]\n        },\n        */\n        // TODO: remove once we're no longer storing non-serializable data in the store\n        serializableCheck: false,\n        thunk: false,\n      }).prepend(epicMiddleware),\n    devTools: true,\n    preloadedState: {\n      assets: {\n        ...assetsInitialState,\n        assetTypes: isSupportedAssetType(props?.assetType) ? [props.assetType] : ['file', 'image'],\n        excludeTagSlugs: props.excludeTagSlugs?.length ? [...props.excludeTagSlugs] : [],\n      },\n      debug: {\n        badConnection: false,\n        enabled: false,\n      },\n      dialog: {items: []},\n      folders: {\n        byId: {},\n        childrenByParentId: {},\n        rootIds: [],\n        exactCountByFolderId: {},\n        unfiledCount: 0,\n        currentFolderId: null,\n        currentFolderUnfiled: false,\n        panelVisible: false,\n        fetching: false,\n        fetchCount: -1,\n        creating: false,\n        renaming: false,\n      },\n      notifications: {items: []},\n      search: {facets: [], query: ''},\n      selected: {\n        assets: props.selectedAssets || [],\n        document: props.document,\n        documentAssetIds: props.document ? getDocumentAssetIds(props.document) : [],\n      },\n      tags: {\n        allIds: [],\n        byIds: {},\n        creating: false,\n        fetchCount: -1,\n        fetching: false,\n        panelVisible: true,\n      },\n      uploads: {\n        allIds: [],\n        byIds: {},\n      },\n    },\n  })\n\n  epicMiddleware.run(rootEpic)\n\n  return store\n}\n\nfunction ReduxProvider({children, ...props}: Props) {\n  const [store] = useState(() => createReduxStore(props))\n\n  return <Provider store={store}>{children}</Provider>\n}\n\nexport default ReduxProvider\n","import {PortalProvider} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport constructFilter from '../../utils/constructFilter'\nimport Dialogs from '../Dialogs'\nimport Notifications from '../Notifications'\nimport ReduxProvider from '../ReduxProvider'\n\n/**\n * Fetches the already-selected asset into the store and opens the `assetEdit`\n * dialog for it. Once that dialog (and any nested dialogs, e.g. delete confirm)\n * are dismissed, the asset source itself is closed via `onClose`.\n *\n * Tracking the dialog lifecycle through redux is what allows the source to be\n * reopened: closing the inner dialog only removes it from the store, so without\n * this the source would stay mounted (showing nothing) and could not be opened\n * a second time.\n */\nconst EditAssetDialog = ({assetId, onClose}: {assetId: string; onClose: () => void}) => {\n  const dispatch = useDispatch()\n  const openDialogCount = useTypedSelector((state) => state.dialog.items.length)\n  const hasOpenedRef = useRef(false)\n\n  useEffect(() => {\n    // Only fetch the single asset being edited, then open its edit dialog.\n    const queryFilter = `${constructFilter({\n      assetTypes: ['file', 'image'],\n      searchFacets: [],\n    })} && _id == $assetId`\n\n    dispatch(assetsActions.fetchRequest({params: {assetId}, queryFilter}))\n\n    // Tags and folders must be loaded into the store so the edit dialog can\n    // resolve the asset's existing tag references and folder path (mirroring\n    // `useBrowserInit`). Without this, `selectTagSelectOptions` resolves no tags\n    // and saving would patch `opt.media.tags` to null, wiping existing tags.\n    dispatch(tagsActions.fetchRequest())\n    dispatch(foldersActions.fetchRequest())\n\n    dispatch(dialogActions.showAssetEdit({assetId}))\n  }, [assetId, dispatch])\n\n  useEffect(() => {\n    if (openDialogCount > 0) {\n      hasOpenedRef.current = true\n    } else if (hasOpenedRef.current) {\n      onClose()\n    }\n  }, [openDialogCount, onClose])\n\n  return (\n    <>\n      <Dialogs />\n      <Notifications />\n    </>\n  )\n}\n\nconst EditAssetTool = (props: AssetSourceComponentProps) => {\n  const {onClose, selectedAssets} = props\n\n  const portalElement = useRootPortalElement()\n\n  // `useFormValue` can return null/undefined (e.g. on a pristine/unsaved draft).\n  const currentDocument = useFormValue([]) as SanityDocument | null | undefined\n\n  const client = useVersionedClient()\n\n  const assetId = selectedAssets[0]?._id\n\n  // Nothing to edit (e.g. opened on an empty field) – close the source again.\n  useEffect(() => {\n    if (!assetId) {\n      onClose()\n    }\n  }, [assetId, onClose])\n\n  if (!assetId) {\n    return null\n  }\n\n  return (\n    <ReduxProvider\n      assetType={props.assetType}\n      client={client}\n      document={currentDocument ?? undefined}\n      selectedAssets={selectedAssets}\n    >\n      <AssetBrowserDispatchProvider onSelect={props.onSelect}>\n        <GlobalStyle />\n        <PortalProvider element={portalElement}>\n          <EditAssetDialog assetId={assetId} onClose={onClose} />\n        </PortalProvider>\n      </AssetBrowserDispatchProvider>\n    </ReduxProvider>\n  )\n}\n\nexport default EditAssetTool\n","import {ThLargeIcon} from '@sanity/icons/ThLarge'\nimport {ThListIcon} from '@sanity/icons/ThList'\nimport {Button, Inline} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst ButtonViewGroup = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const view = useTypedSelector((state) => state.assets.view)\n\n  return (\n    <Inline gap={0} style={{whiteSpace: 'nowrap'}}>\n      <Button\n        fontSize={1}\n        icon={ThLargeIcon}\n        mode={view === 'grid' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n        style={{\n          borderBottomRightRadius: 0,\n          borderTopRightRadius: 0,\n        }}\n      />\n      <Button\n        fontSize={1}\n        icon={ThListIcon}\n        mode={view === 'table' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n        style={{\n          borderBottomLeftRadius: 0,\n          borderTopLeftRadius: 0,\n        }}\n      />\n    </Inline>\n  )\n}\n\nexport default ButtonViewGroup\n","import {SortIcon} from '@sanity/icons/Sort'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst OrderSelect = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const order = useTypedSelector((state) => state.assets.order)\n\n  const popoverProps = usePortalPopoverProps()\n\n  return (\n    <MenuButton\n      button={\n        <Button\n          fontSize={1}\n          icon={SortIcon}\n          mode=\"bleed\"\n          padding={3}\n          text={getOrderTitle(order.field, order.direction)}\n        />\n      }\n      id=\"order\"\n      menu={\n        <Menu>\n          {ORDER_OPTIONS?.map((item, index) => {\n            if (item) {\n              const selected = order.field === item.field && order.direction === item.direction\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  iconRight={selected}\n                  key={index}\n                  onClick={() =>\n                    dispatch(\n                      assetsActions.orderSet({\n                        order: {direction: item.direction, field: item.field},\n                      }),\n                    )\n                  }\n                  padding={2}\n                  selected={selected}\n                  gap={4}\n                  style={{minWidth: '200px'}}\n                  text={getOrderTitle(item.field, item.direction)}\n                />\n              )\n            }\n\n            return <MenuDivider key={index} />\n          })}\n        </Menu>\n      }\n      popover={popoverProps}\n    />\n  )\n}\n\nexport default OrderSelect\n","import {Box} from '@sanity/ui'\nimport {useNProgress} from '@tanem/react-nprogress'\n\ntype Props = {\n  loading?: boolean\n}\n\nconst Progress = (props: Props) => {\n  const {loading} = props\n\n  const {animationDuration, isFinished, progress} = useNProgress({\n    animationDuration: 300,\n    isAnimating: loading,\n  })\n\n  return (\n    <Box\n      style={{\n        opacity: isFinished ? 0 : 1,\n        transition: `opacity ${animationDuration}ms linear`,\n      }}\n    >\n      <Box\n        style={{\n          height: '1px',\n          background: 'rgba(255, 255, 255, 0.5)',\n          position: 'absolute',\n          left: 0,\n          top: 0,\n          transition: `width ${animationDuration}ms linear`,\n          width: `${progress * 100}%`,\n        }}\n      />\n    </Box>\n  )\n}\n\nexport default Progress\n","const TagIcon = () => (\n  <svg\n    data-sanity-icon=\"media__tag\" // For icon usage with @sanity/ui <Button />\n    fill=\"currentColor\"\n    height=\"1em\"\n    stroke=\"currentColor\"\n    strokeWidth=\"0\"\n    viewBox=\"0 0 512 512\"\n    width=\"1em\"\n  >\n    <path\n      d=\"M435.25 48h-122.9a14.46 14.46 0 00-10.2 4.2L56.45 297.9a28.85 28.85 0 000 40.7l117 117a28.85 28.85 0 0040.7 0L459.75 210a14.46 14.46 0 004.2-10.2v-123a28.66 28.66 0 00-28.7-28.8z\"\n      fill=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"32\"\n    />\n    <path d=\"M384 160a32 32 0 1132-32 32 32 0 01-32 32z\" />\n  </svg>\n)\n\nexport default TagIcon\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Flex, TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\n\nconst TextInputSearch = () => {\n  // Redux\n  const searchQuery = useTypedSelector((state) => state.search.query)\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    dispatch(searchActions.querySet({searchQuery: e.currentTarget.value}))\n  }\n\n  const handleClear = () => {\n    dispatch(searchActions.querySet({searchQuery: ''}))\n  }\n\n  return (\n    <Box style={{position: 'relative'}}>\n      <TextInput\n        fontSize={1}\n        icon={SearchIcon}\n        onChange={handleChange}\n        placeholder=\"Search\"\n        radius={2}\n        value={searchQuery}\n      />\n\n      {/* Clear form button */}\n      {searchQuery.length > 0 && (\n        <Flex\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleClear}\n          style={{\n            cursor: 'pointer',\n            height: '100%',\n            opacity: 0.75,\n            position: 'absolute',\n            right: 0,\n            top: 0,\n            width: '2em',\n            zIndex: 1, // force stacking context\n          }}\n        >\n          <CloseIcon />\n        </Flex>\n      )}\n    </Box>\n  )\n}\n\nexport default TextInputSearch\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {Box, Button, Flex, Inline, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport ButtonViewGroup from '../ButtonViewGroup'\nimport OrderSelect from '../OrderSelect'\nimport Progress from '../Progress'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\nimport TagIcon from '../TagIcon'\nimport TextInputSearch from '../TextInputSearch'\n\nconst Controls = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n  const pageIndex = useTypedSelector((state) => state.assets.pageIndex)\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n  const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n  const mediaIndex = useMediaIndex()\n\n  // Callbacks\n  const handleShowSearchFacetDialog = () => {\n    dispatch(dialogActions.showSearchFacets())\n  }\n\n  const handleShowFoldersDialog = () => {\n    dispatch(dialogActions.showFolders())\n  }\n\n  const handleShowTagsDialog = () => {\n    dispatch(dialogActions.showTags())\n  }\n\n  const toggleFoldersPanel = () => {\n    dispatch(foldersActions.panelVisibleSet({panelVisible: !foldersPanelVisible}))\n  }\n\n  const toggleTagsPanelToggle = () => {\n    dispatch(tagsActions.panelVisibleSet({panelVisible: !tagsPanelVisible}))\n  }\n\n  return (\n    <Box\n      paddingY={2}\n      style={{\n        borderBottom: '1px solid var(--card-border-color)',\n        zIndex: 2,\n      }}\n    >\n      {/* Rows: search / filters / orders  */}\n      <Box marginBottom={2}>\n        <Flex\n          align=\"flex-start\"\n          direction={['column', 'column', 'column', 'column', 'row']}\n          justify=\"space-between\"\n        >\n          {/* Search + Filters */}\n          <Flex\n            flex={1}\n            style={{\n              alignItems: 'flex-start',\n              flex: 1,\n              height: '100%',\n              justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n              position: 'relative',\n              width: '100%',\n            }}\n          >\n            <Box marginX={2} style={{minWidth: '200px'}}>\n              {/* Search */}\n              <TextInputSearch />\n            </Box>\n\n            <Box display={['none', 'none', 'block']}>\n              <SearchFacets />\n\n              {/* Search Facets Control (add / clear) */}\n              <Inline gap={2}>\n                <SearchFacetsControl />\n              </Inline>\n            </Box>\n\n            <Box display={['block', 'block', 'none']} marginX={2}>\n              <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n                {/* Filters button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowSearchFacetDialog}\n                  text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n                  tone=\"primary\"\n                />\n\n                {/* Tags button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowTagsDialog}\n                  text={`Tags`}\n                  tone=\"primary\"\n                />\n\n                {/* Folders button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowFoldersDialog}\n                  text=\"Folders\"\n                  tone=\"primary\"\n                />\n              </Inline>\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      <Box>\n        <Flex align=\"center\" justify={['space-between']}>\n          {/* Folders + Views */}\n          <Box marginX={2}>\n            <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n              <Box display={['none', 'none', 'block']}>\n                <Button\n                  aria-label=\"Toggle folders panel\"\n                  fontSize={1}\n                  icon={FolderIcon}\n                  mode={foldersPanelVisible ? 'default' : 'ghost'}\n                  onClick={toggleFoldersPanel}\n                />\n              </Box>\n              <ButtonViewGroup />\n            </Inline>\n          </Box>\n\n          <Flex marginX={2}>\n            {/* Orders */}\n            <OrderSelect />\n            {/* Tags panel toggle */}\n            <Box display={['none', 'none', 'block']} marginLeft={2}>\n              <Button\n                fontSize={1}\n                icon={\n                  <Box style={{transform: 'scale(0.75)'}}>\n                    <TagIcon />\n                  </Box>\n                }\n                onClick={toggleTagsPanelToggle}\n                mode={tagsPanelVisible ? 'default' : 'ghost'}\n                text={tagsPanelVisible ? 'Tags' : ''}\n              />\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      {/* Progress bar */}\n      <Progress key={pageIndex} loading={fetching} />\n    </Box>\n  )\n}\n\nexport default Controls\n","import {PlugIcon} from '@sanity/icons/Plug'\nimport {Box, Flex, Switch, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {debugActions} from '../../modules/debug'\n\nconst DebugControls = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const badConnection = useTypedSelector((state) => state.debug.badConnection)\n  const debugEnabled = useTypedSelector((state) => state.debug.enabled)\n\n  // Callbacks\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    const checked = e.target.checked\n\n    dispatch(debugActions.setBadConnection(checked))\n  }\n\n  const handleToggleControls = () => {\n    dispatch(debugActions.toggleEnabled())\n  }\n\n  // Close on escape key press\n  useKeyPress('alt+ctrl+shift+/', handleToggleControls)\n\n  if (!debugEnabled) {\n    return null\n  }\n\n  return (\n    <Box\n      padding={4}\n      style={{\n        bottom: 0,\n        left: 0,\n        pointerEvents: 'none',\n        position: 'fixed',\n        width: '100%',\n      }}\n    >\n      {/* Bad connection toggle */}\n      <Flex align=\"center\">\n        <Box marginRight={3}>\n          <Text muted size={1}>\n            <PlugIcon />\n          </Text>\n        </Box>\n        <Tooltip\n          animate\n          content={\n            <Box padding={2}>\n              <Text muted size={1}>\n                {badConnection\n                  ? 'Bad connection: +3000ms & 50% chance to fail'\n                  : 'No connection throttling'}\n              </Text>\n            </Box>\n          }\n          fallbackPlacements={['right', 'left']}\n          placement=\"bottom\"\n          portal\n        >\n          <Switch\n            checked={badConnection}\n            onChange={handleChange}\n            style={{\n              pointerEvents: 'auto',\n            }}\n          />\n        </Tooltip>\n      </Flex>\n    </Box>\n  )\n}\n\nexport default DebugControls\n","import {Box, Button, Inline, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {foldersActions, selectCurrentFolderSegments} from '../../modules/folders'\n\nconst FolderBreadcrumbs = () => {\n  const dispatch = useDispatch()\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const segments = useTypedSelector(selectCurrentFolderSegments)\n\n  if (!currentFolderId) {\n    return null\n  }\n\n  return (\n    <Box display={['block', 'block', 'none']} padding={2}>\n      <Inline gap={1}>\n        <Button\n          fontSize={1}\n          padding={2}\n          mode=\"bleed\"\n          onClick={() => dispatch(foldersActions.currentFolderClear())}\n          text=\"All assets\"\n        />\n\n        {segments.map((segment) => (\n          <Inline key={segment.id} gap={1}>\n            <Text muted size={1}>\n              /\n            </Text>\n            <Button\n              fontSize={1}\n              padding={2}\n              mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n              onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n              text={segment.name}\n            />\n          </Inline>\n        ))}\n      </Inline>\n    </Box>\n  )\n}\n\nexport default FolderBreadcrumbs\n","import {Box} from '@sanity/ui'\n\nimport {FOLDERS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport FolderView from '../FolderView'\n\nconst FolderPanel = () => {\n  const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n\n  if (!foldersPanelVisible) {\n    return null\n  }\n\n  return (\n    <Box\n      style={{\n        position: 'relative',\n        width: FOLDERS_PANEL_WIDTH,\n      }}\n    >\n      <Box\n        className=\"media__custom-scrollbar\"\n        style={{\n          borderRight: '1px solid var(--card-border-color)',\n          height: '100%',\n          left: 0,\n          overflowX: 'hidden',\n          overflowY: 'auto',\n          position: 'absolute',\n          top: 0,\n          width: '100%',\n        }}\n      >\n        <FolderView />\n      </Box>\n    </Box>\n  )\n}\n\nexport default FolderPanel\n","import {type ReactNode, createContext, useContext, useMemo} from 'react'\n\ntype ContextProps = {\n  open: () => void\n}\n\ntype Props = {\n  children: ReactNode\n  open: () => void\n}\n\nconst DropzoneDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const DropzoneDispatchProvider = (props: Props) => {\n  const {children, open} = props\n\n  const contextValue: ContextProps = useMemo(() => ({open}), [open])\n\n  return (\n    <DropzoneDispatchContext.Provider value={contextValue}>\n      {children}\n    </DropzoneDispatchContext.Provider>\n  )\n}\n\nexport const useDropzoneActions = () => {\n  const context = useContext(DropzoneDispatchContext)\n  if (context === undefined) {\n    throw new Error('useDropzoneActions must be used within an DropzoneDispatchProvider')\n  }\n  return context\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Flex, Inline, Text} from '@sanity/ui'\nimport pluralize from 'pluralize'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {useDropzoneActions} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\ntype Props = {\n  onClose?: () => void\n}\n\nconst Header = (props: Props) => {\n  const {onClose} = props\n\n  const {open} = useDropzoneActions()\n  const {onSelect} = useAssetSourceActions()\n\n  // Redux\n  const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n  const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n  const {directUploads} = useToolOptions()\n\n  // Row: Current document / close button\n  return (\n    <Box paddingY={2}>\n      <Flex align=\"center\" justify=\"space-between\">\n        {/* Label */}\n        <Box flex={1} marginX={3}>\n          <Inline style={{whiteSpace: 'nowrap'}}>\n            <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n              <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n            </Text>\n\n            {selectedDocument && (\n              <Box display={['none', 'none', 'block']}>\n                <Text>\n                  <span style={{margin: '0 0.5em'}}>\n                    <ArrowRightIcon />\n                  </span>\n                  <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n                </Text>\n              </Box>\n            )}\n          </Inline>\n        </Box>\n\n        <Flex marginX={2}>\n          {/* Upload */}\n          {directUploads && (\n            <Button\n              fontSize={1}\n              icon={UploadIcon}\n              mode=\"bleed\"\n              onClick={open}\n              text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n            />\n          )}\n\n          {/* Close */}\n          {onClose && (\n            <Box style={{flexShrink: 0}}>\n              <Button\n                disabled={!onClose}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={onClose}\n                radius={2}\n              />\n            </Box>\n          )}\n        </Flex>\n      </Flex>\n    </Box>\n  )\n}\n\nexport default Header\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {Box, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\ntype Props = {\n  field?: string\n  title?: string\n}\n\nconst TableHeaderItem = (props: Props) => {\n  const {field, title} = props\n\n  // Redux\n  const dispatch = useDispatch()\n  const order = useTypedSelector((state) => state.assets.order)\n\n  const isActive = order.field === field\n\n  // Callbacks\n  const handleClick = () => {\n    if (!field || !title) {\n      return\n    }\n\n    if (isActive) {\n      const direction = order.direction === 'asc' ? 'desc' : 'asc'\n      dispatch(assetsActions.orderSet({order: {field, direction}}))\n    } else {\n      dispatch(assetsActions.orderSet({order: {field, direction: 'asc'}}))\n    }\n  }\n\n  return (\n    <Label muted={!field} size={0}>\n      <Box\n        onClick={field ? handleClick : undefined}\n        style={{\n          cursor: field ? 'pointer' : 'default',\n          display: 'inline',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        <span\n          style={{\n            marginRight: '0.4em',\n          }}\n        >\n          {title}\n        </span>\n\n        {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n        {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n      </Box>\n    </Label>\n  )\n}\n\nexport default TableHeaderItem\n","import {Checkbox, Flex, Grid, useMediaIndex} from '@sanity/ui'\nimport type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport {type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS, PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsLength, selectAssetsPickedLength} from '../../modules/assets'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport TableHeaderItem from '../TableHeaderItem'\n\n// TODO: DRY\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n  $scheme,\n}) => {\n  return css`\n    cursor: pointer;\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${getSchemeColor($scheme, 'bg')};\n      }\n    }\n  `\n})\n\nconst TableHeader = () => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const itemsLength = useTypedSelector(selectAssetsLength)\n  const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n\n  const mediaIndex = useMediaIndex()\n  const {onSelect} = useAssetSourceActions()\n\n  const allSelected = numPickedAssets === itemsLength\n\n  // Callbacks\n  const handleContextActionClick = (e: MouseEvent) => {\n    e.stopPropagation()\n\n    if (allSelected) {\n      dispatch(assetsActions.pickClear())\n    } else {\n      dispatch(assetsActions.pickAll())\n    }\n  }\n\n  // Note that even though we hide the table header on smaller breakpoints, we never set it to\n  // `display: none`, as doing so causes issues with react-virtuoso.\n  // Instead, we give it 0 height and hide it with `visibility: hidden`.\n  return (\n    <Grid\n      style={{\n        alignItems: 'center',\n        background: 'var(--card-bg-color)',\n        borderBottom: '1px solid var(--card-border-color)',\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n        height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n        letterSpacing: '0.025em',\n        position: 'sticky',\n        textTransform: 'uppercase',\n        top: 0,\n        visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n        width: '100%',\n        zIndex: 1, // force stacking context\n      }}\n    >\n      {onSelect ? (\n        <TableHeaderItem />\n      ) : (\n        <ContextActionContainer\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleContextActionClick}\n          $scheme={scheme}\n          style={{\n            height: '100%',\n            position: 'relative',\n          }}\n        >\n          <Checkbox\n            checked={!fetching && allSelected}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        </ContextActionContainer>\n      )}\n\n      <TableHeaderItem />\n      <TableHeaderItem field=\"originalFilename\" title=\"Filename\" />\n      <TableHeaderItem title=\"Resolution\" />\n      <TableHeaderItem field=\"mimeType\" title=\"MIME type\" />\n      <TableHeaderItem field=\"size\" title=\"Size\" />\n      <TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />\n      <TableHeaderItem title=\"References\" />\n      <TableHeaderItem />\n    </Grid>\n  )\n}\n\nexport default TableHeader\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n  Box,\n  Checkbox,\n  Container,\n  Flex,\n  Grid,\n  Spinner,\n  Text,\n  type ThemeColorSchemeKey,\n  useMediaIndex,\n} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {formatRelative} from 'date-fns/formatRelative'\nimport filesize from 'filesize'\nimport {\n  memo,\n  type MouseEvent,\n  type RefObject,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\n// Duration (ms) to wait before reference counts (and associated listeners) are rendered\nconst REFERENCE_COUNT_VISIBILITY_DELAY = 750\n\ntype Props = {\n  id: string\n  selected: boolean\n}\n\nconst ContainerGrid = styled<\n  typeof Grid,\n  // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n  {$selected?: boolean; $scheme: ThemeColorSchemeKey; $updating?: boolean}\n>(Grid)(({$scheme, $selected, $updating}) => {\n  return css`\n    align-items: center;\n    cursor: ${$selected ? 'default' : 'pointer'};\n    height: 100%;\n    pointer-events: ${$updating ? 'none' : 'auto'};\n    user-select: none;\n    white-space: nowrap;\n\n    ${\n      !$updating &&\n      css`\n        @media (hover: hover) and (pointer: fine) {\n          &:hover {\n            background: ${getSchemeColor($scheme, 'bg')};\n          }\n        }\n      `\n    }\n  `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n  $scheme,\n}) => {\n  return css`\n    cursor: pointer;\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${getSchemeColor($scheme, 'bg2')};\n      }\n    }\n  `\n})\n\nconst StyledWarningIcon = styled(WarningFilledIcon)(({theme}) => {\n  return {\n    // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n    color: theme.sanity.color.spot.red,\n  }\n})\n\nconst TableRowAsset = (props: Props) => {\n  const {id, selected} = props\n\n  const scheme = useColorSchemeValue()\n\n  const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n  const [referenceCountVisible, setReferenceCountVisible] = useState(false)\n  const refCountVisibleTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n\n  const dispatch = useDispatch()\n  const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n  const item = useTypedSelector((state) => selectAssetById(state, id))\n\n  const mediaIndex = useMediaIndex()\n\n  const asset = item?.asset\n  const error = item?.error\n  const isOpaque = item?.asset?.metadata?.isOpaque\n  const picked = item?.picked\n  const updating = item?.updating\n\n  const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n  const handleContextActionClick = useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      } else if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    },\n    [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n  )\n\n  const handleClick = useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        onSelect([{kind: 'assetDocumentId', value: asset._id}])\n      } else if (onSelect && isMultiSelect) {\n        if (shiftPressed.current && !picked) {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        } else {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        }\n      } else if (shiftPressed.current) {\n        if (picked) {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        } else {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        }\n      } else {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      }\n    },\n    [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n  )\n\n  const opacityCell = updating ? 0.5 : 1\n  const opacityPreview = selected || updating ? 0.1 : 1\n\n  // Display reference count after an initial delay to prevent over-eager fetching\n  useEffect(() => {\n    refCountVisibleTimeout.current = setTimeout(\n      () => setReferenceCountVisible(true),\n      REFERENCE_COUNT_VISIBILITY_DELAY,\n    )\n    return () => {\n      if (refCountVisibleTimeout.current) {\n        clearTimeout(refCountVisibleTimeout.current)\n      }\n    }\n  }, [])\n\n  // Short circuit if no asset is available\n  if (!asset) {\n    return null\n  }\n\n  return (\n    <ContainerGrid\n      onClick={selected ? undefined : handleClick}\n      $scheme={scheme}\n      $selected={selected}\n      style={{\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }}\n      $updating={item.updating}\n    >\n      {/* Picked checkbox */}\n      <ContextActionContainer\n        onClick={handleContextActionClick}\n        $scheme={scheme}\n        style={{\n          alignItems: 'center',\n          gridColumn: 1,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '100%',\n          justifyContent: 'center',\n          opacity: opacityCell,\n          position: 'relative',\n        }}\n      >\n        {onSelect && !isMultiSelect ? (\n          <EditIcon\n            style={{\n              flexShrink: 0,\n              opacity: 0.5,\n            }}\n          />\n        ) : (\n          <Checkbox\n            checked={picked}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        )}\n      </ContextActionContainer>\n\n      {/* Preview image + spinner */}\n      <Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n          <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 100, width: 100})}\n              />\n            )}\n          </Box>\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n        </Flex>\n      </Box>\n\n      {/* Filename */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: 3,\n          gridRow: mediaIndex < 3 ? 2 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.originalFilename}\n        </Text>\n      </Box>\n\n      {/* Resolution */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 4,\n          gridRow: mediaIndex < 3 ? 3 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {isImageAsset(asset) && getAssetResolution(asset)}\n        </Text>\n      </Box>\n\n      {/* MIME type */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 5,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.mimeType}\n        </Text>\n      </Box>\n\n      {/* Size */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 6,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {filesize(asset.size, {base: 10, round: 0})}\n        </Text>\n      </Box>\n\n      {/* Last updated */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 7,\n          gridRow: mediaIndex < 3 ? 4 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {formatRelative(new Date(asset._updatedAt), new Date())}\n        </Text>\n      </Box>\n\n      {/* References */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 8,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {referenceCountVisible ? (\n            <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n              id={id}\n            >\n              {({isLoading, referringDocuments}) => {\n                const uniqueDocuments = getUniqueDocuments(referringDocuments)\n                return isLoading ? (\n                  <>-</>\n                ) : (\n                  <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n                )\n              }}\n            </WithReferringDocuments>\n          ) : (\n            <>-</>\n          )}\n        </Text>\n      </Box>\n\n      {/* Error */}\n      <Flex\n        align=\"center\"\n        justify=\"center\"\n        style={{\n          gridColumn: mediaIndex < 3 ? 4 : 9,\n          gridRowStart: '1',\n          gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box padding={2}>\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </Flex>\n    </ContainerGrid>\n  )\n}\n\nexport default memo(TableRowAsset)\n","import {Box, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  folderId: string\n  name: string\n  totalCount: number\n}\n\nconst ContainerGrid = styled(Grid)(\n  ({theme}) => css`\n    align-items: center;\n    cursor: pointer;\n    height: 100%;\n    user-select: none;\n    white-space: nowrap;\n\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${\n          // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n          theme.sanity.color.card.enabled.bg\n        };\n      }\n    }\n  `,\n)\n\nconst FolderBadge = styled(Box)(\n  ({theme}) => css`\n    background: ${\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      theme.sanity.color.spot.yellow\n    };\n    border-radius: 6px;\n    height: 42px;\n    position: relative;\n    width: 52px;\n\n    &::before {\n      background: ${\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.color.spot.yellow\n      };\n      border-radius: 6px 6px 0 0;\n      content: '';\n      height: 12px;\n      left: 0;\n      position: absolute;\n      top: -6px;\n      width: 18px;\n    }\n  `,\n)\n\nconst TableRowFolder = ({folderId, name, totalCount}: Props) => {\n  const dispatch = useDispatch()\n  const mediaIndex = useMediaIndex()\n  const scheme = useColorSchemeValue()\n\n  return (\n    <ContainerGrid\n      onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n      style={{\n        background: getSchemeColor(scheme, 'bg'),\n        gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }}\n    >\n      <Box />\n      <Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n        <FolderBadge />\n      </Flex>\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n      >\n        <Stack gap={2}>\n          <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {name}\n          </Text>\n          <Text muted size={0} style={{lineHeight: '1.1em'}}>\n            Folder\n          </Text>\n        </Stack>\n      </Box>\n      <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n        <Text muted size={1}>\n          {totalCount} item{totalCount === 1 ? '' : 's'}\n        </Text>\n      </Box>\n      <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n        <Text muted size={1}>\n          Open folder\n        </Text>\n      </Box>\n      <Box />\n    </ContainerGrid>\n  )\n}\n\nexport default TableRowFolder\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n  id: string\n}\n\nconst TableRowUpload = (props: Props) => {\n  const {id} = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const item = useTypedSelector((state) => selectUploadById(state, id))\n\n  const mediaIndex = useMediaIndex()\n\n  if (!item) {\n    return null\n  }\n\n  const fileSize = filesize(item.size, {base: 10, round: 0})\n  const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n  const isComplete = item.status === 'complete'\n  const isUploading = item.status === 'uploading'\n  const isQueued = item.status === 'queued'\n\n  let status\n  if (isComplete) {\n    status = 'Verifying'\n  }\n  if (isUploading) {\n    status = `${percentLoaded}%`\n  }\n  if (isQueued) {\n    status = 'Queued'\n  }\n\n  // Callbacks\n  const handleCancelUpload = () => {\n    dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n  }\n\n  return (\n    <Grid\n      style={{\n        alignItems: 'center',\n        background: getSchemeColor(scheme, 'bg'),\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n        height: '100%',\n        position: 'relative',\n      }}\n    >\n      {/* Progress bar */}\n      <div\n        style={{\n          background: 'var(--card-fg-color)',\n          bottom: 0,\n          height: '1px',\n          left: 0,\n          position: 'absolute',\n          width: '100%',\n          transform: `scaleX(${percentLoaded * 0.01})`,\n          transformOrigin: 'bottom left',\n          transition: 'all 1000ms ease-out',\n        }}\n      />\n\n      {/* Image */}\n      <Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n          gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Box style={{height: '100%', position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{opacity: 0.25}}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"40px\" />\n            </div>\n          )}\n\n          {/*\n            Cancel upload button.\n            Assets will only have a `complete` status _after_ it has been created on your dataset.\n            As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n            has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n          */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                position: 'absolute',\n                height: '100%',\n                left: 0,\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={3}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n      </Box>\n\n      {/* Filename */}\n      <Box\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : '3/8',\n          gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n          marginLeft: mediaIndex < 3 ? 3 : 0,\n        }}\n      >\n        <Stack gap={3}>\n          <Text muted size={1} textOverflow=\"ellipsis\">\n            {item.name} ({fileSize})\n          </Text>\n          <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {status}\n          </Text>\n        </Stack>\n      </Box>\n    </Grid>\n  )\n}\n\nexport default TableRowUpload\n","import {Box} from '@sanity/ui'\nimport {memo} from 'react'\nimport {GroupedVirtuoso} from 'react-virtuoso'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport TableHeader from '../TableHeader'\nimport TableRowAsset from '../TableRowAsset'\nimport TableRowFolder from '../TableRowFolder'\nimport TableRowUpload from '../TableRowUpload'\n\ntype Props = {\n  items: (CardAssetData | CardFolderData | CardUploadData)[]\n  onLoadMore?: () => void\n}\n\nconst VirtualRow = memo(\n  ({\n    item,\n    selected,\n  }: {\n    item: CardAssetData | CardFolderData | CardUploadData\n    selected: boolean\n  }) => {\n    if (item?.type === 'asset') {\n      return (\n        <Box style={{height: '100px'}}>\n          <TableRowAsset id={item.id} selected={selected} />\n        </Box>\n      )\n    }\n\n    if (item?.type === 'folder') {\n      return (\n        <Box style={{height: '100px'}}>\n          <TableRowFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n        </Box>\n      )\n    }\n\n    if (item?.type === 'upload') {\n      return (\n        <Box style={{height: '100px'}}>\n          <TableRowUpload id={item.id} />\n        </Box>\n      )\n    }\n\n    return null\n  },\n)\n\nconst AssetTableVirtualized = (props: Props) => {\n  const {items, onLoadMore} = props\n\n  // Redux\n  const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n  const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n  const totalCount = items?.length\n\n  if (totalCount === 0) {\n    return null\n  }\n\n  return (\n    <GroupedVirtuoso\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        return item?.id || index\n      }}\n      endReached={onLoadMore}\n      groupCounts={Array(1).fill(totalCount)}\n      groupContent={() => {\n        return <TableHeader />\n      }}\n      itemContent={(index) => {\n        const item = items[index]\n        const selected = selectedIds.includes(item?.id || '')\n        return <VirtualRow item={item!} selected={selected} />\n      }}\n      style={{overflowX: 'hidden'}}\n    />\n  )\n}\n\nexport default AssetTableVirtualized\n","import {Box, Text, useMediaIndex} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport {tagsActions} from '../../modules/tags'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\nimport AssetTableVirtualized from '../AssetTableVirtualized'\n\nconst Items = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n  const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n  const view = useTypedSelector((state) => state.assets.view)\n  const combinedItems = useTypedSelector(selectCombinedItems)\n\n  const mediaIndex = useMediaIndex()\n\n  const hasFetchedOnce = fetchCount >= 0\n  const hasItems = combinedItems.length > 0\n\n  // Only load 1 page of items at a time.\n  const handleLoadMoreItems = () => {\n    if (!fetching) {\n      dispatch(assetsActions.loadNextPage())\n    }\n  }\n\n  // Effects\n\n  // - Hide folders/tags panels on smaller breakpoints\n  useEffect(() => {\n    if (mediaIndex <= 1 && foldersPanelVisible) {\n      dispatch(foldersActions.panelVisibleSet({panelVisible: false}))\n    }\n\n    if (mediaIndex <= 1 && tagsPanelVisible) {\n      dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n    }\n  }, [dispatch, foldersPanelVisible, mediaIndex, tagsPanelVisible])\n\n  const isEmpty = !hasItems && hasFetchedOnce && !fetching\n\n  return (\n    <Box flex={1} style={{width: '100%'}}>\n      {isEmpty ? (\n        <Box padding={4}>\n          <Text size={1} weight=\"semibold\">\n            No results for the current query\n          </Text>\n        </Box>\n      ) : (\n        <>\n          {view === 'grid' && (\n            <AssetGridVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n          )}\n\n          {view === 'table' && (\n            <AssetTableVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n          )}\n        </>\n      )}\n    </Box>\n  )\n}\n\nexport default Items\n","import {Box, Button, Flex, Label} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {isImageAsset} from '../../utils/typeGuards'\n\nconst PickedBar = () => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n  // Replace only rewrites image field refs — only offer it for a single image asset.\n  const canReplace =\n    assetsPicked.length === 1 && !!assetsPicked[0] && isImageAsset(assetsPicked[0].asset)\n\n  // Callbacks\n  const handlePickClear = () => {\n    dispatch(assetsActions.pickClear())\n  }\n\n  const handleDeletePicked = () => {\n    dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\n  }\n\n  const handleReplaceImages = () => {\n    const assetId = assetsPicked[0]?.asset._id\n    if (!assetId) {\n      return\n    }\n    dispatch(dialogActions.showAllAssetsDialog({assetId}))\n  }\n\n  const handleMovePicked = () =>\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: assetsPicked, folderId: currentFolderId}))\n\n  const handleRemovePickedFromFolder = () =>\n    dispatch(assetsActions.folderSetRequest({assets: assetsPicked, folderId: null}))\n\n  const handleInsertPicked = () => {\n    if (!onSelect) {\n      return\n    }\n\n    const pickedAssetIds = assetsPicked.map((item) => ({\n      kind: 'assetDocumentId' as const,\n      value: item.asset._id,\n    }))\n\n    if (pickedAssetIds.length === 0) {\n      return\n    }\n\n    onSelect(pickedAssetIds)\n  }\n\n  if (assetsPicked.length === 0) {\n    return null\n  }\n\n  return (\n    <Flex\n      align=\"center\"\n      justify=\"flex-start\"\n      style={{\n        background: getSchemeColor(scheme, 'bg'),\n        borderBottom: '1px solid var(--card-border-color)',\n        height: `${PANEL_HEIGHT}px`,\n        position: 'relative',\n        width: '100%',\n      }}\n    >\n      <Flex align=\"center\" paddingX={3}>\n        <Box paddingRight={2}>\n          <Label size={0} style={{color: 'inherit'}}>\n            {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n          </Label>\n        </Box>\n\n        {/* Deselect button */}\n        <Button\n          mode=\"bleed\"\n          onClick={handlePickClear}\n          padding={2}\n          style={{background: 'none', boxShadow: 'none'}}\n          tone=\"default\"\n        >\n          <Label size={0}>Deselect</Label>\n        </Button>\n\n        {onSelect && isMultiSelect ? (\n          <Button\n            mode=\"bleed\"\n            onClick={handleInsertPicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"primary\"\n          >\n            <Label size={0}>Insert selected</Label>\n          </Button>\n        ) : (\n          <Button\n            mode=\"bleed\"\n            onClick={handleDeletePicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"critical\"\n          >\n            <Label size={0}>Delete</Label>\n          </Button>\n        )}\n\n        {/* Replace button */}\n        {canReplace && (\n          <Button\n            mode=\"bleed\"\n            onClick={handleReplaceImages}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"default\"\n          >\n            <Label size={0}>Replace</Label>\n          </Button>\n        )}\n\n        {!onSelect && (\n          <>\n            <Button\n              mode=\"bleed\"\n              onClick={handleMovePicked}\n              padding={2}\n              style={{background: 'none', boxShadow: 'none'}}\n              tone=\"primary\"\n            >\n              <Label size={0}>Move to folder</Label>\n            </Button>\n            {currentFolderId && (\n              <Button\n                mode=\"bleed\"\n                onClick={handleRemovePickedFromFolder}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              >\n                <Label size={0}>Remove from folder</Label>\n              </Button>\n            )}\n          </>\n        )}\n      </Flex>\n    </Flex>\n  )\n}\n\nexport default PickedBar\n","import {Box} from '@sanity/ui'\n\nimport {TAGS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport TagView from '../TagView'\n\nconst TagsPanel = () => {\n  const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n  if (!tagsPanelVisible) {\n    return null\n  }\n\n  return (\n    <Box\n      style={{\n        position: 'relative',\n        width: TAGS_PANEL_WIDTH,\n      }}\n    >\n      <Box\n        className=\"media__custom-scrollbar\"\n        style={{\n          borderLeft: '1px solid var(--card-border-color)',\n          height: '100%',\n          overflowX: 'hidden',\n          overflowY: 'auto',\n          position: 'absolute',\n          right: 0,\n          top: 0,\n          width: '100%',\n        }}\n      >\n        <TagView />\n      </Box>\n    </Box>\n  )\n}\n\nexport default TagsPanel\n","import {white} from '@sanity/color'\nimport {Flex, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {type DropEvent, type DropzoneOptions, useDropzone} from 'react-dropzone'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {DropzoneDispatchProvider} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {notificationsActions} from '../../modules/notifications'\nimport {uploadsActions} from '../../modules/uploads'\n\ntype Props = {\n  children: ReactNode\n}\n\nconst UploadContainer = styled.div`\n  color: white;\n  height: 100%;\n  min-height: 100%;\n  right: 0;\n  top: 0;\n  width: 100%;\n\n  &:focus {\n    outline: none;\n  }\n`\n\nconst DragActiveContainer = styled.div`\n  align-items: center;\n  background: rgba(0, 0, 0, 0.75);\n  display: flex;\n  height: 100%;\n  justify-content: center;\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 100%;\n  z-index: 3;\n`\n\n// Iterate through all files and only return non-folders / packages.\n// We check for files by reading the first byte of the file\nasync function filterFiles(fileList: FileList) {\n  const files = Array.from(fileList)\n\n  const filteredFiles: File[] = []\n\n  for (const file of files) {\n    try {\n      await file.slice(0, 1).arrayBuffer()\n      filteredFiles.push(file)\n    } catch {\n      // do nothing: file is a package or folder\n    }\n  }\n\n  return filteredFiles\n}\n\nconst UploadDropzone = (props: Props) => {\n  const {children} = props\n\n  const {\n    dropzone: {maxSize},\n    directUploads,\n  } = useToolOptions()\n\n  const {onSelect} = useAssetSourceActions()\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n\n  const isImageAssetType = assetTypes.length === 1 && assetTypes[0] === 'image'\n\n  // Callbacks\n  const handleDrop = async (acceptedFiles: File[]) => {\n    acceptedFiles.forEach((file) =>\n      dispatch(\n        uploadsActions.uploadRequest({\n          file,\n          forceAsAssetType: assetTypes.length === 1 ? assetTypes[0] : undefined,\n        }),\n      ),\n    )\n  }\n\n  const handleDropRejected: DropzoneOptions['onDropRejected'] = (rejections) => {\n    const errorCodes = rejections.flatMap(({errors}) => errors.map(({code}) => code))\n\n    if (errorCodes.includes('file-too-large')) {\n      dispatch(\n        notificationsActions.add({\n          status: 'error',\n          title: 'One or more files exceed the maximum upload size.',\n        }),\n      )\n    }\n  }\n\n  // Use custom file selector to obtain files on file drop + change events (excluding folders and packages)\n  const handleFileGetter = async (event: DropEvent) => {\n    let fileList: FileList | undefined\n    if (event.type === 'drop' && 'dataTransfer' in event) {\n      fileList = event?.dataTransfer?.files\n    }\n    if (event.type === 'change') {\n      const target = event?.target as HTMLInputElement\n      if (target?.files) {\n        fileList = target.files\n      }\n    }\n\n    if (!fileList) {\n      return []\n    }\n\n    // Filter out non-folders / packages\n    const files: File[] = await filterFiles(fileList)\n\n    // Dispatch error if some files have been filtered out\n    if (fileList?.length !== files.length) {\n      dispatch(\n        notificationsActions.add({\n          status: 'error',\n          title: `Unable to upload some items (folders and packages aren't supported)`,\n        }),\n      )\n    }\n\n    return files\n  }\n\n  // Limit file picking to only images if we're specifically within an image selection context (e.g. picking from image fields)\n  const {getRootProps, getInputProps, isDragActive, open} = useDropzone({\n    accept: isImageAssetType ? 'image/*' : '',\n    getFilesFromEvent: handleFileGetter,\n    noClick: true,\n    // HACK: Disable drag and drop functionality when in a selecting context\n    // (This is currently due to Sanity's native image input taking precedence with drag and drop)\n    noDrag: !!onSelect,\n    onDrop: handleDrop,\n    maxSize,\n    onDropRejected: handleDropRejected,\n    disabled: !directUploads,\n  })\n\n  return (\n    <DropzoneDispatchProvider open={open}>\n      <UploadContainer {...getRootProps()}>\n        <input {...getInputProps()} />\n\n        {isDragActive && (\n          <DragActiveContainer>\n            <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n              <Text size={3} style={{color: 'inherit'}}>\n                Drop files to upload\n              </Text>\n            </Flex>\n          </DragActiveContainer>\n        )}\n\n        {children}\n      </UploadContainer>\n    </DropzoneDispatchProvider>\n  )\n}\n\nexport default UploadDropzone\n","import type {MutationEvent, SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {useEffect} from 'react'\nimport {useDispatch, useSelector} from 'react-redux'\nimport type {Dispatch} from 'redux'\nimport type {AssetSourceComponentProps} from 'sanity'\n\nimport {inputs} from '../../config/searchFacets'\nimport {FOLDER_DOCUMENT_NAME, TAG_DOCUMENT_NAME} from '../../constants'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {tagsActions} from '../../modules/tags'\nimport type {RootReducerState} from '../../modules/types'\nimport type {Asset, Tag} from '../../types'\n\nfunction getMediaTagNames(schemaType?: AssetSourceComponentProps['schemaType']): string[] {\n  const mediaTags = (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n  if (!mediaTags?.length) return []\n  const unique = new Set(\n    mediaTags.map((t) => t?.trim()).filter((t): t is string => Boolean(t?.length)),\n  )\n  return Array.from(unique)\n}\n\nfunction createAssetHandler(dispatch: Dispatch) {\n  return (update: MutationEvent) => {\n    const {documentId, result, transition} = update\n\n    switch (transition) {\n      case 'appear':\n        dispatch(assetsActions.listenerCreateQueue({asset: result as Asset}))\n        break\n      case 'disappear':\n        dispatch(assetsActions.listenerDeleteQueue({assetId: documentId}))\n        break\n      case 'update':\n        dispatch(assetsActions.listenerUpdateQueue({asset: result as Asset}))\n        break\n      default:\n        break\n    }\n  }\n}\n\nfunction createTagHandler(dispatch: Dispatch) {\n  return (update: MutationEvent) => {\n    const {documentId, result, transition} = update\n\n    switch (transition) {\n      case 'appear':\n        dispatch(tagsActions.listenerCreateQueue({tag: result as Tag}))\n        break\n      case 'disappear':\n        dispatch(tagsActions.listenerDeleteQueue({tagId: documentId}))\n        break\n      case 'update':\n        dispatch(tagsActions.listenerUpdateQueue({tag: result as Tag}))\n        break\n      default:\n        break\n    }\n  }\n}\n\nexport function useBrowserInit(\n  client: SanityClient,\n  schemaType?: AssetSourceComponentProps['schemaType'],\n): void {\n  const dispatch = useDispatch()\n  const tagsByIds = useSelector((state: RootReducerState) => state.tags.byIds)\n  const tagsFetchCount = useSelector((state: RootReducerState) => state.tags.fetchCount)\n\n  const tagNames = getMediaTagNames(schemaType)\n  const hasMediaTags = tagNames.length > 0\n\n  useEffect(() => {\n    if (!hasMediaTags) {\n      dispatch(searchActions.facetsClear())\n    }\n\n    dispatch(tagsActions.fetchRequest())\n\n    // Fetch all folders\n    dispatch(foldersActions.fetchRequest())\n\n    const assetSubscription = client\n      .listen(\n        groq`*[_type in [\"sanity.fileAsset\", \"sanity.imageAsset\"] && !(_id in path(\"drafts.**\"))]`,\n      )\n      .subscribe(createAssetHandler(dispatch))\n\n    const tagSubscription = client\n      .listen(groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n      .subscribe(createTagHandler(dispatch))\n\n    const folderSubscription = client\n      .listen(groq`*[_type == \"${FOLDER_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n      .subscribe(() => dispatch(foldersActions.fetchRequest()))\n\n    return () => {\n      assetSubscription.unsubscribe()\n      tagSubscription.unsubscribe()\n      folderSubscription.unsubscribe()\n    }\n  }, [client, dispatch, hasMediaTags])\n\n  // When mediaTags are configured, wait for the tag fetch to complete then apply facets.\n  // Dispatching clear + add synchronously keeps all actions within assetsSearchEpic's\n  // 400ms debounce window, so the browser performs exactly one asset fetch on open.\n  useEffect(() => {\n    if (!hasMediaTags || tagsFetchCount < 0) return\n\n    const tagFacetInput = inputs.tag\n    if (tagFacetInput.type !== 'searchable') return\n\n    const resolvedTags = tagNames\n      .map((name) => Object.values(tagsByIds).find((item) => item.tag.name.current === name))\n      .filter((item): item is NonNullable<typeof item> => Boolean(item))\n\n    dispatch(searchActions.facetsClear())\n\n    for (const tagItem of resolvedTags) {\n      dispatch(\n        searchActions.facetsAdd({\n          facet: {\n            ...tagFacetInput,\n            operatorType: 'references',\n            value: {label: tagItem.tag.name.current, value: tagItem.tag._id},\n          },\n        }),\n      )\n    }\n    // oxlint-disable-next-line react/exhaustive-effect-dependencies\n  }, [tagsFetchCount, hasMediaTags]) // eslint-disable-line react-hooks/exhaustive-deps\n}\n","import {Card, Flex, PortalProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport Controls from '../Controls'\nimport DebugControls from '../DebugControls'\nimport Dialogs from '../Dialogs'\nimport FolderBreadcrumbs from '../FolderBreadcrumbs'\nimport FolderPanel from '../FolderPanel'\nimport Header from '../Header'\nimport Items from '../Items'\nimport Notifications from '../Notifications'\nimport PickedBar from '../PickedBar'\nimport ReduxProvider from '../ReduxProvider'\nimport TagsPanel from '../TagsPanel'\nimport UploadDropzone from '../UploadDropzone'\nimport {useBrowserInit} from './useBrowserInit'\n\ntype Props = {\n  assetType?: AssetSourceComponentProps['assetType']\n  document?: SanityDocument\n  isMultiSelect?: boolean\n  onClose?: AssetSourceComponentProps['onClose']\n  onSelect?: AssetSourceComponentProps['onSelect']\n  selectedAssets?: AssetSourceComponentProps['selectedAssets']\n  schemaType?: AssetSourceComponentProps['schemaType']\n}\n\nconst BrowserContent = ({\n  onClose,\n  schemaType,\n}: {\n  onClose?: AssetSourceComponentProps['onClose']\n  schemaType?: AssetSourceComponentProps['schemaType']\n}) => {\n  const client = useVersionedClient()\n  const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null)\n\n  useBrowserInit(client, schemaType)\n\n  return (\n    <PortalProvider element={portalElement}>\n      <UploadDropzone>\n        <Dialogs />\n        <Notifications />\n\n        <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n          <Flex direction=\"column\" flex={1}>\n            {/* Header */}\n            <Header onClose={onClose} />\n\n            {/* Browser Controls */}\n            <Controls />\n\n            <FolderBreadcrumbs />\n\n            <Flex flex={1}>\n              <FolderPanel />\n              <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n                <PickedBar />\n                <Items />\n              </Flex>\n              <TagsPanel />\n            </Flex>\n\n            {/* Debug */}\n            <DebugControls />\n          </Flex>\n        </Card>\n      </UploadDropzone>\n    </PortalProvider>\n  )\n}\n\nconst Browser = (props: Props) => {\n  const client = useVersionedClient()\n  const {excludeTagSlugs} = useToolOptions()\n\n  return (\n    <ReduxProvider\n      assetType={props?.assetType}\n      client={client}\n      document={props?.document}\n      excludeTagSlugs={excludeTagSlugs}\n      selectedAssets={props?.selectedAssets}\n    >\n      <AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n        <GlobalStyle />\n        <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n      </AssetBrowserDispatchProvider>\n    </ReduxProvider>\n  )\n}\n\nexport default Browser\n","import {Box, Portal, PortalProvider, useLayer} from '@sanity/ui'\nimport {type SyntheticEvent} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport Browser from '../Browser'\n\nconst FormBuilderTool = (props: AssetSourceComponentProps) => {\n  const {onClose} = props\n\n  const portalElement = useRootPortalElement()\n\n  // Get current Sanity document\n  const currentDocument = useFormValue([]) as SanityDocument\n  const selectionType = (props as unknown as {selectionType?: string})?.selectionType\n  const schemaJsonType = (props?.schemaType as {jsonType?: string} | undefined)?.jsonType\n  const isMultiSelect = selectionType === 'multiple' || schemaJsonType === 'array'\n\n  // Close on escape key press\n  useKeyPress('escape', onClose)\n\n  // Stop propagation and prevent document mouse events from firing.\n  // This is a bit of a hack to make this work with `editModal = 'popover'` and prevent Sanity's <Popover /> component from\n  // prematurely closing, as it attaches events on `document` to detect outside clicks.\n  const handleStopPropagation = (event: SyntheticEvent) => {\n    event.nativeEvent.stopImmediatePropagation()\n    event.stopPropagation()\n  }\n\n  const {zIndex} = useLayer()\n\n  return (\n    <PortalProvider element={portalElement}>\n      <Portal>\n        <Box\n          onDragEnter={handleStopPropagation}\n          onDragLeave={handleStopPropagation}\n          onDragOver={handleStopPropagation}\n          onDrop={handleStopPropagation}\n          onMouseUp={handleStopPropagation}\n          style={{\n            bottom: 0,\n            height: 'auto',\n            left: 0,\n            position: 'fixed',\n            top: 0,\n            width: '100%',\n            zIndex,\n          }}\n        >\n          <Browser\n            document={currentDocument}\n            isMultiSelect={isMultiSelect}\n            schemaType={props.schemaType}\n            {...props}\n          />\n        </Box>\n      </Portal>\n    </PortalProvider>\n  )\n}\n\nexport default FormBuilderTool\n","import {Flex} from '@sanity/ui'\n\nimport Browser from '../Browser'\n\nconst Tool = () => {\n  return (\n    <Flex direction=\"column\" height=\"fill\" flex={1}>\n      <Browser />\n    </Flex>\n  )\n}\n\nexport default Tool\n","import {FolderIcon} from '@sanity/icons/Folder'\n\nimport {FOLDER_DOCUMENT_NAME} from '../constants'\n\nexport default {\n  title: 'Media Folder',\n  icon: FolderIcon,\n  name: FOLDER_DOCUMENT_NAME,\n  type: 'document',\n  fields: [\n    {\n      title: 'Name',\n      name: 'name',\n      type: 'string',\n    },\n    {\n      title: 'Parent',\n      name: 'parent',\n      type: 'reference',\n      to: [{type: FOLDER_DOCUMENT_NAME}],\n      weak: true,\n    },\n  ],\n  preview: {\n    select: {\n      name: 'name',\n      parentName: 'parent.name',\n    },\n    prepare(selection: {name?: string; parentName?: string}): {\n      media: typeof FolderIcon\n      subtitle?: string\n      title: string\n    } {\n      const {name, parentName} = selection\n      return {\n        media: FolderIcon,\n        title: name || 'Folder',\n        subtitle: parentName ? `in ${parentName}` : undefined,\n      }\n    },\n  },\n}\n","import TagIcon from '../components/TagIcon'\nimport {TAG_DOCUMENT_NAME} from '../constants'\n\nexport default {\n  title: 'Media Tag',\n  icon: TagIcon,\n  name: TAG_DOCUMENT_NAME,\n  type: 'document',\n  fields: [\n    {\n      title: 'Name',\n      name: 'name',\n      type: 'slug',\n    },\n  ],\n  preview: {\n    select: {\n      name: 'name',\n    },\n    prepare(selection: any) {\n      const {name} = selection\n      return {\n        media: TagIcon,\n        title: name?.current,\n      }\n    },\n  },\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {type AssetSource, type Tool as SanityTool, definePlugin} from 'sanity'\n\nimport EditAssetTool from './components/EditAssetTool'\nimport FormBuilderTool from './components/FormBuilderTool'\nimport Tool from './components/Tool'\nimport {ToolOptionsProvider} from './contexts/ToolOptionsContext'\nimport mediaFolder from './schemas/folder'\nimport mediaTag from './schemas/tag'\nimport type {MediaToolOptions} from './types'\n\nconst plugin = {\n  icon: ImageIcon,\n  name: 'media',\n  title: 'Media',\n}\n\nexport const mediaAssetSource = {\n  ...plugin,\n  component: FormBuilderTool,\n} satisfies AssetSource\n\nconst editMediaAssetSource = {\n  icon: EditIcon,\n  name: 'edit-media',\n  // oxlint-disable-next-line no-deprecated -- `i18nKey` requires a locale bundle; a plain title is intentional here\n  title: 'Edit Media',\n  component: EditAssetTool,\n} satisfies AssetSource\n\nconst tool = {\n  ...plugin,\n  component: Tool,\n  __internalApplicationType: 'sanity/media',\n} satisfies SanityTool\n\nexport const media = definePlugin<MediaToolOptions | void>((options) => ({\n  name: 'media',\n  studio: {\n    components: {\n      layout: (props) => (\n        <ToolOptionsProvider options={options}>{props.renderDefault(props)}</ToolOptionsProvider>\n      ),\n    },\n  },\n  form: {\n    file: {\n      assetSources: (prev) => {\n        return [...prev, mediaAssetSource, editMediaAssetSource]\n      },\n    },\n    image: {\n      assetSources: (prev) => {\n        return [...prev, mediaAssetSource, editMediaAssetSource]\n      },\n    },\n  },\n  schema: {\n    types: [mediaTag, mediaFolder],\n  },\n  tools: (prev) => {\n    return [...prev, tool]\n  },\n}))\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {Tag} from '../types'\n\ntype ApplyMediaTagsOptions = {\n  client: SanityClient\n  assetId: string\n  mediaTags: string[]\n  createTagsOnUpload?: boolean\n}\n\n// Serialize calls per asset so concurrent fields reading the same asset\n// don't race each other — the second call always runs after the first commits.\nconst pendingByAsset = new Map<string, Promise<void>>()\n\nexport function applyMediaTags(options: ApplyMediaTagsOptions): Promise<void> {\n  const {assetId} = options\n  const chain = (pendingByAsset.get(assetId) ?? Promise.resolve()).then(() =>\n    doApplyMediaTags(options),\n  )\n  const cleanup = chain\n    .catch(() => {})\n    .finally(() => {\n      if (pendingByAsset.get(assetId) === cleanup) pendingByAsset.delete(assetId)\n    })\n  pendingByAsset.set(assetId, cleanup)\n  return chain\n}\n\nasync function doApplyMediaTags({\n  client,\n  assetId,\n  mediaTags,\n  createTagsOnUpload = true,\n}: ApplyMediaTagsOptions): Promise<void> {\n  if (!mediaTags || mediaTags.length === 0) return\n\n  const resolvedTags = await Promise.all(\n    mediaTags.map(async (tagName) => {\n      const existingTag = await client.fetch<Tag | null>(\n        groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $tagName][0]`,\n        {tagName},\n      )\n      if (existingTag) return existingTag\n      if (createTagsOnUpload) {\n        const newTag = await client.create({\n          _type: TAG_DOCUMENT_NAME,\n          name: {_type: 'slug', current: tagName},\n        })\n        return newTag as Tag\n      }\n      return null\n    }),\n  )\n\n  const validTags = resolvedTags.filter((tag): tag is Tag => tag !== null)\n  if (validTags.length === 0) return\n\n  const existing = await client.fetch<{tagIds: string[]} | null>(\n    groq`*[_id == $assetId][0]{'tagIds': opt.media.tags[]._ref}`,\n    {assetId},\n    {useCdn: false}, // bypass CDN cache so we see the latest committed tag refs\n  )\n  const existingIds = new Set(existing?.tagIds ?? [])\n\n  const tagReferences = validTags\n    .filter((tag) => !existingIds.has(tag._id))\n    .map((tag) => ({\n      _key: nanoid(),\n      _ref: tag._id,\n      _type: 'reference' as const,\n      _weak: true,\n    }))\n\n  if (tagReferences.length === 0) return\n\n  await client\n    .patch(assetId)\n    .setIfMissing({opt: {}})\n    .setIfMissing({'opt.media': {}})\n    .setIfMissing({'opt.media.tags': []})\n    .append('opt.media.tags', tagReferences)\n    .commit()\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect, useRef} from 'react'\nimport {type InputProps} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {applyMediaTags} from '../../utils/applyMediaTags'\n\ntype AssetValue = {\n  _type: 'image' | 'file'\n  asset?: {\n    _ref: string\n    _type: 'reference'\n  }\n}\n\nexport type AutoTagInputProps = InputProps & {\n  mediaTags?: string[]\n}\n\n/**\n * Input component that automatically applies media tags when an asset is selected or uploaded.\n *\n * Apply explicitly to image/file fields that should be auto-tagged:\n * ```ts\n * import {AutoTagInput} from 'sanity-plugin-media'\n *\n * defineField({\n *   type: 'image',\n *   options: { mediaTags: ['product'] },   // also pre-filters the media browser\n *   components: { input: AutoTagInput },\n * })\n * ```\n *\n * Pass `mediaTags` as a prop to override or use without `options`:\n * ```ts\n * components: { input: (props) => <AutoTagInput {...props} mediaTags={['product']} /> }\n * ```\n */\nexport function AutoTagInput(props: AutoTagInputProps) {\n  const {renderDefault, schemaType, value, mediaTags: mediaTagsProp} = props\n  const toast = useToast()\n\n  // Prop takes precedence; fall back to schemaType.options.mediaTags (set for browser pre-filtering)\n  const mediaTags =\n    mediaTagsProp ?? (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n\n  const client = useVersionedClient()\n  const {createTagsOnUpload} = useToolOptions()\n\n  const prevAssetRef = useRef<string | undefined>(undefined)\n  const isInitialMount = useRef(true)\n\n  const currentAssetRef = (value as AssetValue | undefined)?.asset?._ref\n\n  useEffect(() => {\n    if (isInitialMount.current) {\n      isInitialMount.current = false\n      prevAssetRef.current = currentAssetRef\n      return\n    }\n\n    const previousRef = prevAssetRef.current\n    prevAssetRef.current = currentAssetRef\n\n    if (!mediaTags?.length || !currentAssetRef || currentAssetRef === previousRef) return\n\n    applyMediaTags({\n      client,\n      assetId: currentAssetRef,\n      mediaTags,\n      createTagsOnUpload,\n    }).catch((err) => {\n      console.error('[sanity-plugin-media] Failed to apply auto-tags:', err)\n      const label = mediaTags.length === 1 ? 'tag' : 'tags'\n      toast.push({\n        closable: true,\n        status: 'error',\n        title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`,\n      })\n    })\n  }, [currentAssetRef, mediaTags, client, createTagsOnUpload, toast])\n\n  return renderDefault(props as InputProps)\n}\n","import type {\n  FieldDefinitionBase,\n  FileDefinition,\n  ImageDefinition,\n  WidenInitialValue,\n  WidenValidation,\n} from 'sanity'\n\nimport {AutoTagInput} from '../components/AutoTagInputWrapper'\n\ntype ImageMediaFieldConfig = Omit<ImageDefinition, 'options'> &\n  FieldDefinitionBase & {\n    name: string\n    mediaTags: string[]\n    options?: ImageDefinition['options']\n  }\n\ntype FileMediaFieldConfig = Omit<FileDefinition, 'options'> &\n  FieldDefinitionBase & {\n    name: string\n    mediaTags: string[]\n    options?: FileDefinition['options']\n  }\n\ntype ImageMediaFieldResult = Omit<ImageDefinition, 'options'> &\n  FieldDefinitionBase & {\n    options?: ImageDefinition['options'] & {mediaTags: string[]}\n    components: {input: typeof AutoTagInput}\n  } & WidenValidation &\n  WidenInitialValue\n\ntype FileMediaFieldResult = Omit<FileDefinition, 'options'> &\n  FieldDefinitionBase & {\n    options?: FileDefinition['options'] & {mediaTags: string[]}\n    components: {input: typeof AutoTagInput}\n  } & WidenValidation &\n  WidenInitialValue\n\n/**\n * Defines an image or file field with automatic media tag application when an asset is selected.\n *\n * Pass `mediaTags` at the top level — they are moved into `options.mediaTags` (for media browser\n * pre-filtering) and wire up {@link AutoTagInput} as the field component automatically:\n * ```ts\n * import {mediaField} from 'sanity-plugin-media'\n *\n * mediaField({\n *   name: 'coverImage',\n *   type: 'image',\n *   mediaTags: ['product-cover'],\n *   options: { hotspot: true },\n * })\n * ```\n *\n * For file fields, set `type: 'file'`:\n * ```ts\n * mediaField({ name: 'drawing', type: 'file', mediaTags: ['model-drawing'] })\n * ```\n */\nexport function mediaField(config: ImageMediaFieldConfig): ImageMediaFieldResult\nexport function mediaField(config: FileMediaFieldConfig): FileMediaFieldResult\nexport function mediaField(\n  config: ImageMediaFieldConfig | FileMediaFieldConfig,\n): ImageMediaFieldResult | FileMediaFieldResult {\n  const {mediaTags, options, components, ...rest} = config as ImageMediaFieldConfig & {\n    components?: Record<string, unknown>\n  }\n  return {\n    ...rest,\n    options: {...options, mediaTags},\n    components: {...components, input: AutoTagInput},\n  } as unknown as ImageMediaFieldResult\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["isMultiSelect = false","{\n      isMultiSelect,\n      onSelect,\n    }","useMemo(\n    () => ({\n      isMultiSelect,\n      onSelect,\n    }),\n    [isMultiSelect, onSelect],\n  )","<AssetSourceDispatchContext.Provider value={contextValue}>\n      {children}\n    </AssetSourceDispatchContext.Provider>","AssetSourceDispatchContext.Provider","() => document.createElement('div')","() => {\n    container.classList.add('media-portal')\n    document.body.appendChild(container)\n    return () => {\n      document.body.removeChild(container)\n    }\n  }","[container]","container.classList","{apiVersion: '2025-10-02'}","{\n    animate: true,\n    constrainSize: true,\n    floatingBoundary: portal.element,\n    portal: true,\n    referenceBoundary: portal.element,\n  }","element","{disabled, url}: Props","() => {\n    if (refPopoverTimeout.current) {\n      clearTimeout(refPopoverTimeout.current)\n    }\n\n    setPopoverVisible(true)\n    copy(url)\n\n    refPopoverTimeout.current = setTimeout(() => {\n      setPopoverVisible(false)\n    }, 1250)\n  }","() => {\n    return () => {\n      if (refPopoverTimeout.current) {\n        clearTimeout(refPopoverTimeout.current)\n      }\n    }\n  }","[]","<Text muted size={1}>\n          Copied!\n        </Text>","<Button\n        disabled={disabled}\n        fontSize={1}\n        icon={ClipboardIcon}\n        mode=\"ghost\"\n        onClick={handleClick}\n        text=\"Copy URL\"\n      />","<Popover\n      content={\n        <Text muted size={1}>\n          Copied!\n        </Text>\n      }\n      open={popoverVisible}\n      padding={2}\n      placement=\"top\"\n      radius={1}\n      {...popoverProps}\n    >\n      <Button\n        disabled={disabled}\n        fontSize={1}\n        icon={ClipboardIcon}\n        mode=\"ghost\"\n        onClick={handleClick}\n        text=\"Copy URL\"\n      />\n    </Popover>","{label, value}: {label: string; value: ReactNode}","{\n          opacity: 0.8,\n          width: '40%',\n        }","<Text\n        size={1}\n        style={{\n          opacity: 0.8,\n          width: '40%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {label}\n      </Text>","{\n          opacity: 0.4,\n          textAlign: 'right',\n          width: '60%',\n        }","<Text\n        size={1}\n        style={{\n          opacity: 0.4,\n          textAlign: 'right',\n          width: '60%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {value}\n      </Text>","<Flex justify=\"space-between\">\n      <Text\n        size={1}\n        style={{\n          opacity: 0.8,\n          width: '40%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {label}\n      </Text>\n      <Text\n        size={1}\n        style={{\n          opacity: 0.4,\n          textAlign: 'right',\n          width: '60%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {value}\n      </Text>\n    </Flex>","() => {\n    window.location.href = `${asset.url}?dl=${asset.originalFilename}`\n  }","originalFilename","url","filesize(asset?.size, {base: 10, round: 0})","asset?.size","<Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />","<Row label=\"MIME type\" value={asset?.mimeType} />","asset?.mimeType","asset?.extension?.toUpperCase()","extension","<Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />","isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />","<Box>\n        <Stack gap={3}>\n          <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n          <Row label=\"MIME type\" value={asset?.mimeType} />\n          <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n          {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n        </Stack>\n      </Box>","exif &&\n        (exif.DateTimeOriginal ||\n          exif.FNumber ||\n          exif.FocalLength ||\n          exif.ExposureTime ||\n          exif.ISO) && (\n          <>\n            {/* Divider */}\n            <Box\n              marginY={4}\n              style={{\n                background: 'var(--card-border-color)',\n                height: '1px',\n                width: '100%',\n              }}\n            />\n            <Box>\n              <Stack gap={3}>\n                {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n                {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n                {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n                {exif.ExposureTime && (\n                  <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n                )}\n                {exif.DateTimeOriginal && (\n                  <Row\n                    label=\"Original date\"\n                    value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n                  />\n                )}\n              </Stack>\n            </Box>\n          </>\n        )","<Button\n            disabled={!item || item?.updating}\n            fontSize={1}\n            icon={DownloadIcon}\n            mode=\"ghost\"\n            onClick={handleDownload}\n            text=\"Download\"\n          />","!item || item?.updating","<ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />","<Box marginTop={5}>\n        <Inline gap={2}>\n          {/* Download */}\n          <Button\n            disabled={!item || item?.updating}\n            fontSize={1}\n            icon={DownloadIcon}\n            mode=\"ghost\"\n            onClick={handleDownload}\n            text=\"Download\"\n          />\n          {/* Copy to clipboard */}\n          <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n        </Inline>\n      </Box>","<Box marginTop={3}>\n      {/* Base */}\n      <Box>\n        <Stack gap={3}>\n          <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n          <Row label=\"MIME type\" value={asset?.mimeType} />\n          <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n          {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n        </Stack>\n      </Box>\n      {/* EXIF */}\n      {exif &&\n        (exif.DateTimeOriginal ||\n          exif.FNumber ||\n          exif.FocalLength ||\n          exif.ExposureTime ||\n          exif.ISO) && (\n          <>\n            {/* Divider */}\n            <Box\n              marginY={4}\n              style={{\n                background: 'var(--card-border-color)',\n                height: '1px',\n                width: '100%',\n              }}\n            />\n            <Box>\n              <Stack gap={3}>\n                {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n                {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n                {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n                {exif.ExposureTime && (\n                  <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n                )}\n                {exif.DateTimeOriginal && (\n                  <Row\n                    label=\"Original date\"\n                    value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n                  />\n                )}\n              </Stack>\n            </Box>\n          </>\n        )}\n\n      {/* Asset actions */}\n      <Box marginTop={5}>\n        <Inline gap={2}>\n          {/* Download */}\n          <Button\n            disabled={!item || item?.updating}\n            fontSize={1}\n            icon={DownloadIcon}\n            mode=\"ghost\"\n            onClick={handleDownload}\n            text=\"Download\"\n          />\n          {/* Copy to clipboard */}\n          <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n        </Inline>\n      </Box>\n    </Box>","{position: 'fixed'}","<SanityDialog {...props} style={{position: 'fixed'}} />","{documents, isLoading}: Props","<Text muted size={1}>\n        Loading...\n      </Text>","<Text muted size={1}>\n        No documents are referencing this asset\n      </Text>","documents?.map((doc) => (\n          <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n        ))","documents?.map","<Card flex={1} marginBottom={2} padding={2} radius={2} shadow={1}>\n      <Stack gap={2}>\n        {documents?.map((doc) => (\n          <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n        ))}\n      </Stack>\n    </Card>","{\n    intent: 'edit',\n    params: {id: doc._id},\n  }","_id","schemaType ? (\n    <Button key={doc._id} mode=\"bleed\" onClick={onClick} padding={2} style={{width: '100%'}}>\n      <Preview layout=\"default\" schemaType={schemaType} value={doc} />\n    </Button>\n  ) : (\n    <Box padding={2}>\n      <Text size={1}>\n        A document of the unknown type <em>{doc._type}</em>\n      </Text>\n    </Box>\n  )","{height: '100%'}","{width}","extension ? (\n          <ReactFileIcon\n            extension={extension}\n            {...defaultStyles[extension as DefaultExtensionType]}\n          />\n        ) : (\n          <ReactFileIcon />\n        )","<Container style={{width}}>\n        {extension ? (\n          <ReactFileIcon\n            extension={extension}\n            {...defaultStyles[extension as DefaultExtensionType]}\n          />\n        ) : (\n          <ReactFileIcon />\n        )}\n      </Container>","<Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n      <Container style={{width}}>\n        {extension ? (\n          <ReactFileIcon\n            extension={extension}\n            {...defaultStyles[extension as DefaultExtensionType]}\n          />\n        ) : (\n          <ReactFileIcon />\n        )}\n      </Container>\n    </Flex>","{height: '100%'}","{width: '100%'}","<Flex align=\"center\" justify=\"center\" style={{height: '100%'}}>\n        <audio controls src={asset.url} style={{width: '100%'}} />\n      </Flex>","url","{\n          height: '100%',\n          width: '100%',\n        }","<video\n        controls\n        src={asset.url}\n        style={{\n          height: '100%',\n          width: '100%',\n        }}\n      />","<FileIcon extension={asset.extension} width=\"50%\" />","extension","<br />","format(new Date(lastUpdated), 'PPp')","<>\n          Last updated\n          <br /> {format(new Date(lastUpdated), 'PPp')}\n        </>","{maxWidth: '185px'}","<Box padding={3} style={{maxWidth: '185px'}}>\n          <Text muted size={1}>\n            {content}\n          </Text>\n        </Box>","<Box>\n        <Button\n          disabled={disabled}\n          fontSize={1}\n          onClick={onClick}\n          text=\"Save and close\"\n          tone=\"primary\"\n        />\n      </Box>","<Tooltip\n      animate\n      content={\n        <Box padding={3} style={{maxWidth: '185px'}}>\n          <Text muted size={1}>\n            {content}\n          </Text>\n        </Box>\n      }\n      disabled={'ontouchstart' in window}\n      placement=\"top\"\n      portal\n    >\n      <Box>\n        <Button\n          disabled={disabled}\n          fontSize={1}\n          onClick={onClick}\n          text=\"Save and close\"\n          tone=\"primary\"\n        />\n      </Box>\n    </Tooltip>","<Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n            {label}\n          </Text>","error && (\n            <Text size={1}>\n              <Tooltip\n                animate\n                content={\n                  <Box padding={2}>\n                    <Text muted size={1}>\n                      <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n                      {error}\n                    </Text>\n                  </Box>\n                }\n                fallbackPlacements={['top', 'left']}\n                placement=\"right\"\n                portal\n              >\n                <StyledErrorOutlineIcon />\n              </Tooltip>\n            </Text>\n          )","<Box marginY={3}>\n        <Inline gap={2}>\n          <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n            {label}\n          </Text>\n\n          {/* Error icon + tooltip */}\n          {error && (\n            <Text size={1}>\n              <Tooltip\n                animate\n                content={\n                  <Box padding={2}>\n                    <Text muted size={1}>\n                      <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n                      {error}\n                    </Text>\n                  </Box>\n                }\n                fallbackPlacements={['top', 'left']}\n                placement=\"right\"\n                portal\n              >\n                <StyledErrorOutlineIcon />\n              </Tooltip>\n            </Text>\n          )}\n        </Inline>\n      </Box>","description && (\n        <Box marginY={3}>\n          <Text as=\"label\" htmlFor={name} muted size={1}>\n            {description}\n          </Text>\n        </Box>\n      )","<>\n      {/* Label */}\n      <Box marginY={3}>\n        <Inline gap={2}>\n          <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n            {label}\n          </Text>\n\n          {/* Error icon + tooltip */}\n          {error && (\n            <Text size={1}>\n              <Tooltip\n                animate\n                content={\n                  <Box padding={2}>\n                    <Text muted size={1}>\n                      <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n                      {error}\n                    </Text>\n                  </Box>\n                }\n                fallbackPlacements={['top', 'left']}\n                placement=\"right\"\n                portal\n              >\n                <StyledErrorOutlineIcon />\n              </Tooltip>\n            </Text>\n          )}\n        </Inline>\n      </Box>\n\n      {/* Description */}\n      {description && (\n        <Box marginY={3}>\n          <Text as=\"label\" htmlFor={name} muted size={1}>\n            {description}\n          </Text>\n        </Box>\n      )}\n    </>","<Box paddingX={2}>\n        <Text size={1}>\n          <ChevronDownIcon />\n        </Text>\n      </Box>","<components.DropdownIndicator {...props}>\n      <Box paddingX={2}>\n        <Text size={1}>\n          <ChevronDownIcon />\n        </Text>\n      </Box>\n    </components.DropdownIndicator>","components.DropdownIndicator","<Card radius={1} shadow={2}>\n        {props.children}\n      </Card>","children","<components.Menu {...props}>\n      <Card radius={1} shadow={2}>\n        {props.children}\n      </Card>\n    </components.Menu>","components.Menu","(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }","{height}","<Virtuoso\n        className=\"media__custom-scrollbar\"\n        itemContent={(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }}\n        style={{height}}\n        totalCount={children.length}\n      />","length","<components.MenuList {...props}>{children}</components.MenuList>","components.MenuList","<Box padding={2} paddingRight={1}>\n      <Text size={1} weight=\"medium\">\n        <components.MultiValueLabel {...props} />\n      </Text>\n    </Box>","components.MultiValueLabel","<CloseIcon color=\"#1f2123\" />","<components.MultiValueRemove {...props}>\n      <CloseIcon color=\"#1f2123\" />\n    </components.MultiValueRemove>","components.MultiValueRemove","props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />","__isNew__","<Flex align=\"center\">\n          {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n          {props.children}\n        </Flex>","<Box paddingX={1} paddingY={1}>\n      <components.Option {...props}>\n        <Flex align=\"center\">\n          {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n          {props.children}\n        </Flex>\n      </components.Option>\n    </Box>","components.Option","(state) => state.tags.creating","(state) => state.tags.fetching","{zIndex: 2}","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","({field}) => {\n          const {onBlur, onChange, value: controllerValue} = field\n          // TODO: investigate overriding `onChange` and updating form state manually.\n          // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n          // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n          // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n          //\n          // To illustrate this issue:\n          // - Edit an asset with no tags\n          // - Add a new tag (either an existing one, or create one inline)\n          // - Remove the tag you've just created\n          //\n          // At this point, the form will still be marked as dirty when it shouldnt be\n          return (\n            <CreatableSelect\n              components={reactSelectComponents}\n              instanceId=\"tags\"\n              isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n              isDisabled={creating || disabled || tagsFetching}\n              isLoading={creating}\n              isMulti\n              name={name}\n              noOptionsMessage={() => 'No tags'}\n              onBlur={onBlur}\n              onChange={onChange}\n              onCreateOption={onCreateTag}\n              options={options}\n              placeholder={tagsFetching ? 'Loading...' : placeholder}\n              styles={reactSelectStyles(scheme)}\n              value={controllerValue}\n            />\n          )\n        }","{field}","() => 'No tags'","<Controller\n        control={control}\n        defaultValue={value}\n        name={name}\n        render={({field}) => {\n          const {onBlur, onChange, value: controllerValue} = field\n          // TODO: investigate overriding `onChange` and updating form state manually.\n          // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n          // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n          // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n          //\n          // To illustrate this issue:\n          // - Edit an asset with no tags\n          // - Add a new tag (either an existing one, or create one inline)\n          // - Remove the tag you've just created\n          //\n          // At this point, the form will still be marked as dirty when it shouldnt be\n          return (\n            <CreatableSelect\n              components={reactSelectComponents}\n              instanceId=\"tags\"\n              isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n              isDisabled={creating || disabled || tagsFetching}\n              isLoading={creating}\n              isMulti\n              name={name}\n              noOptionsMessage={() => 'No tags'}\n              onBlur={onBlur}\n              onChange={onChange}\n              onCreateOption={onCreateTag}\n              options={options}\n              placeholder={tagsFetching ? 'Loading...' : placeholder}\n              styles={reactSelectStyles(scheme)}\n              value={controllerValue}\n            />\n          )\n        }}\n      />","<Box\n      // HACK: force stacking context to ensure react-select dropdown sits above other fields\n      style={{zIndex: 2}}\n    >\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n      {/* Select */}\n      <Controller\n        control={control}\n        defaultValue={value}\n        name={name}\n        render={({field}) => {\n          const {onBlur, onChange, value: controllerValue} = field\n          // TODO: investigate overriding `onChange` and updating form state manually.\n          // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n          // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n          // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n          //\n          // To illustrate this issue:\n          // - Edit an asset with no tags\n          // - Add a new tag (either an existing one, or create one inline)\n          // - Remove the tag you've just created\n          //\n          // At this point, the form will still be marked as dirty when it shouldnt be\n          return (\n            <CreatableSelect\n              components={reactSelectComponents}\n              instanceId=\"tags\"\n              isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n              isDisabled={creating || disabled || tagsFetching}\n              isLoading={creating}\n              isMulti\n              name={name}\n              noOptionsMessage={() => 'No tags'}\n              onBlur={onBlur}\n              onChange={onChange}\n              onCreateOption={onCreateTag}\n              options={options}\n              placeholder={tagsFetching ? 'Loading...' : placeholder}\n              styles={reactSelectStyles(scheme)}\n              value={controllerValue}\n            />\n          )\n        }}\n      />\n    </Box>","state","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","<TextInput\n        {...rest}\n        autoComplete=\"off\"\n        autoFocus\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n      />","<Box>\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n      {/* Input */}\n      <TextInput\n        {...rest}\n        autoComplete=\"off\"\n        autoFocus\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n      />\n    </Box>","<FormFieldInputLabel description={description} error={error} label={label} name={name} />","<TextArea\n        {...rest}\n        autoComplete=\"off\"\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n        rows={rows}\n      />","<Box>\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n      {/* Input */}\n      <TextArea\n        {...rest}\n        autoComplete=\"off\"\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n        rows={rows}\n      />\n    </Box>","{assetId, id, lastCreatedTag, lastRemovedTagIds}","(state) => selectAssetById(state, String(assetId))","getTagSelectOptions(tags)","selectTagSelectOptions(currentAsset)","(state) =>\n    selectFolderPathById(state, currentFolderId)","state","{details: CustomDetails} = {}","(asset?: Asset): AssetFormData => {\n      let imageDescription: string | undefined\n      if (asset && isImageAsset(asset)) {\n        const raw = asset.metadata?.image?.['ImageDescription']\n        if (typeof raw === 'string') {\n          imageDescription = raw\n        }\n      }\n\n      if (locales && locales.length > 0) {\n        const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n          const obj: Record<string, string> = {}\n          for (let i = 0; i < locales.length; i++) {\n            const locale = locales[i]!\n            // Prefer key presence over truthiness so an intentional empty string\n            // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n            if (typeof field === 'object' && field && locale.id in field) {\n              obj[locale.id] = field[locale.id] ?? ''\n            } else if (typeof field === 'string') {\n              // Only populate the first locale to avoid spreading a legacy value\n              // across all languages; the user should fill in other translations manually\n              obj[locale.id] = i === 0 ? field : ''\n            } else if (typeof field === 'object' && field) {\n              // Localized object present but this locale key is missing: leave empty.\n              // Do not apply EXIF fallback to partial translations.\n              obj[locale.id] = ''\n            } else {\n              // No description set at all — EXIF fallback only for the first locale.\n              obj[locale.id] = i === 0 ? fallback : ''\n            }\n          }\n          return obj\n        }\n        return {\n          altText: makeLocaleObj(asset?.altText),\n          creditLine: makeLocaleObj(asset?.creditLine),\n          description: makeLocaleObj(asset?.description, imageDescription),\n          originalFilename: asset?.originalFilename || '',\n          opt: {media: {tags: assetTagOptions}},\n          title: makeLocaleObj(asset?.title),\n        }\n      }\n      // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n      const flattenField = (field: unknown, fallback = ''): string => {\n        if (typeof field === 'string') return field\n        if (typeof field === 'object' && field !== null) {\n          const values = Object.values(field as Record<string, string>)\n          return values.find((v) => v) || fallback\n        }\n        return fallback\n      }\n      return {\n        altText: flattenField(asset?.altText),\n        creditLine: flattenField(asset?.creditLine),\n        description: flattenField(asset?.description, imageDescription),\n        originalFilename: asset?.originalFilename || '',\n        opt: {media: {tags: assetTagOptions}},\n        title: flattenField(asset?.title),\n      }\n    }","'ImageDescription'","fallback = ''","(field: unknown, fallback = ''): string => {\n        if (typeof field === 'string') return field\n        if (typeof field === 'object' && field !== null) {\n          const values = Object.values(field as Record<string, string>)\n          return values.find((v) => v) || fallback\n        }\n        return fallback\n      }","useCallback(\n    (asset?: Asset): AssetFormData => {\n      let imageDescription: string | undefined\n      if (asset && isImageAsset(asset)) {\n        const raw = asset.metadata?.image?.['ImageDescription']\n        if (typeof raw === 'string') {\n          imageDescription = raw\n        }\n      }\n\n      if (locales && locales.length > 0) {\n        const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n          const obj: Record<string, string> = {}\n          for (let i = 0; i < locales.length; i++) {\n            const locale = locales[i]!\n            // Prefer key presence over truthiness so an intentional empty string\n            // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n            if (typeof field === 'object' && field && locale.id in field) {\n              obj[locale.id] = field[locale.id] ?? ''\n            } else if (typeof field === 'string') {\n              // Only populate the first locale to avoid spreading a legacy value\n              // across all languages; the user should fill in other translations manually\n              obj[locale.id] = i === 0 ? field : ''\n            } else if (typeof field === 'object' && field) {\n              // Localized object present but this locale key is missing: leave empty.\n              // Do not apply EXIF fallback to partial translations.\n              obj[locale.id] = ''\n            } else {\n              // No description set at all — EXIF fallback only for the first locale.\n              obj[locale.id] = i === 0 ? fallback : ''\n            }\n          }\n          return obj\n        }\n        return {\n          altText: makeLocaleObj(asset?.altText),\n          creditLine: makeLocaleObj(asset?.creditLine),\n          description: makeLocaleObj(asset?.description, imageDescription),\n          originalFilename: asset?.originalFilename || '',\n          opt: {media: {tags: assetTagOptions}},\n          title: makeLocaleObj(asset?.title),\n        }\n      }\n      // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n      const flattenField = (field: unknown, fallback = ''): string => {\n        if (typeof field === 'string') return field\n        if (typeof field === 'object' && field !== null) {\n          const values = Object.values(field as Record<string, string>)\n          return values.find((v) => v) || fallback\n        }\n        return fallback\n      }\n      return {\n        altText: flattenField(asset?.altText),\n        creditLine: flattenField(asset?.creditLine),\n        description: flattenField(asset?.description, imageDescription),\n        originalFilename: asset?.originalFilename || '',\n        opt: {media: {tags: assetTagOptions}},\n        title: flattenField(asset?.title),\n      }\n    },\n    [assetTagOptions, locales],\n  )","generateDefaultValues(assetItem?.asset)","assetItem?.asset","zodFormResolver<AssetFormData>(getAssetFormSchema(locales))","{\n    defaultValues: generateDefaultValues(assetItem?.asset),\n    mode: 'onChange',\n    resolver: zodFormResolver<AssetFormData>(getAssetFormSchema(locales)),\n  }","{control}","() => {\n    dispatch(dialogActions.remove({id}))\n  }","useCallback(() => {\n    dispatch(dialogActions.remove({id}))\n  }, [dispatch, id])","() => {\n    if (!assetItem?.asset) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteAssets({\n        assets: [assetItem],\n        closeDialogId: assetItem?.asset._id,\n      }),\n    )\n  }","useCallback(() => {\n    if (!assetItem?.asset) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteAssets({\n        assets: [assetItem],\n        closeDialogId: assetItem?.asset._id,\n      }),\n    )\n  }, [assetItem, dispatch])","(update: MutationEvent) => {\n    const {result, transition} = update\n    if (result && transition === 'update') {\n      // Regenerate asset snapshot\n      setAssetSnapshot(result as Asset)\n    }\n  }","useCallback((update: MutationEvent) => {\n    const {result, transition} = update\n    if (result && transition === 'update') {\n      // Regenerate asset snapshot\n      setAssetSnapshot(result as Asset)\n    }\n  }, [])","(tagName: string) => {\n      // Dispatch action to create new tag\n      dispatch(\n        tagsActions.createRequest({\n          assetId: currentAsset?._id,\n          name: tagName,\n        }),\n      )\n    }","_id","useCallback(\n    (tagName: string) => {\n      // Dispatch action to create new tag\n      dispatch(\n        tagsActions.createRequest({\n          assetId: currentAsset?._id,\n          name: tagName,\n        }),\n      )\n    },\n    [currentAsset?._id, dispatch],\n  )","() => {\n    if (!assetItem) {\n      return\n    }\n\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n  }","useCallback(() => {\n    if (!assetItem) {\n      return\n    }\n\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n  }, [assetItem, currentFolderId, dispatch])","() => {\n    if (!assetItem || !currentFolderId) {\n      return\n    }\n\n    dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n  }","useCallback(() => {\n    if (!assetItem || !currentFolderId) {\n      return\n    }\n\n    dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n  }, [assetItem, currentFolderId, dispatch])","useMemo(() => {\n    if (!currentAsset) return false\n    const isLocaleObj = (v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)\n    const fields = [\n      currentAsset.title,\n      currentAsset.altText,\n      currentAsset.description,\n      ...(currentAsset._type === 'sanity.imageAsset' ? [currentAsset.creditLine] : []),\n    ]\n    const anyLocalized = fields.some((f) => isLocaleObj(f))\n    if (!anyLocalized) return false\n    if (!locales || locales.length === 0) return true\n    const configuredIds = new Set(locales.map((l) => l.id))\n    return fields.some((f) => {\n      if (!isLocaleObj(f)) return false\n      return Object.keys(f as object).some((k) => !configuredIds.has(k))\n    })\n  }, [currentAsset, locales])","(v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)","(l) => l.id","f","async () => {\n    if (!currentAsset) return\n\n    const cleanField = (field: unknown): unknown => {\n      if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n      const obj = field as Record<string, string>\n      if (!locales || locales.length === 0) {\n        // Pick the first non-empty value sorted by key for determinism\n        const sorted = Object.keys(obj).sort()\n        return sorted.map((k) => obj[k]).find((v) => v) || ''\n      }\n      const configuredIds = new Set(locales.map((l) => l.id))\n      const cleaned: Record<string, string> = {}\n      for (const [key, val] of Object.entries(obj)) {\n        if (configuredIds.has(key)) cleaned[key] = val\n      }\n      return cleaned\n    }\n\n    await client\n      .patch(currentAsset._id)\n      .set({\n        title: cleanField(currentAsset.title),\n        altText: cleanField(currentAsset.altText),\n        description: cleanField(currentAsset.description),\n        ...(currentAsset._type === 'sanity.imageAsset' && {\n          creditLine: cleanField(currentAsset.creditLine),\n        }),\n      })\n      .commit()\n  }","field","obj","k","(v) => v","configuredIds","useCallback(async () => {\n    if (!currentAsset) return\n\n    const cleanField = (field: unknown): unknown => {\n      if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n      const obj = field as Record<string, string>\n      if (!locales || locales.length === 0) {\n        // Pick the first non-empty value sorted by key for determinism\n        const sorted = Object.keys(obj).sort()\n        return sorted.map((k) => obj[k]).find((v) => v) || ''\n      }\n      const configuredIds = new Set(locales.map((l) => l.id))\n      const cleaned: Record<string, string> = {}\n      for (const [key, val] of Object.entries(obj)) {\n        if (configuredIds.has(key)) cleaned[key] = val\n      }\n      return cleaned\n    }\n\n    await client\n      .patch(currentAsset._id)\n      .set({\n        title: cleanField(currentAsset.title),\n        altText: cleanField(currentAsset.altText),\n        description: cleanField(currentAsset.description),\n        ...(currentAsset._type === 'sanity.imageAsset' && {\n          creditLine: cleanField(currentAsset.creditLine),\n        }),\n      })\n      .commit()\n  }, [client, currentAsset, locales])","(formData) => {\n      if (!assetItem?.asset) {\n        return\n      }\n\n      const sanitizedFormData = sanitizeFormData(formData)\n\n      // Keep an intentionally cleared description as '' (not null) so the EXIF\n      // ImageDescription fallback does not refill it the next time the dialog opens.\n      if (formData.description === '') {\n        sanitizedFormData['description'] = ''\n      }\n\n      dispatch(\n        assetsActions.updateRequest({\n          asset: assetItem?.asset,\n          closeDialogId: assetItem?.asset._id,\n          formData: {\n            ...sanitizedFormData,\n            // Map tags to sanity references\n            opt: {\n              media: {\n                ...sanitizedFormData['opt'].media,\n                tags:\n                  sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n                    _ref: tag.value,\n                    _type: 'reference',\n                    _weak: true,\n                  })) || null,\n                // Preserve the folder reference — it is managed separately and must\n                // not be wiped when patching opt.media via .set().\n                ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n              },\n            },\n          },\n        }),\n      )\n    }","asset","currentAsset?.opt?.media?.folder","'description'","'opt'","(tag: TagSelectOption) => ({\n                    _ref: tag.value,\n                    _type: 'reference',\n                    _weak: true,\n                  })","useCallback(\n    (formData) => {\n      if (!assetItem?.asset) {\n        return\n      }\n\n      const sanitizedFormData = sanitizeFormData(formData)\n\n      // Keep an intentionally cleared description as '' (not null) so the EXIF\n      // ImageDescription fallback does not refill it the next time the dialog opens.\n      if (formData.description === '') {\n        sanitizedFormData['description'] = ''\n      }\n\n      dispatch(\n        assetsActions.updateRequest({\n          asset: assetItem?.asset,\n          closeDialogId: assetItem?.asset._id,\n          formData: {\n            ...sanitizedFormData,\n            // Map tags to sanity references\n            opt: {\n              media: {\n                ...sanitizedFormData['opt'].media,\n                tags:\n                  sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n                    _ref: tag.value,\n                    _type: 'reference',\n                    _weak: true,\n                  })) || null,\n                // Preserve the folder reference — it is managed separately and must\n                // not be wiped when patching opt.media via .set().\n                ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n              },\n            },\n          },\n        }),\n      )\n    },\n    [assetItem?.asset, currentAsset, dispatch],\n  )","() => {\n    if (!assetItem?.asset) {\n      return undefined\n    }\n\n    // Remember that Sanity listeners ignore joins, order clauses and projections\n    const subscriptionAsset = client\n      .listen(groq`*[_id == $id]`, {id: assetItem?.asset._id})\n      .subscribe(handleAssetUpdate)\n\n    return () => {\n      subscriptionAsset?.unsubscribe()\n    }\n  }","[assetItem?.asset, client, handleAssetUpdate]","() => {\n    if (lastCreatedTag) {\n      const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n      const updatedTags = existingTags.concat([lastCreatedTag])\n      setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n    }\n  }","[getValues, lastCreatedTag, setValue]","() => {\n    if (lastRemovedTagIds) {\n      const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n      const updatedTags = existingTags.filter((tag) => {\n        return !lastRemovedTagIds.includes(tag.value)\n      })\n\n      setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n    }\n  }","[getValues, lastRemovedTagIds, setValue]","existingTags","updatedTags","tag","() => {\n    if (assetUpdatedPrev.current !== assetItem?.asset._updatedAt) {\n      reset(generateDefaultValues(assetItem?.asset))\n    }\n    assetUpdatedPrev.current = assetItem?.asset._updatedAt\n  }","[assetItem?.asset, generateDefaultValues, reset]","hasOrphanedLocales && (\n          <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n            <Flex align=\"center\" justify=\"space-between\" gap={3}>\n              <Text size={1}>\n                This asset has localized fields that are no longer configured. Clean them up to\n                avoid validation errors.\n              </Text>\n              <Button\n                fontSize={1}\n                mode=\"ghost\"\n                onClick={handleCleanupLocales}\n                text=\"Cleanup localized fields\"\n                tone=\"caution\"\n              />\n            </Flex>\n          </Card>\n        )","<Button\n            disabled={formUpdating}\n            fontSize={1}\n            mode=\"bleed\"\n            onClick={handleDelete}\n            text=\"Delete\"\n            tone=\"critical\"\n          />","handleSubmit(onSubmit)","<FormSubmitButton\n            disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n            isValid={isValid}\n            lastUpdated={currentAsset?._updatedAt}\n            onClick={handleSubmit(onSubmit)}\n          />","formUpdating || !isDirty || !isValid || hasOrphanedLocales","currentAsset?._updatedAt","<Flex justify=\"space-between\">\n          {/* Delete button */}\n          <Button\n            disabled={formUpdating}\n            fontSize={1}\n            mode=\"bleed\"\n            onClick={handleDelete}\n            text=\"Delete\"\n            tone=\"critical\"\n          />\n\n          {/* Submit button */}\n          <FormSubmitButton\n            disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n            isValid={isValid}\n            lastUpdated={currentAsset?._updatedAt}\n            onClick={handleSubmit(onSubmit)}\n          />\n        </Flex>","<Box padding={3}>\n      <Stack gap={3}>\n        {hasOrphanedLocales && (\n          <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n            <Flex align=\"center\" justify=\"space-between\" gap={3}>\n              <Text size={1}>\n                This asset has localized fields that are no longer configured. Clean them up to\n                avoid validation errors.\n              </Text>\n              <Button\n                fontSize={1}\n                mode=\"ghost\"\n                onClick={handleCleanupLocales}\n                text=\"Cleanup localized fields\"\n                tone=\"caution\"\n              />\n            </Flex>\n          </Card>\n        )}\n        <Flex justify=\"space-between\">\n          {/* Delete button */}\n          <Button\n            disabled={formUpdating}\n            fontSize={1}\n            mode=\"bleed\"\n            onClick={handleDelete}\n            text=\"Delete\"\n            tone=\"critical\"\n          />\n\n          {/* Submit button */}\n          <FormSubmitButton\n            disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n            isValid={isValid}\n            lastUpdated={currentAsset?._updatedAt}\n            onClick={handleSubmit(onSubmit)}\n          />\n        </Flex>\n      </Stack>\n    </Box>","{\n    control,\n    errors,\n    formUpdating,\n    register,\n    setValue,\n    assetTagOptions,\n    allTagOptions,\n    handleCreateTag,\n    currentAsset,\n    folderPath: currentFolderPath,\n    folderMissing: !!currentFolderId && !currentFolderPath,\n    onChangeFolder: handleChangeFolder,\n    onRemoveFolder: handleRemoveFolder,\n    creditLine,\n    locales,\n  }","!!currentFolderId && !currentFolderPath","['column-reverse', 'column-reverse', 'row-reverse']","[5, 5, 0]","({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList gap={2}>\n                    <Tab\n                      aria-controls=\"details-panel\"\n                      disabled={formUpdating}\n                      id=\"details-tab\"\n                      label=\"Details\"\n                      onClick={() => setTabSection('details')}\n                      selected={tabSection === 'details'}\n                      size={2}\n                    />\n                    <Tab\n                      aria-controls=\"references-panel\"\n                      disabled={formUpdating}\n                      id=\"references-tab\"\n                      label={`References${\n                        !isLoading && Array.isArray(uniqueReferringDocuments)\n                          ? ` (${uniqueReferringDocuments.length})`\n                          : ''\n                      }`}\n                      onClick={() => setTabSection('references')}\n                      selected={tabSection === 'references'}\n                      size={2}\n                    />\n                  </TabList>\n\n                  {/* Form fields */}\n                  <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n                    {/* Deleted notification */}\n                    {!assetItem && (\n                      <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n                        <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n                      </Card>\n                    )}\n\n                    {/* Hidden button to enable enter key submissions */}\n                    <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n                    {/* Panel: details */}\n                    <TabPanel\n                      aria-labelledby=\"details\"\n                      hidden={tabSection !== 'details'}\n                      id=\"details-panel\"\n                    >\n                      {CustomDetails ? (\n                        <CustomDetails\n                          {...detailsProps}\n                          renderDefaultDetails={renderDefaultDetails}\n                        />\n                      ) : (\n                        <Details {...detailsProps} />\n                      )}\n                    </TabPanel>\n\n                    {/* Panel: References */}\n                    <TabPanel\n                      aria-labelledby=\"references\"\n                      hidden={tabSection !== 'references'}\n                      id=\"references-panel\"\n                    >\n                      <Box marginTop={5}>\n                        {assetItem?.asset && (\n                          <DocumentList\n                            documents={uniqueReferringDocuments}\n                            isLoading={isLoading}\n                          />\n                        )}\n                      </Box>\n                    </TabPanel>\n                  </Box>\n                </>\n              )\n            }","{isLoading, referringDocuments}","<Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n          <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n            // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n            documentStore={documentStore}\n            id={currentAsset._id}\n          >\n            {({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList gap={2}>\n                    <Tab\n                      aria-controls=\"details-panel\"\n                      disabled={formUpdating}\n                      id=\"details-tab\"\n                      label=\"Details\"\n                      onClick={() => setTabSection('details')}\n                      selected={tabSection === 'details'}\n                      size={2}\n                    />\n                    <Tab\n                      aria-controls=\"references-panel\"\n                      disabled={formUpdating}\n                      id=\"references-tab\"\n                      label={`References${\n                        !isLoading && Array.isArray(uniqueReferringDocuments)\n                          ? ` (${uniqueReferringDocuments.length})`\n                          : ''\n                      }`}\n                      onClick={() => setTabSection('references')}\n                      selected={tabSection === 'references'}\n                      size={2}\n                    />\n                  </TabList>\n\n                  {/* Form fields */}\n                  <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n                    {/* Deleted notification */}\n                    {!assetItem && (\n                      <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n                        <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n                      </Card>\n                    )}\n\n                    {/* Hidden button to enable enter key submissions */}\n                    <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n                    {/* Panel: details */}\n                    <TabPanel\n                      aria-labelledby=\"details\"\n                      hidden={tabSection !== 'details'}\n                      id=\"details-panel\"\n                    >\n                      {CustomDetails ? (\n                        <CustomDetails\n                          {...detailsProps}\n                          renderDefaultDetails={renderDefaultDetails}\n                        />\n                      ) : (\n                        <Details {...detailsProps} />\n                      )}\n                    </TabPanel>\n\n                    {/* Panel: References */}\n                    <TabPanel\n                      aria-labelledby=\"references\"\n                      hidden={tabSection !== 'references'}\n                      id=\"references-panel\"\n                    >\n                      <Box marginTop={5}>\n                        {assetItem?.asset && (\n                          <DocumentList\n                            documents={uniqueReferringDocuments}\n                            isLoading={isLoading}\n                          />\n                        )}\n                      </Box>\n                    </TabPanel>\n                  </Box>\n                </>\n              )\n            }}\n          </WithReferringDocuments>\n        </Box>","{aspectRatio: '1'}","isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />","isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )","<Box style={{aspectRatio: '1'}}>\n            {/* File */}\n            {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n            {/* Image */}\n            {isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )}\n          </Box>","currentAsset && (\n            <Box marginTop={4}>\n              <AssetMetadata asset={currentAsset} item={assetItem} />\n            </Box>\n          )","<Box flex={1} padding={4}>\n          <Box style={{aspectRatio: '1'}}>\n            {/* File */}\n            {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n            {/* Image */}\n            {isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )}\n          </Box>\n\n          {/* Metadata */}\n          {currentAsset && (\n            <Box marginTop={4}>\n              <AssetMetadata asset={currentAsset} item={assetItem} />\n            </Box>\n          )}\n        </Box>","<Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n        <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n          <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n            // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n            documentStore={documentStore}\n            id={currentAsset._id}\n          >\n            {({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList gap={2}>\n                    <Tab\n                      aria-controls=\"details-panel\"\n                      disabled={formUpdating}\n                      id=\"details-tab\"\n                      label=\"Details\"\n                      onClick={() => setTabSection('details')}\n                      selected={tabSection === 'details'}\n                      size={2}\n                    />\n                    <Tab\n                      aria-controls=\"references-panel\"\n                      disabled={formUpdating}\n                      id=\"references-tab\"\n                      label={`References${\n                        !isLoading && Array.isArray(uniqueReferringDocuments)\n                          ? ` (${uniqueReferringDocuments.length})`\n                          : ''\n                      }`}\n                      onClick={() => setTabSection('references')}\n                      selected={tabSection === 'references'}\n                      size={2}\n                    />\n                  </TabList>\n\n                  {/* Form fields */}\n                  <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n                    {/* Deleted notification */}\n                    {!assetItem && (\n                      <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n                        <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n                      </Card>\n                    )}\n\n                    {/* Hidden button to enable enter key submissions */}\n                    <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n                    {/* Panel: details */}\n                    <TabPanel\n                      aria-labelledby=\"details\"\n                      hidden={tabSection !== 'details'}\n                      id=\"details-panel\"\n                    >\n                      {CustomDetails ? (\n                        <CustomDetails\n                          {...detailsProps}\n                          renderDefaultDetails={renderDefaultDetails}\n                        />\n                      ) : (\n                        <Details {...detailsProps} />\n                      )}\n                    </TabPanel>\n\n                    {/* Panel: References */}\n                    <TabPanel\n                      aria-labelledby=\"references\"\n                      hidden={tabSection !== 'references'}\n                      id=\"references-panel\"\n                    >\n                      <Box marginTop={5}>\n                        {assetItem?.asset && (\n                          <DocumentList\n                            documents={uniqueReferringDocuments}\n                            isLoading={isLoading}\n                          />\n                        )}\n                      </Box>\n                    </TabPanel>\n                  </Box>\n                </>\n              )\n            }}\n          </WithReferringDocuments>\n        </Box>\n\n        <Box flex={1} padding={4}>\n          <Box style={{aspectRatio: '1'}}>\n            {/* File */}\n            {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n            {/* Image */}\n            {isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )}\n          </Box>\n\n          {/* Metadata */}\n          {currentAsset && (\n            <Box marginTop={4}>\n              <AssetMetadata asset={currentAsset} item={assetItem} />\n            </Box>\n          )}\n        </Box>\n      </Flex>","<Dialog animate footer={footer} header=\"Asset details\" id={id} onClose={handleClose} width={3}>\n      {/*\n        We reverse direction to ensure the download button doesn't appear (in the DOM) before other tabbable items.\n        This ensures that the dialog doesn't scroll down to the download button (which on smaller screens, can sometimes\n        be below the fold).\n      */}\n      <Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n        <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n          <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n            // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n            documentStore={documentStore}\n            id={currentAsset._id}\n          >\n            {({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList gap={2}>\n                    <Tab\n                      aria-controls=\"details-panel\"\n                      disabled={formUpdating}\n                      id=\"details-tab\"\n                      label=\"Details\"\n                      onClick={() => setTabSection('details')}\n                      selected={tabSection === 'details'}\n                      size={2}\n                    />\n                    <Tab\n                      aria-controls=\"references-panel\"\n                      disabled={formUpdating}\n                      id=\"references-tab\"\n                      label={`References${\n                        !isLoading && Array.isArray(uniqueReferringDocuments)\n                          ? ` (${uniqueReferringDocuments.length})`\n                          : ''\n                      }`}\n                      onClick={() => setTabSection('references')}\n                      selected={tabSection === 'references'}\n                      size={2}\n                    />\n                  </TabList>\n\n                  {/* Form fields */}\n                  <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n                    {/* Deleted notification */}\n                    {!assetItem && (\n                      <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n                        <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n                      </Card>\n                    )}\n\n                    {/* Hidden button to enable enter key submissions */}\n                    <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n                    {/* Panel: details */}\n                    <TabPanel\n                      aria-labelledby=\"details\"\n                      hidden={tabSection !== 'details'}\n                      id=\"details-panel\"\n                    >\n                      {CustomDetails ? (\n                        <CustomDetails\n                          {...detailsProps}\n                          renderDefaultDetails={renderDefaultDetails}\n                        />\n                      ) : (\n                        <Details {...detailsProps} />\n                      )}\n                    </TabPanel>\n\n                    {/* Panel: References */}\n                    <TabPanel\n                      aria-labelledby=\"references\"\n                      hidden={tabSection !== 'references'}\n                      id=\"references-panel\"\n                    >\n                      <Box marginTop={5}>\n                        {assetItem?.asset && (\n                          <DocumentList\n                            documents={uniqueReferringDocuments}\n                            isLoading={isLoading}\n                          />\n                        )}\n                      </Box>\n                    </TabPanel>\n                  </Box>\n                </>\n              )\n            }}\n          </WithReferringDocuments>\n        </Box>\n\n        <Box flex={1} padding={4}>\n          <Box style={{aspectRatio: '1'}}>\n            {/* File */}\n            {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n            {/* Image */}\n            {isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )}\n          </Box>\n\n          {/* Metadata */}\n          {currentAsset && (\n            <Box marginTop={4}>\n              <AssetMetadata asset={currentAsset} item={assetItem} />\n            </Box>\n          )}\n        </Box>\n      </Flex>\n\n      {children}\n    </Dialog>","fallback","v","l","(e: KeyboardEvent) => {\n      if (isHotkey(hotkey, e)) {\n        keyPressed.current = true\n        if (onPress) {\n          onPress()\n        }\n      }\n    }","useCallback(\n    (e: KeyboardEvent) => {\n      if (isHotkey(hotkey, e)) {\n        keyPressed.current = true\n        if (onPress) {\n          onPress()\n        }\n      }\n    },\n    [hotkey, onPress],\n  )","() => {\n    keyPressed.current = false\n  }","useCallback(() => {\n    keyPressed.current = false\n  }, [])","() => {\n    window.addEventListener('keydown', downHandler)\n    window.addEventListener('keyup', upHandler)\n    // Remove event listeners on cleanup\n    return () => {\n      window.removeEventListener('keydown', downHandler)\n      window.removeEventListener('keyup', upHandler)\n    }\n  }","[downHandler, upHandler]","(state) => state.assets.lastPicked","(state) => selectAssetById(state, id)","state","(state) => {\n    if (source !== 'replace-asset') {\n      return undefined\n    }\n    const dialog = state.dialog.items.find((d) => d.type === 'dialogAllAssets')\n    return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n  }","(d) => d.type === 'dialogAllAssets'","(state) =>\n    assetToReplaceId ? selectAssetById(state, assetToReplaceId) : undefined","() => {\n    if (!assetToReplaceId || !isImageAsset(asset) || assetToReplace?.updating) {\n      return\n    }\n\n    dispatch(assetsActions.updateImageReferences({asset, id: assetToReplaceId}))\n    toast.push({\n      status: 'info',\n      title:\n        'Updating in progress. Depending on the amount of changes, this could take a few minutes.',\n    })\n    dispatch(dialogActions.clear())\n  }","updating","(e: MouseEvent<HTMLDivElement>) => {\n    e.stopPropagation()\n\n    if (source === 'replace-asset') {\n      handleReplaceAsset()\n      return\n    }\n\n    if (selected) {\n      return\n    }\n\n    if (onSelect && !isMultiSelect) {\n      onSelect([\n        {\n          kind: 'assetDocumentId',\n          value: asset._id,\n        },\n      ])\n    } else if (onSelect && isMultiSelect) {\n      if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    } else if (shiftPressed.current) {\n      if (picked) {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      } else {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      }\n    } else {\n      dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n    }\n  }","_id","shiftPressed.current","(e: MouseEvent) => {\n    e.stopPropagation()\n\n    if (source === 'replace-asset') {\n      handleReplaceAsset()\n      return\n    }\n\n    if (selected) {\n      return\n    }\n\n    if (onSelect && !isMultiSelect) {\n      dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n    } else if (shiftPressed.current && !picked) {\n      dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n    } else {\n      dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n    }\n  }","{\n            cursor: selected ? 'default' : 'pointer',\n            position: 'relative',\n          }","selected ? 'default' : 'pointer'","{height: '100%', opacity: opacityPreview}","isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />","isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 250, width: 250})}\n                style={{\n                  draggable: false,\n                  transition: 'opacity 1000ms',\n                }}\n              />\n            )","<div\n            data-testid={`media-asset-card-${asset._id}`}\n            onClick={handleAssetClick}\n            style={{height: '100%', opacity: opacityPreview}}\n          >\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 250, width: 250})}\n                style={{\n                  draggable: false,\n                  transition: 'opacity 1000ms',\n                }}\n              />\n            )}\n          </div>","`media-asset-card-${asset._id}`","selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                opacity: opacityContainer,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )","updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )","<Box\n          flex={1}\n          style={{\n            cursor: selected ? 'default' : 'pointer',\n            position: 'relative',\n          }}\n        >\n          <div\n            data-testid={`media-asset-card-${asset._id}`}\n            onClick={handleAssetClick}\n            style={{height: '100%', opacity: opacityPreview}}\n          >\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 250, width: 250})}\n                style={{\n                  draggable: false,\n                  transition: 'opacity 1000ms',\n                }}\n              />\n            )}\n          </div>\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                opacity: opacityContainer,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n        </Box>","{opacity: opacityContainer}","onSelect && !isMultiSelect ? (\n            <EditIcon\n              style={{\n                flexShrink: 0,\n                opacity: 0.5,\n              }}\n            />\n          ) : (\n            <Checkbox\n              checked={picked}\n              readOnly\n              style={{\n                flexShrink: 0,\n                pointerEvents: 'none',\n                transform: 'scale(0.8)',\n              }}\n            />\n          )","<Box marginLeft={2}>\n            <Text muted size={0} textOverflow=\"ellipsis\">\n              {asset.originalFilename}\n            </Text>\n          </Box>","originalFilename","<ContextActionContainer\n          align=\"center\"\n          onClick={handleContextActionClick}\n          paddingX={1}\n          $scheme={scheme}\n          style={{opacity: opacityContainer}}\n        >\n          {onSelect && !isMultiSelect ? (\n            <EditIcon\n              style={{\n                flexShrink: 0,\n                opacity: 0.5,\n              }}\n            />\n          ) : (\n            <Checkbox\n              checked={picked}\n              readOnly\n              style={{\n                flexShrink: 0,\n                pointerEvents: 'none',\n                transform: 'scale(0.8)',\n              }}\n            />\n          )}\n\n          <Box marginLeft={2}>\n            <Text muted size={0} textOverflow=\"ellipsis\">\n              {asset.originalFilename}\n            </Text>\n          </Box>\n        </ContextActionContainer>","error && (\n          <Box\n            padding={3}\n            style={{\n              position: 'absolute',\n              right: 0,\n              top: 0,\n            }}\n          >\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningOutlineIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )","<CardWrapper padding={1}>\n      <CardContainer direction=\"column\" $picked={picked} $updating={item.updating}>\n        {/* Image */}\n        <Box\n          flex={1}\n          style={{\n            cursor: selected ? 'default' : 'pointer',\n            position: 'relative',\n          }}\n        >\n          <div\n            data-testid={`media-asset-card-${asset._id}`}\n            onClick={handleAssetClick}\n            style={{height: '100%', opacity: opacityPreview}}\n          >\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 250, width: 250})}\n                style={{\n                  draggable: false,\n                  transition: 'opacity 1000ms',\n                }}\n              />\n            )}\n          </div>\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                opacity: opacityContainer,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n        </Box>\n\n        {/* Footer */}\n        <ContextActionContainer\n          align=\"center\"\n          onClick={handleContextActionClick}\n          paddingX={1}\n          $scheme={scheme}\n          style={{opacity: opacityContainer}}\n        >\n          {onSelect && !isMultiSelect ? (\n            <EditIcon\n              style={{\n                flexShrink: 0,\n                opacity: 0.5,\n              }}\n            />\n          ) : (\n            <Checkbox\n              checked={picked}\n              readOnly\n              style={{\n                flexShrink: 0,\n                pointerEvents: 'none',\n                transform: 'scale(0.8)',\n              }}\n            />\n          )}\n\n          <Box marginLeft={2}>\n            <Text muted size={0} textOverflow=\"ellipsis\">\n              {asset.originalFilename}\n            </Text>\n          </Box>\n        </ContextActionContainer>\n\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box\n            padding={3}\n            style={{\n              position: 'absolute',\n              right: 0,\n              top: 0,\n            }}\n          >\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningOutlineIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </CardContainer>\n    </CardWrapper>","{folderId, name, totalCount}: Props","() => dispatch(foldersActions.currentFolderSet({folderId}))","getSchemeColor(scheme, 'bg')","{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n        }","<Flex align=\"center\" flex={1} justify=\"center\">\n            <FolderGlyph />\n          </Flex>","{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}","<Text\n              size={1}\n              style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n              weight=\"semibold\"\n            >\n              {name}\n            </Text>","{lineHeight: '1.2em'}","<Text muted size={0} style={{lineHeight: '1.2em'}}>\n              {totalCount} item{totalCount === 1 ? '' : 's'}\n            </Text>","totalCount === 1 ? '' : 's'","<Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n          <Flex align=\"center\" flex={1} justify=\"center\">\n            <FolderGlyph />\n          </Flex>\n\n          <Stack gap={2}>\n            <Text\n              size={1}\n              style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n              weight=\"semibold\"\n            >\n              {name}\n            </Text>\n            <Text muted size={0} style={{lineHeight: '1.2em'}}>\n              {totalCount} item{totalCount === 1 ? '' : 's'}\n            </Text>\n          </Stack>\n        </Flex>","<CardWrapper padding={1}>\n      <FolderCard\n        onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n        padding={3}\n        radius={2}\n        style={{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n        }}\n      >\n        <Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n          <Flex align=\"center\" flex={1} justify=\"center\">\n            <FolderGlyph />\n          </Flex>\n\n          <Stack gap={2}>\n            <Text\n              size={1}\n              style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n              weight=\"semibold\"\n            >\n              {name}\n            </Text>\n            <Text muted size={0} style={{lineHeight: '1.2em'}}>\n              {totalCount} item{totalCount === 1 ? '' : 's'}\n            </Text>\n          </Stack>\n        </Flex>\n      </FolderCard>\n    </CardWrapper>","(state) => selectUploadById(state, id)","filesize(item.size, {base: 10, round: 0})","size","() => {\n    dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n  }","hash","getSchemeColor(scheme, 'bg')","{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n          height: '100%',\n          position: 'relative',\n        }","<div\n          style={{\n            background: 'var(--card-fg-color)',\n            bottom: 0,\n            height: '1px',\n            left: 0,\n            position: 'absolute',\n            width: '100%',\n            transform: `scaleX(${percentLoaded * 0.01})`,\n            transformOrigin: 'bottom left',\n            transition: 'all 1000ms ease-out',\n          }}\n        />","`scaleX(${percentLoaded * 0.01})`","{position: 'relative'}","item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{\n                opacity: 0.4,\n              }}\n            />\n          )","assetType","objectUrl","item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"80px\" />\n            </div>\n          )","!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              direction=\"column\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={4}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )","<Box flex={1} style={{position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{\n                opacity: 0.4,\n              }}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"80px\" />\n            </div>\n          )}\n\n          {/*\n          Cancel upload button.\n          Assets will only have a `complete` status _after_ it has been created on your dataset.\n          As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n          has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n        */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              direction=\"column\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={4}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>","{height: `${PANEL_HEIGHT}px`}","<Box flex={1} marginRight={1}>\n            <Text size={0} textOverflow=\"ellipsis\">\n              {item.name} ({fileSize})\n            </Text>\n          </Box>","name","{flexShrink: 0}","<Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n            {status}\n          </Text>","<Flex\n          align=\"center\"\n          justify=\"space-between\"\n          paddingX={2}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Box flex={1} marginRight={1}>\n            <Text size={0} textOverflow=\"ellipsis\">\n              {item.name} ({fileSize})\n            </Text>\n          </Box>\n          <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n            {status}\n          </Text>\n        </Flex>","<CardWrapper padding={1}>\n      <Flex\n        direction=\"column\"\n        flex={1}\n        style={{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n          height: '100%',\n          position: 'relative',\n        }}\n      >\n        {/* Progress bar */}\n        <div\n          style={{\n            background: 'var(--card-fg-color)',\n            bottom: 0,\n            height: '1px',\n            left: 0,\n            position: 'absolute',\n            width: '100%',\n            transform: `scaleX(${percentLoaded * 0.01})`,\n            transformOrigin: 'bottom left',\n            transition: 'all 1000ms ease-out',\n          }}\n        />\n\n        <Box flex={1} style={{position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{\n                opacity: 0.4,\n              }}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"80px\" />\n            </div>\n          )}\n\n          {/*\n          Cancel upload button.\n          Assets will only have a `complete` status _after_ it has been created on your dataset.\n          As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n          has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n        */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              direction=\"column\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={4}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n\n        {/* Footer */}\n        <Flex\n          align=\"center\"\n          justify=\"space-between\"\n          paddingX={2}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Box flex={1} marginRight={1}>\n            <Text size={0} textOverflow=\"ellipsis\">\n              {item.name} ({fileSize})\n            </Text>\n          </Box>\n          <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n            {status}\n          </Text>\n        </Flex>\n      </Flex>\n    </CardWrapper>","{\n    item,\n    selected,\n    source,\n  }: {\n    item: CardAssetData | CardFolderData | CardUploadData\n    selected: boolean\n    source?: string\n  }","<CardAsset id={item.id} selected={selected} source={source} />","id","<CardFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />","folderId","name","totalCount","<CardUpload id={item.id} />","...rest","<StyledItemContainer ref={ref} {...rest} />","<StyledListContainer ref={ref} {...rest} />","(state) => state.selected.assets","(selectedAssets && selectedAssets.map((asset) => asset._id)) || []","(asset) => asset._id","(index) => {\n        const item = items[index]\n        return item?.id ?? index\n      }","{\n        Item: ItemContainer,\n        List: ListContainer,\n      }","(index) => {\n        const item = items[index]!\n        const selected = selectedIds.includes(item.id)\n        return <VirtualCell item={item} selected={selected} source={source} />\n      }","item","index","{overflowX: 'hidden', overflowY: 'scroll'}","<VirtuosoGrid\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        return item?.id ?? index\n      }}\n      components={{\n        Item: ItemContainer,\n        List: ListContainer,\n      }}\n      endReached={onLoadMore}\n      itemContent={(index) => {\n        const item = items[index]!\n        const selected = selectedIds.includes(item.id)\n        return <VirtualCell item={item} selected={selected} source={source} />\n      }}\n      overscan={48}\n      style={{overflowX: 'hidden', overflowY: 'scroll'}}\n      totalCount={totalCount}\n    />","(state) => state.assets.byIds","(state) => state.assets.fetchCount","(state) => state.assets.fetching","(state) => state.assets.fetchingError","(state) => state.assets.pageSize","(state) => state.search.query","(state) => state.search.facets","(state) => state.folders.currentFolderId","(state) => state.folders.currentFolderUnfiled","(state) => {\n    const dialog = state.dialog.items.find((item) => item.type === 'dialogAllAssets')\n    return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n  }","() =>\n      searchQuery.length > 0 ||\n      searchFacets.length > 0 ||\n      Boolean(currentFolderId) ||\n      currentFolderUnfiled","searchFacets.length","length","() => {\n    const {dialog, folders, search} = store.getState()\n    const {query, facets} = search\n    const dialogItem = dialog.items.find((item) => item.type === 'dialogAllAssets')\n\n    savedBrowserStateRef.current = {\n      assetId: dialogItem?.type === 'dialogAllAssets' ? dialogItem.assetId : undefined,\n      query,\n      facets,\n      folderId: folders.currentFolderId,\n      folderUnfiled: folders.currentFolderUnfiled,\n    }\n\n    if (query.length > 0) {\n      dispatch(searchActions.querySet({searchQuery: ''}))\n    }\n    if (facets.length > 0) {\n      dispatch(searchActions.facetsClear())\n    }\n    if (folders.currentFolderId || folders.currentFolderUnfiled) {\n      dispatch(foldersActions.currentFolderClear())\n    }\n\n    return () => {\n      const saved = savedBrowserStateRef.current\n      if (!saved) {\n        return\n      }\n\n      const hadScope =\n        saved.query.length > 0 ||\n        saved.facets.length > 0 ||\n        Boolean(saved.folderId) ||\n        saved.folderUnfiled\n\n      if (saved.query.length > 0) {\n        dispatch(searchActions.querySet({searchQuery: saved.query}))\n      }\n      for (const facet of saved.facets) {\n        dispatch(searchActions.facetsAdd({facet: omitFacetId(facet)}))\n      }\n      if (saved.folderId) {\n        dispatch(foldersActions.currentFolderSet({folderId: saved.folderId}))\n      } else if (saved.folderUnfiled) {\n        dispatch(foldersActions.currentFolderShowUnfiled())\n      }\n\n      // Changing the search or folder runs epics that clear picks — put the asset being\n      // replaced back so closing the dialog keeps the browser selection.\n      if (hadScope && saved.assetId) {\n        dispatch(assetsActions.pick({assetId: saved.assetId, picked: true}))\n      }\n    }\n  }","[dispatch, store]","dialog","(item) => item.type === 'dialogAllAssets'","() => {\n    let previousIds = store.getState().assets.allIds\n    let awaitingSettle = false\n\n    return store.subscribe(() => {\n      const {allIds, fetching: isFetching} = store.getState().assets\n      const listCleared = allIds !== previousIds && allIds.length === 0\n      previousIds = allIds\n\n      if (listCleared) {\n        awaitingSettle = true\n        setAwaitingRefetch(true)\n        return\n      }\n      if (awaitingSettle && !isFetching) {\n        awaitingSettle = false\n        setAwaitingRefetch(false)\n      }\n    })\n  }","[store]","combinedItems.filter((item) => {\n    if (item.type !== 'asset' || item.id === assetToReplaceId) {\n      return false\n    }\n    const asset = assetsById[item.id]?.asset\n    return asset ? isImageAsset(asset) : false\n  })","(item) => {\n    if (item.type !== 'asset' || item.id === assetToReplaceId) {\n      return false\n    }\n    const asset = assetsById[item.id]?.asset\n    return asset ? isImageAsset(asset) : false\n  }","item","() => {\n    if (\n      scopeActive ||\n      fetching ||\n      awaitingRefetch ||\n      fetchingError ||\n      reducedItems.length > 0 ||\n      !hasFetchedOnce ||\n      !hasMorePages\n    ) {\n      return\n    }\n    dispatch(assetsActions.loadNextPage())\n  }","[\n    dispatch,\n    scopeActive,\n    fetching,\n    awaitingRefetch,\n    fetchingError,\n    reducedItems.length,\n    hasFetchedOnce,\n    hasMorePages,\n  ]","() => {\n    if (!fetching) {\n      dispatch(assetsActions.loadNextPage())\n    }\n  }","<Box height=\"fill\">\n      {isEmpty ? (\n        <Box padding={5}>\n          <Text size={1} weight=\"semibold\">\n            There are no replacement images\n          </Text>\n        </Box>\n      ) : (\n        <Box height=\"fill\">\n          <AssetGridVirtualized\n            items={reducedItems}\n            onLoadMore={handleLoadMoreItems}\n            source=\"replace-asset\"\n          />\n        </Box>\n      )}\n    </Box>","state","{id}","() => {\n    dispatch(dialogActions.clear())\n  }","useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])","<Box padding={4} style={{height: '50vh'}}>\n        <ReplaceAssetsOverview />\n      </Box>","<Dialog header=\"Choose a replacement image\" id={id} onClose={handleClose} width={3}>\n      <Box padding={4} style={{height: '50vh'}}>\n        <ReplaceAssetsOverview />\n      </Box>\n\n      {children}\n    </Dialog>","() => {\n    dispatch(dialogActions.remove({id: dialog?.id}))\n  }","id","() => {\n    // Close target dialog, if provided\n    if (dialog?.closeDialogId) {\n      dispatch(dialogActions.remove({id: dialog?.closeDialogId}))\n    }\n\n    if (dialog?.confirmCallbackAction) {\n      dispatch(dialog.confirmCallbackAction)\n    }\n\n    // Close self\n    handleClose()\n  }","dialog?.closeDialogId","() => (\n    <Box padding={3}>\n      <Flex justify=\"space-between\">\n        <Button fontSize={1} mode=\"bleed\" onClick={handleClose} text=\"Cancel\" />\n        <Button\n          fontSize={1}\n          onClick={handleConfirm}\n          text={dialog?.confirmText}\n          tone={dialog?.tone}\n        />\n      </Flex>\n    </Box>\n  )","confirmText","tone","() => (\n    <Flex align=\"center\">\n      <Box paddingX={1}>\n        <WarningOutlineIcon />\n      </Box>\n      <Box marginLeft={2}>{dialog?.headerTitle}</Box>\n    </Flex>\n  )","headerTitle","<Footer />","<Header />","dialog?.title && <Text size={1}>{dialog.title}</Text>","dialog?.title","dialog?.description && (\n            <Text muted size={1}>\n              <em>{dialog.description}</em>\n            </Text>\n          )","dialog?.description","<Box paddingX={4} paddingY={4}>\n        <Stack gap={3}>\n          {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n          {dialog?.description && (\n            <Text muted size={1}>\n              <em>{dialog.description}</em>\n            </Text>\n          )}\n        </Stack>\n      </Box>","<Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      // oxlint-disable-next-line react/static-components\n      header={<Header />}\n      id=\"confirm\"\n      onClose={handleClose}\n      width={1}\n    >\n      <Box paddingX={4} paddingY={4}>\n        <Stack gap={3}>\n          {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n          {dialog?.description && (\n            <Text muted size={1}>\n              <em>{dialog.description}</em>\n            </Text>\n          )}\n        </Stack>\n      </Box>\n\n      {children}\n    </Dialog>","{parentFolderId, id}","(state) => state.folders.creating","(state) => state.folders.creatingError","(state) => selectFolderPathById(state, parentFolderId)","state","{\n      name: '',\n    }","{\n    defaultValues: {\n      name: '',\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n  }","{errors, isDirty, isValid}","() => {\n    dispatch(dialogActions.clear())\n  }","(formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      foldersActions.createRequest({\n        name: sanitizedFormData['name'],\n        parentId: parentFolderId || null,\n      }),\n    )\n  }","'name'","() => {\n    if (creatingError) {\n      setError('name', {message: creatingError.message})\n    }\n  }","[creatingError, setError]","() => (\n    <Box padding={3}>\n      <Flex justify=\"flex-end\">\n        <FormSubmitButton\n          disabled={creating || !isDirty || !isValid}\n          isValid={isValid}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )","<Footer />","handleSubmit(onSubmit)","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","parentPath && (\n          <Box marginBottom={3}>\n            <Text muted size={1}>\n              Creating inside {parentPath}\n            </Text>\n          </Box>\n        )","register('name')","<FormFieldInputText\n          {...register('name')}\n          disabled={creating}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {parentPath && (\n          <Box marginBottom={3}>\n            <Text muted size={1}>\n              Creating inside {parentPath}\n            </Text>\n          </Box>\n        )}\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={creating}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>","<Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Create Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {parentPath && (\n          <Box marginBottom={3}>\n            <Text muted size={1}>\n              Creating inside {parentPath}\n            </Text>\n          </Box>\n        )}\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={creating}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>","{expandedIds, node, onSelect, selectedId}: FolderNodeProps","expandedIds.has(node.id)","id","() => onSelect(node.id)","hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n            selectedId={selectedId}\n          />\n        ))","children","<TreeItem\n      expanded={expandedIds.has(node.id)}\n      id={node.id}\n      onClick={() => onSelect(node.id)}\n      selected={selected}\n      text={`${node.name} (${node.totalCount})`}\n      weight={selected ? 'semibold' : 'medium'}\n    >\n      {hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n            selectedId={selectedId}\n          />\n        ))}\n    </TreeItem>","`${node.name} (${node.totalCount})`","selected ? 'semibold' : 'medium'","{expandedIds, folderTree, onSelect, selectedId}: FolderTreeProps","folderTree.map((node) => (\n      <FolderNode\n        expandedIds={expandedIds}\n        key={node.id}\n        node={node}\n        onSelect={onSelect}\n        selectedId={selectedId}\n      />\n    ))","(node) => (\n      <FolderNode\n        expandedIds={expandedIds}\n        key={node.id}\n        node={node}\n        onSelect={onSelect}\n        selectedId={selectedId}\n      />\n    )","<Tree gap={1}>\n    {folderTree.map((node) => (\n      <FolderNode\n        expandedIds={expandedIds}\n        key={node.id}\n        node={node}\n        onSelect={onSelect}\n        selectedId={selectedId}\n      />\n    ))}\n  </Tree>","{children, dialog}: Props","(state) => state.folders.byId","getExpandedIdSet(folderId || null, byId)","folderId || null","useMemo(() => getExpandedIdSet(folderId || null, byId), [byId, folderId])","() => {\n    dispatch(dialogActions.remove({id}))\n  }","() => {\n    if (!selectedId) {\n      return\n    }\n\n    dispatch(\n      assetsActions.folderSetRequest({\n        assets,\n        closeDialogId: id,\n        folderId: selectedId,\n      }),\n    )\n  }","<Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />","pluralize('asset', assets.length)","length","assets.length","<Button\n              disabled={!selectedId}\n              mode=\"default\"\n              onClick={handleMove}\n              text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n              tone=\"primary\"\n            />","!selectedId","`Move ${assets.length} ${pluralize('asset', assets.length)}`","<Box padding={3}>\n          <Flex justify=\"flex-end\" gap={2}>\n            <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n            <Button\n              disabled={!selectedId}\n              mode=\"default\"\n              onClick={handleMove}\n              text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n              tone=\"primary\"\n            />\n          </Flex>\n        </Box>","<Text size={1}>\n          Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n        </Text>","{maxHeight: '22rem', overflowY: 'auto'}","<FolderTree\n            expandedIds={expandedIds}\n            folderTree={folderTree}\n            onSelect={setSelectedId}\n            selectedId={selectedId}\n          />","folderTree.length === 0 && (\n            <Box marginTop={3}>\n              <Text muted size={1}>\n                No folders yet.\n              </Text>\n            </Box>\n          )","<Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n          <FolderTree\n            expandedIds={expandedIds}\n            folderTree={folderTree}\n            onSelect={setSelectedId}\n            selectedId={selectedId}\n          />\n\n          {folderTree.length === 0 && (\n            <Box marginTop={3}>\n              <Text muted size={1}>\n                No folders yet.\n              </Text>\n            </Box>\n          )}\n        </Box>","selectedFolder && (\n          <Inline gap={2}>\n            <Text muted size={1}>\n              Destination:\n            </Text>\n            <Text size={1} weight=\"semibold\">\n              {selectedFolder.name}\n            </Text>\n          </Inline>\n        )","<Stack gap={4} padding={4}>\n        <Text size={1}>\n          Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n        </Text>\n\n        <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n          <FolderTree\n            expandedIds={expandedIds}\n            folderTree={folderTree}\n            onSelect={setSelectedId}\n            selectedId={selectedId}\n          />\n\n          {folderTree.length === 0 && (\n            <Box marginTop={3}>\n              <Text muted size={1}>\n                No folders yet.\n              </Text>\n            </Box>\n          )}\n        </Box>\n\n        {selectedFolder && (\n          <Inline gap={2}>\n            <Text muted size={1}>\n              Destination:\n            </Text>\n            <Text size={1} weight=\"semibold\">\n              {selectedFolder.name}\n            </Text>\n          </Inline>\n        )}\n      </Stack>","<Dialog\n      animate\n      footer={\n        <Box padding={3}>\n          <Flex justify=\"flex-end\" gap={2}>\n            <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n            <Button\n              disabled={!selectedId}\n              mode=\"default\"\n              onClick={handleMove}\n              text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n              tone=\"primary\"\n            />\n          </Flex>\n        </Box>\n      }\n      header=\"Move to Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Stack gap={4} padding={4}>\n        <Text size={1}>\n          Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n        </Text>\n\n        <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n          <FolderTree\n            expandedIds={expandedIds}\n            folderTree={folderTree}\n            onSelect={setSelectedId}\n            selectedId={selectedId}\n          />\n\n          {folderTree.length === 0 && (\n            <Box marginTop={3}>\n              <Text muted size={1}>\n                No folders yet.\n              </Text>\n            </Box>\n          )}\n        </Box>\n\n        {selectedFolder && (\n          <Inline gap={2}>\n            <Text muted size={1}>\n              Destination:\n            </Text>\n            <Text size={1} weight=\"semibold\">\n              {selectedFolder.name}\n            </Text>\n          </Inline>\n        )}\n      </Stack>\n\n      {children}\n    </Dialog>","{children, dialog}: Props","(state) => state.folders.renaming","(state) => state.folders.renameError","(state) => state.folders.byId[folderId]","state","(state) => selectFolderPathById(state, folderId)","folderPath.includes('/')\n    ? folderPath.slice(0, folderPath.lastIndexOf('/'))\n    : null","{\n      name: currentName,\n    }","zodFormResolver<FolderFormData>(folderFormSchema)","{\n    defaultValues: {\n      name: currentName,\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n  }","{errors, isDirty, isValid}","() => {\n    dispatch(dialogActions.remove({id}))\n  }","(formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      foldersActions.renameRequest({\n        name: sanitizedFormData['name'],\n        folderId,\n      }),\n    )\n  }","'name'","() => {\n    if (renameError) {\n      setError('name', {message: renameError.message})\n    }\n  }","[renameError, setError]","handleSubmit(onSubmit)","<Box padding={3}>\n          <Flex justify=\"flex-end\">\n            <FormSubmitButton\n              disabled={renaming || !isDirty || !isValid}\n              isValid={isValid}\n              onClick={handleSubmit(onSubmit)}\n            />\n          </Flex>\n        </Box>","renaming || !isDirty || !isValid","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","<Box marginBottom={3}>\n          <Text muted size={1}>\n            {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n          </Text>\n        </Box>","parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'","register('name')","<FormFieldInputText\n          {...register('name')}\n          disabled={renaming}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        <Box marginBottom={3}>\n          <Text muted size={1}>\n            {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n          </Text>\n        </Box>\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={renaming}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>","<Dialog\n      animate\n      footer={\n        <Box padding={3}>\n          <Flex justify=\"flex-end\">\n            <FormSubmitButton\n              disabled={renaming || !isDirty || !isValid}\n              isValid={isValid}\n              onClick={handleSubmit(onSubmit)}\n            />\n          </Flex>\n        </Box>\n      }\n      header=\"Rename Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        <Box marginBottom={3}>\n          <Text muted size={1}>\n            {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n          </Text>\n        </Box>\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={renaming}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>","{\n  disabled = false,\n  icon,\n  onClick,\n  tone = 'default',\n  tooltip,\n}: FolderHeaderActionProps","disabled = false","tone = 'default'","<Container padding={2} width={0}>\n        <Text muted size={1}>\n          {tooltip}\n        </Text>\n      </Container>","<Button\n      aria-label={tooltip}\n      disabled={disabled}\n      fontSize={1}\n      icon={icon}\n      mode=\"bleed\"\n      onClick={onClick}\n      padding={2}\n      tone={tone}\n    />","<Tooltip\n    animate\n    content={\n      <Container padding={2} width={0}>\n        <Text muted size={1}>\n          {tooltip}\n        </Text>\n      </Container>\n    }\n    disabled={typeof window !== 'undefined' && 'ontouchstart' in window}\n    placement=\"top\"\n    portal\n  >\n    <Button\n      aria-label={tooltip}\n      disabled={disabled}\n      fontSize={1}\n      icon={icon}\n      mode=\"bleed\"\n      onClick={onClick}\n      padding={2}\n      tone={tone}\n    />\n  </Tooltip>","{name, totalCount}: FolderItemTextProps","{\n      boxSizing: 'border-box',\n      display: 'block',\n      maxWidth: '100%',\n      minWidth: 0,\n      overflow: 'hidden',\n      paddingRight: '2rem',\n      position: 'relative',\n      width: '100%',\n    }","{\n        alignItems: 'center',\n        display: 'flex',\n        paddingLeft: '0.25rem',\n        gap: '0.5rem',\n        minWidth: 0,\n        overflow: 'hidden',\n      }","<span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n        <FolderIcon />\n      </span>","{\n          display: 'block',\n          minWidth: 0,\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n          whiteSpace: 'nowrap',\n        }","<span\n      style={{\n        alignItems: 'center',\n        display: 'flex',\n        paddingLeft: '0.25rem',\n        gap: '0.5rem',\n        minWidth: 0,\n        overflow: 'hidden',\n      }}\n    >\n      <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n        <FolderIcon />\n      </span>\n      <span\n        style={{\n          display: 'block',\n          minWidth: 0,\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        {name}\n      </span>\n    </span>","{\n        fontSize: '0.75rem',\n        opacity: 0.78,\n        position: 'absolute',\n        right: 0,\n        top: '50%',\n        transform: 'translateY(-50%)',\n      }","<span\n      style={{\n        fontSize: '0.75rem',\n        opacity: 0.78,\n        position: 'absolute',\n        right: 0,\n        top: '50%',\n        transform: 'translateY(-50%)',\n      }}\n    >\n      {totalCount}\n    </span>","<span\n    style={{\n      boxSizing: 'border-box',\n      display: 'block',\n      maxWidth: '100%',\n      minWidth: 0,\n      overflow: 'hidden',\n      paddingRight: '2rem',\n      position: 'relative',\n      width: '100%',\n    }}\n  >\n    <span\n      style={{\n        alignItems: 'center',\n        display: 'flex',\n        paddingLeft: '0.25rem',\n        gap: '0.5rem',\n        minWidth: 0,\n        overflow: 'hidden',\n      }}\n    >\n      <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n        <FolderIcon />\n      </span>\n      <span\n        style={{\n          display: 'block',\n          minWidth: 0,\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        {name}\n      </span>\n    </span>\n    <span\n      style={{\n        fontSize: '0.75rem',\n        opacity: 0.78,\n        position: 'absolute',\n        right: 0,\n        top: '50%',\n        transform: 'translateY(-50%)',\n      }}\n    >\n      {totalCount}\n    </span>\n  </span>","{currentFolderId, expandedIds, node, onSelect}: FolderNodeProps","expandedIds.has(node.id)","id","() => onSelect(node.id)","<FolderItemText name={node.name} totalCount={node.totalCount} />","name","totalCount","hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            currentFolderId={currentFolderId}\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n          />\n        ))","children","<TreeItem\n      expanded={expandedIds.has(node.id)}\n      id={node.id}\n      onClick={() => onSelect(node.id)}\n      selected={selected}\n      text={<FolderItemText name={node.name} totalCount={node.totalCount} />}\n      weight={selected ? 'semibold' : 'medium'}\n    >\n      {hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            currentFolderId={currentFolderId}\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n          />\n        ))}\n    </TreeItem>","selected ? 'semibold' : 'medium'","(state) => state.folders.currentFolderId","(state) => state.folders.byId","(state) => state.folders.fetching","getExpandedIdSet(currentFolderId, byId)","useMemo(\n    () => getExpandedIdSet(currentFolderId, byId),\n    [byId, currentFolderId],\n  )","Array.from(expandedIds).join('|') || 'root'","useMemo(() => Array.from(expandedIds).join('|') || 'root', [expandedIds])","(folderId: string) => {\n    dispatch(foldersActions.currentFolderSet({folderId}))\n  }","() => {\n    if (!currentFolderId || !currentFolder) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteFolder({\n        folderId: currentFolderId,\n        folderName: currentFolder.name,\n      }),\n    )\n  }","{\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }","<Label size={0}>Folders</Label>","fetching && (\n              <Label size={0} style={{opacity: 0.3}}>\n                Loading...\n              </Label>\n            )","<Box flex={1}>\n          <Inline gap={2}>\n            <Label size={0}>Folders</Label>\n            {fetching && (\n              <Label size={0} style={{opacity: 0.3}}>\n                Loading...\n              </Label>\n            )}\n          </Inline>\n        </Box>","currentFolderId && (\n            <FolderHeaderAction\n              icon={<EditIcon />}\n              onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n              tone=\"primary\"\n              tooltip=\"Rename folder\"\n            />\n          )","<AddIcon />","<FolderHeaderAction\n            icon={<AddIcon />}\n            onClick={() =>\n              dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n            }\n            tone=\"primary\"\n            tooltip=\"Create folder\"\n          />","currentFolderId && canDeleteFolder && (\n            <FolderHeaderAction\n              icon={<TrashIcon />}\n              onClick={handleFolderDelete}\n              tone=\"critical\"\n              tooltip=\"Delete folder\"\n            />\n          )","<Inline gap={1}>\n          {currentFolderId && (\n            <FolderHeaderAction\n              icon={<EditIcon />}\n              onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n              tone=\"primary\"\n              tooltip=\"Rename folder\"\n            />\n          )}\n\n          <FolderHeaderAction\n            icon={<AddIcon />}\n            onClick={() =>\n              dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n            }\n            tone=\"primary\"\n            tooltip=\"Create folder\"\n          />\n\n          {currentFolderId && canDeleteFolder && (\n            <FolderHeaderAction\n              icon={<TrashIcon />}\n              onClick={handleFolderDelete}\n              tone=\"critical\"\n              tooltip=\"Delete folder\"\n            />\n          )}\n        </Inline>","<Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingX={3}\n        style={{\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Box flex={1}>\n          <Inline gap={2}>\n            <Label size={0}>Folders</Label>\n            {fetching && (\n              <Label size={0} style={{opacity: 0.3}}>\n                Loading...\n              </Label>\n            )}\n          </Inline>\n        </Box>\n\n        <Inline gap={1}>\n          {currentFolderId && (\n            <FolderHeaderAction\n              icon={<EditIcon />}\n              onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n              tone=\"primary\"\n              tooltip=\"Rename folder\"\n            />\n          )}\n\n          <FolderHeaderAction\n            icon={<AddIcon />}\n            onClick={() =>\n              dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n            }\n            tone=\"primary\"\n            tooltip=\"Create folder\"\n          />\n\n          {currentFolderId && canDeleteFolder && (\n            <FolderHeaderAction\n              icon={<TrashIcon />}\n              onClick={handleFolderDelete}\n              tone=\"critical\"\n              tooltip=\"Delete folder\"\n            />\n          )}\n        </Inline>\n      </Flex>","() => dispatch(foldersActions.currentFolderClear())","<TreeItem\n              id=\"__all-assets\"\n              onClick={() => dispatch(foldersActions.currentFolderClear())}\n              selected={currentFolderId === null}\n              text=\"All assets\"\n              weight={currentFolderId === null ? 'semibold' : 'medium'}\n            />","currentFolderId === null","currentFolderId === null ? 'semibold' : 'medium'","folderTree.map((node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            ))","(node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            )","<Tree gap={1} key={treeKey}>\n            <TreeItem\n              id=\"__all-assets\"\n              onClick={() => dispatch(foldersActions.currentFolderClear())}\n              selected={currentFolderId === null}\n              text=\"All assets\"\n              weight={currentFolderId === null ? 'semibold' : 'medium'}\n            />\n\n            {folderTree.map((node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            ))}\n          </Tree>","!hasFolders && !fetching && (\n            <Box marginTop={3} paddingX={1}>\n              <Text muted size={1}>\n                <em>No folders</em>\n              </Text>\n            </Box>\n          )","<Box padding={2}>\n        <Box>\n          <Tree gap={1} key={treeKey}>\n            <TreeItem\n              id=\"__all-assets\"\n              onClick={() => dispatch(foldersActions.currentFolderClear())}\n              selected={currentFolderId === null}\n              text=\"All assets\"\n              weight={currentFolderId === null ? 'semibold' : 'medium'}\n            />\n\n            {folderTree.map((node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            ))}\n          </Tree>\n\n          {!hasFolders && !fetching && (\n            <Box marginTop={3} paddingX={1}>\n              <Text muted size={1}>\n                <em>No folders</em>\n              </Text>\n            </Box>\n          )}\n        </Box>\n      </Box>","<Flex direction=\"column\" flex={1} height=\"fill\">\n      <Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingX={3}\n        style={{\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Box flex={1}>\n          <Inline gap={2}>\n            <Label size={0}>Folders</Label>\n            {fetching && (\n              <Label size={0} style={{opacity: 0.3}}>\n                Loading...\n              </Label>\n            )}\n          </Inline>\n        </Box>\n\n        <Inline gap={1}>\n          {currentFolderId && (\n            <FolderHeaderAction\n              icon={<EditIcon />}\n              onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n              tone=\"primary\"\n              tooltip=\"Rename folder\"\n            />\n          )}\n\n          <FolderHeaderAction\n            icon={<AddIcon />}\n            onClick={() =>\n              dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n            }\n            tone=\"primary\"\n            tooltip=\"Create folder\"\n          />\n\n          {currentFolderId && canDeleteFolder && (\n            <FolderHeaderAction\n              icon={<TrashIcon />}\n              onClick={handleFolderDelete}\n              tone=\"critical\"\n              tooltip=\"Delete folder\"\n            />\n          )}\n        </Inline>\n      </Flex>\n\n      <Box padding={2}>\n        <Box>\n          <Tree gap={1} key={treeKey}>\n            <TreeItem\n              id=\"__all-assets\"\n              onClick={() => dispatch(foldersActions.currentFolderClear())}\n              selected={currentFolderId === null}\n              text=\"All assets\"\n              weight={currentFolderId === null ? 'semibold' : 'medium'}\n            />\n\n            {folderTree.map((node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            ))}\n          </Tree>\n\n          {!hasFolders && !fetching && (\n            <Box marginTop={3} paddingX={1}>\n              <Text muted size={1}>\n                <em>No folders</em>\n              </Text>\n            </Box>\n          )}\n        </Box>\n      </Box>\n    </Flex>","state","{id}","() => {\n    dispatch(dialogActions.clear())\n  }","useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])","<Box\n        style={{\n          height: '100%',\n          minHeight: '420px',\n        }}\n      >\n        <FolderView />\n      </Box>","<Dialog animate header=\"Folders\" id={id} onClose={handleClose} width={1}>\n      <Box\n        style={{\n          height: '100%',\n          minHeight: '420px',\n        }}\n      >\n        <FolderView />\n      </Box>\n\n      {children}\n    </Dialog>","() => {\n    dispatch(searchActions.facetsRemoveById({facetId: facet.id}))\n  }","id","[2, 2, 1]","['flex-start', 'flex-start', 'center']","['column', 'column', 'row']","[3, 3, 0]","[1, 1, 0]","{\n              whiteSpace: 'nowrap',\n            }","<Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n          <Label\n            size={0}\n            style={{\n              whiteSpace: 'nowrap',\n            }}\n          >\n            {facet.title}\n          </Label>\n        </Box>","title","<Box marginLeft={1} paddingX={2}>\n            <Text muted size={0}>\n              <CloseIcon onClick={handleClose} />\n            </Text>\n          </Box>","<Flex align=\"center\">\n          {children}\n\n          {/* Close button */}\n          <Box marginLeft={1} paddingX={2}>\n            <Text muted size={0}>\n              <CloseIcon onClick={handleClose} />\n            </Text>\n          </Box>\n        </Flex>","<Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n        {/* Title */}\n        <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n          <Label\n            size={0}\n            style={{\n              whiteSpace: 'nowrap',\n            }}\n          >\n            {facet.title}\n          </Label>\n        </Box>\n\n        <Flex align=\"center\">\n          {children}\n\n          {/* Close button */}\n          <Box marginLeft={1} paddingX={2}>\n            <Text muted size={0}>\n              <CloseIcon onClick={handleClose} />\n            </Text>\n          </Box>\n        </Flex>\n      </Flex>","<Container padding={[2, 2, 1]} $scheme={scheme}>\n      <Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n        {/* Title */}\n        <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n          <Label\n            size={0}\n            style={{\n              whiteSpace: 'nowrap',\n            }}\n          >\n            {facet.title}\n          </Label>\n        </Box>\n\n        <Flex align=\"center\">\n          {children}\n\n          {/* Close button */}\n          <Box marginLeft={1} paddingX={2}>\n            <Text muted size={0}>\n              <CloseIcon onClick={handleClose} />\n            </Text>\n          </Box>\n        </Flex>\n      </Flex>\n    </Container>","(e: ChangeEvent<HTMLInputElement>) => {\n    const val = e.target.value\n    const regex = /^[0-9\\b]+$/\n\n    // Test for number and strip leading zeroes\n    if (val === '' || regex.test(val)) {\n      onValueChange(parseInt(val, 10) || '')\n    }\n  }","...remainingProps","<TextInput\n      {...remainingProps}\n      onChange={handleChange} //\n      value={value ?? ''}\n    />","value ?? ''","{facet}: Props","facet?.modifier\n    ? modifiers?.find((modifier) => modifier.name === facet?.modifier)\n    : modifiers?.[0]","modifier","modifiers?.find","(operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n  }","id","(modifier: SearchFacetInputNumberModifier) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, modifier: modifier.name}))\n  }","(value: number) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, value}))\n  }","facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )","operatorTypes","operatorType","{maxWidth: '50px'}","<Box marginX={1} style={{maxWidth: '50px'}}>\n        <TextInputNumber\n          fontSize={1}\n          onValueChange={handleValueChange}\n          padding={2}\n          radius={2}\n          width={2}\n          value={facet?.value}\n        />\n      </Box>","facet?.value","modifiers && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={selectedModifier?.title}\n            />\n          }\n          id=\"modifier\"\n          menu={\n            <Menu>\n              {modifiers.map((modifier) => {\n                const selected = modifier.name === facet.modifier\n                return (\n                  <MenuItem\n                    disabled={selected}\n                    fontSize={1}\n                    key={modifier.name}\n                    onClick={() => handleModifierClick(modifier)}\n                    padding={2}\n                    text={modifier.title}\n                  />\n                )\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )","title","selected","<SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      <Box marginX={1} style={{maxWidth: '50px'}}>\n        <TextInputNumber\n          fontSize={1}\n          onValueChange={handleValueChange}\n          padding={2}\n          radius={2}\n          width={2}\n          value={facet?.value}\n        />\n      </Box>\n\n      {/* Modifiers */}\n      {modifiers && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={selectedModifier?.title}\n            />\n          }\n          id=\"modifier\"\n          menu={\n            <Menu>\n              {modifiers.map((modifier) => {\n                const selected = modifier.name === facet.modifier\n                return (\n                  <MenuItem\n                    disabled={selected}\n                    fontSize={1}\n                    key={modifier.name}\n                    onClick={() => handleModifierClick(modifier)}\n                    padding={2}\n                    text={modifier.title}\n                  />\n                )\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n    </SearchFacet>","{facet}: Props","options?.find((v) => v.name === facet?.value)","value","options?.find","(option: SearchFacetInputSelectListItemProps) => {\n    dispatch(searchActions.facetsUpdate({name: facet.name, value: option.name}))\n  }","facet.name","(operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdate({name: facet.name, operatorType}))\n  }","facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Box marginRight={1}>\n              <Button\n                fontSize={1}\n                iconRight={SelectIcon}\n                padding={2}\n                text={operators[selectedOperatorType].label}\n              />\n            </Box>\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )","operatorType","facet?.operatorTypes","<Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />","selectedItem?.title","options?.map((item) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(item)}\n                  padding={2}\n                  text={item.title}\n                />\n              )\n            })","options?.map","name","selected","<Menu>\n            {options?.map((item) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(item)}\n                  padding={2}\n                  text={item.title}\n                />\n              )\n            })}\n          </Menu>","<MenuButton\n        button={\n          <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n        }\n        id=\"list\"\n        menu={\n          <Menu>\n            {options?.map((item) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(item)}\n                  padding={2}\n                  text={item.title}\n                />\n              )\n            })}\n          </Menu>\n        }\n        popover={popoverProps}\n      />","<SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Box marginRight={1}>\n              <Button\n                fontSize={1}\n                iconRight={SelectIcon}\n                padding={2}\n                text={operators[selectedOperatorType].label}\n              />\n            </Box>\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* List */}\n      <MenuButton\n        button={\n          <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n        }\n        id=\"list\"\n        menu={\n          <Menu>\n            {options?.map((item) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(item)}\n                  padding={2}\n                  text={item.title}\n                />\n              )\n            })}\n          </Menu>\n        }\n        popover={popoverProps}\n      />\n    </SearchFacet>","{facet}: Props","(operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n  }","id","(e: ChangeEvent<HTMLInputElement>) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, value: e.target.value}))\n  }","facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )","operatorTypes","operatorType","!operators[selectedOperatorType].hideInput && (\n        <Box marginLeft={1} style={{maxWidth: '125px'}}>\n          <TextInput\n            fontSize={1}\n            onChange={handleChange}\n            padding={2}\n            radius={2}\n            width={2}\n            value={facet?.value}\n          />\n        </Box>\n      )","value","<SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      {!operators[selectedOperatorType].hideInput && (\n        <Box marginLeft={1} style={{maxWidth: '125px'}}>\n          <TextInput\n            fontSize={1}\n            onChange={handleChange}\n            padding={2}\n            radius={2}\n            width={2}\n            value={facet?.value}\n          />\n        </Box>\n      )}\n    </SearchFacet>","{\n          transform: 'scale(0.85)',\n        }","<Box\n        paddingRight={1}\n        style={{\n          transform: 'scale(0.85)',\n        }}\n      >\n        <Text muted size={0}>\n          <CloseIcon />\n        </Text>\n      </Box>","<components.ClearIndicator {...props}>\n      <Box\n        paddingRight={1}\n        style={{\n          transform: 'scale(0.85)',\n        }}\n      >\n        <Text muted size={0}>\n          <CloseIcon />\n        </Text>\n      </Box>\n    </components.ClearIndicator>","components.ClearIndicator","<Card radius={1} shadow={2}>\n        {props.children}\n      </Card>","children","<components.Menu {...props}>\n      <Card radius={1} shadow={2}>\n        {props.children}\n      </Card>\n    </components.Menu>","components.Menu","(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }","{height}","<Virtuoso\n        className=\"media__custom-scrollbar\"\n        itemContent={(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }}\n        style={{height}}\n        totalCount={children.length}\n      />","length","<components.MenuList {...props}>{children}</components.MenuList>","components.MenuList","<components.NoOptionsMessage {...props}>{props.children}</components.NoOptionsMessage>","components.NoOptionsMessage","{color: 'inherit'}","<Box paddingY={1}>\n          <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n            {props.children}\n          </Text>\n        </Box>","<Box padding={1}>\n      <components.Option {...props}>\n        <Box paddingY={1}>\n          <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n            {props.children}\n          </Text>\n        </Box>\n      </components.Option>\n    </Box>","components.Option","<Text size={1} textOverflow=\"ellipsis\">\n        {props.children}\n      </Text>","<components.SingleValue {...props}>\n      <Text size={1} textOverflow=\"ellipsis\">\n        {props.children}\n      </Text>\n    </components.SingleValue>","components.SingleValue","{facet}: Props","(state) => selectTags(state)","excludeTagSlugs.length > 0\n      ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n      : tagsAll","excludeTagSlugs.length","(state) => state.tags.fetching","getTagSelectOptions(tags)","(option: TagSelectOption) => {\n    dispatch(\n      searchActions.facetsUpdateById({\n        id: facet.id,\n        value: option,\n      }),\n    )\n  }","id","(operatorType: SearchFacetOperatorType) => {\n    dispatch(\n      searchActions.facetsUpdateById({\n        id: facet.id,\n        operatorType,\n      }),\n    )\n  }","facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      gap={4}\n                      style={{minWidth: '150px'}}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )","operatorTypes","operatorType","!operators[selectedOperatorType].hideInput && (\n        <Box marginX={1} style={{width: '160px'}}>\n          <Select\n            components={reactSelectComponents}\n            instanceId=\"facet-searchable\"\n            isClearable\n            isDisabled={tagsFetching}\n            isSearchable\n            name=\"tags\"\n            noOptionsMessage={() => 'No tags'}\n            onChange={(value: any) => handleChange(value as TagSelectOption)}\n            options={allTagOptions}\n            placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n            styles={reactSelectStyles(scheme)}\n            value={facet?.value}\n          />\n        </Box>\n      )","value","() => 'No tags'","<SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      gap={4}\n                      style={{minWidth: '150px'}}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      {!operators[selectedOperatorType].hideInput && (\n        <Box marginX={1} style={{width: '160px'}}>\n          <Select\n            components={reactSelectComponents}\n            instanceId=\"facet-searchable\"\n            isClearable\n            isDisabled={tagsFetching}\n            isSearchable\n            name=\"tags\"\n            noOptionsMessage={() => 'No tags'}\n            onChange={(value: any) => handleChange(value as TagSelectOption)}\n            options={allTagOptions}\n            placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n            styles={reactSelectStyles(scheme)}\n            value={facet?.value}\n          />\n        </Box>\n      )}\n    </SearchFacet>","state","layout = 'inline'","(state) => state.search.facets","searchFacets.map((facet) => {\n    const key = facet.id\n    if (facet.type === 'number') {\n      return <SearchFacetNumber facet={facet} key={key} />\n    }\n\n    if (facet.type === 'searchable') {\n      return <SearchFacetTags facet={facet} key={key} />\n    }\n\n    if (facet.type === 'select') {\n      return <SearchFacetSelect facet={facet} key={key} />\n    }\n\n    if (facet.type === 'string') {\n      return <SearchFacetString facet={facet} key={key} />\n    }\n\n    return null\n  })","(facet) => {\n    const key = facet.id\n    if (facet.type === 'number') {\n      return <SearchFacetNumber facet={facet} key={key} />\n    }\n\n    if (facet.type === 'searchable') {\n      return <SearchFacetTags facet={facet} key={key} />\n    }\n\n    if (facet.type === 'select') {\n      return <SearchFacetSelect facet={facet} key={key} />\n    }\n\n    if (facet.type === 'string') {\n      return <SearchFacetString facet={facet} key={key} />\n    }\n\n    return null\n  }","<Box marginBottom={2}>\n        <Inline gap={2}>{Items}</Inline>\n      </Box>","<StackContainer align=\"flex-start\" direction=\"column\">\n        {Items}\n      </StackContainer>","(state) => state.assets.assetTypes","(state) => state.search.facets","(state) => state.selected.document","Menu","MenuButton","Flex","renderMenuFacets(filteredFacets)","<Button\n            disabled={!hasSearchFacets}\n            fontSize={1}\n            icon={AddIcon}\n            mode=\"bleed\"\n            gap={2}\n            text=\"Add filter\"\n            tone=\"primary\"\n          />","\"facets\"","enabled","(facet) => {\n      // Remove credit line filter if it's not enabled\n      if (!creditLine?.enabled && facet?.type === 'string' && facet?.name === 'creditLine') {\n        return false\n      }\n\n      if (facet.type === 'group' || facet.type === 'divider') {\n        return true\n      }\n\n      if (isTool) {\n        return !facet?.selectOnly\n      }\n\n      const matchingAssetTypes = facet.assetTypes.filter((assetType) =>\n        assetTypes.includes(assetType),\n      )\n      return matchingAssetTypes.length > 0\n    }","(facet, index, facets) => {\n      const previousFacet = facets[index - 1]\n      // Ignore leading + trailing dividers\n      if (facet.type === 'divider' && (index === 0 || index === facets.length - 1)) {\n        return false\n      }\n      // Ignore adjacent dividers\n      if (facet.type === 'divider' && previousFacet?.type === 'divider') {\n        return false\n      }\n      return true\n    }","level: number = 0","facets","facet","index","!hasSearchFacets","<Menu>{renderMenuFacets(filteredFacets)}</Menu>","{\n          ...popoverProps,\n          placement: 'right-start',\n        }","<MenuButton\n        button={\n          <Button\n            disabled={!hasSearchFacets}\n            fontSize={1}\n            icon={AddIcon}\n            mode=\"bleed\"\n            gap={2}\n            text=\"Add filter\"\n            tone=\"primary\"\n          />\n        }\n        id=\"facets\"\n        menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n        popover={{\n          ...popoverProps,\n          placement: 'right-start',\n        }}\n      />","searchFacets.length > 0 && (\n        <Button\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={() => dispatch(searchActions.facetsClear())}\n          text=\"Clear\"\n        />\n      )","length","<Flex>\n      {/* Add filter button */}\n      <MenuButton\n        button={\n          <Button\n            disabled={!hasSearchFacets}\n            fontSize={1}\n            icon={AddIcon}\n            mode=\"bleed\"\n            gap={2}\n            text=\"Add filter\"\n            tone=\"primary\"\n          />\n        }\n        id=\"facets\"\n        menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n        popover={{\n          ...popoverProps,\n          placement: 'right-start',\n        }}\n      />\n\n      {/* Clear facets button */}\n      {searchFacets.length > 0 && (\n        <Button\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={() => dispatch(searchActions.facetsClear())}\n          text=\"Clear\"\n        />\n      )}\n    </Flex>","state","{id}","() => {\n    dispatch(dialogActions.clear())\n  }","useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])","<Box padding={3}>\n        <SearchFacets layout=\"stack\" />\n        <SearchFacetsControl />\n      </Box>","<Dialog animate header=\"Filters\" id={id} onClose={handleClose} width={1}>\n      <Box padding={3}>\n        <SearchFacets layout=\"stack\" />\n        <SearchFacetsControl />\n      </Box>\n\n      {children}\n    </Dialog>","{id}","(state) => state.tags.creating","(state) => state.tags.creatingError","{\n      name: '',\n    }","{\n    defaultValues: {\n      name: '',\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<TagFormData>(tagFormSchema),\n  }","{errors, isDirty, isValid}","() => {\n    dispatch(dialogActions.clear())\n  }","(formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n\n    dispatch(tagsActions.createRequest({name: sanitizedFormData['name']}))\n  }","'name'","() => {\n    if (creatingError) {\n      setError('name', {\n        message: creatingError?.message,\n      })\n    }\n  }","[creatingError, setError]","() => (\n    <Box padding={3}>\n      <Flex justify=\"flex-end\">\n        {/* Submit button */}\n        <FormSubmitButton\n          disabled={formUpdating || !isDirty || !isValid}\n          isValid={isValid}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )","<Footer />","handleSubmit(onSubmit)","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","register('name')","<FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>","<Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Create Tag\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      {/* Form fields */}\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>","state","{id, tagId}","(state) => selectTagById(state, String(tagId))","useCallback(\n    (tag?: Tag) => ({\n      name: tag?.name?.current || '',\n    }),\n    [],\n  )","generateDefaultValues(tagItem?.tag)","tagItem?.tag","zodFormResolver<TagFormData>(tagFormSchema)","{\n    defaultValues: generateDefaultValues(tagItem?.tag),\n    mode: 'onChange',\n    resolver: zodFormResolver<TagFormData>(tagFormSchema),\n  }","{errors, isDirty, isValid}","() => {\n    dispatch(dialogActions.remove({id}))\n  }","(formData) => {\n    if (!tagItem?.tag) {\n      return\n    }\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      tagsActions.updateRequest({\n        closeDialogId: tagItem?.tag?._id,\n        formData: {\n          name: {\n            _type: 'slug',\n            current: sanitizedFormData['name'],\n          },\n        },\n        tag: tagItem?.tag,\n      }),\n    )\n  }","tag","'name'","() => {\n    if (!tagItem?.tag) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteTag({\n        closeDialogId: tagItem?.tag?._id,\n        tag: tagItem?.tag,\n      }),\n    )\n  }","(update: MutationEvent) => {\n      const {result, transition} = update\n      if (result && transition === 'update') {\n        // Regenerate snapshot\n        setTagSnapshot(result as Tag)\n        // Reset react-hook-form\n        reset(generateDefaultValues(result as Tag))\n      }\n    }","useCallback(\n    (update: MutationEvent) => {\n      const {result, transition} = update\n      if (result && transition === 'update') {\n        // Regenerate snapshot\n        setTagSnapshot(result as Tag)\n        // Reset react-hook-form\n        reset(generateDefaultValues(result as Tag))\n      }\n    },\n    [reset, generateDefaultValues],\n  )","() => {\n    if (tagItem?.error) {\n      setError('name', {\n        message: tagItem.error?.message,\n      })\n    }\n  }","tagItem?.error","[setError, tagItem?.error]","() => {\n    if (!tagItem?.tag) {\n      return undefined\n    }\n\n    // Remember that Sanity listeners ignore joins, order clauses and projections\n    const subscriptionAsset = client\n      .listen(groq`*[_id == $id]`, {id: tagItem?.tag._id})\n      .subscribe(handleTagUpdate)\n\n    return () => {\n      subscriptionAsset?.unsubscribe()\n    }\n  }","[client, handleTagUpdate, tagItem?.tag]","() => (\n    <Box padding={3}>\n      <Flex justify=\"space-between\">\n        {/* Delete button */}\n        <Button\n          disabled={formUpdating}\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={handleDelete}\n          text=\"Delete\"\n          tone=\"critical\"\n        />\n\n        {/* Submit button */}\n        <FormSubmitButton\n          disabled={formUpdating || !isDirty || !isValid}\n          isValid={isValid}\n          lastUpdated={tagItem?.tag?._updatedAt}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )","_updatedAt","<Footer />","handleSubmit(onSubmit)","!tagItem && (\n          <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n            <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n          </Card>\n        )","<button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />","register('name')","<FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />","errors?.name?.message","<Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Deleted notification */}\n        {!tagItem && (\n          <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n            <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n          </Card>\n        )}\n\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>","<Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Edit Tag\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      {/* Form fields */}\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Deleted notification */}\n        {!tagItem && (\n          <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n            <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n          </Card>\n        )}\n\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>","<Container padding={2} width={0}>\n          <Text muted size={1}>\n            {tooltip}\n          </Text>\n        </Container>","<Button\n        disabled={disabled}\n        fontSize={1}\n        icon={icon}\n        mode=\"bleed\"\n        onClick={onClick}\n        padding={2}\n        tone={tone}\n      />","<Tooltip\n      animate\n      content={\n        <Container padding={2} width={0}>\n          <Text muted size={1}>\n            {tooltip}\n          </Text>\n        </Container>\n      }\n      disabled={'ontouchstart' in window}\n      placement=\"top\"\n      portal\n    >\n      <Button\n        disabled={disabled}\n        fontSize={1}\n        icon={icon}\n        mode=\"bleed\"\n        onClick={onClick}\n        padding={2}\n        tone={tone}\n      />\n    </Tooltip>","(state) => selectIsSearchFacetTag(state, tag?.tag?._id)","_id","() => {\n    dispatch(searchActions.facetsRemoveByTag({tagId: tag.tag._id}))\n  }","() => {\n    dispatch(dialogActions.showConfirmAssetsTagAdd({assetsPicked, tag: tag.tag}))\n  }","() => {\n    dispatch(dialogActions.showConfirmAssetsTagRemove({assetsPicked, tag: tag.tag}))\n  }","() => {\n    dispatch(dialogActions.showConfirmDeleteTag({tag: tag.tag}))\n  }","() => {\n    dispatch(DIALOG_ACTIONS.showTagEdit({tagId: tag?.tag?._id}))\n  }","() => {\n    const searchFacet = {\n      ...inputs.tag,\n      value: {\n        label: tag?.tag?.name?.current,\n        value: tag?.tag?._id,\n      },\n    } as SearchFacetInputSearchableProps\n\n    if (isSearchFacetTag) {\n      dispatch(\n        searchActions.facetsUpdate({\n          name: 'tag',\n          operatorType: 'references',\n          value: searchFacet.value,\n        }),\n      )\n    } else {\n      dispatch(searchActions.facetsAdd({facet: searchFacet}))\n    }\n  }","current","{\n            opacity: tag?.updating ? 0.5 : 1.0,\n            userSelect: 'none',\n          }","tag?.updating ? 0.5 : 1.0","<Box flex={1}>\n        <Text\n          muted\n          size={1}\n          style={{\n            opacity: tag?.updating ? 0.5 : 1.0,\n            userSelect: 'none',\n          }}\n          textOverflow=\"ellipsis\"\n        >\n          {tag?.tag?.name?.current}\n        </Text>\n      </Box>","tag?.tag?.name?.current","{flexShrink: 0}","actions?.includes('search') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n            onClick={\n              isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n            }\n            tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n          />\n        )","updating","actions?.includes","actions?.includes('edit') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<EditIcon />}\n            onClick={handleShowTagEditDialog}\n            tone=\"primary\"\n            tooltip=\"Edit tag\"\n          />\n        )","actions?.includes('applyAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowUpIcon />}\n            onClick={handleShowAddTagToAssetsDialog}\n            tone=\"primary\"\n            tooltip=\"Add tag to selected assets\"\n          />\n        )","actions?.includes('removeAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowDownIcon />}\n            onClick={handleShowRemoveTagFromAssetsDialog}\n            tone=\"critical\"\n            tooltip=\"Remove tag from selected assets\"\n          />\n        )","actions?.includes('delete') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<TrashIcon />}\n            onClick={handleShowTagDeleteDialog}\n            tone=\"critical\"\n            tooltip=\"Delete tag\"\n          />\n        )","<ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n        {/* Search facet toggle */}\n        {actions?.includes('search') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n            onClick={\n              isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n            }\n            tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n          />\n        )}\n        {/* Edit icon */}\n        {actions?.includes('edit') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<EditIcon />}\n            onClick={handleShowTagEditDialog}\n            tone=\"primary\"\n            tooltip=\"Edit tag\"\n          />\n        )}\n        {/* Apply to all */}\n        {actions?.includes('applyAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowUpIcon />}\n            onClick={handleShowAddTagToAssetsDialog}\n            tone=\"primary\"\n            tooltip=\"Add tag to selected assets\"\n          />\n        )}\n        {/* Remove from all */}\n        {actions?.includes('removeAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowDownIcon />}\n            onClick={handleShowRemoveTagFromAssetsDialog}\n            tone=\"critical\"\n            tooltip=\"Remove tag from selected assets\"\n          />\n        )}\n\n        {/* Delete icon */}\n        {actions?.includes('delete') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<TrashIcon />}\n            onClick={handleShowTagDeleteDialog}\n            tone=\"critical\"\n            tooltip=\"Delete tag\"\n          />\n        )}\n      </ButtonContainer>","<TagContainer align=\"center\" flex={1} justify=\"space-between\" paddingLeft={3}>\n      <Box flex={1}>\n        <Text\n          muted\n          size={1}\n          style={{\n            opacity: tag?.updating ? 0.5 : 1.0,\n            userSelect: 'none',\n          }}\n          textOverflow=\"ellipsis\"\n        >\n          {tag?.tag?.name?.current}\n        </Text>\n      </Box>\n\n      <ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n        {/* Search facet toggle */}\n        {actions?.includes('search') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n            onClick={\n              isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n            }\n            tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n          />\n        )}\n        {/* Edit icon */}\n        {actions?.includes('edit') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<EditIcon />}\n            onClick={handleShowTagEditDialog}\n            tone=\"primary\"\n            tooltip=\"Edit tag\"\n          />\n        )}\n        {/* Apply to all */}\n        {actions?.includes('applyAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowUpIcon />}\n            onClick={handleShowAddTagToAssetsDialog}\n            tone=\"primary\"\n            tooltip=\"Add tag to selected assets\"\n          />\n        )}\n        {/* Remove from all */}\n        {actions?.includes('removeAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowDownIcon />}\n            onClick={handleShowRemoveTagFromAssetsDialog}\n            tone=\"critical\"\n            tooltip=\"Remove tag from selected assets\"\n          />\n        )}\n\n        {/* Delete icon */}\n        {actions?.includes('delete') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<TrashIcon />}\n            onClick={handleShowTagDeleteDialog}\n            tone=\"critical\"\n            tooltip=\"Delete tag\"\n          />\n        )}\n      </ButtonContainer>\n    </TagContainer>","{\n    isScrolling,\n    item,\n  }: {\n    isScrolling?: boolean\n    item:\n      | string\n      | (TagItem & {\n          actions: TagActions[]\n        })\n  }","{height: `${PANEL_HEIGHT}px`}","<Label size={0}>{item}</Label>","<Flex\n          align=\"center\"\n          justify=\"space-between\"\n          key={item}\n          paddingX={3}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Label size={0}>{item}</Label>\n        </Flex>","<Tag actions={isScrolling ? undefined : item.actions} key={item.tag?._id} tag={item} />","isScrolling ? undefined : item.actions","item.tag?._id","{tags}: {tags: TagItem[]}","assetsPicked?.reduce","(acc: string[], val) => {\n    const assetTagIds = val?.asset?.opt?.media?.tags?.map((tag) => tag._ref) || []\n    acc = acc.concat(assetTagIds)\n    return acc\n  }","(acc: {appliedToAll: string[]; appliedToSome: string[]}, tagId) => {\n      const tagIsInEveryAsset = assetsPicked.every((assetItem) => {\n        const tagIndex =\n          assetItem.asset.opt?.media?.tags?.findIndex((tag) => tag._ref === tagId) ?? -1\n        return tagIndex >= 0\n      })\n\n      if (tagIsInEveryAsset) {\n        acc.appliedToAll.push(tagId)\n      } else {\n        acc.appliedToSome.push(tagId)\n      }\n\n      return acc\n    }","tag","acc","(tagItem) => ({\n      ...tagItem,\n      actions: ['delete', 'edit', 'removeAll', 'search'] as TagActions[],\n    })","(tagItem) => ({\n      ...tagItem,\n      actions: ['applyAll', 'delete', 'edit', 'removeAll', 'search'] as TagActions[],\n    })","(tagItem) => ({\n      ...tagItem,\n      actions: ['applyAll', 'delete', 'edit', 'search'] as TagActions[],\n    })","(tagItem) => ({\n      ...tagItem,\n      actions: ['delete', 'edit', 'search'] as TagActions[],\n    })","(index) => {\n        const item = items[index]\n        if (typeof item === 'string') {\n          return item\n        }\n        return item!.tag._id\n      }","(index) => {\n        return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n      }","index","{flex: 1, overflowX: 'hidden'}","<Virtuoso\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        if (typeof item === 'string') {\n          return item\n        }\n        return item!.tag._id\n      }}\n      isScrolling={setIsScrolling}\n      itemContent={(index) => {\n        return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n      }}\n      style={{flex: 1, overflowX: 'hidden'}}\n      totalCount={items.length}\n    />","length","(tag) => tag._ref","tagItem","{allowCreate, light, title}: Props","(state) => state.tags.creating","(state) => state.tags.fetching","() => {\n    dispatch(DIALOG_ACTIONS.showTagCreate())\n  }","light ? getSchemeColor(scheme, 'bg') : 'inherit'","{\n          background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }","<Label size={0}>{title}</Label>","tagsFetching && (\n            <Label size={0} style={{opacity: 0.3}}>\n              Loading...\n            </Label>\n          )","<Inline gap={2}>\n          <Label size={0}>{title}</Label>\n          {tagsFetching && (\n            <Label size={0} style={{opacity: 0.3}}>\n              Loading...\n            </Label>\n          )}\n        </Inline>","allowCreate && (\n          <Box marginRight={1}>\n            <Button\n              disabled={tagsCreating}\n              fontSize={1} //\n              icon={ComposeIcon}\n              mode=\"bleed\"\n              onClick={handleTagCreate}\n              style={{\n                background: 'transparent',\n                boxShadow: 'none',\n              }}\n            />\n          </Box>\n        )","<>\n      <Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingLeft={3}\n        style={{\n          background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Inline gap={2}>\n          <Label size={0}>{title}</Label>\n          {tagsFetching && (\n            <Label size={0} style={{opacity: 0.3}}>\n              Loading...\n            </Label>\n          )}\n        </Inline>\n        {/* Create new tag button */}\n        {allowCreate && (\n          <Box marginRight={1}>\n            <Button\n              disabled={tagsCreating}\n              fontSize={1} //\n              icon={ComposeIcon}\n              mode=\"bleed\"\n              onClick={handleTagCreate}\n              style={{\n                background: 'transparent',\n                boxShadow: 'none',\n              }}\n            />\n          </Box>\n        )}\n      </Flex>\n    </>","state","excludeTagSlugs.length > 0\n      ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n      : tagsAll","excludeTagSlugs.length","(state) => state.tags.fetching","(state) => state.tags.fetchCount","<TagViewHeader\n        allowCreate\n        light={hasPicked}\n        title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n      />","hasPicked ? 'Tags (in selection)' : 'Tags'","fetchComplete && !hasTags && (\n        <Box padding={3}>\n          <Text muted size={1}>\n            <em>No tags</em>\n          </Text>\n        </Box>\n      )","hasTags && <TagsVirtualized tags={tags} />","<Flex direction=\"column\" flex={1} height=\"fill\">\n      <TagViewHeader\n        allowCreate\n        light={hasPicked}\n        title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n      />\n\n      {fetchComplete && !hasTags && (\n        <Box padding={3}>\n          <Text muted size={1}>\n            <em>No tags</em>\n          </Text>\n        </Box>\n      )}\n\n      {hasTags && <TagsVirtualized tags={tags} />}\n    </Flex>","state","{id}","() => {\n    dispatch(dialogActions.clear())\n  }","useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])","<Box\n        style={{\n          height: '100%',\n          minHeight: '420px', // explicit height required as <TagView> is virtualized\n        }}\n      >\n        <TagView />\n      </Box>","<Dialog animate header=\"All Tags\" id={id} onClose={handleClose} width={1}>\n      <Box\n        style={{\n          height: '100%',\n          minHeight: '420px', // explicit height required as <TagView> is virtualized\n        }}\n      >\n        <TagView />\n      </Box>\n\n      {children}\n    </Dialog>","(state) => state.dialog.items","renderDialogs(currentDialogs, 0)","(state) => state.notifications.items","() => {\n    if (items.length > 0) {\n      const lastItem = items[items.length - 1]!\n      toast.push({\n        closable: true,\n        status: lastItem.status,\n        title: lastItem.title,\n      })\n    }\n  }","[items, toast]","items.length","{children, ...props}: Props","() => createReduxStore(props)","<Provider store={store}>{children}</Provider>","{assetId, onClose}: {assetId: string; onClose: () => void}","(state) => state.dialog.items.length","() => {\n    // Only fetch the single asset being edited, then open its edit dialog.\n    const queryFilter = `${constructFilter({\n      assetTypes: ['file', 'image'],\n      searchFacets: [],\n    })} && _id == $assetId`\n\n    dispatch(assetsActions.fetchRequest({params: {assetId}, queryFilter}))\n\n    // Tags and folders must be loaded into the store so the edit dialog can\n    // resolve the asset's existing tag references and folder path (mirroring\n    // `useBrowserInit`). Without this, `selectTagSelectOptions` resolves no tags\n    // and saving would patch `opt.media.tags` to null, wiping existing tags.\n    dispatch(tagsActions.fetchRequest())\n    dispatch(foldersActions.fetchRequest())\n\n    dispatch(dialogActions.showAssetEdit({assetId}))\n  }","[assetId, dispatch]","() => {\n    if (openDialogCount > 0) {\n      hasOpenedRef.current = true\n    } else if (hasOpenedRef.current) {\n      onClose()\n    }\n  }","[openDialogCount, onClose]","<>\n      <Dialogs />\n      <Notifications />\n    </>","[]","() => {\n    if (!assetId) {\n      onClose()\n    }\n  }","[assetId, onClose]","<GlobalStyle />","<EditAssetDialog assetId={assetId} onClose={onClose} />","<PortalProvider element={portalElement}>\n          <EditAssetDialog assetId={assetId} onClose={onClose} />\n        </PortalProvider>","<AssetBrowserDispatchProvider onSelect={props.onSelect}>\n        <GlobalStyle />\n        <PortalProvider element={portalElement}>\n          <EditAssetDialog assetId={assetId} onClose={onClose} />\n        </PortalProvider>\n      </AssetBrowserDispatchProvider>","onSelect","<ReduxProvider\n      assetType={props.assetType}\n      client={client}\n      document={currentDocument ?? undefined}\n      selectedAssets={selectedAssets}\n    >\n      <AssetBrowserDispatchProvider onSelect={props.onSelect}>\n        <GlobalStyle />\n        <PortalProvider element={portalElement}>\n          <EditAssetDialog assetId={assetId} onClose={onClose} />\n        </PortalProvider>\n      </AssetBrowserDispatchProvider>\n    </ReduxProvider>","assetType","currentDocument ?? undefined","(state) => state.assets.view","{whiteSpace: 'nowrap'}","() => dispatch(assetsActions.viewSet({view: 'grid'}))","{\n          borderBottomRightRadius: 0,\n          borderTopRightRadius: 0,\n        }","<Button\n        fontSize={1}\n        icon={ThLargeIcon}\n        mode={view === 'grid' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n        style={{\n          borderBottomRightRadius: 0,\n          borderTopRightRadius: 0,\n        }}\n      />","view === 'grid' ? 'default' : 'ghost'","() => dispatch(assetsActions.viewSet({view: 'table'}))","{\n          borderBottomLeftRadius: 0,\n          borderTopLeftRadius: 0,\n        }","<Button\n        fontSize={1}\n        icon={ThListIcon}\n        mode={view === 'table' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n        style={{\n          borderBottomLeftRadius: 0,\n          borderTopLeftRadius: 0,\n        }}\n      />","view === 'table' ? 'default' : 'ghost'","<Inline gap={0} style={{whiteSpace: 'nowrap'}}>\n      <Button\n        fontSize={1}\n        icon={ThLargeIcon}\n        mode={view === 'grid' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n        style={{\n          borderBottomRightRadius: 0,\n          borderTopRightRadius: 0,\n        }}\n      />\n      <Button\n        fontSize={1}\n        icon={ThListIcon}\n        mode={view === 'table' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n        style={{\n          borderBottomLeftRadius: 0,\n          borderTopLeftRadius: 0,\n        }}\n      />\n    </Inline>","(state) => state.assets.order","getOrderTitle(order.field, order.direction)","direction","field","<Button\n          fontSize={1}\n          icon={SortIcon}\n          mode=\"bleed\"\n          padding={3}\n          text={getOrderTitle(order.field, order.direction)}\n        />","ORDER_OPTIONS?.map((item, index) => {\n            if (item) {\n              const selected = order.field === item.field && order.direction === item.direction\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  iconRight={selected}\n                  key={index}\n                  onClick={() =>\n                    dispatch(\n                      assetsActions.orderSet({\n                        order: {direction: item.direction, field: item.field},\n                      }),\n                    )\n                  }\n                  padding={2}\n                  selected={selected}\n                  gap={4}\n                  style={{minWidth: '200px'}}\n                  text={getOrderTitle(item.field, item.direction)}\n                />\n              )\n            }\n\n            return <MenuDivider key={index} />\n          })","<Menu>\n          {ORDER_OPTIONS?.map((item, index) => {\n            if (item) {\n              const selected = order.field === item.field && order.direction === item.direction\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  iconRight={selected}\n                  key={index}\n                  onClick={() =>\n                    dispatch(\n                      assetsActions.orderSet({\n                        order: {direction: item.direction, field: item.field},\n                      }),\n                    )\n                  }\n                  padding={2}\n                  selected={selected}\n                  gap={4}\n                  style={{minWidth: '200px'}}\n                  text={getOrderTitle(item.field, item.direction)}\n                />\n              )\n            }\n\n            return <MenuDivider key={index} />\n          })}\n        </Menu>","<MenuButton\n      button={\n        <Button\n          fontSize={1}\n          icon={SortIcon}\n          mode=\"bleed\"\n          padding={3}\n          text={getOrderTitle(order.field, order.direction)}\n        />\n      }\n      id=\"order\"\n      menu={\n        <Menu>\n          {ORDER_OPTIONS?.map((item, index) => {\n            if (item) {\n              const selected = order.field === item.field && order.direction === item.direction\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  iconRight={selected}\n                  key={index}\n                  onClick={() =>\n                    dispatch(\n                      assetsActions.orderSet({\n                        order: {direction: item.direction, field: item.field},\n                      }),\n                    )\n                  }\n                  padding={2}\n                  selected={selected}\n                  gap={4}\n                  style={{minWidth: '200px'}}\n                  text={getOrderTitle(item.field, item.direction)}\n                />\n              )\n            }\n\n            return <MenuDivider key={index} />\n          })}\n        </Menu>\n      }\n      popover={popoverProps}\n    />","{\n    animationDuration: 300,\n    isAnimating: loading,\n  }","{\n        opacity: isFinished ? 0 : 1,\n        transition: `opacity ${animationDuration}ms linear`,\n      }","isFinished ? 0 : 1","`opacity ${animationDuration}ms linear`","<Box\n        style={{\n          height: '1px',\n          background: 'rgba(255, 255, 255, 0.5)',\n          position: 'absolute',\n          left: 0,\n          top: 0,\n          transition: `width ${animationDuration}ms linear`,\n          width: `${progress * 100}%`,\n        }}\n      />","`width ${animationDuration}ms linear`","`${progress * 100}%`","<Box\n      style={{\n        opacity: isFinished ? 0 : 1,\n        transition: `opacity ${animationDuration}ms linear`,\n      }}\n    >\n      <Box\n        style={{\n          height: '1px',\n          background: 'rgba(255, 255, 255, 0.5)',\n          position: 'absolute',\n          left: 0,\n          top: 0,\n          transition: `width ${animationDuration}ms linear`,\n          width: `${progress * 100}%`,\n        }}\n      />\n    </Box>","<svg\n    data-sanity-icon=\"media__tag\" // For icon usage with @sanity/ui <Button />\n    fill=\"currentColor\"\n    height=\"1em\"\n    stroke=\"currentColor\"\n    strokeWidth=\"0\"\n    viewBox=\"0 0 512 512\"\n    width=\"1em\"\n  >\n    <path\n      d=\"M435.25 48h-122.9a14.46 14.46 0 00-10.2 4.2L56.45 297.9a28.85 28.85 0 000 40.7l117 117a28.85 28.85 0 0040.7 0L459.75 210a14.46 14.46 0 004.2-10.2v-123a28.66 28.66 0 00-28.7-28.8z\"\n      fill=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"32\"\n    />\n    <path d=\"M384 160a32 32 0 1132-32 32 32 0 01-32 32z\" />\n  </svg>","(state) => state.search.query","(e: ChangeEvent<HTMLInputElement>) => {\n    dispatch(searchActions.querySet({searchQuery: e.currentTarget.value}))\n  }","() => {\n    dispatch(searchActions.querySet({searchQuery: ''}))\n  }","{position: 'relative'}","<TextInput\n        fontSize={1}\n        icon={SearchIcon}\n        onChange={handleChange}\n        placeholder=\"Search\"\n        radius={2}\n        value={searchQuery}\n      />","searchQuery.length > 0 && (\n        <Flex\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleClear}\n          style={{\n            cursor: 'pointer',\n            height: '100%',\n            opacity: 0.75,\n            position: 'absolute',\n            right: 0,\n            top: 0,\n            width: '2em',\n            zIndex: 1, // force stacking context\n          }}\n        >\n          <CloseIcon />\n        </Flex>\n      )","length","<Box style={{position: 'relative'}}>\n      <TextInput\n        fontSize={1}\n        icon={SearchIcon}\n        onChange={handleChange}\n        placeholder=\"Search\"\n        radius={2}\n        value={searchQuery}\n      />\n\n      {/* Clear form button */}\n      {searchQuery.length > 0 && (\n        <Flex\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleClear}\n          style={{\n            cursor: 'pointer',\n            height: '100%',\n            opacity: 0.75,\n            position: 'absolute',\n            right: 0,\n            top: 0,\n            width: '2em',\n            zIndex: 1, // force stacking context\n          }}\n        >\n          <CloseIcon />\n        </Flex>\n      )}\n    </Box>","(state) => state.assets.fetching","(state) => state.folders.panelVisible","(state) => state.assets.pageIndex","(state) => state.search.facets","(state) => state.tags.panelVisible","() => {\n    dispatch(dialogActions.showSearchFacets())\n  }","() => {\n    dispatch(dialogActions.showFolders())\n  }","() => {\n    dispatch(dialogActions.showTags())\n  }","() => {\n    dispatch(foldersActions.panelVisibleSet({panelVisible: !foldersPanelVisible}))\n  }","() => {\n    dispatch(tagsActions.panelVisibleSet({panelVisible: !tagsPanelVisible}))\n  }","{\n        borderBottom: '1px solid var(--card-border-color)',\n        zIndex: 2,\n      }","['column', 'column', 'column', 'column', 'row']","{\n              alignItems: 'flex-start',\n              flex: 1,\n              height: '100%',\n              justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n              position: 'relative',\n              width: '100%',\n            }","mediaIndex < 2 ? 'space-between' : 'flex-start'","<Box marginX={2} style={{minWidth: '200px'}}>\n              {/* Search */}\n              <TextInputSearch />\n            </Box>","['none', 'none', 'block']","<SearchFacets />","<Box display={['none', 'none', 'block']}>\n              <SearchFacets />\n\n              {/* Search Facets Control (add / clear) */}\n              <Inline gap={2}>\n                <SearchFacetsControl />\n              </Inline>\n            </Box>","['block', 'block', 'none']","{whiteSpace: 'nowrap'}","<Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowSearchFacetDialog}\n                  text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n                  tone=\"primary\"\n                />","`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`","<Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowTagsDialog}\n                  text={`Tags`}\n                  tone=\"primary\"\n                />","<Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowFoldersDialog}\n                  text=\"Folders\"\n                  tone=\"primary\"\n                />","<Box display={['block', 'block', 'none']} marginX={2}>\n              <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n                {/* Filters button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowSearchFacetDialog}\n                  text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n                  tone=\"primary\"\n                />\n\n                {/* Tags button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowTagsDialog}\n                  text={`Tags`}\n                  tone=\"primary\"\n                />\n\n                {/* Folders button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowFoldersDialog}\n                  text=\"Folders\"\n                  tone=\"primary\"\n                />\n              </Inline>\n            </Box>","<Box marginBottom={2}>\n        <Flex\n          align=\"flex-start\"\n          direction={['column', 'column', 'column', 'column', 'row']}\n          justify=\"space-between\"\n        >\n          {/* Search + Filters */}\n          <Flex\n            flex={1}\n            style={{\n              alignItems: 'flex-start',\n              flex: 1,\n              height: '100%',\n              justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n              position: 'relative',\n              width: '100%',\n            }}\n          >\n            <Box marginX={2} style={{minWidth: '200px'}}>\n              {/* Search */}\n              <TextInputSearch />\n            </Box>\n\n            <Box display={['none', 'none', 'block']}>\n              <SearchFacets />\n\n              {/* Search Facets Control (add / clear) */}\n              <Inline gap={2}>\n                <SearchFacetsControl />\n              </Inline>\n            </Box>\n\n            <Box display={['block', 'block', 'none']} marginX={2}>\n              <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n                {/* Filters button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowSearchFacetDialog}\n                  text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n                  tone=\"primary\"\n                />\n\n                {/* Tags button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowTagsDialog}\n                  text={`Tags`}\n                  tone=\"primary\"\n                />\n\n                {/* Folders button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowFoldersDialog}\n                  text=\"Folders\"\n                  tone=\"primary\"\n                />\n              </Inline>\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>","['space-between']","<Box display={['none', 'none', 'block']}>\n                <Button\n                  aria-label=\"Toggle folders panel\"\n                  fontSize={1}\n                  icon={FolderIcon}\n                  mode={foldersPanelVisible ? 'default' : 'ghost'}\n                  onClick={toggleFoldersPanel}\n                />\n              </Box>","foldersPanelVisible ? 'default' : 'ghost'","<ButtonViewGroup />","<Box marginX={2}>\n            <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n              <Box display={['none', 'none', 'block']}>\n                <Button\n                  aria-label=\"Toggle folders panel\"\n                  fontSize={1}\n                  icon={FolderIcon}\n                  mode={foldersPanelVisible ? 'default' : 'ghost'}\n                  onClick={toggleFoldersPanel}\n                />\n              </Box>\n              <ButtonViewGroup />\n            </Inline>\n          </Box>","<OrderSelect />","<Box style={{transform: 'scale(0.75)'}}>\n                    <TagIcon />\n                  </Box>","<Flex marginX={2}>\n            {/* Orders */}\n            <OrderSelect />\n            {/* Tags panel toggle */}\n            <Box display={['none', 'none', 'block']} marginLeft={2}>\n              <Button\n                fontSize={1}\n                icon={\n                  <Box style={{transform: 'scale(0.75)'}}>\n                    <TagIcon />\n                  </Box>\n                }\n                onClick={toggleTagsPanelToggle}\n                mode={tagsPanelVisible ? 'default' : 'ghost'}\n                text={tagsPanelVisible ? 'Tags' : ''}\n              />\n            </Box>\n          </Flex>","tagsPanelVisible ? 'default' : 'ghost'","tagsPanelVisible ? 'Tags' : ''","<Box>\n        <Flex align=\"center\" justify={['space-between']}>\n          {/* Folders + Views */}\n          <Box marginX={2}>\n            <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n              <Box display={['none', 'none', 'block']}>\n                <Button\n                  aria-label=\"Toggle folders panel\"\n                  fontSize={1}\n                  icon={FolderIcon}\n                  mode={foldersPanelVisible ? 'default' : 'ghost'}\n                  onClick={toggleFoldersPanel}\n                />\n              </Box>\n              <ButtonViewGroup />\n            </Inline>\n          </Box>\n\n          <Flex marginX={2}>\n            {/* Orders */}\n            <OrderSelect />\n            {/* Tags panel toggle */}\n            <Box display={['none', 'none', 'block']} marginLeft={2}>\n              <Button\n                fontSize={1}\n                icon={\n                  <Box style={{transform: 'scale(0.75)'}}>\n                    <TagIcon />\n                  </Box>\n                }\n                onClick={toggleTagsPanelToggle}\n                mode={tagsPanelVisible ? 'default' : 'ghost'}\n                text={tagsPanelVisible ? 'Tags' : ''}\n              />\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>","<Progress key={pageIndex} loading={fetching} />","<Box\n      paddingY={2}\n      style={{\n        borderBottom: '1px solid var(--card-border-color)',\n        zIndex: 2,\n      }}\n    >\n      {/* Rows: search / filters / orders  */}\n      <Box marginBottom={2}>\n        <Flex\n          align=\"flex-start\"\n          direction={['column', 'column', 'column', 'column', 'row']}\n          justify=\"space-between\"\n        >\n          {/* Search + Filters */}\n          <Flex\n            flex={1}\n            style={{\n              alignItems: 'flex-start',\n              flex: 1,\n              height: '100%',\n              justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n              position: 'relative',\n              width: '100%',\n            }}\n          >\n            <Box marginX={2} style={{minWidth: '200px'}}>\n              {/* Search */}\n              <TextInputSearch />\n            </Box>\n\n            <Box display={['none', 'none', 'block']}>\n              <SearchFacets />\n\n              {/* Search Facets Control (add / clear) */}\n              <Inline gap={2}>\n                <SearchFacetsControl />\n              </Inline>\n            </Box>\n\n            <Box display={['block', 'block', 'none']} marginX={2}>\n              <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n                {/* Filters button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowSearchFacetDialog}\n                  text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n                  tone=\"primary\"\n                />\n\n                {/* Tags button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowTagsDialog}\n                  text={`Tags`}\n                  tone=\"primary\"\n                />\n\n                {/* Folders button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowFoldersDialog}\n                  text=\"Folders\"\n                  tone=\"primary\"\n                />\n              </Inline>\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      <Box>\n        <Flex align=\"center\" justify={['space-between']}>\n          {/* Folders + Views */}\n          <Box marginX={2}>\n            <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n              <Box display={['none', 'none', 'block']}>\n                <Button\n                  aria-label=\"Toggle folders panel\"\n                  fontSize={1}\n                  icon={FolderIcon}\n                  mode={foldersPanelVisible ? 'default' : 'ghost'}\n                  onClick={toggleFoldersPanel}\n                />\n              </Box>\n              <ButtonViewGroup />\n            </Inline>\n          </Box>\n\n          <Flex marginX={2}>\n            {/* Orders */}\n            <OrderSelect />\n            {/* Tags panel toggle */}\n            <Box display={['none', 'none', 'block']} marginLeft={2}>\n              <Button\n                fontSize={1}\n                icon={\n                  <Box style={{transform: 'scale(0.75)'}}>\n                    <TagIcon />\n                  </Box>\n                }\n                onClick={toggleTagsPanelToggle}\n                mode={tagsPanelVisible ? 'default' : 'ghost'}\n                text={tagsPanelVisible ? 'Tags' : ''}\n              />\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      {/* Progress bar */}\n      <Progress key={pageIndex} loading={fetching} />\n    </Box>","state","(state) => state.debug.badConnection","(state) => state.debug.enabled","(e: ChangeEvent<HTMLInputElement>) => {\n    const checked = e.target.checked\n\n    dispatch(debugActions.setBadConnection(checked))\n  }","() => {\n    dispatch(debugActions.toggleEnabled())\n  }","{\n        bottom: 0,\n        left: 0,\n        pointerEvents: 'none',\n        position: 'fixed',\n        width: '100%',\n      }","<Box marginRight={3}>\n          <Text muted size={1}>\n            <PlugIcon />\n          </Text>\n        </Box>","<Box padding={2}>\n              <Text muted size={1}>\n                {badConnection\n                  ? 'Bad connection: +3000ms & 50% chance to fail'\n                  : 'No connection throttling'}\n              </Text>\n            </Box>","badConnection\n                  ? 'Bad connection: +3000ms & 50% chance to fail'\n                  : 'No connection throttling'","['right', 'left']","{\n              pointerEvents: 'auto',\n            }","<Switch\n            checked={badConnection}\n            onChange={handleChange}\n            style={{\n              pointerEvents: 'auto',\n            }}\n          />","<Box\n      padding={4}\n      style={{\n        bottom: 0,\n        left: 0,\n        pointerEvents: 'none',\n        position: 'fixed',\n        width: '100%',\n      }}\n    >\n      {/* Bad connection toggle */}\n      <Flex align=\"center\">\n        <Box marginRight={3}>\n          <Text muted size={1}>\n            <PlugIcon />\n          </Text>\n        </Box>\n        <Tooltip\n          animate\n          content={\n            <Box padding={2}>\n              <Text muted size={1}>\n                {badConnection\n                  ? 'Bad connection: +3000ms & 50% chance to fail'\n                  : 'No connection throttling'}\n              </Text>\n            </Box>\n          }\n          fallbackPlacements={['right', 'left']}\n          placement=\"bottom\"\n          portal\n        >\n          <Switch\n            checked={badConnection}\n            onChange={handleChange}\n            style={{\n              pointerEvents: 'auto',\n            }}\n          />\n        </Tooltip>\n      </Flex>\n    </Box>","state","(state) => state.folders.currentFolderId","['block', 'block', 'none']","<Button\n          fontSize={1}\n          padding={2}\n          mode=\"bleed\"\n          onClick={() => dispatch(foldersActions.currentFolderClear())}\n          text=\"All assets\"\n        />","segments.map((segment) => (\n          <Inline key={segment.id} gap={1}>\n            <Text muted size={1}>\n              /\n            </Text>\n            <Button\n              fontSize={1}\n              padding={2}\n              mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n              onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n              text={segment.name}\n            />\n          </Inline>\n        ))","(segment) => (\n          <Inline key={segment.id} gap={1}>\n            <Text muted size={1}>\n              /\n            </Text>\n            <Button\n              fontSize={1}\n              padding={2}\n              mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n              onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n              text={segment.name}\n            />\n          </Inline>\n        )","<Box display={['block', 'block', 'none']} padding={2}>\n      <Inline gap={1}>\n        <Button\n          fontSize={1}\n          padding={2}\n          mode=\"bleed\"\n          onClick={() => dispatch(foldersActions.currentFolderClear())}\n          text=\"All assets\"\n        />\n\n        {segments.map((segment) => (\n          <Inline key={segment.id} gap={1}>\n            <Text muted size={1}>\n              /\n            </Text>\n            <Button\n              fontSize={1}\n              padding={2}\n              mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n              onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n              text={segment.name}\n            />\n          </Inline>\n        ))}\n      </Inline>\n    </Box>","(state) => state.folders.panelVisible","{\n        position: 'relative',\n        width: FOLDERS_PANEL_WIDTH,\n      }","<Box\n      style={{\n        position: 'relative',\n        width: FOLDERS_PANEL_WIDTH,\n      }}\n    >\n      <Box\n        className=\"media__custom-scrollbar\"\n        style={{\n          borderRight: '1px solid var(--card-border-color)',\n          height: '100%',\n          left: 0,\n          overflowX: 'hidden',\n          overflowY: 'auto',\n          position: 'absolute',\n          top: 0,\n          width: '100%',\n        }}\n      >\n        <FolderView />\n      </Box>\n    </Box>","{open}","useMemo(() => ({open}), [open])","<DropzoneDispatchContext.Provider value={contextValue}>\n      {children}\n    </DropzoneDispatchContext.Provider>","DropzoneDispatchContext.Provider","(state) => state.assets.assetTypes","(state) => state.selected.document","{whiteSpace: 'nowrap'}","onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'","<Text textOverflow=\"ellipsis\" weight=\"semibold\">\n              <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n            </Text>","selectedDocument && (\n              <Box display={['none', 'none', 'block']}>\n                <Text>\n                  <span style={{margin: '0 0.5em'}}>\n                    <ArrowRightIcon />\n                  </span>\n                  <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n                </Text>\n              </Box>\n            )","<Box flex={1} marginX={3}>\n          <Inline style={{whiteSpace: 'nowrap'}}>\n            <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n              <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n            </Text>\n\n            {selectedDocument && (\n              <Box display={['none', 'none', 'block']}>\n                <Text>\n                  <span style={{margin: '0 0.5em'}}>\n                    <ArrowRightIcon />\n                  </span>\n                  <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n                </Text>\n              </Box>\n            )}\n          </Inline>\n        </Box>","directUploads && (\n            <Button\n              fontSize={1}\n              icon={UploadIcon}\n              mode=\"bleed\"\n              onClick={open}\n              text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n            />\n          )","assetTypes.length","onClose && (\n            <Box style={{flexShrink: 0}}>\n              <Button\n                disabled={!onClose}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={onClose}\n                radius={2}\n              />\n            </Box>\n          )","<Flex marginX={2}>\n          {/* Upload */}\n          {directUploads && (\n            <Button\n              fontSize={1}\n              icon={UploadIcon}\n              mode=\"bleed\"\n              onClick={open}\n              text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n            />\n          )}\n\n          {/* Close */}\n          {onClose && (\n            <Box style={{flexShrink: 0}}>\n              <Button\n                disabled={!onClose}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={onClose}\n                radius={2}\n              />\n            </Box>\n          )}\n        </Flex>","<Box paddingY={2}>\n      <Flex align=\"center\" justify=\"space-between\">\n        {/* Label */}\n        <Box flex={1} marginX={3}>\n          <Inline style={{whiteSpace: 'nowrap'}}>\n            <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n              <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n            </Text>\n\n            {selectedDocument && (\n              <Box display={['none', 'none', 'block']}>\n                <Text>\n                  <span style={{margin: '0 0.5em'}}>\n                    <ArrowRightIcon />\n                  </span>\n                  <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n                </Text>\n              </Box>\n            )}\n          </Inline>\n        </Box>\n\n        <Flex marginX={2}>\n          {/* Upload */}\n          {directUploads && (\n            <Button\n              fontSize={1}\n              icon={UploadIcon}\n              mode=\"bleed\"\n              onClick={open}\n              text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n            />\n          )}\n\n          {/* Close */}\n          {onClose && (\n            <Box style={{flexShrink: 0}}>\n              <Button\n                disabled={!onClose}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={onClose}\n                radius={2}\n              />\n            </Box>\n          )}\n        </Flex>\n      </Flex>\n    </Box>","state","(state) => state.assets.order","() => {\n    if (!field || !title) {\n      return\n    }\n\n    if (isActive) {\n      const direction = order.direction === 'asc' ? 'desc' : 'asc'\n      dispatch(assetsActions.orderSet({order: {field, direction}}))\n    } else {\n      dispatch(assetsActions.orderSet({order: {field, direction: 'asc'}}))\n    }\n  }","direction","{\n          cursor: field ? 'pointer' : 'default',\n          display: 'inline',\n          whiteSpace: 'nowrap',\n        }","field ? 'pointer' : 'default'","{\n            marginRight: '0.4em',\n          }","<span\n          style={{\n            marginRight: '0.4em',\n          }}\n        >\n          {title}\n        </span>","isActive && order?.direction === 'asc' && <ChevronUpIcon />","isActive && order?.direction === 'desc' && <ChevronDownIcon />","<Box\n        onClick={field ? handleClick : undefined}\n        style={{\n          cursor: field ? 'pointer' : 'default',\n          display: 'inline',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        <span\n          style={{\n            marginRight: '0.4em',\n          }}\n        >\n          {title}\n        </span>\n\n        {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n        {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n      </Box>","field ? handleClick : undefined","<Label muted={!field} size={0}>\n      <Box\n        onClick={field ? handleClick : undefined}\n        style={{\n          cursor: field ? 'pointer' : 'default',\n          display: 'inline',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        <span\n          style={{\n            marginRight: '0.4em',\n          }}\n        >\n          {title}\n        </span>\n\n        {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n        {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n      </Box>\n    </Label>","!field","(state) => state.assets.fetching","(e: MouseEvent) => {\n    e.stopPropagation()\n\n    if (allSelected) {\n      dispatch(assetsActions.pickClear())\n    } else {\n      dispatch(assetsActions.pickAll())\n    }\n  }","{\n        alignItems: 'center',\n        background: 'var(--card-bg-color)',\n        borderBottom: '1px solid var(--card-border-color)',\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n        height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n        letterSpacing: '0.025em',\n        position: 'sticky',\n        textTransform: 'uppercase',\n        top: 0,\n        visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n        width: '100%',\n        zIndex: 1, // force stacking context\n      }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`","mediaIndex < 3 ? 'hidden' : 'visible'","onSelect ? (\n        <TableHeaderItem />\n      ) : (\n        <ContextActionContainer\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleContextActionClick}\n          $scheme={scheme}\n          style={{\n            height: '100%',\n            position: 'relative',\n          }}\n        >\n          <Checkbox\n            checked={!fetching && allSelected}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        </ContextActionContainer>\n      )","<TableHeaderItem field=\"size\" title=\"Size\" />","<TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />","<TableHeaderItem title=\"References\" />","<TableHeaderItem />","<TableHeaderItem field=\"originalFilename\" title=\"Filename\" />","<TableHeaderItem title=\"Resolution\" />","<TableHeaderItem field=\"mimeType\" title=\"MIME type\" />","<Grid\n      style={{\n        alignItems: 'center',\n        background: 'var(--card-bg-color)',\n        borderBottom: '1px solid var(--card-border-color)',\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n        height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n        letterSpacing: '0.025em',\n        position: 'sticky',\n        textTransform: 'uppercase',\n        top: 0,\n        visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n        width: '100%',\n        zIndex: 1, // force stacking context\n      }}\n    >\n      {onSelect ? (\n        <TableHeaderItem />\n      ) : (\n        <ContextActionContainer\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleContextActionClick}\n          $scheme={scheme}\n          style={{\n            height: '100%',\n            position: 'relative',\n          }}\n        >\n          <Checkbox\n            checked={!fetching && allSelected}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        </ContextActionContainer>\n      )}\n\n      <TableHeaderItem />\n      <TableHeaderItem field=\"originalFilename\" title=\"Filename\" />\n      <TableHeaderItem title=\"Resolution\" />\n      <TableHeaderItem field=\"mimeType\" title=\"MIME type\" />\n      <TableHeaderItem field=\"size\" title=\"Size\" />\n      <TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />\n      <TableHeaderItem title=\"References\" />\n      <TableHeaderItem />\n    </Grid>","(state) => state.assets.lastPicked","(state) => selectAssetById(state, id)","state","(e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      } else if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    }","shiftPressed.current","useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      } else if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    },\n    [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n  )","(e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        onSelect([{kind: 'assetDocumentId', value: asset._id}])\n      } else if (onSelect && isMultiSelect) {\n        if (shiftPressed.current && !picked) {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        } else {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        }\n      } else if (shiftPressed.current) {\n        if (picked) {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        } else {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        }\n      } else {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      }\n    }","useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        onSelect([{kind: 'assetDocumentId', value: asset._id}])\n      } else if (onSelect && isMultiSelect) {\n        if (shiftPressed.current && !picked) {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        } else {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        }\n      } else if (shiftPressed.current) {\n        if (picked) {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        } else {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        }\n      } else {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      }\n    },\n    [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n  )","() => {\n    refCountVisibleTimeout.current = setTimeout(\n      () => setReferenceCountVisible(true),\n      REFERENCE_COUNT_VISIBILITY_DELAY,\n    )\n    return () => {\n      if (refCountVisibleTimeout.current) {\n        clearTimeout(refCountVisibleTimeout.current)\n      }\n    }\n  }","[]","{\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE","mediaIndex < 3 ? 'auto' : '1fr'","{\n          alignItems: 'center',\n          gridColumn: 1,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '100%',\n          justifyContent: 'center',\n          opacity: opacityCell,\n          position: 'relative',\n        }","onSelect && !isMultiSelect ? (\n          <EditIcon\n            style={{\n              flexShrink: 0,\n              opacity: 0.5,\n            }}\n          />\n        ) : (\n          <Checkbox\n            checked={picked}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        )","<ContextActionContainer\n        onClick={handleContextActionClick}\n        $scheme={scheme}\n        style={{\n          alignItems: 'center',\n          gridColumn: 1,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '100%',\n          justifyContent: 'center',\n          opacity: opacityCell,\n          position: 'relative',\n        }}\n      >\n        {onSelect && !isMultiSelect ? (\n          <EditIcon\n            style={{\n              flexShrink: 0,\n              opacity: 0.5,\n            }}\n          />\n        ) : (\n          <Checkbox\n            checked={picked}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        )}\n      </ContextActionContainer>","{\n          gridColumn: 2,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '90px',\n          width: '100px',\n        }","{height: '100%', position: 'relative'}","{height: '100%', opacity: opacityPreview, position: 'relative'}","isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />","isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 100, width: 100})}\n              />\n            )","<Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 100, width: 100})}\n              />\n            )}\n          </Box>","updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )","selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )","<Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n          <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 100, width: 100})}\n              />\n            )}\n          </Box>\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n        </Flex>\n      </Box>","{\n          gridColumn: 3,\n          gridRow: mediaIndex < 3 ? 2 : 'auto',\n          opacity: opacityCell,\n        }","mediaIndex < 3 ? 2 : 'auto'","{lineHeight: '2em'}","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.originalFilename}\n        </Text>","originalFilename","<Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: 3,\n          gridRow: mediaIndex < 3 ? 2 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.originalFilename}\n        </Text>\n      </Box>","mediaIndex < 3 ? 3 : 0","{\n          gridColumn: mediaIndex < 3 ? 3 : 4,\n          gridRow: mediaIndex < 3 ? 3 : 'auto',\n          opacity: opacityCell,\n        }","mediaIndex < 3 ? 3 : 4","mediaIndex < 3 ? 3 : 'auto'","isImageAsset(asset) && getAssetResolution(asset)","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {isImageAsset(asset) && getAssetResolution(asset)}\n        </Text>","<Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 4,\n          gridRow: mediaIndex < 3 ? 3 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {isImageAsset(asset) && getAssetResolution(asset)}\n        </Text>\n      </Box>","{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 5,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }","mediaIndex < 3 ? 'none' : 'block'","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.mimeType}\n        </Text>","mimeType","<Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 5,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.mimeType}\n        </Text>\n      </Box>","{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 6,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }","filesize(asset.size, {base: 10, round: 0})","size","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {filesize(asset.size, {base: 10, round: 0})}\n        </Text>","<Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 6,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {filesize(asset.size, {base: 10, round: 0})}\n        </Text>\n      </Box>","{\n          gridColumn: mediaIndex < 3 ? 3 : 7,\n          gridRow: mediaIndex < 3 ? 4 : 'auto',\n          opacity: opacityCell,\n        }","mediaIndex < 3 ? 3 : 7","mediaIndex < 3 ? 4 : 'auto'","formatRelative(new Date(asset._updatedAt), new Date())","_updatedAt","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {formatRelative(new Date(asset._updatedAt), new Date())}\n        </Text>","<Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 7,\n          gridRow: mediaIndex < 3 ? 4 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {formatRelative(new Date(asset._updatedAt), new Date())}\n        </Text>\n      </Box>","{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 8,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }","<Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {referenceCountVisible ? (\n            <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n              id={id}\n            >\n              {({isLoading, referringDocuments}) => {\n                const uniqueDocuments = getUniqueDocuments(referringDocuments)\n                return isLoading ? (\n                  <>-</>\n                ) : (\n                  <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n                )\n              }}\n            </WithReferringDocuments>\n          ) : (\n            <>-</>\n          )}\n        </Text>","({isLoading, referringDocuments}) => {\n                const uniqueDocuments = getUniqueDocuments(referringDocuments)\n                return isLoading ? (\n                  <>-</>\n                ) : (\n                  <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n                )\n              }","<Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 8,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {referenceCountVisible ? (\n            <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n              id={id}\n            >\n              {({isLoading, referringDocuments}) => {\n                const uniqueDocuments = getUniqueDocuments(referringDocuments)\n                return isLoading ? (\n                  <>-</>\n                ) : (\n                  <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n                )\n              }}\n            </WithReferringDocuments>\n          ) : (\n            <>-</>\n          )}\n        </Text>\n      </Box>","{\n          gridColumn: mediaIndex < 3 ? 4 : 9,\n          gridRowStart: '1',\n          gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n          opacity: opacityCell,\n        }","mediaIndex < 3 ? 4 : 9","mediaIndex < 3 ? 'span 5' : 'auto'","error && (\n          <Box padding={2}>\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )","<Flex\n        align=\"center\"\n        justify=\"center\"\n        style={{\n          gridColumn: mediaIndex < 3 ? 4 : 9,\n          gridRowStart: '1',\n          gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box padding={2}>\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </Flex>","<ContainerGrid\n      onClick={selected ? undefined : handleClick}\n      $scheme={scheme}\n      $selected={selected}\n      style={{\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }}\n      $updating={item.updating}\n    >\n      {/* Picked checkbox */}\n      <ContextActionContainer\n        onClick={handleContextActionClick}\n        $scheme={scheme}\n        style={{\n          alignItems: 'center',\n          gridColumn: 1,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '100%',\n          justifyContent: 'center',\n          opacity: opacityCell,\n          position: 'relative',\n        }}\n      >\n        {onSelect && !isMultiSelect ? (\n          <EditIcon\n            style={{\n              flexShrink: 0,\n              opacity: 0.5,\n            }}\n          />\n        ) : (\n          <Checkbox\n            checked={picked}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        )}\n      </ContextActionContainer>\n\n      {/* Preview image + spinner */}\n      <Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n          <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 100, width: 100})}\n              />\n            )}\n          </Box>\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n        </Flex>\n      </Box>\n\n      {/* Filename */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: 3,\n          gridRow: mediaIndex < 3 ? 2 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.originalFilename}\n        </Text>\n      </Box>\n\n      {/* Resolution */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 4,\n          gridRow: mediaIndex < 3 ? 3 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {isImageAsset(asset) && getAssetResolution(asset)}\n        </Text>\n      </Box>\n\n      {/* MIME type */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 5,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.mimeType}\n        </Text>\n      </Box>\n\n      {/* Size */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 6,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {filesize(asset.size, {base: 10, round: 0})}\n        </Text>\n      </Box>\n\n      {/* Last updated */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 7,\n          gridRow: mediaIndex < 3 ? 4 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {formatRelative(new Date(asset._updatedAt), new Date())}\n        </Text>\n      </Box>\n\n      {/* References */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 8,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {referenceCountVisible ? (\n            <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n              id={id}\n            >\n              {({isLoading, referringDocuments}) => {\n                const uniqueDocuments = getUniqueDocuments(referringDocuments)\n                return isLoading ? (\n                  <>-</>\n                ) : (\n                  <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n                )\n              }}\n            </WithReferringDocuments>\n          ) : (\n            <>-</>\n          )}\n        </Text>\n      </Box>\n\n      {/* Error */}\n      <Flex\n        align=\"center\"\n        justify=\"center\"\n        style={{\n          gridColumn: mediaIndex < 3 ? 4 : 9,\n          gridRowStart: '1',\n          gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box padding={2}>\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </Flex>\n    </ContainerGrid>","updating","selected ? undefined : handleClick","item.updating","{isLoading, referringDocuments}","{folderId, name, totalCount}: Props","() => dispatch(foldersActions.currentFolderSet({folderId}))","getSchemeColor(scheme, 'bg')","{\n        background: getSchemeColor(scheme, 'bg'),\n        gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE","mediaIndex < 3 ? 'auto' : '1fr'","<Box />","<Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n        <FolderBadge />\n      </Flex>","{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}","mediaIndex < 3 ? 3 : 3","mediaIndex < 3 ? '2/4' : 'auto'","{lineHeight: '1.2em'}","<Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {name}\n          </Text>","<Text muted size={0} style={{lineHeight: '1.1em'}}>\n            Folder\n          </Text>","<Stack gap={2}>\n          <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {name}\n          </Text>\n          <Text muted size={0} style={{lineHeight: '1.1em'}}>\n            Folder\n          </Text>\n        </Stack>","<Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n      >\n        <Stack gap={2}>\n          <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {name}\n          </Text>\n          <Text muted size={0} style={{lineHeight: '1.1em'}}>\n            Folder\n          </Text>\n        </Stack>\n      </Box>","mediaIndex < 3 ? 3 : 0","{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}","mediaIndex < 3 ? 'none' : 'block'","<Text muted size={1}>\n          {totalCount} item{totalCount === 1 ? '' : 's'}\n        </Text>","totalCount === 1 ? '' : 's'","<Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n        <Text muted size={1}>\n          {totalCount} item{totalCount === 1 ? '' : 's'}\n        </Text>\n      </Box>","{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}","<Text muted size={1}>\n          Open folder\n        </Text>","<Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n        <Text muted size={1}>\n          Open folder\n        </Text>\n      </Box>","<ContainerGrid\n      onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n      style={{\n        background: getSchemeColor(scheme, 'bg'),\n        gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }}\n    >\n      <Box />\n      <Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n        <FolderBadge />\n      </Flex>\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n      >\n        <Stack gap={2}>\n          <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {name}\n          </Text>\n          <Text muted size={0} style={{lineHeight: '1.1em'}}>\n            Folder\n          </Text>\n        </Stack>\n      </Box>\n      <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n        <Text muted size={1}>\n          {totalCount} item{totalCount === 1 ? '' : 's'}\n        </Text>\n      </Box>\n      <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n        <Text muted size={1}>\n          Open folder\n        </Text>\n      </Box>\n      <Box />\n    </ContainerGrid>","(state) => selectUploadById(state, id)","filesize(item.size, {base: 10, round: 0})","size","() => {\n    dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n  }","hash","getSchemeColor(scheme, 'bg')","{\n        alignItems: 'center',\n        background: getSchemeColor(scheme, 'bg'),\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n        height: '100%',\n        position: 'relative',\n      }","mediaIndex < 3 ? 0 : '16px'","mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE","mediaIndex < 3 ? 'auto' : '1fr'","<div\n        style={{\n          background: 'var(--card-fg-color)',\n          bottom: 0,\n          height: '1px',\n          left: 0,\n          position: 'absolute',\n          width: '100%',\n          transform: `scaleX(${percentLoaded * 0.01})`,\n          transformOrigin: 'bottom left',\n          transition: 'all 1000ms ease-out',\n        }}\n      />","`scaleX(${percentLoaded * 0.01})`","{\n          gridColumn: 2,\n          gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n          gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n          height: '90px',\n          width: '100px',\n        }","mediaIndex < 3 ? 1 : 'auto'","mediaIndex < 3 ? 'span 4' : 'auto'","{height: '100%', position: 'relative'}","item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{opacity: 0.25}}\n            />\n          )","assetType","objectUrl","item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"40px\" />\n            </div>\n          )","!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                position: 'absolute',\n                height: '100%',\n                left: 0,\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={3}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )","<Box style={{height: '100%', position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{opacity: 0.25}}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"40px\" />\n            </div>\n          )}\n\n          {/*\n            Cancel upload button.\n            Assets will only have a `complete` status _after_ it has been created on your dataset.\n            As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n            has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n          */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                position: 'absolute',\n                height: '100%',\n                left: 0,\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={3}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>","<Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n          gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Box style={{height: '100%', position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{opacity: 0.25}}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"40px\" />\n            </div>\n          )}\n\n          {/*\n            Cancel upload button.\n            Assets will only have a `complete` status _after_ it has been created on your dataset.\n            As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n            has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n          */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                position: 'absolute',\n                height: '100%',\n                left: 0,\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={3}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n      </Box>","{\n          gridColumn: mediaIndex < 3 ? 3 : '3/8',\n          gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n          marginLeft: mediaIndex < 3 ? 3 : 0,\n        }","mediaIndex < 3 ? 3 : '3/8'","mediaIndex < 3 ? '2/4' : 'auto'","mediaIndex < 3 ? 3 : 0","<Text muted size={1} textOverflow=\"ellipsis\">\n            {item.name} ({fileSize})\n          </Text>","name","<Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {status}\n          </Text>","<Stack gap={3}>\n          <Text muted size={1} textOverflow=\"ellipsis\">\n            {item.name} ({fileSize})\n          </Text>\n          <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {status}\n          </Text>\n        </Stack>","<Box\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : '3/8',\n          gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n          marginLeft: mediaIndex < 3 ? 3 : 0,\n        }}\n      >\n        <Stack gap={3}>\n          <Text muted size={1} textOverflow=\"ellipsis\">\n            {item.name} ({fileSize})\n          </Text>\n          <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {status}\n          </Text>\n        </Stack>\n      </Box>","<Grid\n      style={{\n        alignItems: 'center',\n        background: getSchemeColor(scheme, 'bg'),\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n        height: '100%',\n        position: 'relative',\n      }}\n    >\n      {/* Progress bar */}\n      <div\n        style={{\n          background: 'var(--card-fg-color)',\n          bottom: 0,\n          height: '1px',\n          left: 0,\n          position: 'absolute',\n          width: '100%',\n          transform: `scaleX(${percentLoaded * 0.01})`,\n          transformOrigin: 'bottom left',\n          transition: 'all 1000ms ease-out',\n        }}\n      />\n\n      {/* Image */}\n      <Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n          gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Box style={{height: '100%', position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{opacity: 0.25}}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"40px\" />\n            </div>\n          )}\n\n          {/*\n            Cancel upload button.\n            Assets will only have a `complete` status _after_ it has been created on your dataset.\n            As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n            has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n          */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                position: 'absolute',\n                height: '100%',\n                left: 0,\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={3}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n      </Box>\n\n      {/* Filename */}\n      <Box\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : '3/8',\n          gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n          marginLeft: mediaIndex < 3 ? 3 : 0,\n        }}\n      >\n        <Stack gap={3}>\n          <Text muted size={1} textOverflow=\"ellipsis\">\n            {item.name} ({fileSize})\n          </Text>\n          <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {status}\n          </Text>\n        </Stack>\n      </Box>\n    </Grid>","{\n    item,\n    selected,\n  }: {\n    item: CardAssetData | CardFolderData | CardUploadData\n    selected: boolean\n  }","{height: '100px'}","<Box style={{height: '100px'}}>\n          <TableRowAsset id={item.id} selected={selected} />\n        </Box>","id","<Box style={{height: '100px'}}>\n          <TableRowFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n        </Box>","folderId","name","totalCount","<Box style={{height: '100px'}}>\n          <TableRowUpload id={item.id} />\n        </Box>","(state) => state.selected.assets","(selectedAssets && selectedAssets.map((asset) => asset._id)) || []","(asset) => asset._id","(index) => {\n        const item = items[index]\n        return item?.id || index\n      }","Array(1).fill(totalCount)","(index) => {\n        const item = items[index]\n        const selected = selectedIds.includes(item?.id || '')\n        return <VirtualRow item={item!} selected={selected} />\n      }","item","index","{overflowX: 'hidden'}","<GroupedVirtuoso\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        return item?.id || index\n      }}\n      endReached={onLoadMore}\n      groupCounts={Array(1).fill(totalCount)}\n      groupContent={() => {\n        return <TableHeader />\n      }}\n      itemContent={(index) => {\n        const item = items[index]\n        const selected = selectedIds.includes(item?.id || '')\n        return <VirtualRow item={item!} selected={selected} />\n      }}\n      style={{overflowX: 'hidden'}}\n    />","() => {\n        return <TableHeader />\n      }","(state) => state.assets.fetchCount","(state) => state.assets.fetching","(state) => state.folders.panelVisible","(state) => state.tags.panelVisible","(state) => state.assets.view","() => {\n    if (!fetching) {\n      dispatch(assetsActions.loadNextPage())\n    }\n  }","() => {\n    if (mediaIndex <= 1 && foldersPanelVisible) {\n      dispatch(foldersActions.panelVisibleSet({panelVisible: false}))\n    }\n\n    if (mediaIndex <= 1 && tagsPanelVisible) {\n      dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n    }\n  }","[dispatch, foldersPanelVisible, mediaIndex, tagsPanelVisible]","{width: '100%'}","<Box flex={1} style={{width: '100%'}}>\n      {isEmpty ? (\n        <Box padding={4}>\n          <Text size={1} weight=\"semibold\">\n            No results for the current query\n          </Text>\n        </Box>\n      ) : (\n        <>\n          {view === 'grid' && (\n            <AssetGridVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n          )}\n\n          {view === 'table' && (\n            <AssetTableVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n          )}\n        </>\n      )}\n    </Box>","state","(state) => state.folders.currentFolderId","assetsPicked.length === 1 && !!assetsPicked[0] && isImageAsset(assetsPicked[0].asset)","0","length","() => {\n    dispatch(assetsActions.pickClear())\n  }","() => {\n    dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\n  }","() => {\n    const assetId = assetsPicked[0]?.asset._id\n    if (!assetId) {\n      return\n    }\n    dispatch(dialogActions.showAllAssetsDialog({assetId}))\n  }","_id","() =>\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: assetsPicked, folderId: currentFolderId}))","() =>\n    dispatch(assetsActions.folderSetRequest({assets: assetsPicked, folderId: null}))","() => {\n    if (!onSelect) {\n      return\n    }\n\n    const pickedAssetIds = assetsPicked.map((item) => ({\n      kind: 'assetDocumentId' as const,\n      value: item.asset._id,\n    }))\n\n    if (pickedAssetIds.length === 0) {\n      return\n    }\n\n    onSelect(pickedAssetIds)\n  }","(item) => ({\n      kind: 'assetDocumentId' as const,\n      value: item.asset._id,\n    })","getSchemeColor(scheme, 'bg')","{\n        background: getSchemeColor(scheme, 'bg'),\n        borderBottom: '1px solid var(--card-border-color)',\n        height: `${PANEL_HEIGHT}px`,\n        position: 'relative',\n        width: '100%',\n      }","{color: 'inherit'}","pluralize('asset', assetsPicked.length)","<Box paddingRight={2}>\n          <Label size={0} style={{color: 'inherit'}}>\n            {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n          </Label>\n        </Box>","assetsPicked.length","{background: 'none', boxShadow: 'none'}","<Label size={0}>Deselect</Label>","<Button\n          mode=\"bleed\"\n          onClick={handlePickClear}\n          padding={2}\n          style={{background: 'none', boxShadow: 'none'}}\n          tone=\"default\"\n        >\n          <Label size={0}>Deselect</Label>\n        </Button>","onSelect && isMultiSelect ? (\n          <Button\n            mode=\"bleed\"\n            onClick={handleInsertPicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"primary\"\n          >\n            <Label size={0}>Insert selected</Label>\n          </Button>\n        ) : (\n          <Button\n            mode=\"bleed\"\n            onClick={handleDeletePicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"critical\"\n          >\n            <Label size={0}>Delete</Label>\n          </Button>\n        )","canReplace && (\n          <Button\n            mode=\"bleed\"\n            onClick={handleReplaceImages}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"default\"\n          >\n            <Label size={0}>Replace</Label>\n          </Button>\n        )","!onSelect && (\n          <>\n            <Button\n              mode=\"bleed\"\n              onClick={handleMovePicked}\n              padding={2}\n              style={{background: 'none', boxShadow: 'none'}}\n              tone=\"primary\"\n            >\n              <Label size={0}>Move to folder</Label>\n            </Button>\n            {currentFolderId && (\n              <Button\n                mode=\"bleed\"\n                onClick={handleRemovePickedFromFolder}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              >\n                <Label size={0}>Remove from folder</Label>\n              </Button>\n            )}\n          </>\n        )","<Flex align=\"center\" paddingX={3}>\n        <Box paddingRight={2}>\n          <Label size={0} style={{color: 'inherit'}}>\n            {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n          </Label>\n        </Box>\n\n        {/* Deselect button */}\n        <Button\n          mode=\"bleed\"\n          onClick={handlePickClear}\n          padding={2}\n          style={{background: 'none', boxShadow: 'none'}}\n          tone=\"default\"\n        >\n          <Label size={0}>Deselect</Label>\n        </Button>\n\n        {onSelect && isMultiSelect ? (\n          <Button\n            mode=\"bleed\"\n            onClick={handleInsertPicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"primary\"\n          >\n            <Label size={0}>Insert selected</Label>\n          </Button>\n        ) : (\n          <Button\n            mode=\"bleed\"\n            onClick={handleDeletePicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"critical\"\n          >\n            <Label size={0}>Delete</Label>\n          </Button>\n        )}\n\n        {/* Replace button */}\n        {canReplace && (\n          <Button\n            mode=\"bleed\"\n            onClick={handleReplaceImages}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"default\"\n          >\n            <Label size={0}>Replace</Label>\n          </Button>\n        )}\n\n        {!onSelect && (\n          <>\n            <Button\n              mode=\"bleed\"\n              onClick={handleMovePicked}\n              padding={2}\n              style={{background: 'none', boxShadow: 'none'}}\n              tone=\"primary\"\n            >\n              <Label size={0}>Move to folder</Label>\n            </Button>\n            {currentFolderId && (\n              <Button\n                mode=\"bleed\"\n                onClick={handleRemovePickedFromFolder}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              >\n                <Label size={0}>Remove from folder</Label>\n              </Button>\n            )}\n          </>\n        )}\n      </Flex>","<Flex\n      align=\"center\"\n      justify=\"flex-start\"\n      style={{\n        background: getSchemeColor(scheme, 'bg'),\n        borderBottom: '1px solid var(--card-border-color)',\n        height: `${PANEL_HEIGHT}px`,\n        position: 'relative',\n        width: '100%',\n      }}\n    >\n      <Flex align=\"center\" paddingX={3}>\n        <Box paddingRight={2}>\n          <Label size={0} style={{color: 'inherit'}}>\n            {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n          </Label>\n        </Box>\n\n        {/* Deselect button */}\n        <Button\n          mode=\"bleed\"\n          onClick={handlePickClear}\n          padding={2}\n          style={{background: 'none', boxShadow: 'none'}}\n          tone=\"default\"\n        >\n          <Label size={0}>Deselect</Label>\n        </Button>\n\n        {onSelect && isMultiSelect ? (\n          <Button\n            mode=\"bleed\"\n            onClick={handleInsertPicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"primary\"\n          >\n            <Label size={0}>Insert selected</Label>\n          </Button>\n        ) : (\n          <Button\n            mode=\"bleed\"\n            onClick={handleDeletePicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"critical\"\n          >\n            <Label size={0}>Delete</Label>\n          </Button>\n        )}\n\n        {/* Replace button */}\n        {canReplace && (\n          <Button\n            mode=\"bleed\"\n            onClick={handleReplaceImages}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"default\"\n          >\n            <Label size={0}>Replace</Label>\n          </Button>\n        )}\n\n        {!onSelect && (\n          <>\n            <Button\n              mode=\"bleed\"\n              onClick={handleMovePicked}\n              padding={2}\n              style={{background: 'none', boxShadow: 'none'}}\n              tone=\"primary\"\n            >\n              <Label size={0}>Move to folder</Label>\n            </Button>\n            {currentFolderId && (\n              <Button\n                mode=\"bleed\"\n                onClick={handleRemovePickedFromFolder}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              >\n                <Label size={0}>Remove from folder</Label>\n              </Button>\n            )}\n          </>\n        )}\n      </Flex>\n    </Flex>","(state) => state.tags.panelVisible","{\n        position: 'relative',\n        width: TAGS_PANEL_WIDTH,\n      }","<Box\n      style={{\n        position: 'relative',\n        width: TAGS_PANEL_WIDTH,\n      }}\n    >\n      <Box\n        className=\"media__custom-scrollbar\"\n        style={{\n          borderLeft: '1px solid var(--card-border-color)',\n          height: '100%',\n          overflowX: 'hidden',\n          overflowY: 'auto',\n          position: 'absolute',\n          right: 0,\n          top: 0,\n          width: '100%',\n        }}\n      >\n        <TagView />\n      </Box>\n    </Box>","{maxSize}","(state) => state.assets.assetTypes","async (acceptedFiles: File[]) => {\n    acceptedFiles.forEach((file) =>\n      dispatch(\n        uploadsActions.uploadRequest({\n          file,\n          forceAsAssetType: assetTypes.length === 1 ? assetTypes[0] : undefined,\n        }),\n      ),\n    )\n  }","0","length","(rejections) => {\n    const errorCodes = rejections.flatMap(({errors}) => errors.map(({code}) => code))\n\n    if (errorCodes.includes('file-too-large')) {\n      dispatch(\n        notificationsActions.add({\n          status: 'error',\n          title: 'One or more files exceed the maximum upload size.',\n        }),\n      )\n    }\n  }","({errors}) => errors.map(({code}) => code)","async (event: DropEvent) => {\n    let fileList: FileList | undefined\n    if (event.type === 'drop' && 'dataTransfer' in event) {\n      fileList = event?.dataTransfer?.files\n    }\n    if (event.type === 'change') {\n      const target = event?.target as HTMLInputElement\n      if (target?.files) {\n        fileList = target.files\n      }\n    }\n\n    if (!fileList) {\n      return []\n    }\n\n    // Filter out non-folders / packages\n    const files: File[] = await filterFiles(fileList)\n\n    // Dispatch error if some files have been filtered out\n    if (fileList?.length !== files.length) {\n      dispatch(\n        notificationsActions.add({\n          status: 'error',\n          title: `Unable to upload some items (folders and packages aren't supported)`,\n        }),\n      )\n    }\n\n    return files\n  }","{\n    accept: isImageAssetType ? 'image/*' : '',\n    getFilesFromEvent: handleFileGetter,\n    noClick: true,\n    // HACK: Disable drag and drop functionality when in a selecting context\n    // (This is currently due to Sanity's native image input taking precedence with drag and drop)\n    noDrag: !!onSelect,\n    onDrop: handleDrop,\n    maxSize,\n    onDropRejected: handleDropRejected,\n    disabled: !directUploads,\n  }","isImageAssetType ? 'image/*' : ''","!!onSelect","!directUploads","getRootProps()","getInputProps()","<input {...getInputProps()} />","isDragActive && (\n          <DragActiveContainer>\n            <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n              <Text size={3} style={{color: 'inherit'}}>\n                Drop files to upload\n              </Text>\n            </Flex>\n          </DragActiveContainer>\n        )","<UploadContainer {...getRootProps()}>\n        <input {...getInputProps()} />\n\n        {isDragActive && (\n          <DragActiveContainer>\n            <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n              <Text size={3} style={{color: 'inherit'}}>\n                Drop files to upload\n              </Text>\n            </Flex>\n          </DragActiveContainer>\n        )}\n\n        {children}\n      </UploadContainer>","<DropzoneDispatchProvider open={open}>\n      <UploadContainer {...getRootProps()}>\n        <input {...getInputProps()} />\n\n        {isDragActive && (\n          <DragActiveContainer>\n            <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n              <Text size={3} style={{color: 'inherit'}}>\n                Drop files to upload\n              </Text>\n            </Flex>\n          </DragActiveContainer>\n        )}\n\n        {children}\n      </UploadContainer>\n    </DropzoneDispatchProvider>","{code}","{errors}","({code}) => code","(state: RootReducerState) => state.tags.byIds","(state: RootReducerState) => state.tags.fetchCount","getMediaTagNames(schemaType)","() => {\n    if (!hasMediaTags) {\n      dispatch(searchActions.facetsClear())\n    }\n\n    dispatch(tagsActions.fetchRequest())\n\n    // Fetch all folders\n    dispatch(foldersActions.fetchRequest())\n\n    const assetSubscription = client\n      .listen(\n        groq`*[_type in [\"sanity.fileAsset\", \"sanity.imageAsset\"] && !(_id in path(\"drafts.**\"))]`,\n      )\n      .subscribe(createAssetHandler(dispatch))\n\n    const tagSubscription = client\n      .listen(groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n      .subscribe(createTagHandler(dispatch))\n\n    const folderSubscription = client\n      .listen(groq`*[_type == \"${FOLDER_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n      .subscribe(() => dispatch(foldersActions.fetchRequest()))\n\n    return () => {\n      assetSubscription.unsubscribe()\n      tagSubscription.unsubscribe()\n      folderSubscription.unsubscribe()\n    }\n  }","[client, dispatch, hasMediaTags]","() => {\n    if (!hasMediaTags || tagsFetchCount < 0) return\n\n    const tagFacetInput = inputs.tag\n    if (tagFacetInput.type !== 'searchable') return\n\n    const resolvedTags = tagNames\n      .map((name) => Object.values(tagsByIds).find((item) => item.tag.name.current === name))\n      .filter((item): item is NonNullable<typeof item> => Boolean(item))\n\n    dispatch(searchActions.facetsClear())\n\n    for (const tagItem of resolvedTags) {\n      dispatch(\n        searchActions.facetsAdd({\n          facet: {\n            ...tagFacetInput,\n            operatorType: 'references',\n            value: {label: tagItem.tag.name.current, value: tagItem.tag._id},\n          },\n        }),\n      )\n    }\n    // oxlint-disable-next-line react/exhaustive-effect-dependencies\n  }","(item): item is NonNullable<typeof item> => Boolean(item)","[tagsFetchCount, hasMediaTags]","item","state","{\n  onClose,\n  schemaType,\n}: {\n  onClose?: AssetSourceComponentProps['onClose']\n  schemaType?: AssetSourceComponentProps['schemaType']\n}","<Dialogs />","<Notifications />","<Header onClose={onClose} />","<Controls />","<FolderBreadcrumbs />","<FolderPanel />","<Flex flex={1}>\n              <FolderPanel />\n              <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n                <PickedBar />\n                <Items />\n              </Flex>\n              <TagsPanel />\n            </Flex>","<DebugControls />","<UploadDropzone>\n        <Dialogs />\n        <Notifications />\n\n        <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n          <Flex direction=\"column\" flex={1}>\n            {/* Header */}\n            <Header onClose={onClose} />\n\n            {/* Browser Controls */}\n            <Controls />\n\n            <FolderBreadcrumbs />\n\n            <Flex flex={1}>\n              <FolderPanel />\n              <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n                <PickedBar />\n                <Items />\n              </Flex>\n              <TagsPanel />\n            </Flex>\n\n            {/* Debug */}\n            <DebugControls />\n          </Flex>\n        </Card>\n      </UploadDropzone>","<PortalProvider element={portalElement}>\n      <UploadDropzone>\n        <Dialogs />\n        <Notifications />\n\n        <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n          <Flex direction=\"column\" flex={1}>\n            {/* Header */}\n            <Header onClose={onClose} />\n\n            {/* Browser Controls */}\n            <Controls />\n\n            <FolderBreadcrumbs />\n\n            <Flex flex={1}>\n              <FolderPanel />\n              <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n                <PickedBar />\n                <Items />\n              </Flex>\n              <TagsPanel />\n            </Flex>\n\n            {/* Debug */}\n            <DebugControls />\n          </Flex>\n        </Card>\n      </UploadDropzone>\n    </PortalProvider>","<GlobalStyle />","<BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />","props?.onClose","props?.schemaType","<AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n        <GlobalStyle />\n        <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n      </AssetBrowserDispatchProvider>","props?.isMultiSelect","props?.onSelect","<ReduxProvider\n      assetType={props?.assetType}\n      client={client}\n      document={props?.document}\n      excludeTagSlugs={excludeTagSlugs}\n      selectedAssets={props?.selectedAssets}\n    >\n      <AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n        <GlobalStyle />\n        <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n      </AssetBrowserDispatchProvider>\n    </ReduxProvider>","props?.assetType","props?.document","props?.selectedAssets","[]","(event: SyntheticEvent) => {\n    event.nativeEvent.stopImmediatePropagation()\n    event.stopPropagation()\n  }","{\n            bottom: 0,\n            height: 'auto',\n            left: 0,\n            position: 'fixed',\n            top: 0,\n            width: '100%',\n            zIndex,\n          }","<Browser\n            document={currentDocument}\n            isMultiSelect={isMultiSelect}\n            schemaType={props.schemaType}\n            {...props}\n          />","props.schemaType","<Portal>\n        <Box\n          onDragEnter={handleStopPropagation}\n          onDragLeave={handleStopPropagation}\n          onDragOver={handleStopPropagation}\n          onDrop={handleStopPropagation}\n          onMouseUp={handleStopPropagation}\n          style={{\n            bottom: 0,\n            height: 'auto',\n            left: 0,\n            position: 'fixed',\n            top: 0,\n            width: '100%',\n            zIndex,\n          }}\n        >\n          <Browser\n            document={currentDocument}\n            isMultiSelect={isMultiSelect}\n            schemaType={props.schemaType}\n            {...props}\n          />\n        </Box>\n      </Portal>","<PortalProvider element={portalElement}>\n      <Portal>\n        <Box\n          onDragEnter={handleStopPropagation}\n          onDragLeave={handleStopPropagation}\n          onDragOver={handleStopPropagation}\n          onDrop={handleStopPropagation}\n          onMouseUp={handleStopPropagation}\n          style={{\n            bottom: 0,\n            height: 'auto',\n            left: 0,\n            position: 'fixed',\n            top: 0,\n            width: '100%',\n            zIndex,\n          }}\n        >\n          <Browser\n            document={currentDocument}\n            isMultiSelect={isMultiSelect}\n            schemaType={props.schemaType}\n            {...props}\n          />\n        </Box>\n      </Portal>\n    </PortalProvider>","<Flex direction=\"column\" height=\"fill\" flex={1}>\n      <Browser />\n    </Flex>","() => {\n    if (isInitialMount.current) {\n      isInitialMount.current = false\n      prevAssetRef.current = currentAssetRef\n      return\n    }\n\n    const previousRef = prevAssetRef.current\n    prevAssetRef.current = currentAssetRef\n\n    if (!mediaTags?.length || !currentAssetRef || currentAssetRef === previousRef) return\n\n    applyMediaTags({\n      client,\n      assetId: currentAssetRef,\n      mediaTags,\n      createTagsOnUpload,\n    }).catch((err) => {\n      console.error('[sanity-plugin-media] Failed to apply auto-tags:', err)\n      const label = mediaTags.length === 1 ? 'tag' : 'tags'\n      toast.push({\n        closable: true,\n        status: 'error',\n        title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`,\n      })\n    })\n  }","[currentAssetRef, mediaTags, client, createTagsOnUpload, toast]","mediaTags?.length","renderDefault(props as InputProps)","props as InputProps"],"sources":["../src/contexts/AssetSourceDispatchContext.tsx","../src/hooks/useRootPortalElement.ts","../src/hooks/useTypedSelector.ts","../src/hooks/useVersionedClient.ts","../src/config/orders.ts","../src/config/searchFacets.ts","../src/constants.ts","../src/operators/debugThrottle.ts","../src/utils/constructFilter.ts","../src/utils/ReplaceImages.ts","../src/operators/checkTagName.ts","../src/utils/getTagSelectOptions.ts","../src/modules/assets/actions.ts","../src/modules/dialog/actions.ts","../src/modules/tags/index.ts","../src/modules/search/index.ts","../src/modules/uploads/actions.ts","../src/modules/assets/index.ts","../src/modules/folders/index.ts","../src/modules/dialog/index.ts","../src/styled/GlobalStyles/index.tsx","../src/contexts/ToolOptionsContext.tsx","../src/formSchema/index.ts","../src/utils/getUniqueDocuments.ts","../src/utils/imageDprUrl.ts","../src/utils/sanitizeFormData.ts","../src/utils/typeGuards.ts","../src/utils/zodFormResolver.ts","../src/utils/getAssetResolution.ts","../src/hooks/usePortalPopoverProps.ts","../src/components/ButtonAssetCopy/index.tsx","../src/components/AssetMetadata/index.tsx","../src/components/Dialog/index.tsx","../src/components/DocumentList/index.tsx","../src/components/FileIcon/index.tsx","../src/components/FileAssetPreview/index.tsx","../src/components/FormSubmitButton/index.tsx","../src/utils/getSchemeColor.ts","../src/components/Image/index.tsx","../src/components/FormFieldInputLabel/index.tsx","../src/styled/react-select/creatable.tsx","../src/components/FormFieldInputTags/index.tsx","../src/components/FormFieldInputText/index.tsx","../src/components/FormFieldInputTextarea/index.tsx","../src/components/DialogAssetEdit/Details.tsx","../src/components/DialogAssetEdit/index.tsx","../src/modules/selectors.ts","../src/hooks/useKeyPress.ts","../src/components/CardAsset/index.tsx","../src/components/CardFolder/index.tsx","../src/utils/generatePreviewBlobUrl.ts","../src/utils/withMaxConcurrency.ts","../src/utils/uploadSanityAsset.ts","../src/modules/uploads/index.ts","../src/components/CardUpload/index.tsx","../src/components/AssetGridVirtualized/index.tsx","../src/components/ReplaceAssetsOverView/index.tsx","../src/components/DialogAssetsOverView/index.tsx","../src/components/DialogConfirm/index.tsx","../src/components/DialogFolderCreate/index.tsx","../src/components/DialogFolderMove/index.tsx","../src/components/DialogFolderRename/index.tsx","../src/components/FolderView/index.tsx","../src/components/DialogFolders/index.tsx","../src/components/SearchFacet/index.tsx","../src/components/TextInputNumber/index.tsx","../src/components/SearchFacetNumber/index.tsx","../src/components/SearchFacetSelect/index.tsx","../src/components/SearchFacetString/index.tsx","../src/styled/react-select/single.tsx","../src/components/SearchFacetTags/index.tsx","../src/components/SearchFacets/index.tsx","../src/components/SearchFacetsControl/index.tsx","../src/components/DialogSearchFacets/index.tsx","../src/components/DialogTagCreate/index.tsx","../src/components/DialogTagEdit/index.tsx","../src/components/Tag/index.tsx","../src/components/TagsVirtualized/index.tsx","../src/components/TagViewHeader/index.tsx","../src/components/TagView/index.tsx","../src/components/DialogTags/index.tsx","../src/components/Dialogs/index.tsx","../src/components/Notifications/index.tsx","../src/modules/debug/index.ts","../src/modules/notifications/index.ts","../src/modules/selected/index.ts","../src/modules/index.ts","../src/utils/getDocumentAssetIds.ts","../src/utils/isSupportedAssetType.ts","../src/components/ReduxProvider/index.tsx","../src/components/EditAssetTool/index.tsx","../src/components/ButtonViewGroup/index.tsx","../src/components/OrderSelect/index.tsx","../src/components/Progress/index.tsx","../src/components/TagIcon/index.tsx","../src/components/TextInputSearch/index.tsx","../src/components/Controls/index.tsx","../src/components/DebugControls/index.tsx","../src/components/FolderBreadcrumbs/index.tsx","../src/components/FolderPanel/index.tsx","../src/contexts/DropzoneDispatchContext.tsx","../src/components/Header/index.tsx","../src/components/TableHeaderItem/index.tsx","../src/components/TableHeader/index.tsx","../src/components/TableRowAsset/index.tsx","../src/components/TableRowFolder/index.tsx","../src/components/TableRowUpload/index.tsx","../src/components/AssetTableVirtualized/index.tsx","../src/components/Items/index.tsx","../src/components/PickedBar/index.tsx","../src/components/TagsPanel/index.tsx","../src/components/UploadDropzone/index.tsx","../src/components/Browser/useBrowserInit.ts","../src/components/Browser/index.tsx","../src/components/FormBuilderTool/index.tsx","../src/components/Tool/index.tsx","../src/schemas/folder.ts","../src/schemas/tag.ts","../src/plugin.tsx","../src/utils/applyMediaTags.ts","../src/components/AutoTagInputWrapper/index.tsx","../src/utils/mediaField.ts"],"sourcesContent":["import {type ReactNode, createContext, useContext, useMemo} from 'react'\nimport type {AssetSourceComponentProps} from 'sanity'\n\ntype ContextProps = {\n  isMultiSelect: boolean\n  onSelect?: AssetSourceComponentProps['onSelect']\n}\n\ntype Props = {\n  children: ReactNode\n  isMultiSelect?: boolean\n  onSelect?: AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider = (props: Props) => {\n  const {children, isMultiSelect = false, onSelect} = props\n\n  const contextValue: ContextProps = useMemo(\n    () => ({\n      isMultiSelect,\n      onSelect,\n    }),\n    [isMultiSelect, onSelect],\n  )\n\n  return (\n    <AssetSourceDispatchContext.Provider value={contextValue}>\n      {children}\n    </AssetSourceDispatchContext.Provider>\n  )\n}\n\nexport const useAssetSourceActions = () => {\n  const context = useContext(AssetSourceDispatchContext)\n  if (context === undefined) {\n    throw new Error('useAssetSourceActions must be used within an AssetSourceDispatchProvider')\n  }\n  return context\n}\n","import {useEffect, useState} from 'react'\n\n/**\n * Creates a detached `.media-portal` element appended to `document.body` for the\n * lifetime of the component, used as a portal target for the plugin's dialogs\n * and overlays. The element is removed on unmount.\n */\nconst useRootPortalElement = (): HTMLDivElement => {\n  const [container] = useState(() => document.createElement('div'))\n\n  useEffect(() => {\n    container.classList.add('media-portal')\n    document.body.appendChild(container)\n    return () => {\n      document.body.removeChild(container)\n    }\n  }, [container])\n\n  return container\n}\n\nexport default useRootPortalElement\n","import {type TypedUseSelectorHook, useSelector} from 'react-redux'\n\nimport type {RootReducerState} from '../modules/types'\n\nconst useTypedSelector: TypedUseSelectorHook<RootReducerState> = useSelector\n\nexport default useTypedSelector\n","import type {SanityClient} from '@sanity/client'\nimport {useClient} from 'sanity'\n\nconst useVersionedClient = (): SanityClient => useClient({apiVersion: '2025-10-02'})\n\nexport default useVersionedClient\n","import type {OrderDirection} from '../types'\n\nconst ORDER_DICTIONARY: Record<string, {asc: string; desc: string}> = {\n  _createdAt: {\n    asc: 'Last created: Oldest first',\n    desc: 'Last created: Newest first',\n  },\n  _updatedAt: {\n    asc: 'Last updated: Oldest first',\n    desc: 'Last updated: Newest first',\n  },\n  mimeType: {\n    asc: 'MIME type: A to Z',\n    desc: 'MIME type: Z to A',\n  },\n  originalFilename: {\n    asc: 'File name: A to Z',\n    desc: 'File name: Z to A',\n  },\n  size: {\n    asc: 'File size: Smallest first',\n    desc: 'File size: Largest first',\n  },\n}\n\nexport const getOrderTitle = (field: string, direction: OrderDirection): string => {\n  return ORDER_DICTIONARY[field]![direction]\n}\n","import groq from 'groq'\n\nimport type {\n  SearchFacetDivider,\n  SearchFacetInputProps,\n  SearchFacetName,\n  SearchFacetOperators,\n} from '../types'\n\nexport const divider: SearchFacetDivider = {type: 'divider'}\n\nexport const inputs: Record<SearchFacetName, SearchFacetInputProps> = {\n  altText: {\n    assetTypes: ['file', 'image'],\n    field: 'altText',\n    name: 'altText',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Alt text',\n    type: 'string',\n    value: '',\n  },\n  creditLine: {\n    assetTypes: ['file', 'image'],\n    field: 'creditLine',\n    name: 'creditLine',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Credit',\n    type: 'string',\n    value: '',\n  },\n  description: {\n    assetTypes: ['file', 'image'],\n    field: 'description',\n    name: 'description',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Description',\n    type: 'string',\n    value: '',\n  },\n  folder: {\n    assetTypes: ['file', 'image'],\n    field: 'opt.media.folder._ref',\n    name: 'folder',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty'],\n    title: 'Folder',\n    type: 'string',\n    value: '',\n  },\n  fileName: {\n    assetTypes: ['file', 'image'],\n    field: 'originalFilename',\n    name: 'filename',\n    operatorType: 'includes',\n    operatorTypes: ['includes', 'doesNotInclude'],\n    title: 'File name',\n    type: 'string',\n    value: '',\n  },\n  height: {\n    assetTypes: ['image'],\n    field: 'metadata.dimensions.height',\n    name: 'height',\n    operatorType: 'greaterThan',\n    operatorTypes: [\n      'greaterThan',\n      'greaterThanOrEqualTo',\n      'lessThan',\n      'lessThanOrEqualTo',\n      null,\n      'equalTo',\n    ],\n    title: 'Height',\n    type: 'number',\n    value: 400,\n  },\n  inCurrentDocument: {\n    assetTypes: ['file', 'image'],\n    name: 'inCurrentDocument',\n    operatorType: 'is',\n    options: [\n      {\n        name: 'true',\n        title: 'True',\n        value: groq`_id in $documentAssetIds`,\n      },\n      {\n        name: 'false',\n        title: 'False',\n        value: groq`!(_id in $documentAssetIds)`,\n      },\n    ],\n    selectOnly: true,\n    title: 'In use in current document',\n    type: 'select',\n    value: 'true',\n  },\n  inUse: {\n    assetTypes: ['file', 'image'],\n    name: 'inUse',\n    operatorType: 'is',\n    options: [\n      {\n        name: 'true',\n        title: 'True',\n        value: groq`count(*[references(^._id)]) > 0`,\n      },\n      {\n        name: 'false',\n        title: 'False',\n        value: groq`count(*[references(^._id)]) == 0`,\n      },\n    ],\n    title: 'In use',\n    type: 'select',\n    value: 'true',\n  },\n  isOpaque: {\n    assetTypes: ['image'],\n    field: 'metadata.isOpaque',\n    name: 'isOpaque',\n    operatorType: 'equalTo',\n    options: [\n      {\n        name: 'true',\n        title: 'True',\n        value: `false`,\n      },\n      {\n        name: 'false',\n        title: 'False',\n        value: `true`,\n      },\n    ],\n    title: 'Has transparency',\n    type: 'select',\n    value: 'true',\n  },\n  orientation: {\n    assetTypes: ['image'],\n    name: 'orientation',\n    operatorType: 'is',\n    operatorTypes: ['is', 'isNot'],\n    options: [\n      {\n        name: 'portrait',\n        title: 'Portrait',\n        value: 'metadata.dimensions.aspectRatio < 1',\n      },\n      {\n        name: 'landscape',\n        title: 'Landscape',\n        value: 'metadata.dimensions.aspectRatio > 1',\n      },\n      {\n        name: 'square',\n        title: 'Square',\n        value: 'metadata.dimensions.aspectRatio == 1',\n      },\n    ],\n    title: 'Orientation',\n    type: 'select',\n    value: 'portrait',\n  },\n  size: {\n    assetTypes: ['file', 'image'],\n    field: 'size',\n    modifier: 'kb',\n    modifiers: [\n      {\n        name: 'kb',\n        title: 'KB',\n        fieldModifier: (fieldName) => `round(${fieldName} / 1000)`,\n      },\n      {\n        name: 'mb',\n        title: 'MB',\n        fieldModifier: (fieldName) => `round(${fieldName} / 1000000)`,\n      },\n    ],\n    name: 'size',\n    operatorType: 'greaterThan',\n    operatorTypes: [\n      'greaterThan',\n      'greaterThanOrEqualTo',\n      'lessThan',\n      'lessThanOrEqualTo',\n      null,\n      'equalTo',\n    ],\n    title: 'File size',\n    type: 'number',\n    value: 0,\n  },\n  tag: {\n    assetTypes: ['file', 'image'],\n    field: 'opt.media.tags',\n    name: 'tag',\n    operatorType: 'references',\n    operatorTypes: ['references', 'doesNotReference', null, 'empty', 'notEmpty'],\n    title: 'Tags',\n    type: 'searchable',\n  },\n  title: {\n    assetTypes: ['file', 'image'],\n    field: 'title',\n    name: 'title',\n    operatorType: 'empty',\n    operatorTypes: ['empty', 'notEmpty', null, 'includes', 'doesNotInclude'],\n    title: 'Title',\n    type: 'string',\n    value: '',\n  },\n  type: {\n    assetTypes: ['file', 'image'],\n    name: 'type',\n    operatorType: 'is',\n    operatorTypes: ['is', 'isNot'],\n    options: [\n      {\n        name: 'image',\n        title: 'Image',\n        value: 'mimeType match \"image*\"',\n      },\n      {\n        name: 'video',\n        title: 'Video',\n        value: 'mimeType match \"video*\"',\n      },\n      {\n        name: 'audio',\n        title: 'Audio',\n        value: 'mimeType match \"audio*\"',\n      },\n      {\n        name: 'pdf',\n        title: 'PDF',\n        value: 'mimeType == \"application/pdf\"',\n      },\n    ],\n    title: 'File type',\n    type: 'select',\n    value: 'image',\n  },\n  width: {\n    assetTypes: ['image'],\n    field: 'metadata.dimensions.width',\n    name: 'width',\n    operatorType: 'greaterThan',\n    operatorTypes: [\n      'greaterThan',\n      'greaterThanOrEqualTo',\n      'lessThan',\n      'lessThanOrEqualTo',\n      null,\n      'equalTo',\n    ],\n    title: 'Width',\n    type: 'number',\n    value: 400,\n  },\n}\n\nexport const operators: SearchFacetOperators = {\n  doesNotInclude: {\n    fn: (value, field) => (value ? `!(${field} match '*${value}*')` : undefined),\n    label: 'does not include',\n  },\n  doesNotReference: {\n    fn: (value, _field) => (value ? `!references('${value}')` : undefined),\n    label: 'does not include',\n  },\n  empty: {\n    fn: (_value, field) => `!defined(${field})`,\n    hideInput: true,\n    label: 'is empty',\n  },\n  equalTo: {\n    fn: (value, field) => (value ? `${field} == ${value}` : undefined),\n    label: 'is equal to',\n  },\n  greaterThan: {\n    fn: (value, field) => (value ? `${field} > ${value}` : undefined),\n    label: 'is greater than',\n  },\n  greaterThanOrEqualTo: {\n    fn: (value, field) => (value ? `${field} >= ${value}` : undefined),\n    label: 'is greater than or equal to',\n  },\n  includes: {\n    fn: (value, field) => (value ? `${field} match '*${value}*'` : undefined),\n    label: 'includes',\n  },\n  is: {\n    fn: (value, _field) => `${value}`,\n    label: 'is',\n  },\n  isNot: {\n    fn: (value, _field) => `!(${value})`,\n    label: 'is not',\n  },\n  lessThan: {\n    fn: (value, field) => (value ? `${field} < ${value}` : undefined),\n    label: 'is less than',\n  },\n  lessThanOrEqualTo: {\n    fn: (value, field) => (value ? `${field} <= ${value}` : undefined),\n    label: 'is less than or equal to',\n  },\n  notEmpty: {\n    fn: (_value, field) => `defined(${field})`,\n    hideInput: true,\n    label: 'is not empty',\n  },\n  references: {\n    fn: (value, _field) => (value ? `references('${value}')` : undefined),\n    label: 'includes',\n  },\n}\n","import type {AssetSourceComponentProps} from 'sanity'\n\nimport {divider, inputs} from './config/searchFacets'\nimport type {\n  SearchFacetInputProps,\n  SearchFacetDivider,\n  SearchFacetGroup,\n  OrderDirection,\n} from './types'\n\nexport const SUPPORTED_ASSET_TYPES = [\n  'file',\n  'image',\n] as const satisfies AssetSourceComponentProps['assetType'][]\n\n// Sort order dropdown options\n// null values are represented as menu dividers\nexport const ORDER_OPTIONS: ({direction: OrderDirection; field: string} | null)[] = [\n  {\n    direction: 'desc',\n    field: '_createdAt',\n  },\n  {\n    direction: 'asc',\n    field: '_createdAt',\n  },\n  // Divider\n  null,\n  {\n    direction: 'desc',\n    field: '_updatedAt',\n  },\n  {\n    direction: 'asc' as OrderDirection,\n    field: '_updatedAt',\n  },\n  // Divider\n  null,\n  {\n    direction: 'asc',\n    field: 'originalFilename',\n  },\n  {\n    direction: 'desc',\n    field: 'originalFilename',\n  },\n  // Divider\n  null,\n  {\n    direction: 'desc',\n    field: 'size',\n  },\n  {\n    direction: 'asc',\n    field: 'size',\n  },\n]\n\nexport const FACETS: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[] = [\n  inputs.tag,\n  divider,\n  inputs.inUse,\n  inputs.inCurrentDocument,\n  divider,\n  inputs.title,\n  inputs.folder,\n  inputs.altText,\n  inputs.creditLine,\n  inputs.description,\n  divider,\n  inputs.isOpaque,\n  divider,\n  inputs.fileName,\n  inputs.size,\n  inputs.type,\n  divider,\n  inputs.orientation,\n  inputs.width,\n  inputs.height,\n]\n\nexport const GRID_TEMPLATE_COLUMNS = {\n  SMALL: '3rem 100px auto 1.5rem',\n  LARGE: '3rem 100px auto 5.5rem 5.5rem 3.5rem 8.5rem 4.75rem 2rem',\n}\nexport const FOLDERS_PANEL_WIDTH = 260 // px\nexport const FOLDER_DOCUMENT_NAME = 'media.folder'\nexport const PANEL_HEIGHT = 32 // px\nexport const TAG_DOCUMENT_NAME = 'media.tag'\nexport const TAGS_PANEL_WIDTH = 250 // px\n","import {iif, type Observable, of, throwError} from 'rxjs'\nimport {delay, mergeMap} from 'rxjs/operators'\n\nconst debugThrottle = (throttled?: boolean) => {\n  return function <T>(source: Observable<T>): Observable<T> {\n    return iif(\n      () => !!throttled,\n      source.pipe(\n        delay(3000),\n        mergeMap((v) => {\n          if (Math.random() > 0.5) {\n            return throwError(() => ({\n              message: 'Test error',\n              statusCode: 500,\n            }))\n          }\n          return of(v)\n        }),\n      ),\n      source,\n    )\n  }\n}\n\nexport default debugThrottle\n","import groq from 'groq'\n\nimport {operators} from '../config/searchFacets'\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {AssetType, SearchFacetInputProps} from '../types'\n\n/** GROQ fragment that excludes assets tagged with any of the given media.tag slugs. */\nexport const buildExcludeTagsFragment = (excludeTagSlugs?: string[]): string | undefined => {\n  const serializedExcludeTagSlugs = excludeTagSlugs?.length\n    ? JSON.stringify(excludeTagSlugs)\n    : undefined\n\n  return serializedExcludeTagSlugs\n    ? groq`!(defined(opt.media.tags) && count(opt.media.tags[@._ref in *[_type == \"${TAG_DOCUMENT_NAME}\" && name.current in ${serializedExcludeTagSlugs}]._id]) > 0)`\n    : undefined\n}\n\nconst constructFilter = ({\n  assetTypes,\n  currentFolderId,\n  excludeTagSlugs,\n  searchFacets,\n  searchQuery,\n}: {\n  assetTypes: AssetType[]\n  currentFolderId?: string | null\n  excludeTagSlugs?: string[]\n  searchFacets: SearchFacetInputProps[]\n  searchQuery?: string\n}): string => {\n  // Fetch asset types depending on current context.\n  // Either limit to a specific type (if being used as a custom asset source) or fetch both files and images (if being used as a tool)\n  // Sanity will crash if you try and insert incompatible asset types into fields!\n  const documentAssetTypes = assetTypes.map((type) => `sanity.${type}Asset`)\n\n  const baseFilter = groq`\n    _type in ${JSON.stringify(documentAssetTypes)} && !(_id in path(\"drafts.**\"))\n  `\n\n  const excludeTagsFragment = buildExcludeTagsFragment(excludeTagSlugs)\n\n  const searchFacetFragments = searchFacets.reduce((acc: string[], facet) => {\n    if (facet.type === 'number') {\n      const {field, modifier, modifiers, operatorType, value} = facet\n      const operator = operators[operatorType]\n\n      // Get current modifier\n      const currentModifier = modifiers?.find((m) => m.name === modifier)\n\n      // Apply field modifier function (if present)\n      const facetField = currentModifier?.fieldModifier\n        ? currentModifier.fieldModifier(field)\n        : field\n\n      const fragment = operator.fn(value, facetField)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    if (facet.type === 'searchable') {\n      const {field, operatorType, value} = facet\n      const operator = operators[operatorType]\n\n      const fragment = operator.fn(value?.value, field)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    if (facet.type === 'select') {\n      const {field, operatorType, options, value} = facet\n      const operator = operators[operatorType]\n\n      const currentOptionValue = options?.find((l) => l.name === value)?.value\n\n      const fragment = operator.fn(currentOptionValue, field)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    if (facet.type === 'string') {\n      const {field, operatorType, value} = facet\n      const operator = operators[operatorType]\n\n      const fragment = operator.fn(value, field)\n      if (fragment) {\n        acc.push(fragment)\n      }\n    }\n\n    return acc\n  }, [])\n\n  // All assets (no folder selected) should not apply a folder filter. A specific\n  // folder shows only assets pointing at it.\n  const folderFilter: string | undefined = currentFolderId\n    ? `opt.media.folder._ref == ${JSON.stringify(currentFolderId)}`\n    : undefined\n\n  // Join separate filter fragments\n  const constructedQuery = [\n    // Base filter\n    baseFilter,\n    ...(excludeTagsFragment ? [excludeTagsFragment] : []),\n    // Search query (if present)\n    // NOTE: Currently this only searches direct fields on sanity.fileAsset/sanity.imageAsset and NOT referenced tags\n    // It's possible to add this by adding the following line to the searchQuery, but it's quite slow\n    // references(*[_type == \"media.tag\" && name.current == \"${searchQuery.trim()}\"]._id)\n    ...(searchQuery\n      ? [\n          groq`[_id, altText, assetId, creditLine, description, originalFilename, title, url] match '*${searchQuery.trim()}*'`,\n        ]\n      : []),\n    ...(folderFilter ? [folderFilter] : []),\n    // Search facets\n    ...searchFacetFragments,\n  ].join(' && ')\n\n  return constructedQuery\n}\n\nexport default constructFilter\n","import type {Asset} from '../types'\n\ntype AssetRef = {\n  _ref?: unknown\n  _type?: unknown\n}\n\ntype ImageNode = {\n  _type?: unknown\n  asset?: AssetRef\n}\n\n/**\n * Re-points every image asset in `document` that references `assetToReplaceId`\n * at `newAsset`, mutating the document in place, and returns one patch object\n * per affected top-level field in the form `{[field]: <full mutated field value>}`.\n *\n * Each patch carries the entire (mutated) top-level field value rather than just\n * the matched image node, so `client.patch().set()` updates the references\n * without discarding sibling data — including deeply nested image fields.\n *\n * NOTE: ported from sanity-plugin-media#236. Because of GROQ limitations the\n * matching image objects are filtered out of the document manually rather than\n * via a projection.\n */\nexport function findImageAssets(\n  document: Record<string, unknown>,\n  newAsset: Asset,\n  assetToReplaceId: string,\n): Record<string, unknown>[] {\n  const matchedTopLevelFields = new Set<string>()\n  repointNestedImages(document, newAsset, assetToReplaceId, '', matchedTopLevelFields)\n  return [...matchedTopLevelFields].map((field) => ({[field]: document[field]}))\n}\n\nfunction repointNestedImages(\n  node: unknown,\n  newAsset: Asset,\n  assetToReplaceId: string,\n  topLevelField: string,\n  matchedTopLevelFields: Set<string>,\n): void {\n  if (typeof node !== 'object' || node === null) {\n    return\n  }\n\n  const candidate = node as ImageNode\n  // Match built-in `image` nodes and custom image schema types (e.g. `mainImage`),\n  // which store their type name in `_type` rather than `\"image\"`. Skip file fields.\n  const assetRef = candidate.asset\n  const hasMatchingAssetRef = assetRef?._type === 'reference' && assetRef._ref === assetToReplaceId\n  if (hasMatchingAssetRef && candidate._type !== 'file' && assetRef) {\n    assetRef._ref = newAsset._id\n    if (topLevelField) {\n      matchedTopLevelFields.add(topLevelField)\n    }\n  }\n\n  for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n    if (typeof value === 'object' && value !== null) {\n      // Once we descend past the document root, keep attributing matches to the\n      // top-level field so the patch replaces that whole field.\n      repointNestedImages(\n        value,\n        newAsset,\n        assetToReplaceId,\n        topLevelField || key,\n        matchedTopLevelFields,\n      )\n    }\n  }\n}\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {from, Observable, of, throwError} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {HttpError} from '../types'\n\nconst checkTagName = (client: SanityClient, name: string) => {\n  return function <T>(source: Observable<T>): Observable<boolean> {\n    return source.pipe(\n      mergeMap(() => {\n        return from(\n          client.fetch(groq`count(*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $name])`, {\n            name,\n          }),\n        ) as Observable<number>\n      }),\n      mergeMap((existingTagCount: number) => {\n        if (existingTagCount > 0) {\n          return throwError(\n            () =>\n              ({\n                message: 'Tag already exists',\n                statusCode: 409,\n              }) satisfies HttpError,\n          )\n        }\n\n        return of(true)\n      }),\n    )\n  }\n}\n\nexport default checkTagName\n","import type {TagSelectOption, TagItem} from '../types'\n\nconst getTagSelectOptions = (tags: TagItem[]): TagSelectOption[] => {\n  return tags.reduce((acc: TagSelectOption[], val) => {\n    const tag = val?.tag\n    if (tag) {\n      acc.push({\n        label: tag?.name?.current,\n        value: tag?._id,\n      })\n    }\n    return acc\n  }, [])\n}\n\nexport default getTagSelectOptions\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem, HttpError, Tag} from '../../types'\n\nexport const ASSETS_ACTIONS = {\n  tagsAddComplete: createAction(\n    'actions/tagsAddComplete',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n  tagsAddError: createAction(\n    'actions/tagsAddError',\n    function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n      return {payload: {assets, error, tag}}\n    },\n  ),\n  tagsAddRequest: createAction(\n    'actions/tagsAddRequest',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n  tagsRemoveComplete: createAction(\n    'actions/tagsRemoveComplete',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n  tagsRemoveError: createAction(\n    'actions/tagsRemoveError',\n    function prepare({assets, error, tag}: {assets: AssetItem[]; error: HttpError; tag: Tag}) {\n      return {payload: {assets, error, tag}}\n    },\n  ),\n  tagsRemoveRequest: createAction(\n    'actions/tagsRemoveRequest',\n    function prepare({assets, tag}: {assets: AssetItem[]; tag: Tag}) {\n      return {payload: {assets, tag}}\n    },\n  ),\n}\n","import {createAction} from '@reduxjs/toolkit'\n\nimport type {AssetItem} from '../../types'\n\nexport const DIALOG_ACTIONS = {\n  showFolderCreate: createAction(\n    'dialog/showFolderCreate',\n    function prepare({parentFolderId}: {parentFolderId?: string | null} = {}) {\n      return {\n        payload: {parentFolderId},\n      }\n    },\n  ),\n  showFolderMove: createAction(\n    'dialog/showFolderMove',\n    function prepare({assets, folderId}: {assets: AssetItem[]; folderId?: string | null}) {\n      return {\n        payload: {assets, folderId},\n      }\n    },\n  ),\n  showFolderRename: createAction(\n    'dialog/showFolderRename',\n    function prepare({folderId}: {folderId: string}) {\n      return {\n        payload: {folderId},\n      }\n    },\n  ),\n  showTagCreate: createAction('dialog/showTagCreate'),\n  showTagEdit: createAction('dialog/showTagEdit', function prepare({tagId}: {tagId: string}) {\n    return {\n      payload: {tagId},\n    }\n  }),\n}\n","import {createSelector, createSlice, isAnyOf, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {from, Observable, of} from 'rxjs'\nimport {bufferTime, catchError, filter, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'\n\nimport {TAG_DOCUMENT_NAME} from '../../constants'\nimport checkTagName from '../../operators/checkTagName'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {Asset, HttpError, MyEpic, TagSelectOption, Tag, TagItem} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {DIALOG_ACTIONS} from '../dialog/actions'\nimport type {RootReducerState} from '../types'\n\ntype TagsReducerState = {\n  allIds: string[]\n  byIds: Record<string, TagItem>\n  creating: boolean\n  creatingError?: HttpError\n  fetchCount: number\n  fetching: boolean\n  fetchingError?: HttpError\n  // totalCount: number\n  panelVisible: boolean\n}\n\nconst initialState = {\n  allIds: [],\n  byIds: {},\n  creating: false,\n  creatingError: undefined,\n  fetchCount: -1,\n  fetching: false,\n  fetchingError: undefined,\n  panelVisible: true,\n} as TagsReducerState\n\nconst tagsSlice = createSlice({\n  name: 'tags',\n  initialState,\n  extraReducers: (builder) => {\n    builder\n      .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n        delete state.creatingError\n      })\n      .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n        const {tagId} = action.payload\n        delete state.byIds[tagId]!.error\n      })\n      .addMatcher(\n        isAnyOf(\n          ASSETS_ACTIONS.tagsAddComplete,\n          ASSETS_ACTIONS.tagsAddError,\n          ASSETS_ACTIONS.tagsRemoveComplete,\n          ASSETS_ACTIONS.tagsRemoveError,\n        ),\n        (state, action) => {\n          const {tag} = action.payload\n          state.byIds[tag._id]!.updating = false\n        },\n      )\n      .addMatcher(\n        isAnyOf(ASSETS_ACTIONS.tagsAddRequest, ASSETS_ACTIONS.tagsRemoveRequest),\n        (state, action) => {\n          const {tag} = action.payload\n          state.byIds[tag._id]!.updating = true\n        },\n      )\n  },\n  reducers: {\n    createComplete(state, action: PayloadAction<{assetId?: string; tag: Tag}>) {\n      const {tag} = action.payload\n      state.creating = false\n      if (!state.allIds.includes(tag._id)) {\n        state.allIds.push(tag._id)\n      }\n      state.byIds[tag._id] = {\n        _type: 'tag',\n        picked: false,\n        tag,\n        updating: false,\n      }\n    },\n    createError(state, action: PayloadAction<{error: HttpError; name: string}>) {\n      state.creating = false\n      state.creatingError = action.payload.error\n    },\n    createRequest(state, _action: PayloadAction<{assetId?: string; name: string}>) {\n      state.creating = true\n      delete state.creatingError\n    },\n    deleteComplete(state, action: PayloadAction<{tagId: string}>) {\n      const {tagId} = action.payload\n      const deleteIndex = state.allIds.indexOf(tagId)\n      if (deleteIndex >= 0) {\n        state.allIds.splice(deleteIndex, 1)\n      }\n      delete state.byIds[tagId]\n    },\n    deleteError(state, action: PayloadAction<{error: HttpError; tag: Tag}>) {\n      const {error, tag} = action.payload\n\n      const tagId = tag?._id\n      state.byIds[tagId]!.error = error\n      state.byIds[tagId]!.updating = false\n    },\n    deleteRequest(state, action: PayloadAction<{tag: Tag}>) {\n      const tagId = action.payload?.tag?._id\n      state.byIds[tagId]!.picked = false\n      state.byIds[tagId]!.updating = true\n\n      Object.keys(state.byIds).forEach((key) => {\n        delete state.byIds[key]!.error\n      })\n    },\n    fetchComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n      const {tags} = action.payload\n\n      tags?.forEach((tag) => {\n        state.allIds.push(tag._id)\n        state.byIds[tag._id] = {\n          _type: 'tag',\n          picked: false,\n          tag,\n          updating: false,\n        }\n      })\n\n      state.fetching = false\n      state.fetchCount = tags.length || 0\n      delete state.fetchingError\n    },\n    fetchError(state, action: PayloadAction<{error: HttpError}>) {\n      const {error} = action.payload\n      state.fetching = false\n      state.fetchingError = error\n    },\n    fetchRequest: {\n      reducer: (state, _action: PayloadAction<{query: string}>) => {\n        state.fetching = true\n        delete state.fetchingError\n      },\n      prepare: () => {\n        // Construct query\n        const query = groq`\n          {\n            \"items\": *[\n              _type == \"${TAG_DOCUMENT_NAME}\"\n              && !(_id in path(\"drafts.**\"))\n            ] {\n              _createdAt,\n              _updatedAt,\n              _id,\n              _rev,\n              _type,\n              name\n            } | order(name.current asc),\n          }\n        `\n        return {payload: {query}}\n      },\n    },\n    // Queue batch tag creation\n    listenerCreateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n      //\n    },\n    // Apply created tags (via sanity real-time events)\n    listenerCreateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n      const {tags} = action.payload\n\n      tags?.forEach((tag) => {\n        state.byIds[tag._id] = {\n          _type: 'tag',\n          picked: false,\n          tag,\n          updating: false,\n        }\n        if (!state.allIds.includes(tag._id)) {\n          state.allIds.push(tag._id)\n        }\n      })\n    },\n    // Queue batch tag deletion\n    listenerDeleteQueue(_state, _action: PayloadAction<{tagId: string}>) {\n      //\n    },\n    // Apply deleted tags (via sanity real-time events)\n    listenerDeleteQueueComplete(state, action: PayloadAction<{tagIds: string[]}>) {\n      const {tagIds} = action.payload\n\n      tagIds?.forEach((tagId) => {\n        const deleteIndex = state.allIds.indexOf(tagId)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n        delete state.byIds[tagId]\n      })\n    },\n    // Queue batch tag updates\n    listenerUpdateQueue(_state, _action: PayloadAction<{tag: Tag}>) {\n      //\n    },\n    // Apply updated tags (via sanity real-time events)\n    listenerUpdateQueueComplete(state, action: PayloadAction<{tags: Tag[]}>) {\n      const {tags} = action.payload\n\n      tags?.forEach((tag) => {\n        if (state.byIds[tag._id]) {\n          state.byIds[tag._id]!.tag = tag\n        }\n      })\n    },\n    // Set tag panel visibility\n    panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n      const {panelVisible} = action.payload\n      state.panelVisible = panelVisible\n    },\n    // Sort all tags by name\n    sort(state) {\n      state.allIds.sort((a, b) => {\n        const tagA = state.byIds[a]!.tag.name.current\n        const tagB = state.byIds[b]!.tag.name.current\n\n        if (tagA < tagB) {\n          return -1\n        } else if (tagA > tagB) {\n          return 1\n        }\n        return 0\n      })\n    },\n    updateComplete(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n      const {tag} = action.payload\n      state.byIds[tag._id]!.tag = tag\n      state.byIds[tag._id]!.updating = false\n    },\n    updateError(state, action: PayloadAction<{tag: Tag; error: HttpError}>) {\n      const {error, tag} = action.payload\n      const tagId = tag?._id\n      state.byIds[tagId]!.error = error\n      state.byIds[tagId]!.updating = false\n    },\n    updateRequest(\n      state,\n      action: PayloadAction<{\n        closeDialogId?: string\n        formData: Record<string, any>\n        tag: Tag\n      }>,\n    ) {\n      const {tag} = action.payload\n      state.byIds[tag?._id]!.updating = true\n    },\n  },\n})\n\n// Epics\n\n// On tag create request:\n// - async check to see if tag already exists\n// - throw if tag already exists\n// - otherwise, create new tag\nexport const tagsCreateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.createRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assetId, name} = action.payload\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        checkTagName(client, name),\n        mergeMap(() =>\n          client.observable.create({\n            _type: TAG_DOCUMENT_NAME,\n            name: {\n              _type: 'slug',\n              current: name,\n            },\n          }),\n        ),\n        mergeMap((result) => of(tagsSlice.actions.createComplete({assetId, tag: result as Tag}))),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.createError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              name,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// On tag delete request\n// - find referenced assets\n// - remove tag from referenced assets in a sanity transaction\nexport const tagsDeleteEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.deleteRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {tag} = action.payload\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Fetch assets which reference this tag\n        mergeMap(() =>\n          client.observable.fetch<Asset[]>(\n            groq`*[\n              _type in [\"sanity.fileAsset\", \"sanity.imageAsset\"]\n              && references(*[_type == \"media.tag\" && name.current == $tagName]._id)\n            ] {\n              _id,\n              _rev,\n              opt\n            }`,\n            {tagName: tag.name.current},\n          ),\n        ),\n        // Create transaction which remove tag references from all matched assets and delete tag\n        mergeMap((assets) => {\n          const patches = assets.map((asset) => ({\n            id: asset._id,\n            patch: {\n              // this will cause the transaction to fail if the document has been modified since it was fetched.\n              ifRevisionID: asset._rev,\n              unset: [`opt.media.tags[_ref == \"${tag._id}\"]`],\n            },\n          }))\n\n          const transaction: Transaction = patches.reduce(\n            (tx, patch) => tx.patch(patch.id, patch.patch),\n            client.transaction(),\n          )\n\n          transaction.delete(tag._id)\n\n          return from(transaction.commit())\n        }),\n        // Dispatch complete action\n        mergeMap(() => of(tagsSlice.actions.deleteComplete({tagId: tag._id}))),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.deleteError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// Async fetch tags\nexport const tagsFetchEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.fetchRequest.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) => {\n      const {query} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Fetch tags\n        mergeMap(() =>\n          client.observable.fetch<{\n            items: Tag[]\n          }>(query),\n        ),\n        // Dispatch complete action\n        mergeMap((result) => {\n          const {items} = result\n          return of(tagsSlice.actions.fetchComplete({tags: items}))\n        }),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.fetchError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// TODO: merge all buffer epics\n// Buffer tag creation via sanity subscriber\nexport const tagsListenerCreateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsSlice.actions.listenerCreateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const tags = actions?.map((action) => action.payload.tag)\n      return of(tagsSlice.actions.listenerCreateQueueComplete({tags}))\n    }),\n  )\n\n// TODO: merge all buffer epics\n// Buffer tag deletion via sanity subscriber\nexport const tagsListenerDeleteQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsSlice.actions.listenerDeleteQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const tagIds = actions?.map((action) => action.payload.tagId)\n      return of(tagsSlice.actions.listenerDeleteQueueComplete({tagIds}))\n    }),\n  )\n\n// TODO: merge all buffer epics\n// Buffer tag update via sanity subscriber\nexport const tagsListenerUpdateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsSlice.actions.listenerUpdateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const tags = actions?.map((action) => action.payload.tag)\n      return of(tagsSlice.actions.listenerUpdateQueueComplete({tags}))\n    }),\n  )\n\n// On successful tag creation or updates:\n// - Re-sort all tags\nexport const tagsSortEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      tagsSlice.actions.listenerCreateQueueComplete.type,\n      tagsSlice.actions.listenerUpdateQueueComplete.type,\n    ),\n    bufferTime(1000),\n    filter((actions) => actions.length > 0),\n    mergeMap(() => of(tagsSlice.actions.sort())),\n  )\n\n// On tag update request\n// - check if tag name already exists\n// - throw if tag already exists\n// - otherwise, patch document\nexport const tagsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(tagsSlice.actions.updateRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {closeDialogId, formData, tag} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Check if tag name is available, throw early if not\n        checkTagName(client, formData?.['name']?.current),\n        // Patch document (Update tag)\n        mergeMap(\n          () =>\n            from(\n              client\n                .patch(tag._id)\n                .set({name: {_type: 'slug', current: formData?.['name'].current}})\n                .commit(),\n            ) as Observable<Tag>,\n        ),\n        // Dispatch complete action\n        mergeMap((updatedTag: Tag) => {\n          return of(\n            tagsSlice.actions.updateComplete({\n              closeDialogId,\n              tag: updatedTag,\n            }),\n          )\n        }),\n        catchError((error: ClientError) =>\n          of(\n            tagsSlice.actions.updateError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\n// Selectors\n\nconst selectTagsByIds = (state: RootReducerState) => state.tags.byIds\n\nconst selectTagsAllIds = (state: RootReducerState) => state.tags.allIds\n\nexport const selectTags: Selector<RootReducerState, TagItem[]> = createSelector(\n  [selectTagsByIds, selectTagsAllIds],\n  (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectTagById = createSelector(\n  [selectTagsByIds, (_state: RootReducerState, tagId: string) => tagId],\n  (byIds, tagId) => byIds[tagId],\n)\n\n// TODO: use createSelector\n// Map tag references to react-select options, skipping over items with no linked tags\nexport const selectTagSelectOptions =\n  (asset?: Asset) =>\n  (state: RootReducerState): TagSelectOption[] | null => {\n    const tags = asset?.opt?.media?.tags?.reduce((acc: TagItem[], v) => {\n      const tagItem = state.tags.byIds[v._ref]\n      if (tagItem?.tag) {\n        acc.push(tagItem)\n      }\n      return acc\n    }, [])\n\n    if (tags && tags?.length > 0) {\n      return getTagSelectOptions(tags)\n    }\n\n    return null\n  }\n\nexport const tagsActions = {...tagsSlice.actions}\n\nexport default tagsSlice.reducer\n","import {type PayloadAction, createSelector, createSlice} from '@reduxjs/toolkit'\nimport {uuid} from '@sanity/uuid'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap, withLatestFrom} from 'rxjs/operators'\n\nimport type {MyEpic, SearchFacetInputProps, SearchFacetOperatorType, WithId} from '../../types'\nimport {tagsActions} from '../tags'\nimport type {RootReducerState} from '../types'\n\n// TODO: don't store non-serializable data in the search store\n// (The main offender is `fieldModifier` which is currently a function)\n\ntype SearchState = {\n  facets: WithId<SearchFacetInputProps>[]\n  query: string\n}\n\nconst initialState = {\n  facets: [],\n  query: '',\n} as SearchState\n\nconst searchSlice = createSlice({\n  name: 'search',\n  initialState,\n  reducers: {\n    // Add search facet\n    facetsAdd(state, action: PayloadAction<{facet: SearchFacetInputProps}>) {\n      state.facets.push({...action.payload.facet, id: uuid()})\n    },\n    // Clear all search facets\n    facetsClear(state) {\n      state.facets = []\n    },\n    // Remove search facet by name\n    facetsRemoveByName(state, action: PayloadAction<{facetName: string}>) {\n      state.facets = state.facets.filter((facet) => facet.name !== action.payload.facetName)\n    },\n    // Remove search facet by name\n    facetsRemoveByTag(state, action: PayloadAction<{tagId: string}>) {\n      state.facets = state.facets.filter(\n        (facet) =>\n          !(\n            facet.name === 'tag' &&\n            facet.type === 'searchable' &&\n            (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n            facet.value?.value === action.payload.tagId\n          ),\n      )\n    },\n    // Remove search facet by name\n    facetsRemoveById(state, action: PayloadAction<{facetId: string}>) {\n      state.facets = state.facets.filter((facet) => facet.id !== action.payload.facetId)\n    },\n    // Update an existing search facet\n    facetsUpdate(\n      state,\n      action: PayloadAction<{\n        modifier?: string\n        name: string\n        operatorType?: SearchFacetOperatorType\n        value?: any // TODO: type correctly\n      }>,\n    ) {\n      const {modifier, name, operatorType, value} = action.payload\n\n      const facet = state.facets.find((f) => f.name === name)\n\n      if (!facet) {\n        return\n      }\n\n      if (facet.type === 'number' && modifier) {\n        facet.modifier = modifier\n      }\n      if (operatorType) {\n        facet.operatorType = operatorType\n      }\n      if (typeof value !== 'undefined') {\n        facet.value = value\n      }\n\n      state.facets = state.facets.filter((f) => f.name !== facet.name || f.id === facet.id)\n    },\n    // Update an existing search facet\n    facetsUpdateById(\n      state,\n      action: PayloadAction<{\n        modifier?: string\n        id: string\n        operatorType?: SearchFacetOperatorType\n        value?: any // TODO: type correctly\n      }>,\n    ) {\n      const {modifier, id, operatorType, value} = action.payload\n\n      state.facets.forEach((facet, index) => {\n        if (facet.id === id) {\n          if (facet.type === 'number' && modifier) {\n            facet.modifier = modifier\n          }\n          if (operatorType) {\n            facet.operatorType = operatorType\n          }\n          if (typeof value !== 'undefined') {\n            state.facets[index]!.value = value\n          }\n        }\n      })\n    },\n    // Update existing search query\n    querySet(state, action: PayloadAction<{searchQuery: string}>) {\n      state.query = action.payload?.searchQuery\n    },\n  },\n})\n\n// Epics\n\n// On tag update success -> update existing tag search facet (if present)\nexport const searchFacetTagUpdateEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(tagsActions.updateComplete.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {tag} = action.payload\n\n      const currentSearchFacetTag = state.search.facets?.find((facet) => facet.name === 'tag')\n      const tagItem = state.tags.byIds[tag._id]\n\n      if (currentSearchFacetTag?.type === 'searchable') {\n        if (currentSearchFacetTag.value?.value === tag._id) {\n          return of(\n            searchSlice.actions.facetsUpdate({\n              name: 'tag',\n              value: {\n                label: tagItem?.tag?.name?.current,\n                value: tagItem?.tag?._id,\n              },\n            }),\n          )\n        }\n      }\n\n      return EMPTY\n    }),\n  )\n\n// Selectors\nexport const selectIsSearchFacetTag = createSelector(\n  [\n    (state: RootReducerState) => state.search.facets,\n    (_state: RootReducerState, tagId: string) => tagId,\n  ],\n  (searchFacets, tagId) =>\n    searchFacets.some(\n      (facet) =>\n        facet.name === 'tag' &&\n        facet.type === 'searchable' &&\n        (facet.operatorType === 'references' || facet.operatorType === 'doesNotReference') &&\n        facet.value?.value === tagId,\n    ),\n)\n\nexport const searchActions = {...searchSlice.actions}\n\nexport default searchSlice.reducer\n","import {createAction} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\n\nexport const UPLOADS_ACTIONS = {\n  uploadComplete: createAction(\n    'uploads/uploadComplete',\n    function prepare({asset}: {asset: SanityAssetDocument | SanityImageAssetDocument}) {\n      return {\n        payload: {asset},\n      }\n    },\n  ),\n}\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {AttributeSet, ClientError, Patch, SanityDocument, Transaction} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport type {Selector} from 'react-redux'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, from, of} from 'rxjs'\nimport {\n  bufferTime,\n  catchError,\n  concatMap,\n  debounceTime,\n  filter,\n  mergeMap,\n  switchMap,\n  withLatestFrom,\n} from 'rxjs/operators'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {\n  Asset,\n  AssetItem,\n  AssetType,\n  BrowserView,\n  HttpError,\n  MyEpic,\n  Order,\n  OrderDirection,\n  Tag,\n} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {findImageAssets} from '../../utils/ReplaceImages'\nimport {searchActions} from '../search'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\nimport {ASSETS_ACTIONS} from './actions'\ntype ItemError = {\n  description: string\n  id: string\n  referencingIDs: string[]\n  type: string // 'documentHasExistingReferencesError'\n}\n\nexport type AssetsReducerState = {\n  allIds: string[]\n  assetTypes: AssetType[]\n  byIds: Record<string, AssetItem>\n  excludeTagSlugs: string[]\n  fetchCount: number\n  fetching: boolean\n  fetchingError?: HttpError\n  lastPicked?: string\n  order: Order\n  pageIndex: number\n  pageSize: number\n  view: BrowserView\n  // totalCount: number\n}\n\nconst defaultOrder = ORDER_OPTIONS[0] as {\n  direction: OrderDirection\n  field: string\n}\n\n/**\n * NOTE:\n * `fetchCount` returns the number of items retrieved in the most recent fetch.\n * This is a temporary workaround to be able to determine when there are no more items to retrieve.\n * Typically this would be done by deriving the total number of assets upfront, but currently such\n * queries in GROQ aren't fast enough to use on large datasets (1000s of entries).\n *\n * TODO:\n * When the query engine has been improved and above queries are faster, remove all instances of\n * of `fetchCount` and reinstate `totalCount` across the board.\n */\n\nexport const initialState = {\n  allIds: [],\n  assetTypes: [],\n  byIds: {},\n  excludeTagSlugs: [],\n  fetchCount: -1,\n  fetching: false,\n  fetchingError: undefined,\n  lastPicked: undefined,\n  order: {\n    direction: defaultOrder.direction,\n    field: defaultOrder.field,\n    title: getOrderTitle(defaultOrder.field, defaultOrder.direction),\n  },\n  pageIndex: 0,\n  pageSize: 100,\n  // totalCount: -1,\n  view: 'grid',\n} as AssetsReducerState\n\nconst assetsSlice = createSlice({\n  name: 'assets',\n  initialState,\n  extraReducers: (builder) => {\n    builder //\n      .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n        const {asset} = action.payload\n\n        state.byIds[asset._id] = {\n          _type: 'asset',\n          asset: asset as Asset,\n          picked: false,\n          updating: false,\n        }\n      })\n      .addCase(ASSETS_ACTIONS.tagsAddComplete, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsAddError, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsAddRequest, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = true\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsRemoveComplete, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsRemoveError, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = false\n        })\n      })\n      .addCase(ASSETS_ACTIONS.tagsRemoveRequest, (state, action) => {\n        const {assets} = action.payload\n        assets.forEach((asset) => {\n          state.byIds[asset.asset._id]!.updating = true\n        })\n      })\n  },\n  reducers: {\n    // Clear asset order\n    clear(state) {\n      state.allIds = []\n    },\n    // Remove assets and update page index\n    deleteComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n      const {assetIds} = action.payload\n\n      assetIds?.forEach((id) => {\n        const deleteIndex = state.allIds.indexOf(id)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n        delete state.byIds[id]\n      })\n\n      state.pageIndex = Math.floor(state.allIds.length / state.pageSize) - 1\n    },\n    deleteError(state, action: PayloadAction<{assetIds: string[]; error: ClientError}>) {\n      const {assetIds, error} = action.payload\n      const itemErrors: ItemError[] = error?.response?.body?.error?.items?.map(\n        (item: any) => item.error,\n      )\n\n      assetIds?.forEach((id) => {\n        state.byIds[id]!.updating = false\n      })\n      itemErrors?.forEach((item) => {\n        state.byIds[item.id]!.error = item.description\n      })\n    },\n    deleteRequest(state, action: PayloadAction<{assets: Asset[]; closeDialogId?: string}>) {\n      const {assets} = action.payload\n      assets.forEach((asset) => {\n        state.byIds[asset?._id]!.updating = true\n      })\n\n      Object.keys(state.byIds).forEach((key) => {\n        delete state.byIds[key]!.error\n      })\n    },\n    fetchComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n      const assets = action.payload?.assets || []\n\n      if (assets) {\n        assets.forEach((asset) => {\n          if (!state.allIds.includes(asset._id)) {\n            state.allIds.push(asset._id)\n          }\n          const existing = state.byIds[asset._id]\n          // Preserve pick/updating across search refreshes (e.g. replace dialog clearing filters)\n          state.byIds[asset._id] = {\n            _type: 'asset',\n            asset: asset,\n            picked: existing?.picked ?? false,\n            updating: existing?.updating ?? false,\n            ...(existing?.error ? {error: existing.error} : {}),\n          }\n        })\n      }\n\n      state.fetching = false\n      state.fetchCount = assets.length || 0\n      delete state.fetchingError\n    },\n    fetchError(state, action: PayloadAction<HttpError>) {\n      const error = action.payload\n      state.fetching = false\n      state.fetchingError = error\n    },\n    folderSetComplete(\n      state,\n      action: PayloadAction<{assetIds: string[]; folderId: string | null; closeDialogId?: string}>,\n    ) {\n      const {assetIds, folderId} = action.payload\n\n      assetIds.forEach((assetId) => {\n        if (state.byIds[assetId]?.asset) {\n          state.byIds[assetId].asset.opt = state.byIds[assetId].asset.opt || {}\n          state.byIds[assetId].asset.opt.media = state.byIds[assetId].asset.opt.media || {}\n          state.byIds[assetId].asset.opt.media.folder = folderId\n            ? {_ref: folderId, _type: 'reference', _weak: true}\n            : undefined\n          state.byIds[assetId].updating = false\n        }\n      })\n    },\n    folderSetError(state, action: PayloadAction<{assetIds: string[]; error: HttpError}>) {\n      const {assetIds, error} = action.payload\n\n      assetIds.forEach((assetId) => {\n        if (state.byIds[assetId]) {\n          state.byIds[assetId].error = error.message\n          state.byIds[assetId].updating = false\n        }\n      })\n    },\n    folderSetRequest(\n      state,\n      action: PayloadAction<{\n        assets: AssetItem[]\n        folderId: string | null\n        closeDialogId?: string\n      }>,\n    ) {\n      action.payload.assets.forEach((asset) => {\n        const item = state.byIds[asset.asset._id]\n        if (item) {\n          item.updating = true\n        }\n      })\n    },\n    fetchRequest: {\n      reducer: (state, _action: PayloadAction<{params: Record<string, any>; query: string}>) => {\n        state.fetching = true\n        delete state.fetchingError\n      },\n      prepare: ({\n        params = {},\n        queryFilter,\n        selector = ``,\n        sort = groq`order(_updatedAt desc)`,\n      }: {\n        params?: Record<string, any>\n        queryFilter: string\n        replace?: boolean\n        selector?: string\n        sort?: string\n      }) => {\n        const pipe = sort || selector ? '|' : ''\n\n        // Construct query\n        const query = groq`\n          {\n            \"items\": *[${queryFilter}] {\n              _id,\n              _type,\n              _createdAt,\n              _updatedAt,\n              altText,\n              creditLine,\n              description,\n              extension,\n              metadata {\n                dimensions,\n                exif,\n                image,\n                isOpaque,\n              },\n              mimeType,\n              opt {\n                media\n              },\n              originalFilename,\n              size,\n              source {\n                name,\n                id,\n                url,\n              },\n              title,\n              url\n            } ${pipe} ${sort} ${selector},\n          }\n        `\n\n        return {payload: {params, query}}\n      },\n    },\n    insertUploads(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n      const {results} = action.payload\n\n      Object.entries(results).forEach(([hash, assetId]) => {\n        if (assetId && !state.allIds.includes(hash)) {\n          state.allIds.push(assetId)\n        }\n      })\n    },\n    listenerCreateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n      //\n    },\n    listenerCreateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n      const {assets} = action.payload\n      assets?.forEach((asset) => {\n        if (state.byIds[asset?._id]?.asset) {\n          state.byIds[asset._id]!.asset = asset\n        }\n      })\n    },\n    listenerDeleteQueue(_state, _action: PayloadAction<{assetId: string}>) {\n      //\n    },\n    listenerDeleteQueueComplete(state, action: PayloadAction<{assetIds: string[]}>) {\n      const {assetIds} = action.payload\n      assetIds?.forEach((assetId) => {\n        const deleteIndex = state.allIds.indexOf(assetId)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n        delete state.byIds[assetId]\n      })\n    },\n    listenerUpdateQueue(_state, _action: PayloadAction<{asset: Asset}>) {\n      //\n    },\n    listenerUpdateQueueComplete(state, action: PayloadAction<{assets: Asset[]}>) {\n      const {assets} = action.payload\n      assets?.forEach((asset) => {\n        if (state.byIds[asset?._id]?.asset) {\n          state.byIds[asset._id]!.asset = asset\n        }\n      })\n    },\n    loadNextPage() {\n      //\n    },\n    loadPageIndex(state, action: PayloadAction<{pageIndex: number}>) {\n      //\n      state.pageIndex = action.payload.pageIndex\n    },\n    orderSet(state, action: PayloadAction<{order: Order}>) {\n      state.order = action.payload?.order\n      state.pageIndex = 0\n    },\n    pick(state, action: PayloadAction<{assetId: string; picked: boolean}>) {\n      const {assetId, picked} = action.payload\n      const item = state.byIds[assetId]\n      if (!item) {\n        return\n      }\n\n      item.picked = picked\n      state.lastPicked = picked ? assetId : undefined\n    },\n    pickAll(state) {\n      state.allIds.forEach((id) => {\n        state.byIds[id]!.picked = true\n      })\n    },\n    pickClear(state) {\n      state.lastPicked = undefined\n      Object.values(state.byIds).forEach((asset) => {\n        state.byIds[asset.asset._id]!.picked = false\n      })\n    },\n    pickRange(state, action: PayloadAction<{endId: string; startId: string}>) {\n      const startIndex = state.allIds.findIndex((id) => id === action.payload.startId)\n      const endIndex = state.allIds.findIndex((id) => id === action.payload.endId)\n\n      // Sort numerically, ascending order\n      const indices = [startIndex, endIndex].sort((a, b) => a - b)\n\n      state.allIds.slice(indices[0], indices[1]! + 1).forEach((key) => {\n        state.byIds[key]!.picked = true\n      })\n      state.lastPicked = state.allIds[endIndex]\n    },\n    sort(state) {\n      state.allIds.sort((a, b) => {\n        const tagA = state.byIds[a]!.asset[state.order.field]\n        const tagB = state.byIds[b]!.asset[state.order.field]\n\n        if (tagA < tagB) {\n          return state.order.direction === 'asc' ? -1 : 1\n        } else if (tagA > tagB) {\n          return state.order.direction === 'asc' ? 1 : -1\n        }\n        return 0\n      })\n    },\n    updateComplete(state, action: PayloadAction<{asset: Asset; closeDialogId?: string}>) {\n      const {asset} = action.payload\n      state.byIds[asset._id]!.updating = false\n      state.byIds[asset._id]!.asset = asset\n    },\n    updateError(state, action: PayloadAction<{asset: Asset; error: HttpError}>) {\n      const {asset, error} = action.payload\n\n      const assetId = asset?._id\n      state.byIds[assetId]!.error = error.message\n      state.byIds[assetId]!.updating = false\n    },\n    updateImageReferences(state, action: PayloadAction<{asset: Asset; id: string}>) {\n      const {id: assetId} = action.payload\n      const item = state.byIds[assetId]\n      if (!item) {\n        return\n      }\n      item.updating = true\n      delete item.error\n    },\n    updateImageReferencesComplete(state, action: PayloadAction<{id: string}>) {\n      const {id} = action.payload\n      const item = state.byIds[id]\n      if (!item) {\n        return\n      }\n      item.updating = false\n      delete item.error\n    },\n    updateRequest(\n      state,\n      action: PayloadAction<{asset: Asset; closeDialogId?: string; formData: Record<string, any>}>,\n    ) {\n      const assetId = action.payload?.asset?._id\n      state.byIds[assetId]!.updating = true\n    },\n    viewSet(state, action: PayloadAction<{view: BrowserView}>) {\n      state.view = action.payload?.view\n    },\n  },\n})\n\n// Epics\n\nexport const assetsDeleteEpic: MyEpic = (action$, _state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.deleteRequest.match),\n    mergeMap((action) => {\n      const {assets} = action.payload\n      const assetIds = assets.map((asset) => asset._id)\n      return of(assets).pipe(\n        mergeMap(() =>\n          client.observable.delete({\n            query: groq`*[_id in ${JSON.stringify(assetIds)}]`,\n          }),\n        ),\n        mergeMap(() => of(assetsActions.deleteComplete({assetIds}))),\n        catchError((error: ClientError) => {\n          return of(assetsActions.deleteError({assetIds, error}))\n        }),\n      )\n    }),\n  )\n\nexport const assetsFetchEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.fetchRequest.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) => {\n      const params = action.payload?.params\n      const query = action.payload?.query\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() =>\n          client.observable.fetch<{\n            items: Asset[]\n          }>(query, params),\n        ),\n        mergeMap((result) => {\n          const {\n            items,\n            // totalCount\n          } = result\n          return of(assetsActions.fetchComplete({assets: items}))\n        }),\n        catchError((error: ClientError) =>\n          of(\n            assetsActions.fetchError({\n              message: error?.message || 'Internal error',\n              statusCode: error?.statusCode || 500,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const assetsFetchPageIndexEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(assetsActions.loadPageIndex.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) => {\n      const pageSize = state.assets.pageSize\n      const start = action.payload.pageIndex * pageSize\n      const end = start + pageSize\n\n      // Document ID can be null when operating on pristine / unsaved drafts\n      const documentId = state?.selected.document?._id\n      const documentAssetIds = state?.selected?.documentAssetIds\n\n      const constructedFilter = constructFilter({\n        assetTypes: state.assets.assetTypes,\n        currentFolderId: state.folders.currentFolderId,\n        excludeTagSlugs: state.assets.excludeTagSlugs,\n        searchFacets: state.search.facets,\n        searchQuery: state.search.query,\n      })\n\n      const params = {\n        ...(documentId ? {documentId} : {}),\n        documentAssetIds,\n      }\n\n      return of(\n        assetsActions.fetchRequest({\n          params,\n          queryFilter: constructedFilter,\n          selector: groq`[${start}...${end}]`,\n          sort: groq`order(${state.assets?.order?.field} ${state.assets?.order?.direction})`,\n        }),\n      )\n    }),\n  )\n\nexport const assetsFetchNextPageEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(assetsActions.loadNextPage.match),\n    withLatestFrom(state$),\n    switchMap(([_action, state]) =>\n      of(assetsActions.loadPageIndex({pageIndex: state.assets.pageIndex + 1})),\n    ),\n  )\n\nexport const assetsFetchAfterDeleteAllEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(assetsActions.deleteComplete.match),\n    withLatestFrom(state$),\n    switchMap(([_action, state]) => {\n      if (state.assets.allIds.length === 0) {\n        const nextPageIndex = Math.floor(state.assets.allIds.length / state.assets.pageSize)\n        return of(assetsActions.loadPageIndex({pageIndex: nextPageIndex}))\n      }\n\n      return EMPTY\n    }),\n  )\n\nconst filterAssetWithoutTag = (tag: Tag) => (asset: AssetItem) => {\n  const tagIndex = asset?.asset?.opt?.media?.tags?.findIndex((t) => t._ref === tag?._id) ?? -1\n  return tagIndex < 0\n}\n\nconst patchOperationTagAppend =\n  ({tag}: {tag: Tag}) =>\n  (patch: Patch) =>\n    patch\n      .setIfMissing({opt: {}})\n      .setIfMissing({'opt.media': {}})\n      .setIfMissing({'opt.media.tags': []})\n      .append('opt.media.tags', [{_key: nanoid(), _ref: tag?._id, _type: 'reference', _weak: true}])\n\nconst patchOperationTagUnset =\n  ({asset, tag}: {asset: AssetItem; tag: Tag}) =>\n  (patch: Patch) =>\n    patch.ifRevisionId(asset?.asset?._rev).unset([`opt.media.tags[_ref == \"${tag._id}\"]`])\n\nconst patchOperationFolderSet =\n  ({asset, folderId}: {asset: AssetItem; folderId: string | null}) =>\n  (patch: Patch) => {\n    const nextPatch = patch.ifRevisionId(asset?.asset?._rev).setIfMissing({opt: {}}).setIfMissing({\n      'opt.media': {},\n    })\n\n    if (folderId) {\n      return nextPatch.set({\n        'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n      })\n    }\n\n    return nextPatch.unset(['opt.media.folder'])\n  }\n\nexport const assetsOrderSetEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.orderSet.match),\n    mergeMap(() => {\n      return of(\n        assetsActions.clear(), //\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      )\n    }),\n  )\n\nexport const assetsSearchEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      searchActions.facetsAdd.type,\n      searchActions.facetsClear.type,\n      searchActions.facetsRemoveById.type,\n      searchActions.facetsRemoveByName.type,\n      searchActions.facetsRemoveByTag.type,\n      searchActions.facetsUpdate.type,\n      searchActions.facetsUpdateById.type,\n      searchActions.querySet.type,\n    ),\n    debounceTime(400),\n    mergeMap(() => {\n      return of(\n        assetsActions.clear(), //\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      )\n    }),\n  )\n\nexport const assetsListenerCreateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.listenerCreateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const assets = actions?.map((action) => action.payload.asset)\n      return of(assetsActions.listenerCreateQueueComplete({assets}))\n    }),\n  )\n\nexport const assetsListenerDeleteQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.listenerDeleteQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const assetIds = actions?.map((action) => action.payload.assetId)\n      return of(assetsActions.listenerDeleteQueueComplete({assetIds}))\n    }),\n  )\n\nexport const assetsListenerUpdateQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.listenerUpdateQueue.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const assets = actions?.map((action) => action.payload.asset)\n      return of(assetsActions.listenerUpdateQueueComplete({assets}))\n    }),\n  )\n\n// Re-sort on all updates (immediate and batched listener events)\nexport const assetsSortEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.insertUploads.type,\n      assetsActions.listenerUpdateQueueComplete.type,\n      assetsActions.updateComplete.type,\n    ),\n    mergeMap(() => of(assetsActions.sort())),\n  )\n\nexport const assetsTagsAddEpic: MyEpic = (action$, state$, {client}) => {\n  return action$.pipe(\n    filter(ASSETS_ACTIONS.tagsAddRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets, tag} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Add tag references to all picked assets\n        mergeMap(() => {\n          const pickedAssets = selectAssetsPicked(state)\n\n          // Filter out picked assets which already include tag\n          const pickedAssetsFiltered = pickedAssets?.filter(filterAssetWithoutTag(tag))\n\n          const transaction: Transaction = pickedAssetsFiltered.reduce(\n            (tx, pickedAsset) => tx.patch(pickedAsset?.asset?._id, patchOperationTagAppend({tag})),\n            client.transaction(),\n          )\n\n          return from(transaction.commit())\n        }),\n        // Dispatch complete action\n        mergeMap(() => of(ASSETS_ACTIONS.tagsAddComplete({assets, tag}))),\n        catchError((error: ClientError) =>\n          of(\n            ASSETS_ACTIONS.tagsAddError({\n              assets,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n}\n\nexport const assetsTagsRemoveEpic: MyEpic = (action$, state$, {client}) => {\n  return action$.pipe(\n    filter(ASSETS_ACTIONS.tagsRemoveRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets, tag} = action.payload\n\n      return of(action).pipe(\n        // Optionally throttle\n        debugThrottle(state.debug.badConnection),\n        // Remove tag references from all picked assets\n        mergeMap(() => {\n          const pickedAssets = selectAssetsPicked(state)\n\n          const transaction: Transaction = pickedAssets.reduce(\n            (tx, pickedAsset) =>\n              tx.patch(pickedAsset?.asset?._id, patchOperationTagUnset({asset: pickedAsset, tag})),\n            client.transaction(),\n          )\n\n          return from(transaction.commit())\n        }),\n        // Dispatch complete action\n        mergeMap(() => of(ASSETS_ACTIONS.tagsRemoveComplete({assets, tag}))),\n        catchError((error: ClientError) =>\n          of(\n            ASSETS_ACTIONS.tagsRemoveError({\n              assets,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              tag,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n}\n\nexport const assetsFolderSetEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.folderSetRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets, closeDialogId, folderId} = action.payload\n      const assetIds = assets.map((asset) => asset.asset._id)\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => {\n          const transaction: Transaction = assets.reduce(\n            (tx, asset) => tx.patch(asset.asset._id, patchOperationFolderSet({asset, folderId})),\n            client.transaction(),\n          )\n\n          return from(transaction.commit())\n        }),\n        mergeMap(() =>\n          of(\n            assetsActions.folderSetComplete({\n              assetIds,\n              closeDialogId,\n              folderId,\n            }),\n          ),\n        ),\n        catchError((error: ClientError) =>\n          of(\n            assetsActions.folderSetError({\n              assetIds,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const assetsFolderSetRefreshEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.folderSetComplete.match),\n    mergeMap(() =>\n      of(\n        assetsActions.pickClear(),\n        assetsActions.clear(),\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      ),\n    ),\n  )\n\nexport const assetsUnpickEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.orderSet.type,\n      assetsActions.viewSet.type,\n      searchActions.facetsAdd.type,\n      searchActions.facetsClear.type,\n      searchActions.facetsRemoveById.type,\n      searchActions.facetsRemoveByName.type,\n      searchActions.facetsRemoveByTag.type,\n      searchActions.facetsUpdate.type,\n      searchActions.facetsUpdateById.type,\n      searchActions.querySet.type,\n    ),\n    mergeMap(() => {\n      return of(assetsActions.pickClear())\n    }),\n  )\n\nexport const assetsUpdateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.updateRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {asset, closeDialogId, formData} = action.payload\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() =>\n          from(\n            client\n              .patch(asset._id)\n              .setIfMissing({opt: {}})\n              .setIfMissing({'opt.media': {}})\n              .set(formData)\n              .commit(),\n          ),\n        ),\n        mergeMap((updatedAsset: any) =>\n          of(\n            assetsActions.updateComplete({\n              asset: updatedAsset,\n              closeDialogId,\n            }),\n          ),\n        ),\n        catchError((error: ClientError) =>\n          of(\n            assetsActions.updateError({\n              asset,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const assetsUpdateImageReferencesEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(assetsActions.updateImageReferences.match),\n    withLatestFrom(state$),\n    // Queue replaces so a later action still runs (exhaustMap would drop it after\n    // the reducer already set `updating`, leaving a stuck spinner). Same-asset\n    // double-clicks are blocked in the UI when the original is already updating.\n    concatMap(([action, state]) => {\n      const {asset, id} = action.payload\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => client.observable.fetch<SanityDocument[]>(groq`*[references($id)]`, {id})),\n        mergeMap((documents) => {\n          // Patch every referencing document in one transaction so we never leave\n          // references split across old/new assets if a later commit would fail.\n          let patchedCount = 0\n          const transaction: Transaction = documents.reduce((tx, document) => {\n            const clonedDocument = JSON.parse(JSON.stringify(document)) as Record<string, unknown>\n            const assetsToReplace = findImageAssets(clonedDocument, asset, id)\n            if (assetsToReplace.length === 0) {\n              return tx\n            }\n            patchedCount += 1\n            const patchSet = Object.assign({}, ...assetsToReplace) as AttributeSet\n            return tx.patch(document._id, (patch) =>\n              patch.ifRevisionId(document._rev).set(patchSet),\n            )\n          }, client.transaction())\n\n          if (patchedCount === 0) {\n            return of(assetsActions.updateImageReferencesComplete({id}))\n          }\n\n          return from(transaction.commit()).pipe(\n            mergeMap(() => of(assetsActions.updateImageReferencesComplete({id}))),\n          )\n        }),\n        catchError((error: ClientError) => {\n          // The asset marked as `updating` is the original (being replaced), keyed\n          // by `id` — not the replacement `asset` that was clicked. Attach the error\n          // to (and clear the spinner on) the original asset.\n          const originalAsset = state.assets.byIds[id]?.asset ?? asset\n          return of(\n            assetsActions.updateError({\n              asset: originalAsset,\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          )\n        }),\n      )\n    }),\n  )\n\n// Selectors\n\nconst selectAssetsByIds = (state: RootReducerState) => state.assets.byIds\n\nconst selectAssetsAllIds = (state: RootReducerState) => state.assets.allIds\n\nexport const selectAssetById = createSelector(\n  [\n    (state: RootReducerState) => state.assets.byIds,\n    (_state: RootReducerState, assetId: string) => assetId,\n  ],\n  (byIds, assetId) => {\n    const asset = byIds[assetId]\n    return asset ? asset : undefined\n  },\n)\n\nconst selectAssets: Selector<RootReducerState, AssetItem[]> = createSelector(\n  [selectAssetsByIds, selectAssetsAllIds],\n  (byIds, allIds) => allIds.map((id) => byIds[id]!),\n)\n\nexport const selectAssetsLength = createSelector([selectAssets], (assets) => assets.length)\n\nexport const selectAssetsPicked = createSelector([selectAssets], (assets) =>\n  assets.filter((item) => item?.picked),\n)\n\nexport const selectAssetsPickedLength = createSelector(\n  [selectAssetsPicked],\n  (assetsPicked) => assetsPicked.length,\n)\n\nexport const assetsActions = {...assetsSlice.actions}\n\nexport default assetsSlice.reducer\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, Patch} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\nimport {from, of} from 'rxjs'\nimport {\n  catchError,\n  debounceTime,\n  filter,\n  map,\n  mergeMap,\n  switchMap,\n  withLatestFrom,\n} from 'rxjs/operators'\n\nimport {FOLDER_DOCUMENT_NAME} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport type {FolderDoc, FolderTreeItem, FolderTreeNode, HttpError, MyEpic} from '../../types'\nimport {buildExcludeTagsFragment} from '../../utils/constructFilter'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from '../uploads/actions'\n\ntype FoldersReducerState = {\n  byId: Record<string, FolderDoc>\n  childrenByParentId: Record<string, string[]>\n  rootIds: string[]\n  exactCountByFolderId: Record<string, number>\n  unfiledCount: number\n  currentFolderId: string | null\n  currentFolderUnfiled: boolean\n  panelVisible: boolean\n  fetching: boolean\n  fetchCount: number\n  fetchingError?: HttpError\n  creating: boolean\n  creatingError?: HttpError\n  deletingId?: string\n  deleteError?: HttpError\n  renaming: boolean\n  renameError?: HttpError\n}\n\nconst initialState: FoldersReducerState = {\n  byId: {},\n  childrenByParentId: {},\n  rootIds: [],\n  exactCountByFolderId: {},\n  unfiledCount: 0,\n  currentFolderId: null,\n  currentFolderUnfiled: false,\n  panelVisible: false,\n  fetching: false,\n  fetchCount: -1,\n  fetchingError: undefined,\n  creating: false,\n  creatingError: undefined,\n  deletingId: undefined,\n  deleteError: undefined,\n  renaming: false,\n  renameError: undefined,\n}\n\nconst indexFolders = (folders: FolderDoc[]) => {\n  const byId: Record<string, FolderDoc> = {}\n  const childrenByParentId: Record<string, string[]> = {}\n  const rootIds: string[] = []\n\n  folders.forEach((folder) => {\n    byId[folder._id] = folder\n  })\n\n  // Resolve parent ids that reference unknown folders to null (defensive — orphan folders surface at root).\n  folders.forEach((folder) => {\n    const parentKey = folder.parentId && byId[folder.parentId] ? folder.parentId : null\n    if (parentKey === null) {\n      rootIds.push(folder._id)\n    } else {\n      if (!childrenByParentId[parentKey]) {\n        childrenByParentId[parentKey] = []\n      }\n      childrenByParentId[parentKey].push(folder._id)\n    }\n  })\n\n  const sortByName = (ids: string[]) =>\n    ids.sort((a, b) =>\n      (byId[a]?.name || '').localeCompare(byId[b]?.name || '', undefined, {\n        numeric: true,\n        sensitivity: 'base',\n      }),\n    )\n\n  sortByName(rootIds)\n  Object.values(childrenByParentId).forEach((ids) => sortByName(ids))\n\n  return {byId, childrenByParentId, rootIds}\n}\n\nconst foldersSlice = createSlice({\n  name: 'folders',\n  initialState,\n  reducers: {\n    createComplete(state, _action: PayloadAction<{folder: FolderDoc}>) {\n      state.creating = false\n    },\n    createError(state, action: PayloadAction<{error: HttpError}>) {\n      state.creating = false\n      state.creatingError = action.payload.error\n    },\n    createRequest(state, _action: PayloadAction<{name: string; parentId?: string | null}>) {\n      state.creating = true\n      delete state.creatingError\n    },\n    currentFolderClear(state) {\n      state.currentFolderId = null\n      state.currentFolderUnfiled = false\n    },\n    currentFolderSet(state, action: PayloadAction<{folderId: string}>) {\n      state.currentFolderId = action.payload.folderId\n      state.currentFolderUnfiled = false\n    },\n    currentFolderShowUnfiled(state) {\n      state.currentFolderId = null\n      state.currentFolderUnfiled = true\n    },\n    deleteComplete(\n      state,\n      action: PayloadAction<{\n        folderId: string\n        deletedIds: string[]\n        clearedCurrentFolder?: boolean\n      }>,\n    ) {\n      state.deletingId = undefined\n      const removed = new Set(action.payload.deletedIds)\n      if (state.currentFolderId && removed.has(state.currentFolderId)) {\n        state.currentFolderId = null\n        state.currentFolderUnfiled = false\n      }\n    },\n    deleteError(state, action: PayloadAction<{error: HttpError; folderId: string}>) {\n      state.deletingId = undefined\n      state.deleteError = action.payload.error\n    },\n    deleteRequest(state, action: PayloadAction<{folderId: string}>) {\n      state.deletingId = action.payload.folderId\n      delete state.deleteError\n    },\n    fetchComplete(\n      state,\n      action: PayloadAction<{\n        folders: FolderDoc[]\n        exactCountByFolderId: Record<string, number>\n        unfiledCount: number\n        clearedCurrentFolder?: boolean\n      }>,\n    ) {\n      const {byId, childrenByParentId, rootIds} = indexFolders(action.payload.folders)\n      state.byId = byId\n      state.childrenByParentId = childrenByParentId\n      state.rootIds = rootIds\n      state.exactCountByFolderId = action.payload.exactCountByFolderId\n      state.unfiledCount = action.payload.unfiledCount\n      state.fetching = false\n      state.fetchCount = action.payload.folders.length\n      delete state.fetchingError\n\n      if (state.currentFolderId && !byId[state.currentFolderId]) {\n        state.currentFolderId = null\n        state.currentFolderUnfiled = false\n      }\n    },\n    fetchError(state, action: PayloadAction<{error: HttpError}>) {\n      state.fetching = false\n      state.fetchingError = action.payload.error\n    },\n    fetchRequest(state) {\n      state.fetching = true\n      delete state.fetchingError\n    },\n    panelVisibleSet(state, action: PayloadAction<{panelVisible: boolean}>) {\n      state.panelVisible = action.payload.panelVisible\n    },\n    renameComplete(state, _action: PayloadAction<{folderId: string; name: string}>) {\n      state.renaming = false\n    },\n    renameError(state, action: PayloadAction<{error: HttpError}>) {\n      state.renaming = false\n      state.renameError = action.payload.error\n    },\n    renameRequest(state, _action: PayloadAction<{folderId: string; name: string}>) {\n      state.renaming = true\n      delete state.renameError\n    },\n  },\n})\n\nexport const foldersFetchEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.fetchRequest.match),\n    withLatestFrom(state$),\n    switchMap(([action, state]) =>\n      of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => {\n          const assetTypes = state.assets.assetTypes.map((type) => `sanity.${type}Asset`)\n          const excludeTagsFragment = buildExcludeTagsFragment(state.assets.excludeTagSlugs)\n          const excludeTagsClause = excludeTagsFragment ? `&& ${excludeTagsFragment}` : ''\n          return client.observable.fetch<{\n            folders: {_id: string; name?: string; parentId?: string | null; count: number}[]\n            unfiledCount: number\n          }>(\n            groq`{\n              \"folders\": *[\n                _type == \"${FOLDER_DOCUMENT_NAME}\"\n                && !(_id in path(\"drafts.**\"))\n              ] {\n                _id,\n                name,\n                \"parentId\": parent._ref,\n                \"count\": count(*[\n                  _type in ${JSON.stringify(assetTypes)}\n                  && !(_id in path(\"drafts.**\"))\n                  && opt.media.folder._ref == ^._id\n                  ${excludeTagsClause}\n                ])\n              },\n              \"unfiledCount\": count(*[\n                _type in ${JSON.stringify(assetTypes)}\n                && !(_id in path(\"drafts.**\"))\n                && !defined(opt.media.folder._ref)\n                ${excludeTagsClause}\n              ])\n            }`,\n          )\n        }),\n        mergeMap((result) => {\n          const folders: FolderDoc[] = result.folders.map((f) => ({\n            _id: f._id,\n            name: f.name || '',\n            parentId: f.parentId || null,\n          }))\n          const exactCountByFolderId: Record<string, number> = {}\n          result.folders.forEach(({_id, count}) => {\n            exactCountByFolderId[_id] = count\n          })\n          const folderIds = new Set(folders.map((folder) => folder._id))\n          const clearedCurrentFolder = Boolean(\n            state.folders.currentFolderId && !folderIds.has(state.folders.currentFolderId),\n          )\n          return of(\n            foldersSlice.actions.fetchComplete({\n              folders,\n              exactCountByFolderId,\n              unfiledCount: result.unfiledCount,\n              clearedCurrentFolder,\n            }),\n          )\n        }),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.fetchError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      ),\n    ),\n  )\n\nexport const foldersRefreshEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(\n      (action) =>\n        assetsActions.deleteComplete.match(action) ||\n        assetsActions.folderSetComplete.match(action) ||\n        foldersSlice.actions.createComplete.match(action) ||\n        foldersSlice.actions.deleteComplete.match(action) ||\n        foldersSlice.actions.renameComplete.match(action) ||\n        assetsActions.listenerCreateQueueComplete.match(action) ||\n        assetsActions.listenerDeleteQueueComplete.match(action) ||\n        assetsActions.listenerUpdateQueueComplete.match(action) ||\n        assetsActions.updateComplete.match(action) ||\n        UPLOADS_ACTIONS.uploadComplete.match(action),\n    ),\n    debounceTime(300),\n    mergeMap(() => of(foldersSlice.actions.fetchRequest())),\n  )\n\nexport const foldersCurrentFolderEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(\n      (action) =>\n        foldersSlice.actions.currentFolderClear.match(action) ||\n        foldersSlice.actions.currentFolderSet.match(action) ||\n        foldersSlice.actions.currentFolderShowUnfiled.match(action) ||\n        (foldersSlice.actions.deleteComplete.match(action) &&\n          Boolean(action.payload.clearedCurrentFolder)) ||\n        (foldersSlice.actions.fetchComplete.match(action) &&\n          Boolean(action.payload.clearedCurrentFolder)),\n    ),\n    mergeMap(() =>\n      of(\n        assetsActions.clear(),\n        assetsActions.pickClear(),\n        assetsActions.loadPageIndex({pageIndex: 0}),\n      ),\n    ),\n  )\n\nconst patchOperationAssetFolderUnset = (patch: Patch) => patch.unset(['opt.media.folder'])\n\nconst patchOperationFolderParentSet =\n  ({parentId}: {parentId: string | null}) =>\n  (patch: Patch) => {\n    if (parentId) {\n      return patch.set({parent: {_ref: parentId, _type: 'reference', _weak: true}})\n    }\n\n    return patch.unset(['parent'])\n  }\n\nexport const foldersCreateEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.createRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const name = action.payload.name.trim()\n      const parentId = action.payload.parentId || null\n\n      if (!name) {\n        return of(\n          foldersSlice.actions.createError({\n            error: {message: 'Folder name cannot be empty', statusCode: 400},\n          }),\n        )\n      }\n\n      const siblingIds = parentId\n        ? state.folders.childrenByParentId[parentId] || []\n        : state.folders.rootIds\n      const collision = siblingIds.some(\n        (id) => state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n      )\n      if (collision) {\n        return of(\n          foldersSlice.actions.createError({\n            error: {message: 'A folder with this name already exists here', statusCode: 409},\n          }),\n        )\n      }\n\n      const newId = `${FOLDER_DOCUMENT_NAME}.${nanoid()}`\n      const doc: {\n        _id: string\n        _type: string\n        name: string\n        parent?: {_ref: string; _type: 'reference'; _weak: true}\n      } = {\n        _id: newId,\n        _type: FOLDER_DOCUMENT_NAME,\n        name,\n      }\n      if (parentId) {\n        doc.parent = {_ref: parentId, _type: 'reference', _weak: true}\n      }\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => client.observable.create(doc)),\n        mergeMap(() =>\n          of(\n            foldersSlice.actions.createComplete({folder: {_id: newId, name, parentId}}),\n            foldersSlice.actions.currentFolderSet({folderId: newId}),\n          ),\n        ),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.createError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const foldersDeleteEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.deleteRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const folderId = action.payload.folderId\n      const childFolderIds = state.folders.childrenByParentId[folderId] || []\n      const parentId = state.folders.byId[folderId]?.parentId ?? null\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() =>\n          client.observable.fetch<{assets: {_id: string}[]}>(\n            groq`{\n              \"assets\": *[\n                _type in ${JSON.stringify(\n                  state.assets.assetTypes.map((type) => `sanity.${type}Asset`),\n                )}\n                && !(_id in path(\"drafts.**\"))\n                && opt.media.folder._ref == $folderId\n              ] {\n                _id\n              }\n            }`,\n            {folderId},\n          ),\n        ),\n        mergeMap((result) => {\n          const tx = client.transaction()\n          // Deleting a folder only removes the folder document. Assets keep living in the\n          // library with their folder assignment cleared, and direct child folders are promoted\n          // to the deleted folder's parent (or root).\n          result.assets.forEach((asset) => tx.patch(asset._id, patchOperationAssetFolderUnset))\n          childFolderIds.forEach((childFolderId) =>\n            tx.patch(childFolderId, patchOperationFolderParentSet({parentId})),\n          )\n          tx.delete(folderId)\n\n          return from(tx.commit()).pipe(\n            map(() =>\n              foldersSlice.actions.deleteComplete({\n                folderId,\n                deletedIds: [folderId],\n                clearedCurrentFolder: state.folders.currentFolderId === folderId,\n              }),\n            ),\n          )\n        }),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.deleteError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n              folderId,\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const foldersRenameEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(foldersSlice.actions.renameRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {folderId} = action.payload\n      const name = action.payload.name.trim()\n      const folder = state.folders.byId[folderId]\n\n      if (!folder) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'Folder not found', statusCode: 404},\n          }),\n        )\n      }\n\n      if (!name) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'Folder name cannot be empty', statusCode: 400},\n          }),\n        )\n      }\n\n      if (name === folder.name) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'Folder name has not changed', statusCode: 400},\n          }),\n        )\n      }\n\n      const siblingIds = folder.parentId\n        ? state.folders.childrenByParentId[folder.parentId] || []\n        : state.folders.rootIds\n      const collision = siblingIds.some(\n        (id) =>\n          id !== folderId && state.folders.byId[id]?.name.toLowerCase() === name.toLowerCase(),\n      )\n      if (collision) {\n        return of(\n          foldersSlice.actions.renameError({\n            error: {message: 'A folder with this name already exists here', statusCode: 409},\n          }),\n        )\n      }\n\n      return of(action).pipe(\n        debugThrottle(state.debug.badConnection),\n        mergeMap(() => client.observable.patch(folderId).set({name}).commit()),\n        mergeMap(() => of(foldersSlice.actions.renameComplete({folderId, name}))),\n        catchError((error: ClientError) =>\n          of(\n            foldersSlice.actions.renameError({\n              error: {\n                message: error?.message || 'Internal error',\n                statusCode: error?.statusCode || 500,\n              },\n            }),\n          ),\n        ),\n      )\n    }),\n  )\n\nconst selectById = (state: RootReducerState) => state.folders.byId\nconst selectChildrenByParentId = (state: RootReducerState) => state.folders.childrenByParentId\nconst selectRootIds = (state: RootReducerState) => state.folders.rootIds\nconst selectExactCountByFolderId = (state: RootReducerState) => state.folders.exactCountByFolderId\nconst selectCurrentFolderId = (state: RootReducerState) => state.folders.currentFolderId\nconst selectCurrentFolderUnfiled = (state: RootReducerState) => state.folders.currentFolderUnfiled\n\nconst buildFolderPath = (folderId: string, byId: Record<string, FolderDoc>): string => {\n  const segments: string[] = []\n  let cursor: string | null = folderId\n  const seen = new Set<string>()\n  while (cursor && !seen.has(cursor)) {\n    const folder: FolderDoc | undefined = byId[cursor]\n    if (!folder) break\n    seen.add(cursor)\n    segments.unshift(folder.name)\n    cursor = folder.parentId\n  }\n  return segments.join('/')\n}\n\nexport const selectFolderPathById = createSelector(\n  [selectById, (_state: RootReducerState, folderId: string | null | undefined) => folderId],\n  (byId, folderId) => (folderId ? buildFolderPath(folderId, byId) : ''),\n)\n\nexport const selectFolderTree = createSelector(\n  [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n  (byId, childrenByParentId, rootIds, exactCountByFolderId): FolderTreeNode[] => {\n    const buildNode = (folderId: string): FolderTreeNode => {\n      const folder = byId[folderId]\n      const children = (childrenByParentId[folderId] || []).map(buildNode)\n      const exactCount = exactCountByFolderId[folderId] || 0\n      const totalCount = children.reduce((sum, child) => sum + child.totalCount, exactCount)\n      return {\n        children,\n        exactCount,\n        id: folderId,\n        name: folder?.name || '',\n        parentId: folder?.parentId ?? null,\n        path: buildFolderPath(folderId, byId),\n        totalCount,\n      }\n    }\n\n    return rootIds.map(buildNode)\n  },\n)\n\nexport const selectCurrentFolderSegments = createSelector(\n  [selectById, selectCurrentFolderId],\n  (byId, currentFolderId): FolderTreeItem[] => {\n    if (!currentFolderId) return []\n    const chain: string[] = []\n    let cursor: string | null = currentFolderId\n    const seen = new Set<string>()\n    while (cursor && !seen.has(cursor)) {\n      const folder: FolderDoc | undefined = byId[cursor]\n      if (!folder) break\n      seen.add(cursor)\n      chain.unshift(cursor)\n      cursor = folder.parentId\n    }\n    return chain.map((id, depth) => ({\n      depth,\n      exactCount: 0,\n      id,\n      name: byId[id]?.name || '',\n      parentId: byId[id]?.parentId ?? null,\n      path: buildFolderPath(id, byId),\n      totalCount: 0,\n    }))\n  },\n)\n\ntype FoldersIndex = {\n  byId: Record<string, FolderDoc>\n  childrenByParentId: Record<string, string[]>\n  rootIds: string[]\n  exactCountByFolderId: Record<string, number>\n}\n\nconst selectFoldersIndex = createSelector(\n  [selectById, selectChildrenByParentId, selectRootIds, selectExactCountByFolderId],\n  (byId, childrenByParentId, rootIds, exactCountByFolderId): FoldersIndex => ({\n    byId,\n    childrenByParentId,\n    rootIds,\n    exactCountByFolderId,\n  }),\n)\n\nexport const selectCurrentFolderChildren = createSelector(\n  [selectFoldersIndex, selectCurrentFolderId, selectCurrentFolderUnfiled],\n  (\n    {byId, childrenByParentId, rootIds, exactCountByFolderId},\n    currentFolderId,\n    currentFolderUnfiled,\n  ): FolderTreeItem[] => {\n    if (currentFolderUnfiled || !currentFolderId) return []\n    const ids = currentFolderId ? childrenByParentId[currentFolderId] || [] : rootIds\n    const depth = currentFolderId ? buildFolderPath(currentFolderId, byId).split('/').length : 0\n    return ids.map((id) => {\n      const folder = byId[id]\n      // Sum totalCount over the subtree.\n      const stack = [id]\n      let totalCount = 0\n      while (stack.length) {\n        const cur = stack.pop()!\n        totalCount += exactCountByFolderId[cur] || 0\n        const kids = childrenByParentId[cur]\n        if (kids) stack.push(...kids)\n      }\n      return {\n        depth,\n        exactCount: exactCountByFolderId[id] || 0,\n        id,\n        name: folder?.name || '',\n        parentId: folder?.parentId ?? null,\n        path: buildFolderPath(id, byId),\n        totalCount,\n      }\n    })\n  },\n)\n\nexport const selectCanDeleteFolder = createSelector(\n  [selectCurrentFolderId],\n  (currentFolderId) => !!currentFolderId,\n)\n\nexport const foldersActions = {...foldersSlice.actions}\n\nexport default foldersSlice.reducer\n","import {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\n\nimport type {AssetItem, Dialog, MyEpic, Tag} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {DIALOG_ACTIONS} from './actions'\n\ntype DialogReducerState = {\n  items: Dialog[]\n}\n\nconst initialState = {\n  items: [],\n} as DialogReducerState\n\nconst dialogSlice = createSlice({\n  name: 'dialog',\n  initialState,\n  extraReducers: (builder) => {\n    builder\n      .addCase(DIALOG_ACTIONS.showFolderCreate, (state, action) => {\n        const {parentFolderId} = action.payload\n        state.items.push({\n          parentFolderId,\n          id: 'folderCreate',\n          type: 'folderCreate',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showFolderMove, (state, action) => {\n        const {assets, folderId} = action.payload\n        state.items.push({\n          assets,\n          folderId,\n          id: 'folderMove',\n          type: 'folderMove',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showFolderRename, (state, action) => {\n        const {folderId} = action.payload\n        state.items.push({\n          folderId,\n          id: 'folderRename',\n          type: 'folderRename',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showTagCreate, (state) => {\n        state.items.push({\n          id: 'tagCreate',\n          type: 'tagCreate',\n        })\n      })\n      .addCase(DIALOG_ACTIONS.showTagEdit, (state, action) => {\n        const {tagId} = action.payload\n        state.items.push({\n          id: tagId,\n          tagId,\n          type: 'tagEdit',\n        })\n      })\n      .addCase(foldersActions.createComplete, (state) => {\n        state.items = state.items.filter((item) => item.id !== 'folderCreate')\n      })\n      .addCase(foldersActions.renameComplete, (state) => {\n        state.items = state.items.filter((item) => item.id !== 'folderRename')\n      })\n  },\n  reducers: {\n    // Clear all dialogs\n    clear(state) {\n      state.items = []\n    },\n    // Add newly created inline tag to assetEdit dialog\n    inlineTagCreate(state, action: PayloadAction<{assetId: string; tag: Tag}>) {\n      const {assetId, tag} = action.payload\n\n      state.items.forEach((item) => {\n        if (item.type === 'assetEdit' && item.assetId === assetId) {\n          item.lastCreatedTag = {\n            label: tag.name.current,\n            value: tag._id,\n          }\n        }\n      })\n    },\n    // Remove inline tags from assetEdit dialog\n    inlineTagRemove(state, action: PayloadAction<{tagIds: string[]}>) {\n      const {tagIds} = action.payload\n\n      state.items.forEach((item) => {\n        if (item.type === 'assetEdit') {\n          item.lastRemovedTagIds = tagIds\n        }\n      })\n    },\n    // Remove dialog by id\n    remove(state, action: PayloadAction<{id: string}>) {\n      const id = action.payload?.id\n      state.items = state.items.filter((item) => item.id !== id)\n    },\n    showConfirmAssetsTagAdd(\n      state,\n      action: PayloadAction<{\n        assetsPicked: AssetItem[]\n        closeDialogId?: string\n        tag: Tag\n      }>,\n    ) {\n      const {assetsPicked, closeDialogId, tag} = action.payload\n\n      const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: ASSETS_ACTIONS.tagsAddRequest({\n          assets: assetsPicked,\n          tag,\n        }),\n        confirmText: `Yes, add tag to ${suffix}`,\n        title: `Add tag ${tag.name.current} to ${suffix}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm tag addition',\n        tone: 'primary',\n        type: 'confirm',\n      })\n    },\n    showConfirmAssetsTagRemove(\n      state,\n      action: PayloadAction<{\n        assetsPicked: AssetItem[]\n        closeDialogId?: string\n        tag: Tag\n      }>,\n    ) {\n      const {assetsPicked, closeDialogId, tag} = action.payload\n\n      const suffix = `${assetsPicked.length} ${pluralize('asset', assetsPicked.length)}`\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: ASSETS_ACTIONS.tagsRemoveRequest({assets: assetsPicked, tag}),\n        confirmText: `Yes, remove tag from ${suffix}`,\n        headerTitle: 'Confirm tag removal',\n        id: 'confirm',\n        title: `Remove tag ${tag.name.current} from ${suffix}?`,\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showConfirmDeleteAssets(\n      state,\n      action: PayloadAction<{assets: AssetItem[]; closeDialogId?: string}>,\n    ) {\n      const {assets, closeDialogId} = action.payload\n\n      const suffix = `${assets.length} ${pluralize('asset', assets.length)}`\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: assetsActions.deleteRequest({\n          assets: assets.map((assetItem) => assetItem.asset),\n        }),\n        confirmText: `Yes, delete ${suffix}`,\n        description: 'This operation cannot be reversed. Are you sure you want to continue?',\n        title: `Permanently delete ${suffix}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm deletion',\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showConfirmDeleteFolder(\n      state,\n      action: PayloadAction<{closeDialogId?: string; folderId: string; folderName: string}>,\n    ) {\n      const {closeDialogId, folderId, folderName} = action.payload\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: foldersActions.deleteRequest({folderId}),\n        confirmText: `Yes, delete folder`,\n        description:\n          'This deletes only the selected folder. Assets in this folder will stay in the library and have their folder assignment removed. Nested folders will move up one level.',\n        title: `Delete ${folderName}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm folder deletion',\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showConfirmDeleteTag(state, action: PayloadAction<{closeDialogId?: string; tag: Tag}>) {\n      const {closeDialogId, tag} = action.payload\n\n      const suffix = 'tag'\n\n      state.items.push({\n        closeDialogId,\n        confirmCallbackAction: tagsActions.deleteRequest({tag}),\n        confirmText: `Yes, delete ${suffix}`,\n        description: 'This operation cannot be reversed. Are you sure you want to continue?',\n        title: `Permanently delete ${suffix}?`,\n        id: 'confirm',\n        headerTitle: 'Confirm deletion',\n        tone: 'critical',\n        type: 'confirm',\n      })\n    },\n    showAllAssetsDialog(state, action: PayloadAction<{assetId: string}>) {\n      if (state.items.some((item) => item.type === 'dialogAllAssets')) {\n        return\n      }\n      state.items.push({\n        assetId: action.payload.assetId,\n        id: 'dialogAllAssets',\n        type: 'dialogAllAssets',\n      })\n    },\n    showAssetEdit(state, action: PayloadAction<{assetId: string}>) {\n      const {assetId} = action.payload\n      state.items.push({\n        assetId,\n        id: assetId,\n        type: 'assetEdit',\n      })\n    },\n    showSearchFacets(state) {\n      state.items.push({\n        id: 'searchFacets',\n        type: 'searchFacets',\n      })\n    },\n    showFolders(state) {\n      state.items.push({\n        id: 'folders',\n        type: 'folders',\n      })\n    },\n    showTags(state) {\n      state.items.push({\n        id: 'tags',\n        type: 'tags',\n      })\n    },\n  },\n})\n\n// Epics\n\nexport const dialogClearOnAssetUpdateEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.deleteComplete.type,\n      assetsActions.folderSetComplete.type,\n      assetsActions.updateComplete.type,\n      tagsActions.deleteComplete.type,\n      tagsActions.updateComplete.type,\n    ),\n    filter(\n      (action: {\n        payload: {closeDialogId?: string}\n      }): action is PayloadAction<{closeDialogId?: string}> => !!action?.payload?.closeDialogId,\n    ),\n    mergeMap((action) => {\n      const dialogId = action?.payload?.closeDialogId\n      if (dialogId) {\n        return of(dialogSlice.actions.remove({id: dialogId}))\n      }\n      return EMPTY\n    }),\n  )\n\nexport const dialogTagCreateEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.createComplete.match),\n    mergeMap((action) => {\n      const {assetId, tag} = action?.payload || {}\n\n      if (assetId) {\n        return of(dialogSlice.actions.inlineTagCreate({tag, assetId}))\n      }\n\n      if (tag._id) {\n        return of(dialogSlice.actions.remove({id: 'tagCreate'}))\n      }\n\n      return EMPTY\n    }),\n  )\n\nexport const dialogTagDeleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.listenerDeleteQueueComplete.match),\n    mergeMap((action) => {\n      const {tagIds} = action?.payload || {}\n\n      return of(dialogSlice.actions.inlineTagRemove({tagIds}))\n    }),\n  )\n\nexport const dialogActions = {...dialogSlice.actions}\n\nexport default dialogSlice.reducer\n","import {createGlobalStyle, css} from 'styled-components'\n\nconst customScrollbar = css`\n  ::-webkit-scrollbar {\n    width: 14px;\n  }\n\n  ::-webkit-scrollbar-thumb {\n    border-radius: 10px;\n    border: 4px solid rgba(0, 0, 0, 0);\n    background: var(--card-border-color);\n    background-clip: padding-box;\n\n    &:hover {\n      background: var(--card-muted-fg-color);\n      background-clip: padding-box;\n    }\n  }\n`\n\nconst GlobalStyle = createGlobalStyle`\n  .media__custom-scrollbar {\n    ${customScrollbar}\n  }\n\n  // @sanity/ui overrides\n\n  // Custom scrollbar on Box (used in Dialogs)\n  div[data-ui=\"Box\"] {\n    ${customScrollbar}\n  }\n\n  // Dialog background color\n  div[data-ui=\"Dialog\"] {\n    background-color: rgba(15, 17, 18, 0.9);\n  }\n\n`\n\nexport default GlobalStyle\n","import {type PropsWithChildren, createContext, useContext, useMemo} from 'react'\nimport type {DropzoneOptions} from 'react-dropzone'\n\nimport type {MediaToolOptions, Locale} from '../types'\n\ntype ContextProps = {\n  dropzone: Pick<DropzoneOptions, 'maxSize'>\n  components: MediaToolOptions['components']\n  createTagsOnUpload: boolean\n  creditLine: MediaToolOptions['creditLine']\n  directUploads: MediaToolOptions['directUploads']\n  excludeTagSlugs: string[]\n  locales?: Locale[]\n}\n\nconst ToolOptionsContext = createContext<ContextProps | null>(null)\n\ntype Props = {\n  options?: MediaToolOptions | void\n}\n\nexport const ToolOptionsProvider = ({options, children}: PropsWithChildren<Props>) => {\n  const value = useMemo<ContextProps>(() => {\n    let creditLineExcludeSources\n\n    if (options?.creditLine?.excludeSources) {\n      creditLineExcludeSources = Array.isArray(options?.creditLine?.excludeSources)\n        ? options.creditLine.excludeSources\n        : [options?.creditLine?.excludeSources]\n    }\n\n    return {\n      dropzone: {maxSize: options?.maximumUploadSize},\n      components: {\n        details: options?.components?.details,\n      },\n      createTagsOnUpload: options?.createTagsOnUpload ?? true,\n      creditLine: {\n        enabled: options?.creditLine?.enabled || false,\n        excludeSources: creditLineExcludeSources,\n      },\n      directUploads: options?.directUploads ?? true,\n      excludeTagSlugs: options?.excludeTags?.length ? [...options.excludeTags] : [],\n      locales: options?.locales,\n    }\n    // oxlint-disable-next-line react/preserve-manual-memoization\n  }, [\n    options?.creditLine?.enabled,\n    options?.components,\n    options?.createTagsOnUpload,\n    options?.creditLine?.excludeSources,\n    options?.excludeTags,\n    options?.maximumUploadSize,\n    options?.directUploads,\n    options?.locales,\n  ])\n\n  return <ToolOptionsContext.Provider value={value}>{children}</ToolOptionsContext.Provider>\n}\n\nexport const useToolOptions = () => {\n  const context = useContext(ToolOptionsContext)\n\n  if (!context) {\n    throw new Error('useToolOptions must be used within an ToolOptionsProvider')\n  }\n\n  return context\n}\n","import * as z from 'zod'\n\n// Helper to generate localized string schema\nfunction localizedStringSchema(locales?: {id: string}[]) {\n  if (!locales || locales.length === 0) {\n    return z.string().trim().optional()\n  }\n  const shape: Record<string, z.ZodTypeAny> = {}\n  for (const locale of locales) {\n    shape[locale.id] = z.string().trim().optional()\n  }\n  return z.object(shape).passthrough()\n}\n\nexport const tagOptionSchema = z.object({\n  label: z.string().trim().min(1, {message: 'Label cannot be empty'}),\n  value: z.string().trim().min(1, {message: 'Value cannot be empty'}),\n})\n\nexport function getAssetFormSchema(locales?: {id: string}[]) {\n  return z.object({\n    altText: localizedStringSchema(locales),\n    creditLine: localizedStringSchema(locales),\n    description: localizedStringSchema(locales),\n    opt: z.object({\n      media: z.object({\n        tags: z.array(tagOptionSchema).nullable(),\n      }),\n    }),\n    originalFilename: z.string().trim().min(1, {message: 'Filename cannot be empty'}),\n    title: localizedStringSchema(locales),\n  })\n}\n\nexport const assetFormSchema = getAssetFormSchema()\n\nexport const tagFormSchema = z.object({\n  name: z.string().min(1, {message: 'Name cannot be empty'}),\n})\n\nexport const folderFormSchema = z.object({\n  name: z.string().trim().min(1, {message: 'Name cannot be empty'}),\n})\n","import type {SanityDocument} from '@sanity/client'\n\nexport function getUniqueDocuments(documents: SanityDocument[]): SanityDocument[] {\n  const draftIds = documents.reduce(\n    (acc: string[], doc: SanityDocument) =>\n      doc._id.startsWith('drafts.') ? acc.concat(doc._id.slice(7)) : acc,\n    [],\n  )\n\n  const filteredDocuments: SanityDocument[] = documents.filter(\n    (doc: SanityDocument) => !draftIds.includes(doc._id),\n  )\n\n  return filteredDocuments\n}\n","import type {ImageAsset} from '../types'\n\nconst imageDprUrl = (\n  asset: ImageAsset,\n  options: {\n    width: number\n    height?: number\n  },\n): string => {\n  const dpi =\n    typeof window === 'undefined' || !window.devicePixelRatio\n      ? 1\n      : Math.round(window.devicePixelRatio)\n  const imgH = options?.height ? options?.height * Math.max(1, dpi) : undefined\n  const imgW = options.width * Math.max(1, dpi)\n\n  const urlParams = new URLSearchParams()\n  urlParams.append('fit', 'max')\n  urlParams.append('w', imgW.toString())\n  if (imgH) {\n    urlParams.append('h', imgH.toString())\n  }\n\n  return `${asset.url}?${urlParams.toString()}`\n}\n\nexport default imageDprUrl\n","// Recursively sanitize form data:\n// - convert empty strings, undefined values and empty arrays to null (to correctly unset / delete fields)\n// - trim whitespace on string fleids\n\ntype FormData = Record<string, any>\n\nconst sanitizeFormData = (formData: FormData): FormData => {\n  return Object.keys(formData).reduce((acc: FormData, key) => {\n    const val = formData[key]\n\n    // TODO: refactor\n    if (typeof val === 'object' && val !== null && val.constructor !== Array) {\n      acc[key] = sanitizeFormData(val)\n    } else if (val === '' || typeof val === 'undefined' || val?.length === 0) {\n      acc[key] = null\n    } else if (typeof val === 'string' && val) {\n      acc[key] = formData[key].trim()\n    } else {\n      acc[key] = formData[key]\n    }\n\n    return acc\n  }, {})\n}\n\nexport default sanitizeFormData\n","import type {Asset, FileAsset, ImageAsset} from '../types'\n\nexport const isFileAsset = (asset: Asset): asset is FileAsset => {\n  return (asset as FileAsset)._type === 'sanity.fileAsset'\n}\n\nexport const isImageAsset = (asset: Asset): asset is ImageAsset => {\n  return (asset as ImageAsset)._type === 'sanity.imageAsset'\n}\n","import {zodResolver} from '@hookform/resolvers/zod'\nimport type {FieldValues, Resolver} from 'react-hook-form'\n\n/**\n * `@hookform/resolvers/zod` resolves its own `zod` typings through dependency\n * hoisting, which in this monorepo lands on zod v4, while this plugin authors its\n * form schemas with zod v3. The resolver accepts v3 schema instances correctly at\n * runtime, so this thin wrapper only bridges the type-only v3/v4 mismatch. The\n * react-hook-form field types stay fully checked at the call sites.\n */\nexport default function zodFormResolver<TFieldValues extends FieldValues>(\n  schema: unknown,\n): Resolver<TFieldValues> {\n  return zodResolver(\n    schema as Parameters<typeof zodResolver>[0],\n  ) as unknown as Resolver<TFieldValues>\n}\n","import type {ImageAsset} from '../types'\n\nconst getAssetResolution = (asset: ImageAsset) => {\n  return `${asset.metadata.dimensions.width}x${asset.metadata.dimensions.height}px`\n}\n\nexport default getAssetResolution\n","import {usePortal} from '@sanity/ui'\nimport {type PopoverProps} from '@sanity/ui/popover'\n\nexport function usePortalPopoverProps(): PopoverProps {\n  const portal = usePortal()\n\n  return {\n    animate: true,\n    constrainSize: true,\n    floatingBoundary: portal.element,\n    portal: true,\n    referenceBoundary: portal.element,\n  }\n}\n","import {ClipboardIcon} from '@sanity/icons/Clipboard'\nimport {Button, Text} from '@sanity/ui'\nimport {Popover} from '@sanity/ui/popover'\nimport copy from 'copy-to-clipboard'\nimport {useEffect, useRef, useState} from 'react'\n\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\n\ntype Props = {\n  disabled?: boolean\n  url: string\n}\n\nconst ButtonAssetCopy = ({disabled, url}: Props) => {\n  const popoverProps = usePortalPopoverProps()\n  const refPopoverTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n  const [popoverVisible, setPopoverVisible] = useState(false)\n\n  const handleClick = () => {\n    if (refPopoverTimeout.current) {\n      clearTimeout(refPopoverTimeout.current)\n    }\n\n    setPopoverVisible(true)\n    copy(url)\n\n    refPopoverTimeout.current = setTimeout(() => {\n      setPopoverVisible(false)\n    }, 1250)\n  }\n\n  // Effects\n  useEffect(() => {\n    return () => {\n      if (refPopoverTimeout.current) {\n        clearTimeout(refPopoverTimeout.current)\n      }\n    }\n  }, [])\n\n  return (\n    <Popover\n      content={\n        <Text muted size={1}>\n          Copied!\n        </Text>\n      }\n      open={popoverVisible}\n      padding={2}\n      placement=\"top\"\n      radius={1}\n      {...popoverProps}\n    >\n      <Button\n        disabled={disabled}\n        fontSize={1}\n        icon={ClipboardIcon}\n        mode=\"ghost\"\n        onClick={handleClick}\n        text=\"Copy URL\"\n      />\n    </Popover>\n  )\n}\n\nexport default ButtonAssetCopy\n","import {DownloadIcon} from '@sanity/icons/Download'\nimport {Box, Button, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport {format} from 'date-fns/format'\nimport filesize from 'filesize'\nimport {type ReactNode} from 'react'\n\nimport type {Asset, AssetItem} from '../../types'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport ButtonAssetCopy from '../ButtonAssetCopy'\n\ntype Props = {\n  asset: Asset\n  item?: AssetItem\n}\n\nconst Row = ({label, value}: {label: string; value: ReactNode}) => {\n  return (\n    <Flex justify=\"space-between\">\n      <Text\n        size={1}\n        style={{\n          opacity: 0.8,\n          width: '40%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {label}\n      </Text>\n      <Text\n        size={1}\n        style={{\n          opacity: 0.4,\n          textAlign: 'right',\n          width: '60%',\n        }}\n        textOverflow=\"ellipsis\"\n      >\n        {value}\n      </Text>\n    </Flex>\n  )\n}\n\nconst AssetMetadata = (props: Props) => {\n  const {asset, item} = props\n\n  const exif = asset?.metadata?.exif\n\n  // Callbacks\n  const handleDownload = () => {\n    window.location.href = `${asset.url}?dl=${asset.originalFilename}`\n  }\n\n  return (\n    <Box marginTop={3}>\n      {/* Base */}\n      <Box>\n        <Stack gap={3}>\n          <Row label=\"Size\" value={filesize(asset?.size, {base: 10, round: 0})} />\n          <Row label=\"MIME type\" value={asset?.mimeType} />\n          <Row label=\"Extension\" value={asset?.extension?.toUpperCase()} />\n          {isImageAsset(asset) && <Row label=\"Dimensions\" value={getAssetResolution(asset)} />}\n        </Stack>\n      </Box>\n      {/* EXIF */}\n      {exif &&\n        (exif.DateTimeOriginal ||\n          exif.FNumber ||\n          exif.FocalLength ||\n          exif.ExposureTime ||\n          exif.ISO) && (\n          <>\n            {/* Divider */}\n            <Box\n              marginY={4}\n              style={{\n                background: 'var(--card-border-color)',\n                height: '1px',\n                width: '100%',\n              }}\n            />\n            <Box>\n              <Stack gap={3}>\n                {exif.ISO && <Row label=\"ISO\" value={exif.ISO} />}\n                {exif.FNumber && <Row label=\"Aperture\" value={`ƒ/${exif.FNumber}`} />}\n                {exif.FocalLength && <Row label=\"Focal length\" value={`${exif.FocalLength}mm`} />}\n                {exif.ExposureTime && (\n                  <Row label=\"Exposure time\" value={`1/${1 / exif.ExposureTime}`} />\n                )}\n                {exif.DateTimeOriginal && (\n                  <Row\n                    label=\"Original date\"\n                    value={format(new Date(exif.DateTimeOriginal), 'PPp')}\n                  />\n                )}\n              </Stack>\n            </Box>\n          </>\n        )}\n\n      {/* Asset actions */}\n      <Box marginTop={5}>\n        <Inline gap={2}>\n          {/* Download */}\n          <Button\n            disabled={!item || item?.updating}\n            fontSize={1}\n            icon={DownloadIcon}\n            mode=\"ghost\"\n            onClick={handleDownload}\n            text=\"Download\"\n          />\n          {/* Copy to clipboard */}\n          <ButtonAssetCopy disabled={!item || item?.updating} url={asset.url} />\n        </Inline>\n      </Box>\n    </Box>\n  )\n}\n\nexport default AssetMetadata\n","import {Dialog as SanityDialog} from '@sanity/ui'\nimport {type ComponentProps} from 'react'\n\nconst Dialog = (props: ComponentProps<typeof SanityDialog>) => {\n  // HACK: Temporarily force fixed positioning on all @sanity/ui <Dialog /> components.\n  // The studio is currently setting absolute positioning on all root-level dialogs on the mobile breakpoint,\n  // causing unwanted scroll behaviour.\n  return <SanityDialog {...props} style={{position: 'fixed'}} />\n}\n\nexport default Dialog\n","import type {SanityDocument} from '@sanity/client'\nimport {Box, Button, Card, Stack, Text} from '@sanity/ui'\nimport {Preview, type SchemaType, useSchema} from 'sanity'\nimport {useIntentLink} from 'sanity/router'\n\ntype Props = {\n  documents: SanityDocument[]\n  isLoading: boolean\n}\n\nconst DocumentList = ({documents, isLoading}: Props) => {\n  const schema = useSchema()\n\n  if (isLoading) {\n    return (\n      <Text muted size={1}>\n        Loading...\n      </Text>\n    )\n  }\n\n  if (documents.length === 0) {\n    return (\n      <Text muted size={1}>\n        No documents are referencing this asset\n      </Text>\n    )\n  }\n\n  return (\n    <Card flex={1} marginBottom={2} padding={2} radius={2} shadow={1}>\n      <Stack gap={2}>\n        {documents?.map((doc) => (\n          <ReferringDocument doc={doc} key={doc._id} schemaType={schema.get(doc._type)} />\n        ))}\n      </Stack>\n    </Card>\n  )\n}\n\nconst ReferringDocument = (props: {doc: SanityDocument; schemaType?: SchemaType}) => {\n  const {doc, schemaType} = props\n\n  const {onClick} = useIntentLink({\n    intent: 'edit',\n    params: {id: doc._id},\n  })\n\n  return schemaType ? (\n    <Button key={doc._id} mode=\"bleed\" onClick={onClick} padding={2} style={{width: '100%'}}>\n      <Preview layout=\"default\" schemaType={schemaType} value={doc} />\n    </Button>\n  ) : (\n    <Box padding={2}>\n      <Text size={1}>\n        A document of the unknown type <em>{doc._type}</em>\n      </Text>\n    </Box>\n  )\n}\n\nexport default DocumentList\n","import {Box, Flex, type Theme} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {defaultStyles, FileIcon as ReactFileIcon} from 'react-file-icon'\nimport type {DefaultExtensionType} from 'react-file-icon'\nimport {styled, css} from 'styled-components'\n\ntype Props = {\n  extension?: string\n  onClick?: (e: MouseEvent) => void\n  width: string\n}\n\n// Force react-file-icon styles\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled(Box)(({theme}: {theme: Theme}) => {\n  return css`\n    text {\n      font-family: ${\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.fonts.text.family\n      } !important;\n      font-size: 8px !important;\n      font-weight: 500 !important;\n    }\n  `\n})\n\nconst FileIcon = (props: Props) => {\n  const {extension, onClick, width} = props\n\n  return (\n    <Flex align=\"center\" justify=\"center\" onClick={onClick} style={{height: '100%'}}>\n      <Container style={{width}}>\n        {extension ? (\n          <ReactFileIcon\n            extension={extension}\n            {...defaultStyles[extension as DefaultExtensionType]}\n          />\n        ) : (\n          <ReactFileIcon />\n        )}\n      </Container>\n    </Flex>\n  )\n}\n\nexport default FileIcon\n","import {Flex} from '@sanity/ui'\n\nimport type {Asset} from '../../types'\nimport FileIcon from '../FileIcon'\n\ntype Props = {\n  asset: Asset\n}\n\nconst FileAssetPreview = (props: Props) => {\n  const {asset} = props\n\n  if (asset.mimeType.search('audio') === 0) {\n    return (\n      <Flex align=\"center\" justify=\"center\" style={{height: '100%'}}>\n        <audio controls src={asset.url} style={{width: '100%'}} />\n      </Flex>\n    )\n  }\n\n  if (asset.mimeType.search('video') === 0) {\n    return (\n      <video\n        controls\n        src={asset.url}\n        style={{\n          height: '100%',\n          width: '100%',\n        }}\n      />\n    )\n  }\n\n  return <FileIcon extension={asset.extension} width=\"50%\" />\n}\n\nexport default FileAssetPreview\n","import {Box, Button, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {format} from 'date-fns/format'\nimport {type ReactNode} from 'react'\n\ntype Props = {\n  disabled: boolean\n  isValid: boolean\n  lastUpdated?: string\n  onClick: () => void\n}\n\nconst FormSubmitButton = (props: Props) => {\n  const {disabled, isValid, lastUpdated, onClick} = props\n\n  let content: ReactNode\n  if (isValid) {\n    if (lastUpdated) {\n      content = (\n        <>\n          Last updated\n          <br /> {format(new Date(lastUpdated), 'PPp')}\n        </>\n      )\n    } else {\n      content = 'No unpublished changes'\n    }\n  } else {\n    content =\n      'There are validation errors that need to be fixed before this document can be published'\n  }\n\n  return (\n    <Tooltip\n      animate\n      content={\n        <Box padding={3} style={{maxWidth: '185px'}}>\n          <Text muted size={1}>\n            {content}\n          </Text>\n        </Box>\n      }\n      disabled={'ontouchstart' in window}\n      placement=\"top\"\n      portal\n    >\n      <Box>\n        <Button\n          disabled={disabled}\n          fontSize={1}\n          onClick={onClick}\n          text=\"Save and close\"\n          tone=\"primary\"\n        />\n      </Box>\n    </Tooltip>\n  )\n}\n\nexport default FormSubmitButton\n","import {hues} from '@sanity/color'\nimport {type ThemeColorSchemeKey, studioTheme} from '@sanity/ui'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {color: themeColor} = studioTheme\n\nconst SCHEME_COLORS = {\n  bg: {\n    dark: hues.gray[950].hex,\n    light: hues.gray[50].hex,\n  },\n  bg2: {\n    dark: hues.gray[900].hex,\n    light: hues.gray[100].hex,\n  },\n  inputEnabledBorder: {\n    dark: themeColor.dark.default.input.default.enabled.border,\n    light: themeColor.light.default.input.default.enabled.border,\n  },\n  inputHoveredBorder: {\n    dark: themeColor.dark.default.input.default.hovered.border,\n    light: themeColor.light.default.input.default.hovered.border,\n  },\n  mutedHoveredBg: {\n    dark: themeColor.dark.primary.muted.primary.hovered.bg,\n    light: themeColor.light.primary.muted.primary.hovered.bg,\n  },\n  mutedHoveredFg: {\n    dark: themeColor.dark.primary.muted.primary.hovered.fg,\n    light: themeColor.light.primary.muted.primary.hovered.fg,\n  },\n  mutedSelectedBg: {\n    dark: themeColor.dark.primary.muted.primary.selected.bg,\n    light: themeColor.light.primary.muted.primary.selected.bg,\n  },\n  spotBlue: {\n    dark: themeColor.dark.primary.spot.blue,\n    light: themeColor.light.primary.spot.blue,\n  },\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n  return SCHEME_COLORS[colorKey]?.[scheme]\n}\n","import type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport type {MouseEvent} from 'react'\nimport {styled, css} from 'styled-components'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  onClick?: (e: MouseEvent) => void\n  $showCheckerboard?: boolean\n  $scheme?: ThemeColorSchemeKey\n  src: string\n  style?: any\n}\n\nconst Image = styled.img.attrs({crossOrigin: 'anonymous' as const})<Props>`\n  --checkerboard-color: ${(props) =>\n    props.$scheme ? getSchemeColor(props.$scheme, 'bg2') : 'inherit'};\n\n  display: block;\n  width: 100%;\n  height: 100%;\n  object-fit: contain;\n\n  ${(props) =>\n    props.$showCheckerboard &&\n    css`\n      background-image:\n        linear-gradient(45deg, var(--checkerboard-color) 25%, transparent 25%),\n        linear-gradient(-45deg, var(--checkerboard-color) 25%, transparent 25%),\n        linear-gradient(45deg, transparent 75%, var(--checkerboard-color) 75%),\n        linear-gradient(-45deg, transparent 75%, var(--checkerboard-color) 75%);\n      background-size: 20px 20px;\n      background-position:\n        0 0,\n        0 10px,\n        10px -10px,\n        -10px 0;\n    `}\n`\n\nexport default Image\n","import {ErrorOutlineIcon} from '@sanity/icons/ErrorOutline'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {styled} from 'styled-components'\n\ntype Props = {\n  description?: string\n  error?: string\n  label: string\n  name: string\n}\n\nconst StyledErrorOutlineIcon = styled(ErrorOutlineIcon)(({theme}) => {\n  return {\n    // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n    color: theme.sanity.color.spot.red,\n  }\n})\n\nconst FormFieldInputLabel = (props: Props) => {\n  const {description, error, label, name} = props\n\n  return (\n    <>\n      {/* Label */}\n      <Box marginY={3}>\n        <Inline gap={2}>\n          <Text as=\"label\" htmlFor={name} size={1} weight=\"semibold\">\n            {label}\n          </Text>\n\n          {/* Error icon + tooltip */}\n          {error && (\n            <Text size={1}>\n              <Tooltip\n                animate\n                content={\n                  <Box padding={2}>\n                    <Text muted size={1}>\n                      <StyledErrorOutlineIcon style={{marginRight: '0.1em'}} />\n                      {error}\n                    </Text>\n                  </Box>\n                }\n                fallbackPlacements={['top', 'left']}\n                placement=\"right\"\n                portal\n              >\n                <StyledErrorOutlineIcon />\n              </Tooltip>\n            </Text>\n          )}\n        </Inline>\n      </Box>\n\n      {/* Description */}\n      {description && (\n        <Box marginY={3}>\n          <Text as=\"label\" htmlFor={name} muted size={1}>\n            {description}\n          </Text>\n        </Box>\n      )}\n    </>\n  )\n}\n\nexport default FormFieldInputLabel\n","import {AddIcon} from '@sanity/icons/Add'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, Flex, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {radius: themeRadius, space: themeSpace} = studioTheme\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n  return {\n    control: (styles, {isFocused}) => {\n      let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n      if (isFocused) {\n        boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n        0 0 0 1px var(--card-bg-color),\n        0 0 0 3px var(--card-focus-ring-color) !important`\n      }\n\n      return {\n        ...styles,\n        'backgroundColor': 'var(--card-bg-color)',\n        'color': 'inherit',\n        'border': 'none',\n        'borderRadius': themeRadius[1],\n        boxShadow,\n        'margin': 0,\n        'minHeight': '35px',\n        'outline': 'none',\n        'padding': rem(themeSpace[1]!),\n        'transition': 'none',\n        '&:hover': {\n          boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n        },\n      }\n    },\n    indicatorsContainer: (styles, {isDisabled}) => ({\n      ...styles,\n      opacity: isDisabled ? 0.25 : 1,\n    }),\n    input: (styles) => ({\n      ...styles,\n      color: 'var(--card-fg-color)',\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    menuList: (styles) => ({\n      ...styles,\n    }),\n    multiValue: (styles, {isDisabled}) => ({\n      ...styles,\n      backgroundColor: getSchemeColor(scheme, 'mutedHoveredBg'),\n      borderRadius: themeRadius[2],\n      opacity: isDisabled ? 0.5 : 1,\n    }),\n    multiValueLabel: () => ({\n      color: getSchemeColor(scheme, 'mutedHoveredFg'),\n      fontSize: 'inherit',\n      padding: 0,\n    }),\n    multiValueRemove: (styles) => ({\n      ...styles,\n      'borderTopLeftRadius': 0,\n      'borderBottomLeftRadius': 0,\n      'svg': {color: getSchemeColor(scheme, 'mutedHoveredFg')},\n      '&:hover': {\n        backgroundColor: getSchemeColor(scheme, 'mutedSelectedBg'),\n      },\n    }),\n    noOptionsMessage: (styles) => ({\n      ...styles,\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      lineHeight: '1em',\n    }),\n    option: (styles, {isFocused}) => ({\n      ...styles,\n      'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n      'borderRadius': themeRadius[2],\n      'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n      'padding': `${rem(themeSpace[1]!)} ${rem(themeSpace[2]!)}`,\n      '&:hover': {\n        backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n        color: getSchemeColor(scheme, 'bg'),\n      },\n    }),\n    placeholder: (styles) => ({\n      ...styles,\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    valueContainer: (styles) => ({\n      ...styles,\n      margin: 0,\n      padding: 0,\n    }),\n  }\n}\n\nconst DropdownIndicator = (props: any) => {\n  return (\n    <components.DropdownIndicator {...props}>\n      <Box paddingX={2}>\n        <Text size={1}>\n          <ChevronDownIcon />\n        </Text>\n      </Box>\n    </components.DropdownIndicator>\n  )\n}\n\nconst Menu = (props: any) => {\n  return (\n    <components.Menu {...props}>\n      <Card radius={1} shadow={2}>\n        {props.children}\n      </Card>\n    </components.Menu>\n  )\n}\n\nconst MenuList = (props: any) => {\n  const {children} = props\n\n  const MAX_ROWS = 5\n  const OPTION_HEIGHT = 37\n\n  if (Array.isArray(children)) {\n    const height =\n      children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n    return (\n      <Virtuoso\n        className=\"media__custom-scrollbar\"\n        itemContent={(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }}\n        style={{height}}\n        totalCount={children.length}\n      />\n    )\n  }\n  return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst MultiValueLabel = (props: any) => {\n  return (\n    <Box padding={2} paddingRight={1}>\n      <Text size={1} weight=\"medium\">\n        <components.MultiValueLabel {...props} />\n      </Text>\n    </Box>\n  )\n}\n\nconst MultiValueRemove = (props: any) => {\n  return (\n    <components.MultiValueRemove {...props}>\n      <CloseIcon color=\"#1f2123\" />\n    </components.MultiValueRemove>\n  )\n}\n\nconst Option = (props: any) => {\n  return (\n    <Box paddingX={1} paddingY={1}>\n      <components.Option {...props}>\n        <Flex align=\"center\">\n          {props.data.__isNew__ && <AddIcon style={{marginRight: '3px'}} />}\n          {props.children}\n        </Flex>\n      </components.Option>\n    </Box>\n  )\n}\n\nexport const reactSelectComponents = {\n  DropdownIndicator,\n  IndicatorSeparator: null,\n  Menu,\n  MenuList,\n  MultiValueLabel,\n  MultiValueRemove,\n  Option,\n}\n","import {Box} from '@sanity/ui'\nimport {Controller} from 'react-hook-form'\nimport CreatableSelect from 'react-select/creatable'\nimport {useColorSchemeValue} from 'sanity'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/creatable'\nimport type {TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n  control: any\n  description?: string\n  disabled?: boolean\n  error?: string\n  label: string\n  name: string\n  onCreateTag: (tagName: string) => void\n  options: {\n    label: string\n    value: string\n  }[]\n  placeholder?: string\n  value?: TagSelectOption[] | null\n}\n\nconst FormFieldInputTags = (props: Props) => {\n  const {\n    control,\n    description,\n    disabled,\n    error,\n    label,\n    name,\n    onCreateTag,\n    options,\n    placeholder,\n    value,\n  } = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const creating = useTypedSelector((state) => state.tags.creating)\n  const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n  return (\n    <Box\n      // HACK: force stacking context to ensure react-select dropdown sits above other fields\n      style={{zIndex: 2}}\n    >\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n      {/* Select */}\n      <Controller\n        control={control}\n        defaultValue={value}\n        name={name}\n        render={({field}) => {\n          const {onBlur, onChange, value: controllerValue} = field\n          // TODO: investigate overriding `onChange` and updating form state manually.\n          // `opt.media.tags` is initialised with `null` as a defaultValue in react-hook-form\n          // Ideally, we'd be able to set `opt.media.tags` as null when all items are cleared, rather than\n          // setting it to an empty array (which is currently causing false positives in denoting whether the form is dirty)\n          //\n          // To illustrate this issue:\n          // - Edit an asset with no tags\n          // - Add a new tag (either an existing one, or create one inline)\n          // - Remove the tag you've just created\n          //\n          // At this point, the form will still be marked as dirty when it shouldnt be\n          return (\n            <CreatableSelect\n              components={reactSelectComponents}\n              instanceId=\"tags\"\n              isClearable={false} // TODO: re-enable when we're able to correctly (manually) re-validate on clear\n              isDisabled={creating || disabled || tagsFetching}\n              isLoading={creating}\n              isMulti\n              name={name}\n              noOptionsMessage={() => 'No tags'}\n              onBlur={onBlur}\n              onChange={onChange}\n              onCreateOption={onCreateTag}\n              options={options}\n              placeholder={tagsFetching ? 'Loading...' : placeholder}\n              styles={reactSelectStyles(scheme)}\n              value={controllerValue}\n            />\n          )\n        }}\n      />\n    </Box>\n  )\n}\n\nexport default FormFieldInputTags\n","import {Box, TextInput} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n  description?: string\n  disabled?: boolean\n  error?: string\n  label: string\n  name: string\n  onBlur?: FocusEventHandler<HTMLInputElement>\n  onChange?: ChangeEventHandler<HTMLInputElement>\n  placeholder?: string\n  value?: string\n  ref?: Ref<HTMLInputElement>\n}\n\nconst FormFieldInputText = (props: Props) => {\n  const {\n    description,\n    disabled,\n    error,\n    label,\n    name,\n    onBlur,\n    onChange,\n    placeholder,\n    value,\n    ref,\n    ...rest\n  } = props\n\n  return (\n    <Box>\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n      {/* Input */}\n      <TextInput\n        {...rest}\n        autoComplete=\"off\"\n        autoFocus\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n      />\n    </Box>\n  )\n}\n\nexport default FormFieldInputText\n","import {Box, TextArea} from '@sanity/ui'\nimport {type ChangeEventHandler, type FocusEventHandler, type Ref} from 'react'\n\nimport FormFieldInputLabel from '../FormFieldInputLabel'\n\ntype Props = {\n  description?: string\n  disabled?: boolean\n  error?: string\n  label: string\n  name: string\n  onBlur?: FocusEventHandler<HTMLTextAreaElement>\n  onChange?: ChangeEventHandler<HTMLTextAreaElement>\n  placeholder?: string\n  rows?: number\n  value?: string\n  ref?: Ref<HTMLTextAreaElement>\n}\n\nconst FormFieldInputTextarea = (props: Props) => {\n  const {\n    description,\n    disabled,\n    error,\n    label,\n    name,\n    onBlur,\n    onChange,\n    placeholder,\n    rows,\n    value,\n    ref,\n    ...rest\n  } = props\n\n  return (\n    <Box>\n      {/* Label */}\n      <FormFieldInputLabel description={description} error={error} label={label} name={name} />\n\n      {/* Input */}\n      <TextArea\n        {...rest}\n        autoComplete=\"off\"\n        defaultValue={value}\n        disabled={disabled}\n        id={name}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        placeholder={placeholder}\n        ref={ref}\n        rows={rows}\n      />\n    </Box>\n  )\n}\n\nexport default FormFieldInputTextarea\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type Control, type FieldErrors, type UseFormRegister} from 'react-hook-form'\n\nimport type {Asset, AssetFormData, Locale, TagSelectOption} from '../../types'\nimport FormFieldInputLabel from '../FormFieldInputLabel'\nimport FormFieldInputTags from '../FormFieldInputTags'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormFieldInputTextarea from '../FormFieldInputTextarea'\n\ntype LocalizedErrors = Record<string, {message?: string} | undefined>\n\n// When locales are not configured, extract a plain string from a potentially localized field\nfunction toStringField(value: unknown): string | undefined {\n  if (typeof value === 'string') return value\n  if (typeof value === 'object' && value !== null) {\n    const found = Object.values(value as Record<string, string>).find((v) => v)\n    return found || undefined\n  }\n  return undefined\n}\n\nfunction truncateFolderPath(path?: string): string | undefined {\n  const segments = path?.split('/').filter(Boolean)\n  if (!segments || segments.length <= 3) return path\n  return [segments[0], '...', ...segments.slice(-2)].join('/')\n}\n\nexport type DetailsProps = {\n  formUpdating: boolean\n  handleCreateTag: (title: string) => void\n  control: Control<AssetFormData>\n  errors: FieldErrors<AssetFormData>\n  register: UseFormRegister<AssetFormData>\n  allTagOptions: TagSelectOption[]\n  assetTagOptions: TagSelectOption[] | null\n  currentAsset: Asset\n  folderPath?: string\n  folderMissing?: boolean\n  onChangeFolder: () => void\n  onRemoveFolder: () => void\n  creditLine?: {\n    enabled: boolean\n    excludeSources?: string | string[] | undefined\n  }\n  locales?: Locale[]\n}\n\nexport default function Details({\n  formUpdating,\n  handleCreateTag,\n  control,\n  errors,\n  register,\n  allTagOptions,\n  assetTagOptions,\n  currentAsset,\n  folderPath,\n  folderMissing,\n  onChangeFolder,\n  onRemoveFolder,\n  creditLine,\n  locales,\n}: DetailsProps) {\n  'use no memo'\n  // React Compiler memoizes the register() field JSX using asset-derived deps only.\n  // That can leave Save stuck disabled while the DOM still updates (uncontrolled inputs).\n  // Tags work because they use Controller; string fields use register and need this opt-out.\n\n  const hasLocales = locales && locales.length > 0\n  const [activeLocaleTab, setActiveLocaleTab] = useState(0)\n  const folderId = currentAsset?.opt?.media?.folder?._ref\n  const folderLabel =\n    truncateFolderPath(folderPath) || (folderMissing ? 'Folder no longer exists' : 'No folder')\n\n  return (\n    <Stack gap={3}>\n      {/* Tags */}\n      <FormFieldInputTags\n        control={control}\n        disabled={formUpdating}\n        error={errors?.opt?.media?.tags?.message}\n        label=\"Tags\"\n        name=\"opt.media.tags\"\n        onCreateTag={handleCreateTag}\n        options={allTagOptions}\n        placeholder=\"Select or create...\"\n        value={assetTagOptions}\n      />\n      {/* Folder */}\n      <Box>\n        <FormFieldInputLabel label=\"Folder\" name=\"folder\" />\n        <Card border padding={2} radius={2}>\n          <Flex align=\"center\" gap={3} justify=\"space-between\">\n            <Flex\n              align=\"center\"\n              gap={2}\n              flex={1}\n              style={{minWidth: 0, overflowX: 'auto', whiteSpace: 'nowrap', overflowY: 'hidden'}}\n            >\n              <FolderIcon />\n              <Text muted={!folderId} size={1}>\n                {folderLabel}\n              </Text>\n            </Flex>\n            {folderId && (\n              <Button\n                aria-label=\"Remove from folder\"\n                disabled={formUpdating}\n                fontSize={1}\n                icon={TrashIcon}\n                mode=\"bleed\"\n                onClick={onRemoveFolder}\n                padding={2}\n                tone=\"critical\"\n                type=\"button\"\n              />\n            )}\n            <Button\n              padding={2}\n              disabled={formUpdating}\n              fontSize={1}\n              mode=\"ghost\"\n              onClick={onChangeFolder}\n              text={folderId ? 'Change folder' : 'Add to folder'}\n              type=\"button\"\n            />\n          </Flex>\n        </Card>\n      </Box>\n      {/* Filename */}\n      <FormFieldInputText\n        {...register('originalFilename')}\n        disabled={formUpdating}\n        error={errors?.originalFilename?.message}\n        label=\"Filename\"\n        name=\"originalFilename\"\n        value={currentAsset?.originalFilename}\n      />\n      {/* Localized fields grouped by language */}\n      {hasLocales ? (\n        <Card marginTop={2} shadow={1} padding={3} radius={1}>\n          <Stack gap={2}>\n            <TabList gap={2}>\n              {locales.map((locale, idx) => (\n                <Tab\n                  key={locale.id}\n                  id={`locale-tab-${locale.id}`}\n                  aria-controls={`locale-panel-${locale.id}`}\n                  selected={activeLocaleTab === idx}\n                  onClick={() => setActiveLocaleTab(idx)}\n                  label={locale.title}\n                />\n              ))}\n            </TabList>\n            {locales.map((locale, idx) => (\n              <TabPanel\n                key={locale.id}\n                id={`locale-panel-${locale.id}`}\n                aria-labelledby={`locale-tab-${locale.id}`}\n                hidden={activeLocaleTab !== idx}\n              >\n                <Stack gap={3}>\n                  <FormFieldInputText\n                    {...register(`title.${locale.id}` as const)}\n                    disabled={formUpdating}\n                    error={(errors?.title as LocalizedErrors)?.[locale.id]?.message}\n                    label=\"Title\"\n                    name={`title.${locale.id}`}\n                  />\n                  <FormFieldInputText\n                    {...register(`altText.${locale.id}` as const)}\n                    disabled={formUpdating}\n                    error={(errors?.altText as LocalizedErrors)?.[locale.id]?.message}\n                    label=\"Alt Text\"\n                    name={`altText.${locale.id}`}\n                  />\n                  <FormFieldInputTextarea\n                    {...register(`description.${locale.id}` as const)}\n                    disabled={formUpdating}\n                    error={(errors?.description as LocalizedErrors)?.[locale.id]?.message}\n                    label=\"Description\"\n                    name={`description.${locale.id}`}\n                    rows={5}\n                  />\n                  {creditLine?.enabled && (\n                    <FormFieldInputText\n                      {...register(`creditLine.${locale.id}` as const)}\n                      error={(errors?.creditLine as LocalizedErrors)?.[locale.id]?.message}\n                      label=\"Credit\"\n                      name={`creditLine.${locale.id}`}\n                      disabled={\n                        formUpdating ||\n                        creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n                      }\n                    />\n                  )}\n                </Stack>\n              </TabPanel>\n            ))}\n          </Stack>\n        </Card>\n      ) : (\n        <>\n          <FormFieldInputText\n            {...register('title')}\n            disabled={formUpdating}\n            error={errors?.title?.message}\n            label=\"Title\"\n            name=\"title\"\n            value={toStringField(currentAsset?.title)}\n          />\n          <FormFieldInputText\n            {...register('altText')}\n            disabled={formUpdating}\n            error={errors?.altText?.message}\n            label=\"Alt Text\"\n            name=\"altText\"\n            value={toStringField(currentAsset?.altText)}\n          />\n          <FormFieldInputTextarea\n            {...register('description')}\n            disabled={formUpdating}\n            error={errors?.description?.message}\n            label=\"Description\"\n            name=\"description\"\n            rows={5}\n          />\n          {creditLine?.enabled && (\n            <FormFieldInputText\n              {...register('creditLine')}\n              error={errors?.creditLine?.message}\n              label=\"Credit\"\n              name=\"creditLine\"\n              value={toStringField(currentAsset?.creditLine)}\n              disabled={\n                formUpdating || creditLine?.excludeSources?.includes(currentAsset?.['source']?.name)\n              }\n            />\n          )}\n        </>\n      )}\n    </Stack>\n  )\n}\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {type SubmitHandler, useForm, useFormState} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue, useDocumentStore} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {getAssetFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {selectFolderPathById} from '../../modules/folders'\nimport {selectTags, selectTagSelectOptions, tagsActions} from '../../modules/tags'\nimport type {Asset, AssetFormData, DialogAssetEditProps, TagSelectOption} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport AssetMetadata from '../AssetMetadata'\nimport Dialog from '../Dialog'\nimport DocumentList from '../DocumentList'\nimport FileAssetPreview from '../FileAssetPreview'\nimport FormSubmitButton from '../FormSubmitButton'\nimport Image from '../Image'\nimport Details, {type DetailsProps} from './Details'\n\nfunction renderDefaultDetails(props: DetailsProps) {\n  return <Details {...props} />\n}\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogAssetEditProps\n}\n\nconst DialogAssetEdit = (props: Props) => {\n  const {\n    children,\n    dialog: {assetId, id, lastCreatedTag, lastRemovedTagIds},\n  } = props\n\n  const client = useVersionedClient()\n  const scheme = useColorSchemeValue()\n\n  const documentStore = useDocumentStore()\n\n  const dispatch = useDispatch()\n  const assetItem = useTypedSelector((state) => selectAssetById(state, String(assetId))) // TODO: check casting\n  const tags = useTypedSelector(selectTags)\n\n  const assetUpdatedPrev = useRef<string | undefined>(undefined)\n\n  // Generate a snapshot of the current asset\n  const [assetSnapshot, setAssetSnapshot] = useState(assetItem?.asset)\n  const [tabSection, setTabSection] = useState<'details' | 'references'>('details')\n\n  const currentAsset = assetItem ? assetItem?.asset : assetSnapshot\n  const allTagOptions = getTagSelectOptions(tags)\n\n  const assetTagOptions = useTypedSelector(selectTagSelectOptions(currentAsset))\n  const currentFolderId = currentAsset?.opt?.media?.folder?._ref ?? null\n  const currentFolderPath = useTypedSelector((state) =>\n    selectFolderPathById(state, currentFolderId),\n  )\n\n  // Check if credit line options are configured\n  const {creditLine, components: {details: CustomDetails} = {}, locales} = useToolOptions()\n\n  const generateDefaultValues = useCallback(\n    (asset?: Asset): AssetFormData => {\n      let imageDescription: string | undefined\n      if (asset && isImageAsset(asset)) {\n        const raw = asset.metadata?.image?.['ImageDescription']\n        if (typeof raw === 'string') {\n          imageDescription = raw\n        }\n      }\n\n      if (locales && locales.length > 0) {\n        const makeLocaleObj = (field?: Record<string, string> | string, fallback = '') => {\n          const obj: Record<string, string> = {}\n          for (let i = 0; i < locales.length; i++) {\n            const locale = locales[i]!\n            // Prefer key presence over truthiness so an intentional empty string\n            // (e.g. `{en: ''}`) is preserved and does not fall through to EXIF.\n            if (typeof field === 'object' && field && locale.id in field) {\n              obj[locale.id] = field[locale.id] ?? ''\n            } else if (typeof field === 'string') {\n              // Only populate the first locale to avoid spreading a legacy value\n              // across all languages; the user should fill in other translations manually\n              obj[locale.id] = i === 0 ? field : ''\n            } else if (typeof field === 'object' && field) {\n              // Localized object present but this locale key is missing: leave empty.\n              // Do not apply EXIF fallback to partial translations.\n              obj[locale.id] = ''\n            } else {\n              // No description set at all — EXIF fallback only for the first locale.\n              obj[locale.id] = i === 0 ? fallback : ''\n            }\n          }\n          return obj\n        }\n        return {\n          altText: makeLocaleObj(asset?.altText),\n          creditLine: makeLocaleObj(asset?.creditLine),\n          description: makeLocaleObj(asset?.description, imageDescription),\n          originalFilename: asset?.originalFilename || '',\n          opt: {media: {tags: assetTagOptions}},\n          title: makeLocaleObj(asset?.title),\n        }\n      }\n      // Normalize: if a field is a localized object but locales are disabled, pick first non-empty value\n      const flattenField = (field: unknown, fallback = ''): string => {\n        if (typeof field === 'string') return field\n        if (typeof field === 'object' && field !== null) {\n          const values = Object.values(field as Record<string, string>)\n          return values.find((v) => v) || fallback\n        }\n        return fallback\n      }\n      return {\n        altText: flattenField(asset?.altText),\n        creditLine: flattenField(asset?.creditLine),\n        description: flattenField(asset?.description, imageDescription),\n        originalFilename: asset?.originalFilename || '',\n        opt: {media: {tags: assetTagOptions}},\n        title: flattenField(asset?.title),\n      }\n    },\n    [assetTagOptions, locales],\n  )\n\n  const {control, getValues, handleSubmit, register, reset, setValue} = useForm<AssetFormData>({\n    defaultValues: generateDefaultValues(assetItem?.asset),\n    mode: 'onChange',\n    resolver: zodFormResolver<AssetFormData>(getAssetFormSchema(locales)),\n  })\n\n  // Subscribe via useFormState so React Compiler cannot skip formState Proxy reads\n  // that gate the Save button (isDirty / isValid).\n  const {errors, isDirty, isValid} = useFormState({control})\n\n  const formUpdating = !assetItem || assetItem?.updating\n\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.remove({id}))\n  }, [dispatch, id])\n\n  const handleDelete = useCallback(() => {\n    if (!assetItem?.asset) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteAssets({\n        assets: [assetItem],\n        closeDialogId: assetItem?.asset._id,\n      }),\n    )\n  }, [assetItem, dispatch])\n\n  const handleAssetUpdate = useCallback((update: MutationEvent) => {\n    const {result, transition} = update\n    if (result && transition === 'update') {\n      // Regenerate asset snapshot\n      setAssetSnapshot(result as Asset)\n    }\n  }, [])\n\n  const handleCreateTag = useCallback(\n    (tagName: string) => {\n      // Dispatch action to create new tag\n      dispatch(\n        tagsActions.createRequest({\n          assetId: currentAsset?._id,\n          name: tagName,\n        }),\n      )\n    },\n    [currentAsset?._id, dispatch],\n  )\n\n  const handleChangeFolder = useCallback(() => {\n    if (!assetItem) {\n      return\n    }\n\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: [assetItem], folderId: currentFolderId}))\n  }, [assetItem, currentFolderId, dispatch])\n\n  const handleRemoveFolder = useCallback(() => {\n    if (!assetItem || !currentFolderId) {\n      return\n    }\n\n    dispatch(assetsActions.folderSetRequest({assets: [assetItem], folderId: null}))\n  }, [assetItem, currentFolderId, dispatch])\n\n  // Detect if asset has localized fields (objects) with keys not in the configured locales\n  const hasOrphanedLocales = useMemo(() => {\n    if (!currentAsset) return false\n    const isLocaleObj = (v: unknown) => typeof v === 'object' && v !== null && !Array.isArray(v)\n    const fields = [\n      currentAsset.title,\n      currentAsset.altText,\n      currentAsset.description,\n      ...(currentAsset._type === 'sanity.imageAsset' ? [currentAsset.creditLine] : []),\n    ]\n    const anyLocalized = fields.some((f) => isLocaleObj(f))\n    if (!anyLocalized) return false\n    if (!locales || locales.length === 0) return true\n    const configuredIds = new Set(locales.map((l) => l.id))\n    return fields.some((f) => {\n      if (!isLocaleObj(f)) return false\n      return Object.keys(f as object).some((k) => !configuredIds.has(k))\n    })\n  }, [currentAsset, locales])\n\n  const handleCleanupLocales = useCallback(async () => {\n    if (!currentAsset) return\n\n    const cleanField = (field: unknown): unknown => {\n      if (typeof field !== 'object' || field === null || Array.isArray(field)) return field\n      const obj = field as Record<string, string>\n      if (!locales || locales.length === 0) {\n        // Pick the first non-empty value sorted by key for determinism\n        const sorted = Object.keys(obj).sort()\n        return sorted.map((k) => obj[k]).find((v) => v) || ''\n      }\n      const configuredIds = new Set(locales.map((l) => l.id))\n      const cleaned: Record<string, string> = {}\n      for (const [key, val] of Object.entries(obj)) {\n        if (configuredIds.has(key)) cleaned[key] = val\n      }\n      return cleaned\n    }\n\n    await client\n      .patch(currentAsset._id)\n      .set({\n        title: cleanField(currentAsset.title),\n        altText: cleanField(currentAsset.altText),\n        description: cleanField(currentAsset.description),\n        ...(currentAsset._type === 'sanity.imageAsset' && {\n          creditLine: cleanField(currentAsset.creditLine),\n        }),\n      })\n      .commit()\n  }, [client, currentAsset, locales])\n\n  // Submit react-hook-form\n  const onSubmit: SubmitHandler<AssetFormData> = useCallback(\n    (formData) => {\n      if (!assetItem?.asset) {\n        return\n      }\n\n      const sanitizedFormData = sanitizeFormData(formData)\n\n      // Keep an intentionally cleared description as '' (not null) so the EXIF\n      // ImageDescription fallback does not refill it the next time the dialog opens.\n      if (formData.description === '') {\n        sanitizedFormData['description'] = ''\n      }\n\n      dispatch(\n        assetsActions.updateRequest({\n          asset: assetItem?.asset,\n          closeDialogId: assetItem?.asset._id,\n          formData: {\n            ...sanitizedFormData,\n            // Map tags to sanity references\n            opt: {\n              media: {\n                ...sanitizedFormData['opt'].media,\n                tags:\n                  sanitizedFormData['opt'].media.tags?.map((tag: TagSelectOption) => ({\n                    _ref: tag.value,\n                    _type: 'reference',\n                    _weak: true,\n                  })) || null,\n                // Preserve the folder reference — it is managed separately and must\n                // not be wiped when patching opt.media via .set().\n                ...(currentAsset?.opt?.media?.folder && {folder: currentAsset.opt.media.folder}),\n              },\n            },\n          },\n        }),\n      )\n    },\n    [assetItem?.asset, currentAsset, dispatch],\n  )\n\n  // Listen for asset mutations and update snapshot\n  useEffect(() => {\n    if (!assetItem?.asset) {\n      return undefined\n    }\n\n    // Remember that Sanity listeners ignore joins, order clauses and projections\n    const subscriptionAsset = client\n      .listen(groq`*[_id == $id]`, {id: assetItem?.asset._id})\n      .subscribe(handleAssetUpdate)\n\n    return () => {\n      subscriptionAsset?.unsubscribe()\n    }\n  }, [assetItem?.asset, client, handleAssetUpdate])\n\n  // Update tags form field (react-select) when a new _inline_ tag has been created\n  useEffect(() => {\n    if (lastCreatedTag) {\n      const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n      const updatedTags = existingTags.concat([lastCreatedTag])\n      setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n    }\n  }, [getValues, lastCreatedTag, setValue])\n\n  // Update tags form field (react-select) when an _inline_ tag has been removed elsewhere\n  useEffect(() => {\n    if (lastRemovedTagIds) {\n      const existingTags = (getValues('opt.media.tags') as TagSelectOption[]) || []\n      const updatedTags = existingTags.filter((tag) => {\n        return !lastRemovedTagIds.includes(tag.value)\n      })\n\n      setValue('opt.media.tags', updatedTags, {shouldDirty: true})\n    }\n  }, [getValues, lastRemovedTagIds, setValue])\n\n  // Reset react-hook-form local state on mount and every time the asset has been updated elsewhere\n  useEffect(() => {\n    if (assetUpdatedPrev.current !== assetItem?.asset._updatedAt) {\n      reset(generateDefaultValues(assetItem?.asset))\n    }\n    assetUpdatedPrev.current = assetItem?.asset._updatedAt\n  }, [assetItem?.asset, generateDefaultValues, reset])\n\n  const footer = (\n    <Box padding={3}>\n      <Stack gap={3}>\n        {hasOrphanedLocales && (\n          <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n            <Flex align=\"center\" justify=\"space-between\" gap={3}>\n              <Text size={1}>\n                This asset has localized fields that are no longer configured. Clean them up to\n                avoid validation errors.\n              </Text>\n              <Button\n                fontSize={1}\n                mode=\"ghost\"\n                onClick={handleCleanupLocales}\n                text=\"Cleanup localized fields\"\n                tone=\"caution\"\n              />\n            </Flex>\n          </Card>\n        )}\n        <Flex justify=\"space-between\">\n          {/* Delete button */}\n          <Button\n            disabled={formUpdating}\n            fontSize={1}\n            mode=\"bleed\"\n            onClick={handleDelete}\n            text=\"Delete\"\n            tone=\"critical\"\n          />\n\n          {/* Submit button */}\n          <FormSubmitButton\n            disabled={formUpdating || !isDirty || !isValid || hasOrphanedLocales}\n            isValid={isValid}\n            lastUpdated={currentAsset?._updatedAt}\n            onClick={handleSubmit(onSubmit)}\n          />\n        </Flex>\n      </Stack>\n    </Box>\n  )\n\n  if (!currentAsset) {\n    return null\n  }\n\n  const detailsProps = {\n    control,\n    errors,\n    formUpdating,\n    register,\n    setValue,\n    assetTagOptions,\n    allTagOptions,\n    handleCreateTag,\n    currentAsset,\n    folderPath: currentFolderPath,\n    folderMissing: !!currentFolderId && !currentFolderPath,\n    onChangeFolder: handleChangeFolder,\n    onRemoveFolder: handleRemoveFolder,\n    creditLine,\n    locales,\n  }\n\n  return (\n    <Dialog animate footer={footer} header=\"Asset details\" id={id} onClose={handleClose} width={3}>\n      {/*\n        We reverse direction to ensure the download button doesn't appear (in the DOM) before other tabbable items.\n        This ensures that the dialog doesn't scroll down to the download button (which on smaller screens, can sometimes\n        be below the fold).\n      */}\n      <Flex direction={['column-reverse', 'column-reverse', 'row-reverse']}>\n        <Box flex={1} marginTop={[5, 5, 0]} padding={4}>\n          <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n            // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n            documentStore={documentStore}\n            id={currentAsset._id}\n          >\n            {({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList gap={2}>\n                    <Tab\n                      aria-controls=\"details-panel\"\n                      disabled={formUpdating}\n                      id=\"details-tab\"\n                      label=\"Details\"\n                      onClick={() => setTabSection('details')}\n                      selected={tabSection === 'details'}\n                      size={2}\n                    />\n                    <Tab\n                      aria-controls=\"references-panel\"\n                      disabled={formUpdating}\n                      id=\"references-tab\"\n                      label={`References${\n                        !isLoading && Array.isArray(uniqueReferringDocuments)\n                          ? ` (${uniqueReferringDocuments.length})`\n                          : ''\n                      }`}\n                      onClick={() => setTabSection('references')}\n                      selected={tabSection === 'references'}\n                      size={2}\n                    />\n                  </TabList>\n\n                  {/* Form fields */}\n                  <Box as=\"form\" marginTop={4} onSubmit={handleSubmit(onSubmit)}>\n                    {/* Deleted notification */}\n                    {!assetItem && (\n                      <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n                        <Text size={1}>This file cannot be found – it may have been deleted.</Text>\n                      </Card>\n                    )}\n\n                    {/* Hidden button to enable enter key submissions */}\n                    <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n                    {/* Panel: details */}\n                    <TabPanel\n                      aria-labelledby=\"details\"\n                      hidden={tabSection !== 'details'}\n                      id=\"details-panel\"\n                    >\n                      {CustomDetails ? (\n                        <CustomDetails\n                          {...detailsProps}\n                          renderDefaultDetails={renderDefaultDetails}\n                        />\n                      ) : (\n                        <Details {...detailsProps} />\n                      )}\n                    </TabPanel>\n\n                    {/* Panel: References */}\n                    <TabPanel\n                      aria-labelledby=\"references\"\n                      hidden={tabSection !== 'references'}\n                      id=\"references-panel\"\n                    >\n                      <Box marginTop={5}>\n                        {assetItem?.asset && (\n                          <DocumentList\n                            documents={uniqueReferringDocuments}\n                            isLoading={isLoading}\n                          />\n                        )}\n                      </Box>\n                    </TabPanel>\n                  </Box>\n                </>\n              )\n            }}\n          </WithReferringDocuments>\n        </Box>\n\n        <Box flex={1} padding={4}>\n          <Box style={{aspectRatio: '1'}}>\n            {/* File */}\n            {isFileAsset(currentAsset) && <FileAssetPreview asset={currentAsset} />}\n\n            {/* Image */}\n            {isImageAsset(currentAsset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!currentAsset?.metadata?.isOpaque}\n                src={imageDprUrl(currentAsset, {height: 600, width: 600})}\n              />\n            )}\n          </Box>\n\n          {/* Metadata */}\n          {currentAsset && (\n            <Box marginTop={4}>\n              <AssetMetadata asset={currentAsset} item={assetItem} />\n            </Box>\n          )}\n        </Box>\n      </Flex>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogAssetEdit\n","import {createSelector} from '@reduxjs/toolkit'\n\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../types'\nimport {selectCurrentFolderChildren} from './folders'\nimport type {RootReducerState} from './types'\n\nexport const selectCombinedItems = createSelector(\n  [\n    (state: RootReducerState) => state.assets.allIds,\n    (state: RootReducerState) => state.uploads.allIds,\n    selectCurrentFolderChildren,\n  ],\n  (assetIds, uploadIds, folderChildren) => {\n    const assetItems = assetIds.map((id): CardAssetData => ({id, type: 'asset'}))\n    const folderItems = folderChildren.map((folder): CardFolderData => ({\n      id: `folder:${folder.id}`,\n      folderId: folder.id,\n      name: folder.name,\n      path: folder.path,\n      totalCount: folder.totalCount,\n      type: 'folder',\n    }))\n    const uploadItems = uploadIds.map((id): CardUploadData => ({id, type: 'upload'}))\n    const combinedItems: (CardAssetData | CardFolderData | CardUploadData)[] = [\n      ...folderItems,\n      ...uploadItems,\n      ...assetItems,\n    ]\n    return combinedItems\n  },\n)\n","import {isHotkey} from 'is-hotkey-esm'\nimport {type RefObject, useCallback, useEffect, useRef} from 'react'\n\nconst useKeyPress = (hotkey: string, onPress?: () => void): RefObject<boolean> => {\n  const keyPressed = useRef(false)\n\n  // If pressed key is our target key then set to true\n  const downHandler = useCallback(\n    (e: KeyboardEvent) => {\n      if (isHotkey(hotkey, e)) {\n        keyPressed.current = true\n        if (onPress) {\n          onPress()\n        }\n      }\n    },\n    [hotkey, onPress],\n  )\n\n  // If released key is our target key then set to false\n  const upHandler = useCallback(() => {\n    keyPressed.current = false\n  }, [])\n\n  // Add event listeners\n  useEffect(() => {\n    window.addEventListener('keydown', downHandler)\n    window.addEventListener('keyup', upHandler)\n    // Remove event listeners on cleanup\n    return () => {\n      window.removeEventListener('keydown', downHandler)\n      window.removeEventListener('keyup', upHandler)\n    }\n  }, [downHandler, upHandler])\n\n  return keyPressed\n}\n\nexport default useKeyPress\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n  Box,\n  Checkbox,\n  Container,\n  Flex,\n  Spinner,\n  Text,\n  type Theme,\n  type ThemeColorSchemeKey,\n} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n  id: string\n  selected: boolean\n  source?: string\n}\n\nconst CardWrapper = styled(Flex)`\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n`\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst CardContainer = styled(Flex)<{$picked?: boolean; theme: Theme; $updating?: boolean}>(({\n  $picked,\n  theme,\n  $updating,\n}) => {\n  return css`\n    border: 1px solid transparent;\n    height: 100%;\n    pointer-events: ${$updating ? 'none' : 'auto'};\n    position: relative;\n    transition: all 300ms;\n    user-select: none;\n    width: 100%;\n\n    border: ${\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      $picked ? `1px solid ${theme.sanity.color.spot.orange} !important` : '1px solid inherit'\n    };\n\n    ${\n      !$updating &&\n      css`\n        @media (hover: hover) and (pointer: fine) {\n          &:hover {\n            border: 1px solid var(--card-border-color);\n          }\n        }\n      `\n    }\n  `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n  $scheme,\n}) => {\n  return css`\n    cursor: pointer;\n    height: ${PANEL_HEIGHT}px;\n    transition: all 300ms;\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${getSchemeColor($scheme, 'bg')};\n      }\n    }\n  `\n})\n\nconst StyledWarningOutlineIcon = styled(WarningFilledIcon)(({theme}) => {\n  return {\n    // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n    color: theme.sanity.color.spot.red,\n  }\n})\n\nconst CardAsset = (props: Props) => {\n  const {id, selected, source} = props\n\n  const scheme = useColorSchemeValue()\n  const toast = useToast()\n\n  // Refs\n  const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n  // Redux\n  const dispatch = useDispatch()\n  const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const item = useTypedSelector((state) => selectAssetById(state, id))\n  // Dialog carries the replace target so search refetch (which clears allIds/picks) is safe.\n  const dialogReplaceAssetId = useTypedSelector((state) => {\n    if (source !== 'replace-asset') {\n      return undefined\n    }\n    const dialog = state.dialog.items.find((d) => d.type === 'dialogAllAssets')\n    return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n  })\n\n  const asset = item?.asset\n  const error = item?.error\n  const isOpaque = item?.asset?.metadata?.isOpaque\n  const picked = item?.picked\n  const updating = item?.updating\n\n  // Prefer dialog assetId; fall back to the single currently-picked asset (not lastPicked).\n  const assetToReplaceId =\n    dialogReplaceAssetId ??\n    (source === 'replace-asset' && assetsPicked.length === 1\n      ? assetsPicked[0]?.asset._id\n      : undefined)\n\n  const assetToReplace = useTypedSelector((state) =>\n    assetToReplaceId ? selectAssetById(state, assetToReplaceId) : undefined,\n  )\n\n  const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n  // Short circuit if no asset is available\n  if (!asset) {\n    return null\n  }\n\n  const handleReplaceAsset = () => {\n    if (!assetToReplaceId || !isImageAsset(asset) || assetToReplace?.updating) {\n      return\n    }\n\n    dispatch(assetsActions.updateImageReferences({asset, id: assetToReplaceId}))\n    toast.push({\n      status: 'info',\n      title:\n        'Updating in progress. Depending on the amount of changes, this could take a few minutes.',\n    })\n    dispatch(dialogActions.clear())\n  }\n\n  // Callbacks\n  const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n    e.stopPropagation()\n\n    if (source === 'replace-asset') {\n      handleReplaceAsset()\n      return\n    }\n\n    if (selected) {\n      return\n    }\n\n    if (onSelect && !isMultiSelect) {\n      onSelect([\n        {\n          kind: 'assetDocumentId',\n          value: asset._id,\n        },\n      ])\n    } else if (onSelect && isMultiSelect) {\n      if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    } else if (shiftPressed.current) {\n      if (picked) {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      } else {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      }\n    } else {\n      dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n    }\n  }\n\n  const handleContextActionClick = (e: MouseEvent) => {\n    e.stopPropagation()\n\n    if (source === 'replace-asset') {\n      handleReplaceAsset()\n      return\n    }\n\n    if (selected) {\n      return\n    }\n\n    if (onSelect && !isMultiSelect) {\n      dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n    } else if (shiftPressed.current && !picked) {\n      dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n    } else {\n      dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n    }\n  }\n\n  const opacityContainer = updating ? 0.5 : 1\n  const opacityPreview = selected || updating ? 0.25 : 1\n\n  return (\n    <CardWrapper padding={1}>\n      <CardContainer direction=\"column\" $picked={picked} $updating={item.updating}>\n        {/* Image */}\n        <Box\n          flex={1}\n          style={{\n            cursor: selected ? 'default' : 'pointer',\n            position: 'relative',\n          }}\n        >\n          <div\n            data-testid={`media-asset-card-${asset._id}`}\n            onClick={handleAssetClick}\n            style={{height: '100%', opacity: opacityPreview}}\n          >\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"80px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 250, width: 250})}\n                style={{\n                  draggable: false,\n                  transition: 'opacity 1000ms',\n                }}\n              />\n            )}\n          </div>\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                opacity: opacityContainer,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n        </Box>\n\n        {/* Footer */}\n        <ContextActionContainer\n          align=\"center\"\n          onClick={handleContextActionClick}\n          paddingX={1}\n          $scheme={scheme}\n          style={{opacity: opacityContainer}}\n        >\n          {onSelect && !isMultiSelect ? (\n            <EditIcon\n              style={{\n                flexShrink: 0,\n                opacity: 0.5,\n              }}\n            />\n          ) : (\n            <Checkbox\n              checked={picked}\n              readOnly\n              style={{\n                flexShrink: 0,\n                pointerEvents: 'none',\n                transform: 'scale(0.8)',\n              }}\n            />\n          )}\n\n          <Box marginLeft={2}>\n            <Text muted size={0} textOverflow=\"ellipsis\">\n              {asset.originalFilename}\n            </Text>\n          </Box>\n        </ContextActionContainer>\n\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box\n            padding={3}\n            style={{\n              position: 'absolute',\n              right: 0,\n              top: 0,\n            }}\n          >\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningOutlineIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </CardContainer>\n    </CardWrapper>\n  )\n}\n\nexport default memo(CardAsset)\n","import {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  folderId: string\n  name: string\n  totalCount: number\n}\n\nconst CardWrapper = styled(Flex)`\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n`\n\nconst FolderCard = styled(Card)`\n  cursor: pointer;\n  height: 100%;\n  transition: border-color 200ms ease;\n  width: 100%;\n\n  @media (hover: hover) and (pointer: fine) {\n    &:hover {\n      border-color: var(--card-border-color);\n    }\n  }\n`\n\nconst FolderGlyph = styled(Box)(\n  ({theme}) => css`\n    align-items: flex-end;\n    background: linear-gradient(\n      180deg,\n      ${\n          // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n          theme.sanity.color.spot.yellow\n        }\n        0%,\n      ${\n          // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n          theme.sanity.color.spot.yellow\n        }\n        100%\n    );\n    border-radius: 8px;\n    display: flex;\n    height: 72px;\n    position: relative;\n    width: 96px;\n\n    &::before {\n      background: ${\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.color.spot.yellow\n      };\n      border-radius: 8px 8px 0 0;\n      content: '';\n      height: 18px;\n      left: 0;\n      position: absolute;\n      top: -8px;\n      width: 38px;\n    }\n  `,\n)\n\nconst CardFolder = ({folderId, name, totalCount}: Props) => {\n  const dispatch = useDispatch()\n  const scheme = useColorSchemeValue()\n\n  return (\n    <CardWrapper padding={1}>\n      <FolderCard\n        onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n        padding={3}\n        radius={2}\n        style={{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n        }}\n      >\n        <Flex direction=\"column\" height=\"fill\" justify=\"space-between\">\n          <Flex align=\"center\" flex={1} justify=\"center\">\n            <FolderGlyph />\n          </Flex>\n\n          <Stack gap={2}>\n            <Text\n              size={1}\n              style={{lineHeight: '1.35em', minHeight: '2.7em', wordBreak: 'break-word'}}\n              weight=\"semibold\"\n            >\n              {name}\n            </Text>\n            <Text muted size={0} style={{lineHeight: '1.2em'}}>\n              {totalCount} item{totalCount === 1 ? '' : 's'}\n            </Text>\n          </Stack>\n        </Flex>\n      </FolderCard>\n    </CardWrapper>\n  )\n}\n\nexport default CardFolder\n","import {Observable, from, of} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\n\nconst PREVIEW_WIDTH = 180 // px\n\nconst createBlob = (img: HTMLImageElement): Promise<Blob | null> => {\n  return new Promise((resolve) => {\n    const imageAspect = img.width / img.height\n\n    // Create a canvas element which we'll use to generate a low resolution preview.\n    // Ensure that the canvas is at least 1 pixel high as blob generation will fail otherwise.\n    const canvas: HTMLCanvasElement = document.createElement('canvas')\n    canvas.width = PREVIEW_WIDTH\n    canvas.height = Math.max(PREVIEW_WIDTH / imageAspect, 1)\n\n    // Fail silently if we're unable to generate a preview image.\n    // This can often be the case when trying to render SVGs containing `<foreignObject>` elements.\n    try {\n      const ctx = canvas.getContext('2d')\n      ctx?.drawImage(img, 0, 0, PREVIEW_WIDTH, PREVIEW_WIDTH / imageAspect)\n      canvas.toBlob(resolve, 'image/jpeg')\n    } catch (err) {\n      console.warn(`Unable to generate preview image:`, err)\n    }\n  })\n}\n\nconst createImageEl = (file: File): Promise<HTMLImageElement> => {\n  return new Promise((resolve) => {\n    const blobUrlLarge = window.URL.createObjectURL(file)\n    const img = new Image()\n    img.onload = () => {\n      window.URL.revokeObjectURL(blobUrlLarge)\n      resolve(img)\n    }\n    img.src = blobUrlLarge\n  })\n}\n\nconst generatePreviewBlobUrl = async (file: File): Promise<string> => {\n  const imageEl = await createImageEl(file)\n  const blob = await createBlob(imageEl)\n\n  if (!blob) {\n    throw Error('Unable to generate file Blob')\n  }\n\n  return window.URL.createObjectURL(blob)\n}\n\nexport const generatePreviewBlobUrl$ = (file: File): Observable<string> => {\n  return of(null).pipe(mergeMap(() => from(generatePreviewBlobUrl(file))))\n}\n","import {Subject, Subscription, Observable, from} from 'rxjs'\n// Takes a observable-returning function and returns a new function that limits on the number of\n// concurrent observables.\nimport {first, mergeMap} from 'rxjs/operators'\n\nconst DEFAULT_CONCURRENCY = 4\n\nfunction remove<T>(array: Array<T>, item: T): Array<T> {\n  const index = array.indexOf(item)\n  if (index > -1) {\n    array.splice(index, 1)\n  }\n  return array\n}\n\nexport const createThrottler = (concurrency: number = DEFAULT_CONCURRENCY) => {\n  const currentSubscriptions: Array<Subscription> = []\n  const pendingObservables: Array<Observable<any>> = []\n  const ready$ = new Subject()\n\n  function request(observable: Observable<any>): Observable<any> {\n    return new Observable((observer) => {\n      if (currentSubscriptions.length >= concurrency) {\n        return scheduleAndWait$(observable)\n          .pipe(mergeMap(request)) //\n          .subscribe(observer)\n      }\n      const subscription = observable.subscribe(observer)\n      currentSubscriptions.push(subscription)\n      return () => {\n        remove(currentSubscriptions, subscription)\n        remove(pendingObservables, observable)\n        subscription.unsubscribe()\n        while (pendingObservables.length > 0 && currentSubscriptions.length < concurrency) {\n          ready$.next(pendingObservables.shift())\n        }\n      }\n    })\n  }\n\n  function scheduleAndWait$(observable: Observable<any>): Observable<any> {\n    pendingObservables.push(observable)\n    return ready$.asObservable().pipe(first((obs) => obs === observable))\n  }\n\n  return request\n}\n\nexport const withMaxConcurrency = (\n  func: (...args: any[]) => Observable<any>,\n  concurrency: number = DEFAULT_CONCURRENCY,\n) => {\n  const throttler = createThrottler(concurrency)\n  return (...args: Array<any>) => from(throttler(func(...args)))\n}\n","// Sourced from:\n// https://github.com/sanity-io/sanity/blob/ccb777e115a8cdf20d81a9a2bc9d8c228568faff/packages/%40sanity/form-builder/src/sanity/inputs/client-adapters/assets.ts\n\nimport type {SanityAssetDocument, SanityClient, SanityImageAssetDocument} from '@sanity/client'\nimport {Observable, of, throwError} from 'rxjs'\nimport {map, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError} from '../types'\nimport {withMaxConcurrency} from './withMaxConcurrency'\n\nconst fetchExisting$ = (client: SanityClient, type: string, hash: string) => {\n  return client.observable.fetch('*[_type == $documentType && sha1hash == $hash][0]', {\n    documentType: type,\n    hash,\n  })\n}\n\nconst readFile$ = (file: File): Observable<ArrayBuffer> => {\n  return new Observable((subscriber) => {\n    const reader = new FileReader()\n    reader.onload = () => {\n      subscriber.next(reader.result as ArrayBuffer)\n      subscriber.complete()\n    }\n    reader.onerror = (err) => {\n      subscriber.error(err)\n    }\n    reader.readAsArrayBuffer(file)\n    return () => {\n      reader.abort()\n    }\n  })\n}\n\nconst hexFromBuffer = (buffer: ArrayBuffer): string => {\n  return Array.prototype.map\n    .call(new Uint8Array(buffer), (x) => `00${x.toString(16)}`.slice(-2))\n    .join('')\n}\n\nexport const hashFile$ = (file: File): Observable<string> => {\n  if (!window.crypto || !window.crypto.subtle || !window.FileReader) {\n    return throwError(() => ({\n      message: 'Unable to generate hash: uploads are only allowed in secure contexts',\n      statusCode: 500,\n    }))\n  }\n  return readFile$(file).pipe(\n    mergeMap((arrayBuffer) => window.crypto.subtle.digest('SHA-1', arrayBuffer)),\n    map(hexFromBuffer),\n  )\n}\n\nconst uploadSanityAsset$ = (\n  client: SanityClient,\n  assetType: 'file' | 'image',\n  file: File,\n  hash: string,\n) => {\n  return of(null).pipe(\n    // NOTE: the sanity api will still dedupe unique files, but this saves us from uploading the asset file entirely\n    mergeMap(() => fetchExisting$(client, `sanity.${assetType}Asset`, hash)),\n    // Cancel if the asset already exists\n    mergeMap((existingAsset: SanityAssetDocument | SanityImageAssetDocument | null) => {\n      if (existingAsset) {\n        return throwError(\n          () =>\n            ({\n              message: 'Asset already exists',\n              statusCode: 409,\n            }) satisfies HttpError,\n        )\n      }\n\n      return of(null)\n    }),\n    mergeMap(() => {\n      // Begin upload if no existing asset found\n      return client.observable.assets\n        .upload(assetType, file, {\n          extract: ['blurhash', 'exif', 'image', 'location', 'lqip', 'palette'],\n          preserveFilename: true,\n        })\n        .pipe(\n          map((event) =>\n            event.type === 'response'\n              ? {\n                  // rewrite to a 'complete' event\n                  asset: event.body.document,\n                  id: event.body.document._id,\n                  type: 'complete',\n                }\n              : event,\n          ),\n        )\n    }),\n  )\n}\n\nexport const uploadAsset$ = withMaxConcurrency(uploadSanityAsset$)\n","import {createSelector, createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {ClientError, SanityAssetDocument, SanityImageAssetDocument} from '@sanity/client'\nimport groq from 'groq'\nimport {EMPTY, from, merge, of} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\n\nimport type {HttpError, MyEpic, SanityUploadProgressEvent, UploadItem} from '../../types'\nimport constructFilter from '../../utils/constructFilter'\nimport {generatePreviewBlobUrl$} from '../../utils/generatePreviewBlobUrl'\nimport {hashFile$, uploadAsset$} from '../../utils/uploadSanityAsset'\nimport {assetsActions} from '../assets'\nimport type {RootReducerState} from '../types'\nimport {UPLOADS_ACTIONS} from './actions'\n\nexport type UploadsReducerState = {\n  allIds: string[]\n  byIds: Record<string, UploadItem>\n}\n\nconst initialState = {\n  allIds: [],\n  byIds: {},\n} as UploadsReducerState\n\nconst uploadsSlice = createSlice({\n  name: 'uploads',\n  initialState,\n  extraReducers: (builder) => {\n    builder //\n      .addCase(UPLOADS_ACTIONS.uploadComplete, (state, action) => {\n        const {asset} = action.payload\n        if (state.byIds[asset.sha1hash]) {\n          state.byIds[asset.sha1hash]!.status = 'complete'\n        }\n      })\n  },\n  reducers: {\n    checkRequest(\n      _state,\n      _action: PayloadAction<{assets: (SanityAssetDocument | SanityImageAssetDocument)[]}>,\n    ) {\n      //\n    },\n    checkComplete(state, action: PayloadAction<{results: Record<string, string | null>}>) {\n      const {results} = action.payload\n\n      const assetHashes = Object.keys(results)\n\n      assetHashes.forEach((hash) => {\n        const deleteIndex = state.allIds.indexOf(hash)\n        if (deleteIndex >= 0) {\n          state.allIds.splice(deleteIndex, 1)\n        }\n\n        if (state.byIds[hash]) {\n          const blobUrl = state.byIds[hash].objectUrl\n          if (blobUrl) {\n            window.URL.revokeObjectURL(blobUrl)\n          }\n\n          delete state.byIds[hash]\n        }\n      })\n    },\n    previewReady(state, action: PayloadAction<{hash: string; blobUrl: string}>) {\n      const {blobUrl, hash} = action.payload\n      if (state.byIds[hash]) {\n        state.byIds[hash].objectUrl = blobUrl\n      }\n    },\n    uploadCancel(state, action: PayloadAction<{hash: string}>) {\n      const {hash} = action.payload\n      const deleteIndex = state.allIds.indexOf(hash)\n      if (deleteIndex >= 0) {\n        state.allIds.splice(deleteIndex, 1)\n      }\n      if (state.byIds[hash]) {\n        delete state.byIds[hash]\n      }\n    },\n    uploadError(state, action: PayloadAction<{error: HttpError; hash: string}>) {\n      const {hash} = action.payload\n      const deleteIndex = state.allIds.indexOf(hash)\n      if (deleteIndex >= 0) {\n        state.allIds.splice(deleteIndex, 1)\n      }\n      delete state.byIds[hash]\n    },\n    uploadRequest(\n      _state,\n      _action: PayloadAction<{file: File; forceAsAssetType?: 'file' | 'image'}>,\n    ) {\n      //\n    },\n    uploadProgress(\n      state,\n      action: PayloadAction<{event: SanityUploadProgressEvent; uploadHash: string}>,\n    ) {\n      const {event, uploadHash} = action.payload\n      state.byIds[uploadHash]!.percent = event.percent\n      state.byIds[uploadHash]!.status = 'uploading'\n    },\n    uploadStart(state, action: PayloadAction<{file: File; uploadItem: UploadItem}>) {\n      const {uploadItem} = action.payload\n      if (!state.allIds.includes(uploadItem.hash)) {\n        state.allIds.push(uploadItem.hash)\n      }\n      state.byIds[uploadItem.hash] = uploadItem\n    },\n  },\n})\n\n// Epics\n\nexport const uploadsAssetStartEpic: MyEpic = (action$, _state$, {client}) =>\n  action$.pipe(\n    filter(uploadsActions.uploadStart.match),\n    mergeMap((action) => {\n      const {file, uploadItem} = action.payload\n\n      return merge(\n        // Generate low res preview\n        of(null).pipe(\n          mergeMap(() => generatePreviewBlobUrl$(file)),\n          mergeMap((url) => {\n            return of(\n              uploadsActions.previewReady({\n                blobUrl: url,\n                hash: uploadItem.hash,\n              }),\n            )\n          }),\n        ),\n        // Upload asset and receive progress / complete events\n        of(null).pipe(\n          // delay(500000), // debug uploads\n          mergeMap(() => uploadAsset$(client, uploadItem.assetType, file, uploadItem.hash)),\n          takeUntil(\n            action$.pipe(\n              filter(uploadsActions.uploadCancel.match),\n              filter((v) => v.payload.hash === uploadItem.hash),\n            ),\n          ),\n          mergeMap((event) => {\n            if (event?.type === 'complete') {\n              const folderId = uploadItem.folderId || null\n\n              if (!folderId) {\n                return of(\n                  UPLOADS_ACTIONS.uploadComplete({\n                    asset: event.asset,\n                  }),\n                )\n              }\n\n              return from(\n                client\n                  .patch(event.asset._id)\n                  .setIfMissing({opt: {}})\n                  .setIfMissing({'opt.media': {}})\n                  .set({\n                    'opt.media.folder': {_ref: folderId, _type: 'reference', _weak: true},\n                  })\n                  .commit(),\n              ).pipe(\n                mergeMap((asset) =>\n                  of(\n                    UPLOADS_ACTIONS.uploadComplete({\n                      asset: asset as SanityAssetDocument | SanityImageAssetDocument,\n                    }),\n                  ),\n                ),\n              )\n            }\n            if (event?.type === 'progress' && event?.stage === 'upload') {\n              return of(\n                uploadsActions.uploadProgress({\n                  event,\n                  uploadHash: uploadItem.hash,\n                }),\n              )\n            }\n            return EMPTY\n          }),\n          catchError((error: ClientError) =>\n            of(\n              uploadsActions.uploadError({\n                error: {\n                  message: error?.message || 'Internal error',\n                  statusCode: error?.statusCode || 500,\n                },\n                hash: uploadItem.hash,\n              }),\n            ),\n          ),\n        ),\n      )\n    }),\n  )\n\nexport const uploadsAssetUploadEpic: MyEpic = (action$, state$) =>\n  action$.pipe(\n    filter(uploadsActions.uploadRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {file, forceAsAssetType} = action.payload\n\n      return of(action).pipe(\n        // Generate SHA1 hash from local file\n        // This will throw in insecure contexts (non-localhost / https)\n        mergeMap(() => hashFile$(file)),\n        // Ignore if the file exists and is currently being uploaded\n        filter((hash) => {\n          const exists = !!state.uploads.byIds[hash]\n          return !exists\n        }),\n        // Dispatch start action and begin upload process\n        mergeMap((hash) => {\n          const assetType = forceAsAssetType || (file.type.indexOf('image') >= 0 ? 'image' : 'file')\n          const uploadItem = {\n            _type: 'upload',\n            assetType,\n            folderId: state.folders.currentFolderId,\n            hash,\n            name: file.name,\n            size: file.size,\n            status: 'queued',\n          } as UploadItem\n          return of(uploadsActions.uploadStart({file, uploadItem}))\n        }),\n      )\n    }),\n  )\n\nexport const uploadsCompleteQueueEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(UPLOADS_ACTIONS.uploadComplete.match),\n    mergeMap((action) => {\n      return of(\n        uploadsActions.checkRequest({\n          assets: [action.payload.asset],\n        }),\n      )\n    }),\n  )\n\nexport const uploadsCheckRequestEpic: MyEpic = (action$, state$, {client}) =>\n  action$.pipe(\n    filter(uploadsActions.checkRequest.match),\n    withLatestFrom(state$),\n    mergeMap(([action, state]) => {\n      const {assets} = action.payload\n\n      const documentIds = assets.map((asset) => asset._id)\n\n      const constructedFilter = constructFilter({\n        assetTypes: state.assets.assetTypes,\n        currentFolderId: state.folders.currentFolderId,\n        excludeTagSlugs: state.assets.excludeTagSlugs,\n        searchFacets: state.search.facets,\n        searchQuery: state.search.query,\n      })\n\n      const query = groq`\n        *[${constructedFilter} && _id in $documentIds].sha1hash\n      `\n\n      return of(action).pipe(\n        delay(1000), // give Sanity some time to register the recently uploaded asset\n        mergeMap(() => client.observable.fetch<string[]>(query, {documentIds})),\n        mergeMap((resultHashes) => {\n          const checkedResults = assets.reduce((acc: Record<string, string | null>, asset) => {\n            acc[asset.sha1hash] = resultHashes.includes(asset.sha1hash) ? asset._id : null\n            return acc\n          }, {})\n\n          return of(\n            uploadsActions.checkComplete({results: checkedResults}), //\n            assetsActions.insertUploads({results: checkedResults}),\n          )\n        }),\n      )\n    }),\n  )\n\n// Selectors\n\nexport const selectUploadById = createSelector(\n  [\n    (state: RootReducerState) => state.uploads.byIds,\n    (_state: RootReducerState, uploadId: string) => uploadId,\n  ],\n  (byIds, uploadId) => byIds[uploadId],\n)\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\nexport default uploadsSlice.reducer\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n  id: string\n}\n\nconst CardWrapper = styled(Flex)`\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  position: relative;\n  width: 100%;\n`\n\nconst CardUpload = (props: Props) => {\n  const {id} = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const item = useTypedSelector((state) => selectUploadById(state, id))\n\n  if (!item) {\n    return null\n  }\n\n  const fileSize = filesize(item.size, {base: 10, round: 0})\n  const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n  const isComplete = item.status === 'complete'\n  const isUploading = item.status === 'uploading'\n  const isQueued = item.status === 'queued'\n\n  let status\n  if (isComplete) {\n    status = 'Verifying'\n  }\n  if (isUploading) {\n    status = `${percentLoaded}%`\n  }\n  if (isQueued) {\n    status = 'Queued'\n  }\n\n  // Callbacks\n  const handleCancelUpload = () => {\n    dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n  }\n\n  return (\n    <CardWrapper padding={1}>\n      <Flex\n        direction=\"column\"\n        flex={1}\n        style={{\n          background: getSchemeColor(scheme, 'bg'),\n          border: '1px solid transparent',\n          height: '100%',\n          position: 'relative',\n        }}\n      >\n        {/* Progress bar */}\n        <div\n          style={{\n            background: 'var(--card-fg-color)',\n            bottom: 0,\n            height: '1px',\n            left: 0,\n            position: 'absolute',\n            width: '100%',\n            transform: `scaleX(${percentLoaded * 0.01})`,\n            transformOrigin: 'bottom left',\n            transition: 'all 1000ms ease-out',\n          }}\n        />\n\n        <Box flex={1} style={{position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{\n                opacity: 0.4,\n              }}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"80px\" />\n            </div>\n          )}\n\n          {/*\n          Cancel upload button.\n          Assets will only have a `complete` status _after_ it has been created on your dataset.\n          As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n          has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n        */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              direction=\"column\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={4}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n\n        {/* Footer */}\n        <Flex\n          align=\"center\"\n          justify=\"space-between\"\n          paddingX={2}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Box flex={1} marginRight={1}>\n            <Text size={0} textOverflow=\"ellipsis\">\n              {item.name} ({fileSize})\n            </Text>\n          </Box>\n          <Text size={0} style={{flexShrink: 0}} weight=\"semibold\">\n            {status}\n          </Text>\n        </Flex>\n      </Flex>\n    </CardWrapper>\n  )\n}\n\nexport default CardUpload\n","import {memo} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport CardAsset from '../CardAsset'\nimport CardFolder from '../CardFolder'\nimport CardUpload from '../CardUpload'\n\ntype Props = {\n  items: (CardAssetData | CardFolderData | CardUploadData)[]\n  onLoadMore?: () => void\n  source?: string\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = memo(\n  ({\n    item,\n    selected,\n    source,\n  }: {\n    item: CardAssetData | CardFolderData | CardUploadData\n    selected: boolean\n    source?: string\n  }) => {\n    if (item?.type === 'asset') {\n      return <CardAsset id={item.id} selected={selected} source={source} />\n    }\n\n    if (item?.type === 'folder') {\n      return <CardFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n    }\n\n    if (item?.type === 'upload') {\n      return <CardUpload id={item.id} />\n    }\n\n    return null\n  },\n)\n\nconst StyledItemContainer = styled.div`\n  height: ${CARD_HEIGHT}px;\n  width: ${CARD_WIDTH}px;\n`\n\nconst ItemContainer = (props: any) => {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n  const {context, ref, ...rest} = props\n  return <StyledItemContainer ref={ref} {...rest} />\n}\n\nconst StyledListContainer = styled.div`\n  display: grid;\n  grid-template-columns: repeat(auto-fill, ${CARD_WIDTH}px);\n  grid-template-rows: repeat(auto-fill, ${CARD_HEIGHT}px);\n  justify-content: center;\n  margin: 0 auto;\n`\n\nconst ListContainer = (props: any) => {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we're doing this to avoid sc warnings about `context` passed as an attribute\n  const {context, ref, ...rest} = props\n  return <StyledListContainer ref={ref} {...rest} />\n}\n\nconst AssetGridVirtualized = (props: Props) => {\n  const {items, onLoadMore, source} = props\n\n  // Redux\n  const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n  const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n  const totalCount = items?.length\n\n  if (totalCount === 0) {\n    return null\n  }\n\n  return (\n    <VirtuosoGrid\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        return item?.id ?? index\n      }}\n      components={{\n        Item: ItemContainer,\n        List: ListContainer,\n      }}\n      endReached={onLoadMore}\n      itemContent={(index) => {\n        const item = items[index]!\n        const selected = selectedIds.includes(item.id)\n        return <VirtualCell item={item} selected={selected} source={source} />\n      }}\n      overscan={48}\n      style={{overflowX: 'hidden', overflowY: 'scroll'}}\n      totalCount={totalCount}\n    />\n  )\n}\n\nexport default AssetGridVirtualized\n","import {Box, Text} from '@sanity/ui'\nimport {useEffect, useRef, useState} from 'react'\nimport {useDispatch, useStore} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport type {RootReducerState} from '../../modules/types'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {isImageAsset} from '../../utils/typeGuards'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\n\nfunction omitFacetId(facet: WithId<SearchFacetInputProps>): SearchFacetInputProps {\n  // Strip the runtime `id` so facetsAdd can assign a fresh one on restore.\n  const {id: _id, ...withoutId} = facet\n  void _id\n  return withoutId\n}\n\nconst ReplaceAssetsOverview = () => {\n  const dispatch = useDispatch()\n  const store = useStore<RootReducerState>()\n  const combinedItems = useTypedSelector(selectCombinedItems)\n  const assetsById = useTypedSelector((state) => state.assets.byIds)\n  const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const fetchingError = useTypedSelector((state) => state.assets.fetchingError)\n  const pageSize = useTypedSelector((state) => state.assets.pageSize)\n  const searchQuery = useTypedSelector((state) => state.search.query)\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const currentFolderUnfiled = useTypedSelector((state) => state.folders.currentFolderUnfiled)\n\n  // Prefer the dialog's assetId — search refetch clears `allIds` / can drop picks.\n  const assetToReplaceId = useTypedSelector((state) => {\n    const dialog = state.dialog.items.find((item) => item.type === 'dialogAllAssets')\n    return dialog?.type === 'dialogAllAssets' ? dialog.assetId : undefined\n  })\n\n  const savedBrowserStateRef = useRef<{\n    assetId: string | undefined\n    query: string\n    facets: WithId<SearchFacetInputProps>[]\n    folderId: string | null\n    folderUnfiled: boolean\n  } | null>(null)\n\n  // Clearing the search only triggers a refetch after `assetsSearchEpic`'s debounce, so the\n  // stale results stay in the store for a moment. Track that gap to avoid rendering the\n  // empty state before the unscoped results arrive.\n  const [awaitingRefetch, setAwaitingRefetch] = useState(\n    () =>\n      searchQuery.length > 0 ||\n      searchFacets.length > 0 ||\n      Boolean(currentFolderId) ||\n      currentFolderUnfiled,\n  )\n\n  // Clear the browser search, facets and folder scope so the picker is not limited to the\n  // result set the user used to find the asset. Restore them when the dialog closes.\n  useEffect(() => {\n    const {dialog, folders, search} = store.getState()\n    const {query, facets} = search\n    const dialogItem = dialog.items.find((item) => item.type === 'dialogAllAssets')\n\n    savedBrowserStateRef.current = {\n      assetId: dialogItem?.type === 'dialogAllAssets' ? dialogItem.assetId : undefined,\n      query,\n      facets,\n      folderId: folders.currentFolderId,\n      folderUnfiled: folders.currentFolderUnfiled,\n    }\n\n    if (query.length > 0) {\n      dispatch(searchActions.querySet({searchQuery: ''}))\n    }\n    if (facets.length > 0) {\n      dispatch(searchActions.facetsClear())\n    }\n    if (folders.currentFolderId || folders.currentFolderUnfiled) {\n      dispatch(foldersActions.currentFolderClear())\n    }\n\n    return () => {\n      const saved = savedBrowserStateRef.current\n      if (!saved) {\n        return\n      }\n\n      const hadScope =\n        saved.query.length > 0 ||\n        saved.facets.length > 0 ||\n        Boolean(saved.folderId) ||\n        saved.folderUnfiled\n\n      if (saved.query.length > 0) {\n        dispatch(searchActions.querySet({searchQuery: saved.query}))\n      }\n      for (const facet of saved.facets) {\n        dispatch(searchActions.facetsAdd({facet: omitFacetId(facet)}))\n      }\n      if (saved.folderId) {\n        dispatch(foldersActions.currentFolderSet({folderId: saved.folderId}))\n      } else if (saved.folderUnfiled) {\n        dispatch(foldersActions.currentFolderShowUnfiled())\n      }\n\n      // Changing the search or folder runs epics that clear picks — put the asset being\n      // replaced back so closing the dialog keeps the browser selection.\n      if (hadScope && saved.assetId) {\n        dispatch(assetsActions.pick({assetId: saved.assetId, picked: true}))\n      }\n    }\n  }, [dispatch, store])\n\n  // Every rescoped refetch is preceded by `assetsActions.clear()`, so wait for the asset\n  // list to be emptied and the following fetch to settle. Watching `fetching` alone is not\n  // enough: `assetsFetchEpic` uses `switchMap`, so replacing an in-flight request leaves\n  // `fetching` true throughout. Clearing a folder scope and a search at the same time\n  // produces two refetches (the folder one immediately, the search one after its debounce),\n  // so each list clear re-arms the wait rather than resolving it for good.\n  useEffect(() => {\n    let previousIds = store.getState().assets.allIds\n    let awaitingSettle = false\n\n    return store.subscribe(() => {\n      const {allIds, fetching: isFetching} = store.getState().assets\n      const listCleared = allIds !== previousIds && allIds.length === 0\n      previousIds = allIds\n\n      if (listCleared) {\n        awaitingSettle = true\n        setAwaitingRefetch(true)\n        return\n      }\n      if (awaitingSettle && !isFetching) {\n        awaitingSettle = false\n        setAwaitingRefetch(false)\n      }\n    })\n  }, [store])\n\n  const scopeActive =\n    searchQuery.length > 0 ||\n    searchFacets.length > 0 ||\n    Boolean(currentFolderId) ||\n    currentFolderUnfiled\n\n  // Only image assets can replace image refs; exclude uploads and the asset being replaced.\n  const reducedItems = combinedItems.filter((item) => {\n    if (item.type !== 'asset' || item.id === assetToReplaceId) {\n      return false\n    }\n    const asset = assetsById[item.id]?.asset\n    return asset ? isImageAsset(asset) : false\n  })\n\n  const hasFetchedOnce = fetchCount >= 0\n  const hasMorePages = fetchCount === pageSize\n  // Don't treat a scoped / stale / mid-fetch / incomplete page as \"no replacements\".\n  const isEmpty =\n    reducedItems.length === 0 &&\n    hasFetchedOnce &&\n    !fetching &&\n    !scopeActive &&\n    !awaitingRefetch &&\n    !hasMorePages\n\n  // Keep loading pages until we find image candidates or exhaust results. A failed fetch\n  // leaves `fetchCount` untouched, so stop paging on error instead of retrying forever.\n  useEffect(() => {\n    if (\n      scopeActive ||\n      fetching ||\n      awaitingRefetch ||\n      fetchingError ||\n      reducedItems.length > 0 ||\n      !hasFetchedOnce ||\n      !hasMorePages\n    ) {\n      return\n    }\n    dispatch(assetsActions.loadNextPage())\n  }, [\n    dispatch,\n    scopeActive,\n    fetching,\n    awaitingRefetch,\n    fetchingError,\n    reducedItems.length,\n    hasFetchedOnce,\n    hasMorePages,\n  ])\n\n  const handleLoadMoreItems = () => {\n    if (!fetching) {\n      dispatch(assetsActions.loadNextPage())\n    }\n  }\n\n  return (\n    <Box height=\"fill\">\n      {isEmpty ? (\n        <Box padding={5}>\n          <Text size={1} weight=\"semibold\">\n            There are no replacement images\n          </Text>\n        </Box>\n      ) : (\n        <Box height=\"fill\">\n          <AssetGridVirtualized\n            items={reducedItems}\n            onLoadMore={handleLoadMoreItems}\n            source=\"replace-asset\"\n          />\n        </Box>\n      )}\n    </Box>\n  )\n}\n\nexport default ReplaceAssetsOverview\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogAllAssetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport ReplaceAssetsOverview from '../ReplaceAssetsOverView'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogAllAssetsProps\n}\n\nconst DialogAllAssets = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog header=\"Choose a replacement image\" id={id} onClose={handleClose} width={3}>\n      <Box padding={4} style={{height: '50vh'}}>\n        <ReplaceAssetsOverview />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogAllAssets\n","import {WarningOutlineIcon} from '@sanity/icons/WarningOutline'\nimport {Box, Button, Flex, Stack, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogConfirmProps} from '../../types'\nimport Dialog from '../Dialog'\n\ntype Props = {\n  children?: ReactNode\n  dialog: DialogConfirmProps\n}\n\nconst DialogConfirm = (props: Props) => {\n  const {children, dialog} = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id: dialog?.id}))\n  }\n\n  const handleConfirm = () => {\n    // Close target dialog, if provided\n    if (dialog?.closeDialogId) {\n      dispatch(dialogActions.remove({id: dialog?.closeDialogId}))\n    }\n\n    if (dialog?.confirmCallbackAction) {\n      dispatch(dialog.confirmCallbackAction)\n    }\n\n    // Close self\n    handleClose()\n  }\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"space-between\">\n        <Button fontSize={1} mode=\"bleed\" onClick={handleClose} text=\"Cancel\" />\n        <Button\n          fontSize={1}\n          onClick={handleConfirm}\n          text={dialog?.confirmText}\n          tone={dialog?.tone}\n        />\n      </Flex>\n    </Box>\n  )\n\n  const Header = () => (\n    <Flex align=\"center\">\n      <Box paddingX={1}>\n        <WarningOutlineIcon />\n      </Box>\n      <Box marginLeft={2}>{dialog?.headerTitle}</Box>\n    </Flex>\n  )\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      // oxlint-disable-next-line react/static-components\n      header={<Header />}\n      id=\"confirm\"\n      onClose={handleClose}\n      width={1}\n    >\n      <Box paddingX={4} paddingY={4}>\n        <Stack gap={3}>\n          {dialog?.title && <Text size={1}>{dialog.title}</Text>}\n          {dialog?.description && (\n            <Text muted size={1}>\n              <em>{dialog.description}</em>\n            </Text>\n          )}\n        </Stack>\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogConfirm\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderCreateProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFolderCreateProps\n}\n\nconst DialogFolderCreate = (props: Props) => {\n  const {\n    children,\n    dialog: {parentFolderId, id},\n  } = props\n\n  const dispatch = useDispatch()\n  const creating = useTypedSelector((state) => state.folders.creating)\n  const creatingError = useTypedSelector((state) => state.folders.creatingError)\n  const parentPath = useTypedSelector((state) => selectFolderPathById(state, parentFolderId))\n\n  const {\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    setError,\n  } = useForm<FolderFormData>({\n    defaultValues: {\n      name: '',\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n  })\n\n  const handleClose = () => {\n    dispatch(dialogActions.clear())\n  }\n\n  const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      foldersActions.createRequest({\n        name: sanitizedFormData['name'],\n        parentId: parentFolderId || null,\n      }),\n    )\n  }\n\n  useEffect(() => {\n    if (creatingError) {\n      setError('name', {message: creatingError.message})\n    }\n  }, [creatingError, setError])\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"flex-end\">\n        <FormSubmitButton\n          disabled={creating || !isDirty || !isValid}\n          isValid={isValid}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Create Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {parentPath && (\n          <Box marginBottom={3}>\n            <Text muted size={1}>\n              Creating inside {parentPath}\n            </Text>\n          </Box>\n        )}\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={creating}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolderCreate\n","import {Box, Button, Flex, Inline, Stack, Text, Tree, TreeItem} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {type ReactNode, useMemo, useState} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectFolderTree} from '../../modules/folders'\nimport type {DialogFolderMoveProps, FolderTreeNode} from '../../types'\nimport Dialog from '../Dialog'\n\nconst getExpandedIdSet = (\n  folderId: string | null,\n  byId: Record<string, {parentId: string | null}>,\n) => {\n  const expanded = new Set<string>()\n  let cursor: string | null = folderId\n  while (cursor) {\n    const node = byId[cursor]\n    if (!node) break\n    expanded.add(cursor)\n    cursor = node.parentId\n  }\n  return expanded\n}\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFolderMoveProps\n}\n\ntype FolderNodeProps = {\n  expandedIds: Set<string>\n  node: FolderTreeNode\n  onSelect: (folderId: string) => void\n  selectedId: string | null\n}\n\nconst FolderNode = ({expandedIds, node, onSelect, selectedId}: FolderNodeProps) => {\n  const hasChildren = node.children.length > 0\n  const selected = selectedId === node.id\n\n  return (\n    <TreeItem\n      expanded={expandedIds.has(node.id)}\n      id={node.id}\n      onClick={() => onSelect(node.id)}\n      selected={selected}\n      text={`${node.name} (${node.totalCount})`}\n      weight={selected ? 'semibold' : 'medium'}\n    >\n      {hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n            selectedId={selectedId}\n          />\n        ))}\n    </TreeItem>\n  )\n}\n\ntype FolderTreeProps = {\n  expandedIds: Set<string>\n  folderTree: FolderTreeNode[]\n  onSelect: (folderId: string) => void\n  selectedId: string | null\n}\n\nconst FolderTree = ({expandedIds, folderTree, onSelect, selectedId}: FolderTreeProps) => (\n  <Tree gap={1}>\n    {folderTree.map((node) => (\n      <FolderNode\n        expandedIds={expandedIds}\n        key={node.id}\n        node={node}\n        onSelect={onSelect}\n        selectedId={selectedId}\n      />\n    ))}\n  </Tree>\n)\n\nconst DialogFolderMove = ({children, dialog}: Props) => {\n  const dispatch = useDispatch()\n  const folderTree = useTypedSelector(selectFolderTree)\n  const byId = useTypedSelector((state) => state.folders.byId)\n  const {assets, folderId, id} = dialog\n  const [selectedId, setSelectedId] = useState<string | null>(folderId || null)\n  const selectedFolder = selectedId ? byId[selectedId] : null\n  const expandedIds = useMemo(() => getExpandedIdSet(folderId || null, byId), [byId, folderId])\n\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id}))\n  }\n\n  const handleMove = () => {\n    if (!selectedId) {\n      return\n    }\n\n    dispatch(\n      assetsActions.folderSetRequest({\n        assets,\n        closeDialogId: id,\n        folderId: selectedId,\n      }),\n    )\n  }\n\n  return (\n    <Dialog\n      animate\n      footer={\n        <Box padding={3}>\n          <Flex justify=\"flex-end\" gap={2}>\n            <Button mode=\"ghost\" onClick={handleClose} text=\"Cancel\" />\n            <Button\n              disabled={!selectedId}\n              mode=\"default\"\n              onClick={handleMove}\n              text={`Move ${assets.length} ${pluralize('asset', assets.length)}`}\n              tone=\"primary\"\n            />\n          </Flex>\n        </Box>\n      }\n      header=\"Move to Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Stack gap={4} padding={4}>\n        <Text size={1}>\n          Move {assets.length} {pluralize('asset', assets.length)} to a folder.\n        </Text>\n\n        <Box style={{maxHeight: '22rem', overflowY: 'auto'}} paddingY={2}>\n          <FolderTree\n            expandedIds={expandedIds}\n            folderTree={folderTree}\n            onSelect={setSelectedId}\n            selectedId={selectedId}\n          />\n\n          {folderTree.length === 0 && (\n            <Box marginTop={3}>\n              <Text muted size={1}>\n                No folders yet.\n              </Text>\n            </Box>\n          )}\n        </Box>\n\n        {selectedFolder && (\n          <Inline gap={2}>\n            <Text muted size={1}>\n              Destination:\n            </Text>\n            <Text size={1} weight=\"semibold\">\n              {selectedFolder.name}\n            </Text>\n          </Inline>\n        )}\n      </Stack>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolderMove\n","import {Box, Flex, Text} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {folderFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions, selectFolderPathById} from '../../modules/folders'\nimport type {DialogFolderRenameProps, FolderFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFolderRenameProps\n}\n\nconst DialogFolderRename = ({children, dialog}: Props) => {\n  const {folderId, id} = dialog\n  const dispatch = useDispatch()\n  const renaming = useTypedSelector((state) => state.folders.renaming)\n  const renameError = useTypedSelector((state) => state.folders.renameError)\n  const folder = useTypedSelector((state) => state.folders.byId[folderId])\n  const folderPath = useTypedSelector((state) => selectFolderPathById(state, folderId))\n  const currentName = folder?.name || ''\n  const parentPath = folderPath.includes('/')\n    ? folderPath.slice(0, folderPath.lastIndexOf('/'))\n    : null\n\n  const {\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    setError,\n  } = useForm<FolderFormData>({\n    defaultValues: {\n      name: currentName,\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<FolderFormData>(folderFormSchema),\n  })\n\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id}))\n  }\n\n  const onSubmit: SubmitHandler<FolderFormData> = (formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      foldersActions.renameRequest({\n        name: sanitizedFormData['name'],\n        folderId,\n      }),\n    )\n  }\n\n  useEffect(() => {\n    if (renameError) {\n      setError('name', {message: renameError.message})\n    }\n  }, [renameError, setError])\n\n  return (\n    <Dialog\n      animate\n      footer={\n        <Box padding={3}>\n          <Flex justify=\"flex-end\">\n            <FormSubmitButton\n              disabled={renaming || !isDirty || !isValid}\n              isValid={isValid}\n              onClick={handleSubmit(onSubmit)}\n            />\n          </Flex>\n        </Box>\n      }\n      header=\"Rename Folder\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        <Box marginBottom={3}>\n          <Text muted size={1}>\n            {parentPath ? `Renaming inside ${parentPath}` : 'Renaming at root'}\n          </Text>\n        </Box>\n\n        <FormFieldInputText\n          {...register('name')}\n          disabled={renaming}\n          error={errors?.name?.message}\n          label=\"Folder name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolderRename\n","import {AddIcon} from '@sanity/icons/Add'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {FolderIcon} from '@sanity/icons/Folder'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Inline, Label, Text, Tree, TreeItem} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode, useMemo} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {foldersActions, selectCanDeleteFolder, selectFolderTree} from '../../modules/folders'\nimport type {FolderTreeNode} from '../../types'\n\nconst getExpandedIdSet = (\n  folderId: string | null,\n  byId: Record<string, {parentId: string | null}>,\n) => {\n  const expanded = new Set<string>()\n  let cursor: string | null = folderId\n  while (cursor) {\n    const node = byId[cursor]\n    if (!node) break\n    expanded.add(cursor)\n    cursor = node.parentId\n  }\n  return expanded\n}\n\ntype FolderNodeProps = {\n  currentFolderId: string | null\n  expandedIds: Set<string>\n  node: FolderTreeNode\n  onSelect: (folderId: string) => void\n}\n\ntype FolderHeaderActionProps = {\n  disabled?: boolean\n  icon: ReactNode\n  onClick: () => void\n  tone?: 'critical' | 'default' | 'primary'\n  tooltip: string\n}\n\nconst FolderHeaderAction = ({\n  disabled = false,\n  icon,\n  onClick,\n  tone = 'default',\n  tooltip,\n}: FolderHeaderActionProps) => (\n  <Tooltip\n    animate\n    content={\n      <Container padding={2} width={0}>\n        <Text muted size={1}>\n          {tooltip}\n        </Text>\n      </Container>\n    }\n    disabled={typeof window !== 'undefined' && 'ontouchstart' in window}\n    placement=\"top\"\n    portal\n  >\n    <Button\n      aria-label={tooltip}\n      disabled={disabled}\n      fontSize={1}\n      icon={icon}\n      mode=\"bleed\"\n      onClick={onClick}\n      padding={2}\n      tone={tone}\n    />\n  </Tooltip>\n)\n\ntype FolderItemTextProps = {\n  name: string\n  totalCount: number\n}\n\n/**\n * this uses some hacky css to get the desired layout\n * The tree item is a text container, so we need to use a span to wrap the content\n */\nconst FolderItemText = ({name, totalCount}: FolderItemTextProps) => (\n  <span\n    style={{\n      boxSizing: 'border-box',\n      display: 'block',\n      maxWidth: '100%',\n      minWidth: 0,\n      overflow: 'hidden',\n      paddingRight: '2rem',\n      position: 'relative',\n      width: '100%',\n    }}\n  >\n    <span\n      style={{\n        alignItems: 'center',\n        display: 'flex',\n        paddingLeft: '0.25rem',\n        gap: '0.5rem',\n        minWidth: 0,\n        overflow: 'hidden',\n      }}\n    >\n      <span style={{display: 'inline-flex', flexShrink: 0, lineHeight: 0}}>\n        <FolderIcon />\n      </span>\n      <span\n        style={{\n          display: 'block',\n          minWidth: 0,\n          overflow: 'hidden',\n          textOverflow: 'ellipsis',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        {name}\n      </span>\n    </span>\n    <span\n      style={{\n        fontSize: '0.75rem',\n        opacity: 0.78,\n        position: 'absolute',\n        right: 0,\n        top: '50%',\n        transform: 'translateY(-50%)',\n      }}\n    >\n      {totalCount}\n    </span>\n  </span>\n)\n\nconst FolderNode = ({currentFolderId, expandedIds, node, onSelect}: FolderNodeProps) => {\n  const hasChildren = node.children.length > 0\n  const selected = currentFolderId === node.id\n\n  return (\n    <TreeItem\n      expanded={expandedIds.has(node.id)}\n      id={node.id}\n      onClick={() => onSelect(node.id)}\n      selected={selected}\n      text={<FolderItemText name={node.name} totalCount={node.totalCount} />}\n      weight={selected ? 'semibold' : 'medium'}\n    >\n      {hasChildren &&\n        node.children.map((childNode) => (\n          <FolderNode\n            currentFolderId={currentFolderId}\n            expandedIds={expandedIds}\n            key={childNode.id}\n            node={childNode}\n            onSelect={onSelect}\n          />\n        ))}\n    </TreeItem>\n  )\n}\n\nconst FolderView = () => {\n  const dispatch = useDispatch()\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const byId = useTypedSelector((state) => state.folders.byId)\n  const canDeleteFolder = useTypedSelector(selectCanDeleteFolder)\n  const fetching = useTypedSelector((state) => state.folders.fetching)\n  const folderTree = useTypedSelector(selectFolderTree)\n  const currentFolder = currentFolderId ? byId[currentFolderId] : null\n  const expandedIds = useMemo(\n    () => getExpandedIdSet(currentFolderId, byId),\n    [byId, currentFolderId],\n  )\n  const treeKey = useMemo(() => Array.from(expandedIds).join('|') || 'root', [expandedIds])\n\n  const hasFolders = folderTree.length > 0\n\n  const handleFolderSelect = (folderId: string) => {\n    dispatch(foldersActions.currentFolderSet({folderId}))\n  }\n\n  const handleFolderDelete = () => {\n    if (!currentFolderId || !currentFolder) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteFolder({\n        folderId: currentFolderId,\n        folderName: currentFolder.name,\n      }),\n    )\n  }\n\n  return (\n    <Flex direction=\"column\" flex={1} height=\"fill\">\n      <Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingX={3}\n        style={{\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Box flex={1}>\n          <Inline gap={2}>\n            <Label size={0}>Folders</Label>\n            {fetching && (\n              <Label size={0} style={{opacity: 0.3}}>\n                Loading...\n              </Label>\n            )}\n          </Inline>\n        </Box>\n\n        <Inline gap={1}>\n          {currentFolderId && (\n            <FolderHeaderAction\n              icon={<EditIcon />}\n              onClick={() => dispatch(DIALOG_ACTIONS.showFolderRename({folderId: currentFolderId}))}\n              tone=\"primary\"\n              tooltip=\"Rename folder\"\n            />\n          )}\n\n          <FolderHeaderAction\n            icon={<AddIcon />}\n            onClick={() =>\n              dispatch(DIALOG_ACTIONS.showFolderCreate({parentFolderId: currentFolderId || null}))\n            }\n            tone=\"primary\"\n            tooltip=\"Create folder\"\n          />\n\n          {currentFolderId && canDeleteFolder && (\n            <FolderHeaderAction\n              icon={<TrashIcon />}\n              onClick={handleFolderDelete}\n              tone=\"critical\"\n              tooltip=\"Delete folder\"\n            />\n          )}\n        </Inline>\n      </Flex>\n\n      <Box padding={2}>\n        <Box>\n          <Tree gap={1} key={treeKey}>\n            <TreeItem\n              id=\"__all-assets\"\n              onClick={() => dispatch(foldersActions.currentFolderClear())}\n              selected={currentFolderId === null}\n              text=\"All assets\"\n              weight={currentFolderId === null ? 'semibold' : 'medium'}\n            />\n\n            {folderTree.map((node) => (\n              <FolderNode\n                currentFolderId={currentFolderId}\n                expandedIds={expandedIds}\n                key={node.id}\n                node={node}\n                onSelect={handleFolderSelect}\n              />\n            ))}\n          </Tree>\n\n          {!hasFolders && !fetching && (\n            <Box marginTop={3} paddingX={1}>\n              <Text muted size={1}>\n                <em>No folders</em>\n              </Text>\n            </Box>\n          )}\n        </Box>\n      </Box>\n    </Flex>\n  )\n}\n\nexport default FolderView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogFoldersProps} from '../../types'\nimport Dialog from '../Dialog'\nimport FolderView from '../FolderView'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogFoldersProps\n}\n\nconst DialogFolders = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  const dispatch = useDispatch()\n\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog animate header=\"Folders\" id={id} onClose={handleClose} width={1}>\n      <Box\n        style={{\n          height: '100%',\n          minHeight: '420px',\n        }}\n      >\n        <FolderView />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogFolders\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Flex, Label, rem, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  children: ReactNode\n  facet: WithId<SearchFacetInputProps>\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst Container = styled<typeof Box, {$scheme: ThemeColorSchemeKey}>(Box)(({$scheme, theme}) => {\n  return css`\n    background: ${getSchemeColor($scheme, 'bg')};\n    border-radius: ${\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      rem(theme.sanity.radius[2]!)\n    };\n  `\n})\n\nconst SearchFacet = (props: Props) => {\n  const {children, facet} = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n\n  const handleClose = () => {\n    dispatch(searchActions.facetsRemoveById({facetId: facet.id}))\n  }\n\n  return (\n    <Container padding={[2, 2, 1]} $scheme={scheme}>\n      <Flex align={['flex-start', 'flex-start', 'center']} direction={['column', 'column', 'row']}>\n        {/* Title */}\n        <Box paddingBottom={[3, 3, 0]} paddingLeft={1} paddingRight={2} paddingTop={[1, 1, 0]}>\n          <Label\n            size={0}\n            style={{\n              whiteSpace: 'nowrap',\n            }}\n          >\n            {facet.title}\n          </Label>\n        </Box>\n\n        <Flex align=\"center\">\n          {children}\n\n          {/* Close button */}\n          <Box marginLeft={1} paddingX={2}>\n            <Text muted size={0}>\n              <CloseIcon onClick={handleClose} />\n            </Text>\n          </Box>\n        </Flex>\n      </Flex>\n    </Container>\n  )\n}\n\nexport default SearchFacet\n","import {TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\n\n// TODO: use correct type\ntype Props = any & {\n  onValueChange: (value: number) => void\n  value?: number\n}\n\nconst TextInputNumber = (props: Props) => {\n  const {onValueChange, value, ...remainingProps} = props\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    const val = e.target.value\n    const regex = /^[0-9\\b]+$/\n\n    // Test for number and strip leading zeroes\n    if (val === '' || regex.test(val)) {\n      onValueChange(parseInt(val, 10) || '')\n    }\n  }\n\n  return (\n    <TextInput\n      {...remainingProps}\n      onChange={handleChange} //\n      value={value ?? ''}\n    />\n  )\n}\n\nexport default TextInputNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n  SearchFacetInputNumberModifier,\n  SearchFacetInputNumberProps,\n  SearchFacetOperatorType,\n  WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\nimport TextInputNumber from '../TextInputNumber'\n\ntype Props = {\n  facet: WithId<SearchFacetInputNumberProps>\n}\n\nconst SearchFacetNumber = ({facet}: Props) => {\n  // Redux\n  const dispatch = useDispatch()\n\n  const popoverProps = usePortalPopoverProps()\n\n  const modifiers = facet?.modifiers\n  const selectedModifier = facet?.modifier\n    ? modifiers?.find((modifier) => modifier.name === facet?.modifier)\n    : modifiers?.[0]\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n  }\n\n  const handleModifierClick = (modifier: SearchFacetInputNumberModifier) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, modifier: modifier.name}))\n  }\n\n  const handleValueChange = (value: number) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, value}))\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet.operatorType ?? 'greaterThan'\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      <Box marginX={1} style={{maxWidth: '50px'}}>\n        <TextInputNumber\n          fontSize={1}\n          onValueChange={handleValueChange}\n          padding={2}\n          radius={2}\n          width={2}\n          value={facet?.value}\n        />\n      </Box>\n\n      {/* Modifiers */}\n      {modifiers && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={selectedModifier?.title}\n            />\n          }\n          id=\"modifier\"\n          menu={\n            <Menu>\n              {modifiers.map((modifier) => {\n                const selected = modifier.name === facet.modifier\n                return (\n                  <MenuItem\n                    disabled={selected}\n                    fontSize={1}\n                    key={modifier.name}\n                    onClick={() => handleModifierClick(modifier)}\n                    padding={2}\n                    text={modifier.title}\n                  />\n                )\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetNumber\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {\n  SearchFacetInputSelectListItemProps,\n  SearchFacetInputSelectProps,\n  SearchFacetOperatorType,\n  WithId,\n} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n  facet: WithId<SearchFacetInputSelectProps>\n}\n\nconst SearchFacetSelect = ({facet}: Props) => {\n  // Redux\n  const dispatch = useDispatch()\n\n  const popoverProps = usePortalPopoverProps()\n\n  const options = facet?.options\n\n  const selectedItem = options?.find((v) => v.name === facet?.value)\n\n  const handleListItemClick = (option: SearchFacetInputSelectListItemProps) => {\n    dispatch(searchActions.facetsUpdate({name: facet.name, value: option.name}))\n  }\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdate({name: facet.name, operatorType}))\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet?.operatorType ?? 'is'\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Box marginRight={1}>\n              <Button\n                fontSize={1}\n                iconRight={SelectIcon}\n                padding={2}\n                text={operators[selectedOperatorType].label}\n              />\n            </Box>\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* List */}\n      <MenuButton\n        button={\n          <Button fontSize={1} iconRight={SelectIcon} padding={2} text={selectedItem?.title} />\n        }\n        id=\"list\"\n        menu={\n          <Menu>\n            {options?.map((item) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(item)}\n                  padding={2}\n                  text={item.title}\n                />\n              )\n            })}\n          </Menu>\n        }\n        popover={popoverProps}\n      />\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetSelect\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button, TextInput} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetInputStringProps, SearchFacetOperatorType, WithId} from '../../types'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n  facet: WithId<SearchFacetInputStringProps>\n}\n\nconst SearchFacetString = ({facet}: Props) => {\n  // Redux\n  const dispatch = useDispatch()\n\n  const popoverProps = usePortalPopoverProps()\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, operatorType}))\n  }\n\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    dispatch(searchActions.facetsUpdateById({id: facet.id, value: e.target.value}))\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      {!operators[selectedOperatorType].hideInput && (\n        <Box marginLeft={1} style={{maxWidth: '125px'}}>\n          <TextInput\n            fontSize={1}\n            onChange={handleChange}\n            padding={2}\n            radius={2}\n            width={2}\n            value={facet?.value}\n          />\n        </Box>\n      )}\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetString\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Card, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst {fonts, radius: themeRadius, space: themeSpace} = studioTheme\nconst themeTextSizes = fonts.text.sizes\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nexport const reactSelectStyles = (scheme: ThemeColorSchemeKey): StylesConfig => {\n  return {\n    control: (styles, {isDisabled, isFocused}) => {\n      let boxShadow = `inset 0 0 0 1px var(--card-border-color)`\n      if (isFocused) {\n        boxShadow = `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputEnabledBorder')},\n        0 0 0 1px ${getSchemeColor(scheme, 'bg2')},\n        0 0 0 3px var(--card-focus-ring-color) !important`\n      }\n\n      return {\n        ...styles,\n        'backgroundColor': 'var(--card-bg-color)',\n        'color': 'inherit',\n        'border': 'none',\n        'borderRadius': themeRadius[2],\n        boxShadow,\n        'fontSize': themeTextSizes[1]!.fontSize,\n        'minHeight': '25px',\n        'opacity': isDisabled ? 0.5 : 'inherit',\n        'outline': 'none',\n        'transition': 'none',\n        '&:hover': {\n          boxShadow: `inset 0 0 0 1px ${getSchemeColor(scheme, 'inputHoveredBorder')}`,\n        },\n      }\n    },\n    input: (styles) => ({\n      ...styles,\n      color: 'var(--card-fg-color)',\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      fontSize: themeTextSizes[1]!.fontSize,\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    menuList: (styles) => ({\n      ...styles,\n      padding: 0,\n    }),\n    noOptionsMessage: (styles) => ({\n      ...styles,\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      fontFamily: studioTheme.fonts.text.family,\n      fontSize: themeTextSizes[1]!.fontSize,\n      lineHeight: '1em',\n    }),\n    option: (styles, {isFocused}) => ({\n      ...styles,\n      'backgroundColor': isFocused ? getSchemeColor(scheme, 'spotBlue') : 'transparent',\n      'borderRadius': themeRadius[2],\n      'color': isFocused ? getSchemeColor(scheme, 'bg') : 'inherit',\n      'fontSize': themeTextSizes[1]!.fontSize,\n      'lineHeight': '1em',\n      'margin': 0,\n      'padding': rem(themeSpace[1]!),\n      '&:hover': {\n        backgroundColor: getSchemeColor(scheme, 'spotBlue'),\n        color: getSchemeColor(scheme, 'bg'),\n      },\n    }),\n    placeholder: (styles) => ({\n      ...styles,\n      fontSize: themeTextSizes[1]!.fontSize,\n      marginLeft: rem(themeSpace[2]!),\n      paddingLeft: 0,\n    }),\n    singleValue: (styles) => ({\n      ...styles,\n      alignItems: 'center',\n      display: 'inline-flex',\n      height: '100%',\n      marginLeft: rem(themeSpace[2]!),\n    }),\n    valueContainer: (styles) => ({\n      ...styles,\n      margin: 0,\n      padding: 0,\n    }),\n  }\n}\n\nconst ClearIndicator = (props: any) => {\n  return (\n    <components.ClearIndicator {...props}>\n      <Box\n        paddingRight={1}\n        style={{\n          transform: 'scale(0.85)',\n        }}\n      >\n        <Text muted size={0}>\n          <CloseIcon />\n        </Text>\n      </Box>\n    </components.ClearIndicator>\n  )\n}\n\nconst Menu = (props: any) => {\n  return (\n    <components.Menu {...props}>\n      <Card radius={1} shadow={2}>\n        {props.children}\n      </Card>\n    </components.Menu>\n  )\n}\n\nconst MenuList = (props: any) => {\n  const {children} = props\n\n  const MAX_ROWS = 5\n  const OPTION_HEIGHT = 33\n\n  if (Array.isArray(children)) {\n    const height =\n      children.length > MAX_ROWS ? OPTION_HEIGHT * MAX_ROWS : children.length * OPTION_HEIGHT\n\n    return (\n      <Virtuoso\n        className=\"media__custom-scrollbar\"\n        itemContent={(index) => {\n          const item = children[index]\n          return <Option {...item.props} />\n        }}\n        style={{height}}\n        totalCount={children.length}\n      />\n    )\n  }\n  return <components.MenuList {...props}>{children}</components.MenuList>\n}\n\nconst NoOptionsMessage = (props: any) => {\n  return <components.NoOptionsMessage {...props}>{props.children}</components.NoOptionsMessage>\n}\n\nconst Option = (props: any) => {\n  return (\n    <Box padding={1}>\n      <components.Option {...props}>\n        <Box paddingY={1}>\n          <Text size={1} style={{color: 'inherit'}} textOverflow=\"ellipsis\">\n            {props.children}\n          </Text>\n        </Box>\n      </components.Option>\n    </Box>\n  )\n}\n\nconst SingleValue = (props: any) => {\n  return (\n    <components.SingleValue {...props}>\n      <Text size={1} textOverflow=\"ellipsis\">\n        {props.children}\n      </Text>\n    </components.SingleValue>\n  )\n}\n\nexport const reactSelectComponents = {\n  ClearIndicator,\n  DropdownIndicator: null,\n  IndicatorSeparator: null,\n  Menu,\n  MenuList,\n  NoOptionsMessage,\n  Option,\n  SingleValue,\n}\n","import {SelectIcon} from '@sanity/icons/Select'\nimport {Box, Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\nimport Select from 'react-select'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {operators} from '../../config/searchFacets'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport {selectTags} from '../../modules/tags'\nimport {reactSelectComponents, reactSelectStyles} from '../../styled/react-select/single'\nimport type {\n  TagSelectOption,\n  SearchFacetInputSearchableProps,\n  SearchFacetOperatorType,\n  WithId,\n} from '../../types'\nimport getTagSelectOptions from '../../utils/getTagSelectOptions'\nimport SearchFacet from '../SearchFacet'\n\ntype Props = {\n  facet: WithId<SearchFacetInputSearchableProps>\n}\n\nconst SearchFacetTags = ({facet}: Props) => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const {excludeTagSlugs} = useToolOptions()\n  const tagsAll = useTypedSelector((state) => selectTags(state))\n  const tags =\n    excludeTagSlugs.length > 0\n      ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n      : tagsAll\n  const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n  const allTagOptions = getTagSelectOptions(tags)\n\n  const popoverProps = usePortalPopoverProps()\n\n  const handleChange = (option: TagSelectOption) => {\n    dispatch(\n      searchActions.facetsUpdateById({\n        id: facet.id,\n        value: option,\n      }),\n    )\n  }\n\n  const handleOperatorItemClick = (operatorType: SearchFacetOperatorType) => {\n    dispatch(\n      searchActions.facetsUpdateById({\n        id: facet.id,\n        operatorType,\n      }),\n    )\n  }\n\n  const selectedOperatorType: SearchFacetOperatorType = facet.operatorType\n\n  return (\n    <SearchFacet facet={facet}>\n      {/* Optional operators */}\n      {facet?.operatorTypes && (\n        <MenuButton\n          button={\n            <Button\n              fontSize={1}\n              iconRight={SelectIcon}\n              padding={2}\n              text={operators[selectedOperatorType].label}\n            />\n          }\n          id=\"operators\"\n          menu={\n            <Menu>\n              {facet.operatorTypes.map((operatorType, index) => {\n                if (operatorType) {\n                  const selected = operatorType === selectedOperatorType\n                  return (\n                    <MenuItem\n                      disabled={selected}\n                      fontSize={1}\n                      key={operatorType}\n                      onClick={() => handleOperatorItemClick(operatorType)}\n                      padding={2}\n                      gap={4}\n                      style={{minWidth: '150px'}}\n                      text={operators[operatorType].label}\n                    />\n                  )\n                }\n\n                return <MenuDivider key={index} />\n              })}\n            </Menu>\n          }\n          popover={popoverProps}\n        />\n      )}\n\n      {/* Value */}\n      {!operators[selectedOperatorType].hideInput && (\n        <Box marginX={1} style={{width: '160px'}}>\n          <Select\n            components={reactSelectComponents}\n            instanceId=\"facet-searchable\"\n            isClearable\n            isDisabled={tagsFetching}\n            isSearchable\n            name=\"tags\"\n            noOptionsMessage={() => 'No tags'}\n            onChange={(value: any) => handleChange(value as TagSelectOption)}\n            options={allTagOptions}\n            placeholder={tagsFetching ? 'Loading...' : 'Select...'}\n            styles={reactSelectStyles(scheme)}\n            value={facet?.value}\n          />\n        </Box>\n      )}\n    </SearchFacet>\n  )\n}\n\nexport default SearchFacetTags\n","import {Box, Flex, Inline, rem, type Theme} from '@sanity/ui'\nimport {styled, css} from 'styled-components'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport SearchFacetNumber from '../SearchFacetNumber'\nimport SearchFacetSelect from '../SearchFacetSelect'\nimport SearchFacetString from '../SearchFacetString'\nimport SearchFacetTags from '../SearchFacetTags'\n\ntype Props = {\n  layout?: 'inline' | 'stack'\n}\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst StackContainer = styled(Flex)(({theme}: {theme: Theme}) => {\n  return css`\n    > * {\n      margin-bottom: ${rem(\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.space[2]!,\n      )};\n    }\n  `\n})\n\nconst SearchFacets = (props: Props) => {\n  const {layout = 'inline'} = props\n\n  // Redux\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n\n  const Items = searchFacets.map((facet) => {\n    const key = facet.id\n    if (facet.type === 'number') {\n      return <SearchFacetNumber facet={facet} key={key} />\n    }\n\n    if (facet.type === 'searchable') {\n      return <SearchFacetTags facet={facet} key={key} />\n    }\n\n    if (facet.type === 'select') {\n      return <SearchFacetSelect facet={facet} key={key} />\n    }\n\n    if (facet.type === 'string') {\n      return <SearchFacetString facet={facet} key={key} />\n    }\n\n    return null\n  })\n\n  if (layout === 'inline') {\n    if (searchFacets.length === 0) {\n      return null\n    }\n\n    return (\n      <Box marginBottom={2}>\n        <Inline gap={2}>{Items}</Inline>\n      </Box>\n    )\n  }\n\n  if (layout === 'stack') {\n    return (\n      <StackContainer align=\"flex-start\" direction=\"column\">\n        {Items}\n      </StackContainer>\n    )\n  }\n\n  throw Error('Invalid layout')\n}\n\nexport default SearchFacets\n","import {AddIcon} from '@sanity/icons/Add'\nimport {Button, Flex} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuGroup, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {FACETS} from '../../constants'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport type {SearchFacetDivider, SearchFacetGroup, SearchFacetInputProps} from '../../types'\n\nconst SearchFacetsControl = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n  const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n  const popoverProps = usePortalPopoverProps()\n\n  const {creditLine} = useToolOptions()\n\n  const isTool = !selectedDocument\n\n  const filteredFacets = FACETS\n    // Filter facets based on current context, whether it's invoked as a tool, or via selection through via custom asset source.\n    .filter((facet) => {\n      // Remove credit line filter if it's not enabled\n      if (!creditLine?.enabled && facet?.type === 'string' && facet?.name === 'creditLine') {\n        return false\n      }\n\n      if (facet.type === 'group' || facet.type === 'divider') {\n        return true\n      }\n\n      if (isTool) {\n        return !facet?.selectOnly\n      }\n\n      const matchingAssetTypes = facet.assetTypes.filter((assetType) =>\n        assetTypes.includes(assetType),\n      )\n      return matchingAssetTypes.length > 0\n    })\n    // Remove adjacent and leading / trailing dividers\n    .filter((facet, index, facets) => {\n      const previousFacet = facets[index - 1]\n      // Ignore leading + trailing dividers\n      if (facet.type === 'divider' && (index === 0 || index === facets.length - 1)) {\n        return false\n      }\n      // Ignore adjacent dividers\n      if (facet.type === 'divider' && previousFacet?.type === 'divider') {\n        return false\n      }\n      return true\n    })\n\n  const hasSearchFacets = filteredFacets.length > 0\n\n  const renderMenuFacets = (\n    facets: (SearchFacetDivider | SearchFacetGroup | SearchFacetInputProps)[],\n    level: number = 0,\n  ) => {\n    return (\n      <>\n        {facets?.map((facet, index) => {\n          if (facet.type === 'divider') {\n            return <MenuDivider key={index} />\n          }\n\n          // Recursively render menu facets\n          if (facet.type === 'group') {\n            return (\n              <MenuGroup key={`group-${level}-${index}`} text={facet.title} title={facet.title}>\n                {renderMenuFacets(facet.facets, level + 1)}\n              </MenuGroup>\n            )\n          }\n\n          if (facet) {\n            const disabled =\n              !facet.operatorTypes && !!searchFacets.find((v) => v.name === facet.name)\n\n            return (\n              <MenuItem\n                disabled={disabled}\n                fontSize={1}\n                key={facet.name}\n                onClick={() => dispatch(searchActions.facetsAdd({facet}))}\n                padding={2}\n                text={facet.title}\n              />\n            )\n          }\n\n          return null\n        })}\n      </>\n    )\n  }\n\n  return (\n    <Flex>\n      {/* Add filter button */}\n      <MenuButton\n        button={\n          <Button\n            disabled={!hasSearchFacets}\n            fontSize={1}\n            icon={AddIcon}\n            mode=\"bleed\"\n            gap={2}\n            text=\"Add filter\"\n            tone=\"primary\"\n          />\n        }\n        id=\"facets\"\n        menu={<Menu>{renderMenuFacets(filteredFacets)}</Menu>}\n        popover={{\n          ...popoverProps,\n          placement: 'right-start',\n        }}\n      />\n\n      {/* Clear facets button */}\n      {searchFacets.length > 0 && (\n        <Button\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={() => dispatch(searchActions.facetsClear())}\n          text=\"Clear\"\n        />\n      )}\n    </Flex>\n  )\n}\n\nexport default SearchFacetsControl\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogSearchFacetsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogSearchFacetsProps\n}\n\nconst DialogSearchFacets = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog animate header=\"Filters\" id={id} onClose={handleClose} width={1}>\n      <Box padding={3}>\n        <SearchFacets layout=\"stack\" />\n        <SearchFacetsControl />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogSearchFacets\n","import {Box, Flex} from '@sanity/ui'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {tagsActions} from '../../modules/tags'\nimport type {DialogTagCreateProps, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogTagCreateProps\n}\n\nconst DialogTagCreate = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  const dispatch = useDispatch()\n\n  const creating = useTypedSelector((state) => state.tags.creating)\n  const creatingError = useTypedSelector((state) => state.tags.creatingError)\n\n  const {\n    // Read the formState before render to subscribe the form state through Proxy\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    setError,\n  } = useForm<TagFormData>({\n    defaultValues: {\n      name: '',\n    },\n    mode: 'onChange',\n    resolver: zodFormResolver<TagFormData>(tagFormSchema),\n  })\n\n  const formUpdating = creating\n\n  const handleClose = () => {\n    dispatch(dialogActions.clear())\n  }\n\n  // - submit react-hook-form\n  const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n    const sanitizedFormData = sanitizeFormData(formData)\n\n    dispatch(tagsActions.createRequest({name: sanitizedFormData['name']}))\n  }\n\n  useEffect(() => {\n    if (creatingError) {\n      setError('name', {\n        message: creatingError?.message,\n      })\n    }\n  }, [creatingError, setError])\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"flex-end\">\n        {/* Submit button */}\n        <FormSubmitButton\n          disabled={formUpdating || !isDirty || !isValid}\n          isValid={isValid}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Create Tag\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      {/* Form fields */}\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogTagCreate\n","import type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useState} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\n\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {dialogActions} from '../../modules/dialog'\nimport {selectTagById, tagsActions} from '../../modules/tags'\nimport type {DialogTagEditProps, Tag, TagFormData} from '../../types'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\nimport zodFormResolver from '../../utils/zodFormResolver'\nimport Dialog from '../Dialog'\nimport FormFieldInputText from '../FormFieldInputText'\nimport FormSubmitButton from '../FormSubmitButton'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogTagEditProps\n}\n\nconst DialogTagEdit = (props: Props) => {\n  const {\n    children,\n    dialog: {id, tagId},\n  } = props\n\n  const client = useVersionedClient()\n\n  const dispatch = useDispatch()\n  const tagItem = useTypedSelector((state) => selectTagById(state, String(tagId))) // TODO: double check string cast\n\n  // - Generate a snapshot of the current tag\n  const [tagSnapshot, setTagSnapshot] = useState(tagItem?.tag)\n\n  const currentTag = tagItem ? tagItem?.tag : tagSnapshot\n  const generateDefaultValues = useCallback(\n    (tag?: Tag) => ({\n      name: tag?.name?.current || '',\n    }),\n    [],\n  )\n\n  const {\n    // Read the formState before render to subscribe the form state through Proxy\n    formState: {errors, isDirty, isValid},\n    handleSubmit,\n    register,\n    reset,\n    setError,\n  } = useForm<TagFormData>({\n    defaultValues: generateDefaultValues(tagItem?.tag),\n    mode: 'onChange',\n    resolver: zodFormResolver<TagFormData>(tagFormSchema),\n  })\n\n  const formUpdating = !tagItem || tagItem?.updating\n\n  const handleClose = () => {\n    dispatch(dialogActions.remove({id}))\n  }\n\n  // Submit react-hook-form\n  const onSubmit: SubmitHandler<TagFormData> = (formData) => {\n    if (!tagItem?.tag) {\n      return\n    }\n    const sanitizedFormData = sanitizeFormData(formData)\n    dispatch(\n      tagsActions.updateRequest({\n        closeDialogId: tagItem?.tag?._id,\n        formData: {\n          name: {\n            _type: 'slug',\n            current: sanitizedFormData['name'],\n          },\n        },\n        tag: tagItem?.tag,\n      }),\n    )\n  }\n\n  const handleDelete = () => {\n    if (!tagItem?.tag) {\n      return\n    }\n\n    dispatch(\n      dialogActions.showConfirmDeleteTag({\n        closeDialogId: tagItem?.tag?._id,\n        tag: tagItem?.tag,\n      }),\n    )\n  }\n\n  const handleTagUpdate = useCallback(\n    (update: MutationEvent) => {\n      const {result, transition} = update\n      if (result && transition === 'update') {\n        // Regenerate snapshot\n        setTagSnapshot(result as Tag)\n        // Reset react-hook-form\n        reset(generateDefaultValues(result as Tag))\n      }\n    },\n    [reset, generateDefaultValues],\n  )\n\n  useEffect(() => {\n    if (tagItem?.error) {\n      setError('name', {\n        message: tagItem.error?.message,\n      })\n    }\n  }, [setError, tagItem?.error])\n\n  // - Listen for asset mutations and update snapshot\n  useEffect(() => {\n    if (!tagItem?.tag) {\n      return undefined\n    }\n\n    // Remember that Sanity listeners ignore joins, order clauses and projections\n    const subscriptionAsset = client\n      .listen(groq`*[_id == $id]`, {id: tagItem?.tag._id})\n      .subscribe(handleTagUpdate)\n\n    return () => {\n      subscriptionAsset?.unsubscribe()\n    }\n  }, [client, handleTagUpdate, tagItem?.tag])\n\n  const Footer = () => (\n    <Box padding={3}>\n      <Flex justify=\"space-between\">\n        {/* Delete button */}\n        <Button\n          disabled={formUpdating}\n          fontSize={1}\n          mode=\"bleed\"\n          onClick={handleDelete}\n          text=\"Delete\"\n          tone=\"critical\"\n        />\n\n        {/* Submit button */}\n        <FormSubmitButton\n          disabled={formUpdating || !isDirty || !isValid}\n          isValid={isValid}\n          lastUpdated={tagItem?.tag?._updatedAt}\n          onClick={handleSubmit(onSubmit)}\n        />\n      </Flex>\n    </Box>\n  )\n\n  if (!currentTag) {\n    return null\n  }\n\n  return (\n    <Dialog\n      animate\n      // oxlint-disable-next-line react/static-components\n      footer={<Footer />}\n      header=\"Edit Tag\"\n      id={id}\n      onClose={handleClose}\n      width={1}\n    >\n      {/* Form fields */}\n      <Box as=\"form\" padding={4} onSubmit={handleSubmit(onSubmit)}>\n        {/* Deleted notification */}\n        {!tagItem && (\n          <Card marginBottom={3} padding={3} radius={2} shadow={1} tone=\"critical\">\n            <Text size={1}>This tag cannot be found – it may have been deleted.</Text>\n          </Card>\n        )}\n\n        {/* Hidden button to enable enter key submissions */}\n        <button style={{display: 'none'}} tabIndex={-1} type=\"submit\" />\n\n        {/* Title */}\n        <FormFieldInputText\n          {...register('name')}\n          disabled={formUpdating}\n          error={errors?.name?.message}\n          label=\"Name\"\n          name=\"name\"\n        />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogTagEdit\n","import {ArrowDownIcon} from '@sanity/icons/ArrowDown'\nimport {ArrowUpIcon} from '@sanity/icons/ArrowUp'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {TrashIcon} from '@sanity/icons/Trash'\nimport {Box, Button, Container, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {inputs} from '../../config/searchFacets'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {searchActions, selectIsSearchFacetTag} from '../../modules/search'\nimport type {SearchFacetInputSearchableProps, TagActions, TagItem} from '../../types'\n\ntype Props = {\n  actions?: TagActions[]\n  tag: TagItem\n}\n\nconst TagContainer = styled(Flex)`\n  height: ${PANEL_HEIGHT}px;\n`\n\nconst ButtonContainer = styled(Flex)`\n  @media (pointer: fine) {\n    visibility: hidden;\n  }\n\n  @media (hover: hover) and (pointer: fine) {\n    ${TagContainer}:hover & {\n      visibility: visible;\n    }\n  }\n`\n\ntype TagButtonProps = {\n  disabled?: boolean\n  icon: ReactNode\n  onClick: () => void\n  tone?: 'critical' | 'primary'\n  tooltip: string\n}\n\nconst TagButton = (props: TagButtonProps) => {\n  const {disabled, icon, onClick, tone, tooltip} = props\n\n  return (\n    <Tooltip\n      animate\n      content={\n        <Container padding={2} width={0}>\n          <Text muted size={1}>\n            {tooltip}\n          </Text>\n        </Container>\n      }\n      disabled={'ontouchstart' in window}\n      placement=\"top\"\n      portal\n    >\n      <Button\n        disabled={disabled}\n        fontSize={1}\n        icon={icon}\n        mode=\"bleed\"\n        onClick={onClick}\n        padding={2}\n        tone={tone}\n      />\n    </Tooltip>\n  )\n}\n\nconst Tag = (props: Props) => {\n  const {actions, tag} = props\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const isSearchFacetTag = useTypedSelector((state) => selectIsSearchFacetTag(state, tag?.tag?._id))\n\n  // Callbacks\n  const handleSearchFacetTagRemove = () => {\n    dispatch(searchActions.facetsRemoveByTag({tagId: tag.tag._id}))\n  }\n\n  const handleShowAddTagToAssetsDialog = () => {\n    dispatch(dialogActions.showConfirmAssetsTagAdd({assetsPicked, tag: tag.tag}))\n  }\n\n  const handleShowRemoveTagFromAssetsDialog = () => {\n    dispatch(dialogActions.showConfirmAssetsTagRemove({assetsPicked, tag: tag.tag}))\n  }\n\n  const handleShowTagDeleteDialog = () => {\n    dispatch(dialogActions.showConfirmDeleteTag({tag: tag.tag}))\n  }\n\n  const handleShowTagEditDialog = () => {\n    dispatch(DIALOG_ACTIONS.showTagEdit({tagId: tag?.tag?._id}))\n  }\n\n  const handleSearchFacetTagAddOrUpdate = () => {\n    const searchFacet = {\n      ...inputs.tag,\n      value: {\n        label: tag?.tag?.name?.current,\n        value: tag?.tag?._id,\n      },\n    } as SearchFacetInputSearchableProps\n\n    if (isSearchFacetTag) {\n      dispatch(\n        searchActions.facetsUpdate({\n          name: 'tag',\n          operatorType: 'references',\n          value: searchFacet.value,\n        }),\n      )\n    } else {\n      dispatch(searchActions.facetsAdd({facet: searchFacet}))\n    }\n  }\n\n  return (\n    <TagContainer align=\"center\" flex={1} justify=\"space-between\" paddingLeft={3}>\n      <Box flex={1}>\n        <Text\n          muted\n          size={1}\n          style={{\n            opacity: tag?.updating ? 0.5 : 1.0,\n            userSelect: 'none',\n          }}\n          textOverflow=\"ellipsis\"\n        >\n          {tag?.tag?.name?.current}\n        </Text>\n      </Box>\n\n      <ButtonContainer align=\"center\" style={{flexShrink: 0}}>\n        {/* Search facet toggle */}\n        {actions?.includes('search') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={isSearchFacetTag ? <CloseIcon /> : <SearchIcon />}\n            onClick={\n              isSearchFacetTag ? handleSearchFacetTagRemove : handleSearchFacetTagAddOrUpdate\n            }\n            tooltip={isSearchFacetTag ? 'Remove filter' : 'Filter by tag'}\n          />\n        )}\n        {/* Edit icon */}\n        {actions?.includes('edit') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<EditIcon />}\n            onClick={handleShowTagEditDialog}\n            tone=\"primary\"\n            tooltip=\"Edit tag\"\n          />\n        )}\n        {/* Apply to all */}\n        {actions?.includes('applyAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowUpIcon />}\n            onClick={handleShowAddTagToAssetsDialog}\n            tone=\"primary\"\n            tooltip=\"Add tag to selected assets\"\n          />\n        )}\n        {/* Remove from all */}\n        {actions?.includes('removeAll') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<ArrowDownIcon />}\n            onClick={handleShowRemoveTagFromAssetsDialog}\n            tone=\"critical\"\n            tooltip=\"Remove tag from selected assets\"\n          />\n        )}\n\n        {/* Delete icon */}\n        {actions?.includes('delete') && (\n          <TagButton\n            disabled={tag?.updating}\n            icon={<TrashIcon />}\n            onClick={handleShowTagDeleteDialog}\n            tone=\"critical\"\n            tooltip=\"Delete tag\"\n          />\n        )}\n      </ButtonContainer>\n    </TagContainer>\n  )\n}\n\nexport default Tag\n","import {Flex, Label} from '@sanity/ui'\nimport {memo, useState} from 'react'\nimport {Virtuoso} from 'react-virtuoso'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport type {TagActions, TagItem} from '../../types'\nimport Tag from '../Tag'\n\nconst VirtualRow = memo(\n  ({\n    isScrolling,\n    item,\n  }: {\n    isScrolling?: boolean\n    item:\n      | string\n      | (TagItem & {\n          actions: TagActions[]\n        })\n  }) => {\n    // Render label\n    if (typeof item === 'string') {\n      return (\n        <Flex\n          align=\"center\"\n          justify=\"space-between\"\n          key={item}\n          paddingX={3}\n          style={{height: `${PANEL_HEIGHT}px`}}\n        >\n          <Label size={0}>{item}</Label>\n        </Flex>\n      )\n    }\n\n    // Render tag - only display actions if we're not in the process of scrolling\n    return <Tag actions={isScrolling ? undefined : item.actions} key={item.tag?._id} tag={item} />\n  },\n)\n\nconst TagsVirtualized = ({tags}: {tags: TagItem[]}) => {\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n\n  // State\n  const [isScrolling, setIsScrolling] = useState(false)\n\n  // TODO: refactor, there's most certainly a more performant way to do this\n\n  // Filter out all tag IDS used (across all) and dedupe\n  const pickedTagIds = assetsPicked?.reduce((acc: string[], val) => {\n    const assetTagIds = val?.asset?.opt?.media?.tags?.map((tag) => tag._ref) || []\n    acc = acc.concat(assetTagIds)\n    return acc\n  }, [])\n  const pickedTagIdsUnique = [...new Set(pickedTagIds)]\n\n  // Segment tags into two buckets:\n  // 1. those which exist in all picked assets ('applied to all')\n  // 2. those which exist in some picked assets ('applied to some')\n  const tagIdsSegmented = pickedTagIdsUnique.reduce(\n    (acc: {appliedToAll: string[]; appliedToSome: string[]}, tagId) => {\n      const tagIsInEveryAsset = assetsPicked.every((assetItem) => {\n        const tagIndex =\n          assetItem.asset.opt?.media?.tags?.findIndex((tag) => tag._ref === tagId) ?? -1\n        return tagIndex >= 0\n      })\n\n      if (tagIsInEveryAsset) {\n        acc.appliedToAll.push(tagId)\n      } else {\n        acc.appliedToSome.push(tagId)\n      }\n\n      return acc\n    },\n    {\n      appliedToAll: [],\n      appliedToSome: [],\n    },\n  )\n\n  const tagsAppliedToAll = tags\n    .filter((tag) => tagIdsSegmented.appliedToAll.includes(tag.tag._id))\n    .map((tagItem) => ({\n      ...tagItem,\n      actions: ['delete', 'edit', 'removeAll', 'search'] as TagActions[],\n    }))\n  const tagsAppliedToSome = tags\n    .filter((tag) => tagIdsSegmented.appliedToSome.includes(tag.tag._id))\n    .map((tagItem) => ({\n      ...tagItem,\n      actions: ['applyAll', 'delete', 'edit', 'removeAll', 'search'] as TagActions[],\n    }))\n  const tagsUnused = tags\n    .filter((tag) => !pickedTagIdsUnique.includes(tag.tag._id))\n    .map((tagItem) => ({\n      ...tagItem,\n      actions: ['applyAll', 'delete', 'edit', 'search'] as TagActions[],\n    }))\n\n  let items: (\n    | string\n    | (TagItem & {\n        actions: TagActions[]\n      })\n  )[] = []\n  if (assetsPicked.length === 0) {\n    items = tags.map((tagItem) => ({\n      ...tagItem,\n      actions: ['delete', 'edit', 'search'] as TagActions[],\n    }))\n  } else {\n    if (tagsAppliedToAll?.length > 0) {\n      items = [\n        ...items, //\n        assetsPicked.length === 1 ? 'Used' : 'Used by all',\n        ...tagsAppliedToAll,\n      ]\n    }\n    if (tagsAppliedToSome?.length > 0) {\n      items = [\n        ...items, //\n        'Used by some',\n        ...tagsAppliedToSome,\n      ]\n    }\n    if (tagsUnused?.length > 0) {\n      items = [\n        ...items, //\n        'Unused',\n        ...tagsUnused,\n      ]\n    }\n  }\n\n  return (\n    <Virtuoso\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        if (typeof item === 'string') {\n          return item\n        }\n        return item!.tag._id\n      }}\n      isScrolling={setIsScrolling}\n      itemContent={(index) => {\n        return <VirtualRow isScrolling={isScrolling} item={items[index]!} />\n      }}\n      style={{flex: 1, overflowX: 'hidden'}}\n      totalCount={items.length}\n    />\n  )\n}\n\nexport default TagsVirtualized\n","import {ComposeIcon} from '@sanity/icons/Compose'\nimport {Box, Button, Flex, Inline, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  allowCreate?: boolean\n  light?: boolean\n  title: string\n}\n\nconst TagViewHeader = ({allowCreate, light, title}: Props) => {\n  const scheme = useColorSchemeValue()\n\n  const dispatch = useDispatch()\n  const tagsCreating = useTypedSelector((state) => state.tags.creating)\n  const tagsFetching = useTypedSelector((state) => state.tags.fetching)\n\n  const handleTagCreate = () => {\n    dispatch(DIALOG_ACTIONS.showTagCreate())\n  }\n\n  return (\n    <>\n      <Flex\n        align=\"center\"\n        justify=\"space-between\"\n        paddingLeft={3}\n        style={{\n          background: light ? getSchemeColor(scheme, 'bg') : 'inherit',\n          borderBottom: '1px solid var(--card-border-color)',\n          flexShrink: 0,\n          height: `${PANEL_HEIGHT}px`,\n        }}\n      >\n        <Inline gap={2}>\n          <Label size={0}>{title}</Label>\n          {tagsFetching && (\n            <Label size={0} style={{opacity: 0.3}}>\n              Loading...\n            </Label>\n          )}\n        </Inline>\n        {/* Create new tag button */}\n        {allowCreate && (\n          <Box marginRight={1}>\n            <Button\n              disabled={tagsCreating}\n              fontSize={1} //\n              icon={ComposeIcon}\n              mode=\"bleed\"\n              onClick={handleTagCreate}\n              style={{\n                background: 'transparent',\n                boxShadow: 'none',\n              }}\n            />\n          </Box>\n        )}\n      </Flex>\n    </>\n  )\n}\n\nexport default TagViewHeader\n","import {Box, Flex, Text} from '@sanity/ui'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPickedLength} from '../../modules/assets'\nimport {selectTags} from '../../modules/tags'\nimport TagsVirtualized from '../TagsVirtualized'\nimport TagViewHeader from '../TagViewHeader'\n\nconst TagView = () => {\n  const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n  const {excludeTagSlugs} = useToolOptions()\n  const tagsAll = useTypedSelector(selectTags)\n  const tags =\n    excludeTagSlugs.length > 0\n      ? tagsAll.filter((t) => !excludeTagSlugs.includes(t.tag.name.current))\n      : tagsAll\n  const fetching = useTypedSelector((state) => state.tags.fetching)\n  const fetchCount = useTypedSelector((state) => state.tags.fetchCount)\n  const fetchComplete = fetchCount !== -1\n  const hasTags = !fetching && tags?.length > 0\n  const hasPicked = !!(numPickedAssets > 0)\n\n  return (\n    <Flex direction=\"column\" flex={1} height=\"fill\">\n      <TagViewHeader\n        allowCreate\n        light={hasPicked}\n        title={hasPicked ? 'Tags (in selection)' : 'Tags'}\n      />\n\n      {fetchComplete && !hasTags && (\n        <Box padding={3}>\n          <Text muted size={1}>\n            <em>No tags</em>\n          </Text>\n        </Box>\n      )}\n\n      {hasTags && <TagsVirtualized tags={tags} />}\n    </Flex>\n  )\n}\n\nexport default TagView\n","import {Box} from '@sanity/ui'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport {dialogActions} from '../../modules/dialog'\nimport type {DialogTagsProps} from '../../types'\nimport Dialog from '../Dialog'\nimport TagView from '../TagView'\n\ntype Props = {\n  children: ReactNode\n  dialog: DialogTagsProps\n}\n\nconst DialogTags = (props: Props) => {\n  const {\n    children,\n    dialog: {id},\n  } = props\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleClose = useCallback(() => {\n    dispatch(dialogActions.clear())\n  }, [dispatch])\n\n  return (\n    <Dialog animate header=\"All Tags\" id={id} onClose={handleClose} width={1}>\n      <Box\n        style={{\n          height: '100%',\n          minHeight: '420px', // explicit height required as <TagView> is virtualized\n        }}\n      >\n        <TagView />\n      </Box>\n\n      {children}\n    </Dialog>\n  )\n}\n\nexport default DialogTags\n","import useTypedSelector from '../../hooks/useTypedSelector'\nimport type {Dialog} from '../../types'\nimport DialogAssetEdit from '../DialogAssetEdit'\nimport DialogAllAssets from '../DialogAssetsOverView'\nimport DialogConfirm from '../DialogConfirm'\nimport DialogFolderCreate from '../DialogFolderCreate'\nimport DialogFolderMove from '../DialogFolderMove'\nimport DialogFolderRename from '../DialogFolderRename'\nimport DialogFolders from '../DialogFolders'\nimport DialogSearchFacets from '../DialogSearchFacets'\nimport DialogTagCreate from '../DialogTagCreate'\nimport DialogTagEdit from '../DialogTagEdit'\nimport DialogTags from '../DialogTags'\n\nconst Dialogs = () => {\n  // Redux\n  const currentDialogs = useTypedSelector((state) => state.dialog.items)\n\n  const renderDialogs = (dialogs: Dialog[], index: number) => {\n    if (dialogs.length === 0 || index >= dialogs.length) {\n      return null\n    }\n\n    const dialog = dialogs[index]!\n    const childDialogs = renderDialogs(dialogs, index + 1)\n\n    if (dialog.type === 'assetEdit') {\n      return (\n        <DialogAssetEdit dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogAssetEdit>\n      )\n    }\n\n    if (dialog.type === 'confirm') {\n      return (\n        <DialogConfirm dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogConfirm>\n      )\n    }\n\n    if (dialog.type === 'folderCreate') {\n      return (\n        <DialogFolderCreate dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolderCreate>\n      )\n    }\n\n    if (dialog.type === 'folderMove') {\n      return (\n        <DialogFolderMove dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolderMove>\n      )\n    }\n\n    if (dialog.type === 'folderRename') {\n      return (\n        <DialogFolderRename dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolderRename>\n      )\n    }\n\n    if (dialog.type === 'folders') {\n      return (\n        <DialogFolders dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogFolders>\n      )\n    }\n\n    if (dialog.type === 'searchFacets') {\n      return (\n        <DialogSearchFacets dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogSearchFacets>\n      )\n    }\n\n    if (dialog.type === 'tagCreate') {\n      return (\n        <DialogTagCreate dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogTagCreate>\n      )\n    }\n\n    if (dialog.type === 'tagEdit') {\n      return (\n        <DialogTagEdit dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogTagEdit>\n      )\n    }\n\n    if (dialog.type === 'tags') {\n      return (\n        <DialogTags dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogTags>\n      )\n    }\n\n    if (dialog.type === 'dialogAllAssets') {\n      return (\n        <DialogAllAssets dialog={dialog} key={index}>\n          {childDialogs}\n        </DialogAllAssets>\n      )\n    }\n\n    return null\n  }\n\n  return renderDialogs(currentDialogs, 0)\n}\n\nexport default Dialogs\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect} from 'react'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\nconst Notifications = () => {\n  const items = useTypedSelector((state) => state.notifications.items)\n  const toast = useToast()\n\n  useEffect(() => {\n    if (items.length > 0) {\n      const lastItem = items[items.length - 1]!\n      toast.push({\n        closable: true,\n        status: lastItem.status,\n        title: lastItem.title,\n      })\n    }\n  }, [items, toast])\n\n  return null\n}\n\nexport default Notifications\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\n\ntype DebugReducerState = {\n  badConnection: boolean\n  enabled: boolean\n}\n\nconst initialState = {\n  badConnection: false,\n  enabled: false,\n} as DebugReducerState\n\nconst debugSlice = createSlice({\n  name: 'debug',\n  initialState,\n  reducers: {\n    setBadConnection(state, action: PayloadAction<boolean>) {\n      state.badConnection = action.payload\n    },\n    toggleEnabled(state) {\n      state.enabled = !state.enabled\n    },\n  },\n})\n\nexport const debugActions = {...debugSlice.actions}\n\nexport default debugSlice.reducer\n","import {type PayloadAction, createSlice} from '@reduxjs/toolkit'\nimport type {UnknownAction} from '@reduxjs/toolkit'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {bufferTime, filter, mergeMap} from 'rxjs/operators'\n\nimport type {HttpError, ImageAsset, MyEpic} from '../../types'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\nimport {foldersActions} from '../folders'\nimport {tagsActions} from '../tags'\nimport {uploadsActions} from '../uploads'\n\ntype Notification = {\n  asset?: ImageAsset\n  status?: 'error' | 'warning' | 'success' | 'info'\n  title?: string\n}\n\ntype NotificationsReducerState = {\n  items: Notification[]\n}\n\nfunction messageFromGenericErrorPayload(payload: unknown): string {\n  if (!payload || typeof payload !== 'object') {\n    return 'Unknown error'\n  }\n  if (\n    'error' in payload &&\n    payload.error &&\n    typeof payload.error === 'object' &&\n    payload.error !== null &&\n    'message' in payload.error\n  ) {\n    return String((payload.error as HttpError).message)\n  }\n  if ('message' in payload && typeof (payload as HttpError).message === 'string') {\n    return String((payload as HttpError).message)\n  }\n  return 'Unknown error'\n}\n\nconst initialState = {\n  items: [],\n} as NotificationsReducerState\n\nconst notificationsSlice = createSlice({\n  name: 'notifications',\n  initialState,\n  reducers: {\n    add(state, action: PayloadAction<Notification>) {\n      const {asset, status, title} = action.payload\n      state.items.push({\n        asset,\n        status,\n        title,\n      })\n    },\n  },\n})\n\n// Epics\n\nexport const notificationsAssetsDeleteCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.deleteComplete.match),\n    mergeMap((action) => {\n      const {assetIds} = action.payload\n      const deletedCount = assetIds.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `${deletedCount} ${pluralize('asset', deletedCount)} deleted`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsDeleteErrorEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.deleteError.match),\n    mergeMap((action) => {\n      const {assetIds} = action.payload\n      const count = assetIds.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'error',\n          title: `Unable to delete ${count} ${pluralize(\n            'asset',\n            count,\n          )}. Please review any asset errors and try again.`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsUploadCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(uploadsActions.checkComplete.match),\n    mergeMap((action) => {\n      const {results} = action.payload\n\n      const count = Object.keys(results).length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `Uploaded ${count} ${pluralize('asset', count)}`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsTagsAddCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(ASSETS_ACTIONS.tagsAddComplete.match),\n    mergeMap((action) => {\n      const count = action?.payload?.assets?.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `Tag added to ${count} ${pluralize('asset', count)}`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsTagsRemoveCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(ASSETS_ACTIONS.tagsRemoveComplete.match),\n    mergeMap((action) => {\n      const count = action?.payload?.assets?.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `Tag removed from ${count} ${pluralize('asset', count)}`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsAssetsUpdateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(assetsActions.updateComplete.match),\n    bufferTime(2000),\n    filter((actions) => actions.length > 0),\n    mergeMap((actions) => {\n      const updatedCount = actions.length\n      return of(\n        notificationsSlice.actions.add({\n          status: 'info',\n          title: `${updatedCount} ${pluralize('asset', updatedCount)} updated`,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsGenericErrorEpic: MyEpic = (action$) =>\n  action$.pipe(\n    ofType(\n      assetsActions.fetchError.type,\n      assetsActions.updateError.type,\n      tagsActions.createError.type,\n      tagsActions.deleteError.type,\n      tagsActions.fetchError.type,\n      tagsActions.updateError.type,\n      foldersActions.createError.type,\n      foldersActions.deleteError.type,\n      foldersActions.renameError.type,\n      uploadsActions.uploadError.type,\n    ),\n    mergeMap((action: UnknownAction) => {\n      const title = `An error occurred: ${messageFromGenericErrorPayload(action['payload'])}`\n      return of(\n        notificationsSlice.actions.add({\n          status: 'error',\n          title,\n        }),\n      )\n    }),\n  )\n\nexport const notificationsTagCreateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.createComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag created`}))),\n  )\n\nexport const notificationsTagDeleteCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.deleteComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag deleted`}))),\n  )\n\nexport const notificationsTagUpdateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(tagsActions.updateComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Tag updated`}))),\n  )\n\nexport const notificationsFolderCreateCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(foldersActions.createComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder created`}))),\n  )\n\nexport const notificationsFolderDeleteCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(foldersActions.deleteComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder deleted`}))),\n  )\n\nexport const notificationsFolderRenameCompleteEpic: MyEpic = (action$) =>\n  action$.pipe(\n    filter(foldersActions.renameComplete.match),\n    mergeMap(() => of(notificationsSlice.actions.add({status: 'info', title: `Folder renamed`}))),\n  )\n\nexport const notificationsActions = {...notificationsSlice.actions}\n\nexport default notificationsSlice.reducer\n","import {createSlice} from '@reduxjs/toolkit'\nimport type {SanityAssetDocument, SanityDocument, SanityImageAssetDocument} from '@sanity/client'\n\ntype SelectedReducerState = {\n  assets: (SanityAssetDocument | SanityImageAssetDocument)[]\n  document?: SanityDocument\n  documentAssetIds?: string[]\n}\n\nconst initialState = {\n  assets: [],\n  document: undefined,\n  documentAssetIds: [],\n} as SelectedReducerState\n\nconst selectedSlice = createSlice({\n  name: 'selected',\n  initialState,\n  reducers: {},\n})\n\nexport default selectedSlice.reducer\n","import {type Reducer, type StateFromReducersMapObject, combineReducers} from '@reduxjs/toolkit'\nimport {combineEpics} from 'redux-observable'\n\nimport assetsReducer, {\n  assetsDeleteEpic,\n  assetsFetchAfterDeleteAllEpic,\n  assetsFetchEpic,\n  assetsFolderSetEpic,\n  assetsFolderSetRefreshEpic,\n  assetsFetchNextPageEpic,\n  assetsFetchPageIndexEpic,\n  assetsListenerCreateQueueEpic,\n  assetsListenerDeleteQueueEpic,\n  assetsListenerUpdateQueueEpic,\n  assetsOrderSetEpic,\n  assetsSearchEpic,\n  assetsSortEpic,\n  assetsTagsAddEpic,\n  assetsTagsRemoveEpic,\n  assetsUnpickEpic,\n  assetsUpdateEpic,\n  assetsUpdateImageReferencesEpic,\n} from './assets'\nimport debugReducer from './debug'\nimport dialogReducer, {\n  dialogClearOnAssetUpdateEpic,\n  dialogTagCreateEpic,\n  dialogTagDeleteEpic,\n} from './dialog'\nimport foldersReducer, {\n  foldersCurrentFolderEpic,\n  foldersCreateEpic,\n  foldersDeleteEpic,\n  foldersFetchEpic,\n  foldersRefreshEpic,\n  foldersRenameEpic,\n} from './folders'\nimport notificationsReducer, {\n  notificationsAssetsDeleteErrorEpic,\n  notificationsAssetsDeleteCompleteEpic,\n  notificationsAssetsTagsAddCompleteEpic,\n  notificationsAssetsTagsRemoveCompleteEpic,\n  notificationsAssetsUpdateCompleteEpic,\n  notificationsFolderCreateCompleteEpic,\n  notificationsFolderDeleteCompleteEpic,\n  notificationsFolderRenameCompleteEpic,\n  notificationsGenericErrorEpic,\n  notificationsTagCreateCompleteEpic,\n  notificationsTagDeleteCompleteEpic,\n  notificationsTagUpdateCompleteEpic,\n} from './notifications'\nimport searchReducer, {searchFacetTagUpdateEpic} from './search'\nimport selectedReducer from './selected'\nimport tagsReducer, {\n  tagsCreateEpic,\n  tagsDeleteEpic,\n  tagsFetchEpic,\n  tagsListenerCreateQueueEpic,\n  tagsListenerDeleteQueueEpic,\n  tagsListenerUpdateQueueEpic,\n  tagsSortEpic,\n  tagsUpdateEpic,\n} from './tags'\nimport uploadsReducer, {\n  uploadsAssetStartEpic,\n  uploadsAssetUploadEpic,\n  uploadsCheckRequestEpic,\n  uploadsCompleteQueueEpic,\n} from './uploads'\n\nexport const rootEpic = combineEpics(\n  assetsDeleteEpic,\n  assetsFetchEpic,\n  assetsFetchAfterDeleteAllEpic,\n  assetsFetchNextPageEpic,\n  assetsFetchPageIndexEpic,\n  assetsFolderSetEpic,\n  assetsFolderSetRefreshEpic,\n  assetsListenerCreateQueueEpic,\n  assetsListenerDeleteQueueEpic,\n  assetsListenerUpdateQueueEpic,\n  assetsOrderSetEpic,\n  assetsSearchEpic,\n  assetsSortEpic,\n  assetsTagsAddEpic,\n  assetsTagsRemoveEpic,\n  assetsUnpickEpic,\n  assetsUpdateEpic,\n  assetsUpdateImageReferencesEpic,\n  dialogClearOnAssetUpdateEpic,\n  dialogTagCreateEpic,\n  dialogTagDeleteEpic,\n  foldersCurrentFolderEpic,\n  foldersCreateEpic,\n  foldersDeleteEpic,\n  foldersFetchEpic,\n  foldersRefreshEpic,\n  foldersRenameEpic,\n  notificationsAssetsDeleteErrorEpic,\n  notificationsAssetsDeleteCompleteEpic,\n  notificationsAssetsTagsAddCompleteEpic,\n  notificationsAssetsTagsRemoveCompleteEpic,\n  notificationsAssetsUpdateCompleteEpic,\n  notificationsFolderCreateCompleteEpic,\n  notificationsFolderDeleteCompleteEpic,\n  notificationsFolderRenameCompleteEpic,\n  notificationsGenericErrorEpic,\n  notificationsTagCreateCompleteEpic,\n  notificationsTagDeleteCompleteEpic,\n  notificationsTagUpdateCompleteEpic,\n  searchFacetTagUpdateEpic,\n  tagsCreateEpic,\n  tagsDeleteEpic,\n  tagsFetchEpic,\n  tagsListenerCreateQueueEpic,\n  tagsListenerDeleteQueueEpic,\n  tagsListenerUpdateQueueEpic,\n  tagsSortEpic,\n  tagsUpdateEpic,\n  uploadsAssetStartEpic,\n  uploadsAssetUploadEpic,\n  uploadsCheckRequestEpic,\n  uploadsCompleteQueueEpic,\n)\n\nconst reducers = {\n  assets: assetsReducer,\n  debug: debugReducer,\n  dialog: dialogReducer,\n  folders: foldersReducer,\n  notifications: notificationsReducer,\n  search: searchReducer,\n  selected: selectedReducer,\n  tags: tagsReducer,\n  uploads: uploadsReducer,\n}\n\ntype ReducersMapObject = typeof reducers\n\n// Workaround to avoid `$CombinedState` ts errors\n// source: https://github.com/reduxjs/redux-toolkit/issues/2068#issuecomment-1130796500\n// TODO: remove once we use `redux-toolkit` v2\nexport const rootReducer: Reducer<StateFromReducersMapObject<ReducersMapObject>> =\n  combineReducers(reducers)\n","import type {SanityDocument} from '@sanity/client'\n\nconst isPlainObject = (value: any) =>\n  value !== null && typeof value === 'object' && !Array.isArray(value)\n\n// Recursively search node for any linked asset ids (`asset._type === 'reference'`)\nconst getAssetIds = (node: Record<string, any>, acc: string[] = []) => {\n  if (Array.isArray(node)) {\n    node.forEach((v) => {\n      getAssetIds(v, acc)\n    })\n  }\n\n  if (isPlainObject(node)) {\n    if (node?.['asset']?._type === 'reference' && node?.['asset']?._ref) {\n      acc.push(node['asset']._ref)\n    }\n\n    Object.values(node).forEach((val) => {\n      getAssetIds(val, acc)\n    })\n  }\n\n  return acc\n}\n\n// Retrieve all linked asset ids from a Sanity document\nconst getDocumentAssetIds = (document: SanityDocument): string[] => {\n  const assetIds = getAssetIds(document)\n\n  // Sort and dedupe\n  return [...new Set(assetIds.sort())]\n}\n\nexport default getDocumentAssetIds\n","import {SUPPORTED_ASSET_TYPES} from '../constants'\nimport type {AssetType} from '../types'\n\n/**\n * Determines whether or not the provided asset type (eg 'image', 'file', 'arbitrary')\n * is a supported asset type for this plugin.\n *\n * @param assetType - The asset type to check.\n * @returns True if the asset type is supported, false otherwise.\n * @internal\n */\nexport function isSupportedAssetType(assetType?: string): assetType is AssetType {\n  const supported: string[] = SUPPORTED_ASSET_TYPES\n  return assetType ? supported.includes(assetType) : false\n}\n","import {configureStore, type Store, type UnknownAction} from '@reduxjs/toolkit'\nimport type {SanityClient} from '@sanity/client'\nimport {type ReactNode, useState} from 'react'\nimport {Provider} from 'react-redux'\nimport {createEpicMiddleware} from 'redux-observable'\nimport type {AssetSourceComponentProps, SanityDocument} from 'sanity'\n\nimport {rootEpic, rootReducer} from '../../modules'\nimport {initialState as assetsInitialState} from '../../modules/assets'\n// import {assetsActions} from '../../modules/assets'\n// import {searchActions} from '../../modules/search'\n// import {uploadsActions} from '../../modules/uploads'\nimport type {RootReducerState} from '../../modules/types'\nimport getDocumentAssetIds from '../../utils/getDocumentAssetIds'\nimport {isSupportedAssetType} from '../../utils/isSupportedAssetType'\n\ntype Props = {\n  assetType?: AssetSourceComponentProps['assetType']\n  children?: ReactNode\n  client: SanityClient\n  document?: SanityDocument\n  excludeTagSlugs?: string[]\n  selectedAssets?: AssetSourceComponentProps['selectedAssets']\n}\n\nfunction createReduxStore(props: Props): Store {\n  const epicMiddleware = createEpicMiddleware<UnknownAction, UnknownAction, RootReducerState>({\n    dependencies: {\n      client: props.client,\n    },\n  })\n\n  const store = configureStore({\n    reducer: rootReducer,\n    middleware: (getDefaultMiddleware) =>\n      getDefaultMiddleware({\n        /*\n        serializableCheck: {\n          ignoredActions: [\n            assetsActions.deleteError.type,\n            uploadsActions.uploadRequest.type,\n            uploadsActions.uploadStart.type,\n          ]\n        },\n        */\n        // TODO: remove once we're no longer storing non-serializable data in the store\n        serializableCheck: false,\n        thunk: false,\n      }).prepend(epicMiddleware),\n    devTools: true,\n    preloadedState: {\n      assets: {\n        ...assetsInitialState,\n        assetTypes: isSupportedAssetType(props?.assetType) ? [props.assetType] : ['file', 'image'],\n        excludeTagSlugs: props.excludeTagSlugs?.length ? [...props.excludeTagSlugs] : [],\n      },\n      debug: {\n        badConnection: false,\n        enabled: false,\n      },\n      dialog: {items: []},\n      folders: {\n        byId: {},\n        childrenByParentId: {},\n        rootIds: [],\n        exactCountByFolderId: {},\n        unfiledCount: 0,\n        currentFolderId: null,\n        currentFolderUnfiled: false,\n        panelVisible: false,\n        fetching: false,\n        fetchCount: -1,\n        creating: false,\n        renaming: false,\n      },\n      notifications: {items: []},\n      search: {facets: [], query: ''},\n      selected: {\n        assets: props.selectedAssets || [],\n        document: props.document,\n        documentAssetIds: props.document ? getDocumentAssetIds(props.document) : [],\n      },\n      tags: {\n        allIds: [],\n        byIds: {},\n        creating: false,\n        fetchCount: -1,\n        fetching: false,\n        panelVisible: true,\n      },\n      uploads: {\n        allIds: [],\n        byIds: {},\n      },\n    },\n  })\n\n  epicMiddleware.run(rootEpic)\n\n  return store\n}\n\nfunction ReduxProvider({children, ...props}: Props) {\n  const [store] = useState(() => createReduxStore(props))\n\n  return <Provider store={store}>{children}</Provider>\n}\n\nexport default ReduxProvider\n","import {PortalProvider} from '@sanity/ui'\nimport {useEffect, useRef} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {assetsActions} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport constructFilter from '../../utils/constructFilter'\nimport Dialogs from '../Dialogs'\nimport Notifications from '../Notifications'\nimport ReduxProvider from '../ReduxProvider'\n\n/**\n * Fetches the already-selected asset into the store and opens the `assetEdit`\n * dialog for it. Once that dialog (and any nested dialogs, e.g. delete confirm)\n * are dismissed, the asset source itself is closed via `onClose`.\n *\n * Tracking the dialog lifecycle through redux is what allows the source to be\n * reopened: closing the inner dialog only removes it from the store, so without\n * this the source would stay mounted (showing nothing) and could not be opened\n * a second time.\n */\nconst EditAssetDialog = ({assetId, onClose}: {assetId: string; onClose: () => void}) => {\n  const dispatch = useDispatch()\n  const openDialogCount = useTypedSelector((state) => state.dialog.items.length)\n  const hasOpenedRef = useRef(false)\n\n  useEffect(() => {\n    // Only fetch the single asset being edited, then open its edit dialog.\n    const queryFilter = `${constructFilter({\n      assetTypes: ['file', 'image'],\n      searchFacets: [],\n    })} && _id == $assetId`\n\n    dispatch(assetsActions.fetchRequest({params: {assetId}, queryFilter}))\n\n    // Tags and folders must be loaded into the store so the edit dialog can\n    // resolve the asset's existing tag references and folder path (mirroring\n    // `useBrowserInit`). Without this, `selectTagSelectOptions` resolves no tags\n    // and saving would patch `opt.media.tags` to null, wiping existing tags.\n    dispatch(tagsActions.fetchRequest())\n    dispatch(foldersActions.fetchRequest())\n\n    dispatch(dialogActions.showAssetEdit({assetId}))\n  }, [assetId, dispatch])\n\n  useEffect(() => {\n    if (openDialogCount > 0) {\n      hasOpenedRef.current = true\n    } else if (hasOpenedRef.current) {\n      onClose()\n    }\n  }, [openDialogCount, onClose])\n\n  return (\n    <>\n      <Dialogs />\n      <Notifications />\n    </>\n  )\n}\n\nconst EditAssetTool = (props: AssetSourceComponentProps) => {\n  const {onClose, selectedAssets} = props\n\n  const portalElement = useRootPortalElement()\n\n  // `useFormValue` can return null/undefined (e.g. on a pristine/unsaved draft).\n  const currentDocument = useFormValue([]) as SanityDocument | null | undefined\n\n  const client = useVersionedClient()\n\n  const assetId = selectedAssets[0]?._id\n\n  // Nothing to edit (e.g. opened on an empty field) – close the source again.\n  useEffect(() => {\n    if (!assetId) {\n      onClose()\n    }\n  }, [assetId, onClose])\n\n  if (!assetId) {\n    return null\n  }\n\n  return (\n    <ReduxProvider\n      assetType={props.assetType}\n      client={client}\n      document={currentDocument ?? undefined}\n      selectedAssets={selectedAssets}\n    >\n      <AssetBrowserDispatchProvider onSelect={props.onSelect}>\n        <GlobalStyle />\n        <PortalProvider element={portalElement}>\n          <EditAssetDialog assetId={assetId} onClose={onClose} />\n        </PortalProvider>\n      </AssetBrowserDispatchProvider>\n    </ReduxProvider>\n  )\n}\n\nexport default EditAssetTool\n","import {ThLargeIcon} from '@sanity/icons/ThLarge'\nimport {ThListIcon} from '@sanity/icons/ThList'\nimport {Button, Inline} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst ButtonViewGroup = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const view = useTypedSelector((state) => state.assets.view)\n\n  return (\n    <Inline gap={0} style={{whiteSpace: 'nowrap'}}>\n      <Button\n        fontSize={1}\n        icon={ThLargeIcon}\n        mode={view === 'grid' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'grid'}))}\n        style={{\n          borderBottomRightRadius: 0,\n          borderTopRightRadius: 0,\n        }}\n      />\n      <Button\n        fontSize={1}\n        icon={ThListIcon}\n        mode={view === 'table' ? 'default' : 'ghost'}\n        onClick={() => dispatch(assetsActions.viewSet({view: 'table'}))}\n        style={{\n          borderBottomLeftRadius: 0,\n          borderTopLeftRadius: 0,\n        }}\n      />\n    </Inline>\n  )\n}\n\nexport default ButtonViewGroup\n","import {SortIcon} from '@sanity/icons/Sort'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {useDispatch} from 'react-redux'\n\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\nconst OrderSelect = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const order = useTypedSelector((state) => state.assets.order)\n\n  const popoverProps = usePortalPopoverProps()\n\n  return (\n    <MenuButton\n      button={\n        <Button\n          fontSize={1}\n          icon={SortIcon}\n          mode=\"bleed\"\n          padding={3}\n          text={getOrderTitle(order.field, order.direction)}\n        />\n      }\n      id=\"order\"\n      menu={\n        <Menu>\n          {ORDER_OPTIONS?.map((item, index) => {\n            if (item) {\n              const selected = order.field === item.field && order.direction === item.direction\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  iconRight={selected}\n                  key={index}\n                  onClick={() =>\n                    dispatch(\n                      assetsActions.orderSet({\n                        order: {direction: item.direction, field: item.field},\n                      }),\n                    )\n                  }\n                  padding={2}\n                  selected={selected}\n                  gap={4}\n                  style={{minWidth: '200px'}}\n                  text={getOrderTitle(item.field, item.direction)}\n                />\n              )\n            }\n\n            return <MenuDivider key={index} />\n          })}\n        </Menu>\n      }\n      popover={popoverProps}\n    />\n  )\n}\n\nexport default OrderSelect\n","import {Box} from '@sanity/ui'\nimport {useNProgress} from '@tanem/react-nprogress'\n\ntype Props = {\n  loading?: boolean\n}\n\nconst Progress = (props: Props) => {\n  const {loading} = props\n\n  const {animationDuration, isFinished, progress} = useNProgress({\n    animationDuration: 300,\n    isAnimating: loading,\n  })\n\n  return (\n    <Box\n      style={{\n        opacity: isFinished ? 0 : 1,\n        transition: `opacity ${animationDuration}ms linear`,\n      }}\n    >\n      <Box\n        style={{\n          height: '1px',\n          background: 'rgba(255, 255, 255, 0.5)',\n          position: 'absolute',\n          left: 0,\n          top: 0,\n          transition: `width ${animationDuration}ms linear`,\n          width: `${progress * 100}%`,\n        }}\n      />\n    </Box>\n  )\n}\n\nexport default Progress\n","const TagIcon = () => (\n  <svg\n    data-sanity-icon=\"media__tag\" // For icon usage with @sanity/ui <Button />\n    fill=\"currentColor\"\n    height=\"1em\"\n    stroke=\"currentColor\"\n    strokeWidth=\"0\"\n    viewBox=\"0 0 512 512\"\n    width=\"1em\"\n  >\n    <path\n      d=\"M435.25 48h-122.9a14.46 14.46 0 00-10.2 4.2L56.45 297.9a28.85 28.85 0 000 40.7l117 117a28.85 28.85 0 0040.7 0L459.75 210a14.46 14.46 0 004.2-10.2v-123a28.66 28.66 0 00-28.7-28.8z\"\n      fill=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n      strokeWidth=\"32\"\n    />\n    <path d=\"M384 160a32 32 0 1132-32 32 32 0 01-32 32z\" />\n  </svg>\n)\n\nexport default TagIcon\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {SearchIcon} from '@sanity/icons/Search'\nimport {Box, Flex, TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\n\nconst TextInputSearch = () => {\n  // Redux\n  const searchQuery = useTypedSelector((state) => state.search.query)\n\n  // Redux\n  const dispatch = useDispatch()\n\n  // Callbacks\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    dispatch(searchActions.querySet({searchQuery: e.currentTarget.value}))\n  }\n\n  const handleClear = () => {\n    dispatch(searchActions.querySet({searchQuery: ''}))\n  }\n\n  return (\n    <Box style={{position: 'relative'}}>\n      <TextInput\n        fontSize={1}\n        icon={SearchIcon}\n        onChange={handleChange}\n        placeholder=\"Search\"\n        radius={2}\n        value={searchQuery}\n      />\n\n      {/* Clear form button */}\n      {searchQuery.length > 0 && (\n        <Flex\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleClear}\n          style={{\n            cursor: 'pointer',\n            height: '100%',\n            opacity: 0.75,\n            position: 'absolute',\n            right: 0,\n            top: 0,\n            width: '2em',\n            zIndex: 1, // force stacking context\n          }}\n        >\n          <CloseIcon />\n        </Flex>\n      )}\n    </Box>\n  )\n}\n\nexport default TextInputSearch\n","import {FolderIcon} from '@sanity/icons/Folder'\nimport {Box, Button, Flex, Inline, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {foldersActions} from '../../modules/folders'\nimport {tagsActions} from '../../modules/tags'\nimport ButtonViewGroup from '../ButtonViewGroup'\nimport OrderSelect from '../OrderSelect'\nimport Progress from '../Progress'\nimport SearchFacets from '../SearchFacets'\nimport SearchFacetsControl from '../SearchFacetsControl'\nimport TagIcon from '../TagIcon'\nimport TextInputSearch from '../TextInputSearch'\n\nconst Controls = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n  const pageIndex = useTypedSelector((state) => state.assets.pageIndex)\n  const searchFacets = useTypedSelector((state) => state.search.facets)\n  const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n  const mediaIndex = useMediaIndex()\n\n  // Callbacks\n  const handleShowSearchFacetDialog = () => {\n    dispatch(dialogActions.showSearchFacets())\n  }\n\n  const handleShowFoldersDialog = () => {\n    dispatch(dialogActions.showFolders())\n  }\n\n  const handleShowTagsDialog = () => {\n    dispatch(dialogActions.showTags())\n  }\n\n  const toggleFoldersPanel = () => {\n    dispatch(foldersActions.panelVisibleSet({panelVisible: !foldersPanelVisible}))\n  }\n\n  const toggleTagsPanelToggle = () => {\n    dispatch(tagsActions.panelVisibleSet({panelVisible: !tagsPanelVisible}))\n  }\n\n  return (\n    <Box\n      paddingY={2}\n      style={{\n        borderBottom: '1px solid var(--card-border-color)',\n        zIndex: 2,\n      }}\n    >\n      {/* Rows: search / filters / orders  */}\n      <Box marginBottom={2}>\n        <Flex\n          align=\"flex-start\"\n          direction={['column', 'column', 'column', 'column', 'row']}\n          justify=\"space-between\"\n        >\n          {/* Search + Filters */}\n          <Flex\n            flex={1}\n            style={{\n              alignItems: 'flex-start',\n              flex: 1,\n              height: '100%',\n              justifyContent: mediaIndex < 2 ? 'space-between' : 'flex-start',\n              position: 'relative',\n              width: '100%',\n            }}\n          >\n            <Box marginX={2} style={{minWidth: '200px'}}>\n              {/* Search */}\n              <TextInputSearch />\n            </Box>\n\n            <Box display={['none', 'none', 'block']}>\n              <SearchFacets />\n\n              {/* Search Facets Control (add / clear) */}\n              <Inline gap={2}>\n                <SearchFacetsControl />\n              </Inline>\n            </Box>\n\n            <Box display={['block', 'block', 'none']} marginX={2}>\n              <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n                {/* Filters button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowSearchFacetDialog}\n                  text={`Filters${searchFacets.length > 0 ? ` (${searchFacets.length})` : ''}`}\n                  tone=\"primary\"\n                />\n\n                {/* Tags button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowTagsDialog}\n                  text={`Tags`}\n                  tone=\"primary\"\n                />\n\n                {/* Folders button (small) */}\n                <Button\n                  fontSize={1}\n                  mode=\"ghost\"\n                  onClick={handleShowFoldersDialog}\n                  text=\"Folders\"\n                  tone=\"primary\"\n                />\n              </Inline>\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      <Box>\n        <Flex align=\"center\" justify={['space-between']}>\n          {/* Folders + Views */}\n          <Box marginX={2}>\n            <Inline gap={2} style={{whiteSpace: 'nowrap'}}>\n              <Box display={['none', 'none', 'block']}>\n                <Button\n                  aria-label=\"Toggle folders panel\"\n                  fontSize={1}\n                  icon={FolderIcon}\n                  mode={foldersPanelVisible ? 'default' : 'ghost'}\n                  onClick={toggleFoldersPanel}\n                />\n              </Box>\n              <ButtonViewGroup />\n            </Inline>\n          </Box>\n\n          <Flex marginX={2}>\n            {/* Orders */}\n            <OrderSelect />\n            {/* Tags panel toggle */}\n            <Box display={['none', 'none', 'block']} marginLeft={2}>\n              <Button\n                fontSize={1}\n                icon={\n                  <Box style={{transform: 'scale(0.75)'}}>\n                    <TagIcon />\n                  </Box>\n                }\n                onClick={toggleTagsPanelToggle}\n                mode={tagsPanelVisible ? 'default' : 'ghost'}\n                text={tagsPanelVisible ? 'Tags' : ''}\n              />\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      {/* Progress bar */}\n      <Progress key={pageIndex} loading={fetching} />\n    </Box>\n  )\n}\n\nexport default Controls\n","import {PlugIcon} from '@sanity/icons/Plug'\nimport {Box, Flex, Switch, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {debugActions} from '../../modules/debug'\n\nconst DebugControls = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const badConnection = useTypedSelector((state) => state.debug.badConnection)\n  const debugEnabled = useTypedSelector((state) => state.debug.enabled)\n\n  // Callbacks\n  const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n    const checked = e.target.checked\n\n    dispatch(debugActions.setBadConnection(checked))\n  }\n\n  const handleToggleControls = () => {\n    dispatch(debugActions.toggleEnabled())\n  }\n\n  // Close on escape key press\n  useKeyPress('alt+ctrl+shift+/', handleToggleControls)\n\n  if (!debugEnabled) {\n    return null\n  }\n\n  return (\n    <Box\n      padding={4}\n      style={{\n        bottom: 0,\n        left: 0,\n        pointerEvents: 'none',\n        position: 'fixed',\n        width: '100%',\n      }}\n    >\n      {/* Bad connection toggle */}\n      <Flex align=\"center\">\n        <Box marginRight={3}>\n          <Text muted size={1}>\n            <PlugIcon />\n          </Text>\n        </Box>\n        <Tooltip\n          animate\n          content={\n            <Box padding={2}>\n              <Text muted size={1}>\n                {badConnection\n                  ? 'Bad connection: +3000ms & 50% chance to fail'\n                  : 'No connection throttling'}\n              </Text>\n            </Box>\n          }\n          fallbackPlacements={['right', 'left']}\n          placement=\"bottom\"\n          portal\n        >\n          <Switch\n            checked={badConnection}\n            onChange={handleChange}\n            style={{\n              pointerEvents: 'auto',\n            }}\n          />\n        </Tooltip>\n      </Flex>\n    </Box>\n  )\n}\n\nexport default DebugControls\n","import {Box, Button, Inline, Text} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {foldersActions, selectCurrentFolderSegments} from '../../modules/folders'\n\nconst FolderBreadcrumbs = () => {\n  const dispatch = useDispatch()\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const segments = useTypedSelector(selectCurrentFolderSegments)\n\n  if (!currentFolderId) {\n    return null\n  }\n\n  return (\n    <Box display={['block', 'block', 'none']} padding={2}>\n      <Inline gap={1}>\n        <Button\n          fontSize={1}\n          padding={2}\n          mode=\"bleed\"\n          onClick={() => dispatch(foldersActions.currentFolderClear())}\n          text=\"All assets\"\n        />\n\n        {segments.map((segment) => (\n          <Inline key={segment.id} gap={1}>\n            <Text muted size={1}>\n              /\n            </Text>\n            <Button\n              fontSize={1}\n              padding={2}\n              mode={currentFolderId === segment.id ? 'default' : 'bleed'}\n              onClick={() => dispatch(foldersActions.currentFolderSet({folderId: segment.id}))}\n              text={segment.name}\n            />\n          </Inline>\n        ))}\n      </Inline>\n    </Box>\n  )\n}\n\nexport default FolderBreadcrumbs\n","import {Box} from '@sanity/ui'\n\nimport {FOLDERS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport FolderView from '../FolderView'\n\nconst FolderPanel = () => {\n  const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n\n  if (!foldersPanelVisible) {\n    return null\n  }\n\n  return (\n    <Box\n      style={{\n        position: 'relative',\n        width: FOLDERS_PANEL_WIDTH,\n      }}\n    >\n      <Box\n        className=\"media__custom-scrollbar\"\n        style={{\n          borderRight: '1px solid var(--card-border-color)',\n          height: '100%',\n          left: 0,\n          overflowX: 'hidden',\n          overflowY: 'auto',\n          position: 'absolute',\n          top: 0,\n          width: '100%',\n        }}\n      >\n        <FolderView />\n      </Box>\n    </Box>\n  )\n}\n\nexport default FolderPanel\n","import {type ReactNode, createContext, useContext, useMemo} from 'react'\n\ntype ContextProps = {\n  open: () => void\n}\n\ntype Props = {\n  children: ReactNode\n  open: () => void\n}\n\nconst DropzoneDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const DropzoneDispatchProvider = (props: Props) => {\n  const {children, open} = props\n\n  const contextValue: ContextProps = useMemo(() => ({open}), [open])\n\n  return (\n    <DropzoneDispatchContext.Provider value={contextValue}>\n      {children}\n    </DropzoneDispatchContext.Provider>\n  )\n}\n\nexport const useDropzoneActions = () => {\n  const context = useContext(DropzoneDispatchContext)\n  if (context === undefined) {\n    throw new Error('useDropzoneActions must be used within an DropzoneDispatchProvider')\n  }\n  return context\n}\n","import {ArrowRightIcon} from '@sanity/icons/ArrowRight'\nimport {CloseIcon} from '@sanity/icons/Close'\nimport {UploadIcon} from '@sanity/icons/Upload'\nimport {Box, Button, Flex, Inline, Text} from '@sanity/ui'\nimport pluralize from 'pluralize'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {useDropzoneActions} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\n\ntype Props = {\n  onClose?: () => void\n}\n\nconst Header = (props: Props) => {\n  const {onClose} = props\n\n  const {open} = useDropzoneActions()\n  const {onSelect} = useAssetSourceActions()\n\n  // Redux\n  const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n  const selectedDocument = useTypedSelector((state) => state.selected.document)\n\n  const {directUploads} = useToolOptions()\n\n  // Row: Current document / close button\n  return (\n    <Box paddingY={2}>\n      <Flex align=\"center\" justify=\"space-between\">\n        {/* Label */}\n        <Box flex={1} marginX={3}>\n          <Inline style={{whiteSpace: 'nowrap'}}>\n            <Text textOverflow=\"ellipsis\" weight=\"semibold\">\n              <span>{onSelect ? `Insert ${assetTypes.join(' or ')}` : 'Browse Assets'}</span>\n            </Text>\n\n            {selectedDocument && (\n              <Box display={['none', 'none', 'block']}>\n                <Text>\n                  <span style={{margin: '0 0.5em'}}>\n                    <ArrowRightIcon />\n                  </span>\n                  <span style={{textTransform: 'capitalize'}}>{selectedDocument._type}</span>\n                </Text>\n              </Box>\n            )}\n          </Inline>\n        </Box>\n\n        <Flex marginX={2}>\n          {/* Upload */}\n          {directUploads && (\n            <Button\n              fontSize={1}\n              icon={UploadIcon}\n              mode=\"bleed\"\n              onClick={open}\n              text={`Upload ${assetTypes.length === 1 ? pluralize(assetTypes[0]!) : 'assets'}`}\n            />\n          )}\n\n          {/* Close */}\n          {onClose && (\n            <Box style={{flexShrink: 0}}>\n              <Button\n                disabled={!onClose}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={onClose}\n                radius={2}\n              />\n            </Box>\n          )}\n        </Flex>\n      </Flex>\n    </Box>\n  )\n}\n\nexport default Header\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {Box, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\n\ntype Props = {\n  field?: string\n  title?: string\n}\n\nconst TableHeaderItem = (props: Props) => {\n  const {field, title} = props\n\n  // Redux\n  const dispatch = useDispatch()\n  const order = useTypedSelector((state) => state.assets.order)\n\n  const isActive = order.field === field\n\n  // Callbacks\n  const handleClick = () => {\n    if (!field || !title) {\n      return\n    }\n\n    if (isActive) {\n      const direction = order.direction === 'asc' ? 'desc' : 'asc'\n      dispatch(assetsActions.orderSet({order: {field, direction}}))\n    } else {\n      dispatch(assetsActions.orderSet({order: {field, direction: 'asc'}}))\n    }\n  }\n\n  return (\n    <Label muted={!field} size={0}>\n      <Box\n        onClick={field ? handleClick : undefined}\n        style={{\n          cursor: field ? 'pointer' : 'default',\n          display: 'inline',\n          whiteSpace: 'nowrap',\n        }}\n      >\n        <span\n          style={{\n            marginRight: '0.4em',\n          }}\n        >\n          {title}\n        </span>\n\n        {isActive && order?.direction === 'asc' && <ChevronUpIcon />}\n        {isActive && order?.direction === 'desc' && <ChevronDownIcon />}\n      </Box>\n    </Label>\n  )\n}\n\nexport default TableHeaderItem\n","import {Checkbox, Flex, Grid, useMediaIndex} from '@sanity/ui'\nimport type {ThemeColorSchemeKey} from '@sanity/ui/theme'\nimport {type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS, PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsLength, selectAssetsPickedLength} from '../../modules/assets'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport TableHeaderItem from '../TableHeaderItem'\n\n// TODO: DRY\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n  $scheme,\n}) => {\n  return css`\n    cursor: pointer;\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${getSchemeColor($scheme, 'bg')};\n      }\n    }\n  `\n})\n\nconst TableHeader = () => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const itemsLength = useTypedSelector(selectAssetsLength)\n  const numPickedAssets = useTypedSelector(selectAssetsPickedLength)\n\n  const mediaIndex = useMediaIndex()\n  const {onSelect} = useAssetSourceActions()\n\n  const allSelected = numPickedAssets === itemsLength\n\n  // Callbacks\n  const handleContextActionClick = (e: MouseEvent) => {\n    e.stopPropagation()\n\n    if (allSelected) {\n      dispatch(assetsActions.pickClear())\n    } else {\n      dispatch(assetsActions.pickAll())\n    }\n  }\n\n  // Note that even though we hide the table header on smaller breakpoints, we never set it to\n  // `display: none`, as doing so causes issues with react-virtuoso.\n  // Instead, we give it 0 height and hide it with `visibility: hidden`.\n  return (\n    <Grid\n      style={{\n        alignItems: 'center',\n        background: 'var(--card-bg-color)',\n        borderBottom: '1px solid var(--card-border-color)',\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns: GRID_TEMPLATE_COLUMNS.LARGE,\n        height: mediaIndex < 3 ? 0 : `${PANEL_HEIGHT}px`,\n        letterSpacing: '0.025em',\n        position: 'sticky',\n        textTransform: 'uppercase',\n        top: 0,\n        visibility: mediaIndex < 3 ? 'hidden' : 'visible',\n        width: '100%',\n        zIndex: 1, // force stacking context\n      }}\n    >\n      {onSelect ? (\n        <TableHeaderItem />\n      ) : (\n        <ContextActionContainer\n          align=\"center\"\n          justify=\"center\"\n          onClick={handleContextActionClick}\n          $scheme={scheme}\n          style={{\n            height: '100%',\n            position: 'relative',\n          }}\n        >\n          <Checkbox\n            checked={!fetching && allSelected}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        </ContextActionContainer>\n      )}\n\n      <TableHeaderItem />\n      <TableHeaderItem field=\"originalFilename\" title=\"Filename\" />\n      <TableHeaderItem title=\"Resolution\" />\n      <TableHeaderItem field=\"mimeType\" title=\"MIME type\" />\n      <TableHeaderItem field=\"size\" title=\"Size\" />\n      <TableHeaderItem field=\"_updatedAt\" title=\"Last updated\" />\n      <TableHeaderItem title=\"References\" />\n      <TableHeaderItem />\n    </Grid>\n  )\n}\n\nexport default TableHeader\n","import {CheckmarkCircleIcon} from '@sanity/icons/CheckmarkCircle'\nimport {EditIcon} from '@sanity/icons/Edit'\nimport {WarningFilledIcon} from '@sanity/icons/WarningFilled'\nimport {\n  Box,\n  Checkbox,\n  Container,\n  Flex,\n  Grid,\n  Spinner,\n  Text,\n  type ThemeColorSchemeKey,\n  useMediaIndex,\n} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {formatRelative} from 'date-fns/formatRelative'\nimport filesize from 'filesize'\nimport {\n  memo,\n  type MouseEvent,\n  type RefObject,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetById} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport getAssetResolution from '../../utils/getAssetResolution'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\n// Duration (ms) to wait before reference counts (and associated listeners) are rendered\nconst REFERENCE_COUNT_VISIBILITY_DELAY = 750\n\ntype Props = {\n  id: string\n  selected: boolean\n}\n\nconst ContainerGrid = styled<\n  typeof Grid,\n  // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n  {$selected?: boolean; $scheme: ThemeColorSchemeKey; $updating?: boolean}\n>(Grid)(({$scheme, $selected, $updating}) => {\n  return css`\n    align-items: center;\n    cursor: ${$selected ? 'default' : 'pointer'};\n    height: 100%;\n    pointer-events: ${$updating ? 'none' : 'auto'};\n    user-select: none;\n    white-space: nowrap;\n\n    ${\n      !$updating &&\n      css`\n        @media (hover: hover) and (pointer: fine) {\n          &:hover {\n            background: ${getSchemeColor($scheme, 'bg')};\n          }\n        }\n      `\n    }\n  `\n})\n\n// oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(({\n  $scheme,\n}) => {\n  return css`\n    cursor: pointer;\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${getSchemeColor($scheme, 'bg2')};\n      }\n    }\n  `\n})\n\nconst StyledWarningIcon = styled(WarningFilledIcon)(({theme}) => {\n  return {\n    // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n    color: theme.sanity.color.spot.red,\n  }\n})\n\nconst TableRowAsset = (props: Props) => {\n  const {id, selected} = props\n\n  const scheme = useColorSchemeValue()\n\n  const shiftPressed: RefObject<boolean> = useKeyPress('shift')\n\n  const [referenceCountVisible, setReferenceCountVisible] = useState(false)\n  const refCountVisibleTimeout = useRef<ReturnType<typeof window.setTimeout>>(null)\n\n  const dispatch = useDispatch()\n  const lastPicked = useTypedSelector((state) => state.assets.lastPicked)\n  const item = useTypedSelector((state) => selectAssetById(state, id))\n\n  const mediaIndex = useMediaIndex()\n\n  const asset = item?.asset\n  const error = item?.error\n  const isOpaque = item?.asset?.metadata?.isOpaque\n  const picked = item?.picked\n  const updating = item?.updating\n\n  const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n  const handleContextActionClick = useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      } else if (shiftPressed.current && !picked) {\n        dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n      } else {\n        dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n      }\n    },\n    [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n  )\n\n  const handleClick = useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (selected) return\n      if (onSelect && !isMultiSelect) {\n        onSelect([{kind: 'assetDocumentId', value: asset._id}])\n      } else if (onSelect && isMultiSelect) {\n        if (shiftPressed.current && !picked) {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        } else {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        }\n      } else if (shiftPressed.current) {\n        if (picked) {\n          dispatch(assetsActions.pick({assetId: asset._id, picked: !picked}))\n        } else {\n          dispatch(assetsActions.pickRange({startId: lastPicked || asset._id, endId: asset._id}))\n        }\n      } else {\n        dispatch(dialogActions.showAssetEdit({assetId: asset._id}))\n      }\n    },\n    [asset, dispatch, isMultiSelect, lastPicked, onSelect, picked, selected, shiftPressed],\n  )\n\n  const opacityCell = updating ? 0.5 : 1\n  const opacityPreview = selected || updating ? 0.1 : 1\n\n  // Display reference count after an initial delay to prevent over-eager fetching\n  useEffect(() => {\n    refCountVisibleTimeout.current = setTimeout(\n      () => setReferenceCountVisible(true),\n      REFERENCE_COUNT_VISIBILITY_DELAY,\n    )\n    return () => {\n      if (refCountVisibleTimeout.current) {\n        clearTimeout(refCountVisibleTimeout.current)\n      }\n    }\n  }, [])\n\n  // Short circuit if no asset is available\n  if (!asset) {\n    return null\n  }\n\n  return (\n    <ContainerGrid\n      onClick={selected ? undefined : handleClick}\n      $scheme={scheme}\n      $selected={selected}\n      style={{\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }}\n      $updating={item.updating}\n    >\n      {/* Picked checkbox */}\n      <ContextActionContainer\n        onClick={handleContextActionClick}\n        $scheme={scheme}\n        style={{\n          alignItems: 'center',\n          gridColumn: 1,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '100%',\n          justifyContent: 'center',\n          opacity: opacityCell,\n          position: 'relative',\n        }}\n      >\n        {onSelect && !isMultiSelect ? (\n          <EditIcon\n            style={{\n              flexShrink: 0,\n              opacity: 0.5,\n            }}\n          />\n        ) : (\n          <Checkbox\n            checked={picked}\n            readOnly\n            style={{\n              pointerEvents: 'none', // TODO: consider alternative for usability\n              transform: 'scale(0.8)',\n            }}\n          />\n        )}\n      </ContextActionContainer>\n\n      {/* Preview image + spinner */}\n      <Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: 1,\n          gridRowEnd: 'span 5',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Flex align=\"center\" justify=\"center\" style={{height: '100%', position: 'relative'}}>\n          <Box style={{height: '100%', opacity: opacityPreview, position: 'relative'}}>\n            {/* File icon */}\n            {isFileAsset(asset) && <FileIcon extension={asset.extension} width=\"40px\" />}\n\n            {/* Image */}\n            {isImageAsset(asset) && (\n              <Image\n                draggable={false}\n                $scheme={scheme}\n                $showCheckerboard={!isOpaque}\n                src={imageDprUrl(asset, {height: 100, width: 100})}\n              />\n            )}\n          </Box>\n\n          {/* Spinner */}\n          {updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Spinner />\n            </Flex>\n          )}\n\n          {/* Selected check icon */}\n          {selected && !updating && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                height: '100%',\n                left: 0,\n                position: 'absolute',\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Text size={2}>\n                <CheckmarkCircleIcon />\n              </Text>\n            </Flex>\n          )}\n        </Flex>\n      </Box>\n\n      {/* Filename */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: 3,\n          gridRow: mediaIndex < 3 ? 2 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.originalFilename}\n        </Text>\n      </Box>\n\n      {/* Resolution */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 4,\n          gridRow: mediaIndex < 3 ? 3 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {isImageAsset(asset) && getAssetResolution(asset)}\n        </Text>\n      </Box>\n\n      {/* MIME type */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 5,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {asset.mimeType}\n        </Text>\n      </Box>\n\n      {/* Size */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 6,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {filesize(asset.size, {base: 10, round: 0})}\n        </Text>\n      </Box>\n\n      {/* Last updated */}\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : 7,\n          gridRow: mediaIndex < 3 ? 4 : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {formatRelative(new Date(asset._updatedAt), new Date())}\n        </Text>\n      </Box>\n\n      {/* References */}\n      <Box\n        style={{\n          display: mediaIndex < 3 ? 'none' : 'block',\n          gridColumn: 8,\n          gridRow: 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        <Text muted size={1} style={{lineHeight: '2em'}} textOverflow=\"ellipsis\">\n          {referenceCountVisible ? (\n            <WithReferringDocuments // oxlint-disable-line no-deprecated -- deferred to a follow-up PR\n              id={id}\n            >\n              {({isLoading, referringDocuments}) => {\n                const uniqueDocuments = getUniqueDocuments(referringDocuments)\n                return isLoading ? (\n                  <>-</>\n                ) : (\n                  <>{Array.isArray(uniqueDocuments) ? uniqueDocuments.length : 0}</>\n                )\n              }}\n            </WithReferringDocuments>\n          ) : (\n            <>-</>\n          )}\n        </Text>\n      </Box>\n\n      {/* Error */}\n      <Flex\n        align=\"center\"\n        justify=\"center\"\n        style={{\n          gridColumn: mediaIndex < 3 ? 4 : 9,\n          gridRowStart: '1',\n          gridRowEnd: mediaIndex < 3 ? 'span 5' : 'auto',\n          opacity: opacityCell,\n        }}\n      >\n        {/* TODO: DRY */}\n        {/* Error button */}\n        {error && (\n          <Box padding={2}>\n            <Tooltip\n              animate\n              content={\n                <Container padding={2} width={0}>\n                  <Text size={1}>{error}</Text>\n                </Container>\n              }\n              placement=\"left\"\n              portal\n            >\n              <Text size={1}>\n                <StyledWarningIcon color=\"critical\" />\n              </Text>\n            </Tooltip>\n          </Box>\n        )}\n      </Flex>\n    </ContainerGrid>\n  )\n}\n\nexport default memo(TableRowAsset)\n","import {Box, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {css, styled} from 'styled-components'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport {foldersActions} from '../../modules/folders'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  folderId: string\n  name: string\n  totalCount: number\n}\n\nconst ContainerGrid = styled(Grid)(\n  ({theme}) => css`\n    align-items: center;\n    cursor: pointer;\n    height: 100%;\n    user-select: none;\n    white-space: nowrap;\n\n    @media (hover: hover) and (pointer: fine) {\n      &:hover {\n        background: ${\n          // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n          theme.sanity.color.card.enabled.bg\n        };\n      }\n    }\n  `,\n)\n\nconst FolderBadge = styled(Box)(\n  ({theme}) => css`\n    background: ${\n      // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n      theme.sanity.color.spot.yellow\n    };\n    border-radius: 6px;\n    height: 42px;\n    position: relative;\n    width: 52px;\n\n    &::before {\n      background: ${\n        // oxlint-disable-next-line no-deprecated -- deferred to a follow-up PR\n        theme.sanity.color.spot.yellow\n      };\n      border-radius: 6px 6px 0 0;\n      content: '';\n      height: 12px;\n      left: 0;\n      position: absolute;\n      top: -6px;\n      width: 18px;\n    }\n  `,\n)\n\nconst TableRowFolder = ({folderId, name, totalCount}: Props) => {\n  const dispatch = useDispatch()\n  const mediaIndex = useMediaIndex()\n  const scheme = useColorSchemeValue()\n\n  return (\n    <ContainerGrid\n      onClick={() => dispatch(foldersActions.currentFolderSet({folderId}))}\n      style={{\n        background: getSchemeColor(scheme, 'bg'),\n        gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n      }}\n    >\n      <Box />\n      <Flex align=\"center\" justify=\"center\" style={{gridColumn: 2, height: '90px', width: '100px'}}>\n        <FolderBadge />\n      </Flex>\n      <Box\n        marginLeft={mediaIndex < 3 ? 3 : 0}\n        style={{gridColumn: mediaIndex < 3 ? 3 : 3, gridRow: mediaIndex < 3 ? '2/4' : 'auto'}}\n      >\n        <Stack gap={2}>\n          <Text size={1} style={{lineHeight: '1.2em'}} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {name}\n          </Text>\n          <Text muted size={0} style={{lineHeight: '1.1em'}}>\n            Folder\n          </Text>\n        </Stack>\n      </Box>\n      <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 7}}>\n        <Text muted size={1}>\n          {totalCount} item{totalCount === 1 ? '' : 's'}\n        </Text>\n      </Box>\n      <Box style={{display: mediaIndex < 3 ? 'none' : 'block', gridColumn: 8}}>\n        <Text muted size={1}>\n          Open folder\n        </Text>\n      </Box>\n      <Box />\n    </ContainerGrid>\n  )\n}\n\nexport default TableRowFolder\n","import {CloseIcon} from '@sanity/icons/Close'\nimport {Box, Button, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {GRID_TEMPLATE_COLUMNS} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\n\ntype Props = {\n  id: string\n}\n\nconst TableRowUpload = (props: Props) => {\n  const {id} = props\n\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const item = useTypedSelector((state) => selectUploadById(state, id))\n\n  const mediaIndex = useMediaIndex()\n\n  if (!item) {\n    return null\n  }\n\n  const fileSize = filesize(item.size, {base: 10, round: 0})\n  const percentLoaded = Math.round(item.percent || 0) // (0 - 100)\n\n  const isComplete = item.status === 'complete'\n  const isUploading = item.status === 'uploading'\n  const isQueued = item.status === 'queued'\n\n  let status\n  if (isComplete) {\n    status = 'Verifying'\n  }\n  if (isUploading) {\n    status = `${percentLoaded}%`\n  }\n  if (isQueued) {\n    status = 'Queued'\n  }\n\n  // Callbacks\n  const handleCancelUpload = () => {\n    dispatch(uploadsActions.uploadCancel({hash: item.hash}))\n  }\n\n  return (\n    <Grid\n      style={{\n        alignItems: 'center',\n        background: getSchemeColor(scheme, 'bg'),\n        columnGap: mediaIndex < 3 ? 0 : '16px',\n        rowGap: 0,\n        gridTemplateColumns:\n          mediaIndex < 3 ? GRID_TEMPLATE_COLUMNS.SMALL : GRID_TEMPLATE_COLUMNS.LARGE,\n        gridTemplateRows: mediaIndex < 3 ? 'auto' : '1fr',\n        height: '100%',\n        position: 'relative',\n      }}\n    >\n      {/* Progress bar */}\n      <div\n        style={{\n          background: 'var(--card-fg-color)',\n          bottom: 0,\n          height: '1px',\n          left: 0,\n          position: 'absolute',\n          width: '100%',\n          transform: `scaleX(${percentLoaded * 0.01})`,\n          transformOrigin: 'bottom left',\n          transition: 'all 1000ms ease-out',\n        }}\n      />\n\n      {/* Image */}\n      <Box\n        style={{\n          gridColumn: 2,\n          gridRowStart: mediaIndex < 3 ? 1 : 'auto',\n          gridRowEnd: mediaIndex < 3 ? 'span 4' : 'auto',\n          height: '90px',\n          width: '100px',\n        }}\n      >\n        <Box style={{height: '100%', position: 'relative'}}>\n          {item.assetType === 'image' && item?.objectUrl && (\n            <Image\n              draggable={false}\n              $scheme={scheme}\n              src={item.objectUrl}\n              style={{opacity: 0.25}}\n            />\n          )}\n\n          {item.assetType === 'file' && (\n            <div style={{height: '100%', opacity: 0.1}}>\n              <FileIcon width=\"40px\" />\n            </div>\n          )}\n\n          {/*\n            Cancel upload button.\n            Assets will only have a `complete` status _after_ it has been created on your dataset.\n            As such, we also hide the cancel button when `percentLoaded === 100`, as cancelling when the asset\n            has been fully uploaded (even with a status of `progress`) won't stop the asset from being created.\n          */}\n          {!isComplete && percentLoaded !== 100 && (\n            <Flex\n              align=\"center\"\n              justify=\"center\"\n              style={{\n                position: 'absolute',\n                height: '100%',\n                left: 0,\n                top: 0,\n                width: '100%',\n              }}\n            >\n              <Button\n                fontSize={3}\n                icon={CloseIcon}\n                mode=\"bleed\"\n                onClick={handleCancelUpload}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              />\n            </Flex>\n          )}\n        </Box>\n      </Box>\n\n      {/* Filename */}\n      <Box\n        style={{\n          gridColumn: mediaIndex < 3 ? 3 : '3/8',\n          gridRow: mediaIndex < 3 ? '2/4' : 'auto',\n          marginLeft: mediaIndex < 3 ? 3 : 0,\n        }}\n      >\n        <Stack gap={3}>\n          <Text muted size={1} textOverflow=\"ellipsis\">\n            {item.name} ({fileSize})\n          </Text>\n          <Text size={1} textOverflow=\"ellipsis\" weight=\"semibold\">\n            {status}\n          </Text>\n        </Stack>\n      </Box>\n    </Grid>\n  )\n}\n\nexport default TableRowUpload\n","import {Box} from '@sanity/ui'\nimport {memo} from 'react'\nimport {GroupedVirtuoso} from 'react-virtuoso'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport type {CardAssetData, CardFolderData, CardUploadData} from '../../types'\nimport TableHeader from '../TableHeader'\nimport TableRowAsset from '../TableRowAsset'\nimport TableRowFolder from '../TableRowFolder'\nimport TableRowUpload from '../TableRowUpload'\n\ntype Props = {\n  items: (CardAssetData | CardFolderData | CardUploadData)[]\n  onLoadMore?: () => void\n}\n\nconst VirtualRow = memo(\n  ({\n    item,\n    selected,\n  }: {\n    item: CardAssetData | CardFolderData | CardUploadData\n    selected: boolean\n  }) => {\n    if (item?.type === 'asset') {\n      return (\n        <Box style={{height: '100px'}}>\n          <TableRowAsset id={item.id} selected={selected} />\n        </Box>\n      )\n    }\n\n    if (item?.type === 'folder') {\n      return (\n        <Box style={{height: '100px'}}>\n          <TableRowFolder folderId={item.folderId} name={item.name} totalCount={item.totalCount} />\n        </Box>\n      )\n    }\n\n    if (item?.type === 'upload') {\n      return (\n        <Box style={{height: '100px'}}>\n          <TableRowUpload id={item.id} />\n        </Box>\n      )\n    }\n\n    return null\n  },\n)\n\nconst AssetTableVirtualized = (props: Props) => {\n  const {items, onLoadMore} = props\n\n  // Redux\n  const selectedAssets = useTypedSelector((state) => state.selected.assets)\n\n  const selectedIds = (selectedAssets && selectedAssets.map((asset) => asset._id)) || []\n  const totalCount = items?.length\n\n  if (totalCount === 0) {\n    return null\n  }\n\n  return (\n    <GroupedVirtuoso\n      className=\"media__custom-scrollbar\"\n      computeItemKey={(index) => {\n        const item = items[index]\n        return item?.id || index\n      }}\n      endReached={onLoadMore}\n      groupCounts={Array(1).fill(totalCount)}\n      groupContent={() => {\n        return <TableHeader />\n      }}\n      itemContent={(index) => {\n        const item = items[index]\n        const selected = selectedIds.includes(item?.id || '')\n        return <VirtualRow item={item!} selected={selected} />\n      }}\n      style={{overflowX: 'hidden'}}\n    />\n  )\n}\n\nexport default AssetTableVirtualized\n","import {Box, Text, useMediaIndex} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {useDispatch} from 'react-redux'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {selectCombinedItems} from '../../modules/selectors'\nimport {tagsActions} from '../../modules/tags'\nimport AssetGridVirtualized from '../AssetGridVirtualized'\nimport AssetTableVirtualized from '../AssetTableVirtualized'\n\nconst Items = () => {\n  // Redux\n  const dispatch = useDispatch()\n  const fetchCount = useTypedSelector((state) => state.assets.fetchCount)\n  const fetching = useTypedSelector((state) => state.assets.fetching)\n  const foldersPanelVisible = useTypedSelector((state) => state.folders.panelVisible)\n  const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n  const view = useTypedSelector((state) => state.assets.view)\n  const combinedItems = useTypedSelector(selectCombinedItems)\n\n  const mediaIndex = useMediaIndex()\n\n  const hasFetchedOnce = fetchCount >= 0\n  const hasItems = combinedItems.length > 0\n\n  // Only load 1 page of items at a time.\n  const handleLoadMoreItems = () => {\n    if (!fetching) {\n      dispatch(assetsActions.loadNextPage())\n    }\n  }\n\n  // Effects\n\n  // - Hide folders/tags panels on smaller breakpoints\n  useEffect(() => {\n    if (mediaIndex <= 1 && foldersPanelVisible) {\n      dispatch(foldersActions.panelVisibleSet({panelVisible: false}))\n    }\n\n    if (mediaIndex <= 1 && tagsPanelVisible) {\n      dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n    }\n  }, [dispatch, foldersPanelVisible, mediaIndex, tagsPanelVisible])\n\n  const isEmpty = !hasItems && hasFetchedOnce && !fetching\n\n  return (\n    <Box flex={1} style={{width: '100%'}}>\n      {isEmpty ? (\n        <Box padding={4}>\n          <Text size={1} weight=\"semibold\">\n            No results for the current query\n          </Text>\n        </Box>\n      ) : (\n        <>\n          {view === 'grid' && (\n            <AssetGridVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n          )}\n\n          {view === 'table' && (\n            <AssetTableVirtualized items={combinedItems} onLoadMore={handleLoadMoreItems} />\n          )}\n        </>\n      )}\n    </Box>\n  )\n}\n\nexport default Items\n","import {Box, Button, Flex, Label} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\n\nimport {PANEL_HEIGHT} from '../../constants'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {DIALOG_ACTIONS} from '../../modules/dialog/actions'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\nimport {isImageAsset} from '../../utils/typeGuards'\n\nconst PickedBar = () => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const currentFolderId = useTypedSelector((state) => state.folders.currentFolderId)\n  const {isMultiSelect, onSelect} = useAssetSourceActions()\n\n  // Replace only rewrites image field refs — only offer it for a single image asset.\n  const canReplace =\n    assetsPicked.length === 1 && !!assetsPicked[0] && isImageAsset(assetsPicked[0].asset)\n\n  // Callbacks\n  const handlePickClear = () => {\n    dispatch(assetsActions.pickClear())\n  }\n\n  const handleDeletePicked = () => {\n    dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\n  }\n\n  const handleReplaceImages = () => {\n    const assetId = assetsPicked[0]?.asset._id\n    if (!assetId) {\n      return\n    }\n    dispatch(dialogActions.showAllAssetsDialog({assetId}))\n  }\n\n  const handleMovePicked = () =>\n    dispatch(DIALOG_ACTIONS.showFolderMove({assets: assetsPicked, folderId: currentFolderId}))\n\n  const handleRemovePickedFromFolder = () =>\n    dispatch(assetsActions.folderSetRequest({assets: assetsPicked, folderId: null}))\n\n  const handleInsertPicked = () => {\n    if (!onSelect) {\n      return\n    }\n\n    const pickedAssetIds = assetsPicked.map((item) => ({\n      kind: 'assetDocumentId' as const,\n      value: item.asset._id,\n    }))\n\n    if (pickedAssetIds.length === 0) {\n      return\n    }\n\n    onSelect(pickedAssetIds)\n  }\n\n  if (assetsPicked.length === 0) {\n    return null\n  }\n\n  return (\n    <Flex\n      align=\"center\"\n      justify=\"flex-start\"\n      style={{\n        background: getSchemeColor(scheme, 'bg'),\n        borderBottom: '1px solid var(--card-border-color)',\n        height: `${PANEL_HEIGHT}px`,\n        position: 'relative',\n        width: '100%',\n      }}\n    >\n      <Flex align=\"center\" paddingX={3}>\n        <Box paddingRight={2}>\n          <Label size={0} style={{color: 'inherit'}}>\n            {assetsPicked.length} {pluralize('asset', assetsPicked.length)} selected\n          </Label>\n        </Box>\n\n        {/* Deselect button */}\n        <Button\n          mode=\"bleed\"\n          onClick={handlePickClear}\n          padding={2}\n          style={{background: 'none', boxShadow: 'none'}}\n          tone=\"default\"\n        >\n          <Label size={0}>Deselect</Label>\n        </Button>\n\n        {onSelect && isMultiSelect ? (\n          <Button\n            mode=\"bleed\"\n            onClick={handleInsertPicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"primary\"\n          >\n            <Label size={0}>Insert selected</Label>\n          </Button>\n        ) : (\n          <Button\n            mode=\"bleed\"\n            onClick={handleDeletePicked}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"critical\"\n          >\n            <Label size={0}>Delete</Label>\n          </Button>\n        )}\n\n        {/* Replace button */}\n        {canReplace && (\n          <Button\n            mode=\"bleed\"\n            onClick={handleReplaceImages}\n            padding={2}\n            style={{background: 'none', boxShadow: 'none'}}\n            tone=\"default\"\n          >\n            <Label size={0}>Replace</Label>\n          </Button>\n        )}\n\n        {!onSelect && (\n          <>\n            <Button\n              mode=\"bleed\"\n              onClick={handleMovePicked}\n              padding={2}\n              style={{background: 'none', boxShadow: 'none'}}\n              tone=\"primary\"\n            >\n              <Label size={0}>Move to folder</Label>\n            </Button>\n            {currentFolderId && (\n              <Button\n                mode=\"bleed\"\n                onClick={handleRemovePickedFromFolder}\n                padding={2}\n                style={{background: 'none', boxShadow: 'none'}}\n                tone=\"critical\"\n              >\n                <Label size={0}>Remove from folder</Label>\n              </Button>\n            )}\n          </>\n        )}\n      </Flex>\n    </Flex>\n  )\n}\n\nexport default PickedBar\n","import {Box} from '@sanity/ui'\n\nimport {TAGS_PANEL_WIDTH} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport TagView from '../TagView'\n\nconst TagsPanel = () => {\n  const tagsPanelVisible = useTypedSelector((state) => state.tags.panelVisible)\n\n  if (!tagsPanelVisible) {\n    return null\n  }\n\n  return (\n    <Box\n      style={{\n        position: 'relative',\n        width: TAGS_PANEL_WIDTH,\n      }}\n    >\n      <Box\n        className=\"media__custom-scrollbar\"\n        style={{\n          borderLeft: '1px solid var(--card-border-color)',\n          height: '100%',\n          overflowX: 'hidden',\n          overflowY: 'auto',\n          position: 'absolute',\n          right: 0,\n          top: 0,\n          width: '100%',\n        }}\n      >\n        <TagView />\n      </Box>\n    </Box>\n  )\n}\n\nexport default TagsPanel\n","import {white} from '@sanity/color'\nimport {Flex, Text} from '@sanity/ui'\nimport {type ReactNode} from 'react'\nimport {type DropEvent, type DropzoneOptions, useDropzone} from 'react-dropzone'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\n\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {DropzoneDispatchProvider} from '../../contexts/DropzoneDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {notificationsActions} from '../../modules/notifications'\nimport {uploadsActions} from '../../modules/uploads'\n\ntype Props = {\n  children: ReactNode\n}\n\nconst UploadContainer = styled.div`\n  color: white;\n  height: 100%;\n  min-height: 100%;\n  right: 0;\n  top: 0;\n  width: 100%;\n\n  &:focus {\n    outline: none;\n  }\n`\n\nconst DragActiveContainer = styled.div`\n  align-items: center;\n  background: rgba(0, 0, 0, 0.75);\n  display: flex;\n  height: 100%;\n  justify-content: center;\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 100%;\n  z-index: 3;\n`\n\n// Iterate through all files and only return non-folders / packages.\n// We check for files by reading the first byte of the file\nasync function filterFiles(fileList: FileList) {\n  const files = Array.from(fileList)\n\n  const filteredFiles: File[] = []\n\n  for (const file of files) {\n    try {\n      await file.slice(0, 1).arrayBuffer()\n      filteredFiles.push(file)\n    } catch {\n      // do nothing: file is a package or folder\n    }\n  }\n\n  return filteredFiles\n}\n\nconst UploadDropzone = (props: Props) => {\n  const {children} = props\n\n  const {\n    dropzone: {maxSize},\n    directUploads,\n  } = useToolOptions()\n\n  const {onSelect} = useAssetSourceActions()\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetTypes = useTypedSelector((state) => state.assets.assetTypes)\n\n  const isImageAssetType = assetTypes.length === 1 && assetTypes[0] === 'image'\n\n  // Callbacks\n  const handleDrop = async (acceptedFiles: File[]) => {\n    acceptedFiles.forEach((file) =>\n      dispatch(\n        uploadsActions.uploadRequest({\n          file,\n          forceAsAssetType: assetTypes.length === 1 ? assetTypes[0] : undefined,\n        }),\n      ),\n    )\n  }\n\n  const handleDropRejected: DropzoneOptions['onDropRejected'] = (rejections) => {\n    const errorCodes = rejections.flatMap(({errors}) => errors.map(({code}) => code))\n\n    if (errorCodes.includes('file-too-large')) {\n      dispatch(\n        notificationsActions.add({\n          status: 'error',\n          title: 'One or more files exceed the maximum upload size.',\n        }),\n      )\n    }\n  }\n\n  // Use custom file selector to obtain files on file drop + change events (excluding folders and packages)\n  const handleFileGetter = async (event: DropEvent) => {\n    let fileList: FileList | undefined\n    if (event.type === 'drop' && 'dataTransfer' in event) {\n      fileList = event?.dataTransfer?.files\n    }\n    if (event.type === 'change') {\n      const target = event?.target as HTMLInputElement\n      if (target?.files) {\n        fileList = target.files\n      }\n    }\n\n    if (!fileList) {\n      return []\n    }\n\n    // Filter out non-folders / packages\n    const files: File[] = await filterFiles(fileList)\n\n    // Dispatch error if some files have been filtered out\n    if (fileList?.length !== files.length) {\n      dispatch(\n        notificationsActions.add({\n          status: 'error',\n          title: `Unable to upload some items (folders and packages aren't supported)`,\n        }),\n      )\n    }\n\n    return files\n  }\n\n  // Limit file picking to only images if we're specifically within an image selection context (e.g. picking from image fields)\n  const {getRootProps, getInputProps, isDragActive, open} = useDropzone({\n    accept: isImageAssetType ? 'image/*' : '',\n    getFilesFromEvent: handleFileGetter,\n    noClick: true,\n    // HACK: Disable drag and drop functionality when in a selecting context\n    // (This is currently due to Sanity's native image input taking precedence with drag and drop)\n    noDrag: !!onSelect,\n    onDrop: handleDrop,\n    maxSize,\n    onDropRejected: handleDropRejected,\n    disabled: !directUploads,\n  })\n\n  return (\n    <DropzoneDispatchProvider open={open}>\n      <UploadContainer {...getRootProps()}>\n        <input {...getInputProps()} />\n\n        {isDragActive && (\n          <DragActiveContainer>\n            <Flex direction=\"column\" justify=\"center\" style={{color: white.hex}}>\n              <Text size={3} style={{color: 'inherit'}}>\n                Drop files to upload\n              </Text>\n            </Flex>\n          </DragActiveContainer>\n        )}\n\n        {children}\n      </UploadContainer>\n    </DropzoneDispatchProvider>\n  )\n}\n\nexport default UploadDropzone\n","import type {MutationEvent, SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {useEffect} from 'react'\nimport {useDispatch, useSelector} from 'react-redux'\nimport type {Dispatch} from 'redux'\nimport type {AssetSourceComponentProps} from 'sanity'\n\nimport {inputs} from '../../config/searchFacets'\nimport {FOLDER_DOCUMENT_NAME, TAG_DOCUMENT_NAME} from '../../constants'\nimport {assetsActions} from '../../modules/assets'\nimport {foldersActions} from '../../modules/folders'\nimport {searchActions} from '../../modules/search'\nimport {tagsActions} from '../../modules/tags'\nimport type {RootReducerState} from '../../modules/types'\nimport type {Asset, Tag} from '../../types'\n\nfunction getMediaTagNames(schemaType?: AssetSourceComponentProps['schemaType']): string[] {\n  const mediaTags = (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n  if (!mediaTags?.length) return []\n  const unique = new Set(\n    mediaTags.map((t) => t?.trim()).filter((t): t is string => Boolean(t?.length)),\n  )\n  return Array.from(unique)\n}\n\nfunction createAssetHandler(dispatch: Dispatch) {\n  return (update: MutationEvent) => {\n    const {documentId, result, transition} = update\n\n    switch (transition) {\n      case 'appear':\n        dispatch(assetsActions.listenerCreateQueue({asset: result as Asset}))\n        break\n      case 'disappear':\n        dispatch(assetsActions.listenerDeleteQueue({assetId: documentId}))\n        break\n      case 'update':\n        dispatch(assetsActions.listenerUpdateQueue({asset: result as Asset}))\n        break\n      default:\n        break\n    }\n  }\n}\n\nfunction createTagHandler(dispatch: Dispatch) {\n  return (update: MutationEvent) => {\n    const {documentId, result, transition} = update\n\n    switch (transition) {\n      case 'appear':\n        dispatch(tagsActions.listenerCreateQueue({tag: result as Tag}))\n        break\n      case 'disappear':\n        dispatch(tagsActions.listenerDeleteQueue({tagId: documentId}))\n        break\n      case 'update':\n        dispatch(tagsActions.listenerUpdateQueue({tag: result as Tag}))\n        break\n      default:\n        break\n    }\n  }\n}\n\nexport function useBrowserInit(\n  client: SanityClient,\n  schemaType?: AssetSourceComponentProps['schemaType'],\n): void {\n  const dispatch = useDispatch()\n  const tagsByIds = useSelector((state: RootReducerState) => state.tags.byIds)\n  const tagsFetchCount = useSelector((state: RootReducerState) => state.tags.fetchCount)\n\n  const tagNames = getMediaTagNames(schemaType)\n  const hasMediaTags = tagNames.length > 0\n\n  useEffect(() => {\n    if (!hasMediaTags) {\n      dispatch(searchActions.facetsClear())\n    }\n\n    dispatch(tagsActions.fetchRequest())\n\n    // Fetch all folders\n    dispatch(foldersActions.fetchRequest())\n\n    const assetSubscription = client\n      .listen(\n        groq`*[_type in [\"sanity.fileAsset\", \"sanity.imageAsset\"] && !(_id in path(\"drafts.**\"))]`,\n      )\n      .subscribe(createAssetHandler(dispatch))\n\n    const tagSubscription = client\n      .listen(groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n      .subscribe(createTagHandler(dispatch))\n\n    const folderSubscription = client\n      .listen(groq`*[_type == \"${FOLDER_DOCUMENT_NAME}\" && !(_id in path(\"drafts.**\"))]`)\n      .subscribe(() => dispatch(foldersActions.fetchRequest()))\n\n    return () => {\n      assetSubscription.unsubscribe()\n      tagSubscription.unsubscribe()\n      folderSubscription.unsubscribe()\n    }\n  }, [client, dispatch, hasMediaTags])\n\n  // When mediaTags are configured, wait for the tag fetch to complete then apply facets.\n  // Dispatching clear + add synchronously keeps all actions within assetsSearchEpic's\n  // 400ms debounce window, so the browser performs exactly one asset fetch on open.\n  useEffect(() => {\n    if (!hasMediaTags || tagsFetchCount < 0) return\n\n    const tagFacetInput = inputs.tag\n    if (tagFacetInput.type !== 'searchable') return\n\n    const resolvedTags = tagNames\n      .map((name) => Object.values(tagsByIds).find((item) => item.tag.name.current === name))\n      .filter((item): item is NonNullable<typeof item> => Boolean(item))\n\n    dispatch(searchActions.facetsClear())\n\n    for (const tagItem of resolvedTags) {\n      dispatch(\n        searchActions.facetsAdd({\n          facet: {\n            ...tagFacetInput,\n            operatorType: 'references',\n            value: {label: tagItem.tag.name.current, value: tagItem.tag._id},\n          },\n        }),\n      )\n    }\n    // oxlint-disable-next-line react/exhaustive-effect-dependencies\n  }, [tagsFetchCount, hasMediaTags]) // eslint-disable-line react-hooks/exhaustive-deps\n}\n","import {Card, Flex, PortalProvider} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument} from 'sanity'\n\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport Controls from '../Controls'\nimport DebugControls from '../DebugControls'\nimport Dialogs from '../Dialogs'\nimport FolderBreadcrumbs from '../FolderBreadcrumbs'\nimport FolderPanel from '../FolderPanel'\nimport Header from '../Header'\nimport Items from '../Items'\nimport Notifications from '../Notifications'\nimport PickedBar from '../PickedBar'\nimport ReduxProvider from '../ReduxProvider'\nimport TagsPanel from '../TagsPanel'\nimport UploadDropzone from '../UploadDropzone'\nimport {useBrowserInit} from './useBrowserInit'\n\ntype Props = {\n  assetType?: AssetSourceComponentProps['assetType']\n  document?: SanityDocument\n  isMultiSelect?: boolean\n  onClose?: AssetSourceComponentProps['onClose']\n  onSelect?: AssetSourceComponentProps['onSelect']\n  selectedAssets?: AssetSourceComponentProps['selectedAssets']\n  schemaType?: AssetSourceComponentProps['schemaType']\n}\n\nconst BrowserContent = ({\n  onClose,\n  schemaType,\n}: {\n  onClose?: AssetSourceComponentProps['onClose']\n  schemaType?: AssetSourceComponentProps['schemaType']\n}) => {\n  const client = useVersionedClient()\n  const [portalElement, setPortalElement] = useState<HTMLDivElement | null>(null)\n\n  useBrowserInit(client, schemaType)\n\n  return (\n    <PortalProvider element={portalElement}>\n      <UploadDropzone>\n        <Dialogs />\n        <Notifications />\n\n        <Card data-testid=\"media-browser\" display=\"flex\" height=\"fill\" ref={setPortalElement}>\n          <Flex direction=\"column\" flex={1}>\n            {/* Header */}\n            <Header onClose={onClose} />\n\n            {/* Browser Controls */}\n            <Controls />\n\n            <FolderBreadcrumbs />\n\n            <Flex flex={1}>\n              <FolderPanel />\n              <Flex align=\"flex-end\" direction=\"column\" flex={1} style={{position: 'relative'}}>\n                <PickedBar />\n                <Items />\n              </Flex>\n              <TagsPanel />\n            </Flex>\n\n            {/* Debug */}\n            <DebugControls />\n          </Flex>\n        </Card>\n      </UploadDropzone>\n    </PortalProvider>\n  )\n}\n\nconst Browser = (props: Props) => {\n  const client = useVersionedClient()\n  const {excludeTagSlugs} = useToolOptions()\n\n  return (\n    <ReduxProvider\n      assetType={props?.assetType}\n      client={client}\n      document={props?.document}\n      excludeTagSlugs={excludeTagSlugs}\n      selectedAssets={props?.selectedAssets}\n    >\n      <AssetBrowserDispatchProvider isMultiSelect={props?.isMultiSelect} onSelect={props?.onSelect}>\n        <GlobalStyle />\n        <BrowserContent onClose={props?.onClose} schemaType={props?.schemaType} />\n      </AssetBrowserDispatchProvider>\n    </ReduxProvider>\n  )\n}\n\nexport default Browser\n","import {Box, Portal, PortalProvider, useLayer} from '@sanity/ui'\nimport {type SyntheticEvent} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\n\nimport useKeyPress from '../../hooks/useKeyPress'\nimport useRootPortalElement from '../../hooks/useRootPortalElement'\nimport Browser from '../Browser'\n\nconst FormBuilderTool = (props: AssetSourceComponentProps) => {\n  const {onClose} = props\n\n  const portalElement = useRootPortalElement()\n\n  // Get current Sanity document\n  const currentDocument = useFormValue([]) as SanityDocument\n  const selectionType = (props as unknown as {selectionType?: string})?.selectionType\n  const schemaJsonType = (props?.schemaType as {jsonType?: string} | undefined)?.jsonType\n  const isMultiSelect = selectionType === 'multiple' || schemaJsonType === 'array'\n\n  // Close on escape key press\n  useKeyPress('escape', onClose)\n\n  // Stop propagation and prevent document mouse events from firing.\n  // This is a bit of a hack to make this work with `editModal = 'popover'` and prevent Sanity's <Popover /> component from\n  // prematurely closing, as it attaches events on `document` to detect outside clicks.\n  const handleStopPropagation = (event: SyntheticEvent) => {\n    event.nativeEvent.stopImmediatePropagation()\n    event.stopPropagation()\n  }\n\n  const {zIndex} = useLayer()\n\n  return (\n    <PortalProvider element={portalElement}>\n      <Portal>\n        <Box\n          onDragEnter={handleStopPropagation}\n          onDragLeave={handleStopPropagation}\n          onDragOver={handleStopPropagation}\n          onDrop={handleStopPropagation}\n          onMouseUp={handleStopPropagation}\n          style={{\n            bottom: 0,\n            height: 'auto',\n            left: 0,\n            position: 'fixed',\n            top: 0,\n            width: '100%',\n            zIndex,\n          }}\n        >\n          <Browser\n            document={currentDocument}\n            isMultiSelect={isMultiSelect}\n            schemaType={props.schemaType}\n            {...props}\n          />\n        </Box>\n      </Portal>\n    </PortalProvider>\n  )\n}\n\nexport default FormBuilderTool\n","import {Flex} from '@sanity/ui'\n\nimport Browser from '../Browser'\n\nconst Tool = () => {\n  return (\n    <Flex direction=\"column\" height=\"fill\" flex={1}>\n      <Browser />\n    </Flex>\n  )\n}\n\nexport default Tool\n","import {FolderIcon} from '@sanity/icons/Folder'\n\nimport {FOLDER_DOCUMENT_NAME} from '../constants'\n\nexport default {\n  title: 'Media Folder',\n  icon: FolderIcon,\n  name: FOLDER_DOCUMENT_NAME,\n  type: 'document',\n  fields: [\n    {\n      title: 'Name',\n      name: 'name',\n      type: 'string',\n    },\n    {\n      title: 'Parent',\n      name: 'parent',\n      type: 'reference',\n      to: [{type: FOLDER_DOCUMENT_NAME}],\n      weak: true,\n    },\n  ],\n  preview: {\n    select: {\n      name: 'name',\n      parentName: 'parent.name',\n    },\n    prepare(selection: {name?: string; parentName?: string}): {\n      media: typeof FolderIcon\n      subtitle?: string\n      title: string\n    } {\n      const {name, parentName} = selection\n      return {\n        media: FolderIcon,\n        title: name || 'Folder',\n        subtitle: parentName ? `in ${parentName}` : undefined,\n      }\n    },\n  },\n}\n","import TagIcon from '../components/TagIcon'\nimport {TAG_DOCUMENT_NAME} from '../constants'\n\nexport default {\n  title: 'Media Tag',\n  icon: TagIcon,\n  name: TAG_DOCUMENT_NAME,\n  type: 'document',\n  fields: [\n    {\n      title: 'Name',\n      name: 'name',\n      type: 'slug',\n    },\n  ],\n  preview: {\n    select: {\n      name: 'name',\n    },\n    prepare(selection: any) {\n      const {name} = selection\n      return {\n        media: TagIcon,\n        title: name?.current,\n      }\n    },\n  },\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {ImageIcon} from '@sanity/icons/Image'\nimport {type AssetSource, type Tool as SanityTool, definePlugin} from 'sanity'\n\nimport EditAssetTool from './components/EditAssetTool'\nimport FormBuilderTool from './components/FormBuilderTool'\nimport Tool from './components/Tool'\nimport {ToolOptionsProvider} from './contexts/ToolOptionsContext'\nimport mediaFolder from './schemas/folder'\nimport mediaTag from './schemas/tag'\nimport type {MediaToolOptions} from './types'\n\nconst plugin = {\n  icon: ImageIcon,\n  name: 'media',\n  title: 'Media',\n}\n\nexport const mediaAssetSource = {\n  ...plugin,\n  component: FormBuilderTool,\n} satisfies AssetSource\n\nconst editMediaAssetSource = {\n  icon: EditIcon,\n  name: 'edit-media',\n  // oxlint-disable-next-line no-deprecated -- `i18nKey` requires a locale bundle; a plain title is intentional here\n  title: 'Edit Media',\n  component: EditAssetTool,\n} satisfies AssetSource\n\nconst tool = {\n  ...plugin,\n  component: Tool,\n  __internalApplicationType: 'sanity/media',\n} satisfies SanityTool\n\nexport const media = definePlugin<MediaToolOptions | void>((options) => ({\n  name: 'media',\n  studio: {\n    components: {\n      layout: (props) => (\n        <ToolOptionsProvider options={options}>{props.renderDefault(props)}</ToolOptionsProvider>\n      ),\n    },\n  },\n  form: {\n    file: {\n      assetSources: (prev) => {\n        return [...prev, mediaAssetSource, editMediaAssetSource]\n      },\n    },\n    image: {\n      assetSources: (prev) => {\n        return [...prev, mediaAssetSource, editMediaAssetSource]\n      },\n    },\n  },\n  schema: {\n    types: [mediaTag, mediaFolder],\n  },\n  tools: (prev) => {\n    return [...prev, tool]\n  },\n}))\n","import type {SanityClient} from '@sanity/client'\nimport groq from 'groq'\nimport {nanoid} from 'nanoid'\n\nimport {TAG_DOCUMENT_NAME} from '../constants'\nimport type {Tag} from '../types'\n\ntype ApplyMediaTagsOptions = {\n  client: SanityClient\n  assetId: string\n  mediaTags: string[]\n  createTagsOnUpload?: boolean\n}\n\n// Serialize calls per asset so concurrent fields reading the same asset\n// don't race each other — the second call always runs after the first commits.\nconst pendingByAsset = new Map<string, Promise<void>>()\n\nexport function applyMediaTags(options: ApplyMediaTagsOptions): Promise<void> {\n  const {assetId} = options\n  const chain = (pendingByAsset.get(assetId) ?? Promise.resolve()).then(() =>\n    doApplyMediaTags(options),\n  )\n  const cleanup = chain\n    .catch(() => {})\n    .finally(() => {\n      if (pendingByAsset.get(assetId) === cleanup) pendingByAsset.delete(assetId)\n    })\n  pendingByAsset.set(assetId, cleanup)\n  return chain\n}\n\nasync function doApplyMediaTags({\n  client,\n  assetId,\n  mediaTags,\n  createTagsOnUpload = true,\n}: ApplyMediaTagsOptions): Promise<void> {\n  if (!mediaTags || mediaTags.length === 0) return\n\n  const resolvedTags = await Promise.all(\n    mediaTags.map(async (tagName) => {\n      const existingTag = await client.fetch<Tag | null>(\n        groq`*[_type == \"${TAG_DOCUMENT_NAME}\" && name.current == $tagName][0]`,\n        {tagName},\n      )\n      if (existingTag) return existingTag\n      if (createTagsOnUpload) {\n        const newTag = await client.create({\n          _type: TAG_DOCUMENT_NAME,\n          name: {_type: 'slug', current: tagName},\n        })\n        return newTag as Tag\n      }\n      return null\n    }),\n  )\n\n  const validTags = resolvedTags.filter((tag): tag is Tag => tag !== null)\n  if (validTags.length === 0) return\n\n  const existing = await client.fetch<{tagIds: string[]} | null>(\n    groq`*[_id == $assetId][0]{'tagIds': opt.media.tags[]._ref}`,\n    {assetId},\n    {useCdn: false}, // bypass CDN cache so we see the latest committed tag refs\n  )\n  const existingIds = new Set(existing?.tagIds ?? [])\n\n  const tagReferences = validTags\n    .filter((tag) => !existingIds.has(tag._id))\n    .map((tag) => ({\n      _key: nanoid(),\n      _ref: tag._id,\n      _type: 'reference' as const,\n      _weak: true,\n    }))\n\n  if (tagReferences.length === 0) return\n\n  await client\n    .patch(assetId)\n    .setIfMissing({opt: {}})\n    .setIfMissing({'opt.media': {}})\n    .setIfMissing({'opt.media.tags': []})\n    .append('opt.media.tags', tagReferences)\n    .commit()\n}\n","import {useToast} from '@sanity/ui/toast'\nimport {useEffect, useRef} from 'react'\nimport {type InputProps} from 'sanity'\n\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport {applyMediaTags} from '../../utils/applyMediaTags'\n\ntype AssetValue = {\n  _type: 'image' | 'file'\n  asset?: {\n    _ref: string\n    _type: 'reference'\n  }\n}\n\nexport type AutoTagInputProps = InputProps & {\n  mediaTags?: string[]\n}\n\n/**\n * Input component that automatically applies media tags when an asset is selected or uploaded.\n *\n * Apply explicitly to image/file fields that should be auto-tagged:\n * ```ts\n * import {AutoTagInput} from 'sanity-plugin-media'\n *\n * defineField({\n *   type: 'image',\n *   options: { mediaTags: ['product'] },   // also pre-filters the media browser\n *   components: { input: AutoTagInput },\n * })\n * ```\n *\n * Pass `mediaTags` as a prop to override or use without `options`:\n * ```ts\n * components: { input: (props) => <AutoTagInput {...props} mediaTags={['product']} /> }\n * ```\n */\nexport function AutoTagInput(props: AutoTagInputProps) {\n  const {renderDefault, schemaType, value, mediaTags: mediaTagsProp} = props\n  const toast = useToast()\n\n  // Prop takes precedence; fall back to schemaType.options.mediaTags (set for browser pre-filtering)\n  const mediaTags =\n    mediaTagsProp ?? (schemaType?.options as {mediaTags?: string[]} | undefined)?.mediaTags\n\n  const client = useVersionedClient()\n  const {createTagsOnUpload} = useToolOptions()\n\n  const prevAssetRef = useRef<string | undefined>(undefined)\n  const isInitialMount = useRef(true)\n\n  const currentAssetRef = (value as AssetValue | undefined)?.asset?._ref\n\n  useEffect(() => {\n    if (isInitialMount.current) {\n      isInitialMount.current = false\n      prevAssetRef.current = currentAssetRef\n      return\n    }\n\n    const previousRef = prevAssetRef.current\n    prevAssetRef.current = currentAssetRef\n\n    if (!mediaTags?.length || !currentAssetRef || currentAssetRef === previousRef) return\n\n    applyMediaTags({\n      client,\n      assetId: currentAssetRef,\n      mediaTags,\n      createTagsOnUpload,\n    }).catch((err) => {\n      console.error('[sanity-plugin-media] Failed to apply auto-tags:', err)\n      const label = mediaTags.length === 1 ? 'tag' : 'tags'\n      toast.push({\n        closable: true,\n        status: 'error',\n        title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`,\n      })\n    })\n  }, [currentAssetRef, mediaTags, client, createTagsOnUpload, toast])\n\n  return renderDefault(props as InputProps)\n}\n","import type {\n  FieldDefinitionBase,\n  FileDefinition,\n  ImageDefinition,\n  WidenInitialValue,\n  WidenValidation,\n} from 'sanity'\n\nimport {AutoTagInput} from '../components/AutoTagInputWrapper'\n\ntype ImageMediaFieldConfig = Omit<ImageDefinition, 'options'> &\n  FieldDefinitionBase & {\n    name: string\n    mediaTags: string[]\n    options?: ImageDefinition['options']\n  }\n\ntype FileMediaFieldConfig = Omit<FileDefinition, 'options'> &\n  FieldDefinitionBase & {\n    name: string\n    mediaTags: string[]\n    options?: FileDefinition['options']\n  }\n\ntype ImageMediaFieldResult = Omit<ImageDefinition, 'options'> &\n  FieldDefinitionBase & {\n    options?: ImageDefinition['options'] & {mediaTags: string[]}\n    components: {input: typeof AutoTagInput}\n  } & WidenValidation &\n  WidenInitialValue\n\ntype FileMediaFieldResult = Omit<FileDefinition, 'options'> &\n  FieldDefinitionBase & {\n    options?: FileDefinition['options'] & {mediaTags: string[]}\n    components: {input: typeof AutoTagInput}\n  } & WidenValidation &\n  WidenInitialValue\n\n/**\n * Defines an image or file field with automatic media tag application when an asset is selected.\n *\n * Pass `mediaTags` at the top level — they are moved into `options.mediaTags` (for media browser\n * pre-filtering) and wire up {@link AutoTagInput} as the field component automatically:\n * ```ts\n * import {mediaField} from 'sanity-plugin-media'\n *\n * mediaField({\n *   name: 'coverImage',\n *   type: 'image',\n *   mediaTags: ['product-cover'],\n *   options: { hotspot: true },\n * })\n * ```\n *\n * For file fields, set `type: 'file'`:\n * ```ts\n * mediaField({ name: 'drawing', type: 'file', mediaTags: ['model-drawing'] })\n * ```\n */\nexport function mediaField(config: ImageMediaFieldConfig): ImageMediaFieldResult\nexport function mediaField(config: FileMediaFieldConfig): FileMediaFieldResult\nexport function mediaField(\n  config: ImageMediaFieldConfig | FileMediaFieldConfig,\n): ImageMediaFieldResult | FileMediaFieldResult {\n  const {mediaTags, options, components, ...rest} = config as ImageMediaFieldConfig & {\n    components?: Record<string, unknown>\n  }\n  return {\n    ...rest,\n    options: {...options, mediaTags},\n    components: {...components, input: AutoTagInput},\n  } as unknown as ImageMediaFieldResult\n}\n"],"mappings":"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"}
\ No newline at end of file