@anzusystems/common-admin 2.0.0-rc.5 → 2.0.0-rc.6

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 (679) hide show
  1. package/dist/AnzuSystemsCommonAdmin.d.ts +42 -32
  2. package/dist/AnzuSystemsCommonAdmin.js.map +1 -1
  3. package/dist/common-admin.css +1 -1
  4. package/dist/common-admin.js +282 -282
  5. package/dist/domains/anzuUser/api/anzuUserApi.d.ts +9 -12
  6. package/dist/domains/anzuUser/api/anzuUserApi.js.map +1 -1
  7. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js.map +1 -1
  8. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue.d.ts +38 -44
  9. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/domains/anzuUser/components/AAnzuUserFilter.js.map +1 -1
  11. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue.d.ts +12 -13
  12. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/domains/anzuUser/components/AAnzuUserForm.js.map +1 -1
  14. package/dist/domains/anzuUser/components/AAnzuUserForm.vue.d.ts +18 -20
  15. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js.map +1 -1
  17. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  18. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js.map +1 -1
  19. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  20. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js.map +1 -1
  21. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue.d.ts +2 -3
  22. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js.map +1 -1
  24. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue.d.ts +9 -15
  25. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js.map +1 -1
  27. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue.d.ts +8 -7
  28. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/domains/anzuUser/components/AUserManageButton.js.map +1 -1
  30. package/dist/domains/anzuUser/components/AUserManageButton.vue.d.ts +0 -1
  31. package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/domains/anzuUser/components/AUserMetadataForm.js.map +1 -1
  33. package/dist/domains/anzuUser/components/AUserMetadataForm.vue.d.ts +8 -9
  34. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js.map +1 -1
  36. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js.map +1 -1
  38. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue.d.ts +1 -2
  39. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/domains/anzuUser/components/AUserSystemOverview.js.map +1 -1
  41. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/domains/anzuUser/components/AUserSystemPanel.js.map +1 -1
  43. package/dist/domains/anzuUser/components/AUserSystemPanel.vue.d.ts +2 -2
  44. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js.map +1 -1
  46. package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/domains/anzuUser/components/AUserTabsShell.js.map +1 -1
  48. package/dist/domains/anzuUser/components/AUserTabsShell.vue.d.ts +17 -22
  49. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/domains/anzuUser/composables/anzuUserActions.d.ts +5 -9
  51. package/dist/domains/anzuUser/composables/anzuUserActions.js.map +1 -1
  52. package/dist/domains/anzuUser/composables/anzuUserValidations.d.ts +4 -6
  53. package/dist/domains/anzuUser/composables/anzuUserValidations.js.map +1 -1
  54. package/dist/domains/anzuUser/composables/cachedAnzuUsers.d.ts +3 -3
  55. package/dist/domains/anzuUser/composables/cachedAnzuUsers.js.map +1 -1
  56. package/dist/domains/anzuUser/composables/userCrossSystemSearch.d.ts +2 -4
  57. package/dist/domains/anzuUser/composables/userCrossSystemSearch.js.map +1 -1
  58. package/dist/domains/anzuUser/composables/userCrossSystemWrites.d.ts +5 -11
  59. package/dist/domains/anzuUser/composables/userCrossSystemWrites.js.map +1 -1
  60. package/dist/domains/anzuUser/composables/userSystemDescriptor.d.ts +33 -57
  61. package/dist/domains/anzuUser/composables/userSystemDescriptor.js.map +1 -1
  62. package/dist/domains/anzuUser/composables/userSystemProbe.d.ts +7 -27
  63. package/dist/domains/anzuUser/composables/userSystemProbe.js.map +1 -1
  64. package/dist/domains/anzuUser/filter/anzuUserFilter.d.ts +6 -16
  65. package/dist/domains/anzuUser/filter/anzuUserFilter.js.map +1 -1
  66. package/dist/domains/anzuUser/store/anzuUserStore.d.ts +1 -5
  67. package/dist/domains/anzuUser/store/anzuUserStore.js.map +1 -1
  68. package/dist/domains/anzuUser/store/userCrossSystemStore.d.ts +3 -14
  69. package/dist/domains/anzuUser/store/userCrossSystemStore.js.map +1 -1
  70. package/dist/domains/anzuUser/utils/userMetadataDiff.d.ts +7 -19
  71. package/dist/domains/anzuUser/utils/userMetadataDiff.js.map +1 -1
  72. package/dist/domains/anzuUser/utils/userSystemState.d.ts +12 -30
  73. package/dist/domains/anzuUser/utils/userSystemState.js.map +1 -1
  74. package/dist/domains/anzuUser/utils/userTabs.d.ts +1 -3
  75. package/dist/domains/anzuUser/utils/userTabs.js.map +1 -1
  76. package/dist/domains/api/composables/defineApiClient.d.ts +4 -8
  77. package/dist/domains/api/composables/defineApiClient.js.map +1 -1
  78. package/dist/domains/api/composables/request.d.ts +18 -48
  79. package/dist/domains/api/composables/request.js.map +1 -1
  80. package/dist/domains/api/composables/useApiFetchByIds.d.ts +7 -21
  81. package/dist/domains/api/composables/useApiFetchByIds.js.map +1 -1
  82. package/dist/domains/api/composables/useApiFetchItems.d.ts +18 -57
  83. package/dist/domains/api/composables/useApiFetchItems.js.map +1 -1
  84. package/dist/domains/api/composables/useApiFetchList.d.ts +7 -23
  85. package/dist/domains/api/composables/useApiFetchList.js.map +1 -1
  86. package/dist/domains/api/composables/useApiFetchListBatch.d.ts +5 -22
  87. package/dist/domains/api/composables/useApiFetchListBatch.js.map +1 -1
  88. package/dist/domains/api/composables/useApiQueryBuilder.js.map +1 -1
  89. package/dist/domains/api/composables/useApiRequest.d.ts +16 -39
  90. package/dist/domains/api/composables/useApiRequest.js.map +1 -1
  91. package/dist/domains/api/utils/apiErrors.d.ts +28 -55
  92. package/dist/domains/api/utils/apiErrors.js.map +1 -1
  93. package/dist/domains/api/utils/listBody.d.ts +22 -43
  94. package/dist/domains/api/utils/listBody.js.map +1 -1
  95. package/dist/domains/auth/components/Acl.js.map +1 -1
  96. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  97. package/dist/domains/auth/composables/aclAllowed.d.ts +2 -3
  98. package/dist/domains/auth/composables/aclAllowed.js.map +1 -1
  99. package/dist/domains/auth/composables/defineAuth.js.map +1 -1
  100. package/dist/domains/auth/composables/refreshSession.d.ts +10 -13
  101. package/dist/domains/auth/composables/refreshSession.js.map +1 -1
  102. package/dist/domains/cached/components/ACachedChip.js.map +1 -1
  103. package/dist/domains/cached/components/ACachedChip.vue.d.ts +13 -11
  104. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/domains/cached/components/ACachedUserChip.js +1 -1
  106. package/dist/domains/cached/components/ACachedUserChip.js.map +1 -1
  107. package/dist/domains/cached/components/ACachedUserChip.vue.d.ts +3 -3
  108. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  109. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.d.ts +9 -9
  110. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js.map +1 -1
  111. package/dist/domains/cached/composables/defineCached.d.ts +13 -11
  112. package/dist/domains/cached/composables/defineCached.js.map +1 -1
  113. package/dist/domains/cached/composables/useCachedItem.d.ts +7 -8
  114. package/dist/domains/cached/composables/useCachedItem.js.map +1 -1
  115. package/dist/domains/collab/components/ACollabLockedByUser.js.map +1 -1
  116. package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js.map +1 -1
  117. package/dist/domains/collab/composables/collabAnyDataChange.js.map +1 -1
  118. package/dist/domains/collab/composables/collabField.d.ts +5 -3
  119. package/dist/domains/collab/composables/collabField.js.map +1 -1
  120. package/dist/domains/collab/composables/collabInit.js +58 -54
  121. package/dist/domains/collab/composables/collabInit.js.map +1 -1
  122. package/dist/domains/collab/composables/collabRecovery.d.ts +49 -0
  123. package/dist/domains/collab/composables/collabRecovery.js +99 -0
  124. package/dist/domains/collab/composables/collabRecovery.js.map +1 -0
  125. package/dist/domains/collab/composables/collabRoom.js +106 -106
  126. package/dist/domains/collab/composables/collabRoom.js.map +1 -1
  127. package/dist/domains/collab/composables/collabState.d.ts +11 -4
  128. package/dist/domains/collab/composables/collabState.js +34 -25
  129. package/dist/domains/collab/composables/collabState.js.map +1 -1
  130. package/dist/domains/collab/composables/commonAdminCollabOptions.d.ts +4 -2
  131. package/dist/domains/collab/types/Collab.d.ts +31 -5
  132. package/dist/domains/collab/types/Collab.js +23 -11
  133. package/dist/domains/collab/types/Collab.js.map +1 -1
  134. package/dist/domains/customDataForm/components/ACustomDataForm.js.map +1 -1
  135. package/dist/domains/customDataForm/components/ACustomDataForm.vue.d.ts +7 -5
  136. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  137. package/dist/domains/customDataForm/components/ACustomDataFormElement.js.map +1 -1
  138. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js.map +1 -1
  139. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js.map +1 -1
  140. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue.d.ts +5 -3
  141. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  142. package/dist/domains/customDataForm/composables/useCustomDataForm.js.map +1 -1
  143. package/dist/domains/customDataForm/types/CustomDataForm.d.ts +4 -1
  144. package/dist/domains/dam/api/damAssetApi.d.ts +7 -7
  145. package/dist/domains/dam/api/damAssetApi.js.map +1 -1
  146. package/dist/domains/dam/api/damAssetLicenceApi.d.ts +1 -1
  147. package/dist/domains/dam/api/damAssetLicenceApi.js.map +1 -1
  148. package/dist/domains/dam/api/damConstants.js.map +1 -1
  149. package/dist/domains/dam/api/damEndPoints.js.map +1 -1
  150. package/dist/domains/dam/api/damImageApi.js.map +1 -1
  151. package/dist/domains/dam/api/uploadApi.js.map +1 -1
  152. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js.map +1 -1
  153. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue.d.ts +7 -5
  154. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js.map +1 -1
  155. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js.map +1 -1
  156. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  157. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js.map +1 -1
  158. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue.d.ts +1 -1
  159. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  160. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue.d.ts +5 -3
  161. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js.map +1 -1
  162. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js.map +1 -1
  163. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js.map +1 -1
  164. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  165. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js.map +1 -1
  166. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js.map +1 -1
  167. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js.map +1 -1
  168. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue.d.ts +1 -1
  169. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
  170. package/dist/domains/dam/assetDetail/components/AssetImage.js.map +1 -1
  171. package/dist/domains/dam/assetDetail/components/AssetImage.vue.d.ts +1 -1
  172. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  173. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js.map +1 -1
  174. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue.d.ts +2 -2
  175. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js.map +1 -1
  176. package/dist/domains/dam/assetDetail/components/AssetInfobox.js.map +1 -1
  177. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  178. package/dist/domains/dam/assetDetail/components/AssetMetadata.js.map +1 -1
  179. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  180. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.d.ts +5 -6
  181. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js.map +1 -1
  182. package/dist/domains/dam/assetDetail/composables/assetDetailView.d.ts +10 -10
  183. package/dist/domains/dam/assetDetail/composables/assetDetailView.js.map +1 -1
  184. package/dist/domains/dam/assetDetail/store/assetDetailStore.js.map +1 -1
  185. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.d.ts +4 -3
  186. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js.map +1 -1
  187. package/dist/domains/dam/assetSelect/api/damPodcastApi.js.map +1 -1
  188. package/dist/domains/dam/assetSelect/components/AAssetListInner.js.map +1 -1
  189. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue.d.ts +789 -787
  190. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  191. package/dist/domains/dam/assetSelect/components/AAssetSelect.js.map +1 -1
  192. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue.d.ts +395 -393
  193. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  194. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js.map +1 -1
  195. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue.d.ts +14 -12
  196. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js.map +1 -1
  197. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js.map +1 -1
  198. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  199. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js.map +1 -1
  200. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue.d.ts +9 -7
  201. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  202. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js.map +1 -1
  203. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  204. package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js.map +1 -1
  205. package/dist/domains/dam/assetSelect/store/assetSelectStore.js.map +1 -1
  206. package/dist/domains/dam/author/api/authorApi.js.map +1 -1
  207. package/dist/domains/dam/author/components/AuthorCreateButton.js.map +1 -1
  208. package/dist/domains/dam/author/components/AuthorCreateButton.vue.d.ts +1 -1
  209. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  210. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js.map +1 -1
  211. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue.d.ts +9 -6
  212. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  213. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js.map +1 -1
  214. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  215. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -1
  216. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js.map +1 -1
  217. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue.d.ts +2 -2
  218. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  219. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js.map +1 -1
  220. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue.d.ts +1 -1
  221. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  222. package/dist/domains/dam/author/composables/cachedAuthors.d.ts +5 -4
  223. package/dist/domains/dam/author/composables/cachedAuthors.js.map +1 -1
  224. package/dist/domains/dam/author/composables/cachedUsers.d.ts +5 -4
  225. package/dist/domains/dam/author/composables/cachedUsers.js.map +1 -1
  226. package/dist/domains/dam/author/composables/damAuthorConfig.d.ts +2 -2
  227. package/dist/domains/dam/author/composables/damAuthorConfig.js.map +1 -1
  228. package/dist/domains/dam/components/DamAdminAssetLink.js.map +1 -1
  229. package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
  230. package/dist/domains/dam/composables/commonAdminCoreDamOptions.d.ts +10 -8
  231. package/dist/domains/dam/composables/commonAdminCoreDamOptions.js.map +1 -1
  232. package/dist/domains/dam/composables/damConfigName.d.ts +8 -9
  233. package/dist/domains/dam/composables/damConfigName.js.map +1 -1
  234. package/dist/domains/dam/composables/damNotifications.d.ts +9 -9
  235. package/dist/domains/dam/composables/damNotifications.js.map +1 -1
  236. package/dist/domains/dam/composables/damNotificationsConnection.d.ts +4 -4
  237. package/dist/domains/dam/composables/damNotificationsConnection.js.map +1 -1
  238. package/dist/domains/dam/composables/damNotificationsEventBus.d.ts +2 -2
  239. package/dist/domains/dam/composables/damNotificationsEventBus.js.map +1 -1
  240. package/dist/domains/dam/composables/extSystemIdForCached.d.ts +5 -4
  241. package/dist/domains/dam/composables/extSystemIdForCached.js.map +1 -1
  242. package/dist/domains/dam/config/api/damAssetCustomFormApi.js.map +1 -1
  243. package/dist/domains/dam/config/api/damConfigApi.js.map +1 -1
  244. package/dist/domains/dam/config/composables/damConfigState.d.ts +5 -5
  245. package/dist/domains/dam/config/composables/damConfigState.js.map +1 -1
  246. package/dist/domains/dam/config/store/damConfigStore.d.ts +5 -4
  247. package/dist/domains/dam/config/store/damConfigStore.js.map +1 -1
  248. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.d.ts +3 -1
  249. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js.map +1 -1
  250. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  251. package/dist/domains/dam/cropper/components/ACropper.vue.d.ts +8 -16
  252. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  253. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js.map +1 -1
  254. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  255. package/dist/domains/dam/cropper/store/imageRoiStore.d.ts +9 -12
  256. package/dist/domains/dam/cropper/store/imageRoiStore.js.map +1 -1
  257. package/dist/domains/dam/cropper/utils/cropperGeometry.d.ts +24 -38
  258. package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
  259. package/dist/domains/dam/cropper/utils/cropperJsService.d.ts +3 -7
  260. package/dist/domains/dam/cropper/utils/cropperJsService.js +10 -3
  261. package/dist/domains/dam/cropper/utils/cropperJsService.js.map +1 -1
  262. package/dist/domains/dam/cropper/utils/cropperTypes.d.ts +3 -6
  263. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.d.ts +5 -5
  264. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js.map +1 -1
  265. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js.map +1 -1
  266. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  267. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js.map +1 -1
  268. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  269. package/dist/domains/dam/imageWidget/components/AImageWidget.js.map +1 -1
  270. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js.map +1 -1
  272. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js.map +1 -1
  273. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue.d.ts +43 -41
  274. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue.d.ts +31 -29
  275. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js.map +1 -1
  276. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue.d.ts +29 -27
  277. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  278. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js.map +1 -1
  279. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue.d.ts +1 -1
  280. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  281. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js.map +1 -1
  282. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue.d.ts +68 -66
  283. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  284. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js.map +1 -1
  285. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue.d.ts +402 -400
  286. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  287. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js.map +1 -1
  288. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue.d.ts +384 -382
  289. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  290. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js.map +1 -1
  291. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
  292. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js.map +1 -1
  293. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  294. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue.d.ts +7 -5
  295. package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js.map +1 -1
  296. package/dist/domains/dam/imageWidget/composables/imageApiCms.js.map +1 -1
  297. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.d.ts +11 -13
  298. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js.map +1 -1
  299. package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js.map +1 -1
  300. package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js.map +1 -1
  301. package/dist/domains/dam/imageWidget/store/imageStore.js.map +1 -1
  302. package/dist/domains/dam/imageWidget/utils/damImage.d.ts +5 -6
  303. package/dist/domains/dam/imageWidget/utils/damImage.js.map +1 -1
  304. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.d.ts +1 -2
  305. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js.map +1 -1
  306. package/dist/domains/dam/imageWidget/utils/imageSaves.d.ts +10 -14
  307. package/dist/domains/dam/imageWidget/utils/imageSaves.js.map +1 -1
  308. package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js.map +1 -1
  309. package/dist/domains/dam/imageWidget/utils/waitLimit.d.ts +4 -6
  310. package/dist/domains/dam/imageWidget/utils/waitLimit.js.map +1 -1
  311. package/dist/domains/dam/keyword/api/keywordApi.js.map +1 -1
  312. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js.map +1 -1
  313. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue.d.ts +1 -1
  314. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  315. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js.map +1 -1
  316. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue.d.ts +8 -5
  317. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  318. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -1
  319. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js.map +1 -1
  320. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue.d.ts +2 -2
  321. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js.map +1 -1
  322. package/dist/domains/dam/keyword/composables/cachedKeywords.d.ts +5 -4
  323. package/dist/domains/dam/keyword/composables/cachedKeywords.js.map +1 -1
  324. package/dist/domains/dam/keyword/composables/damKeywordConfig.d.ts +2 -2
  325. package/dist/domains/dam/keyword/composables/damKeywordConfig.js.map +1 -1
  326. package/dist/domains/dam/types/Asset.d.ts +1 -1
  327. package/dist/domains/dam/types/Asset.js.map +1 -1
  328. package/dist/domains/dam/types/UploadQueue.d.ts +5 -4
  329. package/dist/domains/dam/types/UploadQueue.js.map +1 -1
  330. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js.map +1 -1
  331. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js.map +1 -1
  332. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js.map +1 -1
  333. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue.d.ts +2 -2
  334. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  335. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js.map +1 -1
  336. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  337. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js.map +1 -1
  338. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js.map +1 -1
  339. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js.map +1 -1
  340. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue.d.ts +6 -4
  341. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  342. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js.map +1 -1
  343. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue.d.ts +1 -1
  344. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js.map +1 -1
  345. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js.map +1 -1
  346. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js.map +1 -1
  347. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js.map +1 -1
  348. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue.d.ts +6 -6
  349. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  350. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js.map +1 -1
  351. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue.d.ts +13 -13
  352. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  353. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.d.ts +13 -13
  354. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js.map +1 -1
  355. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.d.ts +2 -2
  356. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js.map +1 -1
  357. package/dist/domains/dam/uploadQueue/composables/uploadMeter.d.ts +12 -12
  358. package/dist/domains/dam/uploadQueue/composables/uploadMeter.js.map +1 -1
  359. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.d.ts +5 -5
  360. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js.map +1 -1
  361. package/dist/domains/dam/uploadQueue/composables/uploadService.d.ts +2 -3
  362. package/dist/domains/dam/uploadQueue/composables/uploadService.js.map +1 -1
  363. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.d.ts +5 -4
  364. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js.map +1 -1
  365. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.d.ts +3 -2
  366. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js.map +1 -1
  367. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.d.ts +8 -5
  368. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js.map +1 -1
  369. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.d.ts +3 -3
  370. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js.map +1 -1
  371. package/dist/domains/dam/uploadQueue/presets/queuePresets.d.ts +8 -5
  372. package/dist/domains/dam/uploadQueue/presets/queuePresets.js.map +1 -1
  373. package/dist/domains/dam/uploadQueue/presets/uploadPresets.d.ts +15 -13
  374. package/dist/domains/dam/uploadQueue/presets/uploadPresets.js.map +1 -1
  375. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.d.ts +7 -7
  376. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js.map +1 -1
  377. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.d.ts +4 -4
  378. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js.map +1 -1
  379. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.d.ts +28 -30
  380. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js.map +1 -1
  381. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.d.ts +2 -2
  382. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js.map +1 -1
  383. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.d.ts +2 -2
  384. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js.map +1 -1
  385. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.d.ts +63 -73
  386. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js.map +1 -1
  387. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.d.ts +8 -9
  388. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js.map +1 -1
  389. package/dist/domains/dam/user/api/userApi.d.ts +2 -2
  390. package/dist/domains/dam/user/api/userApi.js.map +1 -1
  391. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js.map +1 -1
  392. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue.d.ts +1 -1
  393. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  394. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js.map +1 -1
  395. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue.d.ts +1 -1
  396. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  397. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js.map +1 -1
  398. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue.d.ts +1 -1
  399. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  400. package/dist/domains/dam/user/composables/damUserSelectActions.d.ts +1 -1
  401. package/dist/domains/dam/user/composables/damUserSelectActions.js.map +1 -1
  402. package/dist/domains/dam/user/types/DamDistributionServiceType.d.ts +2 -2
  403. package/dist/domains/dam/user/types/DamDistributionServiceType.js.map +1 -1
  404. package/dist/domains/dam/user/types/DamExternalProviderAssetType.d.ts +1 -1
  405. package/dist/domains/dam/user/types/DamExternalProviderAssetType.js.map +1 -1
  406. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js.map +1 -1
  407. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  408. package/dist/domains/filters/bookmarks/store/bookmarksStore.d.ts +3 -3
  409. package/dist/domains/filters/bookmarks/store/bookmarksStore.js.map +1 -1
  410. package/dist/domains/filters/components/AFilterDatetimePicker.js.map +1 -1
  411. package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  412. package/dist/domains/filters/components/AFilterInteger.js.map +1 -1
  413. package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js.map +1 -1
  414. package/dist/domains/filters/components/AFilterString.js.map +1 -1
  415. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js.map +1 -1
  416. package/dist/domains/filters/components/AFilterTimeInterval.js +1 -1
  417. package/dist/domains/filters/components/AFilterTimeInterval.js.map +1 -1
  418. package/dist/domains/filters/components/AFilterTimeInterval.vue.d.ts +5 -3
  419. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js.map +1 -1
  420. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js.map +1 -1
  421. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  422. package/dist/domains/filters/components/AFilterWrapper.vue.d.ts +17 -15
  423. package/dist/domains/filters/components/AFilterWrapperSidebar.vue.d.ts +5 -3
  424. package/dist/domains/filters/components/FiltersSelected.js.map +1 -1
  425. package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js.map +1 -1
  426. package/dist/domains/filters/composables/filterFactory.d.ts +16 -26
  427. package/dist/domains/filters/composables/filterFactory.js +38 -31
  428. package/dist/domains/filters/composables/filterFactory.js.map +1 -1
  429. package/dist/domains/filters/datatable/components/ADatatableOrdering.js.map +1 -1
  430. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +3 -1
  431. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js.map +1 -1
  432. package/dist/domains/filters/datatable/components/ADatatablePagination.js.map +1 -1
  433. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +2 -4
  434. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  435. package/dist/domains/filters/utils/filterInjectionKeys.js.map +1 -1
  436. package/dist/domains/form/components/AFormDatetimePicker.js.map +1 -1
  437. package/dist/domains/form/components/AFormDatetimePicker.vue.d.ts +7 -5
  438. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  439. package/dist/domains/form/components/AFormFlagDatetimePicker.js.map +1 -1
  440. package/dist/domains/form/components/AFormFlagDatetimePicker.vue.d.ts +7 -5
  441. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  442. package/dist/domains/form/components/AFormSwitch.vue.d.ts +7 -5
  443. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  444. package/dist/domains/form/components/AFormTextField.vue.d.ts +9 -7
  445. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  446. package/dist/domains/form/components/AFormTextarea.vue.d.ts +13 -11
  447. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue.d.ts +7 -5
  448. package/dist/domains/form/components/ASystemEntityScope.vue.d.ts +5 -3
  449. package/dist/domains/job/api/jobApi.js.map +1 -1
  450. package/dist/domains/job/components/AJobDetailCommon.vue.d.ts +5 -3
  451. package/dist/domains/listEditor/components/AListEditor.js.map +1 -1
  452. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  453. package/dist/domains/listEditor/components/ANestedSortableListEditor.js.map +1 -1
  454. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue.d.ts +2 -3
  455. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  456. package/dist/domains/listEditor/components/ASortableListEditor.js.map +1 -1
  457. package/dist/domains/listEditor/components/ASortableListEditor.vue.d.ts +2 -3
  458. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  459. package/dist/domains/listEditor/composables/useListEditorController.d.ts +4 -5
  460. package/dist/domains/listEditor/composables/useListEditorController.js.map +1 -1
  461. package/dist/domains/listEditor/composables/useNestedListEditor.d.ts +3 -4
  462. package/dist/domains/listEditor/composables/useNestedListEditor.js.map +1 -1
  463. package/dist/domains/listEditor/composables/useNestedListEditorController.d.ts +5 -4
  464. package/dist/domains/listEditor/composables/useNestedListEditorController.js.map +1 -1
  465. package/dist/domains/listEditor/composables/useReorderMode.js.map +1 -1
  466. package/dist/domains/listEditor/types/listEditorTypes.d.ts +2 -2
  467. package/dist/domains/listEditor/utils/listEditorLoader.d.ts +5 -5
  468. package/dist/domains/listEditor/utils/listEditorLoader.js.map +1 -1
  469. package/dist/domains/listEditor/utils/resolveCompactText.js.map +1 -1
  470. package/dist/domains/log/api/logApi.d.ts +2 -3
  471. package/dist/domains/log/api/logApi.js.map +1 -1
  472. package/dist/domains/log/components/ALogDatatable.js.map +1 -1
  473. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  474. package/dist/domains/log/components/ALogDetailView.js.map +1 -1
  475. package/dist/domains/log/components/ALogDetailView.vue.d.ts +1 -1
  476. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  477. package/dist/domains/log/components/ALogFilter.js.map +1 -1
  478. package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js.map +1 -1
  479. package/dist/domains/log/components/ALogListView.js.map +1 -1
  480. package/dist/domains/log/components/ALogListView.vue.d.ts +1 -1
  481. package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  482. package/dist/domains/log/composables/logActions.d.ts +4 -5
  483. package/dist/domains/log/composables/logActions.js.map +1 -1
  484. package/dist/domains/log/composables/logType.d.ts +6 -7
  485. package/dist/domains/log/composables/logType.js.map +1 -1
  486. package/dist/domains/log/filter/logFilter.d.ts +8 -11
  487. package/dist/domains/log/filter/logFilter.js.map +1 -1
  488. package/dist/domains/permission/components/APermissionEditor.js.map +1 -1
  489. package/dist/domains/permission/components/APermissionEditor.vue.d.ts +4 -4
  490. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js.map +1 -1
  491. package/dist/domains/permission/composables/permissionActions.d.ts +3 -6
  492. package/dist/domains/permission/composables/permissionActions.js.map +1 -1
  493. package/dist/domains/permission/config/api/permissionConfigApi.d.ts +2 -2
  494. package/dist/domains/permission/config/api/permissionConfigApi.js.map +1 -1
  495. package/dist/domains/permission/config/composables/permissionConfigActions.d.ts +3 -7
  496. package/dist/domains/permission/config/composables/permissionConfigActions.js.map +1 -1
  497. package/dist/domains/permission/config/store/permissionConfigStore.d.ts +2 -4
  498. package/dist/domains/permission/config/store/permissionConfigStore.js.map +1 -1
  499. package/dist/domains/permission/group/api/permissionGroupApi.d.ts +8 -10
  500. package/dist/domains/permission/group/api/permissionGroupApi.js.map +1 -1
  501. package/dist/domains/permission/group/components/APermissionGroupDatatable.js.map +1 -1
  502. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue.d.ts +12 -10
  503. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  504. package/dist/domains/permission/group/components/APermissionGroupDetail.js.map +1 -1
  505. package/dist/domains/permission/group/components/APermissionGroupDetail.vue.d.ts +21 -22
  506. package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
  507. package/dist/domains/permission/group/components/APermissionGroupManage.js.map +1 -1
  508. package/dist/domains/permission/group/components/APermissionGroupManage.vue.d.ts +21 -22
  509. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js.map +1 -1
  510. package/dist/domains/permission/group/composables/cachedPermissionGroups.js.map +1 -1
  511. package/dist/domains/permission/group/composables/permissionGroupActions.d.ts +6 -8
  512. package/dist/domains/permission/group/composables/permissionGroupActions.js.map +1 -1
  513. package/dist/domains/permission/group/composables/permissionGroupValidations.d.ts +2 -3
  514. package/dist/domains/permission/group/composables/permissionGroupValidations.js.map +1 -1
  515. package/dist/domains/permission/group/filter/permissionGroupFilter.d.ts +2 -3
  516. package/dist/domains/permission/group/filter/permissionGroupFilter.js.map +1 -1
  517. package/dist/domains/permission/group/store/permissionGroupStore.d.ts +3 -6
  518. package/dist/domains/permission/group/store/permissionGroupStore.js.map +1 -1
  519. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js.map +1 -1
  520. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  521. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js.map +1 -1
  522. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js.map +1 -1
  523. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js.map +1 -1
  524. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  525. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue.d.ts +5 -3
  526. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.d.ts +11 -13
  527. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js.map +1 -1
  528. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue.d.ts +13 -11
  529. package/dist/domains/subjectSelect/components/ASubjectSelect.js.map +1 -1
  530. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  531. package/dist/domains/subjectSelect/composables/useSubjectSelect.js +53 -51
  532. package/dist/domains/subjectSelect/composables/useSubjectSelect.js.map +1 -1
  533. package/dist/domains/system/appShell/components/AActionbar.vue.d.ts +7 -5
  534. package/dist/domains/system/appShell/components/ALayoutSwitch.js.map +1 -1
  535. package/dist/domains/system/appShell/components/ALayoutSwitch.vue.d.ts +7 -5
  536. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  537. package/dist/domains/system/appShell/composables/teleportSlot.d.ts +0 -1
  538. package/dist/domains/system/appShell/composables/teleportSlot.js.map +1 -1
  539. package/dist/domains/system/components/AAlerts.js.map +1 -1
  540. package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js.map +1 -1
  541. package/dist/domains/system/composables/alerts.js.map +1 -1
  542. package/dist/domains/system/composables/breadcrumbs.d.ts +3 -3
  543. package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
  544. package/dist/domains/system/composables/languageSettings.js.map +1 -1
  545. package/dist/domains/system/composables/loginStatus.js.map +1 -1
  546. package/dist/domains/system/composables/navigationError.d.ts +6 -8
  547. package/dist/domains/system/composables/navigationError.js.map +1 -1
  548. package/dist/domains/system/composables/pageNavigation.d.ts +9 -10
  549. package/dist/domains/system/composables/pageNavigation.js.map +1 -1
  550. package/dist/domains/system/composables/recordActions.d.ts +14 -22
  551. package/dist/domains/system/composables/recordActions.js.map +1 -1
  552. package/dist/domains/system/composables/recordPage.d.ts +23 -38
  553. package/dist/domains/system/composables/recordPage.js.map +1 -1
  554. package/dist/domains/system/composables/routeHistory.d.ts +4 -5
  555. package/dist/domains/system/composables/routeHistory.js.map +1 -1
  556. package/dist/domains/system/composables/sentry.js.map +1 -1
  557. package/dist/domains/system/composables/useDebugFeatures.d.ts +3 -6
  558. package/dist/domains/system/composables/useDebugFeatures.js.map +1 -1
  559. package/dist/domains/system/store/datatablePageStore.d.ts +8 -1
  560. package/dist/domains/system/store/datatablePageStore.js +10 -3
  561. package/dist/domains/system/store/datatablePageStore.js.map +1 -1
  562. package/dist/domains/system/systemBar/components/ASystemBar.js.map +1 -1
  563. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  564. package/dist/domains/system/systemBar/utils/appReload.d.ts +5 -5
  565. package/dist/domains/system/systemBar/utils/appReload.js.map +1 -1
  566. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js.map +1 -1
  567. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue.d.ts +2 -3
  568. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js.map +1 -1
  569. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js.map +1 -1
  570. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  571. package/dist/domains/ui/buttons/components/ABtnSplit.vue.d.ts +9 -7
  572. package/dist/domains/ui/components/AAvatarColorPicker.js.map +1 -1
  573. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  574. package/dist/domains/ui/components/ACard.js.map +1 -1
  575. package/dist/domains/ui/components/ACard.vue.d.ts +7 -3
  576. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +6 -2
  577. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  578. package/dist/domains/ui/components/ACardLoader.js.map +1 -1
  579. package/dist/domains/ui/components/ACardLoader.vue.d.ts +1 -0
  580. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +13 -7
  581. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  582. package/dist/domains/ui/components/AChipNoLink.vue.d.ts +5 -3
  583. package/dist/domains/ui/components/ACopyText.vue.d.ts +9 -7
  584. package/dist/domains/ui/components/ACreateDialog.js.map +1 -1
  585. package/dist/domains/ui/components/ACreateDialog.vue.d.ts +11 -9
  586. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  587. package/dist/domains/ui/components/ADialogToolbar.vue.d.ts +5 -3
  588. package/dist/domains/ui/components/ARow.vue.d.ts +5 -3
  589. package/dist/domains/ui/components/ATimeTrackingFields.js.map +1 -1
  590. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  591. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js.map +1 -1
  592. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue.d.ts +3 -5
  593. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js.map +1 -1
  594. package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -1
  595. package/dist/domains/ui/datetime/components/ADatetimePicker.js.map +1 -1
  596. package/dist/domains/ui/datetime/components/ADatetimePicker.vue.d.ts +5 -3
  597. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  598. package/dist/domains/ui/file/components/AFileDropzone.js.map +1 -1
  599. package/dist/domains/ui/file/components/AFileDropzone.vue.d.ts +1 -1
  600. package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js.map +1 -1
  601. package/dist/domains/ui/file/components/AFileInput.js.map +1 -1
  602. package/dist/domains/ui/file/components/AFileInput.vue.d.ts +9 -7
  603. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
  604. package/dist/domains/ui/file/components/AFileInputDialog.js.map +1 -1
  605. package/dist/domains/ui/file/components/AFileInputDialog.vue.d.ts +9 -7
  606. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  607. package/dist/domains/ui/file/composables/dropzone.js.map +1 -1
  608. package/dist/domains/ui/file/composables/formatAndSizeCheck.js.map +1 -1
  609. package/dist/domains/ui/view/components/AGenericView.vue.d.ts +7 -5
  610. package/dist/domains/ui/view/components/ALoginView.js +1 -1
  611. package/dist/domains/ui/view/components/ALoginView.js.map +1 -1
  612. package/dist/domains/ui/view/components/ALoginView.vue.d.ts +5 -3
  613. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  614. package/dist/domains/ui/view/components/ALogoutView.js.map +1 -1
  615. package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  616. package/dist/domains/ui/view/components/ANotFoundView.js.map +1 -1
  617. package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js.map +1 -1
  618. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.d.ts +6 -7
  619. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js.map +1 -1
  620. package/dist/lib.d.ts +2 -2
  621. package/dist/plugins/commonVuetifyConfig.d.ts +3 -3
  622. package/dist/plugins/commonVuetifyConfig.js.map +1 -1
  623. package/dist/plugins/i18n.d.ts +4 -5
  624. package/dist/plugins/i18n.js.map +1 -1
  625. package/dist/plugins/pluginOptions.d.ts +4 -2
  626. package/dist/plugins/pluginOptions.js.map +1 -1
  627. package/dist/plugins/webfontloader.js.map +1 -1
  628. package/dist/shared/error/AnzuApiCancelledError.d.ts +5 -8
  629. package/dist/shared/error/AnzuApiCancelledError.js.map +1 -1
  630. package/dist/shared/error/AnzuError.d.ts +3 -5
  631. package/dist/shared/error/AnzuError.js.map +1 -1
  632. package/dist/shared/error/AuthUnavailableError.d.ts +3 -3
  633. package/dist/shared/error/AuthUnavailableError.js.map +1 -1
  634. package/dist/shared/error/isInCauseChain.d.ts +2 -2
  635. package/dist/shared/error/isInCauseChain.js.map +1 -1
  636. package/dist/shared/types/UserAndTimeTracking.d.ts +5 -5
  637. package/dist/shared/types/Validation.d.ts +4 -5
  638. package/dist/shared/types/common.d.ts +1 -3
  639. package/dist/shared/types/globalComponents.d.ts +5 -6
  640. package/dist/shared/utils/common.js.map +1 -1
  641. package/dist/shared/utils/datetime.d.ts +0 -1
  642. package/dist/shared/utils/datetime.js.map +1 -1
  643. package/dist/shared/utils/datetimePickerValue.d.ts +4 -7
  644. package/dist/shared/utils/datetimePickerValue.js.map +1 -1
  645. package/dist/shared/utils/development.d.ts +3 -3
  646. package/dist/shared/utils/development.js.map +1 -1
  647. package/dist/shared/utils/envConfig.d.ts +4 -4
  648. package/dist/shared/utils/envConfig.js.map +1 -1
  649. package/dist/shared/utils/json.d.ts +1 -1
  650. package/dist/shared/utils/json.js.map +1 -1
  651. package/dist/shared/utils/userAndTimeTracking.d.ts +5 -7
  652. package/dist/shared/utils/userAndTimeTracking.js.map +1 -1
  653. package/dist/shared/validators/vuelidate/common/useValidateHexColor.d.ts +3 -5
  654. package/dist/shared/validators/vuelidate/common/useValidateHexColor.js.map +1 -1
  655. package/dist/testing/appShell.d.ts +11 -11
  656. package/dist/testing/appShell.js.map +1 -1
  657. package/dist/testing/closeButtons.d.ts +9 -11
  658. package/dist/testing/closeButtons.js.map +1 -1
  659. package/dist/testing/declaredDependencies.d.ts +7 -7
  660. package/dist/testing/declaredDependencies.js.map +1 -1
  661. package/dist/testing/generatedRoutes.d.ts +6 -11
  662. package/dist/testing/generatedRoutes.js.map +1 -1
  663. package/dist/testing/routeHistory.d.ts +5 -12
  664. package/dist/testing/routeHistory.js.map +1 -1
  665. package/dist/testing/sortableLists.d.ts +16 -21
  666. package/dist/testing/sortableLists.js.map +1 -1
  667. package/dist/testing/typedRouter.d.ts +0 -1
  668. package/dist/testing/typedRouter.js.map +1 -1
  669. package/package.json +27 -27
  670. package/src/eslint/adminConfig.mjs +19 -27
  671. package/src/eslint/globalComponentNames.mjs +3 -4
  672. package/src/eslint/oxlint.mjs +7 -20
  673. package/src/eslint/plugin.d.mts +2 -4
  674. package/src/eslint/plugin.mjs +18 -34
  675. package/src/eslint/validRouteName.mjs +6 -7
  676. package/src/vite/devWatch.mjs +30 -43
  677. package/src/vite/index.d.mts +5 -5
  678. package/src/vite/sentry.mjs +7 -12
  679. package/src/vite/sourcemaps.mjs +4 -8
