@payloadcms/ui 3.80.0-internal.8d9ec7c → 3.80.0-internal.cdd7ef7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
  2. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +4 -2
  3. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
  4. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +157 -0
  5. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -1
  6. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.d.ts.map +1 -0
  7. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.js +5 -5
  8. package/dist/elements/Hierarchy/ColumnBrowser/Column/index.js.map +1 -0
  9. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.scss +1 -1
  10. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.d.ts.map +1 -0
  11. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.js +3 -3
  12. package/dist/elements/Hierarchy/ColumnBrowser/ColumnItem/index.js.map +1 -0
  13. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.scss +1 -1
  14. package/dist/elements/Hierarchy/ColumnBrowser/index.d.ts.map +1 -0
  15. package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.js +6 -6
  16. package/dist/elements/Hierarchy/ColumnBrowser/index.js.map +1 -0
  17. package/dist/elements/Hierarchy/ColumnBrowser/types.d.ts.map +1 -0
  18. package/dist/elements/Hierarchy/ColumnBrowser/types.js.map +1 -0
  19. package/dist/elements/Hierarchy/DocHeaderButton/index.d.ts.map +1 -0
  20. package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.js +6 -6
  21. package/dist/elements/Hierarchy/DocHeaderButton/index.js.map +1 -0
  22. package/dist/elements/Hierarchy/DocHeaderButton/index.server.d.ts.map +1 -0
  23. package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.server.js +3 -3
  24. package/dist/elements/Hierarchy/DocHeaderButton/index.server.js.map +1 -0
  25. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.d.ts.map +1 -0
  26. package/dist/elements/Hierarchy/Drawer/fetchAncestorPath.js.map +1 -0
  27. package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.d.ts +2 -2
  28. package/dist/elements/Hierarchy/Drawer/index.d.ts.map +1 -0
  29. package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.js +2 -2
  30. package/dist/elements/Hierarchy/Drawer/index.js.map +1 -0
  31. package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/types.d.ts +1 -1
  32. package/dist/elements/Hierarchy/Drawer/types.d.ts.map +1 -0
  33. package/dist/elements/Hierarchy/Drawer/types.js.map +1 -0
  34. package/dist/elements/{HierarchyDrawer/index.d.ts → Hierarchy/Drawer/useHierarchyDrawer.d.ts} +1 -1
  35. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.d.ts.map +1 -0
  36. package/dist/elements/{HierarchyDrawer/index.js → Hierarchy/Drawer/useHierarchyDrawer.js} +6 -6
  37. package/dist/elements/Hierarchy/Drawer/useHierarchyDrawer.js.map +1 -0
  38. package/dist/elements/Hierarchy/Field/SelectedHierarchies.d.ts.map +1 -0
  39. package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.js +7 -16
  40. package/dist/elements/Hierarchy/Field/SelectedHierarchies.js.map +1 -0
  41. package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.scss +1 -1
  42. package/dist/elements/Hierarchy/Field/index.client.d.ts.map +1 -0
  43. package/dist/elements/{HierarchyField → Hierarchy/Field}/index.client.js +17 -29
  44. package/dist/elements/Hierarchy/Field/index.client.js.map +1 -0
  45. package/dist/elements/{HierarchyField → Hierarchy/Field}/index.scss +1 -1
  46. package/dist/elements/Hierarchy/Field/index.server.d.ts.map +1 -0
  47. package/dist/elements/{HierarchyField → Hierarchy/Field}/index.server.js +2 -2
  48. package/dist/elements/Hierarchy/Field/index.server.js.map +1 -0
  49. package/dist/elements/Hierarchy/HydrateProvider/index.d.ts +4 -0
  50. package/dist/elements/Hierarchy/HydrateProvider/index.d.ts.map +1 -0
  51. package/dist/elements/{HydrateHierarchyProvider → Hierarchy/HydrateProvider}/index.js +1 -1
  52. package/dist/elements/Hierarchy/HydrateProvider/index.js.map +1 -0
  53. package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.d.ts +3 -3
  54. package/dist/elements/Hierarchy/MoveMany/index.d.ts.map +1 -0
  55. package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.js +10 -10
  56. package/dist/elements/Hierarchy/MoveMany/index.js.map +1 -0
  57. package/dist/elements/{MoveMany → Hierarchy/MoveMany}/index.scss +1 -1
  58. package/dist/elements/Hierarchy/Search/HierarchySearchInput.d.ts.map +1 -0
  59. package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchInput.js +5 -5
  60. package/dist/elements/Hierarchy/Search/HierarchySearchInput.js.map +1 -0
  61. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.d.ts.map +1 -0
  62. package/dist/elements/Hierarchy/Search/HierarchySearchResultItem.js.map +1 -0
  63. package/dist/elements/Hierarchy/Search/HierarchySearchResults.d.ts.map +1 -0
  64. package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResults.js +2 -2
  65. package/dist/elements/Hierarchy/Search/HierarchySearchResults.js.map +1 -0
  66. package/dist/elements/Hierarchy/Search/index.d.ts.map +1 -0
  67. package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.js +2 -2
  68. package/dist/elements/Hierarchy/Search/index.js.map +1 -0
  69. package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.scss +1 -1
  70. package/dist/elements/Hierarchy/Search/types.d.ts.map +1 -0
  71. package/dist/elements/Hierarchy/Search/types.js.map +1 -0
  72. package/dist/elements/Hierarchy/Search/useHierarchySearch.d.ts.map +1 -0
  73. package/dist/elements/{HierarchySearch → Hierarchy/Search}/useHierarchySearch.js +2 -2
  74. package/dist/elements/Hierarchy/Search/useHierarchySearch.js.map +1 -0
  75. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.d.ts.map +1 -0
  76. package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.js +43 -48
  77. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.js.map +1 -0
  78. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.d.ts.map +1 -0
  79. package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.server.js +6 -5
  80. package/dist/elements/Hierarchy/Tree/HierarchySidebarTab.server.js.map +1 -0
  81. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.d.ts.map +1 -0
  82. package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/LoadMoreButton.js +1 -1
  83. package/dist/elements/Hierarchy/Tree/LoadMore/LoadMoreButton.js.map +1 -0
  84. package/dist/elements/Hierarchy/Tree/LoadMore/index.d.ts.map +1 -0
  85. package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/index.js +1 -1
  86. package/dist/elements/Hierarchy/Tree/LoadMore/index.js.map +1 -0
  87. package/dist/elements/Hierarchy/Tree/TreeConnector.d.ts.map +1 -0
  88. package/dist/elements/Hierarchy/Tree/TreeConnector.js.map +1 -0
  89. package/dist/elements/Hierarchy/Tree/TreeFocusContext.d.ts.map +1 -0
  90. package/dist/elements/Hierarchy/Tree/TreeFocusContext.js.map +1 -0
  91. package/dist/elements/Hierarchy/Tree/TreeNode/index.d.ts.map +1 -0
  92. package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.js +8 -4
  93. package/dist/elements/Hierarchy/Tree/TreeNode/index.js.map +1 -0
  94. package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.scss +1 -1
  95. package/dist/elements/{HierarchyTree → Hierarchy/Tree}/index.d.ts +1 -0
  96. package/dist/elements/Hierarchy/Tree/index.d.ts.map +1 -0
  97. package/dist/elements/{Tree → Hierarchy/Tree}/index.js +72 -72
  98. package/dist/elements/Hierarchy/Tree/index.js.map +1 -0
  99. package/dist/elements/{Tree → Hierarchy/Tree}/index.scss +2 -5
  100. package/dist/elements/{Tree → Hierarchy/Tree}/types.d.ts +30 -24
  101. package/dist/elements/Hierarchy/Tree/types.d.ts.map +1 -0
  102. package/dist/elements/Hierarchy/Tree/types.js.map +1 -0
  103. package/dist/elements/{Tree → Hierarchy/Tree}/useChildren.d.ts +5 -1
  104. package/dist/elements/Hierarchy/Tree/useChildren.d.ts.map +1 -0
  105. package/dist/elements/{Tree → Hierarchy/Tree}/useChildren.js +41 -25
  106. package/dist/elements/Hierarchy/Tree/useChildren.js.map +1 -0
  107. package/dist/elements/LoadMoreRow/index.js +1 -1
  108. package/dist/elements/LoadMoreRow/index.js.map +1 -1
  109. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  110. package/dist/elements/RelationshipTable/index.js +14 -9
  111. package/dist/elements/RelationshipTable/index.js.map +1 -1
  112. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js +1 -1
  113. package/dist/elements/Table/DefaultCell/fields/Hierarchy/index.js.map +1 -1
  114. package/dist/exports/client/index.d.ts +11 -15
  115. package/dist/exports/client/index.d.ts.map +1 -1
  116. package/dist/exports/client/index.js +26 -26
  117. package/dist/exports/client/index.js.map +4 -4
  118. package/dist/exports/rsc/index.d.ts +3 -3
  119. package/dist/exports/rsc/index.d.ts.map +1 -1
  120. package/dist/exports/rsc/index.js +3 -3
  121. package/dist/exports/rsc/index.js.map +1 -1
  122. package/dist/forms/Form/mergeServerFormState.d.ts.map +1 -1
  123. package/dist/forms/Form/mergeServerFormState.js +101 -24
  124. package/dist/forms/Form/mergeServerFormState.js.map +1 -1
  125. package/dist/icons/TableView/index.d.ts +3 -0
  126. package/dist/icons/TableView/index.d.ts.map +1 -0
  127. package/dist/icons/TableView/index.js +16 -0
  128. package/dist/icons/TableView/index.js.map +1 -0
  129. package/dist/providers/Hierarchy/index.d.ts.map +1 -1
  130. package/dist/providers/Hierarchy/index.js +5 -1
  131. package/dist/providers/Hierarchy/index.js.map +1 -1
  132. package/dist/providers/Hierarchy/types.d.ts +1 -0
  133. package/dist/providers/Hierarchy/types.d.ts.map +1 -1
  134. package/dist/providers/Hierarchy/types.js.map +1 -1
  135. package/dist/providers/SidebarTabs/index.d.ts +19 -0
  136. package/dist/providers/SidebarTabs/index.d.ts.map +1 -0
  137. package/dist/providers/SidebarTabs/index.js +24 -0
  138. package/dist/providers/SidebarTabs/index.js.map +1 -0
  139. package/dist/styles.css +1 -1
  140. package/dist/views/Edit/index.d.ts.map +1 -1
  141. package/dist/views/Edit/index.js +11 -2
  142. package/dist/views/Edit/index.js.map +1 -1
  143. package/dist/views/HierarchyList/DocumentListSelection/index.d.ts.map +1 -1
  144. package/dist/views/HierarchyList/DocumentListSelection/index.js +145 -86
  145. package/dist/views/HierarchyList/DocumentListSelection/index.js.map +1 -1
  146. package/dist/views/HierarchyList/HierarchyTable/index.d.ts +1 -1
  147. package/dist/views/HierarchyList/HierarchyTable/index.d.ts.map +1 -1
  148. package/dist/views/HierarchyList/HierarchyTable/index.js.map +1 -1
  149. package/package.json +4 -4
  150. package/dist/elements/HierarchyButton/index.d.ts.map +0 -1
  151. package/dist/elements/HierarchyButton/index.js.map +0 -1
  152. package/dist/elements/HierarchyButton/index.server.d.ts.map +0 -1
  153. package/dist/elements/HierarchyButton/index.server.js.map +0 -1
  154. package/dist/elements/HierarchyColumnBrowser/Column/index.d.ts.map +0 -1
  155. package/dist/elements/HierarchyColumnBrowser/Column/index.js.map +0 -1
  156. package/dist/elements/HierarchyColumnBrowser/ColumnItem/index.d.ts.map +0 -1
  157. package/dist/elements/HierarchyColumnBrowser/ColumnItem/index.js.map +0 -1
  158. package/dist/elements/HierarchyColumnBrowser/index.d.ts.map +0 -1
  159. package/dist/elements/HierarchyColumnBrowser/index.js.map +0 -1
  160. package/dist/elements/HierarchyColumnBrowser/types.d.ts.map +0 -1
  161. package/dist/elements/HierarchyColumnBrowser/types.js.map +0 -1
  162. package/dist/elements/HierarchyDrawer/Drawer/index.d.ts.map +0 -1
  163. package/dist/elements/HierarchyDrawer/Drawer/index.js.map +0 -1
  164. package/dist/elements/HierarchyDrawer/fetchAncestorPath.d.ts.map +0 -1
  165. package/dist/elements/HierarchyDrawer/fetchAncestorPath.js.map +0 -1
  166. package/dist/elements/HierarchyDrawer/index.d.ts.map +0 -1
  167. package/dist/elements/HierarchyDrawer/index.js.map +0 -1
  168. package/dist/elements/HierarchyDrawer/types.d.ts.map +0 -1
  169. package/dist/elements/HierarchyDrawer/types.js.map +0 -1
  170. package/dist/elements/HierarchyField/SelectedHierarchies.d.ts.map +0 -1
  171. package/dist/elements/HierarchyField/SelectedHierarchies.js.map +0 -1
  172. package/dist/elements/HierarchyField/index.client.d.ts.map +0 -1
  173. package/dist/elements/HierarchyField/index.client.js.map +0 -1
  174. package/dist/elements/HierarchyField/index.server.d.ts.map +0 -1
  175. package/dist/elements/HierarchyField/index.server.js.map +0 -1
  176. package/dist/elements/HierarchySearch/HierarchySearchInput.d.ts.map +0 -1
  177. package/dist/elements/HierarchySearch/HierarchySearchInput.js.map +0 -1
  178. package/dist/elements/HierarchySearch/HierarchySearchResultItem.d.ts.map +0 -1
  179. package/dist/elements/HierarchySearch/HierarchySearchResultItem.js.map +0 -1
  180. package/dist/elements/HierarchySearch/HierarchySearchResults.d.ts.map +0 -1
  181. package/dist/elements/HierarchySearch/HierarchySearchResults.js.map +0 -1
  182. package/dist/elements/HierarchySearch/index.d.ts.map +0 -1
  183. package/dist/elements/HierarchySearch/index.js.map +0 -1
  184. package/dist/elements/HierarchySearch/types.d.ts.map +0 -1
  185. package/dist/elements/HierarchySearch/types.js.map +0 -1
  186. package/dist/elements/HierarchySearch/useHierarchySearch.d.ts.map +0 -1
  187. package/dist/elements/HierarchySearch/useHierarchySearch.js.map +0 -1
  188. package/dist/elements/HierarchyTree/HierarchySidebarTab.d.ts.map +0 -1
  189. package/dist/elements/HierarchyTree/HierarchySidebarTab.js.map +0 -1
  190. package/dist/elements/HierarchyTree/HierarchySidebarTab.server.d.ts.map +0 -1
  191. package/dist/elements/HierarchyTree/HierarchySidebarTab.server.js.map +0 -1
  192. package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.d.ts.map +0 -1
  193. package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.js +0 -36
  194. package/dist/elements/HierarchyTree/LoadMore/LoadMoreButton.js.map +0 -1
  195. package/dist/elements/HierarchyTree/LoadMore/index.d.ts.map +0 -1
  196. package/dist/elements/HierarchyTree/LoadMore/index.js +0 -29
  197. package/dist/elements/HierarchyTree/LoadMore/index.js.map +0 -1
  198. package/dist/elements/HierarchyTree/LoadMore/index.scss +0 -26
  199. package/dist/elements/HierarchyTree/TreeConnector.d.ts.map +0 -1
  200. package/dist/elements/HierarchyTree/TreeConnector.js.map +0 -1
  201. package/dist/elements/HierarchyTree/TreeFocusContext.d.ts.map +0 -1
  202. package/dist/elements/HierarchyTree/TreeFocusContext.js.map +0 -1
  203. package/dist/elements/HierarchyTree/TreeNode/index.d.ts +0 -5
  204. package/dist/elements/HierarchyTree/TreeNode/index.d.ts.map +0 -1
  205. package/dist/elements/HierarchyTree/TreeNode/index.js +0 -201
  206. package/dist/elements/HierarchyTree/TreeNode/index.js.map +0 -1
  207. package/dist/elements/HierarchyTree/TreeNode/index.scss +0 -99
  208. package/dist/elements/HierarchyTree/index.d.ts.map +0 -1
  209. package/dist/elements/HierarchyTree/index.js +0 -66
  210. package/dist/elements/HierarchyTree/index.js.map +0 -1
  211. package/dist/elements/HierarchyTree/index.scss +0 -42
  212. package/dist/elements/HierarchyTree/types.d.ts +0 -57
  213. package/dist/elements/HierarchyTree/types.d.ts.map +0 -1
  214. package/dist/elements/HierarchyTree/types.js.map +0 -1
  215. package/dist/elements/HierarchyTree/useChildren.d.ts +0 -26
  216. package/dist/elements/HierarchyTree/useChildren.d.ts.map +0 -1
  217. package/dist/elements/HierarchyTree/useChildren.js +0 -150
  218. package/dist/elements/HierarchyTree/useChildren.js.map +0 -1
  219. package/dist/elements/HierarchyTree/useTreeState.d.ts +0 -9
  220. package/dist/elements/HierarchyTree/useTreeState.d.ts.map +0 -1
  221. package/dist/elements/HierarchyTree/useTreeState.js +0 -50
  222. package/dist/elements/HierarchyTree/useTreeState.js.map +0 -1
  223. package/dist/elements/HydrateHierarchyProvider/index.d.ts +0 -4
  224. package/dist/elements/HydrateHierarchyProvider/index.d.ts.map +0 -1
  225. package/dist/elements/HydrateHierarchyProvider/index.js.map +0 -1
  226. package/dist/elements/MoveMany/index.d.ts.map +0 -1
  227. package/dist/elements/MoveMany/index.js.map +0 -1
  228. package/dist/elements/Tree/LoadMore/LoadMoreButton.d.ts +0 -8
  229. package/dist/elements/Tree/LoadMore/LoadMoreButton.d.ts.map +0 -1
  230. package/dist/elements/Tree/LoadMore/LoadMoreButton.js.map +0 -1
  231. package/dist/elements/Tree/LoadMore/index.d.ts +0 -12
  232. package/dist/elements/Tree/LoadMore/index.d.ts.map +0 -1
  233. package/dist/elements/Tree/LoadMore/index.js.map +0 -1
  234. package/dist/elements/Tree/TreeConnector.d.ts +0 -7
  235. package/dist/elements/Tree/TreeConnector.d.ts.map +0 -1
  236. package/dist/elements/Tree/TreeConnector.js +0 -23
  237. package/dist/elements/Tree/TreeConnector.js.map +0 -1
  238. package/dist/elements/Tree/TreeFocusContext.d.ts +0 -28
  239. package/dist/elements/Tree/TreeFocusContext.d.ts.map +0 -1
  240. package/dist/elements/Tree/TreeFocusContext.js +0 -140
  241. package/dist/elements/Tree/TreeFocusContext.js.map +0 -1
  242. package/dist/elements/Tree/TreeNode/index.d.ts.map +0 -1
  243. package/dist/elements/Tree/TreeNode/index.js.map +0 -1
  244. package/dist/elements/Tree/index.d.ts +0 -5
  245. package/dist/elements/Tree/index.d.ts.map +0 -1
  246. package/dist/elements/Tree/index.js.map +0 -1
  247. package/dist/elements/Tree/types.d.ts.map +0 -1
  248. package/dist/elements/Tree/types.js +0 -2
  249. package/dist/elements/Tree/types.js.map +0 -1
  250. package/dist/elements/Tree/useChildren.d.ts.map +0 -1
  251. package/dist/elements/Tree/useChildren.js.map +0 -1
  252. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/Column/index.d.ts +0 -0
  253. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/ColumnItem/index.d.ts +0 -0
  254. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.d.ts +0 -0
  255. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/index.scss +0 -0
  256. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/types.d.ts +0 -0
  257. /package/dist/elements/{HierarchyColumnBrowser → Hierarchy/ColumnBrowser}/types.js +0 -0
  258. /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.d.ts +0 -0
  259. /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.scss +0 -0
  260. /package/dist/elements/{HierarchyButton → Hierarchy/DocHeaderButton}/index.server.d.ts +0 -0
  261. /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/fetchAncestorPath.d.ts +0 -0
  262. /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/fetchAncestorPath.js +0 -0
  263. /package/dist/elements/{HierarchyDrawer → Hierarchy}/Drawer/index.scss +0 -0
  264. /package/dist/elements/{HierarchyDrawer → Hierarchy/Drawer}/types.js +0 -0
  265. /package/dist/elements/{HierarchyField → Hierarchy/Field}/SelectedHierarchies.d.ts +0 -0
  266. /package/dist/elements/{HierarchyField → Hierarchy/Field}/index.client.d.ts +0 -0
  267. /package/dist/elements/{HierarchyField → Hierarchy/Field}/index.server.d.ts +0 -0
  268. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchInput.d.ts +0 -0
  269. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResultItem.d.ts +0 -0
  270. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResultItem.js +0 -0
  271. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/HierarchySearchResults.d.ts +0 -0
  272. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/index.d.ts +0 -0
  273. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/types.d.ts +0 -0
  274. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/types.js +0 -0
  275. /package/dist/elements/{HierarchySearch → Hierarchy/Search}/useHierarchySearch.d.ts +0 -0
  276. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.d.ts +0 -0
  277. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/HierarchySidebarTab.server.d.ts +0 -0
  278. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/LoadMore/LoadMoreButton.d.ts +0 -0
  279. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/LoadMore/index.d.ts +0 -0
  280. /package/dist/elements/{Tree → Hierarchy/Tree}/LoadMore/index.scss +0 -0
  281. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeConnector.d.ts +0 -0
  282. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeConnector.js +0 -0
  283. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeFocusContext.d.ts +0 -0
  284. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/TreeFocusContext.js +0 -0
  285. /package/dist/elements/{Tree → Hierarchy/Tree}/TreeNode/index.d.ts +0 -0
  286. /package/dist/elements/{HierarchyTree → Hierarchy/Tree}/types.js +0 -0
