{"version":3,"file":"index.mjs","sources":["../node_modules/is-hotkey/lib/index.js","../src/hooks/useKeyPress.ts","../src/contexts/AssetSourceDispatchContext.tsx","../src/hooks/useVersionedClient.ts","../src/styled/GlobalStyles/index.tsx","../src/hooks/useTypedSelector.ts","../src/config/orders.ts","../src/config/searchFacets.ts","../src/constants.ts","../src/operators/debugThrottle.ts","../src/utils/constructFilter.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/dialog/index.ts","../src/components/ButtonViewGroup/index.tsx","../src/hooks/usePortalPopoverProps.ts","../src/components/OrderSelect/index.tsx","../src/components/Progress/index.tsx","../src/utils/getSchemeColor.ts","../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/contexts/ToolOptionsContext.tsx","../src/components/SearchFacetsControl/index.tsx","../src/components/TagIcon/index.tsx","../src/components/TextInputSearch/index.tsx","../src/components/Controls/index.tsx","../src/modules/debug/index.ts","../src/components/DebugControls/index.tsx","../src/formSchema/index.ts","../src/utils/getUniqueDocuments.ts","../src/utils/imageDprUrl.ts","../src/utils/sanitizeFormData.ts","../src/utils/typeGuards.ts","../src/utils/getAssetResolution.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/components/Image/index.tsx","../src/styled/react-select/creatable.tsx","../src/components/FormFieldInputLabel/index.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/components/DialogConfirm/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/contexts/DropzoneDispatchContext.tsx","../src/components/Header/index.tsx","../src/hooks/useBreakpointIndex.ts","../src/modules/selectors.ts","../src/components/CardAsset/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/TableHeaderItem/index.tsx","../src/components/TableHeader/index.tsx","../src/components/TableRowAsset/index.tsx","../src/components/TableRowUpload/index.tsx","../src/components/AssetTableVirtualized/index.tsx","../src/components/Items/index.tsx","../src/components/Notifications/index.tsx","../src/components/PickedBar/index.tsx","../src/modules/selected/index.ts","../src/modules/notifications/index.ts","../src/modules/index.ts","../src/utils/getDocumentAssetIds.ts","../src/utils/isSupportedAssetType.ts","../src/components/ReduxProvider/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/tag.ts","../src/plugin.tsx","../src/utils/applyMediaTags.ts","../src/components/AutoTagInputWrapper/index.tsx","../src/utils/mediaField.ts"],"sourcesContent":["'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\n/**\n * Constants.\n */\n\nvar IS_MAC = typeof window != 'undefined' && /Mac|iPod|iPhone|iPad/.test(window.navigator.platform);\n\nvar MODIFIERS = {\n  alt: 'altKey',\n  control: 'ctrlKey',\n  meta: 'metaKey',\n  shift: 'shiftKey'\n};\n\nvar ALIASES = {\n  add: '+',\n  break: 'pause',\n  cmd: 'meta',\n  command: 'meta',\n  ctl: 'control',\n  ctrl: 'control',\n  del: 'delete',\n  down: 'arrowdown',\n  esc: 'escape',\n  ins: 'insert',\n  left: 'arrowleft',\n  mod: IS_MAC ? 'meta' : 'control',\n  opt: 'alt',\n  option: 'alt',\n  return: 'enter',\n  right: 'arrowright',\n  space: ' ',\n  spacebar: ' ',\n  up: 'arrowup',\n  win: 'meta',\n  windows: 'meta'\n};\n\nvar CODES = {\n  backspace: 8,\n  tab: 9,\n  enter: 13,\n  shift: 16,\n  control: 17,\n  alt: 18,\n  pause: 19,\n  capslock: 20,\n  escape: 27,\n  ' ': 32,\n  pageup: 33,\n  pagedown: 34,\n  end: 35,\n  home: 36,\n  arrowleft: 37,\n  arrowup: 38,\n  arrowright: 39,\n  arrowdown: 40,\n  insert: 45,\n  delete: 46,\n  meta: 91,\n  numlock: 144,\n  scrolllock: 145,\n  ';': 186,\n  '=': 187,\n  ',': 188,\n  '-': 189,\n  '.': 190,\n  '/': 191,\n  '`': 192,\n  '[': 219,\n  '\\\\': 220,\n  ']': 221,\n  '\\'': 222\n};\n\nfor (var f = 1; f < 20; f++) {\n  CODES['f' + f] = 111 + f;\n}\n\n/**\n * Is hotkey?\n */\n\nfunction isHotkey(hotkey, options, event) {\n  if (options && !('byKey' in options)) {\n    event = options;\n    options = null;\n  }\n\n  if (!Array.isArray(hotkey)) {\n    hotkey = [hotkey];\n  }\n\n  var array = hotkey.map(function (string) {\n    return parseHotkey(string, options);\n  });\n  var check = function check(e) {\n    return array.some(function (object) {\n      return compareHotkey(object, e);\n    });\n  };\n  var ret = event == null ? check : check(event);\n  return ret;\n}\n\nfunction isCodeHotkey(hotkey, event) {\n  return isHotkey(hotkey, event);\n}\n\nfunction isKeyHotkey(hotkey, event) {\n  return isHotkey(hotkey, { byKey: true }, event);\n}\n\n/**\n * Parse.\n */\n\nfunction parseHotkey(hotkey, options) {\n  var byKey = options && options.byKey;\n  var ret = {};\n\n  // Special case to handle the `+` key since we use it as a separator.\n  hotkey = hotkey.replace('++', '+add');\n  var values = hotkey.split('+');\n  var length = values.length;\n\n  // Ensure that all the modifiers are set to false unless the hotkey has them.\n\n  for (var k in MODIFIERS) {\n    ret[MODIFIERS[k]] = false;\n  }\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var value = _step.value;\n\n      var optional = value.endsWith('?') && value.length > 1;\n\n      if (optional) {\n        value = value.slice(0, -1);\n      }\n\n      var name = toKeyName(value);\n      var modifier = MODIFIERS[name];\n\n      if (value.length > 1 && !modifier && !ALIASES[value] && !CODES[name]) {\n        throw new TypeError('Unknown modifier: \"' + value + '\"');\n      }\n\n      if (length === 1 || !modifier) {\n        if (byKey) {\n          ret.key = name;\n        } else {\n          ret.which = toKeyCode(value);\n        }\n      }\n\n      if (modifier) {\n        ret[modifier] = optional ? null : true;\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  return ret;\n}\n\n/**\n * Compare.\n */\n\nfunction compareHotkey(object, event) {\n  for (var key in object) {\n    var expected = object[key];\n    var actual = void 0;\n\n    if (expected == null) {\n      continue;\n    }\n\n    if (key === 'key' && event.key != null) {\n      actual = event.key.toLowerCase();\n    } else if (key === 'which') {\n      actual = expected === 91 && event.which === 93 ? 91 : event.which;\n    } else {\n      actual = event[key];\n    }\n\n    if (actual == null && expected === false) {\n      continue;\n    }\n\n    if (actual !== expected) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/**\n * Utils.\n */\n\nfunction toKeyCode(name) {\n  name = toKeyName(name);\n  var code = CODES[name] || name.toUpperCase().charCodeAt(0);\n  return code;\n}\n\nfunction toKeyName(name) {\n  name = name.toLowerCase();\n  name = ALIASES[name] || name;\n  return name;\n}\n\n/**\n * Export.\n */\n\nexports.default = isHotkey;\nexports.isHotkey = isHotkey;\nexports.isCodeHotkey = isCodeHotkey;\nexports.isKeyHotkey = isKeyHotkey;\nexports.parseHotkey = parseHotkey;\nexports.compareHotkey = compareHotkey;\nexports.toKeyCode = toKeyCode;\nexports.toKeyName = toKeyName;","import isHotkey from 'is-hotkey'\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 {type ReactNode, createContext, useContext} from 'react'\nimport type {AssetSourceComponentProps} from 'sanity'\n\ntype ContextProps = {\n  onSelect?: AssetSourceComponentProps['onSelect']\n}\n\ntype Props = {\n  children: ReactNode\n  onSelect?: AssetSourceComponentProps['onSelect']\n}\n\nconst AssetSourceDispatchContext = createContext<ContextProps | undefined>(undefined)\n\nexport const AssetBrowserDispatchProvider = (props: Props) => {\n  const {children, onSelect} = props\n\n  const contextValue: ContextProps = {\n    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\nexport default AssetSourceDispatchContext\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 {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 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 {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 type {\n  SearchFacetDivider,\n  SearchFacetInputProps,\n  SearchFacetName,\n  SearchFacetOperators\n} from '../types'\nimport groq from 'groq'\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  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'\nimport type {\n  SearchFacetInputProps,\n  SearchFacetDivider,\n  SearchFacetGroup,\n  OrderDirection\n} from './types'\nimport {divider, inputs} from './config/searchFacets'\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.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 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 type {AssetType, SearchFacetInputProps} from '../types'\nimport groq from 'groq'\n\nimport {operators} from '../config/searchFacets'\n\nconst constructFilter = ({\n  assetTypes,\n  searchFacets,\n  searchQuery\n}: {\n  assetTypes: AssetType[]\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 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  // Join separate filter fragments\n  const constructedQuery = [\n    // Base filter\n    baseFilter,\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    // Search facets\n    ...searchFacetFragments\n  ].join(' && ')\n\n  return constructedQuery\n}\n\nexport default constructFilter\n","import type {SanityClient} from '@sanity/client'\nimport type {HttpError} from '../types'\nimport groq from 'groq'\nimport {from, Observable, of, throwError} from 'rxjs'\nimport {mergeMap} from 'rxjs/operators'\nimport {TAG_DOCUMENT_NAME} from '../constants'\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            message: 'Tag already exists',\n            statusCode: 409\n          } as HttpError)\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'\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\nexport const DIALOG_ACTIONS = {\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 type {Asset, HttpError, MyEpic, TagSelectOption, Tag, TagItem} from '../../types'\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'\nimport {TAG_DOCUMENT_NAME} from '../../constants'\nimport checkTagName from '../../operators/checkTagName'\nimport debugThrottle from '../../operators/debugThrottle'\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 type {MyEpic, SearchFacetInputProps, SearchFacetOperatorType, WithId} from '../../types'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap, withLatestFrom} from 'rxjs/operators'\nimport {uuid} from '@sanity/uuid'\n\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 {ClientError, Patch, Transaction} from '@sanity/client'\nimport type {\n  Asset,\n  AssetItem,\n  AssetType,\n  BrowserView,\n  HttpError,\n  MyEpic,\n  Order,\n  OrderDirection,\n  Tag\n} from '../../types'\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  debounceTime,\n  filter,\n  mergeMap,\n  switchMap,\n  withLatestFrom\n} from 'rxjs/operators'\nimport {getOrderTitle} from '../../config/orders'\nimport {ORDER_OPTIONS} from '../../constants'\nimport debugThrottle from '../../operators/debugThrottle'\nimport constructFilter from '../../utils/constructFilter'\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  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  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          state.byIds[asset._id] = {\n            _type: 'asset',\n            asset: asset,\n            picked: false,\n            updating: false\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    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                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\n      state.byIds[assetId].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    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        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\nexport const assetsRemoveTagsEpic: 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 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 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\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\nexport const 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 {createSlice, type PayloadAction} from '@reduxjs/toolkit'\nimport type {AssetItem, Dialog, MyEpic, Tag} from '../../types'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {EMPTY, of} from 'rxjs'\nimport {filter, mergeMap} from 'rxjs/operators'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\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.addCase(DIALOG_ACTIONS.showTagCreate, state => {\n      state.items.push({\n        id: 'tagCreate',\n        type: 'tagCreate'\n      })\n    })\n    builder.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  },\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    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    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    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.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 {ThLargeIcon, ThListIcon} from '@sanity/icons'\nimport {Button, Inline} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\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 space={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 {type PopoverProps, usePortal} from '@sanity/ui'\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 {SortIcon} from '@sanity/icons'\nimport {Button, Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\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                  space={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","import {hues} from '@sanity/color'\nimport {type ThemeColorSchemeKey, studioTheme} from '@sanity/ui'\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: studioTheme.color.dark.default.input.default.enabled.border,\n    light: studioTheme.color.light.default.input.default.enabled.border\n  },\n  inputHoveredBorder: {\n    dark: studioTheme.color.dark.default.input.default.hovered.border,\n    light: studioTheme.color.light.default.input.default.hovered.border\n  },\n  mutedHoveredBg: {\n    dark: studioTheme.color.dark.primary.muted.primary.hovered.bg,\n    light: studioTheme.color.light.primary.muted.primary.hovered.bg\n  },\n  mutedHoveredFg: {\n    dark: studioTheme.color.dark.primary.muted.primary.hovered.fg,\n    light: studioTheme.color.light.primary.muted.primary.hovered.fg\n  },\n  mutedSelectedBg: {\n    dark: studioTheme.color.dark.primary.muted.primary.selected.bg,\n    light: studioTheme.color.light.primary.muted.primary.selected.bg\n  },\n  spotBlue: {\n    dark: studioTheme.color.dark.primary.spot.blue,\n    light: studioTheme.color.light.primary.spot.blue\n  }\n}\n\ntype SchemeColorKey = keyof typeof SCHEME_COLORS\n\nexport function getSchemeColor(scheme: ThemeColorSchemeKey, colorKey: SchemeColorKey): string {\n  return SCHEME_COLORS[colorKey]?.[scheme]\n}\n","import {CloseIcon} from '@sanity/icons'\nimport {Box, Flex, Label, rem, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport type {SearchFacetInputProps, WithId} from '../../types'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\nimport {searchActions} from '../../modules/search'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  children: ReactNode\n  facet: WithId<SearchFacetInputProps>\n}\n\nconst Container = styled<typeof Box, {$scheme: ThemeColorSchemeKey}>(Box)(({$scheme, theme}) => {\n  return css`\n    background: ${getSchemeColor($scheme, 'bg')};\n    border-radius: ${rem(theme.sanity.radius[2])};\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'\nimport {Box, Button, Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui'\nimport type {\n  SearchFacetInputNumberModifier,\n  SearchFacetInputNumberProps,\n  SearchFacetOperatorType,\n  WithId\n} from '../../types'\n\nimport {useDispatch} from 'react-redux'\nimport {operators} from '../../config/searchFacets'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport {searchActions} from '../../modules/search'\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'\nimport {Box, Button, Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui'\nimport type {\n  SearchFacetInputSelectListItemProps,\n  SearchFacetInputSelectProps,\n  SearchFacetOperatorType,\n  WithId\n} from '../../types'\n\nimport {useDispatch} from 'react-redux'\n\nimport {operators} from '../../config/searchFacets'\nimport {searchActions} from '../../modules/search'\nimport SearchFacet from '../SearchFacet'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\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, index) => {\n              const selected = item.name === selectedItem?.name\n              return (\n                <MenuItem\n                  disabled={selected}\n                  fontSize={1}\n                  key={item.name}\n                  onClick={() => handleListItemClick(options[index])}\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'\nimport {Box, Button, Menu, MenuButton, MenuDivider, MenuItem, TextInput} from '@sanity/ui'\nimport type {SearchFacetInputStringProps, SearchFacetOperatorType, WithId} from '../../types'\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 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'\nimport {Box, Card, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\nconst {\n  fonts: {\n    text: {sizes: themeTextSizes}\n  },\n  radius: themeRadius,\n  space: themeSpace\n} = studioTheme\n\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      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      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'\nimport {Box, Button, Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui'\nimport type {\n  TagSelectOption,\n  SearchFacetInputSearchableProps,\n  SearchFacetOperatorType,\n  WithId\n} from '../../types'\nimport {useDispatch} from 'react-redux'\nimport Select from 'react-select'\nimport {useColorSchemeValue} from 'sanity'\nimport {operators} from '../../config/searchFacets'\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 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 tags = useTypedSelector(state => selectTags(state))\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                      space={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'\n\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\nconst StackContainer = styled(Flex)(({theme}: {theme: Theme}) => {\n  return css`\n    > * {\n      margin-bottom: ${rem(theme.sanity.space[2])};\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 space={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 type {MediaToolOptions, Locale} from '../types'\nimport {type PropsWithChildren, createContext, useContext, useMemo} from 'react'\nimport type {DropzoneOptions} from 'react-dropzone'\n\ntype ContextProps = {\n  dropzone: Pick<DropzoneOptions, 'maxSize'>\n  components: MediaToolOptions['components']\n  createTagsOnUpload: boolean\n  creditLine: MediaToolOptions['creditLine']\n  directUploads: MediaToolOptions['directUploads']\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      locales: options?.locales\n    }\n  }, [\n    options?.creditLine?.enabled,\n    options?.components,\n    options?.createTagsOnUpload,\n    options?.creditLine?.excludeSources,\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 {AddIcon} from '@sanity/icons'\nimport {Button, Flex, Menu, MenuButton, MenuDivider, MenuGroup, MenuItem} from '@sanity/ui'\nimport type {SearchFacetDivider, SearchFacetGroup, SearchFacetInputProps} from '../../types'\n\nimport {useDispatch} from 'react-redux'\nimport {FACETS} from '../../constants'\nimport {usePortalPopoverProps} from '../../hooks/usePortalPopoverProps'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {searchActions} from '../../modules/search'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\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 = !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            space={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","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, SearchIcon} from '@sanity/icons'\nimport {Box, Flex, TextInput} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\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 {Box, Button, Flex, Inline, useMediaIndex} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\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 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 handleShowTagsDialog = () => {\n    dispatch(dialogActions.showTags())\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              <SearchFacetsControl />\n            </Box>\n\n            <Box display={['block', 'block', 'none']} marginX={2}>\n              <Inline space={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              </Inline>\n            </Box>\n          </Flex>\n        </Flex>\n      </Box>\n\n      <Box>\n        <Flex align=\"center\" justify={['space-between']}>\n          {/* Views */}\n          <Box marginX={2}>\n            <ButtonViewGroup />\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 {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 {PlugIcon} from '@sanity/icons'\nimport {Box, Flex, Switch, Text, Tooltip} from '@sanity/ui'\nimport {type ChangeEvent} from 'react'\nimport {useDispatch} from 'react-redux'\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 * as z from 'zod'\n\n// Helper to generate localized string schema\nexport function 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","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 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 {ClipboardIcon} from '@sanity/icons'\nimport {Button, Popover, Text} from '@sanity/ui'\nimport copy from 'copy-to-clipboard'\nimport {useEffect, useRef, useState} from 'react'\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'\nimport {Box, Button, Flex, Inline, Stack, Text} from '@sanity/ui'\nimport type {Asset, AssetItem} from '../../types'\nimport { format } from 'date-fns'\nimport filesize from 'filesize'\nimport {type ReactNode} from 'react'\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 space={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 space={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 space={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'\n\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 space={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\nconst Container = styled(Box)(({theme}: {theme: Theme}) => {\n  return css`\n    text {\n      font-family: ${theme.sanity.fonts.text.family} !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'\nimport type {Asset} from '../../types'\n\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, Tooltip} from '@sanity/ui'\nimport { format } from 'date-fns'\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 type {ThemeColorSchemeKey} from '@sanity/ui'\nimport type {MouseEvent} from 'react'\nimport {styled, css} from 'styled-components'\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<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: 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: 0 0, 0 10px, 10px -10px, -10px 0;\n    `}\n`\n\nexport default Image\n","import {AddIcon, ChevronDownIcon, CloseIcon} from '@sanity/icons'\nimport {Box, Card, Flex, rem, studioTheme, Text, type ThemeColorSchemeKey} from '@sanity/ui'\nimport {components, type StylesConfig} from 'react-select'\nimport {Virtuoso} from 'react-virtuoso'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\nconst {radius: themeRadius, space: themeSpace} = studioTheme\n\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      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      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 {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Inline, Text, Tooltip} from '@sanity/ui'\n\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    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 space={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 htmlFor={name} muted size={1}>\n            {description}\n          </Text>\n        </Box>\n      )}\n    </>\n  )\n}\n\nexport default FormFieldInputLabel\n","import {Box} from '@sanity/ui'\nimport {Controller} from 'react-hook-form'\nimport CreatableSelect from 'react-select/creatable'\nimport {useColorSchemeValue} from 'sanity'\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 {forwardRef} 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  placeholder?: string\n  value?: string\n}\n\ntype Ref = HTMLInputElement\n\nconst FormFieldInputText = forwardRef<Ref, Props>((props: Props, ref) => {\n  const {description, disabled, error, label, name, placeholder, value, ...rest} = 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        placeholder={placeholder}\n        ref={ref}\n      />\n    </Box>\n  )\n})\n\nexport default FormFieldInputText\n","import {Box, TextArea} from '@sanity/ui'\nimport {forwardRef} 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  placeholder?: string\n  rows?: number\n  value?: string\n}\n\ntype Ref = HTMLTextAreaElement\n\nconst FormFieldInputTextarea = forwardRef<Ref, Props>((props: Props, ref) => {\n  const {description, disabled, error, label, name, placeholder, rows, value, ...rest} = 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        placeholder={placeholder}\n        ref={ref}\n        rows={rows}\n      />\n    </Box>\n  )\n})\n\nexport default FormFieldInputTextarea\n","import {Card, Stack, Tab, TabList, TabPanel} from '@sanity/ui'\nimport {useState} from 'react'\nimport {type Control, type FieldErrors, type UseFormRegister} from 'react-hook-form'\nimport type {Asset, AssetFormData, Locale, TagSelectOption} from '../../types'\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\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  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  creditLine,\n  locales\n}: DetailsProps) {\n  const hasLocales = locales && locales.length > 0\n  const [activeLocaleTab, setActiveLocaleTab] = useState(0)\n  return (\n    <Stack space={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      {/* 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 space={2}>\n            <TabList space={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 space={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            value={toStringField(currentAsset?.description)}\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 {zodResolver} from '@hookform/resolvers/zod'\nimport type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Stack, Tab, TabList, TabPanel, Text} from '@sanity/ui'\nimport type {Asset, AssetFormData, DialogAssetEditProps, TagSelectOption} from '../../types'\nimport groq from 'groq'\nimport {type ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\nimport {WithReferringDocuments, useColorSchemeValue, useDocumentStore} from 'sanity'\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 {selectTags, selectTagSelectOptions, tagsActions} from '../../modules/tags'\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 AssetMetadata from '../AssetMetadata'\nimport Dialog from '../Dialog'\nimport DocumentList from '../DocumentList'\nimport FileAssetPreview from '../FileAssetPreview'\nimport FormSubmitButton from '../FormSubmitButton'\nimport Image from '../Image'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\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\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      if (locales && locales.length > 0) {\n        const makeLocaleObj = (field?: Record<string, string> | string) => {\n          const obj: Record<string, string> = {}\n          for (let i = 0; i < locales.length; i++) {\n            const locale = locales[i]\n            if (typeof field === 'object' && field && field[locale.id]) {\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 {\n              obj[locale.id] = ''\n            }\n          }\n          return obj\n        }\n        return {\n          altText: makeLocaleObj(asset?.altText),\n          creditLine: makeLocaleObj(asset?.creditLine),\n          description: makeLocaleObj(asset?.description),\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): 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) || ''\n        }\n        return ''\n      }\n      return {\n        altText: flattenField(asset?.altText),\n        creditLine: flattenField(asset?.creditLine),\n        description: flattenField(asset?.description),\n        originalFilename: asset?.originalFilename || '',\n        opt: {media: {tags: assetTagOptions}},\n        title: flattenField(asset?.title)\n      }\n    },\n    [assetTagOptions, locales]\n  )\n\n  const {\n    control,\n    // Read the formState before render to subscribe the form state through Proxy\n    formState: {errors, isDirty, isValid},\n    getValues,\n    handleSubmit,\n    register,\n    reset,\n    setValue\n  } = useForm<AssetFormData>({\n    defaultValues: generateDefaultValues(assetItem?.asset),\n    mode: 'onChange',\n    resolver: zodResolver(getAssetFormSchema(locales))\n  })\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  // 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) =>\n      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      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              }\n            }\n          }\n        })\n      )\n    },\n    [assetItem?.asset, 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 space={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    creditLine,\n    locales\n  }\n\n  return (\n    <Dialog\n      animate\n      footer={<Footer />}\n      header=\"Asset details\"\n      id={id}\n      onClose={handleClose}\n      width={3}\n    >\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 documentStore={documentStore} id={currentAsset._id}>\n            {({isLoading, referringDocuments}) => {\n              const uniqueReferringDocuments = getUniqueDocuments(referringDocuments)\n              return (\n                <>\n                  {/* Tabs */}\n                  <TabList space={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 {WarningOutlineIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Stack, Text} from '@sanity/ui'\nimport type {DialogConfirmProps} from '../../types'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {dialogActions} from '../../modules/dialog'\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      footer={<Footer />}\n      header={<Header />}\n      id=\"confirm\"\n      onClose={handleClose}\n      width={1}\n    >\n      <Box paddingX={4} paddingY={4}>\n        <Stack space={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} from '@sanity/ui'\nimport type {DialogSearchFacetsProps} from '../../types'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {dialogActions} from '../../modules/dialog'\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  }, [])\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 {zodResolver} from '@hookform/resolvers/zod'\nimport {Box, Flex} from '@sanity/ui'\nimport type {DialogTagCreateProps, TagFormData} from '../../types'\nimport {type ReactNode, useEffect} from 'react'\nimport {type SubmitHandler, useForm} from 'react-hook-form'\nimport {useDispatch} from 'react-redux'\nimport {tagFormSchema} from '../../formSchema'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {dialogActions} from '../../modules/dialog'\nimport {tagsActions} from '../../modules/tags'\nimport sanitizeFormData from '../../utils/sanitizeFormData'\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: zodResolver(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 animate footer={<Footer />} header=\"Create Tag\" id={id} onClose={handleClose} width={1}>\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 {zodResolver} from '@hookform/resolvers/zod'\nimport type {MutationEvent} from '@sanity/client'\nimport {Box, Button, Card, Flex, Text} from '@sanity/ui'\nimport type {DialogTagEditProps, Tag, TagFormData} from '../../types'\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'\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 sanitizeFormData from '../../utils/sanitizeFormData'\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 = (tag?: Tag) => ({\n    name: tag?.name?.current || ''\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: zodResolver(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]\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 animate footer={<Footer />} header=\"Edit Tag\" id={id} onClose={handleClose} width={1}>\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, ArrowUpIcon, CloseIcon, EditIcon, SearchIcon, TrashIcon} from '@sanity/icons'\nimport {Box, Button, Container, Flex, Text, Tooltip} from '@sanity/ui'\nimport type {SearchFacetInputSearchableProps, TagActions, TagItem} from '../../types'\nimport {type ReactNode} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {styled} from 'styled-components'\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'\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 type {TagActions, TagItem} from '../../types'\nimport {memo, useState} from 'react'\nimport {Virtuoso} from 'react-virtuoso'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectAssetsPicked} from '../../modules/assets'\nimport {selectTags} from '../../modules/tags'\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 = () => {\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n  const tags = useTypedSelector(selectTags)\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'\nimport {Box, Button, Flex, Inline, Label} from '@sanity/ui'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\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 space={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 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 tags = useTypedSelector(selectTags)\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 />}\n    </Flex>\n  )\n}\n\nexport default TagView\n","import {Box} from '@sanity/ui'\nimport type {DialogTagsProps} from '../../types'\nimport {type ReactNode, useCallback} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {dialogActions} from '../../modules/dialog'\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  }, [])\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 type {Dialog} from '../../types'\n\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport DialogAssetEdit from '../DialogAssetEdit'\nimport DialogConfirm from '../DialogConfirm'\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 === '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    return null\n  }\n\n  return renderDialogs(currentDialogs, 0)\n}\n\nexport default Dialogs\n","import {type ReactNode, createContext, useContext} 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 = {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\nexport default DropzoneDispatchContext\n","import {CloseIcon, Icon, UploadIcon} from '@sanity/icons'\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 useTypedSelector from '../../hooks/useTypedSelector'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\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                    <Icon symbol=\"arrow-right\" />\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 {studioTheme} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\n\n// Determine the current breakpoint index\n// - create MediaQueryLists from every breakpoint defined in our sanity studio theme\n// - for each MQL, listen to change events and return the selected breakpoint index\nconst useBreakpointIndex = (): number => {\n  const mediaQueryLists = studioTheme?.container?.map(width =>\n    window.matchMedia(`(max-width: ${width}px)`)\n  )\n\n  const getBreakpointIndex = () => mediaQueryLists.findIndex(mql => mql.matches)\n\n  const [value, setValue] = useState(getBreakpointIndex())\n\n  useEffect(() => {\n    const handleBreakpoint = () => {\n      setValue(getBreakpointIndex)\n    }\n\n    // NOTE: older versions of Safari use the older `addListener` and `removeListener` methods\n    mediaQueryLists.forEach(mql => {\n      try {\n        mql.addEventListener('change', handleBreakpoint)\n      } catch (err) {\n        try {\n          mql.addListener(handleBreakpoint)\n        } catch (_err) {\n          // Do nothing\n        }\n      }\n    })\n    return () => {\n      try {\n        mediaQueryLists.forEach(mql => mql.removeEventListener('change', handleBreakpoint))\n      } catch (err) {\n        try {\n          mediaQueryLists.forEach(mql => mql.removeListener(handleBreakpoint))\n        } catch (_err) {\n          // Do nothing\n        }\n      }\n    }\n  }, [])\n\n  return value\n}\n\nexport default useBreakpointIndex\n","import {createSelector} from '@reduxjs/toolkit'\nimport type {CardAssetData, CardUploadData} from '../types'\n\nimport type {RootReducerState} from './types'\n\nexport const selectCombinedItems = createSelector(\n  [\n    (state: RootReducerState) => state.assets.allIds,\n    (state: RootReducerState) => state.uploads.allIds\n  ],\n  (assetIds, uploadIds) => {\n    const assetItems = assetIds.map(id => ({id, type: 'asset'} as CardAssetData))\n    const uploadItems = uploadIds.map(id => ({id, type: 'upload'} as CardUploadData))\n    const combinedItems: (CardAssetData | CardUploadData)[] = [...uploadItems, ...assetItems]\n    return combinedItems\n  }\n)\n","import {CheckmarkCircleIcon, EditIcon, WarningFilledIcon} from '@sanity/icons'\nimport {\n  Box,\n  Checkbox,\n  Container,\n  Flex,\n  Spinner,\n  Text,\n  type Theme,\n  type ThemeColorSchemeKey,\n  Tooltip\n} from '@sanity/ui'\nimport {memo, type MouseEvent, type RefObject} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {styled, css} from 'styled-components'\nimport {PANEL_HEIGHT} 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 imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\ntype Props = {\n  id: string\n  selected: boolean\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 CardContainer = styled(Flex)<{$picked?: boolean; theme: Theme; $updating?: boolean}>(\n  ({$picked, theme, $updating}) => {\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: ${$picked\n        ? `1px solid ${theme.sanity.color.spot.orange} !important`\n        : '1px solid inherit'};\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\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(\n  ({$scheme}) => {\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)\n\nconst StyledWarningOutlineIcon = styled(WarningFilledIcon)(({theme}) => {\n  return {\n    color: theme.sanity.color.spot.red\n  }\n})\n\nconst CardAsset = (props: Props) => {\n  const {id, selected} = props\n\n  const scheme = useColorSchemeValue()\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 item = useTypedSelector(state => selectAssetById(state, id))\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 {onSelect} = useAssetSourceActions()\n\n  // Short circuit if no asset is available\n  if (!asset) {\n    return null\n  }\n\n  // Callbacks\n  const handleAssetClick = (e: MouseEvent<HTMLDivElement>) => {\n    e.stopPropagation()\n\n    if (onSelect) {\n      onSelect([\n        {\n          kind: 'assetDocumentId',\n          value: asset._id\n        }\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 (onSelect) {\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 onClick={handleAssetClick} style={{height: '100%', opacity: opacityPreview}}>\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 ? (\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 {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","// 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'\nimport {Subject, Subscription, Observable, from} from 'rxjs'\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 type {HttpError} from '../types'\nimport {Observable, of, throwError} from 'rxjs'\nimport {map, mergeMap} from 'rxjs/operators'\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          message: 'Asset already exists',\n          statusCode: 409\n        } as HttpError)\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', '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 type {HttpError, MyEpic, SanityUploadProgressEvent, UploadItem} from '../../types'\nimport groq from 'groq'\nimport type {Selector} from 'react-redux'\nimport {empty, merge, of} from 'rxjs'\nimport {catchError, delay, filter, mergeMap, takeUntil, withLatestFrom} from 'rxjs/operators'\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              return of(\n                UPLOADS_ACTIONS.uploadComplete({\n                  asset: event.asset\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            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        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\nconst selectUploadsByIds = (state: RootReducerState) => state.uploads.byIds\n\nconst selectUploadsAllIds = (state: RootReducerState) => state.uploads.allIds\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 selectUploads: Selector<RootReducerState, UploadItem[]> = createSelector(\n  [selectUploadsByIds, selectUploadsAllIds],\n  (byIds, allIds) => allIds.map(id => byIds[id])\n)\n\nexport const uploadsActions = {...uploadsSlice.actions}\n\nexport default uploadsSlice.reducer\n","import {CloseIcon} from '@sanity/icons'\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'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {selectUploadById, uploadsActions} from '../../modules/uploads'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\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 type {CardAssetData, CardUploadData} from '../../types'\nimport {memo, forwardRef} from 'react'\nimport {VirtuosoGrid} from 'react-virtuoso'\nimport {styled} from 'styled-components'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport CardAsset from '../CardAsset'\nimport CardUpload from '../CardUpload'\n\ntype Props = {\n  items: (CardAssetData | CardUploadData)[]\n  onLoadMore?: () => void\n}\n\nconst CARD_HEIGHT = 220\nconst CARD_WIDTH = 240\n\nconst VirtualCell = memo(\n  ({item, selected}: {item: CardAssetData | CardUploadData; selected: boolean}) => {\n    if (item?.type === 'asset') {\n      return <CardAsset id={item.id} selected={selected} />\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 = forwardRef<HTMLDivElement, any>((props, ref) => {\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, ...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 = forwardRef<HTMLDivElement, any>((props, ref) => {\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, ...rest} = props\n  return <StyledListContainer ref={ref} {...rest} />\n})\n\nconst AssetGridVirtualized = (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    <VirtuosoGrid\n      className=\"media__custom-scrollbar\"\n      computeItemKey={index => {\n        const item = items[index]\n        return item?.id\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} />\n      }}\n      overscan={48}\n      style={{overflowX: 'hidden', overflowY: 'scroll'}}\n      totalCount={totalCount}\n    />\n  )\n}\n\nexport default AssetGridVirtualized\n","import {ChevronDownIcon, ChevronUpIcon} from '@sanity/icons'\nimport {Box, Label} from '@sanity/ui'\n\nimport {useDispatch} from 'react-redux'\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, type ThemeColorSchemeKey, useMediaIndex} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {useDispatch} from 'react-redux'\nimport {styled, css} from 'styled-components'\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 TableHeaderItem from '../TableHeaderItem'\nimport {useColorSchemeValue} from 'sanity'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\n// TODO: DRY\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(\n  ({$scheme}) => {\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)\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        gridColumnGap: 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, EditIcon, WarningFilledIcon} from '@sanity/icons'\nimport {\n  Box,\n  Checkbox,\n  Container,\n  Flex,\n  Grid,\n  Spinner,\n  Text,\n  type ThemeColorSchemeKey,\n  Tooltip,\n  useMediaIndex\n} from '@sanity/ui'\nimport { formatRelative } from 'date-fns'\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'\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 imageDprUrl from '../../utils/imageDprUrl'\nimport {isFileAsset, isImageAsset} from '../../utils/typeGuards'\nimport FileIcon from '../FileIcon'\nimport Image from '../Image'\nimport {getUniqueDocuments} from '../../utils/getUniqueDocuments'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\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  {$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    ${!$updating &&\n    css`\n      @media (hover: hover) and (pointer: fine) {\n        &:hover {\n          background: ${getSchemeColor($scheme, 'bg')};\n        }\n      }\n    `}\n  `\n})\n\nconst ContextActionContainer = styled<typeof Flex, {$scheme: ThemeColorSchemeKey}>(Flex)(\n  ({$scheme}) => {\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)\n\nconst StyledWarningIcon = styled(WarningFilledIcon)(({theme}) => {\n  return {\n    color: theme.sanity.color.spot.red\n  }\n})\n\n// eslint-disable-next-line complexity\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 {onSelect} = useAssetSourceActions()\n\n  const handleContextActionClick = useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (onSelect) {\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, lastPicked, onSelect, picked, shiftPressed]\n  )\n\n  const handleClick = useCallback(\n    (e: MouseEvent<HTMLDivElement>) => {\n      e.stopPropagation()\n\n      if (!asset) return\n      if (onSelect) {\n        onSelect([{kind: 'assetDocumentId', value: asset._id}])\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, lastPicked, onSelect, picked, 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        gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n        gridRowGap: 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 ? (\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 id={id}>\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 {CloseIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Grid, Stack, Text, useMediaIndex} from '@sanity/ui'\nimport filesize from 'filesize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\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        gridColumnGap: mediaIndex < 3 ? 0 : '16px',\n        gridRowGap: 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 space={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 type {CardAssetData, CardUploadData} from '../../types'\nimport {Box} from '@sanity/ui'\nimport {memo} from 'react'\nimport {GroupedVirtuoso} from 'react-virtuoso'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport TableHeader from '../TableHeader'\nimport TableRowAsset from '../TableRowAsset'\nimport TableRowUpload from '../TableRowUpload'\n\ntype Props = {\n  items: (CardAssetData | CardUploadData)[]\n  onLoadMore?: () => void\n}\n\nconst VirtualRow = memo(\n  ({item, selected}: {item: CardAssetData | CardUploadData; selected: boolean}) => {\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 === '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} from '@sanity/ui'\nimport {useEffect} from 'react'\nimport {useDispatch} from 'react-redux'\nimport useBreakpointIndex from '../../hooks/useBreakpointIndex'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions} from '../../modules/assets'\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 tagsPanelVisible = useTypedSelector(state => state.tags.panelVisible)\n  const view = useTypedSelector(state => state.assets.view)\n  const combinedItems = useTypedSelector(selectCombinedItems)\n\n  const breakpointIndex = useBreakpointIndex()\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 tag panel on smaller breakpoints\n  useEffect(() => {\n    if (breakpointIndex <= 1 && tagsPanelVisible) {\n      dispatch(tagsActions.panelVisibleSet({panelVisible: false}))\n    }\n  }, [breakpointIndex])\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 {useToast} from '@sanity/ui'\nimport {useEffect} from 'react'\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.length])\n\n  return null\n}\n\nexport default Notifications\n","import {Box, Button, Flex, Label} from '@sanity/ui'\nimport pluralize from 'pluralize'\nimport {useDispatch} from 'react-redux'\nimport {useColorSchemeValue} from 'sanity'\nimport {PANEL_HEIGHT} from '../../constants'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {assetsActions, selectAssetsPicked} from '../../modules/assets'\nimport {dialogActions} from '../../modules/dialog'\nimport {getSchemeColor} from '../../utils/getSchemeColor'\n\nconst PickedBar = () => {\n  const scheme = useColorSchemeValue()\n\n  // Redux\n  const dispatch = useDispatch()\n  const assetsPicked = useTypedSelector(selectAssetsPicked)\n\n  // Callbacks\n  const handlePickClear = () => {\n    dispatch(assetsActions.pickClear())\n  }\n\n  const handleDeletePicked = () => {\n    dispatch(dialogActions.showConfirmDeleteAssets({assets: assetsPicked}))\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        {/* Delete button */}\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      </Flex>\n    </Flex>\n  )\n}\n\nexport default PickedBar\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 PayloadAction, createSlice} from '@reduxjs/toolkit'\nimport type {AnyAction} from 'redux'\nimport type {HttpError, ImageAsset, MyEpic} from '../../types'\nimport pluralize from 'pluralize'\nimport {ofType} from 'redux-observable'\nimport {of} from 'rxjs'\nimport {bufferTime, filter, mergeMap} from 'rxjs/operators'\nimport {assetsActions} from '../assets'\nimport {ASSETS_ACTIONS} from '../assets/actions'\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      uploadsActions.uploadError.type\n    ),\n    mergeMap((action: AnyAction) => {\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 notificationsActions = {...notificationsSlice.actions}\n\nexport default notificationsSlice.reducer\n","import {\n  type ActionFromReducersMapObject,\n  type Reducer,\n  type StateFromReducersMapObject,\n  combineReducers\n} from '@reduxjs/toolkit'\nimport {combineEpics} from 'redux-observable'\n\nimport assetsReducer, {\n  assetsDeleteEpic,\n  assetsFetchAfterDeleteAllEpic,\n  assetsFetchEpic,\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} from './assets'\nimport debugReducer from './debug'\nimport dialogReducer, {\n  dialogClearOnAssetUpdateEpic,\n  dialogTagCreateEpic,\n  dialogTagDeleteEpic\n} from './dialog'\nimport selectedReducer from './selected'\nimport notificationsReducer, {\n  notificationsAssetsDeleteErrorEpic,\n  notificationsAssetsDeleteCompleteEpic,\n  notificationsAssetsTagsAddCompleteEpic,\n  notificationsAssetsTagsRemoveCompleteEpic,\n  notificationsAssetsUpdateCompleteEpic,\n  notificationsGenericErrorEpic,\n  notificationsTagCreateCompleteEpic,\n  notificationsTagDeleteCompleteEpic,\n  notificationsTagUpdateCompleteEpic\n} from './notifications'\nimport searchReducer, {searchFacetTagUpdateEpic} from './search'\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  assetsListenerCreateQueueEpic,\n  assetsListenerDeleteQueueEpic,\n  assetsListenerUpdateQueueEpic,\n  assetsOrderSetEpic,\n  assetsSearchEpic,\n  assetsSortEpic,\n  assetsTagsAddEpic,\n  assetsTagsRemoveEpic,\n  assetsUnpickEpic,\n  assetsUpdateEpic,\n  dialogClearOnAssetUpdateEpic,\n  dialogTagCreateEpic,\n  dialogTagDeleteEpic,\n  notificationsAssetsDeleteErrorEpic,\n  notificationsAssetsDeleteCompleteEpic,\n  notificationsAssetsTagsAddCompleteEpic,\n  notificationsAssetsTagsRemoveCompleteEpic,\n  notificationsAssetsUpdateCompleteEpic,\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  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<\n  StateFromReducersMapObject<ReducersMapObject>,\n  ActionFromReducersMapObject<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 {type AnyAction, configureStore, type Store} from '@reduxjs/toolkit'\nimport type {SanityClient} from '@sanity/client'\nimport type {AssetSourceComponentProps, SanityDocument} from 'sanity'\nimport {Component, type ReactNode} from 'react'\nimport {Provider} from 'react-redux'\nimport {createEpicMiddleware} from 'redux-observable'\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  selectedAssets?: AssetSourceComponentProps['selectedAssets']\n}\n\nclass ReduxProvider extends Component<Props> {\n  store: Store\n\n  constructor(props: Props) {\n    super(props)\n\n    // Initialize redux store + middleware\n    const epicMiddleware = createEpicMiddleware<AnyAction, AnyAction, RootReducerState>({\n      dependencies: {\n        client: props.client // inject sanity client as a dependency to all epics\n      }\n    })\n    this.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        },\n        debug: {\n          badConnection: false,\n          enabled: false\n        },\n        dialog: {items: []},\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    epicMiddleware.run(rootEpic)\n  }\n\n  override render() {\n    return <Provider store={this.store}>{this.props.children}</Provider>\n  }\n}\n\nexport default ReduxProvider\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'\nimport {useAssetSourceActions} from '../../contexts/AssetSourceDispatchContext'\nimport {DropzoneDispatchProvider} from '../../contexts/DropzoneDispatchContext'\nimport useTypedSelector from '../../hooks/useTypedSelector'\nimport {notificationsActions} from '../../modules/notifications'\nimport {uploadsActions} from '../../modules/uploads'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\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 (err) {\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 {AssetSourceComponentProps} from 'sanity'\nimport type {Dispatch} from 'redux'\n\nimport {inputs} from '../../config/searchFacets'\nimport {TAG_DOCUMENT_NAME} from '../../constants'\nimport {searchActions} from '../../modules/search'\nimport {tagsActions} from '../../modules/tags'\nimport type {RootReducerState} from '../../modules/types'\nimport type {Asset, Tag} from '../../types'\nimport {assetsActions} from '../../modules/assets'\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    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    return () => {\n      assetSubscription.unsubscribe()\n      tagSubscription.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  }, [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'\nimport {AssetBrowserDispatchProvider} from '../../contexts/AssetSourceDispatchContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\nimport GlobalStyle from '../../styled/GlobalStyles'\nimport Controls from '../Controls'\nimport DebugControls from '../DebugControls'\nimport Dialogs from '../Dialogs'\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  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 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            <Flex flex={1}>\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\n  return (\n    <ReduxProvider\n      assetType={props?.assetType}\n      client={client}\n      document={props?.document}\n      selectedAssets={props?.selectedAssets}\n    >\n      <AssetBrowserDispatchProvider 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, useEffect, useState} from 'react'\nimport {type AssetSourceComponentProps, type SanityDocument, useFormValue} from 'sanity'\nimport useKeyPress from '../../hooks/useKeyPress'\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\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 document={currentDocument} schemaType={props.schemaType} {...props} />\n        </Box>\n      </Portal>\n    </PortalProvider>\n  )\n}\n\nexport default FormBuilderTool\n\nconst useRootPortalElement = () => {\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","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 {TAG_DOCUMENT_NAME} from '../constants'\nimport TagIcon from '../components/TagIcon'\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 {type AssetSource, type Tool as SanityTool, definePlugin} from 'sanity'\nimport {ImageIcon} from '@sanity/icons'\nimport FormBuilderTool from './components/FormBuilderTool'\nimport Tool from './components/Tool'\nimport mediaTag from './schemas/tag'\nimport type {MediaToolOptions} from './types'\nimport {ToolOptionsProvider} from './contexts/ToolOptionsContext'\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 tool = {\n  ...plugin,\n  component: Tool,\n  // @ts-expect-error TS doesn't know about this internal field see https://github.com/sanity-io/sanity/pull/7980\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]\n      }\n    },\n    image: {\n      assetSources: prev => {\n        return [...prev, mediaAssetSource]\n      }\n    }\n  },\n  schema: {\n    types: [mediaTag]\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'\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'\nimport {useEffect, useRef} from 'react'\nimport {type InputProps} from 'sanity'\nimport {applyMediaTags} from '../../utils/applyMediaTags'\nimport {useToolOptions} from '../../contexts/ToolOptionsContext'\nimport useVersionedClient from '../../hooks/useVersionedClient'\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({closable: true, status: 'error', title: `Failed to apply the media ${label} ${mediaTags.join(', ')}`})\n    })\n  }, [currentAssetRef, mediaTags, client, createTagsOnUpload])\n\n  return renderDefault(props as InputProps)\n}\n\nexport default AutoTagInput\n","import type {\n  FieldDefinitionBase,\n  FileDefinition,\n  ImageDefinition,\n  WidenInitialValue,\n  WidenValidation\n} from 'sanity'\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"],"names":["isHotkey","initialState","Menu","Container","themeRadius","themeSpace","reactSelectStyles","MenuList","Option","reactSelectComponents","Items","SanityDialog","ReactFileIcon","Image","VirtualRow","CardWrapper","ContextActionContainer","CardAsset","TableRowAsset","document","assetsInitialState","components"],"mappings":"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","x_google_ignoreList":[0]}