@@ -1 +1 @@
1
- {"version":3,"file":"ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js","names":["_useModel","resolveCompactText","resolveCompactTextUtil","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_mergeProps","_toDisplayString","_createCommentVNode","_normalizeProps","_guardReactiveProps","_createVNode","LeStatus","_component_VBtn","_withCtx","_createTextVNode","_Fragment","_createBlock","_component_VIcon","_component_VTooltip","_component_VProgressCircular","_component_VAlert","LeEmptyState","_renderList","LeNestedRow","_normalizeStyle","LeMoveToPositionDialog","LeChangeParentDialog","LeDeleteDialog","_isRef","LeDeleteDialog_default","LeMoveToPositionDialog_default","LeEmptyState_default","LeStatus_default","LeNestedRow_default","LeChangeParentDialog_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","GROUP_CLASS","INDENT_PX","ANCHOR_X","ANestedSortableListEditor_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"mode\"","\"modeModifiers\"","__expose","__emit","props","__props","emit","modelProp","useModel","pendingWrite","modelValue","customRef","current","v","trigger","nextTick","mode","useI18n","slots","useSlots","useAlerts","rootEl","useTemplateRef","useContainerWidth","isTouch","useIsTouchDevice","effectiveCloseVariant","computed","isNarrow","childrenExpandedKeys","ref","detailExpandedKeys","getKeyOpt","keyFieldName","keyOf","data","positionFieldName","p","walk","nodes","tree","controllerOptions","stateEntry","useNestedListEditorStateEntry","controller","useNestedListEditorController","rowStateScope","provideListEditorStateScope","flatViewItems","flat","flatIndex","maxDepth","i","node","key","childrenAllowed","hasChildren","childrenCount","remainingDepth","depth","parentNode","vi","snapshot","shallowRef","movedKeys","sessionDeferredDeletes","sessionImmediateDeletes","commit","saved","markMoved","collect","n","decoratorCache","viewItemsDecorated","next","liveKeys","editing","editingKeys","expanded","childrenExpanded","loading","moved","dirty","unsaved","cached","decorated","isEmpty","totalItemCount","rowsContainer","canInteract","canEnterReorder","isInlineEdit","hasReadonlyDetail","showInlineSaveFooter","useInlineEditing","keys","parent","useReorderMode","cloneDeep","m","clearEditing","k","expandableKeys","dragEnabled","initSortables","destroySortables","payload","err","nestedPendingCount","movedCount","nestedPendingChanges","hasPendingChanges","canAdd","reorderMode","addLabelResolved","t","emptyTitleResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","reorderToggleVisible","compactReorderButton","out","allExpanded","expandAllVisible","toggleExpandAll","headerVisible","sortableInstances","forceRerender","s","dragState","hitTestRow","hit","clientX","clientY","wrapper","parseKey","recomputeInstruction","containerRect","rowRect","computeInstruction","onPointerMove","applyInstruction","sourceKey","inst","showWarningT","groups","group","sortable","useSortable","DRAG_GHOST_CLASS","DRAG_CHOSEN_CLASS","DRAG_CLASS","draggedEl","event","id","draggedNode","subtreeDepth","orig","tev","state","raw","stringToInt","watch","onMounted","onBeforeUnmount","overlayVisual","refWrapper","rowEl","lineLeft","lineTop","line","connector","levelWrapper","levelRect","levelCentreY","onAddClick","requestAutoOpen","onRowAddAfterClick","onAddChildClick","onEditClick","onCloseClick","beginEdit","onChevronClick","currently","onDetailToggle","isRowClickable","onRowClick","triggerDeleteClick","useDeleteDialog","editingSnapshots","deferred","onDeleteClick","savingKeys","onSaveClick","commitEdit","onCancelClick","closeEdit","moveUp","moveDown","moveTop","moveBottom","doIndent","doOutdent","resolveCompactText$1","resolveCompactText","resolveValidation","actionsCache","getActions","actions","findVi","now","buildSlotProps","toolbarSlotProps","applying","applyError","applyReorder","cancelReorderMode","reorderToggleSlotProps","expandableKeySet","keyboardNav","useKeyboardNav","moveToPositionDialogOpen","moveToPositionTarget","moveToPositionContext","target","found","siblings","idx","moveToPositionLabel","openMoveToPosition","onMoveToPositionConfirm","ctx","newIndex","slot","changeParentDialogOpen","changeParentTarget","openChangeParent","onChangeParentConfirm","siblingCount","parentId","targetIndex","position","rowContext","rowCallbacks","rootViewItems","nodesByKey","pendingKeys","acceptChanges","existing","before","op","accepted","renumbered","adopted","revealNestedInvalid","validateAllAndReveal","ancestor","useListEditorScopeValidity","openBlock","createElementBlock","normalizeClass","unref","createElementVNode","renderSlot","_ctx","mergeProps","toDisplayString","createCommentVNode","normalizeProps","guardReactiveProps","createVNode","VBtn","withCtx","createTextVNode","Fragment","createBlock","VIcon","VTooltip","enterReorderMode","VProgressCircular","VAlert","renderList","slotScope","normalizeStyle","_cache","$event","deleteDialog","isRef","deleteError","deleteInFlight","onDeleteDialogConfirm","onDeleteDialogCancel"],"sources":["../../../../src/domains/listEditor/components/ANestedSortableListEditor.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport {\n computed,\n customRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n useSlots,\n useTemplateRef,\n watch,\n} from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useContainerWidth } from '@/domains/listEditor/composables/useContainerWidth'\nimport { useIsTouchDevice } from '@/domains/listEditor/composables/useIsTouchDevice'\nimport { useKeyboardNav } from '@/domains/listEditor/composables/useKeyboardNav'\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport { type NestedViewItem } from '@/domains/listEditor/composables/useNestedListEditor'\nimport {\n useNestedListEditorController,\n type GetKey,\n type ListEditorValidationResult,\n type NestedListEditorHandle,\n type NestedSortableListEditorExtras,\n type PositionOption,\n type PositionStrategy,\n} from '@/domains/listEditor/composables/useNestedListEditorController'\nimport {\n computeInstruction,\n type ExecutableInstruction,\n type Instruction,\n} from '@/domains/listEditor/composables/useDragInstruction'\nimport {\n provideListEditorStateScope,\n useNestedListEditorStateEntry,\n type NestedListEditorStateBindings,\n} from '@/domains/listEditor/composables/useListEditorStateScope'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/domains/listEditor/utils/resolveCompactText'\nimport { useUnsavedSection } from '@/domains/unsavedGuard/composables/useUnsavedSection'\nimport { useDeleteDialog } from '@/domains/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/domains/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/domains/listEditor/utils/revealInvalidRows'\nimport { useListEditorScopeValidity } from '@/domains/listEditor/composables/useListEditorScopeValidity'\nimport { useReorderMode } from '@/domains/listEditor/composables/useReorderMode'\nimport { cloneDeep } from '@/shared/utils/common'\nimport type {\n ListEditorKey,\n ListEditorValidationScope,\n ListEditorValidationState,\n NestedPositionHint,\n NestedTree,\n NestedTreeNode,\n} from '@/domains/listEditor/types/listEditorTypes'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { stringToInt } from '@/shared/utils/string'\nimport LeNestedRow from '@/domains/listEditor/components/internal/LeNestedRow.vue'\nimport LeDeleteDialog from '@/domains/listEditor/components/internal/LeDeleteDialog.vue'\nimport LeMoveToPositionDialog from '@/domains/listEditor/components/internal/LeMoveToPositionDialog.vue'\nimport LeChangeParentDialog from '@/domains/listEditor/components/internal/LeChangeParentDialog.vue'\nimport LeEmptyState from '@/domains/listEditor/components/internal/LeEmptyState.vue'\nimport LeStatus from '@/domains/listEditor/components/internal/LeStatus.vue'\nimport { DRAG_GHOST_CLASS, DRAG_CHOSEN_CLASS, DRAG_CLASS } from '@/domains/listEditor/components/internal/constants'\n\nexport interface DecoratedNestedViewItem<T> extends NestedViewItem<T> {\n editing: boolean\n expanded: boolean\n childrenExpanded: boolean\n loading: boolean\n dirty: boolean\n moved: boolean\n unsaved: boolean\n}\n\nexport interface DragState {\n sourceKey: ListEditorKey\n sourceSubtreeDepth: number\n instruction: Instruction | null\n}\n\nexport type ReorderMode = 'view' | 'reorder'\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedNestedViewItem<TItem> & { validationState: ListEditorValidationState }\n raw: TItem\n index: number\n key: ListEditorKey\n depth: number\n parent: TItem | null\n parentKey: ListEditorKey | null\n childrenCount: number\n hasChildren: boolean\n childrenAllowed: boolean\n firstInParent: boolean\n lastInParent: boolean\n readonly: boolean\n disabled: boolean\n expanded: boolean\n childrenExpanded: boolean\n editing: boolean\n dirty: boolean\n unsaved: boolean\n moved: boolean\n reorderMode: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n canIndent: boolean\n canOutdent: boolean\n canAddChild: boolean\n touch: boolean\n /**\n * Row-scoped `state-key` prefix. Thread it down to any list editor rendered in this slot and set\n * its `:state-key=\"`${stateKeyPrefix}:someList`\"` — that editor's controller then lives in THIS\n * editor's scope and survives the row collapsing (which unmounts the whole slot subtree). Entries\n * under this prefix are disposed when the row is removed.\n */\n stateKeyPrefix: string\n actions: RowActions<TItem>\n}\nexport interface ToolbarSlotProps {\n applying: boolean\n hasPendingChanges: boolean\n movedCount: number\n error: string | null\n actions: { apply: () => Promise<void>; cancel: () => void }\n}\nexport interface ReorderToggleSlotProps {\n mode: ReorderMode\n disabled: boolean\n hasPendingChanges: boolean\n actions: { enterReorderMode: () => void; exitReorderMode: () => void }\n}\nexport interface HeaderSlotProps extends ReorderToggleSlotProps {\n title: string | null\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n maxDepth: number\n\n /**\n * New-row factory; if set, add/add-after/add-inside insert through the\n * controller (no `@add` handler needed). Optional for read-only trees.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`. Never point at the position field.\n * Typed `string` (not `keyof TItem`): a bare keyof compiles to a Boolean-only\n * runtime type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. Typed\n * `[String, Boolean, Object]` with `string` before `false`: a bare keyof\n * compiles Boolean-only, and `false`-first would coerce `position=\"position\"`\n * (value == prop name) to `true`. Object form folds in `{ field, multiplier }`.\n */\n position?: string | false | { field: string; multiplier?: number; strategy?: PositionStrategy }\n /** Parent-key field written onto reparented rows. Default `'parent'`. */\n parentField?: string\n /**\n * Extra fields dropped from the dirty content-hash (position + parent always\n * dropped), e.g. a child collection tracked by a separate editor.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Vuelidate `$scope` (the same one the consumer's row forms / save-gate collector use). When set,\n * the editor registers its aggregate validity under it, so a plain `v$.$invalid` save gate blocks\n * AND reveals a collapsed invalid row — no `validateAll()` call needed in the save flow. Omit to\n * keep legacy behavior (gate the save on the exposed `validateAll()` yourself); `false` opts out.\n */\n validationScope?: ListEditorValidationScope | false\n /**\n * Opt-in lifted controller (`useNestedListEditorController()`) so state\n * survives unmount/remount; omitted = internal controller. Same handle\n * reachable via `useTemplateRef`.\n */\n editor?: NestedListEditorHandle<TItem>\n /**\n * Persist this editor's controller in the nearest ANCESTOR editor's row-state scope under this\n * key, instead of owning it. Use it for an editor rendered in another editor's `#item` slot (that\n * slot is behind a `v-if`, so collapsing the row unmounts this editor and a component-owned\n * controller would re-baseline the already-edited tree on re-expand). Derive the key from the row\n * slot's `stateKeyPrefix`. Options stay declared here, on this tag. Ignored when `:editor` is\n * passed, and a no-op without an ancestor scope.\n */\n stateKey?: string\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n /** Heading above the list. A ready translated string, like every text prop here. */\n title?: string | null\n\n /**\n * Field shown in a collapsed row when no `#item-compact` slot is given. A dotted path reads\n * through nested objects (`texts.title`); a path that runs into nothing renders empty.\n */\n compactField?: string | null\n statusField?: string | null\n\n showAddButton?: boolean\n showAddChildButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n showMoveToPosition?: boolean\n showChangeParent?: boolean\n showExpandToggle?: boolean\n\n /** Label of the add button. A ready translated string; omit it for the library's own wording. */\n addLabel?: string | null\n /** Heading of the empty state. A ready translated string. */\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /**\n * Disable unsaved-state tracking — no dirty markers, never reads as unsaved. For a list that is a\n * VIEW of data owned elsewhere (a display cache rebuilt from a parent's field, say): nothing in\n * such a component can ever clear an amber row, so it must not raise one. Mirrors `AListEditor`.\n */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n /**\n * How a row delete persists. `deferred` (default): the row disappears but the deletion counts as an\n * unconfirmed change until save (revertible until then, incl. via reorder Cancel). `immediate`: the\n * consumer deletes on the backend — the dialog says it is irreversible and it does NOT read as unsaved.\n */\n deleteMode?: 'immediate' | 'deferred'\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n loadingKeys?: Set<ListEditorKey> | null\n\n showReorderToggle?: boolean\n disableReorder?: boolean\n disableDrag?: boolean\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n onReorderApply?: (tree: NestedTree<TItem>) => Promise<void> | void\n\n /** Registers this editor as a named unsaved-changes section under the given (translated) label. */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n unsavedSectionLabel: undefined,\n factory: undefined,\n getKey: undefined,\n position: undefined,\n parentField: 'parent',\n dirtyExclude: undefined,\n validate: undefined,\n validationScope: undefined,\n editor: undefined,\n stateKey: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n showAddButton: true,\n showAddChildButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n showMoveToPosition: false,\n showChangeParent: false,\n showExpandToggle: true,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n deleteMode: 'deferred',\n closeVariant: 'auto',\n loadingKeys: null,\n showReorderToggle: true,\n disableReorder: false,\n disableDrag: false,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n onReorderApply: undefined,\n})\n\nconst emit = defineEmits<{\n add: [hint: NestedPositionHint | undefined]\n 'add-child': [parent: NestedViewItem<TItem>]\n edit: [item: NestedViewItem<TItem>]\n deleted: [item: NestedViewItem<TItem>]\n close: [item: NestedViewItem<TItem>]\n 'item-saved': [item: NestedViewItem<TItem>]\n 'item-expand': [item: NestedViewItem<TItem>, expanded: boolean]\n 'reorder-start': []\n 'reorder-cancel': []\n 'reorder-applied': [tree: NestedTree<TItem>]\n 'reorder-apply-error': [error: unknown]\n 'reorder-end': []\n indent: [item: NestedViewItem<TItem>]\n outdent: [item: NestedViewItem<TItem>]\n}>()\n\nconst modelProp = defineModel<NestedTree<TItem>>({ required: true })\n// Same-tick reads must see an emitted write (the prop lags it until the parent re-renders).\nlet pendingWrite: NestedTree<TItem> | null = null\nwatch(modelProp, () => (pendingWrite = null), { flush: 'sync' })\nconst modelValue = customRef<NestedTree<TItem>>((track, trigger) => ({\n get: () => {\n track()\n // Read the prop every time, pending write or not: a computed evaluated while a write is pending must\n // still subscribe to it.\n const current = modelProp.value\n return pendingWrite ?? current\n },\n set: (v) => {\n pendingWrite = v\n modelProp.value = v\n trigger()\n // Only this write's own clear: a newer pending write stays. The trigger lets readers see the prop\n // again, e.g. when the parent ignored the update.\n nextTick(() => {\n if (pendingWrite !== v) return\n pendingWrite = null\n trigger()\n })\n },\n}))\nconst mode = defineModel<ReorderMode>('mode', { default: 'view' })\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n 'reorder-toggle'?: (props: ReorderToggleSlotProps) => unknown\n 'reorder-toolbar'?: (props: ToolbarSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst { showWarningT } = useAlerts()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\nconst { isNarrow } = useContainerWidth(rootEl)\n\nconst isTouch = useIsTouchDevice()\n\nconst effectiveCloseVariant = computed<'icon' | 'labeled'>(() => {\n if (props.closeVariant === 'icon') return 'icon'\n if (props.closeVariant === 'labeled') return 'labeled'\n return isNarrow.value ? 'icon' : 'labeled'\n})\n\nconst childrenExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n// Readonly detail body visibility — independent of subtree expansion.\nconst detailExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n\n// Local mirror of the controller's key resolution so walkers + the template key\n// rows the same way the controller tracks them. Construction-time config, read once.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst getKeyOpt = props.getKey ?? 'id'\nconst keyFieldName = (typeof getKeyOpt === 'function' ? 'id' : getKeyOpt) as string\nconst keyOf = (data: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function' ? getKeyOpt(data) : (data[getKeyOpt as keyof TItem] as ListEditorKey)\n\n// Managed position field (row position, move-to-position dialog, flatViewItems). Mirrors the controller.\nconst positionFieldName = ((): string => {\n const p = props.position\n if (p === undefined || p === false) return 'position'\n if (typeof p === 'object') return p.field\n return p\n})()\n\nconst initChildrenExpanded = (tree: NestedTree<TItem>) => {\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n childrenExpandedKeys.value.add(keyOf(n.data))\n walk(n.children)\n }\n }\n }\n walk(tree.children)\n}\n// eslint-disable-next-line vue/no-ref-object-reactivity-loss\ninitChildrenExpanded(modelValue.value)\n\n// State controller (v2). Undefined getKey/position/validate fall back to controller defaults\n// ('id' / 'position' / always-valid). Its `viewItems` ignores expand state, so we re-project an\n// expand-aware list below (flatViewItems).\nconst controllerOptions: NestedListEditorStateBindings<TItem> = {\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n parentField: props.parentField,\n maxDepth: props.maxDepth,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n}\n// Precedence: an explicitly lifted `:editor` wins; then a `state-key`'d entry persisted in the\n// nearest ancestor editor's row-state scope (rebound to this instance on every remount); else this\n// component owns the controller — today's behaviour, unchanged.\nconst stateEntry = props.editor ? null : useNestedListEditorStateEntry<TItem>(props.stateKey, controllerOptions)\nconst controller = props.editor ?? stateEntry?.handle ?? useNestedListEditorController<TItem>(controllerOptions)\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\n// Row-state scope for THIS editor's `#item` slot subtree — see ASortableListEditor.\nconst rowStateScope = provideListEditorStateScope(stateEntry?.childScope ?? null)\n\n// FULL flattened list (collapsed-branch rows included) built directly off the\n// tree: the recursive renderer (LeNestedRow) filters by parentKey + childrenExpandedKeys,\n// so it needs every row present in viewItemsDecorated even when hidden.\nconst flatViewItems = computed<NestedViewItem<TItem>[]>(() => {\n const flat: NestedViewItem<TItem>[] = []\n let flatIndex = 0\n const maxDepth = props.maxDepth\n const walk = (nodes: NestedTreeNode<TItem>[], depth: number, parentNode: NestedTreeNode<TItem> | null) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n const key = keyOf(node.data)\n const childrenAllowed = node.children !== undefined\n const hasChildren = childrenAllowed && (node.children?.length ?? 0) > 0\n const childrenCount = node.children?.length ?? 0\n const remainingDepth = maxDepth - (depth + 1)\n flat.push({\n key,\n index: flatIndex++,\n raw: node.data,\n position: node.data[positionFieldName] as number | undefined,\n node,\n depth,\n parent: parentNode?.data ?? null,\n parentKey: parentNode ? keyOf(parentNode.data) : null,\n childrenCount,\n hasChildren,\n childrenAllowed,\n siblingIndex: i,\n siblingCount: nodes.length,\n firstInParent: i === 0,\n lastInParent: i === nodes.length - 1,\n canAddChild: childrenAllowed && remainingDepth > 0,\n canIndent: i > 0,\n canOutdent: depth > 0,\n })\n if (hasChildren) walk(node.children as NestedTreeNode<TItem>[], depth + 1, node)\n }\n }\n walk(modelValue.value.children, 0, null)\n return flat\n})\n\n// Drop the persisted controllers of rows that no longer exist. `post` so the removed row's subtree\n// has already unmounted (its editors released their entries) before we stop their effect scopes.\nwatch(\n () => flatViewItems.value.map((vi) => String(vi.key)).join('|'),\n () => rowStateScope.retainOwners(flatViewItems.value.map((vi) => vi.key)),\n { flush: 'post' }\n)\n\n// Snapshot for reorder-cancel restore only; dirty detection lives in the controller.\n// `movedKeys` is component view state driving the toolbar \"N pending\" counter,\n// cleared on every mode transition by `useReorderMode`.\nconst snapshot = shallowRef<NestedTree<TItem> | null>(null)\nconst movedKeys = ref<Set<ListEditorKey>>(new Set())\n// Deletes made during the current reorder session, split by mode — deferred ones count in the toolbar\n// and revert on Cancel; immediate (backend) ones are re-applied on Cancel so they stay gone (else the\n// snapshot-restore would resurrect a server-deleted row). Mirrors ASortableListEditor.\nconst sessionDeferredDeletes = ref<Set<ListEditorKey>>(new Set())\nconst sessionImmediateDeletes = ref<Set<ListEditorKey>>(new Set())\n\n// The exposed `commit`: the controller's, plus the moved markers, which are this component's view state.\nconst commit = (saved?: NestedTree<TItem>) => {\n controller.commit(saved)\n movedKeys.value = new Set()\n}\n// Mark row + every descendant moved — a moved parent visually carries its subtree.\nconst markMoved = (key: ListEditorKey) => {\n const { node } = controller.findNode(key)\n if (!node) {\n movedKeys.value.add(key)\n return\n }\n const collect = (n: NestedTreeNode<TItem>) => {\n movedKeys.value.add(keyOf(n.data))\n if (n.children) n.children.forEach(collect)\n }\n collect(node)\n}\n\nconst decoratorCache = new Map<ListEditorKey, DecoratedNestedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedNestedViewItem<TItem>[]>(() => {\n const next: DecoratedNestedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of flatViewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = detailExpandedKeys.value.has(vi.key)\n const childrenExpanded = childrenExpandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n const moved = movedKeys.value.has(vi.key)\n // Amber = controller dirty OR reorder-session moved. readonly suppresses it\n // (read-only views can't be unsaved; also dodges a mount-before-load baseline). (QA 85050 sweep)\n const dirty = props.readonly ? false : controller.isUnsaved(vi.key)\n // `disableUnsaved` suppresses only the amber marker — the validation rail still shows, since\n // hiding dirty state should not hide a real error.\n const unsaved = props.disableUnsaved || props.readonly ? false : dirty || moved\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.depth === vi.depth &&\n cached.parentKey === vi.parentKey &&\n cached.childrenCount === vi.childrenCount &&\n cached.firstInParent === vi.firstInParent &&\n cached.lastInParent === vi.lastInParent &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.childrenExpanded === childrenExpanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.moved === moved &&\n cached.unsaved === unsaved\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedNestedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n childrenExpanded,\n loading,\n dirty,\n moved,\n unsaved,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => modelValue.value.children.length === 0)\nconst totalItemCount = computed(() => flatViewItems.value.length)\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canEnterReorder = computed(() => canInteract.value && !props.disableReorder && totalItemCount.value > 1)\n\nconst isInlineEdit = computed(() => !!(slots as Record<string, unknown>).item)\nconst hasReadonlyDetail = computed(() => !!(slots as Record<string, unknown>)['item-readonly'])\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\nconst { editingKeys, editingSnapshots, clearEditing, beginEdit, cancelEdit, commitEdit, closeEdit, requestAutoOpen } =\n useInlineEditing<TItem, NestedViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row-wrapper',\n isInlineEdit,\n // markDirty=false: restoring the pre-edit snapshot on cancel must not flag the\n // node dirty (it would otherwise be resent by partial-multi saves).\n restoreSnapshot: (key, data) => controller.updateItem(key, data, false),\n watchKeys: () => {\n const keys: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n keys.push(keyOf(n.data))\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return keys\n },\n findEntry: (key) => {\n const { node } = controller.findNode(key)\n return node ? { data: node.data } : null\n },\n afterAutoOpen: (key) => {\n const { parent } = controller.findNode(key)\n if (parent) {\n childrenExpandedKeys.value.add(keyOf(parent.data))\n }\n },\n })\n\nconst {\n applying,\n applyError,\n hasPendingChanges,\n movedCount,\n reorderMode,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n} = useReorderMode<NestedTree<TItem>>({\n mode,\n snapshot,\n movedKeys,\n modelValue,\n cloneModel: (m) => cloneDeep(m) as NestedTree<TItem>,\n applyModel: (m) => {\n modelValue.value = m\n },\n canEnterReorder,\n onEnter: () => {\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n clearEditing()\n // Expand every branch so all rows are reachable drag targets.\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n nextTick(() => {\n if (dragEnabled.value) initSortables()\n })\n },\n onExternalEnter: () => {\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n clearEditing()\n },\n // Cancel: the snapshot-restore has brought every deleted row back; reconcile the controller so a\n // deferred delete truly reverts (clear tombstone, row stays) and an immediate delete stays gone (row\n // removed again — it is deleted on the backend and must not resurrect / be re-created by a save).\n onCancel: () => {\n for (const key of sessionDeferredDeletes.value) controller.restoreDeleted(key)\n for (const key of sessionImmediateDeletes.value)\n controller.deleteItem(key, { trackDeleted: false, renumber: false })\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n destroySortables()\n },\n onApplyEnd: () => {\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n destroySortables()\n },\n onReorderApply: (tree) => props.onReorderApply?.(tree),\n emit: {\n reorderStart: () => emit('reorder-start'),\n reorderCancel: () => emit('reorder-cancel'),\n reorderApplied: (payload) => emit('reorder-applied', payload),\n reorderApplyError: (err) => emit('reorder-apply-error', err),\n reorderEnd: () => emit('reorder-end'),\n },\n})\n\n// Reorder-toolbar pending indicator = session moves + deferred deletes made in the session, so a delete\n// in reorder mode no longer reads as \"no pending changes\" and Apply stays enabled.\nconst nestedPendingCount = computed<number>(() => movedCount.value + sessionDeferredDeletes.value.size)\nconst nestedPendingChanges = computed<boolean>(() => hasPendingChanges.value || sessionDeferredDeletes.value.size > 0)\n\nconst canAdd = computed(() => canInteract.value && props.showAddButton && !reorderMode.value)\nconst dragEnabled = computed(() => reorderMode.value && !isTouch.value && !props.disableDrag)\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(() => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'))\nconst deleteConfirmTextResolved = computed(\n () =>\n props.deleteConfirmText ??\n (props.deleteMode === 'immediate'\n ? t('common.sortable.deleteConfirmText')\n : t('common.sortable.deleteConfirmTextDeferred'))\n)\n\nconst reorderToggleVisible = computed<boolean>(\n (): boolean => !props.readonly && props.showReorderToggle && !reorderMode.value && totalItemCount.value > 0\n)\n\nconst compactReorderButton = computed<boolean>((): boolean => !!props.title && isNarrow.value)\n\n// Keys of every node that has children — the expand/collapse candidates.\nconst expandableKeys = computed<ListEditorKey[]>(() => {\n const out: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n out.push(keyOf(n.data))\n walk(n.children)\n }\n }\n }\n walk(modelValue.value.children)\n return out\n})\n\nconst allExpanded = computed<boolean>(\n () => expandableKeys.value.length > 0 && expandableKeys.value.every((k) => childrenExpandedKeys.value.has(k))\n)\n\nconst expandAllVisible = computed<boolean>(() => !reorderMode.value && expandableKeys.value.length > 0)\n\nconst toggleExpandAll = () => {\n if (allExpanded.value) {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.delete(k)\n } else {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n }\n}\n\nconst headerVisible = computed<boolean>(\n (): boolean =>\n !!(\n props.title ||\n (slots as Record<string, unknown>).header ||\n (slots as Record<string, unknown>)['reorder-toggle'] ||\n reorderToggleVisible.value ||\n expandAllVisible.value ||\n reorderMode.value\n )\n)\n\n// One Sortable instance per group so drag/drop moves items within/between groups;\n// SortableJS owns the pointer events, onEnd reconciles via editor.moveTo().\nconst sortableInstances = ref<Array<{ stop: () => void; option?: (k: string, v: unknown) => void }>>([])\nconst forceRerender = ref(0)\n\nconst destroySortables = () => {\n for (const s of sortableInstances.value) {\n try {\n s.stop()\n } catch {\n // no-op\n }\n }\n sortableInstances.value = []\n}\n\nconst GROUP_CLASS = 'a-nested-list-editor__group'\nconst HANDLE_CLASS = 'a-le-drag-handle'\n\n// Live drag state. `instruction` is recomputed on every pointermove and encodes\n// where + at what depth the dragged item lands (sibling-above/below/make-child/blocked);\n// the overlay reads it, onEnd applies it via `editor.moveTo`. SortableJS never moves\n// the DOM (onMove always returns false) — hit-testing, depth and the mutation are all ours.\nconst dragState = ref<DragState | null>(null)\n\n// Drop indicator anchor geometry, kept in sync with CSS (reorder-mode header\n// padding-left = 12 + depth*24, drag handle = 20px). ANCHOR_X = 12 + half handle\n// (10) = 22 puts the dot on the handle's centre; the line steps 24px per depth.\nconst INDENT_PX = 24\nconst ANCHOR_X = 22\n\nconst hitTestRow = (\n clientX: number,\n clientY: number\n): { el: HTMLElement; viewItem: DecoratedNestedViewItem<TItem> } | null => {\n const hit = document.elementFromPoint(clientX, clientY) as HTMLElement | null\n if (!hit) return null\n const wrapper = hit.closest('.a-le-row-wrapper') as HTMLElement | null\n if (!wrapper) return null\n // Only wrappers inside our rowsContainer — elementFromPoint could hit a\n // different ANestedSortableListEditor instance on the same page.\n if (!rowsContainer.value || !rowsContainer.value.contains(wrapper)) return null\n const key = parseKey(wrapper.getAttribute('data-id'))\n if (key === null) return null\n const vi = viewItemsDecorated.value.find((v) => v.key === key)\n if (!vi) return null\n return { el: wrapper, viewItem: vi }\n}\n\nconst recomputeInstruction = (clientX: number, clientY: number) => {\n if (!dragState.value || !rowsContainer.value) return\n const hit = hitTestRow(clientX, clientY)\n if (!hit) {\n dragState.value.instruction = null\n return\n }\n const containerRect = rowsContainer.value.getBoundingClientRect()\n // Hit-test the `.a-le-row` child, not the wrapper — the wrapper's height\n // balloons when children are rendered.\n const rowEl = hit.el.querySelector(':scope > .a-le-row') as HTMLElement | null\n const rowRect = (rowEl ?? hit.el).getBoundingClientRect()\n dragState.value.instruction = computeInstruction({\n pointer: { x: clientX, y: clientY },\n hoveredRow: {\n key: hit.viewItem.key,\n rect: rowRect,\n depth: hit.viewItem.depth,\n parentKey: hit.viewItem.parentKey,\n siblingIndex: hit.viewItem.siblingIndex,\n siblingCount: hit.viewItem.siblingCount,\n },\n sourceKey: dragState.value.sourceKey,\n sourceSubtreeDepth: dragState.value.sourceSubtreeDepth,\n viewItems: viewItemsDecorated.value,\n maxDepth: props.maxDepth,\n indentPx: INDENT_PX,\n containerLeft: containerRect.left,\n containerPaddingLeft: ANCHOR_X,\n })\n}\n\nconst onPointerMove = (e: PointerEvent) => {\n recomputeInstruction(e.clientX, e.clientY)\n}\n\nconst applyInstruction = (inst: ExecutableInstruction, sourceKey: ListEditorKey) => {\n const ok = controller.moveTo(sourceKey, inst.parentKey, inst.index)\n if (!ok) {\n showWarningT('common.sortable.error.maxDeepExceed')\n forceRerender.value++\n nextTick(() => initSortables())\n return\n }\n markMoved(sourceKey)\n // makeChild: expand the new parent so the just-moved row doesn't vanish into a collapsed branch.\n if (inst.makeChild && inst.parentKey !== null) {\n childrenExpandedKeys.value.add(inst.parentKey)\n }\n}\n\nconst initSortables = () => {\n destroySortables()\n if (!dragEnabled.value) return\n if (!rowsContainer.value) return\n const groups = Array.from(rowsContainer.value.querySelectorAll<HTMLElement>('.' + GROUP_CLASS))\n for (const group of groups) {\n const sortable = useSortable(group, [], {\n group: { name: 'a-nested', pull: true, put: true },\n handle: '.' + HANDLE_CLASS,\n animation: 0,\n ghostClass: DRAG_GHOST_CLASS,\n chosenClass: DRAG_CHOSEN_CLASS,\n dragClass: DRAG_CLASS,\n fallbackOnBody: true,\n forceFallback: true,\n fallbackTolerance: 3,\n onStart: (event) => {\n const draggedEl = event.item as HTMLElement\n const id = parseKey(draggedEl.getAttribute('data-id'))\n if (id === null) return\n const draggedNode = controller.findNode(id).node\n const subtreeDepth = draggedNode ? controller.calculateSubtreeDepth(draggedNode) : 1\n dragState.value = {\n sourceKey: id,\n sourceSubtreeDepth: subtreeDepth,\n instruction: null,\n }\n document.addEventListener('pointermove', onPointerMove, { passive: true })\n },\n onMove: (event) => {\n // Also track the pointer via SortableJS's stream — keeps `instruction`\n // in sync when the browser coalesces pointermove events during fast drags.\n const orig = (event as unknown as { originalEvent?: Event }).originalEvent\n if (orig) {\n if ('clientX' in orig && 'clientY' in orig) {\n recomputeInstruction((orig as MouseEvent).clientX, (orig as MouseEvent).clientY)\n } else if ('touches' in orig) {\n const tev = orig as TouchEvent\n if (tev.touches.length > 0) {\n recomputeInstruction(tev.touches[0]!.clientX, tev.touches[0]!.clientY)\n }\n }\n }\n // Refuse SortableJS's own DOM insertion — onEnd's `editor.moveTo` drives the move.\n return false\n },\n onEnd: () => {\n document.removeEventListener('pointermove', onPointerMove)\n const state = dragState.value\n dragState.value = null\n if (!state) return\n const inst = state.instruction\n if (inst === null) return\n if (inst.type === 'blocked') return\n applyInstruction(inst, state.sourceKey)\n },\n })\n sortableInstances.value.push(sortable)\n }\n}\n\nconst parseKey = (raw: string | null): ListEditorKey | null => {\n if (raw === null || raw === '') return null\n // Numeric key only when `data-id` is a pure integer string (incl. negative temp\n // ids like \"-1\"); else a DocId/UUID. The old `n > 0` test sent negative temp ids\n // to the string branch, so a freshly-added row's move marked the wrong key.\n const n = stringToInt(raw)\n return String(n) === raw ? n : raw\n}\n\nwatch(\n () => dragEnabled.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n else destroySortables()\n }\n)\n\nwatch(\n () => forceRerender.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n }\n)\n\n// Rebuild sortables when the tree shape changes during drag mode, else newly rendered groups aren't draggable.\nwatch(\n () => viewItemsDecorated.value.map((v) => v.key).join('|'),\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n }\n)\n\nonMounted(() => {\n if (dragEnabled.value) initSortables()\n})\nonBeforeUnmount(() => {\n destroySortables()\n document.removeEventListener('pointermove', onPointerMove)\n})\n\n// Overlay visual props from the current instruction; `null` = hidden (no\n// instruction, or blocked). The optional connector is a rail from the drop line\n// up to the row whose level dictates the insert. Measured via getBoundingClientRect\n// rather than CSS anchor positioning: Chrome's anchor-reachability rule excludes\n// some deeply-nested descendants, so JS measurement is simpler and more reliable.\ntype OverlayVisual = {\n line: { top: number; left: number; right: number }\n connector: { top: number; height: number; left: number } | null\n}\n\nconst overlayVisual = computed<OverlayVisual | null>(() => {\n const state = dragState.value\n if (!state || state.instruction === null || !rowsContainer.value) return null\n const inst = state.instruction\n // Blocked drops render nothing — the silent empty space is the \"not here\" signal.\n if (inst.type === 'blocked') return null\n const refWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.refKey))}\"]`\n )\n if (!refWrapper) return null\n const rowEl = refWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const containerRect = rowsContainer.value.getBoundingClientRect()\n const rowRect = (rowEl ?? refWrapper).getBoundingClientRect()\n\n const lineLeft = ANCHOR_X + inst.depth * INDENT_PX\n const lineTop = inst.refEdge === 'top' ? rowRect.top - containerRect.top : rowRect.bottom - containerRect.top\n const line = { top: lineTop, left: lineLeft, right: 16 }\n\n let connector: OverlayVisual['connector'] = null\n if (inst.levelRowKey !== null) {\n const levelWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.levelRowKey))}\"]`\n )\n if (levelWrapper) {\n const levelRow = levelWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const levelRect = (levelRow ?? levelWrapper).getBoundingClientRect()\n const levelCentreY = levelRect.top - containerRect.top + levelRect.height / 2\n if (levelCentreY < lineTop) {\n connector = {\n top: levelCentreY,\n height: lineTop - levelCentreY,\n left: lineLeft,\n }\n }\n }\n }\n\n return { line, connector }\n})\n\n// With a `factory`, the editor inserts through the controller; without one it\n// stays emit-only so legacy `@add` consumers drive the insert. The `add` event\n// fires either way.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n if (props.factory) controller.addItem()\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n if (props.factory) controller.addAfter(vi.key, undefined, vi.childrenAllowed)\n emit('add', { afterId: vi.key, childrenAllowed: vi.childrenAllowed })\n}\n\nconst onAddChildClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n if (!vi.canAddChild) return\n requestAutoOpen()\n childrenExpandedKeys.value.add(vi.key)\n emit('add-child', vi)\n // Append to the end of children, matching the root \"Add item\" semantic.\n // (Drag-drop make-child still lands at index 0 — its drop line sits just below the parent.)\n if (props.factory) controller.addChild(vi.key, undefined, true)\n emit('add', { parentId: vi.key, childrenAllowed: true })\n}\n\nconst onEditClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value || reorderMode.value) return\n // Clicking edit while already editing closes the form, so the pencil toggles like the row header.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n }\n emit('edit', vi)\n}\n\n// Toggles tree children visibility (distinct from the readonly-detail body below).\nconst onChevronClick = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = childrenExpandedKeys.value.has(key)\n if (currently) childrenExpandedKeys.value.delete(key)\n else childrenExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\n// Toggles the row's readonly-detail body (separate from tree children).\nconst onDetailToggle = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = detailExpandedKeys.value.has(key)\n if (currently) detailExpandedKeys.value.delete(key)\n else detailExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\nconst isRowClickable = (vi: DecoratedNestedViewItem<TItem>): boolean => {\n if (props.disableRowClick) return false\n if (props.disabled || props.loading) return false\n if (reorderMode.value) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) onDetailToggle(vi)\n else onEditClick(vi)\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, NestedViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n detailExpandedKeys.value.delete(vi.key)\n childrenExpandedKeys.value.delete(vi.key)\n const deferred = props.deleteMode === 'deferred'\n // A delete in reorder mode is a session change: deferred reverts on Cancel, immediate stays gone\n // (re-applied after Cancel's snapshot-restore).\n if (reorderMode.value) {\n if (deferred) sessionDeferredDeletes.value.add(vi.key)\n else sessionImmediateDeletes.value.add(vi.key)\n }\n // Controller owns removal (mirrors the flat editors): a deferred saved-row delete is tombstoned\n // (counts as unsaved); immediate skips it (already deleted on the backend). Runs before the\n // `deleted` emit so a consumer's handler still receives `vi.raw`.\n // Immediate: the backend already dropped the row and does not renumber the siblings, so neither does\n // the editor — their positions keep matching the server's and nothing reads as unsaved.\n if (deferred) controller.deleteItem(vi.key, { trackDeleted: true })\n else controller.deleteItem(vi.key, { trackDeleted: false, renumber: false })\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm,\n})\n\nconst onDeleteClick = async (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\n// In-flight guard: a second click while the consumer's save is pending must not send a duplicate.\n// A rejected save keeps the row open and still reaches the app's error handler, as before the guard.\nconst savingKeys = ref<Set<ListEditorKey>>(new Set())\nconst onSaveClick = async (vi: NestedViewItem<TItem>) => {\n if (savingKeys.value.has(vi.key)) return\n savingKeys.value.add(vi.key)\n try {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n } finally {\n savingKeys.value.delete(vi.key)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: NestedViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: NestedViewItem<TItem>) => {\n closeEdit(vi)\n emit('close', vi)\n}\n\nconst moveUp = (id: ListEditorKey) => {\n if (controller.moveUp(id)) markMoved(id)\n}\nconst moveDown = (id: ListEditorKey) => {\n if (controller.moveDown(id)) markMoved(id)\n}\nconst moveTop = (id: ListEditorKey) => {\n if (controller.moveTop(id)) markMoved(id)\n}\nconst moveBottom = (id: ListEditorKey) => {\n if (controller.moveBottom(id)) markMoved(id)\n}\nconst doIndent = (vi: NestedViewItem<TItem>) => {\n if (!controller.indent(vi.key)) {\n showWarningT('common.sortable.error.maxDeepExceed')\n return\n }\n markMoved(vi.key)\n emit('indent', vi)\n}\nconst doOutdent = (vi: NestedViewItem<TItem>) => {\n if (!controller.outdent(vi.key)) return\n markMoved(vi.key)\n emit('outdent', vi)\n}\n\nconst resolveCompactText = (raw: TItem): string => resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Row validation from the controller's gated `rowState` — red rail shows only\n// once the row is unsaved or `validateAll()` ran.\n// `editing` → the controller reads amber (not red) while the row is being filled in. (QA 85050 b7)\nconst resolveValidation = (raw: TItem, key?: ListEditorKey): ListEditorValidationState =>\n key === undefined ? null : controller.rowState(raw, key, editingKeys.value.has(key))\n\n// Per-key actions cache for stable per-row identity (see AListEditor). Closures\n// capture the stable key and look up the current vi via findVi at call time.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n return vi ? onSaveClick(vi) : undefined\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n addChild: () => {\n const vi = findVi(key)\n if (vi) onAddChildClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n toggleDetail: () => {\n const vi = findVi(key)\n if (vi) onDetailToggle(vi)\n },\n moveUp: () => moveUp(key),\n moveDown: () => moveDown(key),\n moveTop: () => moveTop(key),\n moveBottom: () => moveBottom(key),\n indent: () => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n outdent: () => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n update: (data: TItem) => controller.updateItem(key, data),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n }\n)\n\nconst buildSlotProps = (vi: DecoratedNestedViewItem<TItem>) => ({\n item: { ...vi, validationState: resolveValidation(vi.raw as TItem, vi.key) },\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n depth: vi.depth,\n parent: vi.parent,\n parentKey: vi.parentKey,\n childrenCount: vi.childrenCount,\n hasChildren: vi.hasChildren,\n childrenAllowed: vi.childrenAllowed,\n firstInParent: vi.firstInParent,\n lastInParent: vi.lastInParent,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n childrenExpanded: vi.childrenExpanded,\n editing: vi.editing,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n moved: vi.moved,\n reorderMode: reorderMode.value,\n canMoveUp: !vi.firstInParent,\n canMoveDown: !vi.lastInParent,\n canIndent: vi.canIndent,\n canOutdent: vi.canOutdent,\n canAddChild: vi.canAddChild,\n touch: isTouch.value,\n stateKeyPrefix: rowStateScope.prefixFor(vi.key),\n actions: getActions(vi.key),\n})\n\nconst toolbarSlotProps = computed(() => ({\n applying: applying.value,\n hasPendingChanges: nestedPendingChanges.value,\n movedCount: nestedPendingCount.value,\n error: applyError.value,\n actions: {\n apply: applyReorder,\n cancel: cancelReorderMode,\n },\n}))\n\nconst reorderToggleSlotProps = computed(() => ({\n mode: mode.value,\n disabled: !canEnterReorder.value,\n hasPendingChanges: hasPendingChanges.value,\n actions: {\n enterReorderMode,\n exitReorderMode: cancelReorderMode,\n },\n}))\n\nconst expandableKeySet = computed(() => new Set(expandableKeys.value))\n\nconst findVi = (key: ListEditorKey): DecoratedNestedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() =>\n viewItemsDecorated.value.map((vi) => ({\n key: vi.key,\n expanded: vi.childrenExpanded,\n canExpand: expandableKeySet.value.has(vi.key),\n canIndent: true,\n canOutdent: true,\n }))\n ),\n variant: 'nested',\n isReorderMode: reorderMode,\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n onMoveUp: (key) => moveUp(key),\n onMoveDown: (key) => moveDown(key),\n onMoveTop: (key) => moveTop(key),\n onMoveBottom: (key) => moveBottom(key),\n onIndent: (key) => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n onOutdent: (key) => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n onToggleChildren: (key) => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n onCancelReorder: () => cancelReorderMode(),\n})\n\nconst moveToPositionDialogOpen = ref<boolean>(false)\nconst moveToPositionTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst moveToPositionContext = computed<{\n parentId: ListEditorKey | null\n total: number\n currentIndex: number\n} | null>(() => {\n const target = moveToPositionTarget.value\n if (!target) return null\n const found = controller.findNode(target.key)\n const siblings = found.parent?.children ?? modelValue.value.children\n const idx = siblings.findIndex((s) => keyOf(s.data) === target.key)\n return {\n parentId: found.parent ? keyOf(found.parent.data) : null,\n total: siblings.length,\n currentIndex: idx,\n }\n})\nconst moveToPositionLabel = computed<string>(() =>\n moveToPositionTarget.value ? resolveCompactText(moveToPositionTarget.value.raw) : ''\n)\nconst openMoveToPosition = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showMoveToPosition) return\n moveToPositionTarget.value = vi\n moveToPositionDialogOpen.value = true\n}\nconst onMoveToPositionConfirm = (newIndex: number) => {\n const ctx = moveToPositionContext.value\n const target = moveToPositionTarget.value\n moveToPositionTarget.value = null\n if (!ctx || !target) return\n if (newIndex === ctx.currentIndex) return\n const slot = newIndex > ctx.currentIndex ? newIndex + 1 : newIndex\n if (controller.moveTo(target.key, ctx.parentId, slot)) {\n markMoved(target.key)\n }\n}\n\nconst changeParentDialogOpen = ref<boolean>(false)\nconst changeParentTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst openChangeParent = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showChangeParent) return\n changeParentTarget.value = vi\n changeParentDialogOpen.value = true\n}\nconst onChangeParentConfirm = (parentId: ListEditorKey | null, position: 'first' | 'last') => {\n const target = changeParentTarget.value\n changeParentTarget.value = null\n if (!target) return\n // Sibling count under the new parent so 'last' resolves to the right index ('first' = 0).\n let siblingCount = 0\n if (parentId === null) {\n siblingCount = modelValue.value.children.length\n } else {\n const found = controller.findNode(parentId)\n siblingCount = found.node?.children?.length ?? 0\n }\n const targetIndex = position === 'first' ? 0 : siblingCount\n if (controller.moveTo(target.key, parentId, targetIndex)) {\n markMoved(target.key)\n if (parentId !== null) childrenExpandedKeys.value.add(parentId)\n }\n}\n\n// Aggregated display flags + helpers passed into each <LeNestedRow>.\nconst rowContext = computed(() => ({\n reorderMode: reorderMode.value,\n readonly: props.readonly,\n canInteract: canInteract.value,\n dragEnabled: dragEnabled.value,\n showExpandToggle: props.showExpandToggle,\n showEditButton: props.showEditButton,\n showDeleteButton: props.showDeleteButton,\n showAddChildButton: props.showAddChildButton,\n showAddAfterAction: props.showAddAfterAction,\n showMoveToPosition: props.showMoveToPosition,\n showChangeParent: props.showChangeParent,\n showInlineSaveFooter: showInlineSaveFooter.value,\n statusField: props.statusField,\n effectiveCloseVariant: effectiveCloseVariant.value,\n keyboardNav,\n isRowClickable,\n resolveCompactText,\n resolveValidation: (raw: TItem, key?: ListEditorKey) => resolveValidation(raw, key),\n buildSlotProps,\n}))\n\n// Event callback bundle passed to each row.\nconst rowCallbacks = {\n onRowClick,\n onChevronClick,\n onEditClick,\n onDeleteClick,\n onCloseClick,\n onSaveClick,\n onCancelClick,\n onAddAfterClick: onRowAddAfterClick,\n onAddChildClick,\n moveUp: (id: ListEditorKey) => moveUp(id),\n moveDown: (id: ListEditorKey) => moveDown(id),\n moveTop: (id: ListEditorKey) => moveTop(id),\n moveBottom: (id: ListEditorKey) => moveBottom(id),\n indent: doIndent,\n outdent: doOutdent,\n openMoveToPosition,\n openChangeParent,\n}\n\nconst rootViewItems = computed(() => viewItemsDecorated.value.filter((v) => v.parentKey === null))\n\n// `acceptChanges` re-baselines ONLY what its own op changed, not the whole tree: other pending\n// edits/moves must survive and keep arming the leave guard. Siblings the op merely renumbered stay\n// pending (`meta.dirty`) -- the server may not have renumbered them, so the page's save still has to\n// send theirs.\nconst nodesByKey = (): Map<ListEditorKey, NestedTreeNode<TItem>> => {\n const out = new Map<ListEditorKey, NestedTreeNode<TItem>>()\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n out.set(keyOf(n.data), n)\n if (n.children?.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return out\n}\nconst pendingKeys = (): Set<ListEditorKey> => new Set([...nodesByKey().keys()].filter((k) => controller.isUnsaved(k)))\n/**\n * Runs a tree mutation the server has already made -- a row created or saved through a dialog -- and\n * adopts as saved only the rows it added or edited, plus `keys` (pass the row's key; a deleted one is\n * no longer in the tree to be found). Siblings it only renumbered and other pending work stay unsaved.\n */\nconst acceptChanges = (op: () => void, keys: ListEditorKey[] = []) => {\n const existing = new Set(nodesByKey().keys())\n const before = pendingKeys()\n op()\n nextTick(() => {\n const nodes = nodesByKey()\n const accepted = [...new Set([...keys, ...[...pendingKeys()].filter((k) => !before.has(k))])]\n // A created row the op renumbered -- into a gap an immediate delete left -- sits where the server\n // did not store it: adopted as saved, but its position stays pending for the page's save.\n const renumbered = accepted.filter((k) => !existing.has(k) && nodes.get(k)?.meta.dirty)\n controller.acceptRows(accepted)\n const adopted = nodesByKey()\n for (const k of renumbered) {\n const node = adopted.get(k)\n if (node) controller.updateItem(k, node.data, true)\n }\n })\n}\n\n// Registers this editor as a named unsaved-changes section when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel && !props.disableUnsaved\n ? { label: props.unsavedSectionLabel, dirty: controller.hasUnsaved.value }\n : []\n)\n\n// Expose the controller handle plus acceptChanges and reorder/expand controls. Entries after the\n// spread override controller methods where the component adds to them (`commit` also clears the moved\n// markers, `viewItems` is this component's expand-aware list).\n// Reveal for a blocked save: open invalid rows AND expand the offender's ancestor chain so a\n// collapsed nested row becomes visible. Shared by the exposed validateAll + scope reveal-on-touch.\nconst revealNestedInvalid = (): boolean =>\n validateAllAndReveal(controller, (key) => {\n let ancestor = controller.findNode(key).parent\n while (ancestor) {\n childrenExpandedKeys.value.add(keyOf(ancestor.data))\n ancestor = controller.findNode(keyOf(ancestor.data)).parent\n }\n const vi = controller.viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n })\n\n// Auto-bridge the editor's aggregate validity into the consumer's `validation-scope` collector so a\n// plain `$invalid` save gate blocks (and reveals) a collapsed invalid row. No-op without the prop.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss -- construction-time opt-in, read once\nuseListEditorScopeValidity({\n hasErrors: controller.hasErrors,\n validationScope: props.validationScope,\n validateProvided: props.validate !== undefined,\n reveal: revealNestedInvalid,\n})\n\ndefineExpose<NestedSortableListEditorExtras & NestedListEditorHandle<TItem>>({\n ...controller,\n validateAll: revealNestedInvalid,\n commit,\n acceptChanges,\n // Expand-aware flattened view (controller's own `viewItems` ignores collapse state).\n viewItems: flatViewItems,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n expand: (id: ListEditorKey) => childrenExpandedKeys.value.add(id),\n collapse: (id: ListEditorKey) => childrenExpandedKeys.value.delete(id),\n toggleExpand: (id: ListEditorKey) => {\n if (childrenExpandedKeys.value.has(id)) childrenExpandedKeys.value.delete(id)\n else childrenExpandedKeys.value.add(id)\n },\n expandDetail: (id: ListEditorKey) => detailExpandedKeys.value.add(id),\n collapseDetail: (id: ListEditorKey) => detailExpandedKeys.value.delete(id),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-nested-list-editor\"\n :class=\"[\n `a-nested-list-editor--mode-${mode}`,\n {\n 'a-nested-list-editor--readonly': readonly,\n 'a-nested-list-editor--disabled': disabled,\n 'a-nested-list-editor--touch': isTouch,\n 'a-nested-list-editor--drag-enabled': dragEnabled,\n },\n ]\"\n >\n <div class=\"a-le-card\">\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n <div class=\"a-le-header-actions\">\n <template v-if=\"reorderMode\">\n <!-- Reorder-mode header: pending count + Cancel/Apply, sitting where\n the \"Reorder\" button lives in view mode (not a bottom toolbar). -->\n <slot\n name=\"reorder-toolbar\"\n v-bind=\"toolbarSlotProps\"\n >\n <LeStatus\n :class=\"{ 'a-le-toolbar-status--pending': nestedPendingChanges }\"\n :has-pending-changes=\"nestedPendingChanges\"\n :pending-count=\"nestedPendingCount\"\n :error=\"applyError\"\n />\n <VBtn\n variant=\"text\"\n size=\"small\"\n :disabled=\"applying\"\n @click=\"cancelReorderMode\"\n >\n {{ t('common.sortable.reorderCancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n size=\"small\"\n prepend-icon=\"mdi-check\"\n :loading=\"applying\"\n :disabled=\"applying || !nestedPendingChanges\"\n @click=\"applyReorder\"\n >\n {{ t('common.sortable.reorderApply') }}\n </VBtn>\n </slot>\n </template>\n <template v-else>\n <VBtn\n v-if=\"expandAllVisible && compactReorderButton\"\n :aria-label=\"allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n @click=\"toggleExpandAll\"\n >\n <VIcon\n :icon=\"allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\"\n />\n </VBtn>\n <VBtn\n v-else-if=\"expandAllVisible\"\n variant=\"tonal\"\n color=\"primary\"\n size=\"small\"\n :prepend-icon=\"allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\"\n @click=\"toggleExpandAll\"\n >\n {{ allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll') }}\n </VBtn>\n <slot\n v-if=\"reorderToggleVisible\"\n name=\"reorder-toggle\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <VBtn\n v-if=\"compactReorderButton\"\n :aria-label=\"t('common.sortable.reorder')\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n <VIcon\n icon=\"mdi-sort\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.reorder')\"\n />\n </VBtn>\n <VBtn\n v-else\n variant=\"tonal\"\n color=\"primary\"\n prepend-icon=\"mdi-sort\"\n size=\"small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n {{ t('common.sortable.reorder') }}\n </VBtn>\n </slot>\n </template>\n </div>\n </slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <div\n v-else\n :key=\"forceRerender\"\n ref=\"rowsContainer\"\n class=\"a-nested-list-editor__rows\"\n :class=\"{ 'a-nested-list-editor__rows--dragging': dragState !== null }\"\n >\n <div\n :class=\"[GROUP_CLASS, 'a-nested-list-editor__group--root']\"\n data-parent-id=\"\"\n >\n <LeNestedRow\n v-for=\"vi in rootViewItems\"\n :key=\"String(vi.key)\"\n :vi=\"vi\"\n :view-items=\"viewItemsDecorated\"\n :drag-state=\"dragState\"\n :context=\"rowContext\"\n :callbacks=\"rowCallbacks\"\n >\n <template #item=\"slotScope\">\n <slot\n name=\"item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-compact=\"slotScope\">\n <slot\n name=\"item-compact\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-readonly=\"slotScope\">\n <slot\n name=\"item-readonly\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-status=\"slotScope\">\n <slot\n name=\"item-status\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-footer=\"slotScope\">\n <slot\n name=\"item-footer\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-actions=\"slotScope\">\n <slot\n name=\"item-actions\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #before-item=\"slotScope\">\n <slot\n name=\"before-item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #after-item=\"slotScope\">\n <slot\n name=\"after-item\"\n v-bind=\"slotScope\"\n />\n </template>\n </LeNestedRow>\n </div>\n\n <!-- Drop indicator overlay (valid drops only): horizontal line at a row\n edge (depth in `left`) + an optional vertical connector rail to the\n row whose level the insert matches. -->\n <template v-if=\"overlayVisual !== null\">\n <div\n v-if=\"overlayVisual.connector !== null\"\n class=\"a-nested-list-editor__drop-connector\"\n :style=\"{\n left: `${overlayVisual.connector.left}px`,\n top: `${overlayVisual.connector.top}px`,\n height: `${overlayVisual.connector.height}px`,\n }\"\n />\n <div\n class=\"a-nested-list-editor__drop-line\"\n :style=\"{\n top: `${overlayVisual.line.top}px`,\n left: `${overlayVisual.line.left}px`,\n right: `${overlayVisual.line.right}px`,\n }\"\n >\n <span class=\"a-nested-list-editor__drop-line-dot\" />\n </div>\n </template>\n </div>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeMoveToPositionDialog\n v-model=\"moveToPositionDialogOpen\"\n :total=\"moveToPositionContext?.total ?? 0\"\n :current-index=\"moveToPositionContext?.currentIndex ?? 0\"\n :item-label=\"moveToPositionLabel\"\n @confirm=\"onMoveToPositionConfirm\"\n />\n\n <LeChangeParentDialog\n v-model=\"changeParentDialogOpen\"\n :tree=\"modelValue\"\n :source-key=\"changeParentTarget?.key ?? null\"\n :key-field=\"keyFieldName\"\n :max-depth=\"maxDepth\"\n :resolve-label=\"resolveCompactText\"\n :calculate-subtree-depth=\"controller.calculateSubtreeDepth\"\n @confirm=\"onChangeParentConfirm\"\n />\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../styles/tokens';\n@use '../styles/shared';\n\n// Nested-variant rules — depth-aware padding, tree toggle caret, children\n// groups, drop indicator overlay, drag clone.\n.a-nested-list-editor {\n // Depth-aware left padding — caret column + indent per depth level.\n .a-le-row-header {\n padding: var(--le-row-pad-y) 12px var(--le-row-pad-y) calc(16px + var(--nested-depth, 0) * var(--le-indent));\n }\n\n // Row wrappers + inter-row group layout.\n &__rows {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n &__group {\n display: flex;\n flex-direction: column;\n }\n\n // Re-apply the `font` shorthand (shared class uses longhand for flat variants)\n // so the nested variant keeps its explicit line-height reset.\n .a-le-toolbar-status {\n font: 500 13px/1 var(--v-font-body, inherit);\n }\n}\n\n.a-le-row-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.a-nested-list-editor {\n // Root rows get a bolder title weight to anchor the hierarchy without header rows.\n .a-le-row:not(.a-le-row--child) .a-le-title {\n font-weight: 600;\n }\n\n // Reorder mode — flat-variant padding offset by the row's indent level.\n .a-le-row--reorder .a-le-row-header {\n padding-left: calc(12px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 8px;\n gap: 8px;\n }\n\n // Active (editing / readonly-expanded) tree-toggle picks up the primary tint\n // so the header reads \"active\" together with the title color.\n .a-le-row--editing &__tree-toggle,\n .a-le-row--expanded &__tree-toggle {\n color: var(--le-primary);\n }\n\n // Children wrapper — depth conveyed by the row's padding-left indent alone.\n &__children {\n position: relative;\n }\n\n // Triangle-caret toggle — circular text-style button (24×24), transparent\n // with a subtle tinted circle on hover.\n &__tree-toggle {\n width: 24px;\n height: 24px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n pointer-events: auto;\n color: rgb(0 0 0 / 54%);\n z-index: 2;\n flex-shrink: 0;\n transition:\n background 0.15s,\n color 0.15s;\n\n &:hover {\n background: rgb(0 0 0 / 5%);\n color: var(--le-on-surface);\n }\n\n &:focus-visible {\n outline: none;\n background: rgb(0 0 0 / 8%);\n }\n\n // Black at 54% is invisible on a dark surface (1.12:1). `:where` adds no specificity, so the primary\n // tint of an editing / expanded row above still wins.\n :where(.v-theme--dark) & {\n color: rgb(255 255 255 / 70%);\n\n &:hover {\n background: rgb(255 255 255 / 8%);\n }\n\n &:focus-visible {\n background: rgb(255 255 255 / 12%);\n }\n }\n }\n\n // Reserve caret column width on leaf rows so titles align across siblings.\n &__tree-toggle--spacer,\n &__tree-toggle--empty {\n width: 24px;\n height: 24px;\n background: transparent;\n visibility: hidden;\n pointer-events: none;\n }\n\n // Pure CSS right-pointing triangle; rotates to down when the row is open.\n &__tree-toggle-caret {\n width: 0;\n height: 0;\n border-left: 5px solid currentcolor;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n border-right: 0;\n transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(1px); // optical centering — triangle leans left\n }\n\n &__tree-toggle--open &__tree-toggle-caret {\n transform: translate(0, 1px) rotate(90deg);\n }\n\n // Dragged subtree (source + descendants) dimmed and non-hittable. `!important`\n // on display beats SortableJS's inline `display: none` under `forceFallback`.\n .a-le-row-wrapper.a-le-row--chosen,\n .a-le-row-wrapper.a-le-row-wrapper--drop-disabled {\n display: flex !important;\n opacity: 0.4 !important;\n pointer-events: none !important;\n }\n\n // Hide SortableJS's placeholder — our overlay is the sole landing indicator.\n .a-le-row--ghost {\n display: none !important;\n }\n\n // No floating clone — the line overlay carries all the \"where it lands\" info.\n // Wrapper selector beats the `.row-wrapper--drop-disabled` rule the clone inherits.\n .a-le-row-wrapper.a-le-row--drag {\n display: none !important;\n }\n\n // Drop indicator line — 2px primary stroke with an 8px left terminal dot,\n // absolute-positioned inside `__rows`.\n &__drop-line {\n position: absolute;\n height: 2px;\n margin-top: -1px;\n background: var(--le-primary);\n pointer-events: none;\n z-index: 4;\n border-radius: 1px;\n }\n\n &__drop-line-dot {\n position: absolute;\n left: -4px;\n top: 50%;\n width: 8px;\n height: 8px;\n background: var(--le-primary);\n border-radius: 50%;\n transform: translateY(-50%);\n }\n\n // Connector rail — vertical line linking the drop line up to the level-match row.\n &__drop-connector {\n position: absolute;\n width: 2px;\n margin-left: -1px;\n background: var(--le-primary);\n opacity: 0.5;\n pointer-events: none;\n z-index: 3;\n }\n\n // While dragging, dim the add-button so focus stays on the drag target.\n &__rows--dragging .a-le-row-add {\n opacity: 0.4;\n }\n\n // \"+N\" children indicator — hidden in the normal DOM, visible only inside the\n // SortableJS drag clone so the user sees the whole branch will follow.\n &__drag-count {\n display: none;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n padding: 2px 8px;\n font: 500 11px/1 var(--v-font-body, inherit);\n letter-spacing: 0.02em;\n color: var(--le-primary);\n background: var(--le-primary-container);\n border-radius: var(--le-radius-pill);\n flex-shrink: 0;\n }\n\n .a-le-row--drag &__drag-count {\n display: inline-flex;\n }\n}\n\n// Desktop — depth-aware padding-left aligns the inline form with the title column:\n// 16 (pad) + 24 (caret) + 10 (gap) = 50, plus depth*indent.\n@container le-shell (min-width: 769px) {\n .a-nested-list-editor {\n .a-le-row--editing .a-le-row-body,\n .a-le-row--expanded .a-le-row-body,\n .a-le-row--editing .a-le-row-footer,\n .a-le-row--expanded .a-le-row-footer {\n padding-left: calc(50px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 16px;\n }\n }\n}\n\n// Narrow / mobile — tighter indent so deep branches fit, taller touch rows,\n// always-visible actions, status badge dropped to make room for the title.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-nested-list-editor {\n --le-indent: 18px;\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu,\n .a-le-row .a-le-action--up,\n .a-le-row .a-le-action--down,\n .a-le-row .a-le-action--add-child {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A,GA+wBM+C,KAAc,+BAYdC,KAAY,IACZC,KAAW,I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlgBjB,IAAMQ,IAAQC,GA6CRC,IAAOH,IAiBPI,KAAY5D,GAA8B0D,GAAA,YAAmB,GAE/DI,KAAyC;EAC7C,EAAMF,UAAkB,KAAe,MAAO,EAAE,OAAO,OAAO,CAAC;EAC/D,IAAMG,IAAaC,IAA8B,GAAO,OAAa;GACnE,WAAW;IACT,EAAM;IAGN,IAAMC,IAAUL,GAAU;IAC1B,OAAOE,MAAgBG;GACzB;GACA,MAAM,MAAM;IAMV,AALA,KAAeC,GACf,GAAU,QAAQA,GAClBC,EAAQ,GAGRC,QAAe;KACb,AAAIN,OAAiBI,MACrB,KAAe,MACfC,EAAQ;IACV,CAAC;GACH;EACF,EAAE,GACIE,KAAOrE,GAAwB0D,GAAC,MAA2B,GAkB3D,EAAE,SAAMY,GAAQ,GAChBC,KAAQC,GAAS,GACjB,EAAE,qBAAiBC,EAAU,GAE7BC,KAASC,GAA4B,QAAQ,GAC7C,EAAE,iBAAaC,EAAkBF,EAAM,GAEvCG,KAAUC,EAAiB,GAE3BC,KAAwBC,QACxBvB,EAAM,iBAAiB,SAAe,SACtCA,EAAM,iBAAiB,YAAkB,YACtCwB,GAAS,QAAQ,SAAS,SAClC,GAEKC,IAAuBC,kBAAwB,IAAI,IAAI,CAAC,GAExDC,IAAqBD,kBAAwB,IAAI,IAAI,CAAC,GAKtDE,KAAY5B,EAAM,UAAU,MAC5B6B,KAAgB,OAAOD,MAAc,aAAa,OAAOA,IACzDE,KAAS,MACb,OAAOF,MAAc,aAAaA,GAAUG,CAAI,IAAKA,EAAKH,KAGtDI,YAAmC;GACvC,IAAMC,IAAIjC,EAAM;GAGhB,OAFIiC,MAAM,KAAA,KAAaA,MAAM,KAAc,aACvC,OAAOA,KAAM,WAAiBA,EAAE,QAC7BA;EACT,EAAA,CAAG;EAcH,EAZ8B,MAA4B;GACxD,IAAMC,KAAQ,MAAmC;IAC/C,KAAK,IAAM,KAAKC,GACd,AAAI,EAAE,YAAY,EAAE,SAAS,SAAS,MACpCV,EAAqB,MAAM,IAAIK,EAAM,EAAE,IAAI,CAAC,GAC5CI,EAAK,EAAE,QAAQ;GAGrB;GACA,EAAKE,EAAK,QAAQ;EACpB,EAEA,CAAqB9B,EAAW,KAAK;EAKrC,IAAM+B,KAA0D;GAC9D,WAAW/B,EAAW;GACtB,MAAM,MAAO,EAAW,QAAQG;GAChC,SAAST,EAAM;GACf,QAAQA,EAAM;GACd,UAAUA,EAAM;GAChB,aAAaA,EAAM;GACnB,UAAUA,EAAM;GAChB,oBAAoBA,EAAM,gBAAgB,CAAC;GAC3C,UAAUA,EAAM;EAClB,GAIMsC,KAAatC,EAAM,SAAS,OAAOuC,EAAqCvC,EAAM,UAAUqC,EAAiB,GACzGG,IAAaxC,EAAM,UAAUsC,IAAY,UAAUG,EAAqCJ,EAAiB,GAIzGK,KAAgBC,EAA4BL,IAAY,cAAc,IAAI,GAK1EM,IAAgBrB,QAAwC;GAC5D,IAAMsB,IAAgC,CAAC,GACnCC,IAAY,GACVC,IAAW/C,EAAM,UACjBkC,KAAQ,GAAgC,GAAe,MAA6C;IACxG,KAAK,IAAIc,IAAI,GAAGA,IAAIb,EAAM,QAAQ,KAAK;KACrC,IAAMc,IAAOd,EAAMa,IACbE,IAAMpB,EAAMmB,EAAK,IAAI,GACrBE,IAAkBF,EAAK,aAAa,KAAA,GACpCG,KAAcD,MAAoBF,EAAK,UAAU,UAAU,KAAK,GAChEI,KAAgBJ,EAAK,UAAU,UAAU,GACzCK,KAAiBP,KAAYQ,IAAQ;KAqB3C,AApBAV,EAAK,KAAK;MACR;MACA,OAAO;MACP,KAAKI,EAAK;MACV,UAAUA,EAAK,KAAKjB;MACpB;MACA;MACA,QAAQwB,GAAY,QAAQ;MAC5B,WAAWA,IAAa1B,EAAM0B,EAAW,IAAI,IAAI;MACjD;MACA;MACA;MACA,cAAcR;MACd,cAAcb,EAAM;MACpB,eAAea,MAAM;MACrB,cAAcA,MAAMb,EAAM,SAAS;MACnC,aAAagB,KAAmBG,KAAiB;MACjD,WAAWN,IAAI;MACf,YAAYO,IAAQ;KACtB,CAAC,GACGH,MAAalB,EAAKe,EAAK,UAAqCM,IAAQ,GAAGN,CAAI;IACjF;GACF;GAEA,OADAf,EAAK5B,EAAW,MAAM,UAAU,GAAG,IAAI,GAChCuC;EACT,CAAC;EAID,QACQD,EAAc,MAAM,KAAK,MAAO,OAAOa,EAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,SACxDf,GAAc,aAAaE,EAAc,MAAM,KAAK,MAAOa,EAAG,GAAG,CAAC,GACxE,EAAE,OAAO,OAAO,CAClB;EAKA,IAAMC,KAAWC,GAAqC,IAAI,GACpDC,KAAYlC,kBAAwB,IAAI,IAAI,CAAC,GAI7CmC,IAAyBnC,kBAAwB,IAAI,IAAI,CAAC,GAC1DoC,IAA0BpC,kBAAwB,IAAI,IAAI,CAAC,GAG3DqC,MAAU,MAA8B;GAE5C,AADAvB,EAAW,OAAOwB,CAAK,GACvB,GAAU,wBAAQ,IAAI,IAAI;EAC5B,GAEMC,KAAa,MAAuB;GACxC,IAAM,EAAE,YAASzB,EAAW,SAASU,CAAG;GACxC,IAAI,CAACD,GAAM;IACT,GAAU,MAAM,IAAIC,CAAG;IACvB;GACF;GACA,IAAMgB,KAAW,MAA6B;IAE5C,AADAN,GAAU,MAAM,IAAI9B,EAAMqC,EAAE,IAAI,CAAC,GAC7BA,EAAE,YAAUA,EAAE,SAAS,QAAQD,CAAO;GAC5C;GACA,EAAQjB,CAAI;EACd,GAEMmB,qBAAiB,IAAI,IAAmD,GACxEC,IAAqB9C,QAAiD;GAC1E,IAAM+C,IAAyC,CAAC,GAC1CC,oBAAW,IAAI,IAAmB;GACxC,KAAK,IAAMd,KAAMb,EAAc,OAAO;IACpC,EAAS,IAAIa,EAAG,GAAG;IACnB,IAAMe,IAAUC,EAAY,MAAM,IAAIhB,EAAG,GAAG,GACtCiB,IAAW/C,EAAmB,MAAM,IAAI8B,EAAG,GAAG,GAC9CkB,IAAmBlD,EAAqB,MAAM,IAAIgC,EAAG,GAAG,GACxDmB,IAAU5E,EAAM,aAAa,IAAIyD,EAAG,GAAG,KAAK,IAC5CoB,IAAQjB,GAAU,MAAM,IAAIH,EAAG,GAAG,GAGlCqB,IAAQ,GAAM,YAAmBtC,EAAW,UAAUiB,EAAG,GAAG,GAG5DsB,IAAU/E,EAAM,kBAAkBA,EAAM,WAAW,KAAQ8E,KAASD,GACpEG,IAASZ,GAAe,IAAIX,EAAG,GAAG;IACxC,IACEuB,KACAA,EAAO,QAAQvB,EAAG,OAClBuB,EAAO,UAAUvB,EAAG,SACpBuB,EAAO,aAAavB,EAAG,YACvBuB,EAAO,UAAUvB,EAAG,SACpBuB,EAAO,cAAcvB,EAAG,aACxBuB,EAAO,kBAAkBvB,EAAG,iBAC5BuB,EAAO,kBAAkBvB,EAAG,iBAC5BuB,EAAO,iBAAiBvB,EAAG,gBAC3BuB,EAAO,YAAYR,KACnBQ,EAAO,aAAaN,KACpBM,EAAO,qBAAqBL,KAC5BK,EAAO,YAAYJ,KACnBI,EAAO,UAAUF,KACjBE,EAAO,UAAUH,KACjBG,EAAO,YAAYD,GACnB;KACA,EAAK,KAAKC,CAAM;KAChB;IACF;IACA,IAAMC,KAA4C;KAChD,GAAGxB;KACH;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IAEA,AADAW,GAAe,IAAIX,EAAG,KAAKwB,EAAS,GACpCX,EAAK,KAAKW,EAAS;GACrB;GACA,KAAK,IAAM/B,KAAOkB,GAAe,KAAK,GACpC,AAAKG,EAAS,IAAIrB,CAAG,KAAGkB,GAAe,OAAOlB,CAAG;GAEnD,OAAOoB;EACT,CAAC,GAEKY,KAAU3D,QAAejB,EAAW,MAAM,SAAS,WAAW,CAAC,GAC/D6E,KAAiB5D,QAAeqB,EAAc,MAAM,MAAM,GAE1DwC,IAAgBlE,GAA4B,eAAe,GAE3DmE,IAAc9D,QAAe,CAACvB,EAAM,YAAY,CAACA,EAAM,YAAY,CAACA,EAAM,OAAO,GACjFsF,KAAkB/D,QAAe8D,EAAY,SAAS,CAACrF,EAAM,kBAAkBmF,GAAe,QAAQ,CAAC,GAEvGI,KAAehE,QAAe,CAAC,CAAET,GAAkC,IAAI,GACvE0E,KAAoBjE,QAAe,CAAC,CAAET,GAAkC,gBAAgB,GACxF2E,KAAuBlE,QAAe,CAAC,CAACvB,EAAM,UAAU,GAExD,EAAE,gBAAa,sBAAkB,kBAAc,eAAW,gBAAY,gBAAY,eAAW,wBACjG0F,GAA+C;GAC7C;GACA,aAAa;GACb;GAGA,kBAAkB,GAAK,MAASlD,EAAW,WAAWU,GAAKnB,GAAM,EAAK;GACtE,iBAAiB;IACf,IAAM4D,IAAwB,CAAC,GACzBzD,KAAQ,MAAmC;KAC/C,KAAK,IAAMiC,KAAKhC,GAEd,AADAwD,EAAK,KAAK7D,EAAMqC,EAAE,IAAI,CAAC,GACnBA,EAAE,YAAYA,EAAE,SAAS,UAAQjC,EAAKiC,EAAE,QAAQ;IAExD;IAEA,OADAjC,EAAK5B,EAAW,MAAM,QAAQ,GACvBqF;GACT;GACA,YAAY,MAAQ;IAClB,IAAM,EAAE,YAASnD,EAAW,SAASU,CAAG;IACxC,OAAOD,IAAO,EAAE,MAAMA,EAAK,KAAK,IAAI;GACtC;GACA,gBAAgB,MAAQ;IACtB,IAAM,EAAE,cAAWT,EAAW,SAASU,CAAG;IAC1C,AAAI0C,KACFnE,EAAqB,MAAM,IAAIK,EAAM8D,EAAO,IAAI,CAAC;GAErD;EACF,CAAC,GAEG,EACJ,cACA,gBACA,uBACA,gBACA,gBACA,sBACA,sBACA,qBACEC,GAAkC;GACpC;GACA;GACA;GACA;GACA,aAAa,MAAMC,EAAUC,CAAC;GAC9B,aAAa,MAAM;IACjB,EAAW,QAAQA;GACrB;GACA;GACA,eAAe;IAGb,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCC,GAAa;IAEb,KAAK,IAAMC,KAAKC,EAAe,OAAO,EAAqB,MAAM,IAAID,CAAC;IACtE,QAAe;KACb,AAAIE,EAAY,SAAOC,EAAc;IACvC,CAAC;GACH;GACA,uBAAuB;IAGrB,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCJ,GAAa;GACf;GAIA,gBAAgB;IACd,KAAK,IAAM9C,KAAOW,EAAuB,OAAO,EAAW,eAAeX,CAAG;IAC7E,KAAK,IAAMA,KAAOY,EAAwB,OACxC,EAAW,WAAWZ,GAAK;KAAE,cAAc;KAAO,UAAU;IAAM,CAAC;IAGrE,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCmD,GAAiB;GACnB;GACA,kBAAkB;IAGhB,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCA,GAAiB;GACnB;GACA,iBAAiB,MAASrG,EAAM,iBAAiBoC,CAAI;GACrD,MAAM;IACJ,oBAAoBlC,EAAK,eAAe;IACxC,qBAAqBA,EAAK,gBAAgB;IAC1C,iBAAiB,MAAYA,EAAK,mBAAmBoG,CAAO;IAC5D,oBAAoB,MAAQpG,EAAK,uBAAuBqG,CAAG;IAC3D,kBAAkBrG,EAAK,aAAa;GACtC;EACF,CAAC,GAIKsG,KAAqBjF,QAAuBkF,GAAW,QAAQ5C,EAAuB,MAAM,IAAI,GAChG6C,KAAuBnF,QAAwBoF,GAAkB,SAAS9C,EAAuB,MAAM,OAAO,CAAC,GAE/G+C,KAASrF,QAAe8D,EAAY,SAASrF,EAAM,iBAAiB,CAAC6G,EAAY,KAAK,GACtFV,IAAc5E,QAAesF,EAAY,SAAS,CAACzF,GAAQ,SAAS,CAACpB,EAAM,WAAW,GAEtF8G,KAAmBvF,QAAevB,EAAM,YAAY+G,EAAE,qBAAqB,CAAC,GAC5EC,KAAqBzF,QAAevB,EAAM,cAAc+G,EAAE,4BAA4B,CAAC,GACvFE,KAA6B1F,QAAevB,EAAM,sBAAsB+G,EAAE,oCAAoC,CAAC,GAC/GG,KAA4B3F,QAE9BvB,EAAM,sBACLA,EAAM,eAAe,cAClB+G,EAAE,mCAAmC,IACrCA,EAAE,2CAA2C,EACrD,GAEMI,KAAuB5F,QACZ,CAACvB,EAAM,YAAYA,EAAM,qBAAqB,CAAC6G,EAAY,SAAS1B,GAAe,QAAQ,CAC5G,GAEMiC,KAAuB7F,QAAiC,CAAC,CAACvB,EAAM,SAASwB,GAAS,KAAK,GAGvF0E,IAAiB3E,QAAgC;GACrD,IAAM8F,IAAuB,CAAC,GACxBnF,KAAQ,MAAmC;IAC/C,KAAK,IAAMiC,KAAKhC,GACd,AAAIgC,EAAE,YAAYA,EAAE,SAAS,SAAS,MACpCkD,EAAI,KAAKvF,EAAMqC,EAAE,IAAI,CAAC,GACtBjC,EAAKiC,EAAE,QAAQ;GAGrB;GAEA,OADAjC,EAAK5B,EAAW,MAAM,QAAQ,GACvB+G;EACT,CAAC,GAEKC,IAAc/F,QACZ2E,EAAe,MAAM,SAAS,KAAKA,EAAe,MAAM,OAAO,MAAMzE,EAAqB,MAAM,IAAIwE,CAAC,CAAC,CAC9G,GAEMsB,KAAmBhG,QAAwB,CAACsF,EAAY,SAASX,EAAe,MAAM,SAAS,CAAC,GAEhGsB,WAAwB;GAC5B,IAAIF,EAAY,OACd,KAAK,IAAMrB,KAAKC,EAAe,OAAO,EAAqB,MAAM,OAAOD,CAAC;QAEzE,KAAK,IAAMA,KAAKC,EAAe,OAAO,EAAqB,MAAM,IAAID,CAAC;EAE1E,GAEMwB,KAAgBlG,QAElB,CAAC,EACCvB,EAAM,SACLc,GAAkC,UAClCA,GAAkC,qBACnCqG,GAAqB,SACrBI,GAAiB,SACjBV,EAAY,MAElB,GAIMa,KAAoBhG,EAA2E,CAAC,CAAC,GACjGiG,KAAgBjG,EAAI,CAAC,GAErB2E,WAAyB;GAC7B,KAAK,IAAMuB,KAAKF,GAAkB,OAChC,IAAI;IACF,EAAE,KAAK;GACT,QAAQ,CAER;GAEF,GAAkB,QAAQ,CAAC;EAC7B,GASMG,IAAYnG,EAAsB,IAAI,GAQtCoG,MACJ,GACA,MACyE;GACzE,IAAMC,IAAM,SAAS,iBAAiBC,GAASC,CAAO;GACtD,IAAI,CAACF,GAAK,OAAO;GACjB,IAAMG,IAAUH,EAAI,QAAQ,mBAAmB;GAI/C,IAHI,CAACG,KAGD,CAAC9C,EAAc,SAAS,CAACA,EAAc,MAAM,SAAS8C,CAAO,GAAG,OAAO;GAC3E,IAAMhF,IAAMiF,GAASD,EAAQ,aAAa,SAAS,CAAC;GACpD,IAAIhF,MAAQ,MAAM,OAAO;GACzB,IAAMO,IAAKY,EAAmB,MAAM,MAAM,MAAM5D,EAAE,QAAQyC,CAAG;GAE7D,OADKO,IACE;IAAE,IAAIyE;IAAS,UAAUzE;GAAG,IADnB;EAElB,GAEM2E,MAAwB,GAAiB,MAAoB;GACjE,IAAI,CAACP,EAAU,SAAS,CAACzC,EAAc,OAAO;GAC9C,IAAM2C,IAAMD,GAAWE,GAASC,CAAO;GACvC,IAAI,CAACF,GAAK;IACR,EAAU,MAAM,cAAc;IAC9B;GACF;GACA,IAAMM,IAAgBjD,EAAc,MAAM,sBAAsB,GAI1DkD,KADQP,EAAI,GAAG,cAAc,oBAClB,KAASA,EAAI,GAAA,CAAI,sBAAsB;GACxD,EAAU,MAAM,cAAcQ,GAAmB;IAC/C,SAAS;KAAE,GAAGP;KAAS,GAAGC;IAAQ;IAClC,YAAY;KACV,KAAKF,EAAI,SAAS;KAClB,MAAMO;KACN,OAAOP,EAAI,SAAS;KACpB,WAAWA,EAAI,SAAS;KACxB,cAAcA,EAAI,SAAS;KAC3B,cAAcA,EAAI,SAAS;IAC7B;IACA,WAAWF,EAAU,MAAM;IAC3B,oBAAoBA,EAAU,MAAM;IACpC,WAAWxD,EAAmB;IAC9B,UAAUrE,EAAM;IAChB,UAAUT;IACV,eAAe8I,EAAc;IAC7B,sBAAsB7I;GACxB,CAAC;EACH,GAEMgJ,MAAiB,MAAoB;GACzC,GAAqB,EAAE,SAAS,EAAE,OAAO;EAC3C,GAEMC,MAAoB,GAA6B,MAA6B;GAElF,AADWjG,EAAW,OAAOkG,GAAWC,EAAK,WAAWA,EAAK,KACxD,KAML1E,EAAUyE,CAAS,GAEfC,EAAK,aAAaA,EAAK,cAAc,QACvClH,EAAqB,MAAM,IAAIkH,EAAK,SAAS,MAR7CC,GAAa,qCAAqC,GAClD,GAAc,SACdjI,QAAeyF,EAAc,CAAC;EAQlC,GAEMA,UAAsB;GAG1B,IAFAC,GAAiB,GACb,CAACF,EAAY,SACb,CAACf,EAAc,OAAO;GAC1B,IAAMyD,IAAS,MAAM,KAAKzD,EAAc,MAAM,iBAA8B,MAAM9F,EAAW,CAAC;GAC9F,KAAK,IAAMwJ,KAASD,GAAQ;IAC1B,IAAME,IAAWC,GAAYF,GAAO,CAAC,GAAG;KACtC,OAAO;MAAE,MAAM;MAAY,MAAM;MAAM,KAAK;KAAK;KACjD,QAAQ;KACR,WAAW;KACX,YAAYG;KACZ,aAAaC;KACb,WAAWC;KACX,gBAAgB;KAChB,eAAe;KACf,mBAAmB;KACnB,UAAU,MAAU;MAClB,IAAMC,IAAYC,EAAM,MAClBC,IAAKnB,GAASiB,EAAU,aAAa,SAAS,CAAC;MACrD,IAAIE,MAAO,MAAM;MACjB,IAAMC,IAAc/G,EAAW,SAAS8G,CAAE,CAAC,CAAC,MACtCE,IAAeD,IAAc/G,EAAW,sBAAsB+G,CAAW,IAAI;MAMnF,AALA,EAAU,QAAQ;OAChB,WAAWD;OACX,oBAAoBE;OACpB,aAAa;MACf,GACA,SAAS,iBAAiB,eAAehB,IAAe,EAAE,SAAS,GAAK,CAAC;KAC3E;KACA,SAAS,MAAU;MAGjB,IAAMiB,IAAQJ,EAA+C;MAC7D,IAAII,GAAM;OACR,IAAI,aAAaA,KAAQ,aAAaA,GACpC,GAAsBA,EAAoB,SAAUA,EAAoB,OAAO;YAC1E,IAAI,aAAaA,GAAM;QAC5B,IAAMC,IAAMD;QACZ,AAAIC,EAAI,QAAQ,SAAS,KACvBtB,GAAqBsB,EAAI,QAAQ,EAAE,CAAE,SAASA,EAAI,QAAQ,EAAE,CAAE,OAAO;OAEzE;MACF;MAEA,OAAO;KACT;KACA,aAAa;MACX,SAAS,oBAAoB,eAAelB,EAAa;MACzD,IAAMmB,IAAQ9B,EAAU;MAExB,IADA,EAAU,QAAQ,MACd,CAAC8B,GAAO;MACZ,IAAMhB,IAAOgB,EAAM;MACnB,AAAIhB,MAAS,QACTA,EAAK,SAAS,aAClBF,GAAiBE,GAAMgB,EAAM,SAAS;KACxC;IACF,CAAC;IACD,GAAkB,MAAM,KAAKZ,CAAQ;GACvC;EACF,GAEMZ,MAAY,MAA6C;GAC7D,IAAIyB,MAAQ,QAAQA,MAAQ,IAAI,OAAO;GAIvC,IAAM,IAAIC,EAAYD,CAAG;GACzB,OAAO,OAAO,CAAC,MAAMA,IAAM,IAAIA;EACjC;EA4BA,AA1BAE,QACQ3D,EAAY,aACZ;GACJ,AAAIA,EAAY,QAAOxF,QAAeyF,EAAc,CAAC,IAChDC,GAAiB;EACxB,CACF,GAEAyD,QACQnC,GAAc,aACd;GACJ,AAAIxB,EAAY,SAAOxF,QAAeyF,EAAc,CAAC;EACvD,CACF,GAGA0D,QACQzF,EAAmB,MAAM,KAAK,MAAM5D,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,SACnD;GACJ,AAAI0F,EAAY,SAAOxF,QAAeyF,EAAc,CAAC;EACvD,CACF,GAEA2D,SAAgB;GACd,AAAI5D,EAAY,SAAOC,EAAc;EACvC,CAAC,GACD4D,SAAsB;GAEpB,AADA3D,GAAiB,GACjB,SAAS,oBAAoB,eAAemC,EAAa;EAC3D,CAAC;EAYD,IAAMyB,IAAgB1I,QAAqC;GACzD,IAAMoI,IAAQ9B,EAAU;GACxB,IAAI,CAAC8B,KAASA,EAAM,gBAAgB,QAAQ,CAACvE,EAAc,OAAO,OAAO;GACzE,IAAMuD,IAAOgB,EAAM;GAEnB,IAAIhB,EAAK,SAAS,WAAW,OAAO;GACpC,IAAMuB,IAAa9E,EAAc,MAAM,cACrC,8BAA8B,IAAI,OAAO,OAAOuD,EAAK,MAAM,CAAC,EAAE,GAChE;GACA,IAAI,CAACuB,GAAY,OAAO;GACxB,IAAMC,IAAQD,EAAW,cAA2B,oBAAoB,GAClE7B,IAAgBjD,EAAc,MAAM,sBAAsB,GAC1DkD,KAAW6B,KAASD,EAAA,CAAY,sBAAsB,GAEtDE,IAAW5K,KAAWmJ,EAAK,QAAQpJ,IACnC8K,IAAU1B,EAAK,YAAY,QAAQL,EAAQ,MAAMD,EAAc,MAAMC,EAAQ,SAASD,EAAc,KACpGiC,IAAO;IAAE,KAAKD;IAAS,MAAMD;IAAU,OAAO;GAAG,GAEnDG,IAAwC;GAC5C,IAAI5B,EAAK,gBAAgB,MAAM;IAC7B,IAAM6B,IAAepF,EAAc,MAAM,cACvC,8BAA8B,IAAI,OAAO,OAAOuD,EAAK,WAAW,CAAC,EAAE,GACrE;IACA,IAAI6B,GAAc;KAEhB,IAAMC,KADWD,EAAa,cAA2B,oBACtC,KAAYA,EAAA,CAAc,sBAAsB,GAC7DE,IAAeD,EAAU,MAAMpC,EAAc,MAAMoC,EAAU,SAAS;KAC5E,AAAIC,IAAeL,MACjB,IAAY;MACV,KAAKK;MACL,QAAQL,IAAUK;MAClB,MAAMN;KACR;IAEJ;GACF;GAEA,OAAO;IAAE;IAAM;GAAU;EAC3B,CAAC,GAKKO,WAAmB;GACvB,AAAK/D,GAAO,UACZgE,GAAgB,GACZ5K,EAAM,WAASwC,EAAW,QAAQ,GACtCtC,EAAK,OAAO,KAAA,CAAS;EACvB,GAEM2K,MAAsB,MAA8B;GACxD,AAAKxF,EAAY,UACjBuF,GAAgB,GACZ5K,EAAM,WAASwC,EAAW,SAASiB,EAAG,KAAK,KAAA,GAAWA,EAAG,eAAe,GAC5EvD,EAAK,OAAO;IAAE,SAASuD,EAAG;IAAK,iBAAiBA,EAAG;GAAgB,CAAC;EACtE,GAEMqH,MAAmB,MAA8B;GACrD,AAAKzF,EAAY,SACZ5B,EAAG,gBACRmH,GAAgB,GAChBnJ,EAAqB,MAAM,IAAIgC,EAAG,GAAG,GACrCvD,EAAK,aAAauD,CAAE,GAGhBzD,EAAM,WAASwC,EAAW,SAASiB,EAAG,KAAK,KAAA,GAAW,EAAI,GAC9DvD,EAAK,OAAO;IAAE,UAAUuD,EAAG;IAAK,iBAAiB;GAAK,CAAC;EACzD,GAEMsH,MAAe,MAA8B;GACjD,AAAK1F,EAAY,SAAS,GAAY,UAElCZ,EAAY,MAAM,IAAIhB,EAAG,GAAG,IAC9BuH,GAAavH,CAAE,KAGb8B,GAAa,SACf0F,GAAUxH,CAAE,GAEdvD,EAAK,QAAQuD,CAAE;EACjB,GAGMyH,MAAkB,MAA8B;GACpD,IAAIlL,EAAM,YAAYA,EAAM,SAAS;GACrC,IAAMkD,IAAMO,EAAG,KACT0H,IAAY1J,EAAqB,MAAM,IAAIyB,CAAG;GAGpD,AAFIiI,IAAW1J,EAAqB,MAAM,OAAOyB,CAAG,IAC/CzB,EAAqB,MAAM,IAAIyB,CAAG,GACvChD,EAAK,eAAeuD,GAAI,CAAC0H,CAAS;EACpC,GAGMC,MAAkB,MAA8B;GACpD,IAAIpL,EAAM,YAAYA,EAAM,SAAS;GACrC,IAAMkD,IAAMO,EAAG,KACT0H,IAAYxJ,EAAmB,MAAM,IAAIuB,CAAG;GAGlD,AAFIiI,IAAWxJ,EAAmB,MAAM,OAAOuB,CAAG,IAC7CvB,EAAmB,MAAM,IAAIuB,CAAG,GACrChD,EAAK,eAAeuD,GAAI,CAAC0H,CAAS;EACpC,GAEME,MAAkB,MAClBrL,EAAM,mBACNA,EAAM,YAAYA,EAAM,WACxB6G,EAAY,QAAc,KAE9B,GADIpD,EAAG,WAAWA,EAAG,YACjB,CAACzD,EAAM,YAAYA,EAAM,iBAIzBsL,MAAc,MAAuC;GACzD,AAAKD,GAAe5H,CAAE,MAClBA,EAAG,WAAWA,EAAG,WACnBuH,GAAavH,CAAE,IAGbzD,EAAM,YAAYwF,GAAkB,QAAO4F,GAAe3H,CAAE,IAC3DsH,GAAYtH,CAAE;EACrB,GAEM,EACJ,kBACA,oBACA,iBACA,eAAe8H,IACf,2BACA,6BACEC,GAA8C;GAChD,kBAAkB,MAAS,GAAM,mBAAkBxL,EAAM,gBAAgB4J,CAAG;GAC5E,WAAW,MAAQ5J,EAAM,WAAW4J,CAAG;GACvC,YAAY,MAAO;IAIjB,AAHAnF,EAAY,MAAM,OAAOhB,EAAG,GAAG,GAC/BgI,GAAiB,MAAM,OAAOhI,EAAG,GAAG,GACpC9B,EAAmB,MAAM,OAAO8B,EAAG,GAAG,GACtChC,EAAqB,MAAM,OAAOgC,EAAG,GAAG;IACxC,IAAMiI,IAAW1L,EAAM,eAAe;IActC,AAXI6G,EAAY,UACV6E,IAAU7H,EAAuB,MAAM,IAAIJ,EAAG,GAAG,IAChDK,EAAwB,MAAM,IAAIL,EAAG,GAAG,IAO3CiI,IAAUlJ,EAAW,WAAWiB,EAAG,KAAK,EAAE,cAAc,GAAK,CAAC,IAC7DjB,EAAW,WAAWiB,EAAG,KAAK;KAAE,cAAc;KAAO,UAAU;IAAM,CAAC,GAC3EvD,EAAK,WAAWuD,CAAE;GACpB;GACA,4BAA4BzD,EAAM;EACpC,CAAC,GAEK2L,KAAgB,OAAO,MAA8B;GACzD,AAAKtG,EAAY,SACjB,MAAMkG,GAAmB9H,CAAE;EAC7B,GAIMmI,KAAalK,kBAAwB,IAAI,IAAI,CAAC,GAC9CmK,KAAc,OAAO,MAA8B;GACvD,IAAI,IAAW,MAAM,IAAIpI,EAAG,GAAG,GAC/B;OAAW,MAAM,IAAIA,EAAG,GAAG;IAC3B,IAAI;KACF,AAAIzD,EAAM,cAAY,MAAMA,EAAM,WAAWyD,EAAG,GAAG;IACrD,UAAU;KACR,GAAW,MAAM,OAAOA,EAAG,GAAG;IAChC;IAEA,AADAqI,GAAWrI,CAAE,GACbvD,EAAK,cAAcuD,CAAE;GAPM;EAQ7B,GAEMsI,MAAiB,MAA8B;GACnD,GAAWtI,CAAE;EACf,GAEMuH,MAAgB,MAA8B;GAElD,AADAgB,GAAUvI,CAAE,GACZvD,EAAK,SAASuD,CAAE;EAClB,GAEMwI,MAAU,MAAsB;GACpC,AAAIzJ,EAAW,OAAO8G,CAAE,KAAGrF,EAAUqF,CAAE;EACzC,GACM4C,MAAY,MAAsB;GACtC,AAAI1J,EAAW,SAAS8G,CAAE,KAAGrF,EAAUqF,CAAE;EAC3C,GACM6C,MAAW,MAAsB;GACrC,AAAI3J,EAAW,QAAQ8G,CAAE,KAAGrF,EAAUqF,CAAE;EAC1C,GACM8C,MAAc,MAAsB;GACxC,AAAI5J,EAAW,WAAW8G,CAAE,KAAGrF,EAAUqF,CAAE;EAC7C,GACM+C,MAAY,MAA8B;GAC9C,AAAK7J,EAAW,OAAOiB,EAAG,GAAG,KAI7BQ,EAAUR,EAAG,GAAG,GAChBvD,EAAK,UAAUuD,CAAE,KAJfmF,GAAa,qCAAqC;EAKtD,GACM0D,MAAa,MAA8B;GAC/C,AAAK9J,EAAW,QAAQiB,EAAG,GAAG,MAC9BQ,EAAUR,EAAG,GAAG,GAChBvD,EAAK,WAAWuD,CAAE;EACpB,GAEMjH,MAAsB,MAAuBC,EAAuBmN,GAAK,EAAE,cAAc5J,EAAM,aAAa,CAAC,GAK7GyM,MAAqB,GAAY,MACrCvJ,MAAQ,KAAA,IAAY,OAAOV,EAAW,SAASoH,GAAK1G,GAAKuB,EAAY,MAAM,IAAIvB,CAAG,CAAC,GAsB/EwJ,qBAAe,IAAI,IAAkC,GACrDC,MAAc,MAAsC;GACxD,IAAIC,IAAUF,GAAa,IAAIxJ,CAAG;GAuDlC,OAtDK0J,MACH,IAAU;IACR,YAAY;KACV,IAAMnJ,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIsH,GAAYtH,CAAE;IACxB;IACA,YAAY;KACV,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,OAAOO,IAAKoI,GAAYpI,CAAE,IAAI,KAAA;IAChC;IACA,cAAc;KACZ,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIsI,GAActI,CAAE;IAC1B;IACA,aAAa;KACX,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIuH,GAAavH,CAAE;IACzB;IACA,QAAQ,YAAY;KAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI,MAAMkI,GAAclI,CAAE;IAChC;IACA,gBAAgB;KACd,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIoH,GAAmBpH,CAAE;IAC/B;IACA,gBAAgB;KACd,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIqH,GAAgBrH,CAAE;IAC5B;IACA,oBAAoB;KAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIyH,GAAezH,CAAE;IAC3B;IACA,oBAAoB;KAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI2H,GAAe3H,CAAE;IAC3B;IACA,cAAcwI,GAAO/I,CAAG;IACxB,gBAAgBgJ,GAAShJ,CAAG;IAC5B,eAAeiJ,GAAQjJ,CAAG;IAC1B,kBAAkBkJ,GAAWlJ,CAAG;IAChC,cAAc;KACZ,IAAMO,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI4I,GAAS5I,CAAE;IACrB;IACA,eAAe;KACb,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI6I,GAAU7I,CAAE;IACtB;IACA,SAAS,MAAgBjB,EAAW,WAAWU,GAAKnB,CAAI;GAC1D,GACA2K,GAAa,IAAIxJ,GAAK0J,CAAO,IAExBA;EACT;EACA,QACQvI,EAAmB,QACxB,MAAQ;GACP,IAAIqI,GAAa,SAAS,GAAG;GAC7B,IAAMnI,IAAW,IAAI,IAAIuI,EAAI,KAAK,MAAMrM,EAAE,GAAG,CAAC;GAC9C,KAAK,IAAMyC,KAAOwJ,GAAa,KAAK,GAClC,AAAKnI,EAAS,IAAIrB,CAAG,KAAGwJ,GAAa,OAAOxJ,CAAG;EAEnD,CACF;EAEA,IAAM6J,MAAkB,OAAwC;GAC9D,MAAM;IAAE,GAAGtJ;IAAI,iBAAiBgJ,GAAkBhJ,EAAG,KAAcA,EAAG,GAAG;GAAE;GAC3E,KAAKA,EAAG;GACR,OAAOA,EAAG;GACV,KAAKA,EAAG;GACR,OAAOA,EAAG;GACV,QAAQA,EAAG;GACX,WAAWA,EAAG;GACd,eAAeA,EAAG;GAClB,aAAaA,EAAG;GAChB,iBAAiBA,EAAG;GACpB,eAAeA,EAAG;GAClB,cAAcA,EAAG;GACjB,UAAUzD,EAAM;GAChB,UAAUA,EAAM;GAChB,UAAUyD,EAAG;GACb,kBAAkBA,EAAG;GACrB,SAASA,EAAG;GACZ,OAAOA,EAAG;GACV,SAASA,EAAG;GACZ,OAAOA,EAAG;GACV,aAAaoD,EAAY;GACzB,WAAW,CAACpD,EAAG;GACf,aAAa,CAACA,EAAG;GACjB,WAAWA,EAAG;GACd,YAAYA,EAAG;GACf,aAAaA,EAAG;GAChB,OAAOrC,GAAQ;GACf,gBAAgBsB,GAAc,UAAUe,EAAG,GAAG;GAC9C,SAASkJ,GAAWlJ,EAAG,GAAG;EAC5B,IAEMuJ,KAAmBzL,SAAgB;GACvC,UAAU0L,GAAS;GACnB,mBAAmBvG,GAAqB;GACxC,YAAYF,GAAmB;GAC/B,OAAO0G,GAAW;GAClB,SAAS;IACP,OAAOC;IACP,QAAQC;GACV;EACF,EAAE,GAEIC,KAAyB9L,SAAgB;GAC7C,MAAMX,GAAK;GACX,UAAU,CAAC0E,GAAgB;GAC3B,mBAAmBqB,GAAkB;GACrC,SAAS;IACP;IACA,iBAAiByG;GACnB;EACF,EAAE,GAEIE,KAAmB/L,QAAe,IAAI,IAAI2E,EAAe,KAAK,CAAC,GAE/D2G,KAAU,MACdxI,EAAmB,MAAM,MAAM,MAAM5D,EAAE,QAAQyC,CAAG,GAE9CqK,KAAcC,EAAe;GACjC,WAAWjM,QACT8C,EAAmB,MAAM,KAAK,OAAQ;IACpC,KAAKZ,EAAG;IACR,UAAUA,EAAG;IACb,WAAW6J,GAAiB,MAAM,IAAI7J,EAAG,GAAG;IAC5C,WAAW;IACX,YAAY;GACd,EAAE,CACJ;GACA,SAAS;GACT,eAAeoD;GACf,UAAUtF,QAAe,CAAC8D,EAAY,KAAK;GAC3C,YAAY,MAAQZ,EAAY,MAAM,IAAIvB,CAAG;GAC7C,eAAe,MAAQ;IACrB,IAAMO,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAIsH,GAAYtH,CAAE;GACxB;GACA,eAAe,MAAQ;IACrB,IAAMA,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAIuH,GAAavH,CAAE;GACzB;GACA,WAAW,MAAQwI,GAAO/I,CAAG;GAC7B,aAAa,MAAQgJ,GAAShJ,CAAG;GACjC,YAAY,MAAQiJ,GAAQjJ,CAAG;GAC/B,eAAe,MAAQkJ,GAAWlJ,CAAG;GACrC,WAAW,MAAQ;IACjB,IAAMO,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAI4I,GAAS5I,CAAE;GACrB;GACA,YAAY,MAAQ;IAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAI6I,GAAU7I,CAAE;GACtB;GACA,mBAAmB,MAAQ;IACzB,IAAMA,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAIyH,GAAezH,CAAE;GAC3B;GACA,uBAAuB2J,EAAkB;EAC3C,CAAC,GAEKK,KAA2B/L,EAAa,EAAK,GAC7CgM,IAAuB/J,GAAkD,IAAI,GAC7EgK,KAAwBpM,QAId;GACd,IAAMqM,IAASF,EAAqB;GACpC,IAAI,CAACE,GAAQ,OAAO;GACpB,IAAMC,IAAQrL,EAAW,SAASoL,EAAO,GAAG,GACtCE,IAAWD,EAAM,QAAQ,YAAYvN,EAAW,MAAM,UACtDyN,IAAMD,EAAS,WAAW,MAAMhM,EAAM8F,EAAE,IAAI,MAAMgG,EAAO,GAAG;GAClE,OAAO;IACL,UAAUC,EAAM,SAAS/L,EAAM+L,EAAM,OAAO,IAAI,IAAI;IACpD,OAAOC,EAAS;IAChB,cAAcC;GAChB;EACF,CAAC,GACKC,KAAsBzM,QAC1BmM,EAAqB,QAAQlR,GAAmBkR,EAAqB,MAAM,GAAG,IAAI,EACpF,GACMO,MAAsB,MAAuC;GACjE,AAAKjO,EAAM,uBACX,EAAqB,QAAQyD,GAC7B,GAAyB,QAAQ;EACnC,GACMyK,MAA2B,MAAqB;GACpD,IAAMC,IAAMR,GAAsB,OAC5BC,IAASF,EAAqB;GAGpC,IAFA,EAAqB,QAAQ,MACzB,CAACS,KAAO,CAACP,KACTQ,MAAaD,EAAI,cAAc;GACnC,IAAME,IAAOD,IAAWD,EAAI,eAAeC,IAAW,IAAIA;GAC1D,AAAI5L,EAAW,OAAOoL,EAAO,KAAKO,EAAI,UAAUE,CAAI,KAClDpK,EAAU2J,EAAO,GAAG;EAExB,GAEMU,KAAyB5M,EAAa,EAAK,GAC3C6M,KAAqB5K,GAAkD,IAAI,GAC3E6K,MAAoB,MAAuC;GAC/D,AAAKxO,EAAM,qBACX,GAAmB,QAAQyD,GAC3B,GAAuB,QAAQ;EACjC,GACMgL,MAAyB,GAAgC,MAA+B;GAC5F,IAAMb,IAASW,GAAmB;GAElC,IADA,GAAmB,QAAQ,MACvB,CAACX,GAAQ;GAEb,IAAIc,IAAe;GACnB,AAIEA,IAJEC,MAAa,OACArO,EAAW,MAAM,SAAS,SAE3BkC,EAAW,SAASmM,CACnB,CAAA,CAAM,MAAM,UAAU,UAAU;GAEjD,IAAMC,IAAcC,MAAa,UAAU,IAAIH;GAC/C,AAAIlM,EAAW,OAAOoL,EAAO,KAAKe,GAAUC,CAAW,MACrD3K,EAAU2J,EAAO,GAAG,GAChBe,MAAa,QAAMlN,EAAqB,MAAM,IAAIkN,CAAQ;EAElE,GAGMG,KAAavN,SAAgB;GACjC,aAAasF,EAAY;GACzB,UAAU7G,EAAM;GAChB,aAAaqF,EAAY;GACzB,aAAac,EAAY;GACzB,kBAAkBnG,EAAM;GACxB,gBAAgBA,EAAM;GACtB,kBAAkBA,EAAM;GACxB,oBAAoBA,EAAM;GAC1B,oBAAoBA,EAAM;GAC1B,oBAAoBA,EAAM;GAC1B,kBAAkBA,EAAM;GACxB,sBAAsByF,GAAqB;GAC3C,aAAazF,EAAM;GACnB,uBAAuBsB,GAAsB;GAC7C;GACA;GACA,oBAAAiL;GACA,oBAAoB,GAAY,MAAwBE,GAAkB7C,GAAK1G,CAAG;GAClF;EACF,EAAE,GAGI6L,KAAe;GACnB;GACA;GACA;GACA;GACA;GACA;GACA;GACA,iBAAiBlE;GACjB;GACA,SAAS,MAAsBoB,GAAO3C,CAAE;GACxC,WAAW,MAAsB4C,GAAS5C,CAAE;GAC5C,UAAU,MAAsB6C,GAAQ7C,CAAE;GAC1C,aAAa,MAAsB8C,GAAW9C,CAAE;GAChD,QAAQ+C;GACR,SAASC;GACT;GACA;EACF,GAEM0C,KAAgBzN,QAAe8C,EAAmB,MAAM,QAAQ,MAAM5D,EAAE,cAAc,IAAI,CAAC,GAM3FwO,WAA8D;GAClE,IAAM5H,oBAAM,IAAI,IAA0C,GACpDnF,KAAQ,MAAmC;IAC/C,KAAK,IAAMiC,KAAKhC,GAEd,AADAkF,EAAI,IAAIvF,EAAMqC,EAAE,IAAI,GAAGA,CAAC,GACpBA,EAAE,UAAU,UAAQjC,EAAKiC,EAAE,QAAQ;GAE3C;GAEA,OADAjC,EAAK5B,EAAW,MAAM,QAAQ,GACvB+G;EACT,GACM6H,WAAwC,IAAI,IAAI,CAAC,GAAGD,GAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,MAAMzM,EAAW,UAAUyD,CAAC,CAAC,CAAC,GAM/GkJ,MAAiB,GAAgB,IAAwB,CAAC,MAAM;GACpE,IAAMC,IAAW,IAAI,IAAIH,GAAW,CAAC,CAAC,KAAK,CAAC,GACtCI,IAASH,GAAY;GAE3B,AADAI,EAAG,GACH3O,QAAe;IACb,IAAMwB,IAAQ8M,GAAW,GACnBM,IAAW,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG5J,GAAM,GAAG,CAAC,GAAGuJ,GAAY,CAAC,CAAC,CAAC,QAAQ,MAAM,CAACG,EAAO,IAAIpJ,CAAC,CAAC,CAAC,CAAC,CAAC,GAGtFuJ,IAAaD,EAAS,QAAQ,MAAM,CAACH,EAAS,IAAInJ,CAAC,KAAK9D,EAAM,IAAI8D,CAAC,CAAC,EAAE,KAAK,KAAK;IACtF,EAAW,WAAWsJ,CAAQ;IAC9B,IAAME,IAAUR,GAAW;IAC3B,KAAK,IAAMhJ,KAAKuJ,GAAY;KAC1B,IAAMvM,IAAOwM,EAAQ,IAAIxJ,CAAC;KAC1B,AAAIhD,KAAMT,EAAW,WAAWyD,GAAGhD,EAAK,MAAM,EAAI;IACpD;GACF,CAAC;EACH;EAGA,QACEjD,EAAM,uBAAuB,CAACA,EAAM,iBAChC;GAAE,OAAOA,EAAM;GAAqB,OAAOwC,EAAW,WAAW;EAAM,IACvE,CAAC,CACP;EAOA,IAAMkN,WACJC,GAAqBnN,IAAa,MAAQ;GACxC,IAAIoN,IAAWpN,EAAW,SAASU,CAAG,CAAC,CAAC;GACxC,OAAO0M,IAEL,AADAnO,EAAqB,MAAM,IAAIK,EAAM8N,EAAS,IAAI,CAAC,GACnD,IAAWpN,EAAW,SAASV,EAAM8N,EAAS,IAAI,CAAC,CAAC,CAAC;GAEvD,IAAMnM,IAAKjB,EAAW,UAAU,MAAM,MAAM,MAAM/B,EAAE,QAAQyC,CAAG;GAC/D,AAAIO,KAAIwH,GAAUxH,CAAE;EACtB,CAAC;E,OAKHoM,GAA2B;GACzB,WAAWrN,EAAW;GACtB,iBAAiBxC,EAAM;GACvB,kBAAkBA,EAAM,aAAa,KAAA;GACrC,QAAQ0P;EACV,CAAC,GAED5P,GAA6E;GAC3E,GAAG0C;GACH,aAAakN;GACb;GACA;GAEA,WAAW9M;GACX;GACA;GACA;GACA,SAAS,MAAsBnB,EAAqB,MAAM,IAAI6H,CAAE;GAChE,WAAW,MAAsB7H,EAAqB,MAAM,OAAO6H,CAAE;GACrE,eAAe,MAAsB;IACnC,AAAI7H,EAAqB,MAAM,IAAI6H,CAAE,IAAG7H,EAAqB,MAAM,OAAO6H,CAAE,IACvE7H,EAAqB,MAAM,IAAI6H,CAAE;GACxC;GACA,eAAe,MAAsB3H,EAAmB,MAAM,IAAI2H,CAAE;GACpE,iBAAiB,MAAsB3H,EAAmB,MAAM,OAAO2H,CAAE;EAC3E,CAAC,I,UAIC5M,EAAA,GAAAC,EAwVM,OAAA;GAvVA,SAAA;GAAJ,KAAIsE;GACJ,OAAKrE,GAAA,CAAC,wBAAsB,CACkB,8BAAAgE,GAAA,S;IAA0D,kCAAAX,EAAA;IAAoD,kCAAAA,EAAA;IAAiD,+BAAApD,EAAAuE,EAAA;IAAuD,sCAAA+E,EAAA;;;GAUpQrJ,EA4RM,OA5RNgC,IA4RM;IA1RI2I,GAAA,SADR/K,EAAA,GAAAC,EAwHM,OAxHNoC,IAwHM,CApHJhC,EAmHOqT,EAAA,QAAA,UAnHPpT,EAmHO,EAjHJ,OAAOiD,EAAA,MAAK,GACLoN,GAAA,KAAsB,SAgHzB,CA7GGpN,EAAA,SADRvD,EAAA,GAAAC,EAKK,MALLqC,IAKK/B,EADAgD,EAAA,KAAK,GAAA,CAAA,K,WAEVnD,EAuGM,OAvGNmC,IAuGM,CAtGYpC,EAAAgK,CAAA,IAGd9J,EA6BOqT,EAAA,QAAA,mBAAAjT,GAAAC,GA3BG4P,GAAA,KAAgB,CAAA,SA2BnB;KAzBL3P,EAKEC,IAAA;MAJC,OAAKV,GAAA,EAAA,gCAAoC8J,GAAA,MAAoB,CAAA;MAC7D,uBAAqBA,GAAA;MACrB,iBAAeF,GAAA;MACf,OAAO3J,EAAAqQ,EAAA;;;;;;;KAEV7P,EAOOE,GAAA;MANL,SAAQ;MACR,MAAK;MACJ,UAAUV,EAAAoQ,EAAA;MACV,SAAOpQ,EAAAuQ,CAAA;;MAER,SAAA5P,QAAwC,CAArCC,EAAAR,EAAAJ,EAAAkK,CAAA,CAAC,CAAA,+BAAA,CAAA,GAAA,CAAA,C;;;KAEN1J,EAUOE,GAAA;MATL,OAAM;MACN,SAAQ;MACR,MAAK;MACL,gBAAa;MACZ,SAASV,EAAAoQ,EAAA;MACT,UAAUpQ,EAAAoQ,EAAA,KAAQ,CAAKvG,GAAA;MACvB,SAAO7J,EAAAsQ,EAAA;;MAER,SAAA3P,QAAuC,CAApCC,EAAAR,EAAAJ,EAAAkK,CAAA,CAAC,CAAA,8BAAA,CAAA,GAAA,CAAA,C;;;;;;;I,iBAIVrK,EAAA,GAAAC,EAmEWe,IAAA,EAAA,KAAA,EAAA,GAAA,CAjED6J,GAAA,SAAoBH,GAAA,SAD5B1K,EAAA,GAAAiB,GAkBOJ,GAAA;;KAhBJ,cAAY+J,EAAA,QAAczK,EAAAkK,CAAA,CAAC,CAAA,6BAAA,IAAkClK,EAAAkK,CAAA,CAAC,CAAA,2BAAA;KAC/D,SAAQ;KACR,OAAM;KACN,MAAA;KACA,MAAK;KACJ,SAAOS;;KAER,SAAAhK,QAGE,CAHFH,EAGEO,IAAA;MAFC,MAAM0J,EAAA,QAAW,+BAAA;MAClB,MAAK;K,uBAEPjK,EAIEQ,IAAA;MAHA,WAAU;MACV,UAAS;MACR,MAAMyJ,EAAA,QAAczK,EAAAkK,CAAA,CAAC,CAAA,6BAAA,IAAkClK,EAAAkK,CAAA,CAAC,CAAA,2BAAA;;;I,yBAIhDQ,GAAA,SADb7K,EAAA,GAAAiB,GASOJ,GAAA;;KAPL,SAAQ;KACR,OAAM;KACN,MAAK;KACJ,gBAAc+J,EAAA,QAAW,+BAAA;KACzB,SAAOE;;KAER,SAAAhK,QAAqF,CAAlFC,EAAAR,EAAAqK,EAAA,QAAczK,EAAAkK,CAAA,CAAC,CAAA,6BAAA,IAAkClK,EAAAkK,CAAA,CAAC,CAAA,2BAAA,CAAA,GAAA,CAAA,C;;I,sCAG/CI,GAAA,QADRpK,EAoCOqT,EAAA,QAAA,kBAAAjT,GAAAC,GAjCGiQ,GAAA,KAAsB,CAAA,SAiCzB,CA9BGjG,GAAA,SADR1K,EAAA,GAAAiB,GAmBOJ,GAAA;;KAjBJ,cAAYV,EAAAkK,CAAA,CAAC,CAAA,yBAAA;KACd,SAAQ;KACR,OAAM;KACN,MAAA;KACA,MAAK;KACJ,UAAQ,CAAGzB,GAAA;KACX,SAAOzI,EAAAqU,EAAA;;KAER,SAAA1T,QAGE,CAHFH,EAGEO,IAAA;MAFA,MAAK;MACL,MAAK;K,IAEPP,EAIEQ,IAAA;MAHA,WAAU;MACV,UAAS;MACR,MAAMhB,EAAAkK,CAAA,CAAC,CAAA,yBAAA;;;;;;;I,OAGZrK,EAAA,GAAAiB,GAUOJ,GAAA;;KARL,SAAQ;KACR,OAAM;KACN,gBAAa;KACb,MAAK;KACJ,UAAQ,CAAG+H,GAAA;KACX,SAAOzI,EAAAqU,EAAA;;KAER,SAAA1T,QAAkC,CAA/BC,EAAAR,EAAAJ,EAAAkK,CAAA,CAAC,CAAA,yBAAA,CAAA,GAAA,CAAA,C;;;IASR9G,EAAA,WADRvD,EAAA,GAAAC,EASM,OATNuC,IASM,CALJ7B,EAIES,IAAA;KAHA,eAAA;KACA,OAAM;KACN,MAAK;I,QAKImC,EAAA,SADbvD,EAAA,GAAAC,EAYM,OAZNwC,IAYM,CARJ9B,EAOSU,IAAA;KANP,MAAK;KACL,SAAQ;KACR,SAAQ;KACR,QAAO;;KAEP,SAAAP,QAAW,CAARC,EAAAR,EAAAgD,EAAA,KAAK,GAAA,CAAA,C;;I,QAKCiF,GAAA,SADbxI,EAAA,GAAAC,EAiBM,OAjBNyC,IAiBM,CAbJrC,EAYOqT,EAAA,QAAA,SAAA;KAVJ,UAAUnQ,EAAA;KACV,UAAUA,EAAA;KACV,SAAO,EAAA,KAAS0K,GAAU;IAJ7B,SAYO,CANLtN,EAKEW,IAAA;KAJC,OAAOgJ,GAAA;KACP,aAAWF,GAAA;KACX,WAASF,GAAA;KACT,OAAK+D;;;;;I,WAKZjO,EAAA,GAAAC,EA+FM,OAAA;KA7FH,KAAKgL,GAAA;KACF,SAAA;KAAJ,KAAIvC;KACJ,OAAKxI,GAAA,CAAC,8BAA4B,EAAA,wCACgBiL,EAAA,UAAS,KAAA,CAAA,CAAA;I,IAE3D/K,EA8DM,OAAA;KA7DH,OAAKF,GAAA,CAAG0C,IAAW,mCAAA,CAAA;KACpB,kBAAe;I,KAEf5C,EAAA,EAAA,GAAAC,EAyDce,IAAA,MAAAO,GAxDC+Q,GAAA,QAAN,OADTtS,EAAA,GAAAiB,GAyDcO,IAAA;KAvDX,KAAK,OAAOuF,EAAG,GAAG;KACd;KACJ,cAAYY,EAAA;KACZ,cAAYwD,EAAA;KACZ,SAASiH,GAAA;KACT,WAAWC;;KAED,MAAIvR,GAAE,MAAS,CACxBT,EAGEqT,EAAA,QAAA,QAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,gBAAY9T,GAAE,MAAS,CAChCT,EAGEqT,EAAA,QAAA,gBAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,iBAAa9T,GAAE,MAAS,CACjCT,EAGEqT,EAAA,QAAA,iBAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,eAAW9T,GAAE,MAAS,CAC/BT,EAGEqT,EAAA,QAAA,eAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,eAAW9T,GAAE,MAAS,CAC/BT,EAGEqT,EAAA,QAAA,eAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,gBAAY9T,GAAE,MAAS,CAChCT,EAGEqT,EAAA,QAAA,gBAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,eAAW9T,GAAE,MAAS,CAC/BT,EAGEqT,EAAA,QAAA,eAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,cAAU9T,GAAE,MAAS,CAC9BT,EAGEqT,EAAA,QAAA,cAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;;;;;;;I,kBASTrH,EAAA,UAAa,O,aAA7BvN,EAAA,GAAAC,EAoBWe,IAAA,EAAA,KAAA,EAAA,GAAA,CAlBDuM,EAAA,MAAc,cAAS,O,aAD/BvN,EAAA,GAAAC,EAQE,OAAA;;KANA,OAAM;KACL,OAAKwB,GAAA;MAA2B,MAAA,GAAA8L,EAAA,MAAc,UAAU,KAAI;MAA4B,KAAA,GAAAA,EAAA,MAAc,UAAU,IAAG;MAA+B,QAAA,GAAAA,EAAA,MAAc,UAAU,OAAM;;I,cAMnLnN,EASM,OAAA;KARJ,OAAM;KACL,OAAKqB,GAAA;MAA0B,KAAA,GAAA8L,EAAA,MAAc,KAAK,IAAG;MAA6B,MAAA,GAAAA,EAAA,MAAc,KAAK,KAAI;MAA8B,OAAA,GAAAA,EAAA,MAAc,KAAK,MAAK;;I,iBAMhKnN,EAAoD,QAAA,EAA9C,OAAM,sCAAqC,GAAA,MAAA,EAAA,C;IAM/C8J,GAAA,SAAM,CAAK3G,EAAA,WAAO,CAAKA,EAAA,SAAK,CAAKiF,GAAA,QADzCnI,EAmBOqT,EAAA,QAAA,cAAA;KAhBJ,UAAUnQ,EAAA;KACV,UAAUA,EAAA;KACV,OAAK,EAAA,SAAa0K,GAAU;KAC5B,SAAO,EAAA,KAASA,GAAU;IAN7B,SAmBO,CAXL7N,EAUS,UAAA;KATP,MAAK;KACL,OAAM;KACL,SAAO6N;I,IAERtN,EAGEO,IAAA;KAFA,MAAK;KACL,MAAK;I,IAEPd,EAAmC,QAAA,MAAAG,EAA1B6J,GAAA,KAAgB,GAAA,CAAA,C;;GAK/BzJ,EAMEe,IAAA;IALS,YAAAqP,GAAA;IAAA,uBAAA,AAAA+D,EAAA,QAAA,MAAA,GAAwB,QAAAC;IAChC,OAAO9D,GAAA,OAAuB,SAAK;IACnC,iBAAeA,GAAA,OAAuB,gBAAY;IAClD,cAAYK,GAAA;IACZ,WAASE;;;;;;;GAGZ7Q,EASEgB,IAAA;IARS,YAAAiQ,GAAA;IAAA,uBAAA,AAAAkD,EAAA,QAAA,MAAA,GAAsB,QAAAC;IAC9B,MAAMnR,EAAA;IACN,cAAYiO,GAAA,OAAoB,OAAG;IACnC,aAAW1R,EAAAgF,EAAA;IACX,aAAW5B,EAAA;IACX,iBAAezD;IACf,2BAAyBK,EAAA2F,CAAA,CAAU,CAAC;IACpC,WAASiM;;;;;;;;;GAGZpR,EAUEiB,IAAA;IATS,YAAAzB,EAAA6U,EAAA;IAAA,uBAAA,AAAAF,EAAA,QAAA,MAAAjT,GAAAmT,EAAA,IAAA,GAAY,QAAAD,IAAA;IACpB,OAAOxK,GAAA;IACP,MAAMC,GAAA;IACN,iBAAerK,EAAAkK,CAAA,CAAC,CAAA,wBAAA;IAChB,gBAAclK,EAAAkK,CAAA,CAAC,CAAA,sBAAA;IACf,OAAOlK,EAAA+U,EAAA;IACP,aAAW/U,EAAAgV,EAAA;IACX,WAAShV,EAAAiV,EAAA;IACT,UAAQjV,EAAAkV,EAAA;;;;;;;;;;;;GAGXjV,EAaM,OAbNuC,IAaMpC,EAPFJ,EAAA0Q,EAAA,CAAW,CAAC,WAAW,UAAK,O,KAAsB1Q,EAAAkK,CAAA,CAAC,CAAA,uCAAA;IAA2D,GAAAlK,EAAA0Q,EAAA,CAAW,CAAC,aAAa,QAAK;IAA2B,OAAA1Q,EAAA0Q,EAAA,CAAW,CAAC,WAAW"}
1
+ {"version":3,"file":"ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js","names":["_useModel","resolveCompactText","resolveCompactTextUtil","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_mergeProps","_toDisplayString","_createCommentVNode","_normalizeProps","_guardReactiveProps","_createVNode","LeStatus","_component_VBtn","_withCtx","_createTextVNode","_Fragment","_createBlock","_component_VIcon","_component_VTooltip","_component_VProgressCircular","_component_VAlert","LeEmptyState","_renderList","LeNestedRow","_normalizeStyle","LeMoveToPositionDialog","LeChangeParentDialog","LeDeleteDialog","_isRef","LeDeleteDialog_default","LeMoveToPositionDialog_default","LeEmptyState_default","LeStatus_default","LeNestedRow_default","LeChangeParentDialog_default","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","GROUP_CLASS","INDENT_PX","ANCHOR_X","ANestedSortableListEditor_vue_vue_type_script_setup_true_lang_default","\"modelValue\"","\"modelModifiers\"","\"mode\"","\"modeModifiers\"","__expose","__emit","props","__props","emit","modelProp","useModel","pendingWrite","modelValue","customRef","current","v","trigger","nextTick","mode","useI18n","slots","useSlots","useAlerts","rootEl","useTemplateRef","useContainerWidth","isTouch","useIsTouchDevice","effectiveCloseVariant","computed","isNarrow","childrenExpandedKeys","ref","detailExpandedKeys","getKeyOpt","keyFieldName","keyOf","data","positionFieldName","p","walk","nodes","tree","controllerOptions","stateEntry","useNestedListEditorStateEntry","controller","useNestedListEditorController","rowStateScope","provideListEditorStateScope","flatViewItems","flat","flatIndex","maxDepth","i","node","key","childrenAllowed","hasChildren","childrenCount","remainingDepth","depth","parentNode","vi","snapshot","shallowRef","movedKeys","sessionDeferredDeletes","sessionImmediateDeletes","commit","saved","markMoved","collect","n","decoratorCache","viewItemsDecorated","next","liveKeys","editing","editingKeys","expanded","childrenExpanded","loading","moved","dirty","unsaved","cached","decorated","isEmpty","totalItemCount","rowsContainer","canInteract","canEnterReorder","isInlineEdit","hasReadonlyDetail","showInlineSaveFooter","useInlineEditing","keys","parent","useReorderMode","cloneDeep","m","clearEditing","k","expandableKeys","dragEnabled","initSortables","destroySortables","payload","err","nestedPendingCount","movedCount","nestedPendingChanges","hasPendingChanges","canAdd","reorderMode","addLabelResolved","t","emptyTitleResolved","deleteConfirmTitleResolved","deleteConfirmTextResolved","reorderToggleVisible","compactReorderButton","out","allExpanded","expandAllVisible","toggleExpandAll","headerVisible","sortableInstances","forceRerender","s","dragState","hitTestRow","hit","clientX","clientY","wrapper","parseKey","recomputeInstruction","containerRect","rowRect","computeInstruction","onPointerMove","applyInstruction","sourceKey","inst","showWarningT","groups","group","sortable","useSortable","DRAG_GHOST_CLASS","DRAG_CHOSEN_CLASS","DRAG_CLASS","draggedEl","event","id","draggedNode","subtreeDepth","orig","tev","state","raw","stringToInt","watch","onMounted","onBeforeUnmount","overlayVisual","refWrapper","rowEl","lineLeft","lineTop","line","connector","levelWrapper","levelRect","levelCentreY","onAddClick","requestAutoOpen","onRowAddAfterClick","onAddChildClick","onEditClick","onCloseClick","beginEdit","onChevronClick","currently","onDetailToggle","isRowClickable","onRowClick","triggerDeleteClick","useDeleteDialog","editingSnapshots","deferred","onDeleteClick","savingKeys","onSaveClick","commitEdit","onCancelClick","closeEdit","moveUp","moveDown","moveTop","moveBottom","doIndent","doOutdent","resolveCompactText$1","resolveCompactText","resolveValidation","actionsCache","getActions","actions","findVi","now","buildSlotProps","toolbarSlotProps","applying","applyError","applyReorder","cancelReorderMode","reorderToggleSlotProps","expandableKeySet","keyboardNav","useKeyboardNav","moveToPositionDialogOpen","moveToPositionTarget","moveToPositionContext","target","found","siblings","idx","moveToPositionLabel","openMoveToPosition","onMoveToPositionConfirm","ctx","newIndex","slot","changeParentDialogOpen","changeParentTarget","openChangeParent","onChangeParentConfirm","siblingCount","parentId","targetIndex","position","rowContext","rowCallbacks","rootViewItems","nodesByKey","pendingKeys","acceptChanges","existing","before","op","accepted","renumbered","adopted","revealNestedInvalid","validateAllAndReveal","ancestor","useListEditorScopeValidity","openBlock","createElementBlock","normalizeClass","unref","createElementVNode","renderSlot","_ctx","mergeProps","toDisplayString","createCommentVNode","normalizeProps","guardReactiveProps","createVNode","VBtn","withCtx","createTextVNode","Fragment","createBlock","VIcon","VTooltip","enterReorderMode","VProgressCircular","VAlert","renderList","slotScope","normalizeStyle","_cache","$event","deleteDialog","isRef","deleteError","deleteInFlight","onDeleteDialogConfirm","onDeleteDialogCancel"],"sources":["../../../../src/domains/listEditor/components/ANestedSortableListEditor.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"TItem extends Record<string, any>\">\nimport {\n computed,\n customRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n useSlots,\n useTemplateRef,\n watch,\n} from 'vue'\nimport { useI18n } from 'vue-i18n'\nimport { useContainerWidth } from '@/domains/listEditor/composables/useContainerWidth'\nimport { useIsTouchDevice } from '@/domains/listEditor/composables/useIsTouchDevice'\nimport { useKeyboardNav } from '@/domains/listEditor/composables/useKeyboardNav'\nimport { useSortable } from '@vueuse/integrations/useSortable'\nimport { type NestedViewItem } from '@/domains/listEditor/composables/useNestedListEditor'\nimport {\n useNestedListEditorController,\n type GetKey,\n type ListEditorValidationResult,\n type NestedListEditorHandle,\n type NestedSortableListEditorExtras,\n type PositionOption,\n type PositionStrategy,\n} from '@/domains/listEditor/composables/useNestedListEditorController'\nimport {\n computeInstruction,\n type ExecutableInstruction,\n type Instruction,\n} from '@/domains/listEditor/composables/useDragInstruction'\nimport {\n provideListEditorStateScope,\n useNestedListEditorStateEntry,\n type NestedListEditorStateBindings,\n} from '@/domains/listEditor/composables/useListEditorStateScope'\nimport { resolveCompactText as resolveCompactTextUtil } from '@/domains/listEditor/utils/resolveCompactText'\nimport { useUnsavedSection } from '@/domains/unsavedGuard/composables/useUnsavedSection'\nimport { useDeleteDialog } from '@/domains/listEditor/composables/useDeleteDialog'\nimport { useInlineEditing } from '@/domains/listEditor/composables/useInlineEditing'\nimport { validateAllAndReveal } from '@/domains/listEditor/utils/revealInvalidRows'\nimport { useListEditorScopeValidity } from '@/domains/listEditor/composables/useListEditorScopeValidity'\nimport { useReorderMode } from '@/domains/listEditor/composables/useReorderMode'\nimport { cloneDeep } from '@/shared/utils/common'\nimport type {\n ListEditorKey,\n ListEditorValidationScope,\n ListEditorValidationState,\n NestedPositionHint,\n NestedTree,\n NestedTreeNode,\n} from '@/domains/listEditor/types/listEditorTypes'\nimport { useAlerts } from '@/domains/system/composables/alerts'\nimport { stringToInt } from '@/shared/utils/string'\nimport LeNestedRow from '@/domains/listEditor/components/internal/LeNestedRow.vue'\nimport LeDeleteDialog from '@/domains/listEditor/components/internal/LeDeleteDialog.vue'\nimport LeMoveToPositionDialog from '@/domains/listEditor/components/internal/LeMoveToPositionDialog.vue'\nimport LeChangeParentDialog from '@/domains/listEditor/components/internal/LeChangeParentDialog.vue'\nimport LeEmptyState from '@/domains/listEditor/components/internal/LeEmptyState.vue'\nimport LeStatus from '@/domains/listEditor/components/internal/LeStatus.vue'\nimport { DRAG_GHOST_CLASS, DRAG_CHOSEN_CLASS, DRAG_CLASS } from '@/domains/listEditor/components/internal/constants'\n\nexport interface DecoratedNestedViewItem<T> extends NestedViewItem<T> {\n editing: boolean\n expanded: boolean\n childrenExpanded: boolean\n loading: boolean\n dirty: boolean\n moved: boolean\n unsaved: boolean\n}\n\nexport interface DragState {\n sourceKey: ListEditorKey\n sourceSubtreeDepth: number\n instruction: Instruction | null\n}\n\nexport type ReorderMode = 'view' | 'reorder'\n\n// Hoisted for vite-plugin-dts d.ts rollup.\nexport interface RowActions<TItem> {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => void\n}\nexport interface RowSlotProps<TItem extends Record<string, any>> {\n item: DecoratedNestedViewItem<TItem> & { validationState: ListEditorValidationState }\n raw: TItem\n index: number\n key: ListEditorKey\n depth: number\n parent: TItem | null\n parentKey: ListEditorKey | null\n childrenCount: number\n hasChildren: boolean\n childrenAllowed: boolean\n firstInParent: boolean\n lastInParent: boolean\n readonly: boolean\n disabled: boolean\n expanded: boolean\n childrenExpanded: boolean\n editing: boolean\n dirty: boolean\n unsaved: boolean\n moved: boolean\n reorderMode: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n canIndent: boolean\n canOutdent: boolean\n canAddChild: boolean\n touch: boolean\n /**\n * Row-scoped `state-key` prefix. Thread it down to any list editor rendered in this slot and set\n * its `:state-key=\"`${stateKeyPrefix}:someList`\"` — that editor's controller then lives in THIS\n * editor's scope and survives the row collapsing (which unmounts the whole slot subtree). Entries\n * under this prefix are disposed when the row is removed.\n */\n stateKeyPrefix: string\n actions: RowActions<TItem>\n}\nexport interface ToolbarSlotProps {\n applying: boolean\n hasPendingChanges: boolean\n movedCount: number\n error: string | null\n actions: { apply: () => Promise<void>; cancel: () => void }\n}\nexport interface ReorderToggleSlotProps {\n mode: ReorderMode\n disabled: boolean\n hasPendingChanges: boolean\n actions: { enterReorderMode: () => void; exitReorderMode: () => void }\n}\nexport interface HeaderSlotProps extends ReorderToggleSlotProps {\n title: string | null\n}\nexport interface EmptySlotProps {\n readonly: boolean\n disabled: boolean\n actions: { add: () => void }\n}\nexport interface AddButtonSlotProps {\n readonly: boolean\n disabled: boolean\n props: { onClick: () => void }\n actions: { add: () => void }\n}\n\nexport interface Props<TItem extends Record<string, any>> {\n maxDepth: number\n\n /**\n * New-row factory; if set, add/add-after/add-inside insert through the\n * controller (no `@add` handler needed). Optional for read-only trees.\n */\n factory?: () => TItem\n /**\n * Stable row identity. Default `'id'`. Never point at the position field.\n * Typed `string` (not `keyof TItem`): a bare keyof compiles to a Boolean-only\n * runtime type that silently coerces `get-key=\"id\"` to `true`.\n */\n getKey?: string | ((item: TItem) => ListEditorKey)\n /**\n * Managed order field. Default `'position'`; `false` opts out. Typed\n * `[String, Boolean, Object]` with `string` before `false`: a bare keyof\n * compiles Boolean-only, and `false`-first would coerce `position=\"position\"`\n * (value == prop name) to `true`. Object form folds in `{ field, multiplier }`.\n */\n position?: string | false | { field: string; multiplier?: number; strategy?: PositionStrategy }\n /** Parent-key field written onto reparented rows. Default `'parent'`. */\n parentField?: string\n /**\n * Extra fields dropped from the dirty content-hash (position + parent always\n * dropped), e.g. a child collection tracked by a separate editor.\n */\n dirtyExclude?: string[]\n /** Per-row validity — `true` (or `{ valid: true }`) = VALID. Drives the red rail + save guard. */\n validate?: (item: TItem) => ListEditorValidationResult\n /**\n * Vuelidate `$scope` (the same one the consumer's row forms / save-gate collector use). When set,\n * the editor registers its aggregate validity under it, so a plain `v$.$invalid` save gate blocks\n * AND reveals a collapsed invalid row — no `validateAll()` call needed in the save flow. Omit to\n * keep legacy behavior (gate the save on the exposed `validateAll()` yourself); `false` opts out.\n */\n validationScope?: ListEditorValidationScope | false\n /**\n * Opt-in lifted controller (`useNestedListEditorController()`) so state\n * survives unmount/remount; omitted = internal controller. Same handle\n * reachable via `useTemplateRef`.\n */\n editor?: NestedListEditorHandle<TItem>\n /**\n * Persist this editor's controller in the nearest ANCESTOR editor's row-state scope under this\n * key, instead of owning it. Use it for an editor rendered in another editor's `#item` slot (that\n * slot is behind a `v-if`, so collapsing the row unmounts this editor and a component-owned\n * controller would re-baseline the already-edited tree on re-expand). Derive the key from the row\n * slot's `stateKeyPrefix`. Options stay declared here, on this tag. Ignored when `:editor` is\n * passed, and a no-op without an ancestor scope.\n */\n stateKey?: string\n\n readonly?: boolean\n disabled?: boolean\n loading?: boolean\n error?: string | null\n\n /** Heading above the list. A ready translated string, like every text prop here. */\n title?: string | null\n\n /**\n * Field shown in a collapsed row when no `#item-compact` slot is given. A dotted path reads\n * through nested objects (`texts.title`); a path that runs into nothing renders empty.\n */\n compactField?: string | null\n statusField?: string | null\n\n showAddButton?: boolean\n showAddChildButton?: boolean\n showDeleteButton?: boolean\n showEditButton?: boolean\n showAddAfterAction?: boolean\n showMoveToPosition?: boolean\n showChangeParent?: boolean\n showExpandToggle?: boolean\n\n /** Label of the add button. A ready translated string; omit it for the library's own wording. */\n addLabel?: string | null\n /** Heading of the empty state. A ready translated string. */\n emptyTitle?: string | null\n\n disableRowClick?: boolean\n disableDeleteConfirm?: boolean\n /**\n * Disables unsaved-state tracking: no dirty markers, never reads as unsaved.\n * For a list that is a view of data owned elsewhere, where nothing can clear an amber row. Mirrors `AListEditor`.\n */\n disableUnsaved?: boolean\n deleteConfirmTitle?: string | null\n deleteConfirmText?: string | null\n /**\n * How a row delete persists. `deferred` (default): the row disappears but the deletion counts as an\n * unconfirmed change until save (revertible until then, incl. via reorder Cancel). `immediate`: the\n * consumer deletes on the backend — the dialog says it is irreversible and it does NOT read as unsaved.\n */\n deleteMode?: 'immediate' | 'deferred'\n\n closeVariant?: 'auto' | 'icon' | 'labeled'\n\n loadingKeys?: Set<ListEditorKey> | null\n\n showReorderToggle?: boolean\n disableReorder?: boolean\n disableDrag?: boolean\n\n onDeleteConfirm?: (item: TItem) => Promise<boolean> | boolean\n onDelete?: (item: TItem) => Promise<void> | void\n onItemSave?: (item: TItem) => Promise<void> | void\n onReorderApply?: (tree: NestedTree<TItem>) => Promise<void> | void\n\n /** Registers this editor as a named unsaved-changes section under the given (translated) label. */\n unsavedSectionLabel?: string\n}\n\nconst props = withDefaults(defineProps<Props<TItem>>(), {\n unsavedSectionLabel: undefined,\n factory: undefined,\n getKey: undefined,\n position: undefined,\n parentField: 'parent',\n dirtyExclude: undefined,\n validate: undefined,\n validationScope: undefined,\n editor: undefined,\n stateKey: undefined,\n readonly: false,\n disabled: false,\n loading: false,\n error: null,\n title: null,\n compactField: null,\n statusField: null,\n showAddButton: true,\n showAddChildButton: true,\n showDeleteButton: true,\n showEditButton: true,\n showAddAfterAction: false,\n showMoveToPosition: false,\n showChangeParent: false,\n showExpandToggle: true,\n addLabel: null,\n emptyTitle: null,\n disableRowClick: false,\n disableDeleteConfirm: false,\n disableUnsaved: false,\n deleteConfirmTitle: null,\n deleteConfirmText: null,\n deleteMode: 'deferred',\n closeVariant: 'auto',\n loadingKeys: null,\n showReorderToggle: true,\n disableReorder: false,\n disableDrag: false,\n onDeleteConfirm: undefined,\n onDelete: undefined,\n onItemSave: undefined,\n onReorderApply: undefined,\n})\n\nconst emit = defineEmits<{\n add: [hint: NestedPositionHint | undefined]\n 'add-child': [parent: NestedViewItem<TItem>]\n edit: [item: NestedViewItem<TItem>]\n deleted: [item: NestedViewItem<TItem>]\n close: [item: NestedViewItem<TItem>]\n 'item-saved': [item: NestedViewItem<TItem>]\n 'item-expand': [item: NestedViewItem<TItem>, expanded: boolean]\n 'reorder-start': []\n 'reorder-cancel': []\n 'reorder-applied': [tree: NestedTree<TItem>]\n 'reorder-apply-error': [error: unknown]\n 'reorder-end': []\n indent: [item: NestedViewItem<TItem>]\n outdent: [item: NestedViewItem<TItem>]\n}>()\n\nconst modelProp = defineModel<NestedTree<TItem>>({ required: true })\n// Same-tick reads must see an emitted write (the prop lags it until the parent re-renders).\nlet pendingWrite: NestedTree<TItem> | null = null\nwatch(modelProp, () => (pendingWrite = null), { flush: 'sync' })\nconst modelValue = customRef<NestedTree<TItem>>((track, trigger) => ({\n get: () => {\n track()\n // Read the prop every time, pending write or not: a computed evaluated while a write is pending must\n // still subscribe to it.\n const current = modelProp.value\n return pendingWrite ?? current\n },\n set: (v) => {\n pendingWrite = v\n modelProp.value = v\n trigger()\n // Only this write's own clear: a newer pending write stays. The trigger lets readers see the prop\n // again, e.g. when the parent ignored the update.\n nextTick(() => {\n if (pendingWrite !== v) return\n pendingWrite = null\n trigger()\n })\n },\n}))\nconst mode = defineModel<ReorderMode>('mode', { default: 'view' })\n\ndefineSlots<{\n header?: (props: HeaderSlotProps) => unknown\n 'reorder-toggle'?: (props: ReorderToggleSlotProps) => unknown\n 'reorder-toolbar'?: (props: ToolbarSlotProps) => unknown\n empty?: (props: EmptySlotProps) => unknown\n 'add-button'?: (props: AddButtonSlotProps) => unknown\n item?: (props: RowSlotProps<TItem>) => unknown\n 'item-compact'?: (props: RowSlotProps<TItem>) => unknown\n 'item-readonly'?: (props: RowSlotProps<TItem>) => unknown\n 'item-status'?: (props: RowSlotProps<TItem>) => unknown\n 'item-footer'?: (props: RowSlotProps<TItem>) => unknown\n 'item-actions'?: (props: RowSlotProps<TItem>) => unknown\n 'before-item'?: (props: RowSlotProps<TItem>) => unknown\n 'after-item'?: (props: RowSlotProps<TItem>) => unknown\n}>()\n\nconst { t } = useI18n()\nconst slots = useSlots()\nconst { showWarningT } = useAlerts()\n\nconst rootEl = useTemplateRef<HTMLElement>('rootEl')\nconst { isNarrow } = useContainerWidth(rootEl)\n\nconst isTouch = useIsTouchDevice()\n\nconst effectiveCloseVariant = computed<'icon' | 'labeled'>(() => {\n if (props.closeVariant === 'icon') return 'icon'\n if (props.closeVariant === 'labeled') return 'labeled'\n return isNarrow.value ? 'icon' : 'labeled'\n})\n\nconst childrenExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n// Readonly detail body visibility — independent of subtree expansion.\nconst detailExpandedKeys = ref<Set<ListEditorKey>>(new Set())\n\n// Local mirror of the controller's key resolution so walkers + the template key\n// rows the same way the controller tracks them. Construction-time config, read once.\n/* eslint-disable vue/no-setup-props-reactivity-loss */\nconst getKeyOpt = props.getKey ?? 'id'\nconst keyFieldName = (typeof getKeyOpt === 'function' ? 'id' : getKeyOpt) as string\nconst keyOf = (data: TItem): ListEditorKey =>\n typeof getKeyOpt === 'function' ? getKeyOpt(data) : (data[getKeyOpt as keyof TItem] as ListEditorKey)\n\n// Managed position field (row position, move-to-position dialog, flatViewItems). Mirrors the controller.\nconst positionFieldName = ((): string => {\n const p = props.position\n if (p === undefined || p === false) return 'position'\n if (typeof p === 'object') return p.field\n return p\n})()\n\nconst initChildrenExpanded = (tree: NestedTree<TItem>) => {\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n childrenExpandedKeys.value.add(keyOf(n.data))\n walk(n.children)\n }\n }\n }\n walk(tree.children)\n}\n// eslint-disable-next-line vue/no-ref-object-reactivity-loss\ninitChildrenExpanded(modelValue.value)\n\n// State controller (v2). Undefined getKey/position/validate fall back to controller defaults\n// ('id' / 'position' / always-valid). Its `viewItems` ignores expand state, so we re-project an\n// expand-aware list below (flatViewItems).\nconst controllerOptions: NestedListEditorStateBindings<TItem> = {\n get: () => modelValue.value,\n set: (v) => (modelValue.value = v),\n factory: props.factory,\n getKey: props.getKey as GetKey<TItem> | undefined,\n position: props.position as PositionOption<TItem> | undefined,\n parentField: props.parentField,\n maxDepth: props.maxDepth,\n dirtyExclude: () => props.dirtyExclude ?? [],\n validate: props.validate,\n}\n// Precedence: an explicitly lifted `:editor` wins; then a `state-key`'d entry persisted in the\n// nearest ancestor editor's row-state scope (rebound to this instance on every remount); else this\n// component owns the controller — today's behaviour, unchanged.\nconst stateEntry = props.editor ? null : useNestedListEditorStateEntry<TItem>(props.stateKey, controllerOptions)\nconst controller = props.editor ?? stateEntry?.handle ?? useNestedListEditorController<TItem>(controllerOptions)\n/* eslint-enable vue/no-setup-props-reactivity-loss */\n\n// Row-state scope for THIS editor's `#item` slot subtree — see ASortableListEditor.\nconst rowStateScope = provideListEditorStateScope(stateEntry?.childScope ?? null)\n\n// FULL flattened list (collapsed-branch rows included) built directly off the\n// tree: the recursive renderer (LeNestedRow) filters by parentKey + childrenExpandedKeys,\n// so it needs every row present in viewItemsDecorated even when hidden.\nconst flatViewItems = computed<NestedViewItem<TItem>[]>(() => {\n const flat: NestedViewItem<TItem>[] = []\n let flatIndex = 0\n const maxDepth = props.maxDepth\n const walk = (nodes: NestedTreeNode<TItem>[], depth: number, parentNode: NestedTreeNode<TItem> | null) => {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n const key = keyOf(node.data)\n const childrenAllowed = node.children !== undefined\n const hasChildren = childrenAllowed && (node.children?.length ?? 0) > 0\n const childrenCount = node.children?.length ?? 0\n const remainingDepth = maxDepth - (depth + 1)\n flat.push({\n key,\n index: flatIndex++,\n raw: node.data,\n position: node.data[positionFieldName] as number | undefined,\n node,\n depth,\n parent: parentNode?.data ?? null,\n parentKey: parentNode ? keyOf(parentNode.data) : null,\n childrenCount,\n hasChildren,\n childrenAllowed,\n siblingIndex: i,\n siblingCount: nodes.length,\n firstInParent: i === 0,\n lastInParent: i === nodes.length - 1,\n canAddChild: childrenAllowed && remainingDepth > 0,\n canIndent: i > 0,\n canOutdent: depth > 0,\n })\n if (hasChildren) walk(node.children as NestedTreeNode<TItem>[], depth + 1, node)\n }\n }\n walk(modelValue.value.children, 0, null)\n return flat\n})\n\n// Drop the persisted controllers of rows that no longer exist. `post` so the removed row's subtree\n// has already unmounted (its editors released their entries) before we stop their effect scopes.\nwatch(\n () => flatViewItems.value.map((vi) => String(vi.key)).join('|'),\n () => rowStateScope.retainOwners(flatViewItems.value.map((vi) => vi.key)),\n { flush: 'post' }\n)\n\n// Snapshot for reorder-cancel restore only; dirty detection lives in the controller.\n// `movedKeys` is component view state driving the toolbar \"N pending\" counter,\n// cleared on every mode transition by `useReorderMode`.\nconst snapshot = shallowRef<NestedTree<TItem> | null>(null)\nconst movedKeys = ref<Set<ListEditorKey>>(new Set())\n// Deletes made during the current reorder session, split by mode — deferred ones count in the toolbar\n// and revert on Cancel; immediate (backend) ones are re-applied on Cancel so they stay gone (else the\n// snapshot-restore would resurrect a server-deleted row). Mirrors ASortableListEditor.\nconst sessionDeferredDeletes = ref<Set<ListEditorKey>>(new Set())\nconst sessionImmediateDeletes = ref<Set<ListEditorKey>>(new Set())\n\n// The exposed `commit`: the controller's, plus the moved markers, which are this component's view state.\nconst commit = (saved?: NestedTree<TItem>) => {\n controller.commit(saved)\n movedKeys.value = new Set()\n}\n// Mark row + every descendant moved — a moved parent visually carries its subtree.\nconst markMoved = (key: ListEditorKey) => {\n const { node } = controller.findNode(key)\n if (!node) {\n movedKeys.value.add(key)\n return\n }\n const collect = (n: NestedTreeNode<TItem>) => {\n movedKeys.value.add(keyOf(n.data))\n if (n.children) n.children.forEach(collect)\n }\n collect(node)\n}\n\nconst decoratorCache = new Map<ListEditorKey, DecoratedNestedViewItem<TItem>>()\nconst viewItemsDecorated = computed<DecoratedNestedViewItem<TItem>[]>(() => {\n const next: DecoratedNestedViewItem<TItem>[] = []\n const liveKeys = new Set<ListEditorKey>()\n for (const vi of flatViewItems.value) {\n liveKeys.add(vi.key)\n const editing = editingKeys.value.has(vi.key)\n const expanded = detailExpandedKeys.value.has(vi.key)\n const childrenExpanded = childrenExpandedKeys.value.has(vi.key)\n const loading = props.loadingKeys?.has(vi.key) ?? false\n const moved = movedKeys.value.has(vi.key)\n // Amber = controller dirty OR reorder-session moved. readonly suppresses it\n // (read-only views can't be unsaved; also dodges a mount-before-load baseline). (QA 85050 sweep)\n const dirty = props.readonly ? false : controller.isUnsaved(vi.key)\n // `disableUnsaved` hides only the amber marker. The validation rail still shows real errors.\n const unsaved = props.disableUnsaved || props.readonly ? false : dirty || moved\n const cached = decoratorCache.get(vi.key)\n if (\n cached &&\n cached.raw === vi.raw &&\n cached.index === vi.index &&\n cached.position === vi.position &&\n cached.depth === vi.depth &&\n cached.parentKey === vi.parentKey &&\n cached.childrenCount === vi.childrenCount &&\n cached.firstInParent === vi.firstInParent &&\n cached.lastInParent === vi.lastInParent &&\n cached.editing === editing &&\n cached.expanded === expanded &&\n cached.childrenExpanded === childrenExpanded &&\n cached.loading === loading &&\n cached.dirty === dirty &&\n cached.moved === moved &&\n cached.unsaved === unsaved\n ) {\n next.push(cached)\n continue\n }\n const decorated: DecoratedNestedViewItem<TItem> = {\n ...vi,\n editing,\n expanded,\n childrenExpanded,\n loading,\n dirty,\n moved,\n unsaved,\n }\n decoratorCache.set(vi.key, decorated)\n next.push(decorated)\n }\n for (const key of decoratorCache.keys()) {\n if (!liveKeys.has(key)) decoratorCache.delete(key)\n }\n return next\n})\n\nconst isEmpty = computed(() => modelValue.value.children.length === 0)\nconst totalItemCount = computed(() => flatViewItems.value.length)\n\nconst rowsContainer = useTemplateRef<HTMLElement>('rowsContainer')\n\nconst canInteract = computed(() => !props.readonly && !props.disabled && !props.loading)\nconst canEnterReorder = computed(() => canInteract.value && !props.disableReorder && totalItemCount.value > 1)\n\nconst isInlineEdit = computed(() => !!(slots as Record<string, unknown>).item)\nconst hasReadonlyDetail = computed(() => !!(slots as Record<string, unknown>)['item-readonly'])\nconst showInlineSaveFooter = computed(() => !!props.onItemSave)\n\nconst { editingKeys, editingSnapshots, clearEditing, beginEdit, cancelEdit, commitEdit, closeEdit, requestAutoOpen } =\n useInlineEditing<TItem, NestedViewItem<TItem>>({\n rowsContainer,\n rowSelector: '.a-le-row-wrapper',\n isInlineEdit,\n // `markDirty=false`: restoring the snapshot on cancel must not\n // mark the node dirty, or partial-multi saves would resend it.\n restoreSnapshot: (key, data) => controller.updateItem(key, data, false),\n watchKeys: () => {\n const keys: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n keys.push(keyOf(n.data))\n if (n.children && n.children.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return keys\n },\n findEntry: (key) => {\n const { node } = controller.findNode(key)\n return node ? { data: node.data } : null\n },\n afterAutoOpen: (key) => {\n const { parent } = controller.findNode(key)\n if (parent) {\n childrenExpandedKeys.value.add(keyOf(parent.data))\n }\n },\n })\n\nconst {\n applying,\n applyError,\n hasPendingChanges,\n movedCount,\n reorderMode,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n} = useReorderMode<NestedTree<TItem>>({\n mode,\n snapshot,\n movedKeys,\n modelValue,\n cloneModel: (m) => cloneDeep(m) as NestedTree<TItem>,\n applyModel: (m) => {\n modelValue.value = m\n },\n canEnterReorder,\n onEnter: () => {\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n clearEditing()\n // Expand every branch so all rows are reachable drag targets.\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n nextTick(() => {\n if (dragEnabled.value) initSortables()\n })\n },\n onExternalEnter: () => {\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n clearEditing()\n },\n // Cancel: the snapshot-restore has brought every deleted row back; reconcile the controller so a\n // deferred delete truly reverts (clear tombstone, row stays) and an immediate delete stays gone (row\n // removed again — it is deleted on the backend and must not resurrect / be re-created by a save).\n onCancel: () => {\n for (const key of sessionDeferredDeletes.value) controller.restoreDeleted(key)\n for (const key of sessionImmediateDeletes.value)\n controller.deleteItem(key, { trackDeleted: false, renumber: false })\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n destroySortables()\n },\n onApplyEnd: () => {\n sessionDeferredDeletes.value = new Set()\n sessionImmediateDeletes.value = new Set()\n destroySortables()\n },\n onReorderApply: (tree) => props.onReorderApply?.(tree),\n emit: {\n reorderStart: () => emit('reorder-start'),\n reorderCancel: () => emit('reorder-cancel'),\n reorderApplied: (payload) => emit('reorder-applied', payload),\n reorderApplyError: (err) => emit('reorder-apply-error', err),\n reorderEnd: () => emit('reorder-end'),\n },\n})\n\n// Reorder-toolbar pending indicator = session moves + deferred deletes made in the session, so a delete\n// in reorder mode no longer reads as \"no pending changes\" and Apply stays enabled.\nconst nestedPendingCount = computed<number>(() => movedCount.value + sessionDeferredDeletes.value.size)\nconst nestedPendingChanges = computed<boolean>(() => hasPendingChanges.value || sessionDeferredDeletes.value.size > 0)\n\nconst canAdd = computed(() => canInteract.value && props.showAddButton && !reorderMode.value)\nconst dragEnabled = computed(() => reorderMode.value && !isTouch.value && !props.disableDrag)\n\nconst addLabelResolved = computed(() => props.addLabel ?? t('common.sortable.add'))\nconst emptyTitleResolved = computed(() => props.emptyTitle ?? t('common.sortable.emptyTitle'))\nconst deleteConfirmTitleResolved = computed(() => props.deleteConfirmTitle ?? t('common.sortable.deleteConfirmTitle'))\nconst deleteConfirmTextResolved = computed(\n () =>\n props.deleteConfirmText ??\n (props.deleteMode === 'immediate'\n ? t('common.sortable.deleteConfirmText')\n : t('common.sortable.deleteConfirmTextDeferred'))\n)\n\nconst reorderToggleVisible = computed<boolean>(\n (): boolean => !props.readonly && props.showReorderToggle && !reorderMode.value && totalItemCount.value > 0\n)\n\nconst compactReorderButton = computed<boolean>((): boolean => !!props.title && isNarrow.value)\n\n// Keys of every node that has children — the expand/collapse candidates.\nconst expandableKeys = computed<ListEditorKey[]>(() => {\n const out: ListEditorKey[] = []\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n if (n.children && n.children.length > 0) {\n out.push(keyOf(n.data))\n walk(n.children)\n }\n }\n }\n walk(modelValue.value.children)\n return out\n})\n\nconst allExpanded = computed<boolean>(\n () => expandableKeys.value.length > 0 && expandableKeys.value.every((k) => childrenExpandedKeys.value.has(k))\n)\n\nconst expandAllVisible = computed<boolean>(() => !reorderMode.value && expandableKeys.value.length > 0)\n\nconst toggleExpandAll = () => {\n if (allExpanded.value) {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.delete(k)\n } else {\n for (const k of expandableKeys.value) childrenExpandedKeys.value.add(k)\n }\n}\n\nconst headerVisible = computed<boolean>(\n (): boolean =>\n !!(\n props.title ||\n (slots as Record<string, unknown>).header ||\n (slots as Record<string, unknown>)['reorder-toggle'] ||\n reorderToggleVisible.value ||\n expandAllVisible.value ||\n reorderMode.value\n )\n)\n\n// One Sortable instance per group so drag/drop moves items within/between groups;\n// SortableJS owns the pointer events, onEnd reconciles via editor.moveTo().\nconst sortableInstances = ref<Array<{ stop: () => void; option?: (k: string, v: unknown) => void }>>([])\nconst forceRerender = ref(0)\n\nconst destroySortables = () => {\n for (const s of sortableInstances.value) {\n try {\n s.stop()\n } catch {\n // no-op\n }\n }\n sortableInstances.value = []\n}\n\nconst GROUP_CLASS = 'a-nested-list-editor__group'\nconst HANDLE_CLASS = 'a-le-drag-handle'\n\n// Live drag state. `instruction` is recomputed on every pointermove and encodes\n// where + at what depth the dragged item lands (sibling-above/below/make-child/blocked);\n// the overlay reads it, onEnd applies it via `editor.moveTo`. SortableJS never moves\n// the DOM (onMove always returns false) — hit-testing, depth and the mutation are all ours.\nconst dragState = ref<DragState | null>(null)\n\n// Drop indicator anchor geometry, kept in sync with CSS (reorder-mode header\n// padding-left = 12 + depth*24, drag handle = 20px). ANCHOR_X = 12 + half handle\n// (10) = 22 puts the dot on the handle's centre; the line steps 24px per depth.\nconst INDENT_PX = 24\nconst ANCHOR_X = 22\n\nconst hitTestRow = (\n clientX: number,\n clientY: number\n): { el: HTMLElement; viewItem: DecoratedNestedViewItem<TItem> } | null => {\n const hit = document.elementFromPoint(clientX, clientY) as HTMLElement | null\n if (!hit) return null\n const wrapper = hit.closest('.a-le-row-wrapper') as HTMLElement | null\n if (!wrapper) return null\n // Only wrappers inside our rowsContainer — elementFromPoint could hit a\n // different ANestedSortableListEditor instance on the same page.\n if (!rowsContainer.value || !rowsContainer.value.contains(wrapper)) return null\n const key = parseKey(wrapper.getAttribute('data-id'))\n if (key === null) return null\n const vi = viewItemsDecorated.value.find((v) => v.key === key)\n if (!vi) return null\n return { el: wrapper, viewItem: vi }\n}\n\nconst recomputeInstruction = (clientX: number, clientY: number) => {\n if (!dragState.value || !rowsContainer.value) return\n const hit = hitTestRow(clientX, clientY)\n if (!hit) {\n dragState.value.instruction = null\n return\n }\n const containerRect = rowsContainer.value.getBoundingClientRect()\n // Hit-test the `.a-le-row` child, not the wrapper — the wrapper's height\n // balloons when children are rendered.\n const rowEl = hit.el.querySelector(':scope > .a-le-row') as HTMLElement | null\n const rowRect = (rowEl ?? hit.el).getBoundingClientRect()\n dragState.value.instruction = computeInstruction({\n pointer: { x: clientX, y: clientY },\n hoveredRow: {\n key: hit.viewItem.key,\n rect: rowRect,\n depth: hit.viewItem.depth,\n parentKey: hit.viewItem.parentKey,\n siblingIndex: hit.viewItem.siblingIndex,\n siblingCount: hit.viewItem.siblingCount,\n },\n sourceKey: dragState.value.sourceKey,\n sourceSubtreeDepth: dragState.value.sourceSubtreeDepth,\n viewItems: viewItemsDecorated.value,\n maxDepth: props.maxDepth,\n indentPx: INDENT_PX,\n containerLeft: containerRect.left,\n containerPaddingLeft: ANCHOR_X,\n })\n}\n\nconst onPointerMove = (e: PointerEvent) => {\n recomputeInstruction(e.clientX, e.clientY)\n}\n\nconst applyInstruction = (inst: ExecutableInstruction, sourceKey: ListEditorKey) => {\n const ok = controller.moveTo(sourceKey, inst.parentKey, inst.index)\n if (!ok) {\n showWarningT('common.sortable.error.maxDeepExceed')\n forceRerender.value++\n nextTick(() => initSortables())\n return\n }\n markMoved(sourceKey)\n // makeChild: expand the new parent so the just-moved row doesn't vanish into a collapsed branch.\n if (inst.makeChild && inst.parentKey !== null) {\n childrenExpandedKeys.value.add(inst.parentKey)\n }\n}\n\nconst initSortables = () => {\n destroySortables()\n if (!dragEnabled.value) return\n if (!rowsContainer.value) return\n const groups = Array.from(rowsContainer.value.querySelectorAll<HTMLElement>('.' + GROUP_CLASS))\n for (const group of groups) {\n const sortable = useSortable(group, [], {\n group: { name: 'a-nested', pull: true, put: true },\n handle: '.' + HANDLE_CLASS,\n animation: 0,\n ghostClass: DRAG_GHOST_CLASS,\n chosenClass: DRAG_CHOSEN_CLASS,\n dragClass: DRAG_CLASS,\n fallbackOnBody: true,\n forceFallback: true,\n fallbackTolerance: 3,\n onStart: (event) => {\n const draggedEl = event.item as HTMLElement\n const id = parseKey(draggedEl.getAttribute('data-id'))\n if (id === null) return\n const draggedNode = controller.findNode(id).node\n const subtreeDepth = draggedNode ? controller.calculateSubtreeDepth(draggedNode) : 1\n dragState.value = {\n sourceKey: id,\n sourceSubtreeDepth: subtreeDepth,\n instruction: null,\n }\n document.addEventListener('pointermove', onPointerMove, { passive: true })\n },\n onMove: (event) => {\n // Also track the pointer via SortableJS's stream — keeps `instruction`\n // in sync when the browser coalesces pointermove events during fast drags.\n const orig = (event as unknown as { originalEvent?: Event }).originalEvent\n if (orig) {\n if ('clientX' in orig && 'clientY' in orig) {\n recomputeInstruction((orig as MouseEvent).clientX, (orig as MouseEvent).clientY)\n } else if ('touches' in orig) {\n const tev = orig as TouchEvent\n if (tev.touches.length > 0) {\n recomputeInstruction(tev.touches[0]!.clientX, tev.touches[0]!.clientY)\n }\n }\n }\n // Refuse SortableJS's own DOM insertion — onEnd's `editor.moveTo` drives the move.\n return false\n },\n onEnd: () => {\n document.removeEventListener('pointermove', onPointerMove)\n const state = dragState.value\n dragState.value = null\n if (!state) return\n const inst = state.instruction\n if (inst === null) return\n if (inst.type === 'blocked') return\n applyInstruction(inst, state.sourceKey)\n },\n })\n sortableInstances.value.push(sortable)\n }\n}\n\nconst parseKey = (raw: string | null): ListEditorKey | null => {\n if (raw === null || raw === '') return null\n // Numeric key only when `data-id` is a pure integer string (incl. negative temp\n // ids like \"-1\"); else a DocId/UUID. The old `n > 0` test sent negative temp ids\n // to the string branch, so a freshly-added row's move marked the wrong key.\n const n = stringToInt(raw)\n return String(n) === raw ? n : raw\n}\n\nwatch(\n () => dragEnabled.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n else destroySortables()\n }\n)\n\nwatch(\n () => forceRerender.value,\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n }\n)\n\n// Rebuild sortables when the tree shape changes during drag mode, else newly rendered groups aren't draggable.\nwatch(\n () => viewItemsDecorated.value.map((v) => v.key).join('|'),\n () => {\n if (dragEnabled.value) nextTick(() => initSortables())\n }\n)\n\nonMounted(() => {\n if (dragEnabled.value) initSortables()\n})\nonBeforeUnmount(() => {\n destroySortables()\n document.removeEventListener('pointermove', onPointerMove)\n})\n\n// Overlay visual props from the current instruction; `null` = hidden (no\n// instruction, or blocked). The optional connector is a rail from the drop line\n// up to the row whose level dictates the insert. Measured via getBoundingClientRect\n// rather than CSS anchor positioning: Chrome's anchor-reachability rule excludes\n// some deeply-nested descendants, so JS measurement is simpler and more reliable.\ntype OverlayVisual = {\n line: { top: number; left: number; right: number }\n connector: { top: number; height: number; left: number } | null\n}\n\nconst overlayVisual = computed<OverlayVisual | null>(() => {\n const state = dragState.value\n if (!state || state.instruction === null || !rowsContainer.value) return null\n const inst = state.instruction\n // Blocked drops render nothing — the silent empty space is the \"not here\" signal.\n if (inst.type === 'blocked') return null\n const refWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.refKey))}\"]`\n )\n if (!refWrapper) return null\n const rowEl = refWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const containerRect = rowsContainer.value.getBoundingClientRect()\n const rowRect = (rowEl ?? refWrapper).getBoundingClientRect()\n\n const lineLeft = ANCHOR_X + inst.depth * INDENT_PX\n const lineTop = inst.refEdge === 'top' ? rowRect.top - containerRect.top : rowRect.bottom - containerRect.top\n const line = { top: lineTop, left: lineLeft, right: 16 }\n\n let connector: OverlayVisual['connector'] = null\n if (inst.levelRowKey !== null) {\n const levelWrapper = rowsContainer.value.querySelector<HTMLElement>(\n `.a-le-row-wrapper[data-id=\"${CSS.escape(String(inst.levelRowKey))}\"]`\n )\n if (levelWrapper) {\n const levelRow = levelWrapper.querySelector<HTMLElement>(':scope > .a-le-row')\n const levelRect = (levelRow ?? levelWrapper).getBoundingClientRect()\n const levelCentreY = levelRect.top - containerRect.top + levelRect.height / 2\n if (levelCentreY < lineTop) {\n connector = {\n top: levelCentreY,\n height: lineTop - levelCentreY,\n left: lineLeft,\n }\n }\n }\n }\n\n return { line, connector }\n})\n\n// With a `factory`, the editor inserts through the controller; without one it\n// stays emit-only so legacy `@add` consumers drive the insert. The `add` event\n// fires either way.\nconst onAddClick = () => {\n if (!canAdd.value) return\n requestAutoOpen()\n if (props.factory) controller.addItem()\n emit('add', undefined)\n}\n\nconst onRowAddAfterClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n requestAutoOpen()\n if (props.factory) controller.addAfter(vi.key, undefined, vi.childrenAllowed)\n emit('add', { afterId: vi.key, childrenAllowed: vi.childrenAllowed })\n}\n\nconst onAddChildClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n if (!vi.canAddChild) return\n requestAutoOpen()\n childrenExpandedKeys.value.add(vi.key)\n emit('add-child', vi)\n // Append to the end of children, matching the root \"Add item\" semantic.\n // (Drag-drop make-child still lands at index 0 — its drop line sits just below the parent.)\n if (props.factory) controller.addChild(vi.key, undefined, true)\n emit('add', { parentId: vi.key, childrenAllowed: true })\n}\n\nconst onEditClick = (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value || reorderMode.value) return\n // Clicking edit while already editing closes the form, so the pencil toggles like the row header.\n if (editingKeys.value.has(vi.key)) {\n onCloseClick(vi)\n return\n }\n if (isInlineEdit.value) {\n beginEdit(vi)\n }\n emit('edit', vi)\n}\n\n// Toggles tree children visibility (distinct from the readonly-detail body below).\nconst onChevronClick = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = childrenExpandedKeys.value.has(key)\n if (currently) childrenExpandedKeys.value.delete(key)\n else childrenExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\n// Toggles the row's readonly-detail body (separate from tree children).\nconst onDetailToggle = (vi: NestedViewItem<TItem>) => {\n if (props.disabled || props.loading) return\n const key = vi.key\n const currently = detailExpandedKeys.value.has(key)\n if (currently) detailExpandedKeys.value.delete(key)\n else detailExpandedKeys.value.add(key)\n emit('item-expand', vi, !currently)\n}\n\nconst isRowClickable = (vi: DecoratedNestedViewItem<TItem>): boolean => {\n if (props.disableRowClick) return false\n if (props.disabled || props.loading) return false\n if (reorderMode.value) return false\n if (vi.editing || vi.expanded) return true\n if (!props.readonly && props.showEditButton) return true\n return false\n}\n\nconst onRowClick = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!isRowClickable(vi)) return\n if (vi.editing || vi.expanded) {\n onCloseClick(vi)\n return\n }\n if (props.readonly && hasReadonlyDetail.value) onDetailToggle(vi)\n else onEditClick(vi)\n}\n\nconst {\n deleteDialog,\n deleteInFlight,\n deleteError,\n onDeleteClick: triggerDeleteClick,\n onDeleteDialogConfirm,\n onDeleteDialogCancel,\n} = useDeleteDialog<TItem, NestedViewItem<TItem>>({\n onDeleteConfirm: (raw) => (props.onDeleteConfirm ? props.onDeleteConfirm(raw) : true),\n onDelete: (raw) => props.onDelete?.(raw),\n onDeleted: (vi) => {\n editingKeys.value.delete(vi.key)\n editingSnapshots.value.delete(vi.key)\n detailExpandedKeys.value.delete(vi.key)\n childrenExpandedKeys.value.delete(vi.key)\n const deferred = props.deleteMode === 'deferred'\n // A delete in reorder mode is a session change: deferred reverts on Cancel, immediate stays gone\n // (re-applied after Cancel's snapshot-restore).\n if (reorderMode.value) {\n if (deferred) sessionDeferredDeletes.value.add(vi.key)\n else sessionImmediateDeletes.value.add(vi.key)\n }\n // The controller owns removal, as in the flat editors, and runs\n // before the `deleted` emit so a handler still gets `vi.raw`.\n // Deferred: a saved row is tombstoned and counts as unsaved.\n // Immediate: the backend already deleted it and does not renumber siblings, so the\n // editor does not either. Positions match the server and nothing reads as unsaved.\n if (deferred) controller.deleteItem(vi.key, { trackDeleted: true })\n else controller.deleteItem(vi.key, { trackDeleted: false, renumber: false })\n emit('deleted', vi)\n },\n disableDeleteConfirm: () => props.disableDeleteConfirm,\n})\n\nconst onDeleteClick = async (vi: NestedViewItem<TItem>) => {\n if (!canInteract.value) return\n await triggerDeleteClick(vi)\n}\n\n// Blocks a second click while the consumer's save is pending, so no duplicate is sent.\n// A rejected save keeps the row open and still reaches the app's error handler.\nconst savingKeys = ref<Set<ListEditorKey>>(new Set())\nconst onSaveClick = async (vi: NestedViewItem<TItem>) => {\n if (savingKeys.value.has(vi.key)) return\n savingKeys.value.add(vi.key)\n try {\n if (props.onItemSave) await props.onItemSave(vi.raw)\n } finally {\n savingKeys.value.delete(vi.key)\n }\n commitEdit(vi)\n emit('item-saved', vi)\n}\n\nconst onCancelClick = (vi: NestedViewItem<TItem>) => {\n cancelEdit(vi)\n}\n\nconst onCloseClick = (vi: NestedViewItem<TItem>) => {\n closeEdit(vi)\n emit('close', vi)\n}\n\nconst moveUp = (id: ListEditorKey) => {\n if (controller.moveUp(id)) markMoved(id)\n}\nconst moveDown = (id: ListEditorKey) => {\n if (controller.moveDown(id)) markMoved(id)\n}\nconst moveTop = (id: ListEditorKey) => {\n if (controller.moveTop(id)) markMoved(id)\n}\nconst moveBottom = (id: ListEditorKey) => {\n if (controller.moveBottom(id)) markMoved(id)\n}\nconst doIndent = (vi: NestedViewItem<TItem>) => {\n if (!controller.indent(vi.key)) {\n showWarningT('common.sortable.error.maxDeepExceed')\n return\n }\n markMoved(vi.key)\n emit('indent', vi)\n}\nconst doOutdent = (vi: NestedViewItem<TItem>) => {\n if (!controller.outdent(vi.key)) return\n markMoved(vi.key)\n emit('outdent', vi)\n}\n\nconst resolveCompactText = (raw: TItem): string => resolveCompactTextUtil(raw, { compactField: props.compactField })\n\n// Row validation from the controller's gated `rowState` — red rail shows only\n// once the row is unsaved or `validateAll()` ran.\n// `editing` → the controller reads amber (not red) while the row is being filled in. (QA 85050 b7)\nconst resolveValidation = (raw: TItem, key?: ListEditorKey): ListEditorValidationState =>\n key === undefined ? null : controller.rowState(raw, key, editingKeys.value.has(key))\n\n// Per-key actions cache for stable per-row identity (see AListEditor). Closures\n// capture the stable key and look up the current vi via findVi at call time.\ntype ActionsBundle = {\n edit: () => void\n save: () => Promise<void> | void\n cancel: () => void\n close: () => void\n delete: () => Promise<void>\n addAfter: () => void\n addChild: () => void\n toggleExpand: () => void\n toggleDetail: () => void\n moveUp: () => void\n moveDown: () => void\n moveTop: () => void\n moveBottom: () => void\n indent: () => void\n outdent: () => void\n update: (data: TItem) => void\n}\nconst actionsCache = new Map<ListEditorKey, ActionsBundle>()\nconst getActions = (key: ListEditorKey): ActionsBundle => {\n let actions = actionsCache.get(key)\n if (!actions) {\n actions = {\n edit: () => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n save: () => {\n const vi = findVi(key)\n return vi ? onSaveClick(vi) : undefined\n },\n cancel: () => {\n const vi = findVi(key)\n if (vi) onCancelClick(vi)\n },\n close: () => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n delete: async () => {\n const vi = findVi(key)\n if (vi) await onDeleteClick(vi)\n },\n addAfter: () => {\n const vi = findVi(key)\n if (vi) onRowAddAfterClick(vi)\n },\n addChild: () => {\n const vi = findVi(key)\n if (vi) onAddChildClick(vi)\n },\n toggleExpand: () => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n toggleDetail: () => {\n const vi = findVi(key)\n if (vi) onDetailToggle(vi)\n },\n moveUp: () => moveUp(key),\n moveDown: () => moveDown(key),\n moveTop: () => moveTop(key),\n moveBottom: () => moveBottom(key),\n indent: () => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n outdent: () => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n update: (data: TItem) => controller.updateItem(key, data),\n }\n actionsCache.set(key, actions)\n }\n return actions\n}\nwatch(\n () => viewItemsDecorated.value,\n (now) => {\n if (actionsCache.size === 0) return\n const liveKeys = new Set(now.map((v) => v.key))\n for (const key of actionsCache.keys()) {\n if (!liveKeys.has(key)) actionsCache.delete(key)\n }\n }\n)\n\nconst buildSlotProps = (vi: DecoratedNestedViewItem<TItem>) => ({\n item: { ...vi, validationState: resolveValidation(vi.raw as TItem, vi.key) },\n raw: vi.raw,\n index: vi.index,\n key: vi.key,\n depth: vi.depth,\n parent: vi.parent,\n parentKey: vi.parentKey,\n childrenCount: vi.childrenCount,\n hasChildren: vi.hasChildren,\n childrenAllowed: vi.childrenAllowed,\n firstInParent: vi.firstInParent,\n lastInParent: vi.lastInParent,\n readonly: props.readonly,\n disabled: props.disabled,\n expanded: vi.expanded,\n childrenExpanded: vi.childrenExpanded,\n editing: vi.editing,\n dirty: vi.dirty,\n unsaved: vi.unsaved,\n moved: vi.moved,\n reorderMode: reorderMode.value,\n canMoveUp: !vi.firstInParent,\n canMoveDown: !vi.lastInParent,\n canIndent: vi.canIndent,\n canOutdent: vi.canOutdent,\n canAddChild: vi.canAddChild,\n touch: isTouch.value,\n stateKeyPrefix: rowStateScope.prefixFor(vi.key),\n actions: getActions(vi.key),\n})\n\nconst toolbarSlotProps = computed(() => ({\n applying: applying.value,\n hasPendingChanges: nestedPendingChanges.value,\n movedCount: nestedPendingCount.value,\n error: applyError.value,\n actions: {\n apply: applyReorder,\n cancel: cancelReorderMode,\n },\n}))\n\nconst reorderToggleSlotProps = computed(() => ({\n mode: mode.value,\n disabled: !canEnterReorder.value,\n hasPendingChanges: hasPendingChanges.value,\n actions: {\n enterReorderMode,\n exitReorderMode: cancelReorderMode,\n },\n}))\n\nconst expandableKeySet = computed(() => new Set(expandableKeys.value))\n\nconst findVi = (key: ListEditorKey): DecoratedNestedViewItem<TItem> | undefined =>\n viewItemsDecorated.value.find((v) => v.key === key)\n\nconst keyboardNav = useKeyboardNav({\n viewItems: computed(() =>\n viewItemsDecorated.value.map((vi) => ({\n key: vi.key,\n expanded: vi.childrenExpanded,\n canExpand: expandableKeySet.value.has(vi.key),\n canIndent: true,\n canOutdent: true,\n }))\n ),\n variant: 'nested',\n isReorderMode: reorderMode,\n disabled: computed(() => !canInteract.value),\n isEditing: (key) => editingKeys.value.has(key),\n onToggleEdit: (key) => {\n const vi = findVi(key)\n if (vi) onEditClick(vi)\n },\n onCancelEdit: (key) => {\n const vi = findVi(key)\n if (vi) onCloseClick(vi)\n },\n onMoveUp: (key) => moveUp(key),\n onMoveDown: (key) => moveDown(key),\n onMoveTop: (key) => moveTop(key),\n onMoveBottom: (key) => moveBottom(key),\n onIndent: (key) => {\n const vi = findVi(key)\n if (vi) doIndent(vi)\n },\n onOutdent: (key) => {\n const vi = findVi(key)\n if (vi) doOutdent(vi)\n },\n onToggleChildren: (key) => {\n const vi = findVi(key)\n if (vi) onChevronClick(vi)\n },\n onCancelReorder: () => cancelReorderMode(),\n})\n\nconst moveToPositionDialogOpen = ref<boolean>(false)\nconst moveToPositionTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst moveToPositionContext = computed<{\n parentId: ListEditorKey | null\n total: number\n currentIndex: number\n} | null>(() => {\n const target = moveToPositionTarget.value\n if (!target) return null\n const found = controller.findNode(target.key)\n const siblings = found.parent?.children ?? modelValue.value.children\n const idx = siblings.findIndex((s) => keyOf(s.data) === target.key)\n return {\n parentId: found.parent ? keyOf(found.parent.data) : null,\n total: siblings.length,\n currentIndex: idx,\n }\n})\nconst moveToPositionLabel = computed<string>(() =>\n moveToPositionTarget.value ? resolveCompactText(moveToPositionTarget.value.raw) : ''\n)\nconst openMoveToPosition = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showMoveToPosition) return\n moveToPositionTarget.value = vi\n moveToPositionDialogOpen.value = true\n}\nconst onMoveToPositionConfirm = (newIndex: number) => {\n const ctx = moveToPositionContext.value\n const target = moveToPositionTarget.value\n moveToPositionTarget.value = null\n if (!ctx || !target) return\n if (newIndex === ctx.currentIndex) return\n const slot = newIndex > ctx.currentIndex ? newIndex + 1 : newIndex\n if (controller.moveTo(target.key, ctx.parentId, slot)) {\n markMoved(target.key)\n }\n}\n\nconst changeParentDialogOpen = ref<boolean>(false)\nconst changeParentTarget = shallowRef<DecoratedNestedViewItem<TItem> | null>(null)\nconst openChangeParent = (vi: DecoratedNestedViewItem<TItem>) => {\n if (!props.showChangeParent) return\n changeParentTarget.value = vi\n changeParentDialogOpen.value = true\n}\nconst onChangeParentConfirm = (parentId: ListEditorKey | null, position: 'first' | 'last') => {\n const target = changeParentTarget.value\n changeParentTarget.value = null\n if (!target) return\n // Sibling count under the new parent so 'last' resolves to the right index ('first' = 0).\n let siblingCount = 0\n if (parentId === null) {\n siblingCount = modelValue.value.children.length\n } else {\n const found = controller.findNode(parentId)\n siblingCount = found.node?.children?.length ?? 0\n }\n const targetIndex = position === 'first' ? 0 : siblingCount\n if (controller.moveTo(target.key, parentId, targetIndex)) {\n markMoved(target.key)\n if (parentId !== null) childrenExpandedKeys.value.add(parentId)\n }\n}\n\n// Aggregated display flags + helpers passed into each <LeNestedRow>.\nconst rowContext = computed(() => ({\n reorderMode: reorderMode.value,\n readonly: props.readonly,\n canInteract: canInteract.value,\n dragEnabled: dragEnabled.value,\n showExpandToggle: props.showExpandToggle,\n showEditButton: props.showEditButton,\n showDeleteButton: props.showDeleteButton,\n showAddChildButton: props.showAddChildButton,\n showAddAfterAction: props.showAddAfterAction,\n showMoveToPosition: props.showMoveToPosition,\n showChangeParent: props.showChangeParent,\n showInlineSaveFooter: showInlineSaveFooter.value,\n statusField: props.statusField,\n effectiveCloseVariant: effectiveCloseVariant.value,\n keyboardNav,\n isRowClickable,\n resolveCompactText,\n resolveValidation: (raw: TItem, key?: ListEditorKey) => resolveValidation(raw, key),\n buildSlotProps,\n}))\n\n// Event callback bundle passed to each row.\nconst rowCallbacks = {\n onRowClick,\n onChevronClick,\n onEditClick,\n onDeleteClick,\n onCloseClick,\n onSaveClick,\n onCancelClick,\n onAddAfterClick: onRowAddAfterClick,\n onAddChildClick,\n moveUp: (id: ListEditorKey) => moveUp(id),\n moveDown: (id: ListEditorKey) => moveDown(id),\n moveTop: (id: ListEditorKey) => moveTop(id),\n moveBottom: (id: ListEditorKey) => moveBottom(id),\n indent: doIndent,\n outdent: doOutdent,\n openMoveToPosition,\n openChangeParent,\n}\n\nconst rootViewItems = computed(() => viewItemsDecorated.value.filter((v) => v.parentKey === null))\n\n// `acceptChanges` re-baselines only what its op changed. Other\n// pending edits and moves must keep arming the leave guard.\n// Siblings the op only renumbered stay dirty, since the server may\n// not have renumbered them and the page's save must send them.\nconst nodesByKey = (): Map<ListEditorKey, NestedTreeNode<TItem>> => {\n const out = new Map<ListEditorKey, NestedTreeNode<TItem>>()\n const walk = (nodes: NestedTreeNode<TItem>[]) => {\n for (const n of nodes) {\n out.set(keyOf(n.data), n)\n if (n.children?.length) walk(n.children)\n }\n }\n walk(modelValue.value.children)\n return out\n}\nconst pendingKeys = (): Set<ListEditorKey> => new Set([...nodesByKey().keys()].filter((k) => controller.isUnsaved(k)))\n/**\n * Runs a tree mutation the server already made, such as a row created or saved through a dialog.\n * Adopts as saved only the rows it added or edited, plus `keys`. Pass\n * the row's key for a delete, since it is no longer in the tree.\n * Renumbered siblings and other pending work stay unsaved.\n */\nconst acceptChanges = (op: () => void, keys: ListEditorKey[] = []) => {\n const existing = new Set(nodesByKey().keys())\n const before = pendingKeys()\n op()\n nextTick(() => {\n const nodes = nodesByKey()\n const accepted = [...new Set([...keys, ...[...pendingKeys()].filter((k) => !before.has(k))])]\n // A created row the op renumbered into a gap left by an immediate delete is not where the server stored it.\n // It is adopted as saved, but its position stays pending for the page's save.\n const renumbered = accepted.filter((k) => !existing.has(k) && nodes.get(k)?.meta.dirty)\n controller.acceptRows(accepted)\n const adopted = nodesByKey()\n for (const k of renumbered) {\n const node = adopted.get(k)\n if (node) controller.updateItem(k, node.data, true)\n }\n })\n}\n\n// Registers this editor as a named unsaved-changes section when a label is passed.\nuseUnsavedSection(() =>\n props.unsavedSectionLabel && !props.disableUnsaved\n ? { label: props.unsavedSectionLabel, dirty: controller.hasUnsaved.value }\n : []\n)\n\n// Reveal for a blocked save: open invalid rows and expand the\n// offender's ancestors so a collapsed nested row becomes visible.\n// Shared by the exposed `validateAll` and the scope's reveal-on-touch.\nconst revealNestedInvalid = (): boolean =>\n validateAllAndReveal(controller, (key) => {\n let ancestor = controller.findNode(key).parent\n while (ancestor) {\n childrenExpandedKeys.value.add(keyOf(ancestor.data))\n ancestor = controller.findNode(keyOf(ancestor.data)).parent\n }\n const vi = controller.viewItems.value.find((v) => v.key === key)\n if (vi) beginEdit(vi)\n })\n\n// Auto-bridge the editor's aggregate validity into the consumer's `validation-scope` collector so a\n// plain `$invalid` save gate blocks (and reveals) a collapsed invalid row. No-op without the prop.\n// eslint-disable-next-line vue/no-setup-props-reactivity-loss -- construction-time opt-in, read once\nuseListEditorScopeValidity({\n hasErrors: controller.hasErrors,\n validationScope: props.validationScope,\n validateProvided: props.validate !== undefined,\n reveal: revealNestedInvalid,\n})\n\ndefineExpose<NestedSortableListEditorExtras & NestedListEditorHandle<TItem>>({\n ...controller,\n validateAll: revealNestedInvalid,\n commit,\n acceptChanges,\n // Expand-aware flattened view (controller's own `viewItems` ignores collapse state).\n viewItems: flatViewItems,\n enterReorderMode,\n cancelReorderMode,\n applyReorder,\n expand: (id: ListEditorKey) => childrenExpandedKeys.value.add(id),\n collapse: (id: ListEditorKey) => childrenExpandedKeys.value.delete(id),\n toggleExpand: (id: ListEditorKey) => {\n if (childrenExpandedKeys.value.has(id)) childrenExpandedKeys.value.delete(id)\n else childrenExpandedKeys.value.add(id)\n },\n expandDetail: (id: ListEditorKey) => detailExpandedKeys.value.add(id),\n collapseDetail: (id: ListEditorKey) => detailExpandedKeys.value.delete(id),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"a-nested-list-editor\"\n :class=\"[\n `a-nested-list-editor--mode-${mode}`,\n {\n 'a-nested-list-editor--readonly': readonly,\n 'a-nested-list-editor--disabled': disabled,\n 'a-nested-list-editor--touch': isTouch,\n 'a-nested-list-editor--drag-enabled': dragEnabled,\n },\n ]\"\n >\n <div class=\"a-le-card\">\n <div\n v-if=\"headerVisible\"\n class=\"a-le-header\"\n >\n <slot\n name=\"header\"\n :title=\"title\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <h3\n v-if=\"title\"\n class=\"a-le-title-heading\"\n >\n {{ title }}\n </h3>\n <div class=\"a-le-header-actions\">\n <template v-if=\"reorderMode\">\n <!-- Reorder-mode header: pending count + Cancel/Apply, sitting where\n the \"Reorder\" button lives in view mode (not a bottom toolbar). -->\n <slot\n name=\"reorder-toolbar\"\n v-bind=\"toolbarSlotProps\"\n >\n <LeStatus\n :class=\"{ 'a-le-toolbar-status--pending': nestedPendingChanges }\"\n :has-pending-changes=\"nestedPendingChanges\"\n :pending-count=\"nestedPendingCount\"\n :error=\"applyError\"\n />\n <VBtn\n variant=\"text\"\n size=\"small\"\n :disabled=\"applying\"\n @click=\"cancelReorderMode\"\n >\n {{ t('common.sortable.reorderCancel') }}\n </VBtn>\n <VBtn\n color=\"primary\"\n variant=\"flat\"\n size=\"small\"\n prepend-icon=\"mdi-check\"\n :loading=\"applying\"\n :disabled=\"applying || !nestedPendingChanges\"\n @click=\"applyReorder\"\n >\n {{ t('common.sortable.reorderApply') }}\n </VBtn>\n </slot>\n </template>\n <template v-else>\n <VBtn\n v-if=\"expandAllVisible && compactReorderButton\"\n :aria-label=\"allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n @click=\"toggleExpandAll\"\n >\n <VIcon\n :icon=\"allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll')\"\n />\n </VBtn>\n <VBtn\n v-else-if=\"expandAllVisible\"\n variant=\"tonal\"\n color=\"primary\"\n size=\"small\"\n :prepend-icon=\"allExpanded ? 'mdi-unfold-less-horizontal' : 'mdi-unfold-more-horizontal'\"\n @click=\"toggleExpandAll\"\n >\n {{ allExpanded ? t('common.sortable.collapseAll') : t('common.sortable.expandAll') }}\n </VBtn>\n <slot\n v-if=\"reorderToggleVisible\"\n name=\"reorder-toggle\"\n v-bind=\"reorderToggleSlotProps\"\n >\n <VBtn\n v-if=\"compactReorderButton\"\n :aria-label=\"t('common.sortable.reorder')\"\n variant=\"tonal\"\n color=\"primary\"\n icon\n size=\"x-small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n <VIcon\n icon=\"mdi-sort\"\n size=\"18\"\n />\n <VTooltip\n activator=\"parent\"\n location=\"bottom\"\n :text=\"t('common.sortable.reorder')\"\n />\n </VBtn>\n <VBtn\n v-else\n variant=\"tonal\"\n color=\"primary\"\n prepend-icon=\"mdi-sort\"\n size=\"small\"\n :disabled=\"!canEnterReorder\"\n @click=\"enterReorderMode\"\n >\n {{ t('common.sortable.reorder') }}\n </VBtn>\n </slot>\n </template>\n </div>\n </slot>\n </div>\n\n <div\n v-if=\"loading\"\n class=\"a-le-state a-le-state--loading\"\n >\n <VProgressCircular\n indeterminate\n color=\"primary\"\n size=\"32\"\n />\n </div>\n\n <div\n v-else-if=\"error\"\n class=\"a-le-state a-le-state--error\"\n >\n <VAlert\n type=\"error\"\n variant=\"tonal\"\n density=\"compact\"\n border=\"start\"\n >\n {{ error }}\n </VAlert>\n </div>\n\n <div\n v-else-if=\"isEmpty\"\n class=\"a-le-state a-le-state--empty\"\n >\n <slot\n name=\"empty\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :actions=\"{ add: onAddClick }\"\n >\n <LeEmptyState\n :title=\"emptyTitleResolved\"\n :add-label=\"addLabelResolved\"\n :can-add=\"canAdd\"\n @add=\"onAddClick\"\n />\n </slot>\n </div>\n\n <div\n v-else\n :key=\"forceRerender\"\n ref=\"rowsContainer\"\n class=\"a-nested-list-editor__rows\"\n :class=\"{ 'a-nested-list-editor__rows--dragging': dragState !== null }\"\n >\n <div\n :class=\"[GROUP_CLASS, 'a-nested-list-editor__group--root']\"\n data-parent-id=\"\"\n >\n <LeNestedRow\n v-for=\"vi in rootViewItems\"\n :key=\"String(vi.key)\"\n :vi=\"vi\"\n :view-items=\"viewItemsDecorated\"\n :drag-state=\"dragState\"\n :context=\"rowContext\"\n :callbacks=\"rowCallbacks\"\n >\n <template #item=\"slotScope\">\n <slot\n name=\"item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-compact=\"slotScope\">\n <slot\n name=\"item-compact\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-readonly=\"slotScope\">\n <slot\n name=\"item-readonly\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-status=\"slotScope\">\n <slot\n name=\"item-status\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-footer=\"slotScope\">\n <slot\n name=\"item-footer\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #item-actions=\"slotScope\">\n <slot\n name=\"item-actions\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #before-item=\"slotScope\">\n <slot\n name=\"before-item\"\n v-bind=\"slotScope\"\n />\n </template>\n <template #after-item=\"slotScope\">\n <slot\n name=\"after-item\"\n v-bind=\"slotScope\"\n />\n </template>\n </LeNestedRow>\n </div>\n\n <!-- Drop indicator overlay (valid drops only): horizontal line at a row\n edge (depth in `left`) + an optional vertical connector rail to the\n row whose level the insert matches. -->\n <template v-if=\"overlayVisual !== null\">\n <div\n v-if=\"overlayVisual.connector !== null\"\n class=\"a-nested-list-editor__drop-connector\"\n :style=\"{\n left: `${overlayVisual.connector.left}px`,\n top: `${overlayVisual.connector.top}px`,\n height: `${overlayVisual.connector.height}px`,\n }\"\n />\n <div\n class=\"a-nested-list-editor__drop-line\"\n :style=\"{\n top: `${overlayVisual.line.top}px`,\n left: `${overlayVisual.line.left}px`,\n right: `${overlayVisual.line.right}px`,\n }\"\n >\n <span class=\"a-nested-list-editor__drop-line-dot\" />\n </div>\n </template>\n </div>\n\n <slot\n v-if=\"canAdd && !loading && !error && !isEmpty\"\n name=\"add-button\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :props=\"{ onClick: onAddClick }\"\n :actions=\"{ add: onAddClick }\"\n >\n <button\n type=\"button\"\n class=\"a-le-row-add\"\n @click=\"onAddClick\"\n >\n <VIcon\n icon=\"mdi-plus\"\n size=\"18\"\n />\n <span>{{ addLabelResolved }}</span>\n </button>\n </slot>\n </div>\n\n <LeMoveToPositionDialog\n v-model=\"moveToPositionDialogOpen\"\n :total=\"moveToPositionContext?.total ?? 0\"\n :current-index=\"moveToPositionContext?.currentIndex ?? 0\"\n :item-label=\"moveToPositionLabel\"\n @confirm=\"onMoveToPositionConfirm\"\n />\n\n <LeChangeParentDialog\n v-model=\"changeParentDialogOpen\"\n :tree=\"modelValue\"\n :source-key=\"changeParentTarget?.key ?? null\"\n :key-field=\"keyFieldName\"\n :max-depth=\"maxDepth\"\n :resolve-label=\"resolveCompactText\"\n :calculate-subtree-depth=\"controller.calculateSubtreeDepth\"\n @confirm=\"onChangeParentConfirm\"\n />\n\n <LeDeleteDialog\n v-model=\"deleteDialog\"\n :title=\"deleteConfirmTitleResolved\"\n :text=\"deleteConfirmTextResolved\"\n :confirm-label=\"t('common.sortable.delete')\"\n :cancel-label=\"t('common.button.cancel')\"\n :error=\"deleteError\"\n :in-flight=\"deleteInFlight\"\n @confirm=\"onDeleteDialogConfirm\"\n @cancel=\"onDeleteDialogCancel\"\n />\n\n <div\n class=\"a-le-sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n >\n {{\n keyboardNav.grabbedKey.value !== null\n ? t('common.sortable.keyboardGrab.status', {\n n: keyboardNav.grabbedIndex.value + 1,\n total: keyboardNav.totalCount.value,\n })\n : ''\n }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\">\n@use '../styles/tokens';\n@use '../styles/shared';\n\n// Nested-variant rules — depth-aware padding, tree toggle caret, children\n// groups, drop indicator overlay, drag clone.\n.a-nested-list-editor {\n // Depth-aware left padding — caret column + indent per depth level.\n .a-le-row-header {\n padding: var(--le-row-pad-y) 12px var(--le-row-pad-y) calc(16px + var(--nested-depth, 0) * var(--le-indent));\n }\n\n // Row wrappers + inter-row group layout.\n &__rows {\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n &__group {\n display: flex;\n flex-direction: column;\n }\n\n // Re-apply the `font` shorthand (shared class uses longhand for flat variants)\n // so the nested variant keeps its explicit line-height reset.\n .a-le-toolbar-status {\n font: 500 13px/1 var(--v-font-body, inherit);\n }\n}\n\n.a-le-row-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.a-nested-list-editor {\n // Root rows get a bolder title weight to anchor the hierarchy without header rows.\n .a-le-row:not(.a-le-row--child) .a-le-title {\n font-weight: 600;\n }\n\n // Reorder mode — flat-variant padding offset by the row's indent level.\n .a-le-row--reorder .a-le-row-header {\n padding-left: calc(12px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 8px;\n gap: 8px;\n }\n\n // Active (editing / readonly-expanded) tree-toggle picks up the primary tint\n // so the header reads \"active\" together with the title color.\n .a-le-row--editing &__tree-toggle,\n .a-le-row--expanded &__tree-toggle {\n color: var(--le-primary);\n }\n\n // Children wrapper — depth conveyed by the row's padding-left indent alone.\n &__children {\n position: relative;\n }\n\n // Triangle-caret toggle — circular text-style button (24×24), transparent\n // with a subtle tinted circle on hover.\n &__tree-toggle {\n width: 24px;\n height: 24px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n pointer-events: auto;\n color: rgb(0 0 0 / 54%);\n z-index: 2;\n flex-shrink: 0;\n transition:\n background 0.15s,\n color 0.15s;\n\n &:hover {\n background: rgb(0 0 0 / 5%);\n color: var(--le-on-surface);\n }\n\n &:focus-visible {\n outline: none;\n background: rgb(0 0 0 / 8%);\n }\n\n // Black at 54% is invisible on a dark surface (1.12:1). `:where` adds no\n // specificity, so the primary tint of an editing or expanded row still wins.\n :where(.v-theme--dark) & {\n color: rgb(255 255 255 / 70%);\n\n &:hover {\n background: rgb(255 255 255 / 8%);\n }\n\n &:focus-visible {\n background: rgb(255 255 255 / 12%);\n }\n }\n }\n\n // Reserve caret column width on leaf rows so titles align across siblings.\n &__tree-toggle--spacer,\n &__tree-toggle--empty {\n width: 24px;\n height: 24px;\n background: transparent;\n visibility: hidden;\n pointer-events: none;\n }\n\n // Pure CSS right-pointing triangle; rotates to down when the row is open.\n &__tree-toggle-caret {\n width: 0;\n height: 0;\n border-left: 5px solid currentcolor;\n border-top: 4px solid transparent;\n border-bottom: 4px solid transparent;\n border-right: 0;\n transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateX(1px); // optical centering — triangle leans left\n }\n\n &__tree-toggle--open &__tree-toggle-caret {\n transform: translate(0, 1px) rotate(90deg);\n }\n\n // Dragged subtree (source + descendants) dimmed and non-hittable. `!important`\n // on display beats SortableJS's inline `display: none` under `forceFallback`.\n .a-le-row-wrapper.a-le-row--chosen,\n .a-le-row-wrapper.a-le-row-wrapper--drop-disabled {\n display: flex !important;\n opacity: 0.4 !important;\n pointer-events: none !important;\n }\n\n // Hide SortableJS's placeholder — our overlay is the sole landing indicator.\n .a-le-row--ghost {\n display: none !important;\n }\n\n // No floating clone — the line overlay carries all the \"where it lands\" info.\n // Wrapper selector beats the `.row-wrapper--drop-disabled` rule the clone inherits.\n .a-le-row-wrapper.a-le-row--drag {\n display: none !important;\n }\n\n // Drop indicator line — 2px primary stroke with an 8px left terminal dot,\n // absolute-positioned inside `__rows`.\n &__drop-line {\n position: absolute;\n height: 2px;\n margin-top: -1px;\n background: var(--le-primary);\n pointer-events: none;\n z-index: 4;\n border-radius: 1px;\n }\n\n &__drop-line-dot {\n position: absolute;\n left: -4px;\n top: 50%;\n width: 8px;\n height: 8px;\n background: var(--le-primary);\n border-radius: 50%;\n transform: translateY(-50%);\n }\n\n // Connector rail — vertical line linking the drop line up to the level-match row.\n &__drop-connector {\n position: absolute;\n width: 2px;\n margin-left: -1px;\n background: var(--le-primary);\n opacity: 0.5;\n pointer-events: none;\n z-index: 3;\n }\n\n // While dragging, dim the add-button so focus stays on the drag target.\n &__rows--dragging .a-le-row-add {\n opacity: 0.4;\n }\n\n // \"+N\" children indicator — hidden in the normal DOM, visible only inside the\n // SortableJS drag clone so the user sees the whole branch will follow.\n &__drag-count {\n display: none;\n align-items: center;\n gap: 4px;\n margin-left: 8px;\n padding: 2px 8px;\n font: 500 11px/1 var(--v-font-body, inherit);\n letter-spacing: 0.02em;\n color: var(--le-primary);\n background: var(--le-primary-container);\n border-radius: var(--le-radius-pill);\n flex-shrink: 0;\n }\n\n .a-le-row--drag &__drag-count {\n display: inline-flex;\n }\n}\n\n// Desktop — depth-aware padding-left aligns the inline form with the title column:\n// 16 (pad) + 24 (caret) + 10 (gap) = 50, plus depth*indent.\n@container le-shell (min-width: 769px) {\n .a-nested-list-editor {\n .a-le-row--editing .a-le-row-body,\n .a-le-row--expanded .a-le-row-body,\n .a-le-row--editing .a-le-row-footer,\n .a-le-row--expanded .a-le-row-footer {\n padding-left: calc(50px + var(--nested-depth, 0) * var(--le-indent));\n padding-right: 16px;\n }\n }\n}\n\n// Narrow / mobile — tighter indent so deep branches fit, taller touch rows,\n// always-visible actions, status badge dropped to make room for the title.\n/* stylelint-disable selector-max-compound-selectors */\n@container le-shell (max-width: 768px) {\n .a-nested-list-editor {\n --le-indent: 18px;\n --le-row-min-height: 48px;\n --le-row-pad-y: 10px;\n\n .a-le-row:not(.a-le-row--editing) .a-le-status {\n display: none;\n }\n\n .a-le-row .a-le-action--edit,\n .a-le-row .a-le-action--delete,\n .a-le-row .a-le-action--menu,\n .a-le-row .a-le-action--up,\n .a-le-row .a-le-action--down,\n .a-le-row .a-le-action--add-child {\n opacity: 1;\n }\n }\n}\n/* stylelint-enable selector-max-compound-selectors */\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;A,GA6wBM+C,KAAc,+BAYdC,KAAY,IACZC,KAAW,I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAjgBjB,IAAMQ,IAAQC,GA6CRC,IAAOH,IAiBPI,KAAY5D,GAA8B0D,GAAA,YAAmB,GAE/DI,KAAyC;EAC7C,EAAMF,UAAkB,KAAe,MAAO,EAAE,OAAO,OAAO,CAAC;EAC/D,IAAMG,IAAaC,IAA8B,GAAO,OAAa;GACnE,WAAW;IACT,EAAM;IAGN,IAAMC,IAAUL,GAAU;IAC1B,OAAOE,MAAgBG;GACzB;GACA,MAAM,MAAM;IAMV,AALA,KAAeC,GACf,GAAU,QAAQA,GAClBC,EAAQ,GAGRC,QAAe;KACb,AAAIN,OAAiBI,MACrB,KAAe,MACfC,EAAQ;IACV,CAAC;GACH;EACF,EAAE,GACIE,KAAOrE,GAAwB0D,GAAC,MAA2B,GAkB3D,EAAE,SAAMY,GAAQ,GAChBC,KAAQC,GAAS,GACjB,EAAE,qBAAiBC,EAAU,GAE7BC,KAASC,GAA4B,QAAQ,GAC7C,EAAE,iBAAaC,EAAkBF,EAAM,GAEvCG,KAAUC,EAAiB,GAE3BC,KAAwBC,QACxBvB,EAAM,iBAAiB,SAAe,SACtCA,EAAM,iBAAiB,YAAkB,YACtCwB,GAAS,QAAQ,SAAS,SAClC,GAEKC,IAAuBC,kBAAwB,IAAI,IAAI,CAAC,GAExDC,IAAqBD,kBAAwB,IAAI,IAAI,CAAC,GAKtDE,KAAY5B,EAAM,UAAU,MAC5B6B,KAAgB,OAAOD,MAAc,aAAa,OAAOA,IACzDE,KAAS,MACb,OAAOF,MAAc,aAAaA,GAAUG,CAAI,IAAKA,EAAKH,KAGtDI,YAAmC;GACvC,IAAMC,IAAIjC,EAAM;GAGhB,OAFIiC,MAAM,KAAA,KAAaA,MAAM,KAAc,aACvC,OAAOA,KAAM,WAAiBA,EAAE,QAC7BA;EACT,EAAA,CAAG;EAcH,EAZ8B,MAA4B;GACxD,IAAMC,KAAQ,MAAmC;IAC/C,KAAK,IAAM,KAAKC,GACd,AAAI,EAAE,YAAY,EAAE,SAAS,SAAS,MACpCV,EAAqB,MAAM,IAAIK,EAAM,EAAE,IAAI,CAAC,GAC5CI,EAAK,EAAE,QAAQ;GAGrB;GACA,EAAKE,EAAK,QAAQ;EACpB,EAEA,CAAqB9B,EAAW,KAAK;EAKrC,IAAM+B,KAA0D;GAC9D,WAAW/B,EAAW;GACtB,MAAM,MAAO,EAAW,QAAQG;GAChC,SAAST,EAAM;GACf,QAAQA,EAAM;GACd,UAAUA,EAAM;GAChB,aAAaA,EAAM;GACnB,UAAUA,EAAM;GAChB,oBAAoBA,EAAM,gBAAgB,CAAC;GAC3C,UAAUA,EAAM;EAClB,GAIMsC,KAAatC,EAAM,SAAS,OAAOuC,EAAqCvC,EAAM,UAAUqC,EAAiB,GACzGG,IAAaxC,EAAM,UAAUsC,IAAY,UAAUG,EAAqCJ,EAAiB,GAIzGK,KAAgBC,EAA4BL,IAAY,cAAc,IAAI,GAK1EM,IAAgBrB,QAAwC;GAC5D,IAAMsB,IAAgC,CAAC,GACnCC,IAAY,GACVC,IAAW/C,EAAM,UACjBkC,KAAQ,GAAgC,GAAe,MAA6C;IACxG,KAAK,IAAIc,IAAI,GAAGA,IAAIb,EAAM,QAAQ,KAAK;KACrC,IAAMc,IAAOd,EAAMa,IACbE,IAAMpB,EAAMmB,EAAK,IAAI,GACrBE,IAAkBF,EAAK,aAAa,KAAA,GACpCG,KAAcD,MAAoBF,EAAK,UAAU,UAAU,KAAK,GAChEI,KAAgBJ,EAAK,UAAU,UAAU,GACzCK,KAAiBP,KAAYQ,IAAQ;KAqB3C,AApBAV,EAAK,KAAK;MACR;MACA,OAAO;MACP,KAAKI,EAAK;MACV,UAAUA,EAAK,KAAKjB;MACpB;MACA;MACA,QAAQwB,GAAY,QAAQ;MAC5B,WAAWA,IAAa1B,EAAM0B,EAAW,IAAI,IAAI;MACjD;MACA;MACA;MACA,cAAcR;MACd,cAAcb,EAAM;MACpB,eAAea,MAAM;MACrB,cAAcA,MAAMb,EAAM,SAAS;MACnC,aAAagB,KAAmBG,KAAiB;MACjD,WAAWN,IAAI;MACf,YAAYO,IAAQ;KACtB,CAAC,GACGH,MAAalB,EAAKe,EAAK,UAAqCM,IAAQ,GAAGN,CAAI;IACjF;GACF;GAEA,OADAf,EAAK5B,EAAW,MAAM,UAAU,GAAG,IAAI,GAChCuC;EACT,CAAC;EAID,QACQD,EAAc,MAAM,KAAK,MAAO,OAAOa,EAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,SACxDf,GAAc,aAAaE,EAAc,MAAM,KAAK,MAAOa,EAAG,GAAG,CAAC,GACxE,EAAE,OAAO,OAAO,CAClB;EAKA,IAAMC,KAAWC,GAAqC,IAAI,GACpDC,KAAYlC,kBAAwB,IAAI,IAAI,CAAC,GAI7CmC,IAAyBnC,kBAAwB,IAAI,IAAI,CAAC,GAC1DoC,IAA0BpC,kBAAwB,IAAI,IAAI,CAAC,GAG3DqC,MAAU,MAA8B;GAE5C,AADAvB,EAAW,OAAOwB,CAAK,GACvB,GAAU,wBAAQ,IAAI,IAAI;EAC5B,GAEMC,KAAa,MAAuB;GACxC,IAAM,EAAE,YAASzB,EAAW,SAASU,CAAG;GACxC,IAAI,CAACD,GAAM;IACT,GAAU,MAAM,IAAIC,CAAG;IACvB;GACF;GACA,IAAMgB,KAAW,MAA6B;IAE5C,AADAN,GAAU,MAAM,IAAI9B,EAAMqC,EAAE,IAAI,CAAC,GAC7BA,EAAE,YAAUA,EAAE,SAAS,QAAQD,CAAO;GAC5C;GACA,EAAQjB,CAAI;EACd,GAEMmB,qBAAiB,IAAI,IAAmD,GACxEC,IAAqB9C,QAAiD;GAC1E,IAAM+C,IAAyC,CAAC,GAC1CC,oBAAW,IAAI,IAAmB;GACxC,KAAK,IAAMd,KAAMb,EAAc,OAAO;IACpC,EAAS,IAAIa,EAAG,GAAG;IACnB,IAAMe,IAAUC,EAAY,MAAM,IAAIhB,EAAG,GAAG,GACtCiB,IAAW/C,EAAmB,MAAM,IAAI8B,EAAG,GAAG,GAC9CkB,IAAmBlD,EAAqB,MAAM,IAAIgC,EAAG,GAAG,GACxDmB,IAAU5E,EAAM,aAAa,IAAIyD,EAAG,GAAG,KAAK,IAC5CoB,IAAQjB,GAAU,MAAM,IAAIH,EAAG,GAAG,GAGlCqB,IAAQ,GAAM,YAAmBtC,EAAW,UAAUiB,EAAG,GAAG,GAE5DsB,IAAU/E,EAAM,kBAAkBA,EAAM,WAAW,KAAQ8E,KAASD,GACpEG,IAASZ,GAAe,IAAIX,EAAG,GAAG;IACxC,IACEuB,KACAA,EAAO,QAAQvB,EAAG,OAClBuB,EAAO,UAAUvB,EAAG,SACpBuB,EAAO,aAAavB,EAAG,YACvBuB,EAAO,UAAUvB,EAAG,SACpBuB,EAAO,cAAcvB,EAAG,aACxBuB,EAAO,kBAAkBvB,EAAG,iBAC5BuB,EAAO,kBAAkBvB,EAAG,iBAC5BuB,EAAO,iBAAiBvB,EAAG,gBAC3BuB,EAAO,YAAYR,KACnBQ,EAAO,aAAaN,KACpBM,EAAO,qBAAqBL,KAC5BK,EAAO,YAAYJ,KACnBI,EAAO,UAAUF,KACjBE,EAAO,UAAUH,KACjBG,EAAO,YAAYD,GACnB;KACA,EAAK,KAAKC,CAAM;KAChB;IACF;IACA,IAAMC,KAA4C;KAChD,GAAGxB;KACH;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IAEA,AADAW,GAAe,IAAIX,EAAG,KAAKwB,EAAS,GACpCX,EAAK,KAAKW,EAAS;GACrB;GACA,KAAK,IAAM/B,KAAOkB,GAAe,KAAK,GACpC,AAAKG,EAAS,IAAIrB,CAAG,KAAGkB,GAAe,OAAOlB,CAAG;GAEnD,OAAOoB;EACT,CAAC,GAEKY,KAAU3D,QAAejB,EAAW,MAAM,SAAS,WAAW,CAAC,GAC/D6E,KAAiB5D,QAAeqB,EAAc,MAAM,MAAM,GAE1DwC,IAAgBlE,GAA4B,eAAe,GAE3DmE,IAAc9D,QAAe,CAACvB,EAAM,YAAY,CAACA,EAAM,YAAY,CAACA,EAAM,OAAO,GACjFsF,KAAkB/D,QAAe8D,EAAY,SAAS,CAACrF,EAAM,kBAAkBmF,GAAe,QAAQ,CAAC,GAEvGI,KAAehE,QAAe,CAAC,CAAET,GAAkC,IAAI,GACvE0E,KAAoBjE,QAAe,CAAC,CAAET,GAAkC,gBAAgB,GACxF2E,KAAuBlE,QAAe,CAAC,CAACvB,EAAM,UAAU,GAExD,EAAE,gBAAa,sBAAkB,kBAAc,eAAW,gBAAY,gBAAY,eAAW,wBACjG0F,GAA+C;GAC7C;GACA,aAAa;GACb;GAGA,kBAAkB,GAAK,MAASlD,EAAW,WAAWU,GAAKnB,GAAM,EAAK;GACtE,iBAAiB;IACf,IAAM4D,IAAwB,CAAC,GACzBzD,KAAQ,MAAmC;KAC/C,KAAK,IAAMiC,KAAKhC,GAEd,AADAwD,EAAK,KAAK7D,EAAMqC,EAAE,IAAI,CAAC,GACnBA,EAAE,YAAYA,EAAE,SAAS,UAAQjC,EAAKiC,EAAE,QAAQ;IAExD;IAEA,OADAjC,EAAK5B,EAAW,MAAM,QAAQ,GACvBqF;GACT;GACA,YAAY,MAAQ;IAClB,IAAM,EAAE,YAASnD,EAAW,SAASU,CAAG;IACxC,OAAOD,IAAO,EAAE,MAAMA,EAAK,KAAK,IAAI;GACtC;GACA,gBAAgB,MAAQ;IACtB,IAAM,EAAE,cAAWT,EAAW,SAASU,CAAG;IAC1C,AAAI0C,KACFnE,EAAqB,MAAM,IAAIK,EAAM8D,EAAO,IAAI,CAAC;GAErD;EACF,CAAC,GAEG,EACJ,cACA,gBACA,uBACA,gBACA,gBACA,sBACA,sBACA,qBACEC,GAAkC;GACpC;GACA;GACA;GACA;GACA,aAAa,MAAMC,EAAUC,CAAC;GAC9B,aAAa,MAAM;IACjB,EAAW,QAAQA;GACrB;GACA;GACA,eAAe;IAGb,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCC,GAAa;IAEb,KAAK,IAAMC,KAAKC,EAAe,OAAO,EAAqB,MAAM,IAAID,CAAC;IACtE,QAAe;KACb,AAAIE,EAAY,SAAOC,EAAc;IACvC,CAAC;GACH;GACA,uBAAuB;IAGrB,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCJ,GAAa;GACf;GAIA,gBAAgB;IACd,KAAK,IAAM9C,KAAOW,EAAuB,OAAO,EAAW,eAAeX,CAAG;IAC7E,KAAK,IAAMA,KAAOY,EAAwB,OACxC,EAAW,WAAWZ,GAAK;KAAE,cAAc;KAAO,UAAU;IAAM,CAAC;IAGrE,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCmD,GAAiB;GACnB;GACA,kBAAkB;IAGhB,AAFA,EAAuB,wBAAQ,IAAI,IAAI,GACvC,EAAwB,wBAAQ,IAAI,IAAI,GACxCA,GAAiB;GACnB;GACA,iBAAiB,MAASrG,EAAM,iBAAiBoC,CAAI;GACrD,MAAM;IACJ,oBAAoBlC,EAAK,eAAe;IACxC,qBAAqBA,EAAK,gBAAgB;IAC1C,iBAAiB,MAAYA,EAAK,mBAAmBoG,CAAO;IAC5D,oBAAoB,MAAQpG,EAAK,uBAAuBqG,CAAG;IAC3D,kBAAkBrG,EAAK,aAAa;GACtC;EACF,CAAC,GAIKsG,KAAqBjF,QAAuBkF,GAAW,QAAQ5C,EAAuB,MAAM,IAAI,GAChG6C,KAAuBnF,QAAwBoF,GAAkB,SAAS9C,EAAuB,MAAM,OAAO,CAAC,GAE/G+C,KAASrF,QAAe8D,EAAY,SAASrF,EAAM,iBAAiB,CAAC6G,EAAY,KAAK,GACtFV,IAAc5E,QAAesF,EAAY,SAAS,CAACzF,GAAQ,SAAS,CAACpB,EAAM,WAAW,GAEtF8G,KAAmBvF,QAAevB,EAAM,YAAY+G,EAAE,qBAAqB,CAAC,GAC5EC,KAAqBzF,QAAevB,EAAM,cAAc+G,EAAE,4BAA4B,CAAC,GACvFE,KAA6B1F,QAAevB,EAAM,sBAAsB+G,EAAE,oCAAoC,CAAC,GAC/GG,KAA4B3F,QAE9BvB,EAAM,sBACLA,EAAM,eAAe,cAClB+G,EAAE,mCAAmC,IACrCA,EAAE,2CAA2C,EACrD,GAEMI,KAAuB5F,QACZ,CAACvB,EAAM,YAAYA,EAAM,qBAAqB,CAAC6G,EAAY,SAAS1B,GAAe,QAAQ,CAC5G,GAEMiC,KAAuB7F,QAAiC,CAAC,CAACvB,EAAM,SAASwB,GAAS,KAAK,GAGvF0E,IAAiB3E,QAAgC;GACrD,IAAM8F,IAAuB,CAAC,GACxBnF,KAAQ,MAAmC;IAC/C,KAAK,IAAMiC,KAAKhC,GACd,AAAIgC,EAAE,YAAYA,EAAE,SAAS,SAAS,MACpCkD,EAAI,KAAKvF,EAAMqC,EAAE,IAAI,CAAC,GACtBjC,EAAKiC,EAAE,QAAQ;GAGrB;GAEA,OADAjC,EAAK5B,EAAW,MAAM,QAAQ,GACvB+G;EACT,CAAC,GAEKC,IAAc/F,QACZ2E,EAAe,MAAM,SAAS,KAAKA,EAAe,MAAM,OAAO,MAAMzE,EAAqB,MAAM,IAAIwE,CAAC,CAAC,CAC9G,GAEMsB,KAAmBhG,QAAwB,CAACsF,EAAY,SAASX,EAAe,MAAM,SAAS,CAAC,GAEhGsB,WAAwB;GAC5B,IAAIF,EAAY,OACd,KAAK,IAAMrB,KAAKC,EAAe,OAAO,EAAqB,MAAM,OAAOD,CAAC;QAEzE,KAAK,IAAMA,KAAKC,EAAe,OAAO,EAAqB,MAAM,IAAID,CAAC;EAE1E,GAEMwB,KAAgBlG,QAElB,CAAC,EACCvB,EAAM,SACLc,GAAkC,UAClCA,GAAkC,qBACnCqG,GAAqB,SACrBI,GAAiB,SACjBV,EAAY,MAElB,GAIMa,KAAoBhG,EAA2E,CAAC,CAAC,GACjGiG,KAAgBjG,EAAI,CAAC,GAErB2E,WAAyB;GAC7B,KAAK,IAAMuB,KAAKF,GAAkB,OAChC,IAAI;IACF,EAAE,KAAK;GACT,QAAQ,CAER;GAEF,GAAkB,QAAQ,CAAC;EAC7B,GASMG,IAAYnG,EAAsB,IAAI,GAQtCoG,MACJ,GACA,MACyE;GACzE,IAAMC,IAAM,SAAS,iBAAiBC,GAASC,CAAO;GACtD,IAAI,CAACF,GAAK,OAAO;GACjB,IAAMG,IAAUH,EAAI,QAAQ,mBAAmB;GAI/C,IAHI,CAACG,KAGD,CAAC9C,EAAc,SAAS,CAACA,EAAc,MAAM,SAAS8C,CAAO,GAAG,OAAO;GAC3E,IAAMhF,IAAMiF,GAASD,EAAQ,aAAa,SAAS,CAAC;GACpD,IAAIhF,MAAQ,MAAM,OAAO;GACzB,IAAMO,IAAKY,EAAmB,MAAM,MAAM,MAAM5D,EAAE,QAAQyC,CAAG;GAE7D,OADKO,IACE;IAAE,IAAIyE;IAAS,UAAUzE;GAAG,IADnB;EAElB,GAEM2E,MAAwB,GAAiB,MAAoB;GACjE,IAAI,CAACP,EAAU,SAAS,CAACzC,EAAc,OAAO;GAC9C,IAAM2C,IAAMD,GAAWE,GAASC,CAAO;GACvC,IAAI,CAACF,GAAK;IACR,EAAU,MAAM,cAAc;IAC9B;GACF;GACA,IAAMM,IAAgBjD,EAAc,MAAM,sBAAsB,GAI1DkD,KADQP,EAAI,GAAG,cAAc,oBAClB,KAASA,EAAI,GAAA,CAAI,sBAAsB;GACxD,EAAU,MAAM,cAAcQ,GAAmB;IAC/C,SAAS;KAAE,GAAGP;KAAS,GAAGC;IAAQ;IAClC,YAAY;KACV,KAAKF,EAAI,SAAS;KAClB,MAAMO;KACN,OAAOP,EAAI,SAAS;KACpB,WAAWA,EAAI,SAAS;KACxB,cAAcA,EAAI,SAAS;KAC3B,cAAcA,EAAI,SAAS;IAC7B;IACA,WAAWF,EAAU,MAAM;IAC3B,oBAAoBA,EAAU,MAAM;IACpC,WAAWxD,EAAmB;IAC9B,UAAUrE,EAAM;IAChB,UAAUT;IACV,eAAe8I,EAAc;IAC7B,sBAAsB7I;GACxB,CAAC;EACH,GAEMgJ,MAAiB,MAAoB;GACzC,GAAqB,EAAE,SAAS,EAAE,OAAO;EAC3C,GAEMC,MAAoB,GAA6B,MAA6B;GAElF,AADWjG,EAAW,OAAOkG,GAAWC,EAAK,WAAWA,EAAK,KACxD,KAML1E,EAAUyE,CAAS,GAEfC,EAAK,aAAaA,EAAK,cAAc,QACvClH,EAAqB,MAAM,IAAIkH,EAAK,SAAS,MAR7CC,GAAa,qCAAqC,GAClD,GAAc,SACdjI,QAAeyF,EAAc,CAAC;EAQlC,GAEMA,UAAsB;GAG1B,IAFAC,GAAiB,GACb,CAACF,EAAY,SACb,CAACf,EAAc,OAAO;GAC1B,IAAMyD,IAAS,MAAM,KAAKzD,EAAc,MAAM,iBAA8B,MAAM9F,EAAW,CAAC;GAC9F,KAAK,IAAMwJ,KAASD,GAAQ;IAC1B,IAAME,IAAWC,GAAYF,GAAO,CAAC,GAAG;KACtC,OAAO;MAAE,MAAM;MAAY,MAAM;MAAM,KAAK;KAAK;KACjD,QAAQ;KACR,WAAW;KACX,YAAYG;KACZ,aAAaC;KACb,WAAWC;KACX,gBAAgB;KAChB,eAAe;KACf,mBAAmB;KACnB,UAAU,MAAU;MAClB,IAAMC,IAAYC,EAAM,MAClBC,IAAKnB,GAASiB,EAAU,aAAa,SAAS,CAAC;MACrD,IAAIE,MAAO,MAAM;MACjB,IAAMC,IAAc/G,EAAW,SAAS8G,CAAE,CAAC,CAAC,MACtCE,IAAeD,IAAc/G,EAAW,sBAAsB+G,CAAW,IAAI;MAMnF,AALA,EAAU,QAAQ;OAChB,WAAWD;OACX,oBAAoBE;OACpB,aAAa;MACf,GACA,SAAS,iBAAiB,eAAehB,IAAe,EAAE,SAAS,GAAK,CAAC;KAC3E;KACA,SAAS,MAAU;MAGjB,IAAMiB,IAAQJ,EAA+C;MAC7D,IAAII,GAAM;OACR,IAAI,aAAaA,KAAQ,aAAaA,GACpC,GAAsBA,EAAoB,SAAUA,EAAoB,OAAO;YAC1E,IAAI,aAAaA,GAAM;QAC5B,IAAMC,IAAMD;QACZ,AAAIC,EAAI,QAAQ,SAAS,KACvBtB,GAAqBsB,EAAI,QAAQ,EAAE,CAAE,SAASA,EAAI,QAAQ,EAAE,CAAE,OAAO;OAEzE;MACF;MAEA,OAAO;KACT;KACA,aAAa;MACX,SAAS,oBAAoB,eAAelB,EAAa;MACzD,IAAMmB,IAAQ9B,EAAU;MAExB,IADA,EAAU,QAAQ,MACd,CAAC8B,GAAO;MACZ,IAAMhB,IAAOgB,EAAM;MACnB,AAAIhB,MAAS,QACTA,EAAK,SAAS,aAClBF,GAAiBE,GAAMgB,EAAM,SAAS;KACxC;IACF,CAAC;IACD,GAAkB,MAAM,KAAKZ,CAAQ;GACvC;EACF,GAEMZ,MAAY,MAA6C;GAC7D,IAAIyB,MAAQ,QAAQA,MAAQ,IAAI,OAAO;GAIvC,IAAM,IAAIC,EAAYD,CAAG;GACzB,OAAO,OAAO,CAAC,MAAMA,IAAM,IAAIA;EACjC;EA4BA,AA1BAE,QACQ3D,EAAY,aACZ;GACJ,AAAIA,EAAY,QAAOxF,QAAeyF,EAAc,CAAC,IAChDC,GAAiB;EACxB,CACF,GAEAyD,QACQnC,GAAc,aACd;GACJ,AAAIxB,EAAY,SAAOxF,QAAeyF,EAAc,CAAC;EACvD,CACF,GAGA0D,QACQzF,EAAmB,MAAM,KAAK,MAAM5D,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,SACnD;GACJ,AAAI0F,EAAY,SAAOxF,QAAeyF,EAAc,CAAC;EACvD,CACF,GAEA2D,SAAgB;GACd,AAAI5D,EAAY,SAAOC,EAAc;EACvC,CAAC,GACD4D,SAAsB;GAEpB,AADA3D,GAAiB,GACjB,SAAS,oBAAoB,eAAemC,EAAa;EAC3D,CAAC;EAYD,IAAMyB,IAAgB1I,QAAqC;GACzD,IAAMoI,IAAQ9B,EAAU;GACxB,IAAI,CAAC8B,KAASA,EAAM,gBAAgB,QAAQ,CAACvE,EAAc,OAAO,OAAO;GACzE,IAAMuD,IAAOgB,EAAM;GAEnB,IAAIhB,EAAK,SAAS,WAAW,OAAO;GACpC,IAAMuB,IAAa9E,EAAc,MAAM,cACrC,8BAA8B,IAAI,OAAO,OAAOuD,EAAK,MAAM,CAAC,EAAE,GAChE;GACA,IAAI,CAACuB,GAAY,OAAO;GACxB,IAAMC,IAAQD,EAAW,cAA2B,oBAAoB,GAClE7B,IAAgBjD,EAAc,MAAM,sBAAsB,GAC1DkD,KAAW6B,KAASD,EAAA,CAAY,sBAAsB,GAEtDE,IAAW5K,KAAWmJ,EAAK,QAAQpJ,IACnC8K,IAAU1B,EAAK,YAAY,QAAQL,EAAQ,MAAMD,EAAc,MAAMC,EAAQ,SAASD,EAAc,KACpGiC,IAAO;IAAE,KAAKD;IAAS,MAAMD;IAAU,OAAO;GAAG,GAEnDG,IAAwC;GAC5C,IAAI5B,EAAK,gBAAgB,MAAM;IAC7B,IAAM6B,IAAepF,EAAc,MAAM,cACvC,8BAA8B,IAAI,OAAO,OAAOuD,EAAK,WAAW,CAAC,EAAE,GACrE;IACA,IAAI6B,GAAc;KAEhB,IAAMC,KADWD,EAAa,cAA2B,oBACtC,KAAYA,EAAA,CAAc,sBAAsB,GAC7DE,IAAeD,EAAU,MAAMpC,EAAc,MAAMoC,EAAU,SAAS;KAC5E,AAAIC,IAAeL,MACjB,IAAY;MACV,KAAKK;MACL,QAAQL,IAAUK;MAClB,MAAMN;KACR;IAEJ;GACF;GAEA,OAAO;IAAE;IAAM;GAAU;EAC3B,CAAC,GAKKO,WAAmB;GACvB,AAAK/D,GAAO,UACZgE,GAAgB,GACZ5K,EAAM,WAASwC,EAAW,QAAQ,GACtCtC,EAAK,OAAO,KAAA,CAAS;EACvB,GAEM2K,MAAsB,MAA8B;GACxD,AAAKxF,EAAY,UACjBuF,GAAgB,GACZ5K,EAAM,WAASwC,EAAW,SAASiB,EAAG,KAAK,KAAA,GAAWA,EAAG,eAAe,GAC5EvD,EAAK,OAAO;IAAE,SAASuD,EAAG;IAAK,iBAAiBA,EAAG;GAAgB,CAAC;EACtE,GAEMqH,MAAmB,MAA8B;GACrD,AAAKzF,EAAY,SACZ5B,EAAG,gBACRmH,GAAgB,GAChBnJ,EAAqB,MAAM,IAAIgC,EAAG,GAAG,GACrCvD,EAAK,aAAauD,CAAE,GAGhBzD,EAAM,WAASwC,EAAW,SAASiB,EAAG,KAAK,KAAA,GAAW,EAAI,GAC9DvD,EAAK,OAAO;IAAE,UAAUuD,EAAG;IAAK,iBAAiB;GAAK,CAAC;EACzD,GAEMsH,MAAe,MAA8B;GACjD,AAAK1F,EAAY,SAAS,GAAY,UAElCZ,EAAY,MAAM,IAAIhB,EAAG,GAAG,IAC9BuH,GAAavH,CAAE,KAGb8B,GAAa,SACf0F,GAAUxH,CAAE,GAEdvD,EAAK,QAAQuD,CAAE;EACjB,GAGMyH,MAAkB,MAA8B;GACpD,IAAIlL,EAAM,YAAYA,EAAM,SAAS;GACrC,IAAMkD,IAAMO,EAAG,KACT0H,IAAY1J,EAAqB,MAAM,IAAIyB,CAAG;GAGpD,AAFIiI,IAAW1J,EAAqB,MAAM,OAAOyB,CAAG,IAC/CzB,EAAqB,MAAM,IAAIyB,CAAG,GACvChD,EAAK,eAAeuD,GAAI,CAAC0H,CAAS;EACpC,GAGMC,MAAkB,MAA8B;GACpD,IAAIpL,EAAM,YAAYA,EAAM,SAAS;GACrC,IAAMkD,IAAMO,EAAG,KACT0H,IAAYxJ,EAAmB,MAAM,IAAIuB,CAAG;GAGlD,AAFIiI,IAAWxJ,EAAmB,MAAM,OAAOuB,CAAG,IAC7CvB,EAAmB,MAAM,IAAIuB,CAAG,GACrChD,EAAK,eAAeuD,GAAI,CAAC0H,CAAS;EACpC,GAEME,MAAkB,MAClBrL,EAAM,mBACNA,EAAM,YAAYA,EAAM,WACxB6G,EAAY,QAAc,KAE9B,GADIpD,EAAG,WAAWA,EAAG,YACjB,CAACzD,EAAM,YAAYA,EAAM,iBAIzBsL,MAAc,MAAuC;GACzD,AAAKD,GAAe5H,CAAE,MAClBA,EAAG,WAAWA,EAAG,WACnBuH,GAAavH,CAAE,IAGbzD,EAAM,YAAYwF,GAAkB,QAAO4F,GAAe3H,CAAE,IAC3DsH,GAAYtH,CAAE;EACrB,GAEM,EACJ,kBACA,oBACA,iBACA,eAAe8H,IACf,2BACA,6BACEC,GAA8C;GAChD,kBAAkB,MAAS,GAAM,mBAAkBxL,EAAM,gBAAgB4J,CAAG;GAC5E,WAAW,MAAQ5J,EAAM,WAAW4J,CAAG;GACvC,YAAY,MAAO;IAIjB,AAHAnF,EAAY,MAAM,OAAOhB,EAAG,GAAG,GAC/BgI,GAAiB,MAAM,OAAOhI,EAAG,GAAG,GACpC9B,EAAmB,MAAM,OAAO8B,EAAG,GAAG,GACtChC,EAAqB,MAAM,OAAOgC,EAAG,GAAG;IACxC,IAAMiI,IAAW1L,EAAM,eAAe;IActC,AAXI6G,EAAY,UACV6E,IAAU7H,EAAuB,MAAM,IAAIJ,EAAG,GAAG,IAChDK,EAAwB,MAAM,IAAIL,EAAG,GAAG,IAO3CiI,IAAUlJ,EAAW,WAAWiB,EAAG,KAAK,EAAE,cAAc,GAAK,CAAC,IAC7DjB,EAAW,WAAWiB,EAAG,KAAK;KAAE,cAAc;KAAO,UAAU;IAAM,CAAC,GAC3EvD,EAAK,WAAWuD,CAAE;GACpB;GACA,4BAA4BzD,EAAM;EACpC,CAAC,GAEK2L,KAAgB,OAAO,MAA8B;GACzD,AAAKtG,EAAY,SACjB,MAAMkG,GAAmB9H,CAAE;EAC7B,GAIMmI,KAAalK,kBAAwB,IAAI,IAAI,CAAC,GAC9CmK,KAAc,OAAO,MAA8B;GACvD,IAAI,IAAW,MAAM,IAAIpI,EAAG,GAAG,GAC/B;OAAW,MAAM,IAAIA,EAAG,GAAG;IAC3B,IAAI;KACF,AAAIzD,EAAM,cAAY,MAAMA,EAAM,WAAWyD,EAAG,GAAG;IACrD,UAAU;KACR,GAAW,MAAM,OAAOA,EAAG,GAAG;IAChC;IAEA,AADAqI,GAAWrI,CAAE,GACbvD,EAAK,cAAcuD,CAAE;GAPM;EAQ7B,GAEMsI,MAAiB,MAA8B;GACnD,GAAWtI,CAAE;EACf,GAEMuH,MAAgB,MAA8B;GAElD,AADAgB,GAAUvI,CAAE,GACZvD,EAAK,SAASuD,CAAE;EAClB,GAEMwI,MAAU,MAAsB;GACpC,AAAIzJ,EAAW,OAAO8G,CAAE,KAAGrF,EAAUqF,CAAE;EACzC,GACM4C,MAAY,MAAsB;GACtC,AAAI1J,EAAW,SAAS8G,CAAE,KAAGrF,EAAUqF,CAAE;EAC3C,GACM6C,MAAW,MAAsB;GACrC,AAAI3J,EAAW,QAAQ8G,CAAE,KAAGrF,EAAUqF,CAAE;EAC1C,GACM8C,MAAc,MAAsB;GACxC,AAAI5J,EAAW,WAAW8G,CAAE,KAAGrF,EAAUqF,CAAE;EAC7C,GACM+C,MAAY,MAA8B;GAC9C,AAAK7J,EAAW,OAAOiB,EAAG,GAAG,KAI7BQ,EAAUR,EAAG,GAAG,GAChBvD,EAAK,UAAUuD,CAAE,KAJfmF,GAAa,qCAAqC;EAKtD,GACM0D,MAAa,MAA8B;GAC/C,AAAK9J,EAAW,QAAQiB,EAAG,GAAG,MAC9BQ,EAAUR,EAAG,GAAG,GAChBvD,EAAK,WAAWuD,CAAE;EACpB,GAEMjH,MAAsB,MAAuBC,EAAuBmN,GAAK,EAAE,cAAc5J,EAAM,aAAa,CAAC,GAK7GyM,MAAqB,GAAY,MACrCvJ,MAAQ,KAAA,IAAY,OAAOV,EAAW,SAASoH,GAAK1G,GAAKuB,EAAY,MAAM,IAAIvB,CAAG,CAAC,GAsB/EwJ,qBAAe,IAAI,IAAkC,GACrDC,MAAc,MAAsC;GACxD,IAAIC,IAAUF,GAAa,IAAIxJ,CAAG;GAuDlC,OAtDK0J,MACH,IAAU;IACR,YAAY;KACV,IAAMnJ,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIsH,GAAYtH,CAAE;IACxB;IACA,YAAY;KACV,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,OAAOO,IAAKoI,GAAYpI,CAAE,IAAI,KAAA;IAChC;IACA,cAAc;KACZ,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIsI,GAActI,CAAE;IAC1B;IACA,aAAa;KACX,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIuH,GAAavH,CAAE;IACzB;IACA,QAAQ,YAAY;KAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI,MAAMkI,GAAclI,CAAE;IAChC;IACA,gBAAgB;KACd,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIoH,GAAmBpH,CAAE;IAC/B;IACA,gBAAgB;KACd,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIqH,GAAgBrH,CAAE;IAC5B;IACA,oBAAoB;KAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAIyH,GAAezH,CAAE;IAC3B;IACA,oBAAoB;KAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI2H,GAAe3H,CAAE;IAC3B;IACA,cAAcwI,GAAO/I,CAAG;IACxB,gBAAgBgJ,GAAShJ,CAAG;IAC5B,eAAeiJ,GAAQjJ,CAAG;IAC1B,kBAAkBkJ,GAAWlJ,CAAG;IAChC,cAAc;KACZ,IAAMO,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI4I,GAAS5I,CAAE;IACrB;IACA,eAAe;KACb,IAAMA,IAAKoJ,EAAO3J,CAAG;KACrB,AAAIO,KAAI6I,GAAU7I,CAAE;IACtB;IACA,SAAS,MAAgBjB,EAAW,WAAWU,GAAKnB,CAAI;GAC1D,GACA2K,GAAa,IAAIxJ,GAAK0J,CAAO,IAExBA;EACT;EACA,QACQvI,EAAmB,QACxB,MAAQ;GACP,IAAIqI,GAAa,SAAS,GAAG;GAC7B,IAAMnI,IAAW,IAAI,IAAIuI,EAAI,KAAK,MAAMrM,EAAE,GAAG,CAAC;GAC9C,KAAK,IAAMyC,KAAOwJ,GAAa,KAAK,GAClC,AAAKnI,EAAS,IAAIrB,CAAG,KAAGwJ,GAAa,OAAOxJ,CAAG;EAEnD,CACF;EAEA,IAAM6J,MAAkB,OAAwC;GAC9D,MAAM;IAAE,GAAGtJ;IAAI,iBAAiBgJ,GAAkBhJ,EAAG,KAAcA,EAAG,GAAG;GAAE;GAC3E,KAAKA,EAAG;GACR,OAAOA,EAAG;GACV,KAAKA,EAAG;GACR,OAAOA,EAAG;GACV,QAAQA,EAAG;GACX,WAAWA,EAAG;GACd,eAAeA,EAAG;GAClB,aAAaA,EAAG;GAChB,iBAAiBA,EAAG;GACpB,eAAeA,EAAG;GAClB,cAAcA,EAAG;GACjB,UAAUzD,EAAM;GAChB,UAAUA,EAAM;GAChB,UAAUyD,EAAG;GACb,kBAAkBA,EAAG;GACrB,SAASA,EAAG;GACZ,OAAOA,EAAG;GACV,SAASA,EAAG;GACZ,OAAOA,EAAG;GACV,aAAaoD,EAAY;GACzB,WAAW,CAACpD,EAAG;GACf,aAAa,CAACA,EAAG;GACjB,WAAWA,EAAG;GACd,YAAYA,EAAG;GACf,aAAaA,EAAG;GAChB,OAAOrC,GAAQ;GACf,gBAAgBsB,GAAc,UAAUe,EAAG,GAAG;GAC9C,SAASkJ,GAAWlJ,EAAG,GAAG;EAC5B,IAEMuJ,KAAmBzL,SAAgB;GACvC,UAAU0L,GAAS;GACnB,mBAAmBvG,GAAqB;GACxC,YAAYF,GAAmB;GAC/B,OAAO0G,GAAW;GAClB,SAAS;IACP,OAAOC;IACP,QAAQC;GACV;EACF,EAAE,GAEIC,KAAyB9L,SAAgB;GAC7C,MAAMX,GAAK;GACX,UAAU,CAAC0E,GAAgB;GAC3B,mBAAmBqB,GAAkB;GACrC,SAAS;IACP;IACA,iBAAiByG;GACnB;EACF,EAAE,GAEIE,KAAmB/L,QAAe,IAAI,IAAI2E,EAAe,KAAK,CAAC,GAE/D2G,KAAU,MACdxI,EAAmB,MAAM,MAAM,MAAM5D,EAAE,QAAQyC,CAAG,GAE9CqK,KAAcC,EAAe;GACjC,WAAWjM,QACT8C,EAAmB,MAAM,KAAK,OAAQ;IACpC,KAAKZ,EAAG;IACR,UAAUA,EAAG;IACb,WAAW6J,GAAiB,MAAM,IAAI7J,EAAG,GAAG;IAC5C,WAAW;IACX,YAAY;GACd,EAAE,CACJ;GACA,SAAS;GACT,eAAeoD;GACf,UAAUtF,QAAe,CAAC8D,EAAY,KAAK;GAC3C,YAAY,MAAQZ,EAAY,MAAM,IAAIvB,CAAG;GAC7C,eAAe,MAAQ;IACrB,IAAMO,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAIsH,GAAYtH,CAAE;GACxB;GACA,eAAe,MAAQ;IACrB,IAAMA,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAIuH,GAAavH,CAAE;GACzB;GACA,WAAW,MAAQwI,GAAO/I,CAAG;GAC7B,aAAa,MAAQgJ,GAAShJ,CAAG;GACjC,YAAY,MAAQiJ,GAAQjJ,CAAG;GAC/B,eAAe,MAAQkJ,GAAWlJ,CAAG;GACrC,WAAW,MAAQ;IACjB,IAAMO,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAI4I,GAAS5I,CAAE;GACrB;GACA,YAAY,MAAQ;IAClB,IAAMA,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAI6I,GAAU7I,CAAE;GACtB;GACA,mBAAmB,MAAQ;IACzB,IAAMA,IAAKoJ,EAAO3J,CAAG;IACrB,AAAIO,KAAIyH,GAAezH,CAAE;GAC3B;GACA,uBAAuB2J,EAAkB;EAC3C,CAAC,GAEKK,KAA2B/L,EAAa,EAAK,GAC7CgM,IAAuB/J,GAAkD,IAAI,GAC7EgK,KAAwBpM,QAId;GACd,IAAMqM,IAASF,EAAqB;GACpC,IAAI,CAACE,GAAQ,OAAO;GACpB,IAAMC,IAAQrL,EAAW,SAASoL,EAAO,GAAG,GACtCE,IAAWD,EAAM,QAAQ,YAAYvN,EAAW,MAAM,UACtDyN,IAAMD,EAAS,WAAW,MAAMhM,EAAM8F,EAAE,IAAI,MAAMgG,EAAO,GAAG;GAClE,OAAO;IACL,UAAUC,EAAM,SAAS/L,EAAM+L,EAAM,OAAO,IAAI,IAAI;IACpD,OAAOC,EAAS;IAChB,cAAcC;GAChB;EACF,CAAC,GACKC,KAAsBzM,QAC1BmM,EAAqB,QAAQlR,GAAmBkR,EAAqB,MAAM,GAAG,IAAI,EACpF,GACMO,MAAsB,MAAuC;GACjE,AAAKjO,EAAM,uBACX,EAAqB,QAAQyD,GAC7B,GAAyB,QAAQ;EACnC,GACMyK,MAA2B,MAAqB;GACpD,IAAMC,IAAMR,GAAsB,OAC5BC,IAASF,EAAqB;GAGpC,IAFA,EAAqB,QAAQ,MACzB,CAACS,KAAO,CAACP,KACTQ,MAAaD,EAAI,cAAc;GACnC,IAAME,IAAOD,IAAWD,EAAI,eAAeC,IAAW,IAAIA;GAC1D,AAAI5L,EAAW,OAAOoL,EAAO,KAAKO,EAAI,UAAUE,CAAI,KAClDpK,EAAU2J,EAAO,GAAG;EAExB,GAEMU,KAAyB5M,EAAa,EAAK,GAC3C6M,KAAqB5K,GAAkD,IAAI,GAC3E6K,MAAoB,MAAuC;GAC/D,AAAKxO,EAAM,qBACX,GAAmB,QAAQyD,GAC3B,GAAuB,QAAQ;EACjC,GACMgL,MAAyB,GAAgC,MAA+B;GAC5F,IAAMb,IAASW,GAAmB;GAElC,IADA,GAAmB,QAAQ,MACvB,CAACX,GAAQ;GAEb,IAAIc,IAAe;GACnB,AAIEA,IAJEC,MAAa,OACArO,EAAW,MAAM,SAAS,SAE3BkC,EAAW,SAASmM,CACnB,CAAA,CAAM,MAAM,UAAU,UAAU;GAEjD,IAAMC,IAAcC,MAAa,UAAU,IAAIH;GAC/C,AAAIlM,EAAW,OAAOoL,EAAO,KAAKe,GAAUC,CAAW,MACrD3K,EAAU2J,EAAO,GAAG,GAChBe,MAAa,QAAMlN,EAAqB,MAAM,IAAIkN,CAAQ;EAElE,GAGMG,KAAavN,SAAgB;GACjC,aAAasF,EAAY;GACzB,UAAU7G,EAAM;GAChB,aAAaqF,EAAY;GACzB,aAAac,EAAY;GACzB,kBAAkBnG,EAAM;GACxB,gBAAgBA,EAAM;GACtB,kBAAkBA,EAAM;GACxB,oBAAoBA,EAAM;GAC1B,oBAAoBA,EAAM;GAC1B,oBAAoBA,EAAM;GAC1B,kBAAkBA,EAAM;GACxB,sBAAsByF,GAAqB;GAC3C,aAAazF,EAAM;GACnB,uBAAuBsB,GAAsB;GAC7C;GACA;GACA,oBAAAiL;GACA,oBAAoB,GAAY,MAAwBE,GAAkB7C,GAAK1G,CAAG;GAClF;EACF,EAAE,GAGI6L,KAAe;GACnB;GACA;GACA;GACA;GACA;GACA;GACA;GACA,iBAAiBlE;GACjB;GACA,SAAS,MAAsBoB,GAAO3C,CAAE;GACxC,WAAW,MAAsB4C,GAAS5C,CAAE;GAC5C,UAAU,MAAsB6C,GAAQ7C,CAAE;GAC1C,aAAa,MAAsB8C,GAAW9C,CAAE;GAChD,QAAQ+C;GACR,SAASC;GACT;GACA;EACF,GAEM0C,KAAgBzN,QAAe8C,EAAmB,MAAM,QAAQ,MAAM5D,EAAE,cAAc,IAAI,CAAC,GAM3FwO,WAA8D;GAClE,IAAM5H,oBAAM,IAAI,IAA0C,GACpDnF,KAAQ,MAAmC;IAC/C,KAAK,IAAMiC,KAAKhC,GAEd,AADAkF,EAAI,IAAIvF,EAAMqC,EAAE,IAAI,GAAGA,CAAC,GACpBA,EAAE,UAAU,UAAQjC,EAAKiC,EAAE,QAAQ;GAE3C;GAEA,OADAjC,EAAK5B,EAAW,MAAM,QAAQ,GACvB+G;EACT,GACM6H,WAAwC,IAAI,IAAI,CAAC,GAAGD,GAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,MAAMzM,EAAW,UAAUyD,CAAC,CAAC,CAAC,GAO/GkJ,MAAiB,GAAgB,IAAwB,CAAC,MAAM;GACpE,IAAMC,IAAW,IAAI,IAAIH,GAAW,CAAC,CAAC,KAAK,CAAC,GACtCI,IAASH,GAAY;GAE3B,AADAI,EAAG,GACH3O,QAAe;IACb,IAAMwB,IAAQ8M,GAAW,GACnBM,IAAW,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG5J,GAAM,GAAG,CAAC,GAAGuJ,GAAY,CAAC,CAAC,CAAC,QAAQ,MAAM,CAACG,EAAO,IAAIpJ,CAAC,CAAC,CAAC,CAAC,CAAC,GAGtFuJ,IAAaD,EAAS,QAAQ,MAAM,CAACH,EAAS,IAAInJ,CAAC,KAAK9D,EAAM,IAAI8D,CAAC,CAAC,EAAE,KAAK,KAAK;IACtF,EAAW,WAAWsJ,CAAQ;IAC9B,IAAME,IAAUR,GAAW;IAC3B,KAAK,IAAMhJ,KAAKuJ,GAAY;KAC1B,IAAMvM,IAAOwM,EAAQ,IAAIxJ,CAAC;KAC1B,AAAIhD,KAAMT,EAAW,WAAWyD,GAAGhD,EAAK,MAAM,EAAI;IACpD;GACF,CAAC;EACH;EAGA,QACEjD,EAAM,uBAAuB,CAACA,EAAM,iBAChC;GAAE,OAAOA,EAAM;GAAqB,OAAOwC,EAAW,WAAW;EAAM,IACvE,CAAC,CACP;EAKA,IAAMkN,WACJC,GAAqBnN,IAAa,MAAQ;GACxC,IAAIoN,IAAWpN,EAAW,SAASU,CAAG,CAAC,CAAC;GACxC,OAAO0M,IAEL,AADAnO,EAAqB,MAAM,IAAIK,EAAM8N,EAAS,IAAI,CAAC,GACnD,IAAWpN,EAAW,SAASV,EAAM8N,EAAS,IAAI,CAAC,CAAC,CAAC;GAEvD,IAAMnM,IAAKjB,EAAW,UAAU,MAAM,MAAM,MAAM/B,EAAE,QAAQyC,CAAG;GAC/D,AAAIO,KAAIwH,GAAUxH,CAAE;EACtB,CAAC;E,OAKHoM,GAA2B;GACzB,WAAWrN,EAAW;GACtB,iBAAiBxC,EAAM;GACvB,kBAAkBA,EAAM,aAAa,KAAA;GACrC,QAAQ0P;EACV,CAAC,GAED5P,GAA6E;GAC3E,GAAG0C;GACH,aAAakN;GACb;GACA;GAEA,WAAW9M;GACX;GACA;GACA;GACA,SAAS,MAAsBnB,EAAqB,MAAM,IAAI6H,CAAE;GAChE,WAAW,MAAsB7H,EAAqB,MAAM,OAAO6H,CAAE;GACrE,eAAe,MAAsB;IACnC,AAAI7H,EAAqB,MAAM,IAAI6H,CAAE,IAAG7H,EAAqB,MAAM,OAAO6H,CAAE,IACvE7H,EAAqB,MAAM,IAAI6H,CAAE;GACxC;GACA,eAAe,MAAsB3H,EAAmB,MAAM,IAAI2H,CAAE;GACpE,iBAAiB,MAAsB3H,EAAmB,MAAM,OAAO2H,CAAE;EAC3E,CAAC,I,UAIC5M,EAAA,GAAAC,EAwVM,OAAA;GAvVA,SAAA;GAAJ,KAAIsE;GACJ,OAAKrE,GAAA,CAAC,wBAAsB,CACkB,8BAAAgE,GAAA,S;IAA0D,kCAAAX,EAAA;IAAoD,kCAAAA,EAAA;IAAiD,+BAAApD,EAAAuE,EAAA;IAAuD,sCAAA+E,EAAA;;;GAUpQrJ,EA4RM,OA5RNgC,IA4RM;IA1RI2I,GAAA,SADR/K,EAAA,GAAAC,EAwHM,OAxHNoC,IAwHM,CApHJhC,EAmHOqT,EAAA,QAAA,UAnHPpT,EAmHO,EAjHJ,OAAOiD,EAAA,MAAK,GACLoN,GAAA,KAAsB,SAgHzB,CA7GGpN,EAAA,SADRvD,EAAA,GAAAC,EAKK,MALLqC,IAKK/B,EADAgD,EAAA,KAAK,GAAA,CAAA,K,WAEVnD,EAuGM,OAvGNmC,IAuGM,CAtGYpC,EAAAgK,CAAA,IAGd9J,EA6BOqT,EAAA,QAAA,mBAAAjT,GAAAC,GA3BG4P,GAAA,KAAgB,CAAA,SA2BnB;KAzBL3P,EAKEC,IAAA;MAJC,OAAKV,GAAA,EAAA,gCAAoC8J,GAAA,MAAoB,CAAA;MAC7D,uBAAqBA,GAAA;MACrB,iBAAeF,GAAA;MACf,OAAO3J,EAAAqQ,EAAA;;;;;;;KAEV7P,EAOOE,GAAA;MANL,SAAQ;MACR,MAAK;MACJ,UAAUV,EAAAoQ,EAAA;MACV,SAAOpQ,EAAAuQ,CAAA;;MAER,SAAA5P,QAAwC,CAArCC,EAAAR,EAAAJ,EAAAkK,CAAA,CAAC,CAAA,+BAAA,CAAA,GAAA,CAAA,C;;;KAEN1J,EAUOE,GAAA;MATL,OAAM;MACN,SAAQ;MACR,MAAK;MACL,gBAAa;MACZ,SAASV,EAAAoQ,EAAA;MACT,UAAUpQ,EAAAoQ,EAAA,KAAQ,CAAKvG,GAAA;MACvB,SAAO7J,EAAAsQ,EAAA;;MAER,SAAA3P,QAAuC,CAApCC,EAAAR,EAAAJ,EAAAkK,CAAA,CAAC,CAAA,8BAAA,CAAA,GAAA,CAAA,C;;;;;;;I,iBAIVrK,EAAA,GAAAC,EAmEWe,IAAA,EAAA,KAAA,EAAA,GAAA,CAjED6J,GAAA,SAAoBH,GAAA,SAD5B1K,EAAA,GAAAiB,GAkBOJ,GAAA;;KAhBJ,cAAY+J,EAAA,QAAczK,EAAAkK,CAAA,CAAC,CAAA,6BAAA,IAAkClK,EAAAkK,CAAA,CAAC,CAAA,2BAAA;KAC/D,SAAQ;KACR,OAAM;KACN,MAAA;KACA,MAAK;KACJ,SAAOS;;KAER,SAAAhK,QAGE,CAHFH,EAGEO,IAAA;MAFC,MAAM0J,EAAA,QAAW,+BAAA;MAClB,MAAK;K,uBAEPjK,EAIEQ,IAAA;MAHA,WAAU;MACV,UAAS;MACR,MAAMyJ,EAAA,QAAczK,EAAAkK,CAAA,CAAC,CAAA,6BAAA,IAAkClK,EAAAkK,CAAA,CAAC,CAAA,2BAAA;;;I,yBAIhDQ,GAAA,SADb7K,EAAA,GAAAiB,GASOJ,GAAA;;KAPL,SAAQ;KACR,OAAM;KACN,MAAK;KACJ,gBAAc+J,EAAA,QAAW,+BAAA;KACzB,SAAOE;;KAER,SAAAhK,QAAqF,CAAlFC,EAAAR,EAAAqK,EAAA,QAAczK,EAAAkK,CAAA,CAAC,CAAA,6BAAA,IAAkClK,EAAAkK,CAAA,CAAC,CAAA,2BAAA,CAAA,GAAA,CAAA,C;;I,sCAG/CI,GAAA,QADRpK,EAoCOqT,EAAA,QAAA,kBAAAjT,GAAAC,GAjCGiQ,GAAA,KAAsB,CAAA,SAiCzB,CA9BGjG,GAAA,SADR1K,EAAA,GAAAiB,GAmBOJ,GAAA;;KAjBJ,cAAYV,EAAAkK,CAAA,CAAC,CAAA,yBAAA;KACd,SAAQ;KACR,OAAM;KACN,MAAA;KACA,MAAK;KACJ,UAAQ,CAAGzB,GAAA;KACX,SAAOzI,EAAAqU,EAAA;;KAER,SAAA1T,QAGE,CAHFH,EAGEO,IAAA;MAFA,MAAK;MACL,MAAK;K,IAEPP,EAIEQ,IAAA;MAHA,WAAU;MACV,UAAS;MACR,MAAMhB,EAAAkK,CAAA,CAAC,CAAA,yBAAA;;;;;;;I,OAGZrK,EAAA,GAAAiB,GAUOJ,GAAA;;KARL,SAAQ;KACR,OAAM;KACN,gBAAa;KACb,MAAK;KACJ,UAAQ,CAAG+H,GAAA;KACX,SAAOzI,EAAAqU,EAAA;;KAER,SAAA1T,QAAkC,CAA/BC,EAAAR,EAAAJ,EAAAkK,CAAA,CAAC,CAAA,yBAAA,CAAA,GAAA,CAAA,C;;;IASR9G,EAAA,WADRvD,EAAA,GAAAC,EASM,OATNuC,IASM,CALJ7B,EAIES,IAAA;KAHA,eAAA;KACA,OAAM;KACN,MAAK;I,QAKImC,EAAA,SADbvD,EAAA,GAAAC,EAYM,OAZNwC,IAYM,CARJ9B,EAOSU,IAAA;KANP,MAAK;KACL,SAAQ;KACR,SAAQ;KACR,QAAO;;KAEP,SAAAP,QAAW,CAARC,EAAAR,EAAAgD,EAAA,KAAK,GAAA,CAAA,C;;I,QAKCiF,GAAA,SADbxI,EAAA,GAAAC,EAiBM,OAjBNyC,IAiBM,CAbJrC,EAYOqT,EAAA,QAAA,SAAA;KAVJ,UAAUnQ,EAAA;KACV,UAAUA,EAAA;KACV,SAAO,EAAA,KAAS0K,GAAU;IAJ7B,SAYO,CANLtN,EAKEW,IAAA;KAJC,OAAOgJ,GAAA;KACP,aAAWF,GAAA;KACX,WAASF,GAAA;KACT,OAAK+D;;;;;I,WAKZjO,EAAA,GAAAC,EA+FM,OAAA;KA7FH,KAAKgL,GAAA;KACF,SAAA;KAAJ,KAAIvC;KACJ,OAAKxI,GAAA,CAAC,8BAA4B,EAAA,wCACgBiL,EAAA,UAAS,KAAA,CAAA,CAAA;I,IAE3D/K,EA8DM,OAAA;KA7DH,OAAKF,GAAA,CAAG0C,IAAW,mCAAA,CAAA;KACpB,kBAAe;I,KAEf5C,EAAA,EAAA,GAAAC,EAyDce,IAAA,MAAAO,GAxDC+Q,GAAA,QAAN,OADTtS,EAAA,GAAAiB,GAyDcO,IAAA;KAvDX,KAAK,OAAOuF,EAAG,GAAG;KACd;KACJ,cAAYY,EAAA;KACZ,cAAYwD,EAAA;KACZ,SAASiH,GAAA;KACT,WAAWC;;KAED,MAAIvR,GAAE,MAAS,CACxBT,EAGEqT,EAAA,QAAA,QAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,gBAAY9T,GAAE,MAAS,CAChCT,EAGEqT,EAAA,QAAA,gBAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,iBAAa9T,GAAE,MAAS,CACjCT,EAGEqT,EAAA,QAAA,iBAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,eAAW9T,GAAE,MAAS,CAC/BT,EAGEqT,EAAA,QAAA,eAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,eAAW9T,GAAE,MAAS,CAC/BT,EAGEqT,EAAA,QAAA,eAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,gBAAY9T,GAAE,MAAS,CAChCT,EAGEqT,EAAA,QAAA,gBAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,eAAW9T,GAAE,MAAS,CAC/BT,EAGEqT,EAAA,QAAA,eAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;KAGV,cAAU9T,GAAE,MAAS,CAC9BT,EAGEqT,EAAA,QAAA,cAHFpT,EAGE,EAAA,SAAA,GAAA,GADQsU,CAAS,CAAA,C;;;;;;;I,kBASTrH,EAAA,UAAa,O,aAA7BvN,EAAA,GAAAC,EAoBWe,IAAA,EAAA,KAAA,EAAA,GAAA,CAlBDuM,EAAA,MAAc,cAAS,O,aAD/BvN,EAAA,GAAAC,EAQE,OAAA;;KANA,OAAM;KACL,OAAKwB,GAAA;MAA2B,MAAA,GAAA8L,EAAA,MAAc,UAAU,KAAI;MAA4B,KAAA,GAAAA,EAAA,MAAc,UAAU,IAAG;MAA+B,QAAA,GAAAA,EAAA,MAAc,UAAU,OAAM;;I,cAMnLnN,EASM,OAAA;KARJ,OAAM;KACL,OAAKqB,GAAA;MAA0B,KAAA,GAAA8L,EAAA,MAAc,KAAK,IAAG;MAA6B,MAAA,GAAAA,EAAA,MAAc,KAAK,KAAI;MAA8B,OAAA,GAAAA,EAAA,MAAc,KAAK,MAAK;;I,iBAMhKnN,EAAoD,QAAA,EAA9C,OAAM,sCAAqC,GAAA,MAAA,EAAA,C;IAM/C8J,GAAA,SAAM,CAAK3G,EAAA,WAAO,CAAKA,EAAA,SAAK,CAAKiF,GAAA,QADzCnI,EAmBOqT,EAAA,QAAA,cAAA;KAhBJ,UAAUnQ,EAAA;KACV,UAAUA,EAAA;KACV,OAAK,EAAA,SAAa0K,GAAU;KAC5B,SAAO,EAAA,KAASA,GAAU;IAN7B,SAmBO,CAXL7N,EAUS,UAAA;KATP,MAAK;KACL,OAAM;KACL,SAAO6N;I,IAERtN,EAGEO,IAAA;KAFA,MAAK;KACL,MAAK;I,IAEPd,EAAmC,QAAA,MAAAG,EAA1B6J,GAAA,KAAgB,GAAA,CAAA,C;;GAK/BzJ,EAMEe,IAAA;IALS,YAAAqP,GAAA;IAAA,uBAAA,AAAA+D,EAAA,QAAA,MAAA,GAAwB,QAAAC;IAChC,OAAO9D,GAAA,OAAuB,SAAK;IACnC,iBAAeA,GAAA,OAAuB,gBAAY;IAClD,cAAYK,GAAA;IACZ,WAASE;;;;;;;GAGZ7Q,EASEgB,IAAA;IARS,YAAAiQ,GAAA;IAAA,uBAAA,AAAAkD,EAAA,QAAA,MAAA,GAAsB,QAAAC;IAC9B,MAAMnR,EAAA;IACN,cAAYiO,GAAA,OAAoB,OAAG;IACnC,aAAW1R,EAAAgF,EAAA;IACX,aAAW5B,EAAA;IACX,iBAAezD;IACf,2BAAyBK,EAAA2F,CAAA,CAAU,CAAC;IACpC,WAASiM;;;;;;;;;GAGZpR,EAUEiB,IAAA;IATS,YAAAzB,EAAA6U,EAAA;IAAA,uBAAA,AAAAF,EAAA,QAAA,MAAAjT,GAAAmT,EAAA,IAAA,GAAY,QAAAD,IAAA;IACpB,OAAOxK,GAAA;IACP,MAAMC,GAAA;IACN,iBAAerK,EAAAkK,CAAA,CAAC,CAAA,wBAAA;IAChB,gBAAclK,EAAAkK,CAAA,CAAC,CAAA,sBAAA;IACf,OAAOlK,EAAA+U,EAAA;IACP,aAAW/U,EAAAgV,EAAA;IACX,WAAShV,EAAAiV,EAAA;IACT,UAAQjV,EAAAkV,EAAA;;;;;;;;;;;;GAGXjV,EAaM,OAbNuC,IAaMpC,EAPFJ,EAAA0Q,EAAA,CAAW,CAAC,WAAW,UAAK,O,KAAsB1Q,EAAAkK,CAAA,CAAC,CAAA,uCAAA;IAA2D,GAAAlK,EAAA0Q,EAAA,CAAW,CAAC,aAAa,QAAK;IAA2B,OAAA1Q,EAAA0Q,EAAA,CAAW,CAAC,WAAW"}