@sanity/hierarchical-document-list

4.0.34.0.4
dist/index.js.map
~dist/index.js.mapModified
+1−1
Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["Box","Card","Container","Heading","Stack","Text","Fragment","PropsWithChildren","WrapCodeBlocks","t0","$","_c","text","t1","split","map","_temp","t2","DeskWarning","props","Symbol","for","maxWidth","title","subtitle","_temp2","t3","children","t4","part","i","line","useEffect","useReducer","useState","SanityDocument","useClient","AllItems","TreeInputOptions","isDraft","unprefixId","getDeskFilter","referenceTo","referenceOptions","filter","params","Record","filterParts","push","join","filterParams","docTypes","map","schemaType","Status","ACTIONTYPE","type","item","itemId","items","updateItemInState","state","newState","publishedId","_id","allItemsReducer","action","published","draft","reduce","useAllItems","options","$","_c","t0","Symbol","for","apiVersion","client","status","setStatus","t1","allItems","dispatch","t2","t3","handleListener","event","result","documentId","query","fetchInitialData","fetch","listener","listen","subscribe","unsubscribe","t4","createContext","useContext","useAllItems","useTreeOperationsProvider","ContextValue","ReturnType","allItemsStatus","placeholder","TreeOperationsContext","addItem","duplicateItem","removeItem","handleMovedNode","moveItemDown","moveItemUp","useTreeOperations","EditIcon","PublishIcon","Box","Inline","Text","Tooltip","SanityDocument","TextWithTone","useRelativeTime","DocumentPair","TimeAgo","t0","$","_c","time","timeAgo","t1","toLowerCase","trim","startsWith","t2","PublishedStatus","document","_updatedAt","t3","t4","Symbol","for","t5","t6","DraftStatus","DocumentPreviewStatus","draft","published","HelpCircleIcon","Box","Card","Flex","Stack","Text","Tooltip","ReactNode","useMemo","Preview","SanityDocument","SchemaType","TextWithTone","useSchema","RouterPaneGroup","usePaneRouter","useTreeOperations","LocalTreeItem","DocumentPreviewStatus","DocumentInNode","props","$","_c","value","t0","draftId","publishedId","item","t1","undefined","reference","docType","referenceId","_ref","routerPanesState","ChildLink","allItemsStatus","schema","t2","t3","pane","some","group","id","isActive","get","type","t4","Symbol","for","flex","t5","draftUpdatedAt","publishedUpdatedAt","_id","_type","_updatedAt","t6","action","CopyIcon","EllipsisVerticalIcon","LaunchIcon","RemoveCircleIcon","Button","Menu","MenuButton","MenuDivider","MenuItem","IntentButton","IntentLink","useTreeOperations","NodeProps","NodeActions","t0","$","_c","nodeProps","operations","node","t1","value","reference","docType","referenceId","_ref","isValid","publishedId","t2","Symbol","for","t3","_key","t4","removeItem","t5","t6","duplicateItem","t7","t8","t9","t10","id","type","t11","t12","t13","portal","tone","placement","t14","StoredTreeItem","TreeItemWithChildren","key","children","flatDataToTree","data","childrenByParent","Map","item","parentKey","parent","siblings","get","push","set","buildNode","_key","map","getSchemaTypeName","documentType","type","DEFAULT_DOC_TYPE","INTERNAL_NODE_TYPE","INTERNAL_NODE_VALUE_TYPE","INTERNAL_NODE_ARRAY_TYPE","injectNodeTypeInPatches","patchData","Array","isArray","map","child","newObject","Record","key","Object","keys","value","includes","randomKey","DocumentInNode","NodeActions","AllItems","DocumentPair","EnhancedTreeItem","LocalTreeItem","NodeProps","StoredTreeItem","VisibilityMap","flatDataToTree","INTERNAL_NODE_TYPE","INTERNAL_NODE_VALUE_TYPE","dataToEditorTree","tree","allItems","visibilityMap","itemsWithTitle","filter","item","value","reference","_ref","map","refId","docPair","undefined","draftDoc","draft","publishedDoc","published","enhancedItem","_key","_type","parent","expanded","draftId","_id","publishedId","draftUpdatedAt","_updatedAt","publishedUpdatedAt","Object","assign","title","nodeProps","children","documentPairToNode","doc","_weak","docType","getUnaddedItems","data","values","flatMap","documentPair","node","entries","some","treeItem","normalizeNodeForStorage","useState","AllItems","LocalTreeItem","StoredTreeItem","VisibilityMap","dataToEditorTree","useLocalTree","t0","$","_c","tree","allItems","t1","Symbol","for","visibilityMap","setVisibilityMap","t2","handleVisibilityToggle","data","currentMap","node","_key","expanded","t3","t4","localTree","LocalTreeItem","LocalFlatDataItem","getAdjescentNodes","flatTree","node","treeIndex","leadingNode","followingNode","isOutsideOfNode","item","path","includes","_key","slice","reverse","find","moveItemInArray","array","fromIndex","toIndex","ItemType","newArray","target","splice","undefined","FlatDataItem","TreeItem","getFlatDataFromTree","randomKey","Patch","LocalTreeItem","NodeProps","getAdjescentNodes","moveItemInArray","normalizeNodeForStorage","LocalFlatDataItem","Omit","node","parentNode","HandleMovedNodeData","treeData","nextParentNode","nextPath","nextTreeIndex","HandleMovedNode","moveData","getLocalFlatDataFromTree","getNodeKey","t","getAddItemPatch","item","normalizedNode","insert","getDuplicateItemPatch","nodeProps","newItem","_key","getRemoveItemPatch","Pick","keyPath","children","getChildrenPaths","unset","map","path","getMovedNodePatch","data","Array","isArray","nextFlatTree","leadingNode","followingNode","flatTree","treeIndex","set","keyPaths","child","childKey","push","getMoveItemPatch","localTree","direction","array","fromIndex","toIndex","nodeToInheritParent","PatchEvent","PathSegment","prefixPath","setIfMissing","LocalTreeItem","NodeProps","HandleMovedNode","HandleMovedNodeData","getAddItemPatch","getDuplicateItemPatch","getMoveItemPatch","getMovedNodePatch","getRemoveItemPatch","useTreeOperationsProvider","props","patchPrefix","onChange","patch","localTree","handleMovedNode","addItem","item","duplicateItem","nodeProps","removeItem","moveItemUp","moveItemDown","runPatches","patches","finalPatches","prefix","patchEvent","from","map","data","direction","isDescendant","cyan","gray","red","ChevronDownIcon","ChevronRightIcon","DragHandleIcon","Box","Button","Flex","Spinner","useMemo","styled","Root","div","hex","NodeContentRenderer","props","$","_c","node","path","treeIndex","canDrag","t0","canDrop","connectDragSource","connectDragPreview","toggleChildrenVisibility","draggedNode","didDrop","isDragging","undefined","nodeTitle","title","t1","bb0","children","expanded","t2","Symbol","for","publishedId","t3","cursor","fontSize","t4","t5","marginBottom","t6","button","t7","Handle","isDraggedDescendant","isLandingPadActive","position","length","left","top","transform","opacity","t8","t9","t10","t11","Box","Card","CardTone","Stack","Text","ReactNode","PlaceholderDropzoneProps","title","subtitle","isOver","canDrop","children","PlaceholderDropzone","props","$","_c","isValid","isInvalid","tone","t0","undefined","t1","borderStyle","t2","Symbol","for","textAlign","t3","t4","t5","t6","t7","t8","t9","blue","ReactNode","createGlobalStyle","ScaffoldStyles","hex","TreeNodeRendererScaffold","props","$","_c","lowerSiblingCounts","scaffoldBlockPxWidth","listIndex","swapDepth","swapFrom","swapLength","treeIndex","t0","t1","lowerSiblingCount","i","highlightLineClass","style","width","left","map","scaffold","Symbol","for","t2","Children","ReactElement","cloneElement","TreeNodeRendererScaffold","BASE_LEFT_PADDING","NESTING_PADDING","TreeNodeRenderer","props","$","_c","children","lowerSiblingCounts","connectDropTarget","isOver","draggedNode","canDrop","scaffoldBlockCount","length","t0","style","t1","t2","paddingLeft","t3","t4","child","map","t5","t6","SortableTree","ComponentProps","NodeContentRenderer","PlaceholderDropzone","TreeNodeRenderer","ReactSortableTreeProps","getCommonTreeProps","placeholder","title","subtitle","Partial","theme","nodeContentRenderer","placeholderRenderer","props","treeNodeRenderer","style","height","innerStyle","undefined","scaffoldBlockPxWidth","slideRegionSize","TreeItem","getVisibleNodeCount","getTreeHeight","treeData","rowHeight","visibleNodeCount","TreeEditorErrorBoundary","props","children","SortableTreeWithoutDndContext","SortableTree","TreeItem","AddCircleIcon","Box","Button","Card","Flex","Spinner","Stack","Text","Tooltip","useCallback","useEffect","useMemo","useState","DndProvider","HTML5Backend","PatchEvent","useAllItems","useLocalTree","TreeOperationsContext","useTreeOperationsProvider","Optional","StoredTreeItem","TreeDeskStructureProps","getCommonTreeProps","getTreeHeight","getUnaddedItems","HandleMovedNodeData","DocumentInNode","TreeEditorErrorBoundary","TreeEditorProps","tree","onChange","patch","options","patchPrefix","TreeEditor","props","$","_c","status","allItemsStatus","allItems","unAddedItems","t0","localTree","handleVisibilityToggle","t1","operations","context","setContext","treeViewHeight","setTreeViewHeight","documentId","t2","el","document","querySelector","rowHeight","offsetHeight","updateTreeViewHeight","t3","t4","timeout","setTimeout","clearTimeout","t5","data","handleMovedNode","onMoveNode","t6","Symbol","for","placeholder","title","treeProps","t7","operationContext","T0","T1","t8","rootElement","minHeight","length","maxDepth","doNothingOnChange","canDrop","getNodeKey","height","undefined","map","item","publishedId","draftId","addItem","cursor","t9","t10","nextPath","prevPath","insideItself","every","pathIndex","index","node","arrayToJSONMatchPath","Patch","type","path","position","items","value","GradientPatch","Record","toGradient","patches","map","toGradientPatch","patch","matchPath","insert","unset","Error","JSON","stringify","Box","Flex","Spinner","useCallback","useEffect","PatchEvent","useDocumentOperation","useEditState","DeskWarning","TreeEditor","DocumentOperations","StoredTreeItem","TreeDeskStructureProps","toGradient","injectNodeTypeInPatches","DEFAULT_DOC_TYPE","ComponentProps","options","DEFAULT_FIELD_KEY","TreeDeskStructure","props","$","_c","treeDocType","documentType","treeFieldKey","fieldKeyInDocument","published","draft","liveEdit","documentId","patch","t0","treeValue","t1","patchEvent","execute","patches","handleChange","publishedId","_id","t2","t3","disabled","setIfMissing","t4","Symbol","for","useCallback","FormField","FormNodePresence","PatchEvent","Path","TreeEditor","StoredTreeItem","TreeFieldSchema","injectNodeTypeInPatches","DEFAULT_DOC_TYPE","TreeInputComponentProps","type","value","level","onChange","event","onFocus","path","onBlur","focusPath","readOnly","presence","EMPTY_PATH","TreeInputComponent","props","$","_c","documentType","options","onFieldChange","t0","patch","patches","t1","t2","t3","description","title","ERROR_MESSAGES","invalidDocumentId","invalidDocumentType","invalidReferenceTo","throwError","message","extraContext","Error","FC","ArraySchemaType","DEFAULT_FIELD_KEY","TreeInputComponent","TreeDeskStructureProps","TreeFieldSchema","INTERNAL_NODE_ARRAY_TYPE","INTERNAL_NODE_TYPE","INTERNAL_NODE_VALUE_TYPE","getSchemaTypeName","throwError","SchemaOptions","Omit","createHierarchicalNodeValueType","referenceTo","referenceOptions","documentType","name","type","title","fields","weak","to","map","options","createHierarchicalNodeType","createHierarchicalArrayType","of","createHierarchicalField","rest","inputComponent","Array","isArray","createHierarchicalDocType","liveEdit","fieldKeyInDocument","preview","select","id","tree","prepare","Record","subtitle","length","createHierarchicalSchemas","AddIcon","FC","TreeDeskStructure","TreeDeskStructureProps","throwError","TreeProps","title","icon","context","S","creatableTypes","structureTreeValidator","props","documentId","referenceTo","Array","isArray","structureProps","createStructureHierarchy","referenceOptions","Error","schema","safelyCreatableTypes","every","type","includes","mainList","length","documentTypeList","schemaType","documentList","filter","params","types","id","menuItems","map","menuItem","intent","get","canHandleIntent","c","Record","intentType","filterParams","listItem","child","Object","assign","serialize","component","options","__preserveInstance","defineType","name","title","type","liveEdit","fields","hidden","definePlugin","default","createHierarchicalSchemas","createStructureHierarchy","TreeProps","hierarchyTree","flatDataToTree","createDeskHierarchy","hierarchicalDocumentList","name"],"sources":["../src/components/DeskWarning.tsx","../src/utils/idUtils.ts","../src/hooks/useAllItems.ts","../src/hooks/useTreeOperations.ts","../src/components/DocumentPreviewStatus.tsx","../src/components/DocumentInNode.tsx","../src/components/NodeActions.tsx","../src/utils/flatDataToTree.ts","../src/utils/injectNodeTypeInPatches.ts","../src/utils/treeData.tsx","../src/hooks/useLocalTree.ts","../src/utils/getAdjescentNodes.ts","../src/utils/moveItemInArray.ts","../src/utils/treePatches.ts","../src/hooks/useTreeOperationsProvider.ts","../src/components/NodeContentRenderer.tsx","../src/components/PlaceholderDropzone.tsx","../src/components/TreeNodeRendererScaffold.tsx","../src/components/TreeNodeRenderer.tsx","../src/utils/getCommonTreeProps.tsx","../src/utils/getTreeHeight.ts","../src/components/TreeEditorErrorBoundary.tsx","../src/components/TreeEditor.tsx","../src/utils/gradientPatchAdapter.ts","../src/TreeDeskStructure.tsx","../src/TreeInputComponent.tsx","../src/utils/throwError.ts","../src/createHierarchicalSchemas.tsx","../src/createStructureHierarchy.tsx","../src/schemas/hierarchy.tree.ts","../src/index.ts"],"sourcesContent":["import {Box, Card, Container, Heading, Stack, Text} from '@sanity/ui'\nimport {Fragment, type PropsWithChildren} from 'react'\n\n// React component that wraps text between two delimiters in a <code> tag\n\nconst WrapCodeBlocks = ({text}: {text: string}) => {\n  return (\n    <>\n      {text.split('`').map((part, i) => (\n        <Fragment key={i}>{i % 2 === 0 ? part : <code>{part}</code>}</Fragment>\n      ))}\n    </>\n  )\n}\n\nconst DeskWarning = (\n  props: PropsWithChildren<{\n    title: string\n    subtitle?: string\n  }>,\n) => {\n  return (\n    <Container padding={5} style={{maxWidth: '25rem'}} sizing={'content'}>\n      <Card padding={4} border radius={2} tone=\"caution\">\n        <Stack gap={3}>\n          <Heading size={1}>{props.title}</Heading>\n          {props.subtitle &&\n            props.subtitle.split(/\\\\n|\\n/).map((line: string) => (\n              <Text size={1} key={line}>\n                <WrapCodeBlocks text={line} />\n              </Text>\n            ))}\n          {props.children && <Box marginTop={2}>{props.children}</Box>}\n        </Stack>\n      </Card>\n    </Container>\n  )\n}\n\nexport default DeskWarning\n","export function unprefixId(_id = ''): string {\n  return _id.replace('drafts.', '')\n}\n\nexport function isDraft(_id = ''): boolean {\n  return _id.startsWith('drafts.')\n}\n","import {useEffect, useReducer, useState} from 'react'\nimport {type SanityDocument, useClient} from 'sanity'\n\nimport type {AllItems, TreeInputOptions} from '../types'\nimport {isDraft, unprefixId} from '../utils/idUtils'\n\nfunction getDeskFilter({referenceTo, referenceOptions}: TreeInputOptions): {\n  filter: string\n  params: Record<string, unknown>\n} {\n  const filterParts: string[] = ['_type in $docTypes']\n\n  if (referenceOptions?.filter) {\n    filterParts.push(referenceOptions.filter)\n  }\n\n  return {\n    filter: filterParts.join(' && '),\n    params: {\n      ...referenceOptions?.filterParams,\n      docTypes: referenceTo.map((schemaType) => schemaType),\n    },\n  }\n}\n\ntype Status = 'loading' | 'success' | 'error'\n\ntype ACTIONTYPE =\n  | {type: 'addOrEditItem'; item: SanityDocument}\n  | {type: 'removeItem'; itemId: string}\n  | {type: 'setInitialData'; items: SanityDocument[]}\n\nfunction updateItemInState(state: AllItems, item: SanityDocument): AllItems {\n  const newState = {...state}\n  const publishedId = unprefixId(item._id)\n  newState[publishedId] = {\n    ...newState[publishedId],\n    [isDraft(item._id) ? 'draft' : 'published']: item,\n  }\n  return newState\n}\n\nfunction allItemsReducer(state: AllItems, action: ACTIONTYPE): AllItems {\n  if (action.type === 'addOrEditItem' && action.item?._id) {\n    return updateItemInState(state, action.item)\n  }\n\n  if (action.type === 'removeItem') {\n    const publishedId = unprefixId(action.itemId)\n    return {\n      ...state,\n      [publishedId]: isDraft(action.itemId)\n        ? // If a draft, keep only published\n          {\n            published: state[publishedId]?.published,\n          }\n        : {\n            draft: state[publishedId]?.draft,\n          },\n    }\n  }\n\n  if (action.type === 'setInitialData') {\n    return action.items.reduce(updateItemInState, {})\n  }\n  return state\n}\n\nexport default function useAllItems(options: TreeInputOptions): {\n  status: Status\n  allItems: AllItems\n} {\n  const client = useClient({\n    apiVersion: '2021-09-01',\n  })\n  const [status, setStatus] = useState<Status>('loading')\n  const [allItems, dispatch] = useReducer(allItemsReducer, {})\n\n  useEffect(() => {\n    function handleListener(event: {type?: string; result?: SanityDocument; documentId?: string}) {\n      if (event.type !== 'mutation') {\n        return\n      }\n\n      if (event.result) {\n        dispatch({type: 'addOrEditItem', item: event.result})\n      } else if (event.documentId) {\n        dispatch({type: 'removeItem', itemId: event.documentId})\n      }\n    }\n\n    const {filter, params} = getDeskFilter(options)\n    const query = `*[${filter}] {\n      _id,\n      _type,\n      _updatedAt,\n    }`\n\n    async function fetchInitialData() {\n      try {\n        const items = await client.fetch<SanityDocument[]>(query, params)\n        dispatch({type: 'setInitialData', items})\n        setStatus('success')\n      } catch {\n        setStatus('error')\n      }\n    }\n    void fetchInitialData()\n\n    const listener = client.listen(query, params).subscribe(handleListener)\n    return () => {\n      listener.unsubscribe()\n    }\n  }, [client, options])\n\n  return {\n    status,\n    allItems,\n  }\n}\n","import {createContext, useContext} from 'react'\n\nimport type useAllItems from './useAllItems'\nimport type useTreeOperationsProvider from './useTreeOperationsProvider'\n\ntype ContextValue = ReturnType<typeof useTreeOperationsProvider> & {\n  allItemsStatus: ReturnType<typeof useAllItems>['status']\n}\n\nfunction placeholder() {\n  // no-op\n}\n\nexport const TreeOperationsContext = createContext<ContextValue>({\n  addItem: placeholder,\n  duplicateItem: placeholder,\n  removeItem: placeholder,\n  handleMovedNode: placeholder,\n  moveItemDown: placeholder,\n  moveItemUp: placeholder,\n  allItemsStatus: 'loading',\n})\n\nexport default function useTreeOperations(): ContextValue {\n  return useContext(TreeOperationsContext)\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {PublishIcon} from '@sanity/icons/Publish'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type SanityDocument, TextWithTone, useRelativeTime} from 'sanity'\n\nimport type {DocumentPair} from '../types'\n\nfunction TimeAgo({time}: {time: string | Date}) {\n  const timeAgo = useRelativeTime(time)\n\n  return (\n    <span title={timeAgo}>\n      {timeAgo}\n      {timeAgo.toLowerCase().trim().startsWith('just now') ? '' : ' ago'}\n    </span>\n  )\n}\n\nconst PublishedStatus = ({document}: {document?: SanityDocument | null}) => (\n  <Tooltip\n    portal\n    content={\n      <Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Published {document._updatedAt && <TimeAgo time={document._updatedAt} />}</>\n          ) : (\n            <>Not published</>\n          )}\n        </Text>\n      </Box>\n    }\n  >\n    <TextWithTone tone=\"positive\" dimmed={!document} muted={!document} size={1}>\n      <PublishIcon />\n    </TextWithTone>\n  </Tooltip>\n)\n\nconst DraftStatus = ({document}: {document?: SanityDocument | null}) => (\n  <Tooltip\n    portal\n    content={\n      <Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Edited {document?._updatedAt && <TimeAgo time={document?._updatedAt} />}</>\n          ) : (\n            <>No unpublished edits</>\n          )}\n        </Text>\n      </Box>\n    }\n  >\n    <TextWithTone tone=\"caution\" dimmed={!document} muted={!document} size={1}>\n      <EditIcon />\n    </TextWithTone>\n  </Tooltip>\n)\n\n// Adapted from @sanity\\desk-tool\\src\\components\\paneItem\\helpers.tsx\nconst DocumentPreviewStatus = ({draft, published}: DocumentPair) => {\n  return (\n    <Inline gap={4}>\n      <PublishedStatus document={published} />\n      <DraftStatus document={draft} />\n    </Inline>\n  )\n}\n\nexport default DocumentPreviewStatus\n","import {HelpCircleIcon} from '@sanity/icons/HelpCircle'\nimport {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode, useMemo} from 'react'\nimport {Preview, type SanityDocument, type SchemaType, TextWithTone, useSchema} from 'sanity'\nimport {type RouterPaneGroup, usePaneRouter} from 'sanity/structure'\n\nimport useTreeOperations from '../hooks/useTreeOperations'\nimport type {LocalTreeItem} from '../types'\nimport DocumentPreviewStatus from './DocumentPreviewStatus'\n\n/**\n * Renders a preview for each referenced document.\n * Nested inside TreeNode.tsx\n */\nconst DocumentInNode = (props: {item: LocalTreeItem; action?: ReactNode}) => {\n  const {value: {reference, docType} = {}, draftId, publishedId} = props.item\n  const referenceId = reference?._ref\n  const {routerPanesState, ChildLink} = usePaneRouter()\n  const {allItemsStatus} = useTreeOperations()\n  const schema = useSchema()\n  const isActive = useMemo(() => {\n    // If some pane is active with the current document `_id`, it's active\n    return routerPanesState.some((pane: RouterPaneGroup) =>\n      pane.some((group) => group.id === referenceId),\n    )\n  }, [referenceId, routerPanesState])\n\n  const type = useMemo(() => {\n    return docType ? schema.get(docType) : undefined\n  }, [docType, schema])\n\n  if (!reference?._ref) {\n    return null\n  }\n\n  return (\n    <Flex gap={2} align=\"center\" style={{flex: 1}}>\n      {/* Show loading preview while allItems aren't ready */}\n      {publishedId || allItemsStatus !== 'success' ? (\n        /* Card loosely copied from @sanity/desk-tool's PaneItem.tsx */\n        <Card\n          __unstable_focusRing\n          as={ChildLink}\n          childId={referenceId!}\n          childParameters={{type: docType!}}\n          tone={isActive ? 'primary' : 'default'}\n          padding={1}\n          radius={2}\n          flex={1}\n          data-as=\"a\"\n          data-ui=\"PaneItem\"\n        >\n          <Preview\n            layout=\"default\"\n            schemaType={type as SchemaType}\n            value={{_ref: draftId || reference?._ref}}\n            status={\n              <DocumentPreviewStatus\n                draft={\n                  draftId\n                    ? ({\n                        _id: draftId,\n                        _type: docType,\n                        _updatedAt: props.item.draftUpdatedAt,\n                      } as SanityDocument)\n                    : undefined\n                }\n                published={\n                  {\n                    _id: reference?._ref,\n                    _type: docType,\n                    _updatedAt: props.item.publishedUpdatedAt,\n                  } as SanityDocument\n                }\n              />\n            }\n          />\n        </Card>\n      ) : (\n        <Card padding={3} radius={1} flex={1}>\n          <Flex align=\"center\">\n            <Text size={2} muted style={{flex: 1}}>\n              Invalid document\n            </Text>\n            <Tooltip\n              placement=\"left\"\n              portal\n              content={\n                <Box padding={3}>\n                  <Flex align=\"flex-start\" gap={3}>\n                    <TextWithTone tone=\"default\" size={3}>\n                      <HelpCircleIcon />\n                    </TextWithTone>\n                    <Stack gap={3}>\n                      <Text as=\"h2\" size={1} weight=\"semibold\">\n                        This document is not valid\n                      </Text>\n                      {/* <Text size={1}>\n                        It was deleted or it doesn't match the filters set by this hierarchy.\n                      </Text> */}\n                      <Text size={1}>ID: {reference?._ref}</Text>\n                    </Stack>\n                  </Flex>\n                </Box>\n              }\n            >\n              <TextWithTone tone=\"default\" size={2}>\n                <HelpCircleIcon />\n              </TextWithTone>\n            </Tooltip>\n          </Flex>\n        </Card>\n      )}\n      {props.action}\n    </Flex>\n  )\n}\n\nexport default DocumentInNode\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {EllipsisVerticalIcon} from '@sanity/icons/EllipsisVertical'\nimport {LaunchIcon} from '@sanity/icons/Launch'\nimport {RemoveCircleIcon} from '@sanity/icons/RemoveCircle'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {IntentButton as IntentLink} from 'sanity'\n\nimport useTreeOperations from '../hooks/useTreeOperations'\nimport type {NodeProps} from '../types'\n\n/**\n * Applicable only to nodes inside the main tree.\n * Unadded items have their actions defined in TreeEditor.\n */\nconst NodeActions = ({nodeProps}: {nodeProps: NodeProps}) => {\n  const operations = useTreeOperations()\n  const {node} = nodeProps\n  const {reference, docType} = node?.value || {}\n  const referenceId = reference?._ref\n\n  const isValid = !!node.publishedId\n  return (\n    <MenuButton\n      button={<Button padding={2} mode=\"bleed\" icon={EllipsisVerticalIcon} />}\n      id={`hiearchical-doc-list--${node._key}-menuButton`}\n      menu={\n        <Menu>\n          <MenuItem\n            text=\"Remove from list\"\n            tone=\"critical\"\n            icon={RemoveCircleIcon}\n            onClick={() => operations.removeItem(nodeProps)}\n          />\n          <MenuItem\n            text=\"Duplicate item\"\n            icon={CopyIcon}\n            disabled={!isValid}\n            onClick={() => operations.duplicateItem(nodeProps)}\n          />\n          {/* <MenuItem\n            text=\"Move up\"\n            icon={ArrowUpIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemUp(nodeProps)}\n          />\n          <MenuItem\n            text=\"Move down\"\n            icon={ArrowDownIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemDown(nodeProps)}\n          /> */}\n          <MenuDivider />\n          <MenuItem\n            text=\"Open in new tab\"\n            icon={LaunchIcon}\n            disabled={!isValid}\n            as={IntentLink}\n            intent=\"edit\"\n            params={{id: referenceId, type: docType}}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            data-as=\"a\"\n          />\n        </Menu>\n      }\n      popover={{portal: true, tone: 'default', placement: 'right'}}\n    />\n  )\n}\n\nexport default NodeActions\n","import type {StoredTreeItem} from '../types'\n\ninterface TreeItemWithChildren extends StoredTreeItem {\n  // Index signature for structural compatibility with react-sortable-tree's TreeItem\n  [key: string]: unknown\n  children?: TreeItemWithChildren[]\n}\n\n/**\n * Converts the flat array stored in the Sanity document into a nested tree,\n * nesting items under their `parent` _key. Items without a `parent` are roots.\n */\nexport default function flatDataToTree(data: StoredTreeItem[]): TreeItemWithChildren[] {\n  const childrenByParent = new Map<string | null, StoredTreeItem[]>()\n  for (const item of data) {\n    const parentKey = item.parent || null\n    const siblings = childrenByParent.get(parentKey)\n    if (siblings) {\n      siblings.push(item)\n    } else {\n      childrenByParent.set(parentKey, [item])\n    }\n  }\n\n  const buildNode = (item: StoredTreeItem): TreeItemWithChildren => {\n    const children = childrenByParent.get(item._key)\n    return children ? {...item, children: children.map(buildNode)} : {...item}\n  }\n\n  return (childrenByParent.get(null) || []).map(buildNode)\n}\n","export function getSchemaTypeName(\n  documentType: string,\n  type: 'document' | 'node' | 'nodeValue' | 'array',\n): string {\n  switch (type) {\n    case 'document':\n      return documentType\n    case 'array':\n      return `${documentType}.array`\n    case 'node':\n      return `${documentType}.node`\n    case 'nodeValue':\n      return `${documentType}.nodeValue`\n    default:\n      return documentType\n  }\n}\n\n/**\n * Temporary value of nodes' `_type` before they are normalized and persisted as the user-defined choice.\n */\nexport const DEFAULT_DOC_TYPE = 'hierarchy.tree'\nexport const INTERNAL_NODE_TYPE = getSchemaTypeName(DEFAULT_DOC_TYPE, 'node')\nexport const INTERNAL_NODE_VALUE_TYPE = getSchemaTypeName(DEFAULT_DOC_TYPE, 'nodeValue')\nexport const INTERNAL_NODE_ARRAY_TYPE = getSchemaTypeName(DEFAULT_DOC_TYPE, 'array')\n\n/**\n * Barebones recursive utility to inject the desired nodeObjectType in patches generated in deeply nested components and utilities.\n */\nexport default function injectNodeTypeInPatches(patchData: any, documentType: string): any {\n  if (Array.isArray(patchData)) {\n    return patchData.map((child) => injectNodeTypeInPatches(child, documentType))\n  }\n  if (typeof patchData === 'object' && patchData !== null) {\n    const newObject: Record<string, unknown> = {}\n    for (const key of Object.keys(patchData)) {\n      const value = patchData[key as keyof typeof patchData]\n\n      if (\n        key === '_type' &&\n        typeof value === 'string' &&\n        [INTERNAL_NODE_TYPE, INTERNAL_NODE_VALUE_TYPE].includes(value)\n      ) {\n        newObject[key] = getSchemaTypeName(\n          documentType,\n          value === INTERNAL_NODE_TYPE ? 'node' : 'nodeValue',\n        )\n      } else {\n        newObject[key] = injectNodeTypeInPatches(value, documentType)\n      }\n    }\n    return newObject\n  }\n  return patchData\n}\n","import {randomKey} from '@sanity/util/content'\n\nimport DocumentInNode from '../components/DocumentInNode'\nimport NodeActions from '../components/NodeActions'\nimport type {\n  AllItems,\n  DocumentPair,\n  EnhancedTreeItem,\n  LocalTreeItem,\n  NodeProps,\n  StoredTreeItem,\n  VisibilityMap,\n} from '../types'\nimport flatDataToTree from './flatDataToTree'\nimport {INTERNAL_NODE_TYPE, INTERNAL_NODE_VALUE_TYPE} from './injectNodeTypeInPatches'\n\nexport const dataToEditorTree = ({\n  tree,\n  allItems,\n  visibilityMap,\n}: {\n  tree: StoredTreeItem[]\n  allItems: AllItems\n  visibilityMap: VisibilityMap\n}): LocalTreeItem[] => {\n  const itemsWithTitle = tree\n    .filter((item) => item?.value?.reference?._ref)\n    .map((item) => {\n      const refId = item.value?.reference?._ref\n      const docPair = refId ? allItems[refId] : undefined\n      const draftDoc = docPair?.draft\n      const publishedDoc = docPair?.published\n\n      const enhancedItem: LocalTreeItem = {\n        _key: item._key,\n        _type: item._type,\n        value: item.value,\n        parent: item.parent,\n        expanded: visibilityMap[item._key] !== false,\n        draftId: draftDoc?._id,\n        publishedId: publishedDoc?._id,\n        draftUpdatedAt: draftDoc?._updatedAt,\n        publishedUpdatedAt: publishedDoc?._updatedAt,\n      }\n\n      return Object.assign(enhancedItem, {\n        title: (nodeProps: NodeProps) => (\n          <DocumentInNode item={enhancedItem} action={<NodeActions nodeProps={nodeProps} />} />\n        ),\n        children: [],\n      })\n    })\n  return flatDataToTree(itemsWithTitle)\n}\n\nconst documentPairToNode = (doc?: DocumentPair): EnhancedTreeItem | undefined => {\n  if (!doc?.published?._id) {\n    return undefined\n  }\n\n  return {\n    _key: randomKey(12),\n    _type: INTERNAL_NODE_TYPE,\n    draftId: doc.draft?._id,\n    draftUpdatedAt: doc.draft?._updatedAt,\n    publishedId: doc.published._id,\n    publishedUpdatedAt: doc.published?._updatedAt,\n    value: {\n      _type: INTERNAL_NODE_VALUE_TYPE,\n      reference: {\n        _ref: doc.published._id,\n        _type: 'reference',\n        _weak: true,\n      },\n      docType: doc.published._type,\n    },\n  }\n}\n\nexport const getUnaddedItems = (data: {\n  allItems: AllItems\n  tree: StoredTreeItem[]\n}): EnhancedTreeItem[] => {\n  if (!data.tree) {\n    return Object.values(data.allItems).flatMap((documentPair) => {\n      const node = documentPairToNode(documentPair)\n      return node ? [node] : []\n    })\n  }\n\n  return Object.entries(data.allItems)\n    .filter(\n      ([publishedId]) =>\n        publishedId &&\n        // unadded items shouldn't be in the tree\n        !data.tree.some((treeItem) => treeItem?.value?.reference?._ref === publishedId),\n    )\n    .flatMap(([, documentPair]) => {\n      const node = documentPairToNode(documentPair)\n      return node ? [node] : []\n    })\n}\n\nexport function normalizeNodeForStorage(item: LocalTreeItem): StoredTreeItem {\n  return {\n    _key: item._key,\n    _type: item._type || INTERNAL_NODE_TYPE,\n    value: item.value,\n    parent: item.parent,\n  }\n}\n","import {useState} from 'react'\n\nimport type {AllItems, LocalTreeItem, StoredTreeItem, VisibilityMap} from '../types'\nimport {dataToEditorTree} from '../utils/treeData'\n\n/**\n * Enhances tree data with information on:\n *   - `expanded` - native property of react-sortable-tree to determine collapsing & expanding of a node's children\n *   - `draftId` & `publishedId` - refer to LocalTreeItem's type annotations\n *\n * Doesn't modify the main tree or has side-effects on data.\n * Has the added benefit of being local to the user, so external changes won't affect local visibility.\n */\nexport default function useLocalTree({\n  tree,\n  allItems,\n}: {\n  tree: StoredTreeItem[]\n  allItems: AllItems\n}): {\n  handleVisibilityToggle: (data: any) => void\n  localTree: LocalTreeItem[]\n} {\n  const [visibilityMap, setVisibilityMap] = useState<VisibilityMap>({})\n\n  function handleVisibilityToggle(data: any) {\n    setVisibilityMap((currentMap) => ({\n      ...currentMap,\n      [data.node._key]: data.expanded,\n    }))\n  }\n\n  return {\n    localTree: dataToEditorTree({\n      tree,\n      allItems,\n      visibilityMap,\n    }),\n    handleVisibilityToggle,\n  }\n}\n","import type {LocalTreeItem} from '../types'\nimport type {LocalFlatDataItem} from './treePatches'\n\n/**\n * Gets adjescent non-children nodes of a given treeIndex.\n */\nexport default function getAdjescentNodes({\n  flatTree,\n  node,\n  treeIndex,\n}: {\n  flatTree: LocalFlatDataItem[]\n  node: LocalTreeItem\n  treeIndex: number\n}): {\n  leadingNode?: LocalFlatDataItem\n  followingNode?: LocalFlatDataItem\n} {\n  // Disregard children nodes - these include the current node's key in their `path` array.\n  // `path` is typed as number[] but contains the string keys returned by our `getNodeKey`.\n  const isOutsideOfNode = (item: LocalFlatDataItem) => !(item.path as unknown[]).includes(node._key)\n\n  const leadingNode = flatTree.slice(0, treeIndex).reverse().find(isOutsideOfNode)\n\n  const followingNode = flatTree.slice(treeIndex + 1).find(isOutsideOfNode)\n\n  return {\n    leadingNode,\n    followingNode,\n  }\n}\n","export default function moveItemInArray<ItemType = unknown>({\n  array,\n  fromIndex,\n  toIndex,\n}: {\n  array: ItemType[]\n  fromIndex: number\n  toIndex: number\n}): ItemType[] {\n  if (fromIndex === toIndex) {\n    return array\n  }\n\n  const newArray = [...array]\n  const [target] = newArray.splice(fromIndex, 1)\n\n  if (target === undefined) {\n    return array\n  }\n\n  newArray.splice(toIndex, 0, target)\n\n  return newArray\n}\n","import {\n  type FlatDataItem,\n  type TreeItem,\n  getFlatDataFromTree,\n} from '@nosferatu500/react-sortable-tree'\nimport {randomKey} from '@sanity/util/content'\nimport * as Patch from 'sanity'\n\nimport type {LocalTreeItem, NodeProps} from '../types'\nimport getAdjescentNodes from './getAdjescentNodes'\nimport moveItemInArray from './moveItemInArray'\nimport {normalizeNodeForStorage} from './treeData'\n\n/**\n * A {@link FlatDataItem} whose nodes are known to be the plugin's own tree items.\n */\nexport interface LocalFlatDataItem extends Omit<FlatDataItem, 'node' | 'parentNode'> {\n  node: LocalTreeItem\n  parentNode?: LocalTreeItem | null\n}\n\n/**\n * Data received from react-sortable-tree's `onMoveNode` callback.\n * `nextPath` is undefined / null when the node is removed from the tree.\n */\nexport interface HandleMovedNodeData {\n  treeData: TreeItem[]\n  node: LocalTreeItem\n  nextParentNode?: LocalTreeItem | null\n  nextPath?: number[] | null\n  nextTreeIndex: number\n}\n\nexport type HandleMovedNode = (moveData: HandleMovedNodeData) => void\n\nfunction getLocalFlatDataFromTree(treeData: TreeItem[]): LocalFlatDataItem[] {\n  return getFlatDataFromTree({\n    treeData,\n    getNodeKey: (t) => t.node['_key'] as string,\n  }) as LocalFlatDataItem[]\n}\n\nexport function getAddItemPatch(item: LocalTreeItem): unknown[] {\n  const normalizedNode = normalizeNodeForStorage(item)\n\n  return [\n    // Add the node to the end of the tree\n    Patch.insert([normalizedNode], 'after', [-1]),\n  ]\n}\n\nexport function getDuplicateItemPatch(nodeProps: NodeProps): unknown[] {\n  const newItem = {\n    ...nodeProps.node,\n    _key: randomKey(12),\n  }\n  const normalizedNode = normalizeNodeForStorage(newItem)\n\n  return [\n    // Add duplicated node before the existing one\n    Patch.insert([normalizedNode], 'before', [{_key: nodeProps.node._key}]),\n  ]\n}\n\nexport function getRemoveItemPatch({node}: Pick<NodeProps, 'node'>): unknown[] {\n  const keyPath = {_key: node._key}\n  const children = getChildrenPaths(node)\n\n  return [\n    // 1. Unset the removed node\n    Patch.unset([keyPath]),\n\n    // 2. Unset its children\n    ...children.map((path) => Patch.unset([{_key: path}])),\n  ]\n}\n\nexport function getMovedNodePatch(data: HandleMovedNodeData): unknown[] {\n  const {nextParentNode} = data\n  const keyPath = {_key: data.node._key}\n\n  // === REMOVING NODE FROM TREE ===\n  // `nextPath` will be undefined / null if the item is removed from tree\n  if (!Array.isArray(data.nextPath)) {\n    return getRemoveItemPatch({node: data.node})\n  }\n\n  const nextFlatTree = getLocalFlatDataFromTree(data.treeData)\n  const normalizedNode = normalizeNodeForStorage(data.node)\n\n  const {leadingNode, followingNode} = getAdjescentNodes({\n    flatTree: nextFlatTree,\n    node: data.node,\n    treeIndex: data.nextTreeIndex,\n  })\n\n  return [\n    // 1. Unset the moved node\n    // (will be ignored by Content Lake on new nodes with _key not yet in tree)\n    Patch.unset([keyPath]),\n\n    // 2. SIBLING-BASED PLACEMENT\n    // If we were to place solely based on nextTreeIndex, concurrent changes from other editors could put the new node in an unexpected position.\n    // Let's instead anchor it to the _key of the sibling coming before or after it.\n    leadingNode?.node?._key\n      ? // After the sibling before it\n        Patch.insert([normalizedNode], 'after', [{_key: leadingNode.node._key}])\n      : // Or before the sibling right after it, in case there's no leading sibling node\n        // prettier-ignore\n        Patch.insert([normalizedNode], 'before', [followingNode?.node?._key ? {_key: followingNode.node._key} : data.nextTreeIndex]),\n\n    // 3. Patch the new node with its new `parent`\n    nextParentNode\n      ? // If it has a parent node, set that parent's _key\n        Patch.set(nextParentNode._key, [keyPath, 'parent'])\n      : // Else remove the parent key entirely\n        Patch.unset([keyPath, 'parent']),\n  ]\n}\n\nfunction getChildrenPaths(node: LocalTreeItem): string[] {\n  if (!Array.isArray(node.children)) {\n    return []\n  }\n\n  const keyPaths: string[] = []\n  for (const child of node.children) {\n    const childKey: unknown = child['_key']\n    if (typeof childKey === 'string' && childKey) {\n      keyPaths.push(childKey)\n    }\n    keyPaths.push(...getChildrenPaths(child as LocalTreeItem))\n  }\n  return keyPaths\n}\n\nexport function getMoveItemPatch({\n  nodeProps: {node, treeIndex},\n  localTree,\n  direction,\n}: {\n  nodeProps: NodeProps\n  localTree: LocalTreeItem[]\n  direction: 'up' | 'down'\n}): unknown[] {\n  const keyPath = {_key: node._key}\n\n  const nextTreeIndex = treeIndex + (direction === 'up' ? -1 : 1)\n\n  const flatTree = getLocalFlatDataFromTree(localTree)\n  const nextFlatTree = moveItemInArray<LocalFlatDataItem>({\n    array: flatTree,\n    fromIndex: treeIndex,\n    toIndex: nextTreeIndex,\n  })\n  const {leadingNode, followingNode} = getAdjescentNodes({\n    flatTree: nextFlatTree,\n    node,\n    treeIndex: nextTreeIndex,\n  })\n\n  const normalizedNode = normalizeNodeForStorage(node)\n\n  // When moving up, look at following node to figure out what is the next parent.\n  const nodeToInheritParent = direction === 'up' ? followingNode : leadingNode\n  const nextParentNode = nodeToInheritParent?.parentNode\n\n  return [\n    // 1. Unset the moved node\n    // (will be ignored by Content Lake on new nodes with _key not yet in tree)\n    Patch.unset([keyPath]),\n\n    // 2. SIBLING-BASED PLACEMENT\n    leadingNode?.node?._key\n      ? // After the sibling before it\n        Patch.insert([normalizedNode], 'after', [{_key: leadingNode.node._key}])\n      : // Or before the sibling right after it, in case there's no leading sibling node\n        Patch.insert([normalizedNode], 'before', [\n          followingNode?.node?._key ? {_key: followingNode.node._key} : nextTreeIndex,\n        ]),\n\n    // 3. Patch the new node with its new `parent`\n    nextParentNode\n      ? // If it has a parent node, set that parent's _key\n        Patch.set(nextParentNode._key, [keyPath, 'parent'])\n      : // Else remove the parent key entirely\n        Patch.unset([keyPath, 'parent']),\n  ]\n}\n","import {PatchEvent, type PathSegment, prefixPath, setIfMissing} from 'sanity'\n\nimport type {LocalTreeItem, NodeProps} from '../types'\nimport {\n  type HandleMovedNode,\n  type HandleMovedNodeData,\n  getAddItemPatch,\n  getDuplicateItemPatch,\n  getMoveItemPatch,\n  getMovedNodePatch,\n  getRemoveItemPatch,\n} from '../utils/treePatches'\n\nexport default function useTreeOperationsProvider(props: {\n  patchPrefix?: PathSegment\n  onChange: (patch: PatchEvent) => void\n  localTree: LocalTreeItem[]\n}): {\n  handleMovedNode: HandleMovedNode\n  addItem: (item: LocalTreeItem) => void\n  duplicateItem: (nodeProps: NodeProps) => void\n  removeItem: (nodeProps: NodeProps) => void\n  moveItemUp: (nodeProps: NodeProps) => void\n  moveItemDown: (nodeProps: NodeProps) => void\n} {\n  const {localTree} = props\n\n  function runPatches(patches: any) {\n    const finalPatches = [\n      // Ensure tree array exists before any operation\n      setIfMissing([]),\n      ...(patches || []),\n    ]\n    const prefix: PathSegment | undefined = props.patchPrefix\n    let patchEvent = PatchEvent.from(finalPatches)\n    if (prefix) {\n      patchEvent = PatchEvent.from(finalPatches.map((patch) => prefixPath(patch, prefix)))\n    }\n    props.onChange(patchEvent)\n  }\n\n  function handleMovedNode(data: HandleMovedNodeData) {\n    runPatches(getMovedNodePatch(data))\n  }\n\n  function addItem(item: LocalTreeItem) {\n    runPatches(getAddItemPatch(item))\n  }\n\n  function duplicateItem(nodeProps: NodeProps) {\n    runPatches(getDuplicateItemPatch(nodeProps))\n  }\n\n  function removeItem(nodeProps: NodeProps) {\n    runPatches(getRemoveItemPatch(nodeProps))\n  }\n\n  function moveItemUp(nodeProps: NodeProps) {\n    runPatches(\n      getMoveItemPatch({\n        nodeProps,\n        localTree,\n        direction: 'up',\n      }),\n    )\n  }\n\n  function moveItemDown(nodeProps: NodeProps) {\n    runPatches(\n      getMoveItemPatch({\n        nodeProps,\n        localTree,\n        direction: 'down',\n      }),\n    )\n  }\n\n  return {\n    handleMovedNode,\n    addItem,\n    removeItem,\n    moveItemUp,\n    moveItemDown,\n    duplicateItem,\n  }\n}\n","import {isDescendant} from '@nosferatu500/react-sortable-tree'\nimport {cyan, gray, red} from '@sanity/color'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {DragHandleIcon} from '@sanity/icons/DragHandle'\nimport {Box, Button, Flex, Spinner} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport {styled} from 'styled-components'\n\nconst Root = styled.div`\n  // Adapted from react-sortable-tree/style.css\n  &[data-landing='true'] > *,\n  &[data-cancel='true'] > * {\n    opacity: 0 !important;\n  }\n  &[data-landing='true']::before,\n  &[data-cancel='true']::before {\n    background-color: ${cyan[50].hex};\n    border: 2px dashed ${gray[400].hex};\n    border-radius: 3px;\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: -1;\n  }\n\n  &[data-cancel='true']::before {\n    background-color: ${red[50].hex};\n  }\n`\n\n/**\n * Customization of react-sortable-tree's default node.\n * Created in order to use Sanity UI for styles.\n * Reference: https://github.com/frontend-collective/react-sortable-tree/blob/master/src/node-renderer-default.js\n */\nconst NodeContentRenderer: any = (props: any) => {\n  const {\n    node,\n    path,\n    treeIndex,\n    canDrag = false,\n    canDrop,\n    connectDragSource,\n    connectDragPreview,\n    toggleChildrenVisibility,\n    draggedNode,\n    didDrop,\n    isDragging,\n  } = props\n  const nodeTitle = node.title\n  const Handle = useMemo(() => {\n    if (!canDrag) {\n      return null\n    }\n    if (typeof node.children === 'function' && node.expanded) {\n      // Show a loading symbol on the handle when the children are expanded\n      //  and yet still defined by a function (a callback to fetch the children)\n      return <Spinner />\n    }\n\n    const button = (\n      <Button\n        mode=\"bleed\"\n        paddingX={0}\n        paddingY={1}\n        style={{\n          cursor: node.publishedId ? 'grab' : 'default',\n          fontSize: '1.5625rem',\n        }}\n        data-ui=\"DragHandleButton\"\n        data-drag-handle={canDrag}\n        disabled={!node.publishedId}\n      >\n        <DragHandleIcon style={{marginBottom: '-0.1em'}} />\n      </Button>\n    )\n\n    // Don't allow editors to drag invalid documents\n    if (!node.publishedId) {\n      return <div>{button}</div>\n    }\n\n    // Show the handle used to initiate a drag-and-drop\n    return <div ref={connectDragSource}>{button}</div>\n  }, [canDrag, node, connectDragSource])\n\n  const isDraggedDescendant = draggedNode && isDescendant(draggedNode, node)\n  const isLandingPadActive = !didDrop && isDragging\n\n  return (\n    <Box style={{position: 'relative'}}>\n      {toggleChildrenVisibility &&\n        node.children &&\n        (node.children.length > 0 || typeof node.children === 'function') && (\n          <div\n            style={{\n              position: 'absolute',\n              left: '-2px',\n              top: '40%',\n              transform: 'translate(-100%, -50%)',\n            }}\n          >\n            <Button\n              aria-label={node.expanded ? 'Collapse' : 'Expand'}\n              icon={\n                node.expanded ? (\n                  <ChevronDownIcon color={gray[200].hex} />\n                ) : (\n                  <ChevronRightIcon color={gray[200].hex} />\n                )\n              }\n              mode=\"bleed\"\n              fontSize={2}\n              padding={1}\n              type=\"button\"\n              onClick={() =>\n                toggleChildrenVisibility?.({\n                  node,\n                  path,\n                  treeIndex,\n                })\n              }\n            />\n          </div>\n        )}\n\n      <div ref={connectDragPreview}>\n        <Root\n          data-landing={isLandingPadActive}\n          data-cancel={isLandingPadActive && !canDrop}\n          style={{\n            opacity: isDraggedDescendant ? 0.5 : 1,\n          }}\n        >\n          <Flex align=\"center\">\n            {Handle}\n            {typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle}\n          </Flex>\n        </Root>\n      </div>\n    </Box>\n  )\n}\n\nexport default NodeContentRenderer\n","import {Box, Card, type CardTone, Stack, Text} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ninterface PlaceholderDropzoneProps {\n  title: string\n  subtitle?: string\n  isOver?: boolean\n  canDrop?: boolean\n  children?: ReactNode\n}\n\nconst PlaceholderDropzone = (props: PlaceholderDropzoneProps) => {\n  const isValid = props.isOver && props.canDrop\n  const isInvalid = props.isOver && !props.canDrop\n  let tone: CardTone = 'transparent'\n  if (isValid) {\n    tone = 'positive'\n  }\n  if (isInvalid) {\n    tone = 'caution'\n  }\n  return (\n    <Box padding={3}>\n      <Card\n        padding={5}\n        radius={2}\n        border\n        tone={tone}\n        style={{\n          borderStyle: props.isOver ? undefined : 'dashed',\n        }}\n      >\n        <Stack gap={2} style={{textAlign: 'center'}}>\n          <Text size={2} as=\"h2\" muted>\n            {!props.isOver && props.title}\n            {isValid && 'Drop here'}\n            {isInvalid && 'Invalid location or element'}\n          </Text>\n          {props.subtitle && <Text size={1}>{props.subtitle}</Text>}\n          {props.children}\n        </Stack>\n      </Card>\n    </Box>\n  )\n}\n\nexport default PlaceholderDropzone\n","import {blue} from '@sanity/color'\nimport type {ReactNode} from 'react'\nimport {createGlobalStyle} from 'styled-components'\n\n// Adapted from react-sortable-tree/src/tree-node.js\nconst ScaffoldStyles = createGlobalStyle`\n  .rst__lineBlock,\n  .rst__absoluteLineBlock {\n    height: 100%;\n    position: relative;\n    display: inline-block;\n    --stroke-width: 3px;\n  }\n\n  .rst__absoluteLineBlock {\n    position: absolute;\n    top: 0;\n  }\n\n  /* Highlight line for pointing to dragged row destination\n   ========================================================================== */\n  /**\n * +--+--+\n * |  |  |\n * |  |  |\n * |  |  |\n * +--+--+\n */\n  .rst__highlightLineVertical {\n    z-index: 3;\n  }\n  .rst__highlightLineVertical::before {\n    position: absolute;\n    content: '';\n    background-color: ${blue[400].hex};\n    width: calc(var(--stroke-width) * 2);\n    margin-left: calc(var(--stroke-width) * -1);\n    left: 50%;\n    top: 0;\n    height: 100%;\n  }\n\n  @keyframes arrow-pulse {\n    0% {\n      transform: translate(0, 0);\n      opacity: 0;\n    }\n    30% {\n      transform: translate(0, 300%);\n      opacity: 1;\n    }\n    70% {\n      transform: translate(0, 700%);\n      opacity: 1;\n    }\n    100% {\n      transform: translate(0, 1000%);\n      opacity: 0;\n    }\n  }\n  .rst__highlightLineVertical::after {\n    content: '';\n    position: absolute;\n    height: 0;\n    margin-left: calc(var(--stroke-width) * -1);\n    left: 50%;\n    top: 0;\n    border-left: var(--stroke-width) solid transparent;\n    border-right: var(--stroke-width) solid transparent;\n    border-top: var(--stroke-width) solid white;\n    animation: arrow-pulse 1s infinite linear both;\n  }\n\n  /**\n * +-----+\n * |     |\n * |  +--+\n * |  |  |\n * +--+--+\n */\n  .rst__highlightTopLeftCorner::before {\n    z-index: 3;\n    content: '';\n    position: absolute;\n    border-top: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    border-left: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    box-sizing: border-box;\n    height: calc(50% + var(--stroke-width));\n    top: 50%;\n    margin-top: calc(var(--stroke-width) * -1);\n    right: 0;\n    width: calc(50% + var(--stroke-width));\n  }\n\n  /**\n * +--+--+\n * |  |  |\n * |  |  |\n * |  +->|\n * +-----+\n */\n  .rst__highlightBottomLeftCorner {\n    z-index: 3;\n  }\n  .rst__highlightBottomLeftCorner::before {\n    content: '';\n    position: absolute;\n    border-bottom: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    border-left: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    box-sizing: border-box;\n    height: calc(100% + var(--stroke-width));\n    top: 0;\n    right: calc(var(--stroke-width) * 3);\n    width: calc(50% - calc(var(--stroke-width) * 2));\n  }\n\n  .rst__highlightBottomLeftCorner::after {\n    content: '';\n    position: absolute;\n    height: 0;\n    right: 0;\n    top: 100%;\n    margin-top: calc(var(--stroke-width) * -3);\n    border-top: calc(var(--stroke-width) * 3) solid transparent;\n    border-bottom: calc(var(--stroke-width) * 3) solid transparent;\n    border-left: calc(var(--stroke-width) * 3) solid ${blue[400].hex};\n  }\n\n  .rst__unclickable {\n    pointer-events: none;\n    margin-top: -calc(var(--stroke-width) * 3);\n  }\n`\n\nconst TreeNodeRendererScaffold = (props: any) => {\n  const {\n    lowerSiblingCounts,\n    scaffoldBlockPxWidth,\n    listIndex,\n    swapDepth,\n    swapFrom,\n    swapLength,\n    treeIndex,\n  } = props\n\n  // Construct the scaffold representing the structure of the tree\n  const scaffold: ReactNode[] = lowerSiblingCounts.map((lowerSiblingCount: number, i: number) => {\n    if (lowerSiblingCount < 0 || treeIndex === listIndex || i !== swapDepth) {\n      return null\n    }\n\n    // This row has been shifted, and is at the depth of\n    // the line pointing to the new destination\n    let highlightLineClass = ''\n\n    if (listIndex === (swapFrom || 0) + (swapLength || 0) - 1) {\n      // This block is on the bottom (target) line\n      // This block points at the target block (where the row will go when released)\n      highlightLineClass = 'rst__highlightBottomLeftCorner'\n    } else if (treeIndex === swapFrom) {\n      // This block is on the top (source) line\n      highlightLineClass = 'rst__highlightTopLeftCorner'\n    } else {\n      // This block is between the bottom and top\n      highlightLineClass = 'rst__highlightLineVertical'\n    }\n\n    const style = {\n      width: scaffoldBlockPxWidth,\n      left: scaffoldBlockPxWidth * i,\n    }\n\n    return (\n      <div\n        key={i}\n        style={style}\n        className={`rst__unclickable rst__absoluteLineBlock ${highlightLineClass || ''}`}\n        tabIndex={-1}\n      />\n    )\n  })\n\n  return (\n    <>\n      {scaffold}\n      <ScaffoldStyles />\n    </>\n  )\n}\n\nexport default TreeNodeRendererScaffold\n","import {Children, type ReactElement, cloneElement} from 'react'\n\nimport TreeNodeRendererScaffold from './TreeNodeRendererScaffold'\n\n/**\n * To prevent expand buttons from overflowing on the left, we add a minimum left padding to all entries\n */\nconst BASE_LEFT_PADDING = 10\nconst NESTING_PADDING = 14\n\nconst TreeNodeRenderer: any = (props: any) => {\n  const {children, lowerSiblingCounts, connectDropTarget, isOver, draggedNode, canDrop} = props\n\n  // Construct the scaffold representing the structure of the tree\n  const scaffoldBlockCount = lowerSiblingCounts.length\n\n  return (\n    <div ref={connectDropTarget} style={props.style} data-tree-row=\"\">\n      <div\n        style={{\n          // prettier-ignore\n          paddingLeft: `${BASE_LEFT_PADDING + (NESTING_PADDING * scaffoldBlockCount)}px`,\n        }}\n      >\n        {Children.map(children, (child) =>\n          cloneElement(child as ReactElement<any>, {\n            isOver,\n            canDrop,\n            draggedNode,\n          }),\n        )}\n      </div>\n      <TreeNodeRendererScaffold {...props} />\n    </div>\n  )\n}\n\nexport default TreeNodeRenderer\n","import type {SortableTree} from '@nosferatu500/react-sortable-tree'\nimport type {ComponentProps} from 'react'\n\nimport NodeContentRenderer from '../components/NodeContentRenderer'\nimport PlaceholderDropzone from '../components/PlaceholderDropzone'\nimport TreeNodeRenderer from '../components/TreeNodeRenderer'\n\ntype ReactSortableTreeProps = ComponentProps<typeof SortableTree>\n\nexport default function getCommonTreeProps({\n  placeholder,\n}: {\n  placeholder: {\n    title: string\n    subtitle?: string\n  }\n}): Partial<ReactSortableTreeProps> {\n  return {\n    theme: {\n      nodeContentRenderer: NodeContentRenderer,\n      placeholderRenderer: (props: any) => <PlaceholderDropzone {...placeholder} {...props} />,\n      treeNodeRenderer: TreeNodeRenderer,\n      style: {height: '100%'},\n      innerStyle: undefined,\n      scaffoldBlockPxWidth: 44,\n      slideRegionSize: 100,\n    },\n  }\n}\n","import {type TreeItem, getVisibleNodeCount} from '@nosferatu500/react-sortable-tree'\n\nexport default function getTreeHeight(treeData: TreeItem[], rowHeight: number): string {\n  const visibleNodeCount = getVisibleNodeCount({treeData})\n\n  // prettier-ignore\n  return `${50 + (rowHeight * visibleNodeCount)}px`\n}\n","/**\n * react-sortable-tree emits a lot of random errors when dragging to invalid states,\n * even when drag-targets are disabled.\n *\n * This boundary is a workaround so users are not pestered with error-toasts for things\n * that have no functional impact.\n *\n * This boundry does NOT handle errors that happen in the React dnd\n * event handlers, so there is addtional workarounds in the\n * DnDManager.\n *  */\nexport const TreeEditorErrorBoundary = (props: any) => {\n  return props.children\n}\n","import {\n  SortableTreeWithoutDndContext as SortableTree,\n  type TreeItem,\n} from '@nosferatu500/react-sortable-tree'\nimport {AddCircleIcon} from '@sanity/icons/AddCircle'\nimport {Box, Button, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useEffect, useMemo, useState} from 'react'\nimport {DndProvider} from 'react-dnd'\nimport {HTML5Backend} from 'react-dnd-html5-backend'\nimport type {PatchEvent} from 'sanity'\n\nimport useAllItems from '../hooks/useAllItems'\nimport useLocalTree from '../hooks/useLocalTree'\nimport {TreeOperationsContext} from '../hooks/useTreeOperations'\nimport useTreeOperationsProvider from '../hooks/useTreeOperationsProvider'\nimport type {Optional, StoredTreeItem, TreeDeskStructureProps} from '../types'\nimport getCommonTreeProps from '../utils/getCommonTreeProps'\nimport getTreeHeight from '../utils/getTreeHeight'\nimport {getUnaddedItems} from '../utils/treeData'\nimport type {HandleMovedNodeData} from '../utils/treePatches'\nimport DocumentInNode from './DocumentInNode'\nimport {TreeEditorErrorBoundary} from './TreeEditorErrorBoundary'\n\ninterface TreeEditorProps {\n  tree: StoredTreeItem[]\n  onChange: (patch: PatchEvent) => void\n  options: Optional<TreeDeskStructureProps, 'documentId'>\n  patchPrefix?: string\n}\n\n/**\n * The loaded tree users interact with\n */\nfunction TreeEditor(props: TreeEditorProps) {\n  const {status: allItemsStatus, allItems} = useAllItems(props.options)\n  const unAddedItems = getUnaddedItems({tree: props.tree, allItems})\n\n  const {localTree, handleVisibilityToggle} = useLocalTree({\n    tree: props.tree,\n    allItems,\n  })\n\n  const operations = useTreeOperationsProvider({\n    patchPrefix: props.patchPrefix,\n    onChange: props.onChange,\n    localTree,\n  })\n\n  const [context, setContext] = useState<HTMLElement | null>(null)\n  const [treeViewHeight, setTreeViewHeight] = useState<string>('')\n\n  const documentId = props.options.documentId\n\n  const updateTreeViewHeight = useCallback(() => {\n    const el = document.querySelector<HTMLElement>(`#${documentId} [data-tree-row]`)\n    const rowHeight = el?.offsetHeight || 51\n    setTreeViewHeight(getTreeHeight(localTree, rowHeight))\n  }, [documentId, localTree])\n\n  useEffect(() => {\n    // Wait for dom to load before (re)calculating the tree height.\n    const timeout = setTimeout(updateTreeViewHeight)\n    return () => clearTimeout(timeout)\n  }, [updateTreeViewHeight])\n\n  const onMoveNode = useCallback(\n    // The tree nodes are always our own LocalTreeItem objects\n    (data: unknown) => operations.handleMovedNode(data as HandleMovedNodeData),\n    [operations],\n  )\n\n  const treeProps = useMemo(\n    () =>\n      getCommonTreeProps({\n        placeholder: {\n          title: 'Add items from the list below',\n        },\n      }),\n    [],\n  )\n\n  const operationContext = useMemo(\n    () => ({...operations, allItemsStatus}),\n    [operations, allItemsStatus],\n  )\n\n  return (\n    <TreeEditorErrorBoundary>\n      {/*Use this Box-wrapper to get a context Element to prevent DndProvider to have to HTML% backend at the same time https://github.com/react-dnd/react-dnd/issues/186#issuecomment-978206387 */}\n      <Box id={documentId} ref={setContext}>\n        {context ? (\n          <DndProvider backend={HTML5Backend} options={{rootElement: context}}>\n            <TreeOperationsContext.Provider value={operationContext}>\n              <Stack gap={4} paddingTop={4}>\n                <Card\n                  style={{minHeight: treeViewHeight}}\n                  // Only include borderBottom if there's something to show in unadded items\n                  borderBottom={allItemsStatus !== 'success' || unAddedItems?.length > 0}\n                >\n                  <SortableTree\n                    maxDepth={props.options.maxDepth}\n                    onChange={doNothingOnChange}\n                    onVisibilityToggle={handleVisibilityToggle}\n                    canDrop={canDrop}\n                    onMoveNode={onMoveNode}\n                    // Stable keys keep row identity (and their DOM nodes) intact while\n                    // rows are repositioned during a drag\n                    getNodeKey={getNodeKey}\n                    treeData={localTree}\n                    // The tree renders inside a virtualized list which requires\n                    // a definite height (percentages would resolve to 0)\n                    style={treeViewHeight ? {height: treeViewHeight} : undefined}\n                    {...treeProps}\n                  />\n                </Card>\n\n                {allItemsStatus === 'success' && unAddedItems?.length > 0 && (\n                  <Stack gap={1} paddingX={2} paddingTop={3}>\n                    <Stack gap={2} paddingX={2} paddingBottom={3}>\n                      <Text size={2} as=\"h2\" weight=\"semibold\">\n                        Add more items\n                      </Text>\n                      <Text size={1} muted>\n                        Only published documents are shown.\n                      </Text>\n                    </Stack>\n                    {unAddedItems.map((item) => (\n                      <DocumentInNode\n                        key={item.publishedId || item.draftId}\n                        item={item}\n                        action={\n                          <Tooltip\n                            portal\n                            placement=\"left\"\n                            content={\n                              <Box padding={2}>\n                                <Text size={1}>Add to list</Text>\n                              </Box>\n                            }\n                          >\n                            <Button\n                              onClick={() => {\n                                operations.addItem(item)\n                              }}\n                              mode=\"bleed\"\n                              icon={AddCircleIcon}\n                              style={{cursor: 'pointer'}}\n                            />\n                          </Tooltip>\n                        }\n                      />\n                    ))}\n                  </Stack>\n                )}\n                {allItemsStatus === 'loading' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Spinner size={3} muted />\n                  </Flex>\n                )}\n                {allItemsStatus === 'error' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Text size={2} weight=\"semibold\">\n                      Something went wrong when loading documents\n                    </Text>\n                  </Flex>\n                )}\n              </Stack>\n            </TreeOperationsContext.Provider>\n          </DndProvider>\n        ) : null}\n      </Box>\n    </TreeEditorErrorBoundary>\n  )\n}\n\nfunction canDrop({nextPath, prevPath}: {nextPath: number[]; prevPath: number[]}) {\n  const insideItself =\n    nextPath.length >= prevPath.length &&\n    prevPath.every((pathIndex, index) => nextPath[index] === pathIndex)\n  return !insideItself\n}\n\nconst doNothingOnChange = () => {\n  // Do nothing. onMoveNode will do all the work\n}\n\nconst getNodeKey = (data: {node: TreeItem}) => data.node['_key'] as string\n\nexport default TreeEditor\n","// Adapted from @sanity/form-builder/src/sanity/utils/gradientPatchAdapter.ts\nimport {arrayToJSONMatchPath} from '@sanity/mutator'\n\ninterface Patch {\n  type?: string\n  path?: any[]\n  position?: string\n  items?: unknown[]\n  value?: unknown\n}\n\ntype GradientPatch = Record<string, any>\n\nexport function toGradient(patches: Patch[]): GradientPatch[] {\n  return patches.map(toGradientPatch)\n}\n\nfunction toGradientPatch(patch: Patch): GradientPatch {\n  const matchPath = arrayToJSONMatchPath(patch.path || [])\n  if (patch.type === 'insert') {\n    const {position, items} = patch\n    return {\n      insert: {\n        [position as string]: matchPath,\n        items: items,\n      },\n    }\n  }\n\n  if (patch.type === 'unset') {\n    return {\n      unset: [matchPath],\n    }\n  }\n\n  if (!patch.type) {\n    throw new Error(`Missing patch type in patch ${JSON.stringify(patch)}`)\n  }\n  if (matchPath) {\n    return {\n      [patch.type]: {\n        [matchPath]: patch.value,\n      },\n    }\n  }\n  return {\n    [patch.type]: patch.value,\n  }\n}\n","import {Box, Flex, Spinner} from '@sanity/ui'\nimport {useCallback, useEffect} from 'react'\nimport {type PatchEvent, useDocumentOperation, useEditState} from 'sanity'\n\nimport DeskWarning from './components/DeskWarning'\nimport TreeEditor from './components/TreeEditor'\nimport type {DocumentOperations, StoredTreeItem, TreeDeskStructureProps} from './types'\nimport {toGradient} from './utils/gradientPatchAdapter'\nimport injectNodeTypeInPatches, {DEFAULT_DOC_TYPE} from './utils/injectNodeTypeInPatches'\n\ninterface ComponentProps {\n  options: TreeDeskStructureProps\n}\n\nexport const DEFAULT_FIELD_KEY = 'tree'\n\nconst TreeDeskStructure = (props: ComponentProps) => {\n  const treeDocType = props.options.documentType || DEFAULT_DOC_TYPE\n  const treeFieldKey = props.options.fieldKeyInDocument || DEFAULT_FIELD_KEY\n  const {published, draft, liveEdit} = useEditState(props.options.documentId, treeDocType)\n  const {patch} = useDocumentOperation(props.options.documentId, treeDocType) as DocumentOperations\n\n  const treeValue = (published?.[treeFieldKey] || []) as StoredTreeItem[]\n\n  const handleChange = useCallback(\n    (patchEvent: PatchEvent) => {\n      if (!patch?.execute) {\n        return\n      }\n      patch.execute(toGradient(injectNodeTypeInPatches(patchEvent.patches, treeDocType)))\n    },\n    [patch, treeDocType],\n  )\n\n  const publishedId = published?._id\n\n  useEffect(() => {\n    if (!publishedId && patch?.execute && !patch?.disabled) {\n      // If no published document, create it\n      patch.execute([{setIfMissing: {[treeFieldKey]: []}}])\n    }\n  }, [publishedId, patch, treeFieldKey])\n\n  if (!liveEdit) {\n    return (\n      <DeskWarning\n        title=\"Invalid configuration\"\n        subtitle=\"The `documentType` passed to `createStructureHierarchy` isn't live editable.\\nTo continue using this plugin, add `liveEdit: true` to your custom schema type or unset `documentType` in your hierarchy configuration.\"\n      />\n    )\n  }\n\n  if (draft?._id) {\n    return (\n      <DeskWarning\n        title=\"This hierarchy tree contains a draft\"\n        subtitle=\"Click on the button below to publish your draft in order to continue editing the live published document.\"\n      />\n    )\n  }\n\n  if (!published?._id) {\n    return (\n      <Flex padding={5} align={'center'} justify={'center'} height={'fill'}>\n        <Spinner width={4} muted />\n      </Flex>\n    )\n  }\n\n  return (\n    <Box paddingBottom={5} paddingRight={2}>\n      <TreeEditor\n        options={props.options}\n        tree={treeValue}\n        onChange={handleChange}\n        patchPrefix={treeFieldKey}\n      />\n    </Box>\n  )\n}\n\nexport default TreeDeskStructure\n","import {useCallback} from 'react'\nimport {FormField, type FormNodePresence, PatchEvent, type Path} from 'sanity'\n\nimport TreeEditor from './components/TreeEditor'\nimport type {StoredTreeItem, TreeFieldSchema} from './types'\nimport injectNodeTypeInPatches, {DEFAULT_DOC_TYPE} from './utils/injectNodeTypeInPatches'\n\nexport interface TreeInputComponentProps {\n  type: TreeFieldSchema\n  value: StoredTreeItem[]\n  level: number\n  onChange: (event: unknown) => void\n  onFocus: (path: Path) => void\n  onBlur: () => void\n  focusPath: Path\n  readOnly: boolean\n  presence: FormNodePresence[]\n}\n\nconst EMPTY_PATH: Path = []\n\nconst TreeInputComponent = (props: TreeInputComponentProps) => {\n  const documentType = props.type.options.documentType || DEFAULT_DOC_TYPE\n  const {onChange: onFieldChange} = props\n\n  const onChange = useCallback(\n    (patch: any) => {\n      const patches = injectNodeTypeInPatches(patch?.patches, documentType)\n      onFieldChange(new PatchEvent(patches))\n    },\n    [documentType, onFieldChange],\n  )\n\n  return (\n    <FormField\n      description={props.type.description} // Creates description from schema\n      title={props.type.title} // Creates label from schema title\n      __unstable_presence={props.presence} // Handles presence avatars\n      path={EMPTY_PATH}\n    >\n      <TreeEditor options={props.type.options} tree={props.value || []} onChange={onChange} />\n    </FormField>\n  )\n}\n\nexport default TreeInputComponent\n","const ERROR_MESSAGES = {\n  invalidDocumentId: 'Please add a documentId to your tree',\n  invalidDocumentType: 'Please add a valid documentType to createHierarchicalSchemas',\n  invalidReferenceTo: \"Missing valid 'referenceTo' value\",\n}\n\nexport default function throwError(message: keyof typeof ERROR_MESSAGES, extraContext = ''): void {\n  throw new Error(`[hierarchical input] ${ERROR_MESSAGES[message]} ${extraContext}`)\n}\n","import type {FC} from 'react'\nimport type {ArraySchemaType} from 'sanity'\n\nimport {DEFAULT_FIELD_KEY} from './TreeDeskStructure'\nimport TreeInputComponent from './TreeInputComponent'\nimport type {TreeDeskStructureProps, TreeFieldSchema} from './types'\nimport {\n  INTERNAL_NODE_ARRAY_TYPE,\n  INTERNAL_NODE_TYPE,\n  INTERNAL_NODE_VALUE_TYPE,\n  getSchemaTypeName,\n} from './utils/injectNodeTypeInPatches'\nimport throwError from './utils/throwError'\n\ntype SchemaOptions = Omit<TreeDeskStructureProps, 'documentId' | 'maxDepth'>\n\nfunction createHierarchicalNodeValueType({\n  referenceTo,\n  referenceOptions,\n  documentType,\n}: SchemaOptions) {\n  return {\n    // when used inside the field, name & type are overwritten by createHierarchicalNodeType\n    name: documentType ? getSchemaTypeName(documentType, 'nodeValue') : INTERNAL_NODE_VALUE_TYPE,\n    type: 'object',\n    title: `Hierarchical node value (${documentType})`,\n\n    fields: [\n      {name: 'docType', type: 'string'},\n      {\n        name: 'reference',\n        type: 'reference',\n        weak: true,\n        to: referenceTo.map((type) => ({type})),\n        options: referenceOptions,\n      },\n    ],\n  }\n}\n\nfunction createHierarchicalNodeType(options: SchemaOptions) {\n  return {\n    // name & type are overwritten by createHierarchicalField\n    name: options.documentType\n      ? getSchemaTypeName(options.documentType, 'node')\n      : INTERNAL_NODE_TYPE,\n    title: `Hierarchical node (${options.documentType})`,\n    type: 'object',\n    fields: [\n      {name: 'parent', type: 'string'},\n\n      options.documentType\n        ? {name: 'value', type: getSchemaTypeName(options.documentType, 'nodeValue')}\n        : // If no documentType is defined, use an anonymized inline object to avoid\n          // having to define another custom schema type through the plugin\n          {\n            ...createHierarchicalNodeValueType(options),\n            name: 'value',\n            type: 'object',\n          },\n    ],\n  }\n}\n\nfunction createHierarchicalArrayType(options: SchemaOptions) {\n  return {\n    // name & type are overwritten by createHierarchicalField\n    name: options.documentType\n      ? getSchemaTypeName(options.documentType, 'array')\n      : INTERNAL_NODE_ARRAY_TYPE,\n    title: `Hierarchical array of nodes (${options.documentType})`,\n    type: 'array',\n    of: [\n      options.documentType\n        ? {type: getSchemaTypeName(options.documentType, 'node')}\n        : createHierarchicalNodeType(options),\n    ],\n  }\n}\n\nfunction createHierarchicalField({name, title, options, ...rest}: TreeFieldSchema): Omit<\n  ArraySchemaType,\n  'type' | 'jsonType' | 'of'\n> & {\n  type: string\n  inputComponent: FC<any>\n  of?: any[]\n} {\n  if (!Array.isArray(options?.referenceTo)) {\n    throwError('invalidReferenceTo', `(field of name \"${name}\")`)\n  }\n\n  return {\n    ...rest,\n    name,\n    title,\n    inputComponent: TreeInputComponent,\n    options,\n    ...(options.documentType\n      ? {type: getSchemaTypeName(options.documentType, 'array')}\n      : {\n          ...createHierarchicalArrayType(options),\n          name,\n        }),\n  }\n}\n\nfunction createHierarchicalDocType(options: SchemaOptions) {\n  return {\n    name: options.documentType,\n    title: 'Hierarchical tree',\n    type: 'document',\n    // The plugin needs to define a `schemaType` with liveEdit enabled so that\n    // `useDocumentOperation` in TreeDeskStructure.tsx doesn't create drafts at every patch.\n    liveEdit: true,\n    fields: [\n      createHierarchicalField({\n        name: options.fieldKeyInDocument || DEFAULT_FIELD_KEY,\n        title: 'Hierarchical Tree',\n        options,\n      }),\n    ],\n    preview: {\n      select: {\n        id: '_id',\n        tree: 'tree',\n      },\n      prepare({id, tree}: {id: string; tree: unknown[]}): Record<string, string> {\n        return {\n          title: `Hierarchical documents (ID: ${id})`,\n          subtitle: `${tree?.length || 0} document(s) in its list.`,\n        }\n      },\n    },\n  }\n}\n\nexport default function createHierarchicalSchemas(options: SchemaOptions) {\n  if (!Array.isArray(options.referenceTo) || options.referenceTo.length <= 0) {\n    throwError('invalidReferenceTo')\n  }\n  if (!options.documentType) {\n    throwError('invalidDocumentType')\n  }\n\n  return [\n    createHierarchicalDocType(options),\n    createHierarchicalArrayType(options),\n    createHierarchicalNodeType(options),\n    createHierarchicalNodeValueType(options),\n  ]\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport type {FC} from 'react'\n\nimport TreeDeskStructure from './TreeDeskStructure'\nimport type {TreeDeskStructureProps} from './types'\nimport throwError from './utils/throwError'\n\nexport interface TreeProps extends TreeDeskStructureProps {\n  /**\n   * Visible title above the tree.\n   * Also used as the label in the structure list item.\n   */\n  title: string\n\n  /**\n   * Optional icon for rendering the item in the structure.\n   */\n  icon?: any\n\n  /**\n   * The `ConfigContext` available as the second parameter of the structure resolver.\n   */\n  context?: any\n  /**\n   * The `StructureBuilder` (`S`) available as the first parameter of the structure resolver.\n   */\n  S?: any\n  /**\n   * Restrict document types that can be created.\n   */\n  creatableTypes?: string[]\n}\n\nconst structureTreeValidator = (props: TreeProps): FC => {\n  const {documentId, referenceTo} = props\n  if (typeof documentId !== 'string' || !documentId) {\n    throwError('invalidDocumentId')\n  }\n  if (!Array.isArray(referenceTo)) {\n    throwError('invalidReferenceTo', `(documentId \"${documentId}\")`)\n  }\n\n  return (structureProps) => <TreeDeskStructure {...structureProps} options={props} />\n}\n\nexport default function createStructureHierarchy(props: TreeProps) {\n  const {documentId, referenceTo, referenceOptions, context, S, creatableTypes} = props\n  if (!S || !context) {\n    throw new Error(\n      'Invalid configuration. S or context props are undefined. ' +\n        'These props are available as function parameters when configuring structure, and must be passed along to createStructureHierarchy. ' +\n        'Confer the plugin README for example usage.',\n    )\n  }\n\n  const {schema} = context\n\n  const safelyCreatableTypes =\n    creatableTypes && creatableTypes.every((type) => referenceTo.includes(type))\n      ? creatableTypes\n      : referenceTo\n\n  let mainList = (\n    referenceTo?.length === 1\n      ? S.documentTypeList(referenceTo[0]).schemaType(referenceTo[0])\n      : S.documentList().filter('_type in $types').params({types: referenceTo})\n  )\n    .id(documentId)\n    .menuItems(\n      (safelyCreatableTypes || []).map((schemaType) =>\n        S.menuItem()\n          .intent({\n            type: 'create',\n            params: {type: schemaType},\n          })\n          .title(`Create ${schema.get(schemaType)?.title}`)\n          .icon(schema.get(schemaType)?.icon || AddIcon),\n      ),\n    )\n    .canHandleIntent((intent: string, c: Record<string, unknown>) => {\n      // Can edit itself\n      if (intent === 'edit' && c['id'] === props.documentId) {\n        return true\n      }\n      // Can create & edit referenced document types\n      const intentType = c['type']\n      if (typeof intentType === 'string' && safelyCreatableTypes.includes(intentType)) {\n        return true\n      }\n      return false\n    })\n\n  if (referenceOptions?.filter) {\n    mainList = mainList.filter(referenceOptions.filter)\n  }\n\n  if (referenceOptions?.filterParams) {\n    mainList = mainList.params(referenceOptions.filterParams)\n  }\n\n  return S.listItem()\n    .id(documentId)\n    .title(props.title || documentId)\n    .icon(props.icon)\n    .child(\n      Object.assign(\n        mainList.serialize(),\n        {\n          type: 'component',\n          component: structureTreeValidator(props),\n          options: props,\n          __preserveInstance: true,\n        },\n        props.title ? {title: props.title} : {},\n      ),\n    )\n}\n","import {defineType} from 'sanity'\n\nexport default defineType({\n  name: 'hierarchy.tree',\n  title: 'Hierarchical tree',\n  type: 'document',\n  // The plugin needs to define a `schemaType` with liveEdit enabled so that\n  // `useDocumentOperation` in TreeDeskStructure.tsx doesn't create drafts at every patch.\n  liveEdit: true,\n  // Let's avoid defining the actual hierarchical field, else GraphQL users won't be able to deploy schemas\n  fields: [\n    {\n      name: 'unusedField',\n      title: 'Unused field',\n      type: 'string',\n      hidden: true,\n    },\n  ],\n})\n","import '@sanity/ui/styles.css'\nimport {definePlugin} from 'sanity'\n\nimport {default as createHierarchicalSchemas} from './createHierarchicalSchemas'\nimport {default as createStructureHierarchy, type TreeProps} from './createStructureHierarchy'\nimport {default as hierarchyTree} from './schemas/hierarchy.tree'\nimport {default as flatDataToTree} from './utils/flatDataToTree'\n\nexport {createHierarchicalSchemas, createStructureHierarchy, flatDataToTree, hierarchyTree}\nexport type {TreeProps}\n\n/**\n * @deprecated Use {@link createStructureHierarchy} instead. `sanity/desk` has been\n * replaced by `sanity/structure`, so `createDeskHierarchy` was renamed to\n * `createStructureHierarchy`. This alias will be removed in a future major version.\n */\nexport const createDeskHierarchy = createStructureHierarchy\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {hierarchicalDocumentList} from '@sanity/hierarchical-document-list'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [hierarchicalDocumentList()],\n * })\n * ```\n */\n\nexport const hierarchicalDocumentList = definePlugin({\n  name: 'sanity-plugin-hierarchical-document-list',\n})\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{text}: {text: string}","text.split('`').map((part, i) => (\n        <Fragment key={i}>{i % 2 === 0 ? part : <code>{part}</code>}</Fragment>\n      ))","(part, i) => (\n        <Fragment key={i}>{i % 2 === 0 ? part : <code>{part}</code>}</Fragment>\n      )","<>\n      {text.split('`').map((part, i) => (\n        <Fragment key={i}>{i % 2 === 0 ? part : <code>{part}</code>}</Fragment>\n      ))}\n    </>","{maxWidth: '25rem'}","<Heading size={1}>{props.title}</Heading>","title","props.subtitle &&\n            props.subtitle.split(/\\\\n|\\n/).map((line: string) => (\n              <Text size={1} key={line}>\n                <WrapCodeBlocks text={line} />\n              </Text>\n            ))","subtitle","(line: string) => (\n              <Text size={1} key={line}>\n                <WrapCodeBlocks text={line} />\n              </Text>\n            )","props.children && <Box marginTop={2}>{props.children}</Box>","children","<Container padding={5} style={{maxWidth: '25rem'}} sizing={'content'}>\n      <Card padding={4} border radius={2} tone=\"caution\">\n        <Stack gap={3}>\n          <Heading size={1}>{props.title}</Heading>\n          {props.subtitle &&\n            props.subtitle.split(/\\\\n|\\n/).map((line: string) => (\n              <Text size={1} key={line}>\n                <WrapCodeBlocks text={line} />\n              </Text>\n            ))}\n          {props.children && <Box marginTop={2}>{props.children}</Box>}\n        </Stack>\n      </Card>\n    </Container>","{\n    apiVersion: '2021-09-01',\n  }","{}","() => {\n    function handleListener(event: {type?: string; result?: SanityDocument; documentId?: string}) {\n      if (event.type !== 'mutation') {\n        return\n      }\n\n      if (event.result) {\n        dispatch({type: 'addOrEditItem', item: event.result})\n      } else if (event.documentId) {\n        dispatch({type: 'removeItem', itemId: event.documentId})\n      }\n    }\n\n    const {filter, params} = getDeskFilter(options)\n    const query = `*[${filter}] {\n      _id,\n      _type,\n      _updatedAt,\n    }`\n\n    async function fetchInitialData() {\n      try {\n        const items = await client.fetch<SanityDocument[]>(query, params)\n        dispatch({type: 'setInitialData', items})\n        setStatus('success')\n      } catch {\n        setStatus('error')\n      }\n    }\n    void fetchInitialData()\n\n    const listener = client.listen(query, params).subscribe(handleListener)\n    return () => {\n      listener.unsubscribe()\n    }\n  }","[client, options]","{\n    status,\n    allItems,\n  }","{time}: {time: string | Date}","<span title={timeAgo}>\n      {timeAgo}\n      {timeAgo.toLowerCase().trim().startsWith('just now') ? '' : ' ago'}\n    </span>","timeAgo.toLowerCase().trim().startsWith('just now') ? '' : ' ago'","{document}: {document?: SanityDocument | null}","<Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Published {document._updatedAt && <TimeAgo time={document._updatedAt} />}</>\n          ) : (\n            <>Not published</>\n          )}\n        </Text>\n      </Box>","<PublishIcon />","<TextWithTone tone=\"positive\" dimmed={!document} muted={!document} size={1}>\n      <PublishIcon />\n    </TextWithTone>","!document","<Tooltip\n    portal\n    content={\n      <Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Published {document._updatedAt && <TimeAgo time={document._updatedAt} />}</>\n          ) : (\n            <>Not published</>\n          )}\n        </Text>\n      </Box>\n    }\n  >\n    <TextWithTone tone=\"positive\" dimmed={!document} muted={!document} size={1}>\n      <PublishIcon />\n    </TextWithTone>\n  </Tooltip>","<Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Edited {document?._updatedAt && <TimeAgo time={document?._updatedAt} />}</>\n          ) : (\n            <>No unpublished edits</>\n          )}\n        </Text>\n      </Box>","<EditIcon />","<TextWithTone tone=\"caution\" dimmed={!document} muted={!document} size={1}>\n      <EditIcon />\n    </TextWithTone>","<Tooltip\n    portal\n    content={\n      <Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Edited {document?._updatedAt && <TimeAgo time={document?._updatedAt} />}</>\n          ) : (\n            <>No unpublished edits</>\n          )}\n        </Text>\n      </Box>\n    }\n  >\n    <TextWithTone tone=\"caution\" dimmed={!document} muted={!document} size={1}>\n      <EditIcon />\n    </TextWithTone>\n  </Tooltip>","{draft, published}: DocumentPair","<PublishedStatus document={published} />","<DraftStatus document={draft} />","<Inline gap={4}>\n      <PublishedStatus document={published} />\n      <DraftStatus document={draft} />\n    </Inline>","{reference, docType} = {}","routerPanesState.some((pane: RouterPaneGroup) =>\n      pane.some((group) => group.id === referenceId),\n    )","(pane: RouterPaneGroup) =>\n      pane.some((group) => group.id === referenceId)","useMemo(() => {\n    // If some pane is active with the current document `_id`, it's active\n    return routerPanesState.some((pane: RouterPaneGroup) =>\n      pane.some((group) => group.id === referenceId),\n    )\n  }, [referenceId, routerPanesState])","docType ? schema.get(docType) : undefined","useMemo(() => {\n    return docType ? schema.get(docType) : undefined\n  }, [docType, schema])","{flex: 1}","publishedId || allItemsStatus !== 'success' ? (\n        /* Card loosely copied from @sanity/desk-tool's PaneItem.tsx */\n        <Card\n          __unstable_focusRing\n          as={ChildLink}\n          childId={referenceId!}\n          childParameters={{type: docType!}}\n          tone={isActive ? 'primary' : 'default'}\n          padding={1}\n          radius={2}\n          flex={1}\n          data-as=\"a\"\n          data-ui=\"PaneItem\"\n        >\n          <Preview\n            layout=\"default\"\n            schemaType={type as SchemaType}\n            value={{_ref: draftId || reference?._ref}}\n            status={\n              <DocumentPreviewStatus\n                draft={\n                  draftId\n                    ? ({\n                        _id: draftId,\n                        _type: docType,\n                        _updatedAt: props.item.draftUpdatedAt,\n                      } as SanityDocument)\n                    : undefined\n                }\n                published={\n                  {\n                    _id: reference?._ref,\n                    _type: docType,\n                    _updatedAt: props.item.publishedUpdatedAt,\n                  } as SanityDocument\n                }\n              />\n            }\n          />\n        </Card>\n      ) : (\n        <Card padding={3} radius={1} flex={1}>\n          <Flex align=\"center\">\n            <Text size={2} muted style={{flex: 1}}>\n              Invalid document\n            </Text>\n            <Tooltip\n              placement=\"left\"\n              portal\n              content={\n                <Box padding={3}>\n                  <Flex align=\"flex-start\" gap={3}>\n                    <TextWithTone tone=\"default\" size={3}>\n                      <HelpCircleIcon />\n                    </TextWithTone>\n                    <Stack gap={3}>\n                      <Text as=\"h2\" size={1} weight=\"semibold\">\n                        This document is not valid\n                      </Text>\n                      {/* <Text size={1}>\n                        It was deleted or it doesn't match the filters set by this hierarchy.\n                      </Text> */}\n                      <Text size={1}>ID: {reference?._ref}</Text>\n                    </Stack>\n                  </Flex>\n                </Box>\n              }\n            >\n              <TextWithTone tone=\"default\" size={2}>\n                <HelpCircleIcon />\n              </TextWithTone>\n            </Tooltip>\n          </Flex>\n        </Card>\n      )","draftUpdatedAt","publishedUpdatedAt","_ref","<Flex gap={2} align=\"center\" style={{flex: 1}}>\n      {/* Show loading preview while allItems aren't ready */}\n      {publishedId || allItemsStatus !== 'success' ? (\n        /* Card loosely copied from @sanity/desk-tool's PaneItem.tsx */\n        <Card\n          __unstable_focusRing\n          as={ChildLink}\n          childId={referenceId!}\n          childParameters={{type: docType!}}\n          tone={isActive ? 'primary' : 'default'}\n          padding={1}\n          radius={2}\n          flex={1}\n          data-as=\"a\"\n          data-ui=\"PaneItem\"\n        >\n          <Preview\n            layout=\"default\"\n            schemaType={type as SchemaType}\n            value={{_ref: draftId || reference?._ref}}\n            status={\n              <DocumentPreviewStatus\n                draft={\n                  draftId\n                    ? ({\n                        _id: draftId,\n                        _type: docType,\n                        _updatedAt: props.item.draftUpdatedAt,\n                      } as SanityDocument)\n                    : undefined\n                }\n                published={\n                  {\n                    _id: reference?._ref,\n                    _type: docType,\n                    _updatedAt: props.item.publishedUpdatedAt,\n                  } as SanityDocument\n                }\n              />\n            }\n          />\n        </Card>\n      ) : (\n        <Card padding={3} radius={1} flex={1}>\n          <Flex align=\"center\">\n            <Text size={2} muted style={{flex: 1}}>\n              Invalid document\n            </Text>\n            <Tooltip\n              placement=\"left\"\n              portal\n              content={\n                <Box padding={3}>\n                  <Flex align=\"flex-start\" gap={3}>\n                    <TextWithTone tone=\"default\" size={3}>\n                      <HelpCircleIcon />\n                    </TextWithTone>\n                    <Stack gap={3}>\n                      <Text as=\"h2\" size={1} weight=\"semibold\">\n                        This document is not valid\n                      </Text>\n                      {/* <Text size={1}>\n                        It was deleted or it doesn't match the filters set by this hierarchy.\n                      </Text> */}\n                      <Text size={1}>ID: {reference?._ref}</Text>\n                    </Stack>\n                  </Flex>\n                </Box>\n              }\n            >\n              <TextWithTone tone=\"default\" size={2}>\n                <HelpCircleIcon />\n              </TextWithTone>\n            </Tooltip>\n          </Flex>\n        </Card>\n      )}\n      {props.action}\n    </Flex>","action","{nodeProps}: {nodeProps: NodeProps}","node?.value || {}","value","<Button padding={2} mode=\"bleed\" icon={EllipsisVerticalIcon} />","<MenuItem\n            text=\"Remove from list\"\n            tone=\"critical\"\n            icon={RemoveCircleIcon}\n            onClick={() => operations.removeItem(nodeProps)}\n          />","() => operations.duplicateItem(nodeProps)","<MenuItem\n            text=\"Duplicate item\"\n            icon={CopyIcon}\n            disabled={!isValid}\n            onClick={() => operations.duplicateItem(nodeProps)}\n          />","!isValid","<MenuDivider />","{id: referenceId, type: docType}","<MenuItem\n            text=\"Open in new tab\"\n            icon={LaunchIcon}\n            disabled={!isValid}\n            as={IntentLink}\n            intent=\"edit\"\n            params={{id: referenceId, type: docType}}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            data-as=\"a\"\n          />","<Menu>\n          <MenuItem\n            text=\"Remove from list\"\n            tone=\"critical\"\n            icon={RemoveCircleIcon}\n            onClick={() => operations.removeItem(nodeProps)}\n          />\n          <MenuItem\n            text=\"Duplicate item\"\n            icon={CopyIcon}\n            disabled={!isValid}\n            onClick={() => operations.duplicateItem(nodeProps)}\n          />\n          {/* <MenuItem\n            text=\"Move up\"\n            icon={ArrowUpIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemUp(nodeProps)}\n          />\n          <MenuItem\n            text=\"Move down\"\n            icon={ArrowDownIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemDown(nodeProps)}\n          /> */}\n          <MenuDivider />\n          <MenuItem\n            text=\"Open in new tab\"\n            icon={LaunchIcon}\n            disabled={!isValid}\n            as={IntentLink}\n            intent=\"edit\"\n            params={{id: referenceId, type: docType}}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            data-as=\"a\"\n          />\n        </Menu>","{portal: true, tone: 'default', placement: 'right'}","<MenuButton\n      button={<Button padding={2} mode=\"bleed\" icon={EllipsisVerticalIcon} />}\n      id={`hiearchical-doc-list--${node._key}-menuButton`}\n      menu={\n        <Menu>\n          <MenuItem\n            text=\"Remove from list\"\n            tone=\"critical\"\n            icon={RemoveCircleIcon}\n            onClick={() => operations.removeItem(nodeProps)}\n          />\n          <MenuItem\n            text=\"Duplicate item\"\n            icon={CopyIcon}\n            disabled={!isValid}\n            onClick={() => operations.duplicateItem(nodeProps)}\n          />\n          {/* <MenuItem\n            text=\"Move up\"\n            icon={ArrowUpIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemUp(nodeProps)}\n          />\n          <MenuItem\n            text=\"Move down\"\n            icon={ArrowDownIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemDown(nodeProps)}\n          /> */}\n          <MenuDivider />\n          <MenuItem\n            text=\"Open in new tab\"\n            icon={LaunchIcon}\n            disabled={!isValid}\n            as={IntentLink}\n            intent=\"edit\"\n            params={{id: referenceId, type: docType}}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            data-as=\"a\"\n          />\n        </Menu>\n      }\n      popover={{portal: true, tone: 'default', placement: 'right'}}\n    />","`hiearchical-doc-list--${node._key}-menuButton`","{\n  tree,\n  allItems,\n}: {\n  tree: StoredTreeItem[]\n  allItems: AllItems\n}","{}","function handleVisibilityToggle(data: any) {\n    setVisibilityMap((currentMap) => ({\n      ...currentMap,\n      [data.node._key]: data.expanded,\n    }))\n  }","dataToEditorTree({\n      tree,\n      allItems,\n      visibilityMap,\n    })","{\n    localTree: dataToEditorTree({\n      tree,\n      allItems,\n      visibilityMap,\n    }),\n    handleVisibilityToggle,\n  }","canDrag = false","useMemo(() => {\n    if (!canDrag) {\n      return null\n    }\n    if (typeof node.children === 'function' && node.expanded) {\n      // Show a loading symbol on the handle when the children are expanded\n      //  and yet still defined by a function (a callback to fetch the children)\n      return <Spinner />\n    }\n\n    const button = (\n      <Button\n        mode=\"bleed\"\n        paddingX={0}\n        paddingY={1}\n        style={{\n          cursor: node.publishedId ? 'grab' : 'default',\n          fontSize: '1.5625rem',\n        }}\n        data-ui=\"DragHandleButton\"\n        data-drag-handle={canDrag}\n        disabled={!node.publishedId}\n      >\n        <DragHandleIcon style={{marginBottom: '-0.1em'}} />\n      </Button>\n    )\n\n    // Don't allow editors to drag invalid documents\n    if (!node.publishedId) {\n      return <div>{button}</div>\n    }\n\n    // Show the handle used to initiate a drag-and-drop\n    return <div ref={connectDragSource}>{button}</div>\n  }, [canDrag, node, connectDragSource])","<Spinner />","{\n          cursor: node.publishedId ? 'grab' : 'default',\n          fontSize: '1.5625rem',\n        }","node.publishedId ? 'grab' : 'default'","<DragHandleIcon style={{marginBottom: '-0.1em'}} />","<Button\n        mode=\"bleed\"\n        paddingX={0}\n        paddingY={1}\n        style={{\n          cursor: node.publishedId ? 'grab' : 'default',\n          fontSize: '1.5625rem',\n        }}\n        data-ui=\"DragHandleButton\"\n        data-drag-handle={canDrag}\n        disabled={!node.publishedId}\n      >\n        <DragHandleIcon style={{marginBottom: '-0.1em'}} />\n      </Button>","!node.publishedId","<div>{button}</div>","<div ref={connectDragSource}>{button}</div>","{position: 'relative'}","toggleChildrenVisibility &&\n        node.children &&\n        (node.children.length > 0 || typeof node.children === 'function') && (\n          <div\n            style={{\n              position: 'absolute',\n              left: '-2px',\n              top: '40%',\n              transform: 'translate(-100%, -50%)',\n            }}\n          >\n            <Button\n              aria-label={node.expanded ? 'Collapse' : 'Expand'}\n              icon={\n                node.expanded ? (\n                  <ChevronDownIcon color={gray[200].hex} />\n                ) : (\n                  <ChevronRightIcon color={gray[200].hex} />\n                )\n              }\n              mode=\"bleed\"\n              fontSize={2}\n              padding={1}\n              type=\"button\"\n              onClick={() =>\n                toggleChildrenVisibility?.({\n                  node,\n                  path,\n                  treeIndex,\n                })\n              }\n            />\n          </div>\n        )","node.children","{\n            opacity: isDraggedDescendant ? 0.5 : 1,\n          }","isDraggedDescendant ? 0.5 : 1","typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle","<Flex align=\"center\">\n            {Handle}\n            {typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle}\n          </Flex>","<Root\n          data-landing={isLandingPadActive}\n          data-cancel={isLandingPadActive && !canDrop}\n          style={{\n            opacity: isDraggedDescendant ? 0.5 : 1,\n          }}\n        >\n          <Flex align=\"center\">\n            {Handle}\n            {typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle}\n          </Flex>\n        </Root>","isLandingPadActive && !canDrop","<div ref={connectDragPreview}>\n        <Root\n          data-landing={isLandingPadActive}\n          data-cancel={isLandingPadActive && !canDrop}\n          style={{\n            opacity: isDraggedDescendant ? 0.5 : 1,\n          }}\n        >\n          <Flex align=\"center\">\n            {Handle}\n            {typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle}\n          </Flex>\n        </Root>\n      </div>","<Box style={{position: 'relative'}}>\n      {toggleChildrenVisibility &&\n        node.children &&\n        (node.children.length > 0 || typeof node.children === 'function') && (\n          <div\n            style={{\n              position: 'absolute',\n              left: '-2px',\n              top: '40%',\n              transform: 'translate(-100%, -50%)',\n            }}\n          >\n            <Button\n              aria-label={node.expanded ? 'Collapse' : 'Expand'}\n              icon={\n                node.expanded ? (\n                  <ChevronDownIcon color={gray[200].hex} />\n                ) : (\n                  <ChevronRightIcon color={gray[200].hex} />\n                )\n              }\n              mode=\"bleed\"\n              fontSize={2}\n              padding={1}\n              type=\"button\"\n              onClick={() =>\n                toggleChildrenVisibility?.({\n                  node,\n                  path,\n                  treeIndex,\n                })\n              }\n            />\n          </div>\n        )}\n\n      <div ref={connectDragPreview}>\n        <Root\n          data-landing={isLandingPadActive}\n          data-cancel={isLandingPadActive && !canDrop}\n          style={{\n            opacity: isDraggedDescendant ? 0.5 : 1,\n          }}\n        >\n          <Flex align=\"center\">\n            {Handle}\n            {typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle}\n          </Flex>\n        </Root>\n      </div>\n    </Box>","{\n          borderStyle: props.isOver ? undefined : 'dashed',\n        }","props.isOver ? undefined : 'dashed'","{textAlign: 'center'}","<Text size={2} as=\"h2\" muted>\n            {!props.isOver && props.title}\n            {isValid && 'Drop here'}\n            {isInvalid && 'Invalid location or element'}\n          </Text>","!props.isOver && props.title","isValid && 'Drop here'","isInvalid && 'Invalid location or element'","props.subtitle && <Text size={1}>{props.subtitle}</Text>","subtitle","<Stack gap={2} style={{textAlign: 'center'}}>\n          <Text size={2} as=\"h2\" muted>\n            {!props.isOver && props.title}\n            {isValid && 'Drop here'}\n            {isInvalid && 'Invalid location or element'}\n          </Text>\n          {props.subtitle && <Text size={1}>{props.subtitle}</Text>}\n          {props.children}\n        </Stack>","children","<Box padding={3}>\n      <Card\n        padding={5}\n        radius={2}\n        border\n        tone={tone}\n        style={{\n          borderStyle: props.isOver ? undefined : 'dashed',\n        }}\n      >\n        <Stack gap={2} style={{textAlign: 'center'}}>\n          <Text size={2} as=\"h2\" muted>\n            {!props.isOver && props.title}\n            {isValid && 'Drop here'}\n            {isInvalid && 'Invalid location or element'}\n          </Text>\n          {props.subtitle && <Text size={1}>{props.subtitle}</Text>}\n          {props.children}\n        </Stack>\n      </Card>\n    </Box>","lowerSiblingCounts.map((lowerSiblingCount: number, i: number) => {\n    if (lowerSiblingCount < 0 || treeIndex === listIndex || i !== swapDepth) {\n      return null\n    }\n\n    // This row has been shifted, and is at the depth of\n    // the line pointing to the new destination\n    let highlightLineClass = ''\n\n    if (listIndex === (swapFrom || 0) + (swapLength || 0) - 1) {\n      // This block is on the bottom (target) line\n      // This block points at the target block (where the row will go when released)\n      highlightLineClass = 'rst__highlightBottomLeftCorner'\n    } else if (treeIndex === swapFrom) {\n      // This block is on the top (source) line\n      highlightLineClass = 'rst__highlightTopLeftCorner'\n    } else {\n      // This block is between the bottom and top\n      highlightLineClass = 'rst__highlightLineVertical'\n    }\n\n    const style = {\n      width: scaffoldBlockPxWidth,\n      left: scaffoldBlockPxWidth * i,\n    }\n\n    return (\n      <div\n        key={i}\n        style={style}\n        className={`rst__unclickable rst__absoluteLineBlock ${highlightLineClass || ''}`}\n        tabIndex={-1}\n      />\n    )\n  })","(lowerSiblingCount: number, i: number) => {\n    if (lowerSiblingCount < 0 || treeIndex === listIndex || i !== swapDepth) {\n      return null\n    }\n\n    // This row has been shifted, and is at the depth of\n    // the line pointing to the new destination\n    let highlightLineClass = ''\n\n    if (listIndex === (swapFrom || 0) + (swapLength || 0) - 1) {\n      // This block is on the bottom (target) line\n      // This block points at the target block (where the row will go when released)\n      highlightLineClass = 'rst__highlightBottomLeftCorner'\n    } else if (treeIndex === swapFrom) {\n      // This block is on the top (source) line\n      highlightLineClass = 'rst__highlightTopLeftCorner'\n    } else {\n      // This block is between the bottom and top\n      highlightLineClass = 'rst__highlightLineVertical'\n    }\n\n    const style = {\n      width: scaffoldBlockPxWidth,\n      left: scaffoldBlockPxWidth * i,\n    }\n\n    return (\n      <div\n        key={i}\n        style={style}\n        className={`rst__unclickable rst__absoluteLineBlock ${highlightLineClass || ''}`}\n        tabIndex={-1}\n      />\n    )\n  }","<ScaffoldStyles />","<>\n      {scaffold}\n      <ScaffoldStyles />\n    </>","{\n          // prettier-ignore\n          paddingLeft: `${BASE_LEFT_PADDING + (NESTING_PADDING * scaffoldBlockCount)}px`,\n        }","`${BASE_LEFT_PADDING + (NESTING_PADDING * scaffoldBlockCount)}px`","Children.map(children, (child) =>\n          cloneElement(child as ReactElement<any>, {\n            isOver,\n            canDrop,\n            draggedNode,\n          }),\n        )","(child) =>\n          cloneElement(child as ReactElement<any>, {\n            isOver,\n            canDrop,\n            draggedNode,\n          })","<div\n        style={{\n          // prettier-ignore\n          paddingLeft: `${BASE_LEFT_PADDING + (NESTING_PADDING * scaffoldBlockCount)}px`,\n        }}\n      >\n        {Children.map(children, (child) =>\n          cloneElement(child as ReactElement<any>, {\n            isOver,\n            canDrop,\n            draggedNode,\n          }),\n        )}\n      </div>","<TreeNodeRendererScaffold {...props} />","<div ref={connectDropTarget} style={props.style} data-tree-row=\"\">\n      <div\n        style={{\n          // prettier-ignore\n          paddingLeft: `${BASE_LEFT_PADDING + (NESTING_PADDING * scaffoldBlockCount)}px`,\n        }}\n      >\n        {Children.map(children, (child) =>\n          cloneElement(child as ReactElement<any>, {\n            isOver,\n            canDrop,\n            draggedNode,\n          }),\n        )}\n      </div>\n      <TreeNodeRendererScaffold {...props} />\n    </div>","style","props.style","{\n    tree: props.tree,\n    allItems,\n  }","tree","{\n    patchPrefix: props.patchPrefix,\n    onChange: props.onChange,\n    localTree,\n  }","onChange","patchPrefix","() => {\n    const el = document.querySelector<HTMLElement>(`#${documentId} [data-tree-row]`)\n    const rowHeight = el?.offsetHeight || 51\n    setTreeViewHeight(getTreeHeight(localTree, rowHeight))\n  }","useCallback(() => {\n    const el = document.querySelector<HTMLElement>(`#${documentId} [data-tree-row]`)\n    const rowHeight = el?.offsetHeight || 51\n    setTreeViewHeight(getTreeHeight(localTree, rowHeight))\n  }, [documentId, localTree])","() => {\n    // Wait for dom to load before (re)calculating the tree height.\n    const timeout = setTimeout(updateTreeViewHeight)\n    return () => clearTimeout(timeout)\n  }","[updateTreeViewHeight]","(data: unknown) => operations.handleMovedNode(data as HandleMovedNodeData)","useCallback(\n    // The tree nodes are always our own LocalTreeItem objects\n    (data: unknown) => operations.handleMovedNode(data as HandleMovedNodeData),\n    [operations],\n  )","getCommonTreeProps({\n        placeholder: {\n          title: 'Add items from the list below',\n        },\n      })","useMemo(\n    () =>\n      getCommonTreeProps({\n        placeholder: {\n          title: 'Add items from the list below',\n        },\n      }),\n    [],\n  )","{...operations, allItemsStatus}","useMemo(\n    () => ({...operations, allItemsStatus}),\n    [operations, allItemsStatus],\n  )","TreeOperationsContext.Provider","<Box id={documentId} ref={setContext}>\n        {context ? (\n          <DndProvider backend={HTML5Backend} options={{rootElement: context}}>\n            <TreeOperationsContext.Provider value={operationContext}>\n              <Stack gap={4} paddingTop={4}>\n                <Card\n                  style={{minHeight: treeViewHeight}}\n                  // Only include borderBottom if there's something to show in unadded items\n                  borderBottom={allItemsStatus !== 'success' || unAddedItems?.length > 0}\n                >\n                  <SortableTree\n                    maxDepth={props.options.maxDepth}\n                    onChange={doNothingOnChange}\n                    onVisibilityToggle={handleVisibilityToggle}\n                    canDrop={canDrop}\n                    onMoveNode={onMoveNode}\n                    // Stable keys keep row identity (and their DOM nodes) intact while\n                    // rows are repositioned during a drag\n                    getNodeKey={getNodeKey}\n                    treeData={localTree}\n                    // The tree renders inside a virtualized list which requires\n                    // a definite height (percentages would resolve to 0)\n                    style={treeViewHeight ? {height: treeViewHeight} : undefined}\n                    {...treeProps}\n                  />\n                </Card>\n\n                {allItemsStatus === 'success' && unAddedItems?.length > 0 && (\n                  <Stack gap={1} paddingX={2} paddingTop={3}>\n                    <Stack gap={2} paddingX={2} paddingBottom={3}>\n                      <Text size={2} as=\"h2\" weight=\"semibold\">\n                        Add more items\n                      </Text>\n                      <Text size={1} muted>\n                        Only published documents are shown.\n                      </Text>\n                    </Stack>\n                    {unAddedItems.map((item) => (\n                      <DocumentInNode\n                        key={item.publishedId || item.draftId}\n                        item={item}\n                        action={\n                          <Tooltip\n                            portal\n                            placement=\"left\"\n                            content={\n                              <Box padding={2}>\n                                <Text size={1}>Add to list</Text>\n                              </Box>\n                            }\n                          >\n                            <Button\n                              onClick={() => {\n                                operations.addItem(item)\n                              }}\n                              mode=\"bleed\"\n                              icon={AddCircleIcon}\n                              style={{cursor: 'pointer'}}\n                            />\n                          </Tooltip>\n                        }\n                      />\n                    ))}\n                  </Stack>\n                )}\n                {allItemsStatus === 'loading' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Spinner size={3} muted />\n                  </Flex>\n                )}\n                {allItemsStatus === 'error' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Text size={2} weight=\"semibold\">\n                      Something went wrong when loading documents\n                    </Text>\n                  </Flex>\n                )}\n              </Stack>\n            </TreeOperationsContext.Provider>\n          </DndProvider>\n        ) : null}\n      </Box>","Box","context ? (\n          <DndProvider backend={HTML5Backend} options={{rootElement: context}}>\n            <TreeOperationsContext.Provider value={operationContext}>\n              <Stack gap={4} paddingTop={4}>\n                <Card\n                  style={{minHeight: treeViewHeight}}\n                  // Only include borderBottom if there's something to show in unadded items\n                  borderBottom={allItemsStatus !== 'success' || unAddedItems?.length > 0}\n                >\n                  <SortableTree\n                    maxDepth={props.options.maxDepth}\n                    onChange={doNothingOnChange}\n                    onVisibilityToggle={handleVisibilityToggle}\n                    canDrop={canDrop}\n                    onMoveNode={onMoveNode}\n                    // Stable keys keep row identity (and their DOM nodes) intact while\n                    // rows are repositioned during a drag\n                    getNodeKey={getNodeKey}\n                    treeData={localTree}\n                    // The tree renders inside a virtualized list which requires\n                    // a definite height (percentages would resolve to 0)\n                    style={treeViewHeight ? {height: treeViewHeight} : undefined}\n                    {...treeProps}\n                  />\n                </Card>\n\n                {allItemsStatus === 'success' && unAddedItems?.length > 0 && (\n                  <Stack gap={1} paddingX={2} paddingTop={3}>\n                    <Stack gap={2} paddingX={2} paddingBottom={3}>\n                      <Text size={2} as=\"h2\" weight=\"semibold\">\n                        Add more items\n                      </Text>\n                      <Text size={1} muted>\n                        Only published documents are shown.\n                      </Text>\n                    </Stack>\n                    {unAddedItems.map((item) => (\n                      <DocumentInNode\n                        key={item.publishedId || item.draftId}\n                        item={item}\n                        action={\n                          <Tooltip\n                            portal\n                            placement=\"left\"\n                            content={\n                              <Box padding={2}>\n                                <Text size={1}>Add to list</Text>\n                              </Box>\n                            }\n                          >\n                            <Button\n                              onClick={() => {\n                                operations.addItem(item)\n                              }}\n                              mode=\"bleed\"\n                              icon={AddCircleIcon}\n                              style={{cursor: 'pointer'}}\n                            />\n                          </Tooltip>\n                        }\n                      />\n                    ))}\n                  </Stack>\n                )}\n                {allItemsStatus === 'loading' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Spinner size={3} muted />\n                  </Flex>\n                )}\n                {allItemsStatus === 'error' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Text size={2} weight=\"semibold\">\n                      Something went wrong when loading documents\n                    </Text>\n                  </Flex>\n                )}\n              </Stack>\n            </TreeOperationsContext.Provider>\n          </DndProvider>\n        ) : null","<TreeEditorErrorBoundary>\n      {/*Use this Box-wrapper to get a context Element to prevent DndProvider to have to HTML% backend at the same time https://github.com/react-dnd/react-dnd/issues/186#issuecomment-978206387 */}\n      <Box id={documentId} ref={setContext}>\n        {context ? (\n          <DndProvider backend={HTML5Backend} options={{rootElement: context}}>\n            <TreeOperationsContext.Provider value={operationContext}>\n              <Stack gap={4} paddingTop={4}>\n                <Card\n                  style={{minHeight: treeViewHeight}}\n                  // Only include borderBottom if there's something to show in unadded items\n                  borderBottom={allItemsStatus !== 'success' || unAddedItems?.length > 0}\n                >\n                  <SortableTree\n                    maxDepth={props.options.maxDepth}\n                    onChange={doNothingOnChange}\n                    onVisibilityToggle={handleVisibilityToggle}\n                    canDrop={canDrop}\n                    onMoveNode={onMoveNode}\n                    // Stable keys keep row identity (and their DOM nodes) intact while\n                    // rows are repositioned during a drag\n                    getNodeKey={getNodeKey}\n                    treeData={localTree}\n                    // The tree renders inside a virtualized list which requires\n                    // a definite height (percentages would resolve to 0)\n                    style={treeViewHeight ? {height: treeViewHeight} : undefined}\n                    {...treeProps}\n                  />\n                </Card>\n\n                {allItemsStatus === 'success' && unAddedItems?.length > 0 && (\n                  <Stack gap={1} paddingX={2} paddingTop={3}>\n                    <Stack gap={2} paddingX={2} paddingBottom={3}>\n                      <Text size={2} as=\"h2\" weight=\"semibold\">\n                        Add more items\n                      </Text>\n                      <Text size={1} muted>\n                        Only published documents are shown.\n                      </Text>\n                    </Stack>\n                    {unAddedItems.map((item) => (\n                      <DocumentInNode\n                        key={item.publishedId || item.draftId}\n                        item={item}\n                        action={\n                          <Tooltip\n                            portal\n                            placement=\"left\"\n                            content={\n                              <Box padding={2}>\n                                <Text size={1}>Add to list</Text>\n                              </Box>\n                            }\n                          >\n                            <Button\n                              onClick={() => {\n                                operations.addItem(item)\n                              }}\n                              mode=\"bleed\"\n                              icon={AddCircleIcon}\n                              style={{cursor: 'pointer'}}\n                            />\n                          </Tooltip>\n                        }\n                      />\n                    ))}\n                  </Stack>\n                )}\n                {allItemsStatus === 'loading' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Spinner size={3} muted />\n                  </Flex>\n                )}\n                {allItemsStatus === 'error' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Text size={2} weight=\"semibold\">\n                      Something went wrong when loading documents\n                    </Text>\n                  </Flex>\n                )}\n              </Stack>\n            </TreeOperationsContext.Provider>\n          </DndProvider>\n        ) : null}\n      </Box>\n    </TreeEditorErrorBoundary>","TreeEditorErrorBoundary","published?.[treeFieldKey] || []","(patchEvent: PatchEvent) => {\n      if (!patch?.execute) {\n        return\n      }\n      patch.execute(toGradient(injectNodeTypeInPatches(patchEvent.patches, treeDocType)))\n    }","patch?.execute","useCallback(\n    (patchEvent: PatchEvent) => {\n      if (!patch?.execute) {\n        return\n      }\n      patch.execute(toGradient(injectNodeTypeInPatches(patchEvent.patches, treeDocType)))\n    },\n    [patch, treeDocType],\n  )","() => {\n    if (!publishedId && patch?.execute && !patch?.disabled) {\n      // If no published document, create it\n      patch.execute([{setIfMissing: {[treeFieldKey]: []}}])\n    }\n  }","[publishedId, patch, treeFieldKey]","<DeskWarning\n        title=\"Invalid configuration\"\n        subtitle=\"The `documentType` passed to `createStructureHierarchy` isn't live editable.\\nTo continue using this plugin, add `liveEdit: true` to your custom schema type or unset `documentType` in your hierarchy configuration.\"\n      />","<DeskWarning\n        title=\"This hierarchy tree contains a draft\"\n        subtitle=\"Click on the button below to publish your draft in order to continue editing the live published document.\"\n      />","<Flex padding={5} align={'center'} justify={'center'} height={'fill'}>\n        <Spinner width={4} muted />\n      </Flex>","<Box paddingBottom={5} paddingRight={2}>\n      <TreeEditor\n        options={props.options}\n        tree={treeValue}\n        onChange={handleChange}\n        patchPrefix={treeFieldKey}\n      />\n    </Box>","options","(patch: any) => {\n      const patches = injectNodeTypeInPatches(patch?.patches, documentType)\n      onFieldChange(new PatchEvent(patches))\n    }","useCallback(\n    (patch: any) => {\n      const patches = injectNodeTypeInPatches(patch?.patches, documentType)\n      onFieldChange(new PatchEvent(patches))\n    },\n    [documentType, onFieldChange],\n  )","props.value || []","value","<TreeEditor options={props.type.options} tree={props.value || []} onChange={onChange} />","options","<FormField\n      description={props.type.description} // Creates description from schema\n      title={props.type.title} // Creates label from schema title\n      __unstable_presence={props.presence} // Handles presence avatars\n      path={EMPTY_PATH}\n    >\n      <TreeEditor options={props.type.options} tree={props.value || []} onChange={onChange} />\n    </FormField>","presence","description","title"],"sources":["../src/components/DeskWarning.tsx","../src/utils/idUtils.ts","../src/hooks/useAllItems.ts","../src/hooks/useTreeOperations.ts","../src/components/DocumentPreviewStatus.tsx","../src/components/DocumentInNode.tsx","../src/components/NodeActions.tsx","../src/utils/flatDataToTree.ts","../src/utils/injectNodeTypeInPatches.ts","../src/utils/treeData.tsx","../src/hooks/useLocalTree.ts","../src/utils/getAdjescentNodes.ts","../src/utils/moveItemInArray.ts","../src/utils/treePatches.ts","../src/hooks/useTreeOperationsProvider.ts","../src/components/NodeContentRenderer.tsx","../src/components/PlaceholderDropzone.tsx","../src/components/TreeNodeRendererScaffold.tsx","../src/components/TreeNodeRenderer.tsx","../src/utils/getCommonTreeProps.tsx","../src/utils/getTreeHeight.ts","../src/components/TreeEditorErrorBoundary.tsx","../src/components/TreeEditor.tsx","../src/utils/gradientPatchAdapter.ts","../src/TreeDeskStructure.tsx","../src/TreeInputComponent.tsx","../src/utils/throwError.ts","../src/createHierarchicalSchemas.tsx","../src/createStructureHierarchy.tsx","../src/schemas/hierarchy.tree.ts","../src/index.ts"],"sourcesContent":["import {Box, Card, Container, Heading, Stack, Text} from '@sanity/ui'\nimport {Fragment, type PropsWithChildren} from 'react'\n\n// React component that wraps text between two delimiters in a <code> tag\n\nconst WrapCodeBlocks = ({text}: {text: string}) => {\n  return (\n    <>\n      {text.split('`').map((part, i) => (\n        <Fragment key={i}>{i % 2 === 0 ? part : <code>{part}</code>}</Fragment>\n      ))}\n    </>\n  )\n}\n\nconst DeskWarning = (\n  props: PropsWithChildren<{\n    title: string\n    subtitle?: string\n  }>,\n) => {\n  return (\n    <Container padding={5} style={{maxWidth: '25rem'}} sizing={'content'}>\n      <Card padding={4} border radius={2} tone=\"caution\">\n        <Stack gap={3}>\n          <Heading size={1}>{props.title}</Heading>\n          {props.subtitle &&\n            props.subtitle.split(/\\\\n|\\n/).map((line: string) => (\n              <Text size={1} key={line}>\n                <WrapCodeBlocks text={line} />\n              </Text>\n            ))}\n          {props.children && <Box marginTop={2}>{props.children}</Box>}\n        </Stack>\n      </Card>\n    </Container>\n  )\n}\n\nexport default DeskWarning\n","export function unprefixId(_id = ''): string {\n  return _id.replace('drafts.', '')\n}\n\nexport function isDraft(_id = ''): boolean {\n  return _id.startsWith('drafts.')\n}\n","import {useEffect, useReducer, useState} from 'react'\nimport {type SanityDocument, useClient} from 'sanity'\n\nimport type {AllItems, TreeInputOptions} from '../types'\nimport {isDraft, unprefixId} from '../utils/idUtils'\n\nfunction getDeskFilter({referenceTo, referenceOptions}: TreeInputOptions): {\n  filter: string\n  params: Record<string, unknown>\n} {\n  const filterParts: string[] = ['_type in $docTypes']\n\n  if (referenceOptions?.filter) {\n    filterParts.push(referenceOptions.filter)\n  }\n\n  return {\n    filter: filterParts.join(' && '),\n    params: {\n      ...referenceOptions?.filterParams,\n      docTypes: referenceTo.map((schemaType) => schemaType),\n    },\n  }\n}\n\ntype Status = 'loading' | 'success' | 'error'\n\ntype ACTIONTYPE =\n  | {type: 'addOrEditItem'; item: SanityDocument}\n  | {type: 'removeItem'; itemId: string}\n  | {type: 'setInitialData'; items: SanityDocument[]}\n\nfunction updateItemInState(state: AllItems, item: SanityDocument): AllItems {\n  const newState = {...state}\n  const publishedId = unprefixId(item._id)\n  newState[publishedId] = {\n    ...newState[publishedId],\n    [isDraft(item._id) ? 'draft' : 'published']: item,\n  }\n  return newState\n}\n\nfunction allItemsReducer(state: AllItems, action: ACTIONTYPE): AllItems {\n  if (action.type === 'addOrEditItem' && action.item?._id) {\n    return updateItemInState(state, action.item)\n  }\n\n  if (action.type === 'removeItem') {\n    const publishedId = unprefixId(action.itemId)\n    return {\n      ...state,\n      [publishedId]: isDraft(action.itemId)\n        ? // If a draft, keep only published\n          {\n            published: state[publishedId]?.published,\n          }\n        : {\n            draft: state[publishedId]?.draft,\n          },\n    }\n  }\n\n  if (action.type === 'setInitialData') {\n    return action.items.reduce(updateItemInState, {})\n  }\n  return state\n}\n\nexport default function useAllItems(options: TreeInputOptions): {\n  status: Status\n  allItems: AllItems\n} {\n  const client = useClient({\n    apiVersion: '2021-09-01',\n  })\n  const [status, setStatus] = useState<Status>('loading')\n  const [allItems, dispatch] = useReducer(allItemsReducer, {})\n\n  useEffect(() => {\n    function handleListener(event: {type?: string; result?: SanityDocument; documentId?: string}) {\n      if (event.type !== 'mutation') {\n        return\n      }\n\n      if (event.result) {\n        dispatch({type: 'addOrEditItem', item: event.result})\n      } else if (event.documentId) {\n        dispatch({type: 'removeItem', itemId: event.documentId})\n      }\n    }\n\n    const {filter, params} = getDeskFilter(options)\n    const query = `*[${filter}] {\n      _id,\n      _type,\n      _updatedAt,\n    }`\n\n    async function fetchInitialData() {\n      try {\n        const items = await client.fetch<SanityDocument[]>(query, params)\n        dispatch({type: 'setInitialData', items})\n        setStatus('success')\n      } catch {\n        setStatus('error')\n      }\n    }\n    void fetchInitialData()\n\n    const listener = client.listen(query, params).subscribe(handleListener)\n    return () => {\n      listener.unsubscribe()\n    }\n  }, [client, options])\n\n  return {\n    status,\n    allItems,\n  }\n}\n","import {createContext, useContext} from 'react'\n\nimport type useAllItems from './useAllItems'\nimport type useTreeOperationsProvider from './useTreeOperationsProvider'\n\ntype ContextValue = ReturnType<typeof useTreeOperationsProvider> & {\n  allItemsStatus: ReturnType<typeof useAllItems>['status']\n}\n\nfunction placeholder() {\n  // no-op\n}\n\nexport const TreeOperationsContext = createContext<ContextValue>({\n  addItem: placeholder,\n  duplicateItem: placeholder,\n  removeItem: placeholder,\n  handleMovedNode: placeholder,\n  moveItemDown: placeholder,\n  moveItemUp: placeholder,\n  allItemsStatus: 'loading',\n})\n\nexport default function useTreeOperations(): ContextValue {\n  return useContext(TreeOperationsContext)\n}\n","import {EditIcon} from '@sanity/icons/Edit'\nimport {PublishIcon} from '@sanity/icons/Publish'\nimport {Box, Inline, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type SanityDocument, TextWithTone, useRelativeTime} from 'sanity'\n\nimport type {DocumentPair} from '../types'\n\nfunction TimeAgo({time}: {time: string | Date}) {\n  const timeAgo = useRelativeTime(time)\n\n  return (\n    <span title={timeAgo}>\n      {timeAgo}\n      {timeAgo.toLowerCase().trim().startsWith('just now') ? '' : ' ago'}\n    </span>\n  )\n}\n\nconst PublishedStatus = ({document}: {document?: SanityDocument | null}) => (\n  <Tooltip\n    portal\n    content={\n      <Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Published {document._updatedAt && <TimeAgo time={document._updatedAt} />}</>\n          ) : (\n            <>Not published</>\n          )}\n        </Text>\n      </Box>\n    }\n  >\n    <TextWithTone tone=\"positive\" dimmed={!document} muted={!document} size={1}>\n      <PublishIcon />\n    </TextWithTone>\n  </Tooltip>\n)\n\nconst DraftStatus = ({document}: {document?: SanityDocument | null}) => (\n  <Tooltip\n    portal\n    content={\n      <Box padding={2}>\n        <Text size={1}>\n          {document ? (\n            <>Edited {document?._updatedAt && <TimeAgo time={document?._updatedAt} />}</>\n          ) : (\n            <>No unpublished edits</>\n          )}\n        </Text>\n      </Box>\n    }\n  >\n    <TextWithTone tone=\"caution\" dimmed={!document} muted={!document} size={1}>\n      <EditIcon />\n    </TextWithTone>\n  </Tooltip>\n)\n\n// Adapted from @sanity\\desk-tool\\src\\components\\paneItem\\helpers.tsx\nconst DocumentPreviewStatus = ({draft, published}: DocumentPair) => {\n  return (\n    <Inline gap={4}>\n      <PublishedStatus document={published} />\n      <DraftStatus document={draft} />\n    </Inline>\n  )\n}\n\nexport default DocumentPreviewStatus\n","import {HelpCircleIcon} from '@sanity/icons/HelpCircle'\nimport {Box, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {type ReactNode, useMemo} from 'react'\nimport {Preview, type SanityDocument, type SchemaType, TextWithTone, useSchema} from 'sanity'\nimport {type RouterPaneGroup, usePaneRouter} from 'sanity/structure'\n\nimport useTreeOperations from '../hooks/useTreeOperations'\nimport type {LocalTreeItem} from '../types'\nimport DocumentPreviewStatus from './DocumentPreviewStatus'\n\n/**\n * Renders a preview for each referenced document.\n * Nested inside TreeNode.tsx\n */\nconst DocumentInNode = (props: {item: LocalTreeItem; action?: ReactNode}) => {\n  const {value: {reference, docType} = {}, draftId, publishedId} = props.item\n  const referenceId = reference?._ref\n  const {routerPanesState, ChildLink} = usePaneRouter()\n  const {allItemsStatus} = useTreeOperations()\n  const schema = useSchema()\n  const isActive = useMemo(() => {\n    // If some pane is active with the current document `_id`, it's active\n    return routerPanesState.some((pane: RouterPaneGroup) =>\n      pane.some((group) => group.id === referenceId),\n    )\n  }, [referenceId, routerPanesState])\n\n  const type = useMemo(() => {\n    return docType ? schema.get(docType) : undefined\n  }, [docType, schema])\n\n  if (!reference?._ref) {\n    return null\n  }\n\n  return (\n    <Flex gap={2} align=\"center\" style={{flex: 1}}>\n      {/* Show loading preview while allItems aren't ready */}\n      {publishedId || allItemsStatus !== 'success' ? (\n        /* Card loosely copied from @sanity/desk-tool's PaneItem.tsx */\n        <Card\n          __unstable_focusRing\n          as={ChildLink}\n          childId={referenceId!}\n          childParameters={{type: docType!}}\n          tone={isActive ? 'primary' : 'default'}\n          padding={1}\n          radius={2}\n          flex={1}\n          data-as=\"a\"\n          data-ui=\"PaneItem\"\n        >\n          <Preview\n            layout=\"default\"\n            schemaType={type as SchemaType}\n            value={{_ref: draftId || reference?._ref}}\n            status={\n              <DocumentPreviewStatus\n                draft={\n                  draftId\n                    ? ({\n                        _id: draftId,\n                        _type: docType,\n                        _updatedAt: props.item.draftUpdatedAt,\n                      } as SanityDocument)\n                    : undefined\n                }\n                published={\n                  {\n                    _id: reference?._ref,\n                    _type: docType,\n                    _updatedAt: props.item.publishedUpdatedAt,\n                  } as SanityDocument\n                }\n              />\n            }\n          />\n        </Card>\n      ) : (\n        <Card padding={3} radius={1} flex={1}>\n          <Flex align=\"center\">\n            <Text size={2} muted style={{flex: 1}}>\n              Invalid document\n            </Text>\n            <Tooltip\n              placement=\"left\"\n              portal\n              content={\n                <Box padding={3}>\n                  <Flex align=\"flex-start\" gap={3}>\n                    <TextWithTone tone=\"default\" size={3}>\n                      <HelpCircleIcon />\n                    </TextWithTone>\n                    <Stack gap={3}>\n                      <Text as=\"h2\" size={1} weight=\"semibold\">\n                        This document is not valid\n                      </Text>\n                      {/* <Text size={1}>\n                        It was deleted or it doesn't match the filters set by this hierarchy.\n                      </Text> */}\n                      <Text size={1}>ID: {reference?._ref}</Text>\n                    </Stack>\n                  </Flex>\n                </Box>\n              }\n            >\n              <TextWithTone tone=\"default\" size={2}>\n                <HelpCircleIcon />\n              </TextWithTone>\n            </Tooltip>\n          </Flex>\n        </Card>\n      )}\n      {props.action}\n    </Flex>\n  )\n}\n\nexport default DocumentInNode\n","import {CopyIcon} from '@sanity/icons/Copy'\nimport {EllipsisVerticalIcon} from '@sanity/icons/EllipsisVertical'\nimport {LaunchIcon} from '@sanity/icons/Launch'\nimport {RemoveCircleIcon} from '@sanity/icons/RemoveCircle'\nimport {Button} from '@sanity/ui'\nimport {Menu, MenuButton, MenuDivider, MenuItem} from '@sanity/ui/menu'\nimport {IntentButton as IntentLink} from 'sanity'\n\nimport useTreeOperations from '../hooks/useTreeOperations'\nimport type {NodeProps} from '../types'\n\n/**\n * Applicable only to nodes inside the main tree.\n * Unadded items have their actions defined in TreeEditor.\n */\nconst NodeActions = ({nodeProps}: {nodeProps: NodeProps}) => {\n  const operations = useTreeOperations()\n  const {node} = nodeProps\n  const {reference, docType} = node?.value || {}\n  const referenceId = reference?._ref\n\n  const isValid = !!node.publishedId\n  return (\n    <MenuButton\n      button={<Button padding={2} mode=\"bleed\" icon={EllipsisVerticalIcon} />}\n      id={`hiearchical-doc-list--${node._key}-menuButton`}\n      menu={\n        <Menu>\n          <MenuItem\n            text=\"Remove from list\"\n            tone=\"critical\"\n            icon={RemoveCircleIcon}\n            onClick={() => operations.removeItem(nodeProps)}\n          />\n          <MenuItem\n            text=\"Duplicate item\"\n            icon={CopyIcon}\n            disabled={!isValid}\n            onClick={() => operations.duplicateItem(nodeProps)}\n          />\n          {/* <MenuItem\n            text=\"Move up\"\n            icon={ArrowUpIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemUp(nodeProps)}\n          />\n          <MenuItem\n            text=\"Move down\"\n            icon={ArrowDownIcon}\n            disabled={!isValid}\n            onClick={() => operations.moveItemDown(nodeProps)}\n          /> */}\n          <MenuDivider />\n          <MenuItem\n            text=\"Open in new tab\"\n            icon={LaunchIcon}\n            disabled={!isValid}\n            as={IntentLink}\n            intent=\"edit\"\n            params={{id: referenceId, type: docType}}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            data-as=\"a\"\n          />\n        </Menu>\n      }\n      popover={{portal: true, tone: 'default', placement: 'right'}}\n    />\n  )\n}\n\nexport default NodeActions\n","import type {StoredTreeItem} from '../types'\n\ninterface TreeItemWithChildren extends StoredTreeItem {\n  // Index signature for structural compatibility with react-sortable-tree's TreeItem\n  [key: string]: unknown\n  children?: TreeItemWithChildren[]\n}\n\n/**\n * Converts the flat array stored in the Sanity document into a nested tree,\n * nesting items under their `parent` _key. Items without a `parent` are roots.\n */\nexport default function flatDataToTree(data: StoredTreeItem[]): TreeItemWithChildren[] {\n  const childrenByParent = new Map<string | null, StoredTreeItem[]>()\n  for (const item of data) {\n    const parentKey = item.parent || null\n    const siblings = childrenByParent.get(parentKey)\n    if (siblings) {\n      siblings.push(item)\n    } else {\n      childrenByParent.set(parentKey, [item])\n    }\n  }\n\n  const buildNode = (item: StoredTreeItem): TreeItemWithChildren => {\n    const children = childrenByParent.get(item._key)\n    return children ? {...item, children: children.map(buildNode)} : {...item}\n  }\n\n  return (childrenByParent.get(null) || []).map(buildNode)\n}\n","export function getSchemaTypeName(\n  documentType: string,\n  type: 'document' | 'node' | 'nodeValue' | 'array',\n): string {\n  switch (type) {\n    case 'document':\n      return documentType\n    case 'array':\n      return `${documentType}.array`\n    case 'node':\n      return `${documentType}.node`\n    case 'nodeValue':\n      return `${documentType}.nodeValue`\n    default:\n      return documentType\n  }\n}\n\n/**\n * Temporary value of nodes' `_type` before they are normalized and persisted as the user-defined choice.\n */\nexport const DEFAULT_DOC_TYPE = 'hierarchy.tree'\nexport const INTERNAL_NODE_TYPE = getSchemaTypeName(DEFAULT_DOC_TYPE, 'node')\nexport const INTERNAL_NODE_VALUE_TYPE = getSchemaTypeName(DEFAULT_DOC_TYPE, 'nodeValue')\nexport const INTERNAL_NODE_ARRAY_TYPE = getSchemaTypeName(DEFAULT_DOC_TYPE, 'array')\n\n/**\n * Barebones recursive utility to inject the desired nodeObjectType in patches generated in deeply nested components and utilities.\n */\nexport default function injectNodeTypeInPatches(patchData: any, documentType: string): any {\n  if (Array.isArray(patchData)) {\n    return patchData.map((child) => injectNodeTypeInPatches(child, documentType))\n  }\n  if (typeof patchData === 'object' && patchData !== null) {\n    const newObject: Record<string, unknown> = {}\n    for (const key of Object.keys(patchData)) {\n      const value = patchData[key as keyof typeof patchData]\n\n      if (\n        key === '_type' &&\n        typeof value === 'string' &&\n        [INTERNAL_NODE_TYPE, INTERNAL_NODE_VALUE_TYPE].includes(value)\n      ) {\n        newObject[key] = getSchemaTypeName(\n          documentType,\n          value === INTERNAL_NODE_TYPE ? 'node' : 'nodeValue',\n        )\n      } else {\n        newObject[key] = injectNodeTypeInPatches(value, documentType)\n      }\n    }\n    return newObject\n  }\n  return patchData\n}\n","import {randomKey} from '@sanity/util/content'\n\nimport DocumentInNode from '../components/DocumentInNode'\nimport NodeActions from '../components/NodeActions'\nimport type {\n  AllItems,\n  DocumentPair,\n  EnhancedTreeItem,\n  LocalTreeItem,\n  NodeProps,\n  StoredTreeItem,\n  VisibilityMap,\n} from '../types'\nimport flatDataToTree from './flatDataToTree'\nimport {INTERNAL_NODE_TYPE, INTERNAL_NODE_VALUE_TYPE} from './injectNodeTypeInPatches'\n\nexport const dataToEditorTree = ({\n  tree,\n  allItems,\n  visibilityMap,\n}: {\n  tree: StoredTreeItem[]\n  allItems: AllItems\n  visibilityMap: VisibilityMap\n}): LocalTreeItem[] => {\n  const itemsWithTitle = tree\n    .filter((item) => item?.value?.reference?._ref)\n    .map((item) => {\n      const refId = item.value?.reference?._ref\n      const docPair = refId ? allItems[refId] : undefined\n      const draftDoc = docPair?.draft\n      const publishedDoc = docPair?.published\n\n      const enhancedItem: LocalTreeItem = {\n        _key: item._key,\n        _type: item._type,\n        value: item.value,\n        parent: item.parent,\n        expanded: visibilityMap[item._key] !== false,\n        draftId: draftDoc?._id,\n        publishedId: publishedDoc?._id,\n        draftUpdatedAt: draftDoc?._updatedAt,\n        publishedUpdatedAt: publishedDoc?._updatedAt,\n      }\n\n      return Object.assign(enhancedItem, {\n        title: (nodeProps: NodeProps) => (\n          <DocumentInNode item={enhancedItem} action={<NodeActions nodeProps={nodeProps} />} />\n        ),\n        children: [],\n      })\n    })\n  return flatDataToTree(itemsWithTitle)\n}\n\nconst documentPairToNode = (doc?: DocumentPair): EnhancedTreeItem | undefined => {\n  if (!doc?.published?._id) {\n    return undefined\n  }\n\n  return {\n    _key: randomKey(12),\n    _type: INTERNAL_NODE_TYPE,\n    draftId: doc.draft?._id,\n    draftUpdatedAt: doc.draft?._updatedAt,\n    publishedId: doc.published._id,\n    publishedUpdatedAt: doc.published?._updatedAt,\n    value: {\n      _type: INTERNAL_NODE_VALUE_TYPE,\n      reference: {\n        _ref: doc.published._id,\n        _type: 'reference',\n        _weak: true,\n      },\n      docType: doc.published._type,\n    },\n  }\n}\n\nexport const getUnaddedItems = (data: {\n  allItems: AllItems\n  tree: StoredTreeItem[]\n}): EnhancedTreeItem[] => {\n  if (!data.tree) {\n    return Object.values(data.allItems).flatMap((documentPair) => {\n      const node = documentPairToNode(documentPair)\n      return node ? [node] : []\n    })\n  }\n\n  return Object.entries(data.allItems)\n    .filter(\n      ([publishedId]) =>\n        publishedId &&\n        // unadded items shouldn't be in the tree\n        !data.tree.some((treeItem) => treeItem?.value?.reference?._ref === publishedId),\n    )\n    .flatMap(([, documentPair]) => {\n      const node = documentPairToNode(documentPair)\n      return node ? [node] : []\n    })\n}\n\nexport function normalizeNodeForStorage(item: LocalTreeItem): StoredTreeItem {\n  return {\n    _key: item._key,\n    _type: item._type || INTERNAL_NODE_TYPE,\n    value: item.value,\n    parent: item.parent,\n  }\n}\n","import {useState} from 'react'\n\nimport type {AllItems, LocalTreeItem, StoredTreeItem, VisibilityMap} from '../types'\nimport {dataToEditorTree} from '../utils/treeData'\n\n/**\n * Enhances tree data with information on:\n *   - `expanded` - native property of react-sortable-tree to determine collapsing & expanding of a node's children\n *   - `draftId` & `publishedId` - refer to LocalTreeItem's type annotations\n *\n * Doesn't modify the main tree or has side-effects on data.\n * Has the added benefit of being local to the user, so external changes won't affect local visibility.\n */\nexport default function useLocalTree({\n  tree,\n  allItems,\n}: {\n  tree: StoredTreeItem[]\n  allItems: AllItems\n}): {\n  handleVisibilityToggle: (data: any) => void\n  localTree: LocalTreeItem[]\n} {\n  const [visibilityMap, setVisibilityMap] = useState<VisibilityMap>({})\n\n  function handleVisibilityToggle(data: any) {\n    setVisibilityMap((currentMap) => ({\n      ...currentMap,\n      [data.node._key]: data.expanded,\n    }))\n  }\n\n  return {\n    localTree: dataToEditorTree({\n      tree,\n      allItems,\n      visibilityMap,\n    }),\n    handleVisibilityToggle,\n  }\n}\n","import type {LocalTreeItem} from '../types'\nimport type {LocalFlatDataItem} from './treePatches'\n\n/**\n * Gets adjescent non-children nodes of a given treeIndex.\n */\nexport default function getAdjescentNodes({\n  flatTree,\n  node,\n  treeIndex,\n}: {\n  flatTree: LocalFlatDataItem[]\n  node: LocalTreeItem\n  treeIndex: number\n}): {\n  leadingNode?: LocalFlatDataItem\n  followingNode?: LocalFlatDataItem\n} {\n  // Disregard children nodes - these include the current node's key in their `path` array.\n  // `path` is typed as number[] but contains the string keys returned by our `getNodeKey`.\n  const isOutsideOfNode = (item: LocalFlatDataItem) => !(item.path as unknown[]).includes(node._key)\n\n  const leadingNode = flatTree.slice(0, treeIndex).reverse().find(isOutsideOfNode)\n\n  const followingNode = flatTree.slice(treeIndex + 1).find(isOutsideOfNode)\n\n  return {\n    leadingNode,\n    followingNode,\n  }\n}\n","export default function moveItemInArray<ItemType = unknown>({\n  array,\n  fromIndex,\n  toIndex,\n}: {\n  array: ItemType[]\n  fromIndex: number\n  toIndex: number\n}): ItemType[] {\n  if (fromIndex === toIndex) {\n    return array\n  }\n\n  const newArray = [...array]\n  const [target] = newArray.splice(fromIndex, 1)\n\n  if (target === undefined) {\n    return array\n  }\n\n  newArray.splice(toIndex, 0, target)\n\n  return newArray\n}\n","import {\n  type FlatDataItem,\n  type TreeItem,\n  getFlatDataFromTree,\n} from '@nosferatu500/react-sortable-tree'\nimport {randomKey} from '@sanity/util/content'\nimport * as Patch from 'sanity'\n\nimport type {LocalTreeItem, NodeProps} from '../types'\nimport getAdjescentNodes from './getAdjescentNodes'\nimport moveItemInArray from './moveItemInArray'\nimport {normalizeNodeForStorage} from './treeData'\n\n/**\n * A {@link FlatDataItem} whose nodes are known to be the plugin's own tree items.\n */\nexport interface LocalFlatDataItem extends Omit<FlatDataItem, 'node' | 'parentNode'> {\n  node: LocalTreeItem\n  parentNode?: LocalTreeItem | null\n}\n\n/**\n * Data received from react-sortable-tree's `onMoveNode` callback.\n * `nextPath` is undefined / null when the node is removed from the tree.\n */\nexport interface HandleMovedNodeData {\n  treeData: TreeItem[]\n  node: LocalTreeItem\n  nextParentNode?: LocalTreeItem | null\n  nextPath?: number[] | null\n  nextTreeIndex: number\n}\n\nexport type HandleMovedNode = (moveData: HandleMovedNodeData) => void\n\nfunction getLocalFlatDataFromTree(treeData: TreeItem[]): LocalFlatDataItem[] {\n  return getFlatDataFromTree({\n    treeData,\n    getNodeKey: (t) => t.node['_key'] as string,\n  }) as LocalFlatDataItem[]\n}\n\nexport function getAddItemPatch(item: LocalTreeItem): unknown[] {\n  const normalizedNode = normalizeNodeForStorage(item)\n\n  return [\n    // Add the node to the end of the tree\n    Patch.insert([normalizedNode], 'after', [-1]),\n  ]\n}\n\nexport function getDuplicateItemPatch(nodeProps: NodeProps): unknown[] {\n  const newItem = {\n    ...nodeProps.node,\n    _key: randomKey(12),\n  }\n  const normalizedNode = normalizeNodeForStorage(newItem)\n\n  return [\n    // Add duplicated node before the existing one\n    Patch.insert([normalizedNode], 'before', [{_key: nodeProps.node._key}]),\n  ]\n}\n\nexport function getRemoveItemPatch({node}: Pick<NodeProps, 'node'>): unknown[] {\n  const keyPath = {_key: node._key}\n  const children = getChildrenPaths(node)\n\n  return [\n    // 1. Unset the removed node\n    Patch.unset([keyPath]),\n\n    // 2. Unset its children\n    ...children.map((path) => Patch.unset([{_key: path}])),\n  ]\n}\n\nexport function getMovedNodePatch(data: HandleMovedNodeData): unknown[] {\n  const {nextParentNode} = data\n  const keyPath = {_key: data.node._key}\n\n  // === REMOVING NODE FROM TREE ===\n  // `nextPath` will be undefined / null if the item is removed from tree\n  if (!Array.isArray(data.nextPath)) {\n    return getRemoveItemPatch({node: data.node})\n  }\n\n  const nextFlatTree = getLocalFlatDataFromTree(data.treeData)\n  const normalizedNode = normalizeNodeForStorage(data.node)\n\n  const {leadingNode, followingNode} = getAdjescentNodes({\n    flatTree: nextFlatTree,\n    node: data.node,\n    treeIndex: data.nextTreeIndex,\n  })\n\n  return [\n    // 1. Unset the moved node\n    // (will be ignored by Content Lake on new nodes with _key not yet in tree)\n    Patch.unset([keyPath]),\n\n    // 2. SIBLING-BASED PLACEMENT\n    // If we were to place solely based on nextTreeIndex, concurrent changes from other editors could put the new node in an unexpected position.\n    // Let's instead anchor it to the _key of the sibling coming before or after it.\n    leadingNode?.node?._key\n      ? // After the sibling before it\n        Patch.insert([normalizedNode], 'after', [{_key: leadingNode.node._key}])\n      : // Or before the sibling right after it, in case there's no leading sibling node\n        // prettier-ignore\n        Patch.insert([normalizedNode], 'before', [followingNode?.node?._key ? {_key: followingNode.node._key} : data.nextTreeIndex]),\n\n    // 3. Patch the new node with its new `parent`\n    nextParentNode\n      ? // If it has a parent node, set that parent's _key\n        Patch.set(nextParentNode._key, [keyPath, 'parent'])\n      : // Else remove the parent key entirely\n        Patch.unset([keyPath, 'parent']),\n  ]\n}\n\nfunction getChildrenPaths(node: LocalTreeItem): string[] {\n  if (!Array.isArray(node.children)) {\n    return []\n  }\n\n  const keyPaths: string[] = []\n  for (const child of node.children) {\n    const childKey: unknown = child['_key']\n    if (typeof childKey === 'string' && childKey) {\n      keyPaths.push(childKey)\n    }\n    keyPaths.push(...getChildrenPaths(child as LocalTreeItem))\n  }\n  return keyPaths\n}\n\nexport function getMoveItemPatch({\n  nodeProps: {node, treeIndex},\n  localTree,\n  direction,\n}: {\n  nodeProps: NodeProps\n  localTree: LocalTreeItem[]\n  direction: 'up' | 'down'\n}): unknown[] {\n  const keyPath = {_key: node._key}\n\n  const nextTreeIndex = treeIndex + (direction === 'up' ? -1 : 1)\n\n  const flatTree = getLocalFlatDataFromTree(localTree)\n  const nextFlatTree = moveItemInArray<LocalFlatDataItem>({\n    array: flatTree,\n    fromIndex: treeIndex,\n    toIndex: nextTreeIndex,\n  })\n  const {leadingNode, followingNode} = getAdjescentNodes({\n    flatTree: nextFlatTree,\n    node,\n    treeIndex: nextTreeIndex,\n  })\n\n  const normalizedNode = normalizeNodeForStorage(node)\n\n  // When moving up, look at following node to figure out what is the next parent.\n  const nodeToInheritParent = direction === 'up' ? followingNode : leadingNode\n  const nextParentNode = nodeToInheritParent?.parentNode\n\n  return [\n    // 1. Unset the moved node\n    // (will be ignored by Content Lake on new nodes with _key not yet in tree)\n    Patch.unset([keyPath]),\n\n    // 2. SIBLING-BASED PLACEMENT\n    leadingNode?.node?._key\n      ? // After the sibling before it\n        Patch.insert([normalizedNode], 'after', [{_key: leadingNode.node._key}])\n      : // Or before the sibling right after it, in case there's no leading sibling node\n        Patch.insert([normalizedNode], 'before', [\n          followingNode?.node?._key ? {_key: followingNode.node._key} : nextTreeIndex,\n        ]),\n\n    // 3. Patch the new node with its new `parent`\n    nextParentNode\n      ? // If it has a parent node, set that parent's _key\n        Patch.set(nextParentNode._key, [keyPath, 'parent'])\n      : // Else remove the parent key entirely\n        Patch.unset([keyPath, 'parent']),\n  ]\n}\n","import {PatchEvent, type PathSegment, prefixPath, setIfMissing} from 'sanity'\n\nimport type {LocalTreeItem, NodeProps} from '../types'\nimport {\n  type HandleMovedNode,\n  type HandleMovedNodeData,\n  getAddItemPatch,\n  getDuplicateItemPatch,\n  getMoveItemPatch,\n  getMovedNodePatch,\n  getRemoveItemPatch,\n} from '../utils/treePatches'\n\nexport default function useTreeOperationsProvider(props: {\n  patchPrefix?: PathSegment\n  onChange: (patch: PatchEvent) => void\n  localTree: LocalTreeItem[]\n}): {\n  handleMovedNode: HandleMovedNode\n  addItem: (item: LocalTreeItem) => void\n  duplicateItem: (nodeProps: NodeProps) => void\n  removeItem: (nodeProps: NodeProps) => void\n  moveItemUp: (nodeProps: NodeProps) => void\n  moveItemDown: (nodeProps: NodeProps) => void\n} {\n  const {localTree} = props\n\n  function runPatches(patches: any) {\n    const finalPatches = [\n      // Ensure tree array exists before any operation\n      setIfMissing([]),\n      ...(patches || []),\n    ]\n    const prefix: PathSegment | undefined = props.patchPrefix\n    let patchEvent = PatchEvent.from(finalPatches)\n    if (prefix) {\n      patchEvent = PatchEvent.from(finalPatches.map((patch) => prefixPath(patch, prefix)))\n    }\n    props.onChange(patchEvent)\n  }\n\n  function handleMovedNode(data: HandleMovedNodeData) {\n    runPatches(getMovedNodePatch(data))\n  }\n\n  function addItem(item: LocalTreeItem) {\n    runPatches(getAddItemPatch(item))\n  }\n\n  function duplicateItem(nodeProps: NodeProps) {\n    runPatches(getDuplicateItemPatch(nodeProps))\n  }\n\n  function removeItem(nodeProps: NodeProps) {\n    runPatches(getRemoveItemPatch(nodeProps))\n  }\n\n  function moveItemUp(nodeProps: NodeProps) {\n    runPatches(\n      getMoveItemPatch({\n        nodeProps,\n        localTree,\n        direction: 'up',\n      }),\n    )\n  }\n\n  function moveItemDown(nodeProps: NodeProps) {\n    runPatches(\n      getMoveItemPatch({\n        nodeProps,\n        localTree,\n        direction: 'down',\n      }),\n    )\n  }\n\n  return {\n    handleMovedNode,\n    addItem,\n    removeItem,\n    moveItemUp,\n    moveItemDown,\n    duplicateItem,\n  }\n}\n","import {isDescendant} from '@nosferatu500/react-sortable-tree'\nimport {cyan, gray, red} from '@sanity/color'\nimport {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {DragHandleIcon} from '@sanity/icons/DragHandle'\nimport {Box, Button, Flex, Spinner} from '@sanity/ui'\nimport {useMemo} from 'react'\nimport {styled} from 'styled-components'\n\nconst Root = styled.div`\n  // Adapted from react-sortable-tree/style.css\n  &[data-landing='true'] > *,\n  &[data-cancel='true'] > * {\n    opacity: 0 !important;\n  }\n  &[data-landing='true']::before,\n  &[data-cancel='true']::before {\n    background-color: ${cyan[50].hex};\n    border: 2px dashed ${gray[400].hex};\n    border-radius: 3px;\n    content: '';\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: -1;\n  }\n\n  &[data-cancel='true']::before {\n    background-color: ${red[50].hex};\n  }\n`\n\n/**\n * Customization of react-sortable-tree's default node.\n * Created in order to use Sanity UI for styles.\n * Reference: https://github.com/frontend-collective/react-sortable-tree/blob/master/src/node-renderer-default.js\n */\nconst NodeContentRenderer: any = (props: any) => {\n  const {\n    node,\n    path,\n    treeIndex,\n    canDrag = false,\n    canDrop,\n    connectDragSource,\n    connectDragPreview,\n    toggleChildrenVisibility,\n    draggedNode,\n    didDrop,\n    isDragging,\n  } = props\n  const nodeTitle = node.title\n  const Handle = useMemo(() => {\n    if (!canDrag) {\n      return null\n    }\n    if (typeof node.children === 'function' && node.expanded) {\n      // Show a loading symbol on the handle when the children are expanded\n      //  and yet still defined by a function (a callback to fetch the children)\n      return <Spinner />\n    }\n\n    const button = (\n      <Button\n        mode=\"bleed\"\n        paddingX={0}\n        paddingY={1}\n        style={{\n          cursor: node.publishedId ? 'grab' : 'default',\n          fontSize: '1.5625rem',\n        }}\n        data-ui=\"DragHandleButton\"\n        data-drag-handle={canDrag}\n        disabled={!node.publishedId}\n      >\n        <DragHandleIcon style={{marginBottom: '-0.1em'}} />\n      </Button>\n    )\n\n    // Don't allow editors to drag invalid documents\n    if (!node.publishedId) {\n      return <div>{button}</div>\n    }\n\n    // Show the handle used to initiate a drag-and-drop\n    return <div ref={connectDragSource}>{button}</div>\n  }, [canDrag, node, connectDragSource])\n\n  const isDraggedDescendant = draggedNode && isDescendant(draggedNode, node)\n  const isLandingPadActive = !didDrop && isDragging\n\n  return (\n    <Box style={{position: 'relative'}}>\n      {toggleChildrenVisibility &&\n        node.children &&\n        (node.children.length > 0 || typeof node.children === 'function') && (\n          <div\n            style={{\n              position: 'absolute',\n              left: '-2px',\n              top: '40%',\n              transform: 'translate(-100%, -50%)',\n            }}\n          >\n            <Button\n              aria-label={node.expanded ? 'Collapse' : 'Expand'}\n              icon={\n                node.expanded ? (\n                  <ChevronDownIcon color={gray[200].hex} />\n                ) : (\n                  <ChevronRightIcon color={gray[200].hex} />\n                )\n              }\n              mode=\"bleed\"\n              fontSize={2}\n              padding={1}\n              type=\"button\"\n              onClick={() =>\n                toggleChildrenVisibility?.({\n                  node,\n                  path,\n                  treeIndex,\n                })\n              }\n            />\n          </div>\n        )}\n\n      <div ref={connectDragPreview}>\n        <Root\n          data-landing={isLandingPadActive}\n          data-cancel={isLandingPadActive && !canDrop}\n          style={{\n            opacity: isDraggedDescendant ? 0.5 : 1,\n          }}\n        >\n          <Flex align=\"center\">\n            {Handle}\n            {typeof nodeTitle === 'function' ? nodeTitle({node, path, treeIndex}) : nodeTitle}\n          </Flex>\n        </Root>\n      </div>\n    </Box>\n  )\n}\n\nexport default NodeContentRenderer\n","import {Box, Card, type CardTone, Stack, Text} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ninterface PlaceholderDropzoneProps {\n  title: string\n  subtitle?: string\n  isOver?: boolean\n  canDrop?: boolean\n  children?: ReactNode\n}\n\nconst PlaceholderDropzone = (props: PlaceholderDropzoneProps) => {\n  const isValid = props.isOver && props.canDrop\n  const isInvalid = props.isOver && !props.canDrop\n  let tone: CardTone = 'transparent'\n  if (isValid) {\n    tone = 'positive'\n  }\n  if (isInvalid) {\n    tone = 'caution'\n  }\n  return (\n    <Box padding={3}>\n      <Card\n        padding={5}\n        radius={2}\n        border\n        tone={tone}\n        style={{\n          borderStyle: props.isOver ? undefined : 'dashed',\n        }}\n      >\n        <Stack gap={2} style={{textAlign: 'center'}}>\n          <Text size={2} as=\"h2\" muted>\n            {!props.isOver && props.title}\n            {isValid && 'Drop here'}\n            {isInvalid && 'Invalid location or element'}\n          </Text>\n          {props.subtitle && <Text size={1}>{props.subtitle}</Text>}\n          {props.children}\n        </Stack>\n      </Card>\n    </Box>\n  )\n}\n\nexport default PlaceholderDropzone\n","import {blue} from '@sanity/color'\nimport type {ReactNode} from 'react'\nimport {createGlobalStyle} from 'styled-components'\n\n// Adapted from react-sortable-tree/src/tree-node.js\nconst ScaffoldStyles = createGlobalStyle`\n  .rst__lineBlock,\n  .rst__absoluteLineBlock {\n    height: 100%;\n    position: relative;\n    display: inline-block;\n    --stroke-width: 3px;\n  }\n\n  .rst__absoluteLineBlock {\n    position: absolute;\n    top: 0;\n  }\n\n  /* Highlight line for pointing to dragged row destination\n   ========================================================================== */\n  /**\n * +--+--+\n * |  |  |\n * |  |  |\n * |  |  |\n * +--+--+\n */\n  .rst__highlightLineVertical {\n    z-index: 3;\n  }\n  .rst__highlightLineVertical::before {\n    position: absolute;\n    content: '';\n    background-color: ${blue[400].hex};\n    width: calc(var(--stroke-width) * 2);\n    margin-left: calc(var(--stroke-width) * -1);\n    left: 50%;\n    top: 0;\n    height: 100%;\n  }\n\n  @keyframes arrow-pulse {\n    0% {\n      transform: translate(0, 0);\n      opacity: 0;\n    }\n    30% {\n      transform: translate(0, 300%);\n      opacity: 1;\n    }\n    70% {\n      transform: translate(0, 700%);\n      opacity: 1;\n    }\n    100% {\n      transform: translate(0, 1000%);\n      opacity: 0;\n    }\n  }\n  .rst__highlightLineVertical::after {\n    content: '';\n    position: absolute;\n    height: 0;\n    margin-left: calc(var(--stroke-width) * -1);\n    left: 50%;\n    top: 0;\n    border-left: var(--stroke-width) solid transparent;\n    border-right: var(--stroke-width) solid transparent;\n    border-top: var(--stroke-width) solid white;\n    animation: arrow-pulse 1s infinite linear both;\n  }\n\n  /**\n * +-----+\n * |     |\n * |  +--+\n * |  |  |\n * +--+--+\n */\n  .rst__highlightTopLeftCorner::before {\n    z-index: 3;\n    content: '';\n    position: absolute;\n    border-top: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    border-left: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    box-sizing: border-box;\n    height: calc(50% + var(--stroke-width));\n    top: 50%;\n    margin-top: calc(var(--stroke-width) * -1);\n    right: 0;\n    width: calc(50% + var(--stroke-width));\n  }\n\n  /**\n * +--+--+\n * |  |  |\n * |  |  |\n * |  +->|\n * +-----+\n */\n  .rst__highlightBottomLeftCorner {\n    z-index: 3;\n  }\n  .rst__highlightBottomLeftCorner::before {\n    content: '';\n    position: absolute;\n    border-bottom: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    border-left: solid calc(var(--stroke-width) * 2) ${blue[400].hex};\n    box-sizing: border-box;\n    height: calc(100% + var(--stroke-width));\n    top: 0;\n    right: calc(var(--stroke-width) * 3);\n    width: calc(50% - calc(var(--stroke-width) * 2));\n  }\n\n  .rst__highlightBottomLeftCorner::after {\n    content: '';\n    position: absolute;\n    height: 0;\n    right: 0;\n    top: 100%;\n    margin-top: calc(var(--stroke-width) * -3);\n    border-top: calc(var(--stroke-width) * 3) solid transparent;\n    border-bottom: calc(var(--stroke-width) * 3) solid transparent;\n    border-left: calc(var(--stroke-width) * 3) solid ${blue[400].hex};\n  }\n\n  .rst__unclickable {\n    pointer-events: none;\n    margin-top: -calc(var(--stroke-width) * 3);\n  }\n`\n\nconst TreeNodeRendererScaffold = (props: any) => {\n  const {\n    lowerSiblingCounts,\n    scaffoldBlockPxWidth,\n    listIndex,\n    swapDepth,\n    swapFrom,\n    swapLength,\n    treeIndex,\n  } = props\n\n  // Construct the scaffold representing the structure of the tree\n  const scaffold: ReactNode[] = lowerSiblingCounts.map((lowerSiblingCount: number, i: number) => {\n    if (lowerSiblingCount < 0 || treeIndex === listIndex || i !== swapDepth) {\n      return null\n    }\n\n    // This row has been shifted, and is at the depth of\n    // the line pointing to the new destination\n    let highlightLineClass = ''\n\n    if (listIndex === (swapFrom || 0) + (swapLength || 0) - 1) {\n      // This block is on the bottom (target) line\n      // This block points at the target block (where the row will go when released)\n      highlightLineClass = 'rst__highlightBottomLeftCorner'\n    } else if (treeIndex === swapFrom) {\n      // This block is on the top (source) line\n      highlightLineClass = 'rst__highlightTopLeftCorner'\n    } else {\n      // This block is between the bottom and top\n      highlightLineClass = 'rst__highlightLineVertical'\n    }\n\n    const style = {\n      width: scaffoldBlockPxWidth,\n      left: scaffoldBlockPxWidth * i,\n    }\n\n    return (\n      <div\n        key={i}\n        style={style}\n        className={`rst__unclickable rst__absoluteLineBlock ${highlightLineClass || ''}`}\n        tabIndex={-1}\n      />\n    )\n  })\n\n  return (\n    <>\n      {scaffold}\n      <ScaffoldStyles />\n    </>\n  )\n}\n\nexport default TreeNodeRendererScaffold\n","import {Children, type ReactElement, cloneElement} from 'react'\n\nimport TreeNodeRendererScaffold from './TreeNodeRendererScaffold'\n\n/**\n * To prevent expand buttons from overflowing on the left, we add a minimum left padding to all entries\n */\nconst BASE_LEFT_PADDING = 10\nconst NESTING_PADDING = 14\n\nconst TreeNodeRenderer: any = (props: any) => {\n  const {children, lowerSiblingCounts, connectDropTarget, isOver, draggedNode, canDrop} = props\n\n  // Construct the scaffold representing the structure of the tree\n  const scaffoldBlockCount = lowerSiblingCounts.length\n\n  return (\n    <div ref={connectDropTarget} style={props.style} data-tree-row=\"\">\n      <div\n        style={{\n          // prettier-ignore\n          paddingLeft: `${BASE_LEFT_PADDING + (NESTING_PADDING * scaffoldBlockCount)}px`,\n        }}\n      >\n        {Children.map(children, (child) =>\n          cloneElement(child as ReactElement<any>, {\n            isOver,\n            canDrop,\n            draggedNode,\n          }),\n        )}\n      </div>\n      <TreeNodeRendererScaffold {...props} />\n    </div>\n  )\n}\n\nexport default TreeNodeRenderer\n","import type {SortableTree} from '@nosferatu500/react-sortable-tree'\nimport type {ComponentProps} from 'react'\n\nimport NodeContentRenderer from '../components/NodeContentRenderer'\nimport PlaceholderDropzone from '../components/PlaceholderDropzone'\nimport TreeNodeRenderer from '../components/TreeNodeRenderer'\n\ntype ReactSortableTreeProps = ComponentProps<typeof SortableTree>\n\nexport default function getCommonTreeProps({\n  placeholder,\n}: {\n  placeholder: {\n    title: string\n    subtitle?: string\n  }\n}): Partial<ReactSortableTreeProps> {\n  return {\n    theme: {\n      nodeContentRenderer: NodeContentRenderer,\n      placeholderRenderer: (props: any) => <PlaceholderDropzone {...placeholder} {...props} />,\n      treeNodeRenderer: TreeNodeRenderer,\n      style: {height: '100%'},\n      innerStyle: undefined,\n      scaffoldBlockPxWidth: 44,\n      slideRegionSize: 100,\n    },\n  }\n}\n","import {type TreeItem, getVisibleNodeCount} from '@nosferatu500/react-sortable-tree'\n\nexport default function getTreeHeight(treeData: TreeItem[], rowHeight: number): string {\n  const visibleNodeCount = getVisibleNodeCount({treeData})\n\n  // prettier-ignore\n  return `${50 + (rowHeight * visibleNodeCount)}px`\n}\n","/**\n * react-sortable-tree emits a lot of random errors when dragging to invalid states,\n * even when drag-targets are disabled.\n *\n * This boundary is a workaround so users are not pestered with error-toasts for things\n * that have no functional impact.\n *\n * This boundry does NOT handle errors that happen in the React dnd\n * event handlers, so there is addtional workarounds in the\n * DnDManager.\n *  */\nexport const TreeEditorErrorBoundary = (props: any) => {\n  return props.children\n}\n","import {\n  SortableTreeWithoutDndContext as SortableTree,\n  type TreeItem,\n} from '@nosferatu500/react-sortable-tree'\nimport {AddCircleIcon} from '@sanity/icons/AddCircle'\nimport {Box, Button, Card, Flex, Spinner, Stack, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useCallback, useEffect, useMemo, useState} from 'react'\nimport {DndProvider} from 'react-dnd'\nimport {HTML5Backend} from 'react-dnd-html5-backend'\nimport type {PatchEvent} from 'sanity'\n\nimport useAllItems from '../hooks/useAllItems'\nimport useLocalTree from '../hooks/useLocalTree'\nimport {TreeOperationsContext} from '../hooks/useTreeOperations'\nimport useTreeOperationsProvider from '../hooks/useTreeOperationsProvider'\nimport type {Optional, StoredTreeItem, TreeDeskStructureProps} from '../types'\nimport getCommonTreeProps from '../utils/getCommonTreeProps'\nimport getTreeHeight from '../utils/getTreeHeight'\nimport {getUnaddedItems} from '../utils/treeData'\nimport type {HandleMovedNodeData} from '../utils/treePatches'\nimport DocumentInNode from './DocumentInNode'\nimport {TreeEditorErrorBoundary} from './TreeEditorErrorBoundary'\n\ninterface TreeEditorProps {\n  tree: StoredTreeItem[]\n  onChange: (patch: PatchEvent) => void\n  options: Optional<TreeDeskStructureProps, 'documentId'>\n  patchPrefix?: string\n}\n\n/**\n * The loaded tree users interact with\n */\nfunction TreeEditor(props: TreeEditorProps) {\n  const {status: allItemsStatus, allItems} = useAllItems(props.options)\n  const unAddedItems = getUnaddedItems({tree: props.tree, allItems})\n\n  const {localTree, handleVisibilityToggle} = useLocalTree({\n    tree: props.tree,\n    allItems,\n  })\n\n  const operations = useTreeOperationsProvider({\n    patchPrefix: props.patchPrefix,\n    onChange: props.onChange,\n    localTree,\n  })\n\n  const [context, setContext] = useState<HTMLElement | null>(null)\n  const [treeViewHeight, setTreeViewHeight] = useState<string>('')\n\n  const documentId = props.options.documentId\n\n  const updateTreeViewHeight = useCallback(() => {\n    const el = document.querySelector<HTMLElement>(`#${documentId} [data-tree-row]`)\n    const rowHeight = el?.offsetHeight || 51\n    setTreeViewHeight(getTreeHeight(localTree, rowHeight))\n  }, [documentId, localTree])\n\n  useEffect(() => {\n    // Wait for dom to load before (re)calculating the tree height.\n    const timeout = setTimeout(updateTreeViewHeight)\n    return () => clearTimeout(timeout)\n  }, [updateTreeViewHeight])\n\n  const onMoveNode = useCallback(\n    // The tree nodes are always our own LocalTreeItem objects\n    (data: unknown) => operations.handleMovedNode(data as HandleMovedNodeData),\n    [operations],\n  )\n\n  const treeProps = useMemo(\n    () =>\n      getCommonTreeProps({\n        placeholder: {\n          title: 'Add items from the list below',\n        },\n      }),\n    [],\n  )\n\n  const operationContext = useMemo(\n    () => ({...operations, allItemsStatus}),\n    [operations, allItemsStatus],\n  )\n\n  return (\n    <TreeEditorErrorBoundary>\n      {/*Use this Box-wrapper to get a context Element to prevent DndProvider to have to HTML% backend at the same time https://github.com/react-dnd/react-dnd/issues/186#issuecomment-978206387 */}\n      <Box id={documentId} ref={setContext}>\n        {context ? (\n          <DndProvider backend={HTML5Backend} options={{rootElement: context}}>\n            <TreeOperationsContext.Provider value={operationContext}>\n              <Stack gap={4} paddingTop={4}>\n                <Card\n                  style={{minHeight: treeViewHeight}}\n                  // Only include borderBottom if there's something to show in unadded items\n                  borderBottom={allItemsStatus !== 'success' || unAddedItems?.length > 0}\n                >\n                  <SortableTree\n                    maxDepth={props.options.maxDepth}\n                    onChange={doNothingOnChange}\n                    onVisibilityToggle={handleVisibilityToggle}\n                    canDrop={canDrop}\n                    onMoveNode={onMoveNode}\n                    // Stable keys keep row identity (and their DOM nodes) intact while\n                    // rows are repositioned during a drag\n                    getNodeKey={getNodeKey}\n                    treeData={localTree}\n                    // The tree renders inside a virtualized list which requires\n                    // a definite height (percentages would resolve to 0)\n                    style={treeViewHeight ? {height: treeViewHeight} : undefined}\n                    {...treeProps}\n                  />\n                </Card>\n\n                {allItemsStatus === 'success' && unAddedItems?.length > 0 && (\n                  <Stack gap={1} paddingX={2} paddingTop={3}>\n                    <Stack gap={2} paddingX={2} paddingBottom={3}>\n                      <Text size={2} as=\"h2\" weight=\"semibold\">\n                        Add more items\n                      </Text>\n                      <Text size={1} muted>\n                        Only published documents are shown.\n                      </Text>\n                    </Stack>\n                    {unAddedItems.map((item) => (\n                      <DocumentInNode\n                        key={item.publishedId || item.draftId}\n                        item={item}\n                        action={\n                          <Tooltip\n                            portal\n                            placement=\"left\"\n                            content={\n                              <Box padding={2}>\n                                <Text size={1}>Add to list</Text>\n                              </Box>\n                            }\n                          >\n                            <Button\n                              onClick={() => {\n                                operations.addItem(item)\n                              }}\n                              mode=\"bleed\"\n                              icon={AddCircleIcon}\n                              style={{cursor: 'pointer'}}\n                            />\n                          </Tooltip>\n                        }\n                      />\n                    ))}\n                  </Stack>\n                )}\n                {allItemsStatus === 'loading' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Spinner size={3} muted />\n                  </Flex>\n                )}\n                {allItemsStatus === 'error' && (\n                  <Flex padding={4} align={'center'} justify={'center'}>\n                    <Text size={2} weight=\"semibold\">\n                      Something went wrong when loading documents\n                    </Text>\n                  </Flex>\n                )}\n              </Stack>\n            </TreeOperationsContext.Provider>\n          </DndProvider>\n        ) : null}\n      </Box>\n    </TreeEditorErrorBoundary>\n  )\n}\n\nfunction canDrop({nextPath, prevPath}: {nextPath: number[]; prevPath: number[]}) {\n  const insideItself =\n    nextPath.length >= prevPath.length &&\n    prevPath.every((pathIndex, index) => nextPath[index] === pathIndex)\n  return !insideItself\n}\n\nconst doNothingOnChange = () => {\n  // Do nothing. onMoveNode will do all the work\n}\n\nconst getNodeKey = (data: {node: TreeItem}) => data.node['_key'] as string\n\nexport default TreeEditor\n","// Adapted from @sanity/form-builder/src/sanity/utils/gradientPatchAdapter.ts\nimport {arrayToJSONMatchPath} from '@sanity/mutator'\n\ninterface Patch {\n  type?: string\n  path?: any[]\n  position?: string\n  items?: unknown[]\n  value?: unknown\n}\n\ntype GradientPatch = Record<string, any>\n\nexport function toGradient(patches: Patch[]): GradientPatch[] {\n  return patches.map(toGradientPatch)\n}\n\nfunction toGradientPatch(patch: Patch): GradientPatch {\n  const matchPath = arrayToJSONMatchPath(patch.path || [])\n  if (patch.type === 'insert') {\n    const {position, items} = patch\n    return {\n      insert: {\n        [position as string]: matchPath,\n        items: items,\n      },\n    }\n  }\n\n  if (patch.type === 'unset') {\n    return {\n      unset: [matchPath],\n    }\n  }\n\n  if (!patch.type) {\n    throw new Error(`Missing patch type in patch ${JSON.stringify(patch)}`)\n  }\n  if (matchPath) {\n    return {\n      [patch.type]: {\n        [matchPath]: patch.value,\n      },\n    }\n  }\n  return {\n    [patch.type]: patch.value,\n  }\n}\n","import {Box, Flex, Spinner} from '@sanity/ui'\nimport {useCallback, useEffect} from 'react'\nimport {type PatchEvent, useDocumentOperation, useEditState} from 'sanity'\n\nimport DeskWarning from './components/DeskWarning'\nimport TreeEditor from './components/TreeEditor'\nimport type {DocumentOperations, StoredTreeItem, TreeDeskStructureProps} from './types'\nimport {toGradient} from './utils/gradientPatchAdapter'\nimport injectNodeTypeInPatches, {DEFAULT_DOC_TYPE} from './utils/injectNodeTypeInPatches'\n\ninterface ComponentProps {\n  options: TreeDeskStructureProps\n}\n\nexport const DEFAULT_FIELD_KEY = 'tree'\n\nconst TreeDeskStructure = (props: ComponentProps) => {\n  const treeDocType = props.options.documentType || DEFAULT_DOC_TYPE\n  const treeFieldKey = props.options.fieldKeyInDocument || DEFAULT_FIELD_KEY\n  const {published, draft, liveEdit} = useEditState(props.options.documentId, treeDocType)\n  const {patch} = useDocumentOperation(props.options.documentId, treeDocType) as DocumentOperations\n\n  const treeValue = (published?.[treeFieldKey] || []) as StoredTreeItem[]\n\n  const handleChange = useCallback(\n    (patchEvent: PatchEvent) => {\n      if (!patch?.execute) {\n        return\n      }\n      patch.execute(toGradient(injectNodeTypeInPatches(patchEvent.patches, treeDocType)))\n    },\n    [patch, treeDocType],\n  )\n\n  const publishedId = published?._id\n\n  useEffect(() => {\n    if (!publishedId && patch?.execute && !patch?.disabled) {\n      // If no published document, create it\n      patch.execute([{setIfMissing: {[treeFieldKey]: []}}])\n    }\n  }, [publishedId, patch, treeFieldKey])\n\n  if (!liveEdit) {\n    return (\n      <DeskWarning\n        title=\"Invalid configuration\"\n        subtitle=\"The `documentType` passed to `createStructureHierarchy` isn't live editable.\\nTo continue using this plugin, add `liveEdit: true` to your custom schema type or unset `documentType` in your hierarchy configuration.\"\n      />\n    )\n  }\n\n  if (draft?._id) {\n    return (\n      <DeskWarning\n        title=\"This hierarchy tree contains a draft\"\n        subtitle=\"Click on the button below to publish your draft in order to continue editing the live published document.\"\n      />\n    )\n  }\n\n  if (!published?._id) {\n    return (\n      <Flex padding={5} align={'center'} justify={'center'} height={'fill'}>\n        <Spinner width={4} muted />\n      </Flex>\n    )\n  }\n\n  return (\n    <Box paddingBottom={5} paddingRight={2}>\n      <TreeEditor\n        options={props.options}\n        tree={treeValue}\n        onChange={handleChange}\n        patchPrefix={treeFieldKey}\n      />\n    </Box>\n  )\n}\n\nexport default TreeDeskStructure\n","import {useCallback} from 'react'\nimport {FormField, type FormNodePresence, PatchEvent, type Path} from 'sanity'\n\nimport TreeEditor from './components/TreeEditor'\nimport type {StoredTreeItem, TreeFieldSchema} from './types'\nimport injectNodeTypeInPatches, {DEFAULT_DOC_TYPE} from './utils/injectNodeTypeInPatches'\n\nexport interface TreeInputComponentProps {\n  type: TreeFieldSchema\n  value: StoredTreeItem[]\n  level: number\n  onChange: (event: unknown) => void\n  onFocus: (path: Path) => void\n  onBlur: () => void\n  focusPath: Path\n  readOnly: boolean\n  presence: FormNodePresence[]\n}\n\nconst EMPTY_PATH: Path = []\n\nconst TreeInputComponent = (props: TreeInputComponentProps) => {\n  const documentType = props.type.options.documentType || DEFAULT_DOC_TYPE\n  const {onChange: onFieldChange} = props\n\n  const onChange = useCallback(\n    (patch: any) => {\n      const patches = injectNodeTypeInPatches(patch?.patches, documentType)\n      onFieldChange(new PatchEvent(patches))\n    },\n    [documentType, onFieldChange],\n  )\n\n  return (\n    <FormField\n      description={props.type.description} // Creates description from schema\n      title={props.type.title} // Creates label from schema title\n      __unstable_presence={props.presence} // Handles presence avatars\n      path={EMPTY_PATH}\n    >\n      <TreeEditor options={props.type.options} tree={props.value || []} onChange={onChange} />\n    </FormField>\n  )\n}\n\nexport default TreeInputComponent\n","const ERROR_MESSAGES = {\n  invalidDocumentId: 'Please add a documentId to your tree',\n  invalidDocumentType: 'Please add a valid documentType to createHierarchicalSchemas',\n  invalidReferenceTo: \"Missing valid 'referenceTo' value\",\n}\n\nexport default function throwError(message: keyof typeof ERROR_MESSAGES, extraContext = ''): void {\n  throw new Error(`[hierarchical input] ${ERROR_MESSAGES[message]} ${extraContext}`)\n}\n","import type {FC} from 'react'\nimport type {ArraySchemaType} from 'sanity'\n\nimport {DEFAULT_FIELD_KEY} from './TreeDeskStructure'\nimport TreeInputComponent from './TreeInputComponent'\nimport type {TreeDeskStructureProps, TreeFieldSchema} from './types'\nimport {\n  INTERNAL_NODE_ARRAY_TYPE,\n  INTERNAL_NODE_TYPE,\n  INTERNAL_NODE_VALUE_TYPE,\n  getSchemaTypeName,\n} from './utils/injectNodeTypeInPatches'\nimport throwError from './utils/throwError'\n\ntype SchemaOptions = Omit<TreeDeskStructureProps, 'documentId' | 'maxDepth'>\n\nfunction createHierarchicalNodeValueType({\n  referenceTo,\n  referenceOptions,\n  documentType,\n}: SchemaOptions) {\n  return {\n    // when used inside the field, name & type are overwritten by createHierarchicalNodeType\n    name: documentType ? getSchemaTypeName(documentType, 'nodeValue') : INTERNAL_NODE_VALUE_TYPE,\n    type: 'object',\n    title: `Hierarchical node value (${documentType})`,\n\n    fields: [\n      {name: 'docType', type: 'string'},\n      {\n        name: 'reference',\n        type: 'reference',\n        weak: true,\n        to: referenceTo.map((type) => ({type})),\n        options: referenceOptions,\n      },\n    ],\n  }\n}\n\nfunction createHierarchicalNodeType(options: SchemaOptions) {\n  return {\n    // name & type are overwritten by createHierarchicalField\n    name: options.documentType\n      ? getSchemaTypeName(options.documentType, 'node')\n      : INTERNAL_NODE_TYPE,\n    title: `Hierarchical node (${options.documentType})`,\n    type: 'object',\n    fields: [\n      {name: 'parent', type: 'string'},\n\n      options.documentType\n        ? {name: 'value', type: getSchemaTypeName(options.documentType, 'nodeValue')}\n        : // If no documentType is defined, use an anonymized inline object to avoid\n          // having to define another custom schema type through the plugin\n          {\n            ...createHierarchicalNodeValueType(options),\n            name: 'value',\n            type: 'object',\n          },\n    ],\n  }\n}\n\nfunction createHierarchicalArrayType(options: SchemaOptions) {\n  return {\n    // name & type are overwritten by createHierarchicalField\n    name: options.documentType\n      ? getSchemaTypeName(options.documentType, 'array')\n      : INTERNAL_NODE_ARRAY_TYPE,\n    title: `Hierarchical array of nodes (${options.documentType})`,\n    type: 'array',\n    of: [\n      options.documentType\n        ? {type: getSchemaTypeName(options.documentType, 'node')}\n        : createHierarchicalNodeType(options),\n    ],\n  }\n}\n\nfunction createHierarchicalField({name, title, options, ...rest}: TreeFieldSchema): Omit<\n  ArraySchemaType,\n  'type' | 'jsonType' | 'of'\n> & {\n  type: string\n  inputComponent: FC<any>\n  of?: any[]\n} {\n  if (!Array.isArray(options?.referenceTo)) {\n    throwError('invalidReferenceTo', `(field of name \"${name}\")`)\n  }\n\n  return {\n    ...rest,\n    name,\n    title,\n    inputComponent: TreeInputComponent,\n    options,\n    ...(options.documentType\n      ? {type: getSchemaTypeName(options.documentType, 'array')}\n      : {\n          ...createHierarchicalArrayType(options),\n          name,\n        }),\n  }\n}\n\nfunction createHierarchicalDocType(options: SchemaOptions) {\n  return {\n    name: options.documentType,\n    title: 'Hierarchical tree',\n    type: 'document',\n    // The plugin needs to define a `schemaType` with liveEdit enabled so that\n    // `useDocumentOperation` in TreeDeskStructure.tsx doesn't create drafts at every patch.\n    liveEdit: true,\n    fields: [\n      createHierarchicalField({\n        name: options.fieldKeyInDocument || DEFAULT_FIELD_KEY,\n        title: 'Hierarchical Tree',\n        options,\n      }),\n    ],\n    preview: {\n      select: {\n        id: '_id',\n        tree: 'tree',\n      },\n      prepare({id, tree}: {id: string; tree: unknown[]}): Record<string, string> {\n        return {\n          title: `Hierarchical documents (ID: ${id})`,\n          subtitle: `${tree?.length || 0} document(s) in its list.`,\n        }\n      },\n    },\n  }\n}\n\nexport default function createHierarchicalSchemas(options: SchemaOptions) {\n  if (!Array.isArray(options.referenceTo) || options.referenceTo.length <= 0) {\n    throwError('invalidReferenceTo')\n  }\n  if (!options.documentType) {\n    throwError('invalidDocumentType')\n  }\n\n  return [\n    createHierarchicalDocType(options),\n    createHierarchicalArrayType(options),\n    createHierarchicalNodeType(options),\n    createHierarchicalNodeValueType(options),\n  ]\n}\n","import {AddIcon} from '@sanity/icons/Add'\nimport type {FC} from 'react'\n\nimport TreeDeskStructure from './TreeDeskStructure'\nimport type {TreeDeskStructureProps} from './types'\nimport throwError from './utils/throwError'\n\nexport interface TreeProps extends TreeDeskStructureProps {\n  /**\n   * Visible title above the tree.\n   * Also used as the label in the structure list item.\n   */\n  title: string\n\n  /**\n   * Optional icon for rendering the item in the structure.\n   */\n  icon?: any\n\n  /**\n   * The `ConfigContext` available as the second parameter of the structure resolver.\n   */\n  context?: any\n  /**\n   * The `StructureBuilder` (`S`) available as the first parameter of the structure resolver.\n   */\n  S?: any\n  /**\n   * Restrict document types that can be created.\n   */\n  creatableTypes?: string[]\n}\n\nconst structureTreeValidator = (props: TreeProps): FC => {\n  const {documentId, referenceTo} = props\n  if (typeof documentId !== 'string' || !documentId) {\n    throwError('invalidDocumentId')\n  }\n  if (!Array.isArray(referenceTo)) {\n    throwError('invalidReferenceTo', `(documentId \"${documentId}\")`)\n  }\n\n  return (structureProps) => <TreeDeskStructure {...structureProps} options={props} />\n}\n\nexport default function createStructureHierarchy(props: TreeProps) {\n  const {documentId, referenceTo, referenceOptions, context, S, creatableTypes} = props\n  if (!S || !context) {\n    throw new Error(\n      'Invalid configuration. S or context props are undefined. ' +\n        'These props are available as function parameters when configuring structure, and must be passed along to createStructureHierarchy. ' +\n        'Confer the plugin README for example usage.',\n    )\n  }\n\n  const {schema} = context\n\n  const safelyCreatableTypes =\n    creatableTypes && creatableTypes.every((type) => referenceTo.includes(type))\n      ? creatableTypes\n      : referenceTo\n\n  let mainList = (\n    referenceTo?.length === 1\n      ? S.documentTypeList(referenceTo[0]).schemaType(referenceTo[0])\n      : S.documentList().filter('_type in $types').params({types: referenceTo})\n  )\n    .id(documentId)\n    .menuItems(\n      (safelyCreatableTypes || []).map((schemaType) =>\n        S.menuItem()\n          .intent({\n            type: 'create',\n            params: {type: schemaType},\n          })\n          .title(`Create ${schema.get(schemaType)?.title}`)\n          .icon(schema.get(schemaType)?.icon || AddIcon),\n      ),\n    )\n    .canHandleIntent((intent: string, c: Record<string, unknown>) => {\n      // Can edit itself\n      if (intent === 'edit' && c['id'] === props.documentId) {\n        return true\n      }\n      // Can create & edit referenced document types\n      const intentType = c['type']\n      if (typeof intentType === 'string' && safelyCreatableTypes.includes(intentType)) {\n        return true\n      }\n      return false\n    })\n\n  if (referenceOptions?.filter) {\n    mainList = mainList.filter(referenceOptions.filter)\n  }\n\n  if (referenceOptions?.filterParams) {\n    mainList = mainList.params(referenceOptions.filterParams)\n  }\n\n  return S.listItem()\n    .id(documentId)\n    .title(props.title || documentId)\n    .icon(props.icon)\n    .child(\n      Object.assign(\n        mainList.serialize(),\n        {\n          type: 'component',\n          component: structureTreeValidator(props),\n          options: props,\n          __preserveInstance: true,\n        },\n        props.title ? {title: props.title} : {},\n      ),\n    )\n}\n","import {defineType} from 'sanity'\n\nexport default defineType({\n  name: 'hierarchy.tree',\n  title: 'Hierarchical tree',\n  type: 'document',\n  // The plugin needs to define a `schemaType` with liveEdit enabled so that\n  // `useDocumentOperation` in TreeDeskStructure.tsx doesn't create drafts at every patch.\n  liveEdit: true,\n  // Let's avoid defining the actual hierarchical field, else GraphQL users won't be able to deploy schemas\n  fields: [\n    {\n      name: 'unusedField',\n      title: 'Unused field',\n      type: 'string',\n      hidden: true,\n    },\n  ],\n})\n","import '@sanity/ui/styles.css'\nimport {definePlugin} from 'sanity'\n\nimport {default as createHierarchicalSchemas} from './createHierarchicalSchemas'\nimport {default as createStructureHierarchy, type TreeProps} from './createStructureHierarchy'\nimport {default as hierarchyTree} from './schemas/hierarchy.tree'\nimport {default as flatDataToTree} from './utils/flatDataToTree'\n\nexport {createHierarchicalSchemas, createStructureHierarchy, flatDataToTree, hierarchyTree}\nexport type {TreeProps}\n\n/**\n * @deprecated Use {@link createStructureHierarchy} instead. `sanity/desk` has been\n * replaced by `sanity/structure`, so `createDeskHierarchy` was renamed to\n * `createStructureHierarchy`. This alias will be removed in a future major version.\n */\nexport const createDeskHierarchy = createStructureHierarchy\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {hierarchicalDocumentList} from '@sanity/hierarchical-document-list'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [hierarchicalDocumentList()],\n * })\n * ```\n */\n\nexport const hierarchicalDocumentList = definePlugin({\n  name: 'sanity-plugin-hierarchical-document-list',\n})\n"],"mappings":"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"}
\ No newline at end of file