@@ -2,9 +2,9 @@
2
2
 
3
3
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
4
  import React, { useCallback, useRef } from 'react';
5
- import { Spinner } from '../../../elements/Spinner/index.js';
6
- import { ChevronIcon } from '../../../icons/Chevron/index.js';
7
- import { useTranslation } from '../../../providers/Translation/index.js';
5
+ import { Spinner } from '../../../../elements/Spinner/index.js';
6
+ import { ChevronIcon } from '../../../../icons/Chevron/index.js';
7
+ import { useTranslation } from '../../../../providers/Translation/index.js';
8
8
  import { LoadMore } from '../LoadMore/index.js';
9
9
  import { useFocusableItem, useTreeFocus } from '../TreeFocusContext.js';
10
10
  import { useChildren } from '../useChildren.js';
@@ -53,6 +53,7 @@ export const TreeNode = ({
53
53
  children,
54
54
  hasMore,
55
55
  isLoading,
56
+ load,
56
57
  loadMore: loadMoreFromHook,
57
58
  totalDocs
58
59
  } = useChildren({
@@ -98,10 +99,13 @@ export const TreeNode = ({
98
99
  const hasChildren = node.hasChildren === true || (expanded && children !== null ? children.length > 0 : true);
99
100
  const handleToggleClick = useCallback(e => {
100
101
  e.stopPropagation();
102
+ if (!expanded) {
103
+ void load();
104
+ }
101
105
  onToggle({
102
106
  id: node.id
103
107
  });
104
- }, [node.id, onToggle]);
108
+ }, [node.id, onToggle, expanded, load]);
105
109
  const handleSelectClick = useCallback(() => {
106
110
  onSelect?.({
107
111
  id: node.id
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["React","useCallback","useRef","Spinner","ChevronIcon","useTranslation","LoadMore","useFocusableItem","useTreeFocus","useChildren","DEFAULT_TREE_LIMIT","baseClass","getDocumentTitle","doc","useAsTitle","docId","id","idStr","String","value","TreeNode","allPossibleTypeValues","baseFilter","cache","collectionSlug","depth","expandedNodes","filterByCollections","limit","node","onSelect","onToggle","parentFieldName","selected","selectedNodeId","typeFieldName","t","expanded","has","nodeRef","setFocusedId","children","hasMore","isLoading","load","loadMore","loadMoreFromHook","totalDocs","enabled","parentId","handleLoadMore","newDocs","length","firstNewDoc","handleFocus","isFocused","tabIndex","type","ref","useEffect","current","document","activeElement","focus","hasChildren","handleToggleClick","e","stopPropagation","handleSelectClick","handleKeyDown","key","preventDefault","_jsxs","undefined","className","onFocus","onKeyDown","role","style","filter","Boolean","join","_jsx","onClick","onMouseDown","direction","title","loadingText","size","_Fragment","map","child","childData","childId","childTitle","currentCount","onLoadMore"],"sources":["../../../../../src/elements/Hierarchy/Tree/TreeNode/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useRef } from 'react'\n\nimport type { TreeNodeProps } from '../types.js'\n\nimport { Spinner } from '../../../../elements/Spinner/index.js'\nimport { ChevronIcon } from '../../../../icons/Chevron/index.js'\nimport { useTranslation } from '../../../../providers/Translation/index.js'\nimport { LoadMore } from '../LoadMore/index.js'\nimport { useFocusableItem, useTreeFocus } from '../TreeFocusContext.js'\nimport { useChildren } from '../useChildren.js'\nimport './index.scss'\n\nconst DEFAULT_TREE_LIMIT = 10\n\nconst baseClass = 'tree-node'\n\nconst getDocumentTitle = (doc: Record<string, unknown>, useAsTitle: string | undefined): string => {\n const docId: number | string = doc.id as number | string\n const idStr = typeof docId === 'number' ? String(docId) : docId\n\n if (!useAsTitle) {\n return idStr\n }\n\n const value = doc[useAsTitle]\n if (value && (typeof value === 'string' || typeof value === 'number')) {\n return String(value)\n }\n return idStr\n}\n\nexport const TreeNode = ({\n allPossibleTypeValues,\n baseFilter,\n cache,\n collectionSlug,\n depth = 0,\n expandedNodes,\n filterByCollections,\n limit = DEFAULT_TREE_LIMIT,\n node,\n onSelect,\n onToggle,\n parentFieldName,\n selected,\n selectedNodeId,\n typeFieldName,\n useAsTitle,\n}: TreeNodeProps) => {\n const { t } = useTranslation()\n const expanded = expandedNodes.has(node.id)\n const nodeRef = useRef<HTMLDivElement>(null)\n const { setFocusedId } = useTreeFocus()\n\n const {\n children,\n hasMore,\n isLoading,\n load,\n loadMore: loadMoreFromHook,\n totalDocs,\n } = useChildren({\n allPossibleTypeValues,\n baseFilter,\n cache,\n collectionSlug,\n enabled: expanded,\n filterByCollections,\n limit,\n parentFieldName,\n parentId: node.id,\n typeFieldName,\n useAsTitle,\n })\n\n const handleLoadMore = React.useCallback(async () => {\n const newDocs = await loadMoreFromHook()\n\n if (newDocs && newDocs.length > 0) {\n const firstNewDoc = newDocs[0]\n const docId: number | string = (firstNewDoc as { id: number | string }).id\n setFocusedId(`node-${docId}`)\n }\n }, [loadMoreFromHook, setFocusedId])\n\n const { handleFocus, isFocused, tabIndex } = useFocusableItem({\n id: `node-${node.id}`,\n type: 'node',\n ref: nodeRef,\n })\n\n // When focusedId points to this node, actually call .focus()\n React.useEffect(() => {\n if (isFocused && nodeRef.current && document.activeElement !== nodeRef.current) {\n nodeRef.current.focus()\n }\n }, [isFocused])\n\n // Determine if node has children:\n // - If explicitly set in data, use that\n // - If expanded and loaded, check the actual children\n // - Otherwise, assume it might have children (show chevron until proven otherwise)\n const hasChildren =\n node.hasChildren === true || (expanded && children !== null ? children.length > 0 : true)\n\n const handleToggleClick = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (!expanded) {\n void load()\n }\n onToggle({ id: node.id })\n },\n [node.id, onToggle, expanded, load],\n )\n\n const handleSelectClick = useCallback(() => {\n onSelect?.({ id: node.id })\n }, [node.id, onSelect])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case ' ':\n case 'Enter':\n e.preventDefault()\n e.stopPropagation()\n handleSelectClick()\n break\n case 'ArrowLeft':\n e.preventDefault()\n e.stopPropagation()\n if (hasChildren && expanded) {\n onToggle({ id: node.id })\n }\n break\n case 'ArrowRight':\n e.preventDefault()\n e.stopPropagation()\n if (hasChildren && !expanded) {\n onToggle({ id: node.id })\n }\n break\n }\n },\n [hasChildren, expanded, handleSelectClick, onToggle, node.id],\n )\n\n return (\n <div\n aria-expanded={hasChildren ? expanded : undefined}\n aria-level={depth + 1}\n aria-selected={selected}\n className={baseClass}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n ref={nodeRef}\n role=\"treeitem\"\n style={{ '--tree-depth': depth } as React.CSSProperties}\n tabIndex={tabIndex}\n >\n <div\n className={[`${baseClass}__content`, selected && `${baseClass}__content--selected`]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={`${baseClass}__indicator`} />\n {hasChildren ? (\n <button\n aria-label={expanded ? t('general:collapse') : t('general:open')}\n className={`${baseClass}__toggle`}\n onClick={handleToggleClick}\n onMouseDown={(e) => e.preventDefault()}\n tabIndex={-1}\n type=\"button\"\n >\n <ChevronIcon direction={expanded ? 'down' : 'right'} />\n </button>\n ) : (\n <div className={`${baseClass}__toggle-spacer`} />\n )}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions -- keyboard handled by parent */}\n <span\n className={`${baseClass}__title`}\n onClick={handleSelectClick}\n onMouseDown={(e) => e.preventDefault()}\n title={node.title}\n >\n {node.title}\n </span>\n {isLoading && expanded && (\n <span className={`${baseClass}__loading`}>\n <Spinner loadingText={null} size=\"small\" />\n </span>\n )}\n </div>\n\n {expanded && children && children.length > 0 && (\n <>\n <div className={`${baseClass}__children`} role=\"group\">\n {children.map((child) => {\n const childData = child as { id: number | string }\n const childId = childData.id\n const childTitle = getDocumentTitle(child, useAsTitle)\n return (\n <TreeNode\n allPossibleTypeValues={allPossibleTypeValues}\n baseFilter={baseFilter}\n cache={cache}\n collectionSlug={collectionSlug}\n depth={depth + 1}\n expandedNodes={expandedNodes}\n filterByCollections={filterByCollections}\n key={String(childId)}\n limit={limit}\n node={{\n id: childId,\n hasChildren: true,\n title: childTitle,\n }}\n onSelect={onSelect}\n onToggle={onToggle}\n parentFieldName={parentFieldName}\n selected={String(childId) === String(selectedNodeId)}\n selectedNodeId={selectedNodeId}\n typeFieldName={typeFieldName}\n useAsTitle={useAsTitle}\n />\n )\n })}\n </div>\n {hasMore && (\n <LoadMore\n currentCount={children.length}\n depth={depth + 1}\n id={`load-more-${node.id}`}\n onLoadMore={handleLoadMore}\n totalDocs={totalDocs}\n />\n )}\n </>\n )}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- @import '../../../scss/styles.scss';
1
+ @import '../../../../scss/styles.scss';
2
2
 
3
3
  .tree-node {
4
4
  // Remove default focus outline from treeitem - we style the content instead
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
2
  import type { HierarchyTreeProps } from './types.js';
3
+ import './index.scss';
3
4
  export declare const HierarchyTree: React.FC<HierarchyTreeProps>;
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Tree/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA8C,MAAM,OAAO,CAAA;AAElE,OAAO,KAAK,EAAkB,kBAAkB,EAAgB,MAAM,YAAY,CAAA;AAYlF,OAAO,cAAc,CAAA;AA0RrB,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAMtD,CAAA"}
@@ -3,19 +3,20 @@
3
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  import { getTranslation } from '@payloadcms/translations';
5
5
  import { useRouter } from 'next/navigation.js';
6
- import React, { useId, useMemo, useRef } from 'react';
7
- import { CreateDocumentButton } from '../../elements/CreateDocumentButton/index.js';
8
- import { DelayedSpinner } from '../../elements/DelayedSpinner/index.js';
9
- import { TagIcon } from '../../icons/Tag/index.js';
10
- import { useConfig } from '../../providers/Config/index.js';
11
- import { useTranslation } from '../../providers/Translation/index.js';
6
+ import { DEFAULT_HIERARCHY_TREE_LIMIT } from 'payload/shared';
7
+ import React, { useCallback, useId, useMemo, useRef } from 'react';
8
+ import { TagIcon } from '../../../icons/Tag/index.js';
9
+ import { useConfig } from '../../../providers/Config/index.js';
10
+ import { useHierarchy } from '../../../providers/Hierarchy/index.js';
11
+ import { useTranslation } from '../../../providers/Translation/index.js';
12
+ import { CreateDocumentButton } from '../../CreateDocumentButton/index.js';
13
+ import { DelayedSpinner } from '../../DelayedSpinner/index.js';
12
14
  import { LoadMore } from './LoadMore/index.js';
13
15
  import { TreeFocusProvider, useTreeFocus } from './TreeFocusContext.js';
14
- import './index.scss';
15
16
  import { TreeNode } from './TreeNode/index.js';
16
17
  import { useChildren } from './useChildren.js';
18
+ import './index.scss';
17
19
  const baseClass = 'tree';
18
- const DEFAULT_TREE_LIMIT = 10;
19
20
  const getDocumentTitle = (doc, useAsTitle) => {
20
21
  const docId = doc.id;
21
22
  const idStr = typeof docId === 'number' ? String(docId) : docId;
@@ -28,22 +29,16 @@ const getDocumentTitle = (doc, useAsTitle) => {
28
29
  }
29
30
  return idStr;
30
31
  };
31
- const TreeInner = ({
32
- allPossibleTypeValues,
32
+ const HierarchyTreeInner = ({
33
33
  baseFilter,
34
34
  collectionSlug,
35
- expandedNodes,
36
35
  filterByCollections,
37
36
  icon,
38
- initialData,
37
+ initialData: initialDataProp,
38
+ initialExpandedNodes: initialExpandedNodesProp,
39
39
  onNodeClick,
40
- parentFieldName,
41
40
  selectedNodeId,
42
- showAllOption = true,
43
- toggleNode,
44
- treeLimit = DEFAULT_TREE_LIMIT,
45
- typeFieldName,
46
- useAsTitle
41
+ useAsTitle: useAsTitleProp
47
42
  }) => {
48
43
  const {
49
44
  moveFocus
@@ -57,23 +52,47 @@ const TreeInner = ({
57
52
  getEntityConfig
58
53
  } = useConfig();
59
54
  const createDrawerSlug = `tree-create-${useId()}`;
60
- // Pre-populate cache with initialData SYNCHRONOUSLY (before first render)
61
- // This ensures expanded children find their data immediately without client-side fetch
62
- const childrenCache = useRef(new Map());
63
- // Track previous baseFilter to clear cache when tenant changes
64
- // Use JSON string comparison since baseFilter is an object
55
+ const {
56
+ getExpandedNodesForCollection,
57
+ getTreeDataForCollection,
58
+ toggleNodeForCollection,
59
+ typeFieldName
60
+ } = useHierarchy();
61
+ const collectionConfig = getEntityConfig({
62
+ collectionSlug
63
+ });
64
+ const hierarchyConfig = collectionConfig.hierarchy && typeof collectionConfig.hierarchy === 'object' ? collectionConfig.hierarchy : undefined;
65
+ const parentFieldName = hierarchyConfig?.parentFieldName;
66
+ const treeLimit = hierarchyConfig?.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT;
67
+ const useAsTitle = useAsTitleProp ?? collectionConfig.admin?.useAsTitle;
68
+ const allPossibleTypeValues = useMemo(() => hierarchyConfig?.relatedCollections ? Object.keys(hierarchyConfig.relatedCollections) : undefined, [hierarchyConfig?.relatedCollections]);
69
+ const contextData = getTreeDataForCollection(collectionSlug);
65
70
  const baseFilterKey = baseFilter ? JSON.stringify(baseFilter) : '';
71
+ const contextBaseFilterKey = contextData?.baseFilter ? JSON.stringify(contextData.baseFilter) : '';
72
+ const initialData = baseFilterKey === contextBaseFilterKey ? contextData ?? initialDataProp : initialDataProp;
73
+ const expandedNodes = useMemo(() => {
74
+ const contextExpanded = getExpandedNodesForCollection(collectionSlug);
75
+ if (contextExpanded.size > 0) {
76
+ return contextExpanded;
77
+ }
78
+ return initialExpandedNodesProp ? new Set(initialExpandedNodesProp) : contextExpanded;
79
+ }, [collectionSlug, getExpandedNodesForCollection, initialExpandedNodesProp]);
80
+ const handleToggleNode = useCallback(({
81
+ id
82
+ }) => {
83
+ toggleNodeForCollection(collectionSlug, id);
84
+ }, [collectionSlug, toggleNodeForCollection]);
85
+ // Pre-populate cache with initialData synchronously before first render
86
+ const childrenCache = useRef(new Map());
66
87
  const prevBaseFilterKeyRef = useRef(baseFilterKey);
67
88
  if (prevBaseFilterKeyRef.current !== baseFilterKey) {
68
89
  prevBaseFilterKeyRef.current = baseFilterKey;
69
90
  childrenCache.current.clear();
70
91
  }
71
- // Populate cache from initialData
72
92
  useMemo(() => {
73
93
  if (!initialData || initialData.docs.length === 0) {
74
94
  return;
75
95
  }
76
- // Group docs by parent to populate cache
77
96
  const docsByParent = new Map();
78
97
  for (const doc of initialData.docs) {
79
98
  const parentId = doc[parentFieldName] || 'null';
@@ -81,29 +100,21 @@ const TreeInner = ({
81
100
  if (!docsByParent.has(parentKey)) {
82
101
  docsByParent.set(parentKey, []);
83
102
  }
84
- const parentDocs = docsByParent.get(parentKey);
85
- if (parentDocs) {
86
- parentDocs.push(doc);
87
- }
103
+ docsByParent.get(parentKey).push(doc);
88
104
  }
89
- // Populate cache with grouped docs and metadata from server
90
105
  const filterKey = filterByCollections?.length ? filterByCollections.slice().sort().join(',') : '';
91
106
  for (const [parentKey_0, docs] of docsByParent) {
92
- const cacheKey = `${collectionSlug}-${parentKey_0}-${filterKey}`;
107
+ const cacheKey = `${collectionSlug}-${parentKey_0}-${filterKey}-${baseFilterKey}`;
93
108
  const parentMeta = initialData.loadedParents[parentKey_0];
94
109
  if (parentMeta) {
95
- // Calculate page number based on loaded count
96
- // If server loaded multiple pages to find a selected node, loadedCount > treeLimit
97
110
  const loadedCount = parentMeta.loadedCount ?? docs.length;
98
- const currentPage = Math.ceil(loadedCount / treeLimit) || 1;
99
111
  childrenCache.current.set(cacheKey, {
100
112
  children: docs,
101
113
  hasMore: parentMeta.hasMore,
102
- page: currentPage,
114
+ page: Math.ceil(loadedCount / treeLimit) || 1,
103
115
  totalDocs: parentMeta.totalDocs
104
116
  });
105
117
  } else {
106
- // Shouldn't happen, but fallback to conservative estimate
107
118
  childrenCache.current.set(cacheKey, {
108
119
  children: docs,
109
120
  hasMore: false,
@@ -112,9 +123,8 @@ const TreeInner = ({
112
123
  });
113
124
  }
114
125
  }
115
- }, [initialData, filterByCollections, parentFieldName, collectionSlug, treeLimit]);
126
+ }, [initialData, filterByCollections, parentFieldName, collectionSlug, treeLimit, baseFilterKey]);
116
127
  const treeRef = useRef(null);
117
- // Fetch root nodes (items with no parent)
118
128
  const {
119
129
  children: rootNodes,
120
130
  hasMore,
@@ -136,20 +146,25 @@ const TreeInner = ({
136
146
  typeFieldName,
137
147
  useAsTitle
138
148
  });
139
- // Wrap loadMore - focusedId stays the same, tabindex handles the rest
140
- const handleLoadMore = React.useCallback(async () => {
149
+ const handleLoadMore = useCallback(async () => {
141
150
  await loadMoreFromHook();
142
151
  }, [loadMoreFromHook]);
143
- const handleNodeClick = ({
144
- id
152
+ const handleNodeClick = useCallback(({
153
+ id: id_0
145
154
  }) => {
146
- if (onNodeClick) {
147
- onNodeClick({
148
- id
149
- });
155
+ onNodeClick?.({
156
+ id: id_0
157
+ });
158
+ }, [onNodeClick]);
159
+ const handleTreeKeyDown = useCallback(e => {
160
+ if (e.key === 'ArrowDown') {
161
+ e.preventDefault();
162
+ moveFocus('down');
163
+ } else if (e.key === 'ArrowUp') {
164
+ e.preventDefault();
165
+ moveFocus('up');
150
166
  }
151
- };
152
- // Show loading state with delay to prevent flash
167
+ }, [moveFocus]);
153
168
  if (isLoading && !rootNodes) {
154
169
  return /*#__PURE__*/_jsx("div", {
155
170
  className: baseClass,
@@ -159,7 +174,6 @@ const TreeInner = ({
159
174
  })
160
175
  });
161
176
  }
162
- // Show empty state after loading completes
163
177
  if (!rootNodes || rootNodes.length === 0) {
164
178
  const collectionLabel = getEntityConfig({
165
179
  collectionSlug
@@ -182,32 +196,19 @@ const TreeInner = ({
182
196
  })
183
197
  });
184
198
  }
185
- const handleTreeKeyDown = e => {
186
- if (e.key === 'ArrowDown') {
187
- e.preventDefault();
188
- moveFocus('down');
189
- } else if (e.key === 'ArrowUp') {
190
- e.preventDefault();
191
- moveFocus('up');
192
- }
193
- };
194
199
  const isAllSelected = selectedNodeId === null;
195
- const handleAllClick = () => {
196
- if (onNodeClick) {
197
- onNodeClick({
198
- id: null
199
- });
200
- }
201
- };
200
+ const handleAllClick = () => onNodeClick?.({
201
+ id: null
202
+ });
202
203
  return /*#__PURE__*/_jsxs("div", {
203
204
  className: baseClass,
204
205
  onKeyDown: handleTreeKeyDown,
205
206
  ref: treeRef,
206
207
  role: "tree",
207
208
  tabIndex: -1,
208
- children: [showAllOption && /*#__PURE__*/_jsxs("div", {
209
+ children: [/*#__PURE__*/_jsxs("div", {
209
210
  "aria-selected": isAllSelected,
210
- className: `${baseClass}__all-option${isAllSelected ? ` ${baseClass}__all-option--selected` : ''}`,
211
+ className: [`${baseClass}__all-option`, isAllSelected && `${baseClass}__all-option--selected`].filter(Boolean).join(' '),
211
212
  onClick: handleAllClick,
212
213
  onKeyDown: e_0 => {
213
214
  if (e_0.key === 'Enter' || e_0.key === ' ') {
@@ -228,7 +229,6 @@ const TreeInner = ({
228
229
  const nodeId = node.id;
229
230
  const nodeIdStr = typeof nodeId === 'number' ? String(nodeId) : nodeId;
230
231
  const nodeTitle = getDocumentTitle(node, useAsTitle);
231
- const isSelected = nodeIdStr === String(selectedNodeId);
232
232
  return /*#__PURE__*/_jsx(TreeNode, {
233
233
  allPossibleTypeValues: allPossibleTypeValues,
234
234
  baseFilter: baseFilter,
@@ -244,9 +244,9 @@ const TreeInner = ({
244
244
  title: nodeTitle
245
245
  },
246
246
  onSelect: handleNodeClick,
247
- onToggle: toggleNode,
247
+ onToggle: handleToggleNode,
248
248
  parentFieldName: parentFieldName,
249
- selected: isSelected,
249
+ selected: nodeIdStr === String(selectedNodeId),
250
250
  selectedNodeId: selectedNodeId,
251
251
  typeFieldName: typeFieldName,
252
252
  useAsTitle: useAsTitle
@@ -260,9 +260,9 @@ const TreeInner = ({
260
260
  })]
261
261
  });
262
262
  };
263
- export const Tree = props => {
263
+ export const HierarchyTree = props => {
264
264
  return /*#__PURE__*/_jsx(TreeFocusProvider, {
265
- children: /*#__PURE__*/_jsx(TreeInner, {
265
+ children: /*#__PURE__*/_jsx(HierarchyTreeInner, {
266
266
  ...props
267
267
  })
268
268
  });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["getTranslation","useRouter","DEFAULT_HIERARCHY_TREE_LIMIT","React","useCallback","useId","useMemo","useRef","TagIcon","useConfig","useHierarchy","useTranslation","CreateDocumentButton","DelayedSpinner","LoadMore","TreeFocusProvider","useTreeFocus","TreeNode","useChildren","baseClass","getDocumentTitle","doc","useAsTitle","docId","id","idStr","String","value","HierarchyTreeInner","baseFilter","collectionSlug","filterByCollections","icon","initialData","initialDataProp","initialExpandedNodes","initialExpandedNodesProp","onNodeClick","selectedNodeId","useAsTitleProp","moveFocus","router","i18n","t","getEntityConfig","createDrawerSlug","getExpandedNodesForCollection","getTreeDataForCollection","toggleNodeForCollection","typeFieldName","collectionConfig","hierarchyConfig","hierarchy","undefined","parentFieldName","treeLimit","admin","allPossibleTypeValues","relatedCollections","Object","keys","contextData","baseFilterKey","JSON","stringify","contextBaseFilterKey","expandedNodes","contextExpanded","size","Set","handleToggleNode","childrenCache","Map","prevBaseFilterKeyRef","current","clear","docs","length","docsByParent","parentId","parentKey","has","set","get","push","filterKey","slice","sort","join","cacheKey","parentMeta","loadedParents","loadedCount","children","hasMore","page","Math","ceil","totalDocs","treeRef","rootNodes","isLoading","loadMore","loadMoreFromHook","refresh","cache","enabled","limit","handleLoadMore","handleNodeClick","handleTreeKeyDown","e","key","preventDefault","_jsx","className","collectionLabel","buttonStyle","collections","drawerSlug","label","labels","singular","onSave","isAllSelected","handleAllClick","_jsxs","onKeyDown","ref","role","tabIndex","filter","Boolean","onClick","color","plural","map","node","nodeId","nodeIdStr","nodeTitle","depth","hasChildren","title","onSelect","onToggle","selected","currentCount","onLoadMore","HierarchyTree","props"],"sources":["../../../../src/elements/Hierarchy/Tree/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { useRouter } from 'next/navigation.js'\nimport { DEFAULT_HIERARCHY_TREE_LIMIT } from 'payload/shared'\nimport React, { useCallback, useId, useMemo, useRef } from 'react'\n\nimport type { CachedChildren, HierarchyTreeProps, TreeDocument } from './types.js'\n\nimport { TagIcon } from '../../../icons/Tag/index.js'\nimport { useConfig } from '../../../providers/Config/index.js'\nimport { useHierarchy } from '../../../providers/Hierarchy/index.js'\nimport { useTranslation } from '../../../providers/Translation/index.js'\nimport { CreateDocumentButton } from '../../CreateDocumentButton/index.js'\nimport { DelayedSpinner } from '../../DelayedSpinner/index.js'\nimport { LoadMore } from './LoadMore/index.js'\nimport { TreeFocusProvider, useTreeFocus } from './TreeFocusContext.js'\nimport { TreeNode } from './TreeNode/index.js'\nimport { useChildren } from './useChildren.js'\nimport './index.scss'\n\nconst baseClass = 'tree'\n\nconst getDocumentTitle = (doc: TreeDocument, useAsTitle: string | undefined): string => {\n const docId: number | string = doc.id\n const idStr = typeof docId === 'number' ? String(docId) : docId\n\n if (!useAsTitle) {\n return idStr\n }\n\n const value = doc[useAsTitle]\n if (value && (typeof value === 'string' || typeof value === 'number')) {\n return String(value)\n }\n return idStr\n}\n\nconst HierarchyTreeInner: React.FC<HierarchyTreeProps> = ({\n baseFilter,\n collectionSlug,\n filterByCollections,\n icon,\n initialData: initialDataProp,\n initialExpandedNodes: initialExpandedNodesProp,\n onNodeClick,\n selectedNodeId,\n useAsTitle: useAsTitleProp,\n}) => {\n const { moveFocus } = useTreeFocus()\n const router = useRouter()\n const { i18n, t } = useTranslation()\n const { getEntityConfig } = useConfig()\n const createDrawerSlug = `tree-create-${useId()}`\n\n const {\n getExpandedNodesForCollection,\n getTreeDataForCollection,\n toggleNodeForCollection,\n typeFieldName,\n } = useHierarchy()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const hierarchyConfig =\n collectionConfig.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy\n : undefined\n const parentFieldName = hierarchyConfig?.parentFieldName\n const treeLimit = hierarchyConfig?.admin?.treeLimit ?? DEFAULT_HIERARCHY_TREE_LIMIT\n const useAsTitle = useAsTitleProp ?? collectionConfig.admin?.useAsTitle\n\n const allPossibleTypeValues = useMemo(\n () =>\n hierarchyConfig?.relatedCollections\n ? Object.keys(hierarchyConfig.relatedCollections)\n : undefined,\n [hierarchyConfig?.relatedCollections],\n )\n\n const contextData = getTreeDataForCollection(collectionSlug)\n const baseFilterKey = baseFilter ? JSON.stringify(baseFilter) : ''\n const contextBaseFilterKey = contextData?.baseFilter ? JSON.stringify(contextData.baseFilter) : ''\n const initialData =\n baseFilterKey === contextBaseFilterKey ? (contextData ?? initialDataProp) : initialDataProp\n\n const expandedNodes = useMemo(() => {\n const contextExpanded = getExpandedNodesForCollection(collectionSlug)\n if (contextExpanded.size > 0) {\n return contextExpanded\n }\n return initialExpandedNodesProp ? new Set(initialExpandedNodesProp) : contextExpanded\n }, [collectionSlug, getExpandedNodesForCollection, initialExpandedNodesProp])\n\n const handleToggleNode = useCallback(\n ({ id }: { id: number | string }) => {\n toggleNodeForCollection(collectionSlug, id)\n },\n [collectionSlug, toggleNodeForCollection],\n )\n\n // Pre-populate cache with initialData synchronously before first render\n const childrenCache = useRef<Map<string, CachedChildren>>(new Map())\n\n const prevBaseFilterKeyRef = useRef(baseFilterKey)\n if (prevBaseFilterKeyRef.current !== baseFilterKey) {\n prevBaseFilterKeyRef.current = baseFilterKey\n childrenCache.current.clear()\n }\n\n useMemo(() => {\n if (!initialData || initialData.docs.length === 0) {\n return\n }\n\n const docsByParent = new Map<string, TreeDocument[]>()\n for (const doc of initialData.docs) {\n const parentId = doc[parentFieldName] || 'null'\n const parentKey = String(parentId)\n if (!docsByParent.has(parentKey)) {\n docsByParent.set(parentKey, [])\n }\n docsByParent.get(parentKey).push(doc)\n }\n\n const filterKey = filterByCollections?.length\n ? filterByCollections.slice().sort().join(',')\n : ''\n for (const [parentKey, docs] of docsByParent) {\n const cacheKey = `${collectionSlug}-${parentKey}-${filterKey}-${baseFilterKey}`\n const parentMeta = initialData.loadedParents[parentKey]\n\n if (parentMeta) {\n const loadedCount = parentMeta.loadedCount ?? docs.length\n childrenCache.current.set(cacheKey, {\n children: docs,\n hasMore: parentMeta.hasMore,\n page: Math.ceil(loadedCount / treeLimit) || 1,\n totalDocs: parentMeta.totalDocs,\n })\n } else {\n childrenCache.current.set(cacheKey, {\n children: docs,\n hasMore: false,\n page: 1,\n totalDocs: docs.length,\n })\n }\n }\n }, [initialData, filterByCollections, parentFieldName, collectionSlug, treeLimit, baseFilterKey])\n\n const treeRef = useRef<HTMLDivElement>(null)\n\n const {\n children: rootNodes,\n hasMore,\n isLoading,\n loadMore: loadMoreFromHook,\n refresh,\n totalDocs,\n } = useChildren({\n allPossibleTypeValues,\n baseFilter,\n cache: childrenCache,\n collectionSlug,\n enabled: true,\n filterByCollections,\n initialData,\n limit: treeLimit,\n parentFieldName,\n parentId: 'null',\n typeFieldName,\n useAsTitle,\n })\n\n const handleLoadMore = useCallback(async () => {\n await loadMoreFromHook()\n }, [loadMoreFromHook])\n\n const handleNodeClick = useCallback(\n ({ id }: { id: number | string }) => {\n onNodeClick?.({ id })\n },\n [onNodeClick],\n )\n\n const handleTreeKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n moveFocus('down')\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n moveFocus('up')\n }\n },\n [moveFocus],\n )\n\n if (isLoading && !rootNodes) {\n return (\n <div className={baseClass}>\n <DelayedSpinner baseClass={baseClass} isLoading={true} />\n </div>\n )\n }\n\n if (!rootNodes || rootNodes.length === 0) {\n const collectionLabel = getEntityConfig({ collectionSlug })\n return (\n <div className={baseClass}>\n <CreateDocumentButton\n buttonStyle=\"primary\"\n collections={[{ collectionSlug }]}\n drawerSlug={createDrawerSlug}\n label={t('general:createNewLabel', {\n label: getTranslation(collectionLabel.labels.singular, i18n),\n })}\n onSave={async () => {\n await refresh()\n router.refresh()\n }}\n />\n </div>\n )\n }\n\n const isAllSelected = selectedNodeId === null\n const handleAllClick = () => onNodeClick?.({ id: null })\n\n return (\n <div\n className={baseClass}\n onKeyDown={handleTreeKeyDown}\n ref={treeRef}\n role=\"tree\"\n tabIndex={-1}\n >\n <div\n aria-selected={isAllSelected}\n className={[\n `${baseClass}__all-option`,\n isAllSelected && `${baseClass}__all-option--selected`,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={handleAllClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleAllClick()\n }\n }}\n role=\"treeitem\"\n tabIndex={0}\n >\n {icon || <TagIcon color=\"muted\" />}\n <span>\n {t('general:all')}{' '}\n {getTranslation(getEntityConfig({ collectionSlug })?.labels?.plural, i18n)}\n </span>\n </div>\n {rootNodes.map((node) => {\n const nodeId: number | string = node.id\n const nodeIdStr = typeof nodeId === 'number' ? String(nodeId) : nodeId\n const nodeTitle = getDocumentTitle(node, useAsTitle)\n\n return (\n <TreeNode\n allPossibleTypeValues={allPossibleTypeValues}\n baseFilter={baseFilter}\n cache={childrenCache}\n collectionSlug={collectionSlug}\n depth={0}\n expandedNodes={expandedNodes}\n filterByCollections={filterByCollections}\n key={nodeIdStr}\n limit={treeLimit}\n node={{ id: nodeId, hasChildren: true, title: nodeTitle }}\n onSelect={handleNodeClick}\n onToggle={handleToggleNode}\n parentFieldName={parentFieldName}\n selected={nodeIdStr === String(selectedNodeId)}\n selectedNodeId={selectedNodeId}\n typeFieldName={typeFieldName}\n useAsTitle={useAsTitle}\n />\n )\n })}\n {hasMore && (\n <LoadMore\n currentCount={rootNodes.length}\n depth={0}\n id=\"load-more-root\"\n onLoadMore={handleLoadMore}\n totalDocs={totalDocs}\n />\n )}\n </div>\n )\n}\n\nexport const HierarchyTree: React.FC<HierarchyTreeProps> = (props) => {\n return (\n <TreeFocusProvider>\n <HierarchyTreeInner {...props} />\n </TreeFocusProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,10 @@
1
- @import '../../scss/styles.scss';
1
+ @import '../../../scss/styles.scss';
2
2
 
3
3
  .tree {
4
- // CSS variables for customization - defined once at the top level
5
4
  --tree-indent: 20px;
6
5
  --tree-chevron-width: 16px;
7
6
  --tree-chevron-spacing: 8px;
8
- --tree-node-padding-y: calc(var(--base) / 4); // 4px
7
+ --tree-node-padding-y: calc(var(--base) / 4);
9
8
  --tree-node-content-height: 24px;
10
9
  --tree-row-gap: 8px;
11
10
  --tree-font-size: 13px;
@@ -31,11 +30,9 @@
31
30
  &:hover {
32
31
  text-decoration: underline;
33
32
  }
34
-
35
33
  &:focus-visible {
36
34
  outline: var(--accessibility-outline);
37
35
  }
38
-
39
36
  &--selected {
40
37
  font-weight: 600;
41
38
  }
@@ -1,5 +1,32 @@
1
- import type { Where } from 'payload';
2
- import type { MutableRefObject, ReactNode } from 'react';
1
+ import type { TypeWithID, Where } from 'payload';
2
+ import type { ReactNode, RefObject } from 'react';
3
+ export type HierarchyDocument = {
4
+ [key: string]: unknown;
5
+ } & TypeWithID;
6
+ export type HierarchyInitialData = {
7
+ baseFilter?: null | Where;
8
+ docs: HierarchyDocument[];
9
+ loadedParents: Record<string, {
10
+ hasMore: boolean;
11
+ loadedCount?: number;
12
+ totalDocs: number;
13
+ }>;
14
+ };
15
+ export type HierarchyTreeProps = {
16
+ baseFilter?: null | Where;
17
+ collectionSlug: string;
18
+ filterByCollections?: string[];
19
+ icon?: ReactNode;
20
+ /** Initial data for first render (before context hydration). After hydration, context data takes precedence. */
21
+ initialData?: HierarchyInitialData | null;
22
+ /** Initial expanded nodes for first render (before context hydration). After hydration, context takes precedence. */
23
+ initialExpandedNodes?: (number | string)[];
24
+ onNodeClick?: ({ id }: {
25
+ id: null | number | string;
26
+ }) => void;
27
+ selectedNodeId?: null | number | string;
28
+ useAsTitle?: string;
29
+ };
3
30
  export type TreeDocument = {
4
31
  [key: string]: unknown;
5
32
  id: number | string;
@@ -15,7 +42,7 @@ export type CachedChildren = {
15
42
  page: number;
16
43
  totalDocs: number;
17
44
  };
18
- export type TreeCache = MutableRefObject<Map<string, CachedChildren>>;
45
+ export type TreeCache = RefObject<Map<string, CachedChildren>>;
19
46
  export type TreeInitialData = {
20
47
  docs: TreeDocument[];
21
48
  loadedParents: Record<string, {
@@ -24,27 +51,6 @@ export type TreeInitialData = {
24
51
  totalDocs: number;
25
52
  }>;
26
53
  };
27
- export type TreeProps = {
28
- allPossibleTypeValues?: string[];
29
- baseFilter?: null | Where;
30
- collectionSlug: string;
31
- expandedNodes: Set<number | string>;
32
- filterByCollections?: string[];
33
- icon?: ReactNode;
34
- initialData?: null | TreeInitialData;
35
- onNodeClick?: ({ id }: {
36
- id: null | number | string;
37
- }) => void;
38
- parentFieldName: string;
39
- selectedNodeId?: null | number | string;
40
- showAllOption?: boolean;
41
- toggleNode: ({ id }: {
42
- id: number | string;
43
- }) => void;
44
- treeLimit?: number;
45
- typeFieldName?: string;
46
- useAsTitle?: string;
47
- };
48
54
  export type TreeNodeProps = {
49
55
  allPossibleTypeValues?: string[];
50
56
  baseFilter?: null | Where;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Tree/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/elements/Hierarchy/Tree/types.ts"],"sourcesContent":["import type { TypeWithID, Where } from 'payload'\nimport type { ReactNode, RefObject } from 'react'\n\nexport type HierarchyDocument = {\n [key: string]: unknown\n} & TypeWithID\n\nexport type HierarchyInitialData = {\n baseFilter?: null | Where\n docs: HierarchyDocument[]\n // Metadata about what was loaded - keyed by parent ID ('null' for root)\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport type HierarchyTreeProps = {\n baseFilter?: null | Where\n collectionSlug: string\n filterByCollections?: string[]\n icon?: ReactNode\n /** Initial data for first render (before context hydration). After hydration, context data takes precedence. */\n initialData?: HierarchyInitialData | null\n /** Initial expanded nodes for first render (before context hydration). After hydration, context takes precedence. */\n initialExpandedNodes?: (number | string)[]\n onNodeClick?: ({ id }: { id: null | number | string }) => void\n selectedNodeId?: null | number | string\n useAsTitle?: string\n}\n\n// Tree primitive types (used by TreeNode, useChildren, HierarchyTree)\n\nexport type TreeDocument = {\n [key: string]: unknown\n id: number | string\n}\n\nexport type TreeNodeData = {\n hasChildren: boolean\n id: number | string\n title: string\n}\n\nexport type CachedChildren = {\n children: TreeDocument[]\n hasMore: boolean\n page: number\n totalDocs: number\n}\n\nexport type TreeCache = RefObject<Map<string, CachedChildren>>\n\nexport type TreeInitialData = {\n docs: TreeDocument[]\n loadedParents: Record<string, { hasMore: boolean; loadedCount?: number; totalDocs: number }>\n}\n\nexport type TreeNodeProps = {\n allPossibleTypeValues?: string[]\n baseFilter?: null | Where\n cache: TreeCache\n collectionSlug: string\n depth: number\n expandedNodes: Set<number | string>\n filterByCollections?: string[]\n limit: number\n node: TreeNodeData\n onSelect?: ({ id }: { id: number | string }) => void\n onToggle: ({ id }: { id: number | string }) => void\n parentFieldName: string\n selected?: boolean\n selectedNodeId?: number | string\n typeFieldName?: null | string\n useAsTitle?: string\n}\n"],"mappings":"AAuDA","ignoreList":[]}
@@ -5,6 +5,8 @@ type UseChildrenArgs = {
5
5
  /** Base filter to apply to all queries (e.g., tenant filter) */
6
6
  baseFilter?: null | Where;
7
7
  cache?: TreeCache;
8
+ /** Pre-computed cache key to ensure consistency with cache population */
9
+ cacheKey?: string;
8
10
  collectionSlug: string;
9
11
  enabled?: boolean;
10
12
  filterByCollections?: string[];
@@ -19,10 +21,12 @@ type UseChildrenReturn = {
19
21
  children: null | TreeDocument[];
20
22
  hasMore: boolean;
21
23
  isLoading: boolean;
24
+ /** Explicitly load children. Safe to call multiple times — no-ops if already loaded. */
25
+ load: () => Promise<TreeDocument[]>;
22
26
  loadMore: () => Promise<TreeDocument[]>;
23
27
  refresh: () => Promise<TreeDocument[]>;
24
28
  totalDocs: number;
25
29
  };
26
- export declare const useChildren: ({ allPossibleTypeValues, baseFilter, cache, collectionSlug, enabled, filterByCollections, initialData, limit, parentFieldName, parentId, typeFieldName, useAsTitle, }: UseChildrenArgs) => UseChildrenReturn;
30
+ export declare const useChildren: ({ allPossibleTypeValues, baseFilter, cache, cacheKey: cacheKeyProp, collectionSlug, enabled, filterByCollections, initialData, limit, parentFieldName, parentId, typeFieldName, useAsTitle, }: UseChildrenArgs) => UseChildrenReturn;
27
31
  export {};
28
32
  //# sourceMappingURL=useChildren.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChildren.d.ts","sourceRoot":"","sources":["../../../../src/elements/Hierarchy/Tree/useChildren.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAMpC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAK1E,KAAK,eAAe,GAAG;IACrB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;IAChC,gEAAgE;IAChE,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACzB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC9B,WAAW,CAAC,EAAE,IAAI,GAAG,eAAe,CAAA;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,IAAI,GAAG,YAAY,EAAE,CAAA;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,wFAAwF;IACxF,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACvC,OAAO,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACtC,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,WAAW,kMAcrB,eAAe,KAAG,iBAqPpB,CAAA"}