@anzusystems/common-admin 2.0.0-rc.1 → 2.0.0-rc.3

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 (901) hide show
  1. package/dist/AnzuSystemsCommonAdmin.js +1 -2
  2. package/dist/_virtual/_plugin-vue_export-helper.js +1 -2
  3. package/dist/_virtual/_rolldown/runtime.js +1 -2
  4. package/dist/assets/dam-meta-icons/2k.js +1 -2
  5. package/dist/assets/dam-meta-icons/4k.js +1 -2
  6. package/dist/assets/dam-meta-icons/8k.js +1 -2
  7. package/dist/assets/dam-meta-icons/fhd.js +1 -2
  8. package/dist/assets/dam-meta-icons/low.js +1 -2
  9. package/dist/assets/dam-meta-icons/qhd.js +1 -2
  10. package/dist/assets/dam-meta-icons/rss.js +1 -2
  11. package/dist/assets/dam-meta-icons/slot.js +1 -2
  12. package/dist/assets/dam-meta-icons/tts.js +1 -2
  13. package/dist/assets/image/placeholder16x9.js +1 -2
  14. package/dist/common-admin.js +188 -187
  15. package/dist/domains/anzuUser/api/anzuUserApi.js +1 -2
  16. package/dist/domains/anzuUser/components/AAnzuUserDatatable.js +1 -2
  17. package/dist/domains/anzuUser/components/AAnzuUserDatatable.vue_vue_type_script_setup_true_lang.js +1 -2
  18. package/dist/domains/anzuUser/components/AAnzuUserFilter.js +1 -2
  19. package/dist/domains/anzuUser/components/AAnzuUserFilter.vue_vue_type_script_setup_true_lang.js +1 -2
  20. package/dist/domains/anzuUser/components/AAnzuUserForm.js +1 -2
  21. package/dist/domains/anzuUser/components/AAnzuUserForm.vue_vue_type_script_setup_true_lang.js +1 -2
  22. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.js +1 -2
  23. package/dist/domains/anzuUser/components/AAnzuUserRoleAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  24. package/dist/domains/anzuUser/components/AUserBulkActionDialog.js +1 -2
  25. package/dist/domains/anzuUser/components/AUserBulkActionDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  26. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.js +1 -2
  27. package/dist/domains/anzuUser/components/AUserCopyPermissionsDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  28. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.js +1 -2
  29. package/dist/domains/anzuUser/components/AUserCreateInSystemButton.vue_vue_type_script_setup_true_lang.js +1 -2
  30. package/dist/domains/anzuUser/components/AUserEnabledSwitch.js +1 -2
  31. package/dist/domains/anzuUser/components/AUserEnabledSwitch.vue_vue_type_script_setup_true_lang.js +1 -2
  32. package/dist/domains/anzuUser/components/AUserManageButton.js +1 -2
  33. package/dist/domains/anzuUser/components/AUserManageButton.vue_vue_type_script_setup_true_lang.js +1 -2
  34. package/dist/domains/anzuUser/components/AUserMetadataForm.js +1 -2
  35. package/dist/domains/anzuUser/components/AUserMetadataForm.vue_vue_type_script_setup_true_lang.js +1 -2
  36. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.js +1 -2
  37. package/dist/domains/anzuUser/components/AUserMetadataRepairDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  38. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.js +1 -2
  39. package/dist/domains/anzuUser/components/AUserOtherSystemsTable.vue_vue_type_script_setup_true_lang.js +1 -2
  40. package/dist/domains/anzuUser/components/AUserSystemOverview.js +1 -2
  41. package/dist/domains/anzuUser/components/AUserSystemOverview.vue_vue_type_script_setup_true_lang.js +1 -2
  42. package/dist/domains/anzuUser/components/AUserSystemPanel.js +1 -2
  43. package/dist/domains/anzuUser/components/AUserSystemPanel.vue_vue_type_script_setup_true_lang.js +1 -2
  44. package/dist/domains/anzuUser/components/AUserSystemStatusChip.js +1 -2
  45. package/dist/domains/anzuUser/components/AUserSystemStatusChip.vue_vue_type_script_setup_true_lang.js +1 -2
  46. package/dist/domains/anzuUser/components/AUserTabsShell.js +1 -2
  47. package/dist/domains/anzuUser/components/AUserTabsShell.vue_vue_type_script_setup_true_lang.js +1 -2
  48. package/dist/domains/anzuUser/composables/anzuUserActions.js +1 -2
  49. package/dist/domains/anzuUser/composables/anzuUserValidations.js +1 -2
  50. package/dist/domains/anzuUser/composables/cachedAnzuUsers.js +1 -2
  51. package/dist/domains/anzuUser/composables/userCrossSystemSearch.js +1 -2
  52. package/dist/domains/anzuUser/composables/userCrossSystemWrites.js +1 -2
  53. package/dist/domains/anzuUser/composables/userSystemDescriptor.js +1 -2
  54. package/dist/domains/anzuUser/composables/userSystemProbe.js +1 -2
  55. package/dist/domains/anzuUser/factory/AnzuUserFactory.js +1 -2
  56. package/dist/domains/anzuUser/filter/anzuUserFilter.js +1 -2
  57. package/dist/domains/anzuUser/store/anzuUserStore.js +1 -2
  58. package/dist/domains/anzuUser/store/userCrossSystemStore.js +1 -2
  59. package/dist/domains/anzuUser/utils/userMetadataDiff.js +1 -2
  60. package/dist/domains/anzuUser/utils/userSystemState.js +1 -2
  61. package/dist/domains/anzuUser/utils/userTabs.js +1 -2
  62. package/dist/domains/api/composables/defineApiClient.js +1 -2
  63. package/dist/domains/api/composables/pagination.js +1 -2
  64. package/dist/domains/api/composables/request.js +1 -2
  65. package/dist/domains/api/composables/useApiFetchByIds.js +0 -1
  66. package/dist/domains/api/composables/useApiFetchItems.js +1 -2
  67. package/dist/domains/api/composables/useApiFetchList.js +1 -2
  68. package/dist/domains/api/composables/useApiFetchListBatch.js +1 -2
  69. package/dist/domains/api/composables/useApiQueryBuilder.js +1 -2
  70. package/dist/domains/api/composables/useApiRequest.js +1 -2
  71. package/dist/domains/api/types/SortOrder.js +1 -2
  72. package/dist/domains/api/utils/apiErrors.js +1 -2
  73. package/dist/domains/api/utils/apiHelper.js +1 -2
  74. package/dist/domains/api/utils/listBody.js +1 -2
  75. package/dist/domains/api/utils/response.js +1 -2
  76. package/dist/domains/auth/components/Acl.js +1 -2
  77. package/dist/domains/auth/components/Acl.vue_vue_type_script_setup_true_lang.js +1 -2
  78. package/dist/domains/auth/composables/aclAllowed.js +1 -2
  79. package/dist/domains/auth/composables/defineAuth.js +1 -2
  80. package/dist/domains/auth/composables/refreshSession.js +1 -2
  81. package/dist/domains/auth/store/authStore.js +1 -2
  82. package/dist/domains/auth/valueObject/Grant.js +1 -2
  83. package/dist/domains/cached/components/ACachedChip.js +1 -2
  84. package/dist/domains/cached/components/ACachedChip.vue_vue_type_script_setup_true_lang.js +1 -2
  85. package/dist/domains/cached/components/ACachedUserChip.js +1 -2
  86. package/dist/domains/cached/components/ACachedUserChip.vue_vue_type_script_setup_true_lang.js +1 -2
  87. package/dist/domains/cached/composables/createCachedChip.js +1 -2
  88. package/dist/domains/cached/composables/createUserAndTimeTrackingFields.js +1 -2
  89. package/dist/domains/cached/composables/defineCached.js +1 -2
  90. package/dist/domains/cached/composables/useCachedItem.js +1 -2
  91. package/dist/domains/collab/components/ACollabCountdown.js +1 -2
  92. package/dist/domains/collab/components/ACollabCountdown.vue_vue_type_script_setup_true_lang.js +1 -2
  93. package/dist/domains/collab/components/ACollabLockedByUser.js +1 -2
  94. package/dist/domains/collab/components/ACollabLockedByUser.vue_vue_type_script_setup_true_lang.js +1 -2
  95. package/dist/domains/collab/components/ACollabManagement.js +1 -2
  96. package/dist/domains/collab/components/ACollabManagement.vue_vue_type_script_setup_true_lang.js +1 -2
  97. package/dist/domains/collab/composables/collabAnyDataChange.js +1 -2
  98. package/dist/domains/collab/composables/collabCurrentUserId.js +1 -2
  99. package/dist/domains/collab/composables/collabEventBus.js +1 -2
  100. package/dist/domains/collab/composables/collabField.js +1 -2
  101. package/dist/domains/collab/composables/collabHelpers.js +1 -2
  102. package/dist/domains/collab/composables/collabInit.js +2 -3
  103. package/dist/domains/collab/composables/collabInit.js.map +1 -1
  104. package/dist/domains/collab/composables/collabRoom.js +1 -2
  105. package/dist/domains/collab/composables/collabState.js +1 -2
  106. package/dist/domains/collab/composables/commonAdminCollabOptions.js +1 -2
  107. package/dist/domains/collab/types/Collab.js +1 -2
  108. package/dist/domains/customDataForm/components/ACustomDataForm.js +1 -2
  109. package/dist/domains/customDataForm/components/ACustomDataForm.vue_vue_type_script_setup_true_lang.js +1 -2
  110. package/dist/domains/customDataForm/components/ACustomDataFormElement.js +1 -2
  111. package/dist/domains/customDataForm/components/ACustomDataFormElement.vue_vue_type_script_setup_true_lang.js +1 -2
  112. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.js +1 -2
  113. package/dist/domains/customDataForm/components/ACustomDataFormHiddenPart.vue_vue_type_script_setup_true_lang.js +1 -2
  114. package/dist/domains/customDataForm/composables/useCustomDataForm.js +1 -2
  115. package/dist/domains/customDataForm/types/CustomDataFormElementTypes.js +1 -2
  116. package/dist/domains/dam/api/damAssetApi.js +1 -2
  117. package/dist/domains/dam/api/damAssetLicenceApi.js +1 -2
  118. package/dist/domains/dam/api/damConstants.js +1 -2
  119. package/dist/domains/dam/api/damEndPoints.js +1 -2
  120. package/dist/domains/dam/api/damImageApi.js +1 -2
  121. package/dist/domains/dam/api/damImageRoiApi.js +1 -2
  122. package/dist/domains/dam/api/damfetchAssetListByFileIdsMultipleLicences.js +1 -2
  123. package/dist/domains/dam/api/uploadApi.js +1 -2
  124. package/dist/domains/dam/assetDetail/components/AColorBox.js +1 -2
  125. package/dist/domains/dam/assetDetail/components/AColorBox.vue_vue_type_script_setup_true_lang.js +1 -2
  126. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.js +1 -2
  127. package/dist/domains/dam/assetDetail/components/AssetCustomMetadataForm.vue_vue_type_script_setup_true_lang.js +1 -2
  128. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.js +1 -2
  129. package/dist/domains/dam/assetDetail/components/AssetDetailDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  130. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.js +1 -2
  131. package/dist/domains/dam/assetDetail/components/AssetDetailDialogFrame.vue_vue_type_script_setup_true_lang.js +1 -2
  132. package/dist/domains/dam/assetDetail/components/AssetDetailDialogLoader.js +1 -2
  133. package/dist/domains/dam/assetDetail/components/AssetDetailDialogLoader.vue_vue_type_script_setup_true_lang.js +1 -2
  134. package/dist/domains/dam/assetDetail/components/AssetDetailDialogSidebar.js +1 -2
  135. package/dist/domains/dam/assetDetail/components/AssetDetailDialogSidebar.vue_vue_type_script_setup_true_lang.js +1 -2
  136. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsTeleportTarget.js +1 -2
  137. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsTeleportTarget.vue_vue_type_script_setup_true_lang.js +1 -2
  138. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.js +1 -2
  139. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarActionsWrapper.vue_vue_type_script_setup_true_lang.js +1 -2
  140. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.js +1 -2
  141. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarFrame.vue_vue_type_script_setup_true_lang.js +1 -2
  142. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.js +1 -2
  143. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarMetadata.vue_vue_type_script_setup_true_lang.js +1 -2
  144. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.js +1 -2
  145. package/dist/domains/dam/assetDetail/components/AssetDetailSidebarROI.vue_vue_type_script_setup_true_lang.js +1 -2
  146. package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.js +1 -2
  147. package/dist/domains/dam/assetDetail/components/AssetFileFailReasonChip.vue_vue_type_script_setup_true_lang.js +1 -2
  148. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.js +1 -2
  149. package/dist/domains/dam/assetDetail/components/AssetFileInfoPanel.vue_vue_type_script_setup_true_lang.js +1 -2
  150. package/dist/domains/dam/assetDetail/components/AssetFileRotate.js +1 -2
  151. package/dist/domains/dam/assetDetail/components/AssetFileRotate.vue_vue_type_script_setup_true_lang.js +1 -2
  152. package/dist/domains/dam/assetDetail/components/AssetImage.js +1 -2
  153. package/dist/domains/dam/assetDetail/components/AssetImage.vue_vue_type_script_setup_true_lang.js +1 -2
  154. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.js +1 -2
  155. package/dist/domains/dam/assetDetail/components/AssetImageMetaIcons.vue_vue_type_script_setup_true_lang.js +1 -2
  156. package/dist/domains/dam/assetDetail/components/AssetInfobox.js +1 -2
  157. package/dist/domains/dam/assetDetail/components/AssetInfobox.vue_vue_type_script_setup_true_lang.js +1 -2
  158. package/dist/domains/dam/assetDetail/components/AssetMetadata.js +1 -2
  159. package/dist/domains/dam/assetDetail/components/AssetMetadata.vue_vue_type_script_setup_true_lang.js +1 -2
  160. package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.js +1 -2
  161. package/dist/domains/dam/assetDetail/components/AssetMetadataImageAttributes.vue_vue_type_script_setup_true_lang.js +1 -2
  162. package/dist/domains/dam/assetDetail/composables/assetDetailExtSystem.js +1 -2
  163. package/dist/domains/dam/assetDetail/composables/assetDetailSidebarActionbar.js +1 -2
  164. package/dist/domains/dam/assetDetail/composables/assetDetailView.js +1 -2
  165. package/dist/domains/dam/assetDetail/composables/assetFileFailReason.js +1 -2
  166. package/dist/domains/dam/assetDetail/store/assetDetailStore.js +1 -2
  167. package/dist/domains/dam/assetDetail/utils/assetImageIconsConfig.js +1 -2
  168. package/dist/domains/dam/assetDetail/utils/assetMetadataMayStillChange.js +1 -2
  169. package/dist/domains/dam/assetSelect/api/damPodcastApi.js +1 -2
  170. package/dist/domains/dam/assetSelect/components/AAssetListInner.js +1 -2
  171. package/dist/domains/dam/assetSelect/components/AAssetListInner.vue_vue_type_script_setup_true_lang.js +1 -2
  172. package/dist/domains/dam/assetSelect/components/AAssetSelect.js +1 -2
  173. package/dist/domains/dam/assetSelect/components/AAssetSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  174. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.js +1 -2
  175. package/dist/domains/dam/assetSelect/components/AAssetSelectMedia.vue_vue_type_script_setup_true_lang.js +1 -2
  176. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.js +1 -2
  177. package/dist/domains/dam/assetSelect/components/AssetDistributionServiceNameFilter.vue_vue_type_script_setup_true_lang.js +1 -2
  178. package/dist/domains/dam/assetSelect/components/AssetImagePreview.js +1 -2
  179. package/dist/domains/dam/assetSelect/components/AssetImagePreview.vue_vue_type_script_setup_true_lang.js +1 -2
  180. package/dist/domains/dam/assetSelect/components/AssetSelectFilter.js +1 -2
  181. package/dist/domains/dam/assetSelect/components/AssetSelectFilter.vue_vue_type_script_setup_true_lang.js +1 -2
  182. package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.js +1 -2
  183. package/dist/domains/dam/assetSelect/components/AssetSelectFilterForm.vue_vue_type_script_setup_true_lang.js +1 -2
  184. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.js +1 -2
  185. package/dist/domains/dam/assetSelect/components/AssetSelectListBar.vue_vue_type_script_setup_true_lang.js +1 -2
  186. package/dist/domains/dam/assetSelect/components/AssetSelectListTable.js +1 -2
  187. package/dist/domains/dam/assetSelect/components/AssetSelectListTable.vue_vue_type_script_setup_true_lang.js +1 -2
  188. package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.js +1 -2
  189. package/dist/domains/dam/assetSelect/components/AssetSelectListTiles.vue_vue_type_script_setup_true_lang.js +1 -2
  190. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.js +1 -2
  191. package/dist/domains/dam/assetSelect/components/AssetSelectTableRowItem.vue_vue_type_script_setup_true_lang.js +1 -2
  192. package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.js +1 -2
  193. package/dist/domains/dam/assetSelect/components/AssetSelectTilesItem.vue_vue_type_script_setup_true_lang.js +1 -2
  194. package/dist/domains/dam/assetSelect/components/FilterPodcastRemoteAutocomplete.js +1 -2
  195. package/dist/domains/dam/assetSelect/components/FilterPodcastRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  196. package/dist/domains/dam/assetSelect/composables/assetSelectFilterSidebar.js +1 -2
  197. package/dist/domains/dam/assetSelect/composables/assetSelectGridView.js +1 -2
  198. package/dist/domains/dam/assetSelect/composables/assetSelectItemActions.js +1 -2
  199. package/dist/domains/dam/assetSelect/composables/assetSelectListActions.js +1 -2
  200. package/dist/domains/dam/assetSelect/composables/podcastFilterAndActions.js +1 -2
  201. package/dist/domains/dam/assetSelect/filter/AssetFilter.js +1 -2
  202. package/dist/domains/dam/assetSelect/store/assetSelectStore.js +1 -2
  203. package/dist/domains/dam/author/api/authorApi.js +1 -2
  204. package/dist/domains/dam/author/components/AuthorCreateButton.js +1 -2
  205. package/dist/domains/dam/author/components/AuthorCreateButton.vue_vue_type_script_setup_true_lang.js +1 -2
  206. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.js +1 -2
  207. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChip.vue_vue_type_script_setup_true_lang.js +1 -2
  208. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.js +1 -2
  209. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteCachedAuthorChipConflicts.vue_vue_type_script_setup_true_lang.js +1 -2
  210. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.js +1 -2
  211. package/dist/domains/dam/author/components/AuthorRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js +1 -2
  212. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.js +1 -2
  213. package/dist/domains/dam/author/components/DamAuthorFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  214. package/dist/domains/dam/author/composables/authorActions.js +1 -2
  215. package/dist/domains/dam/author/composables/authorValidation.js +1 -2
  216. package/dist/domains/dam/author/composables/cachedAuthors.js +1 -2
  217. package/dist/domains/dam/author/composables/cachedUsers.js +1 -2
  218. package/dist/domains/dam/author/composables/damAuthorConfig.js +1 -2
  219. package/dist/domains/dam/author/factory/AuthorFactory.js +1 -2
  220. package/dist/domains/dam/author/filter/AuthorFilter.js +1 -2
  221. package/dist/domains/dam/author/types/DamAuthorType.js +1 -2
  222. package/dist/domains/dam/components/DamAdminAssetLink.js +1 -2
  223. package/dist/domains/dam/components/DamAdminAssetLink.vue_vue_type_script_setup_true_lang.js +1 -2
  224. package/dist/domains/dam/composables/commonAdminCoreDamOptions.js +1 -2
  225. package/dist/domains/dam/composables/damConfigName.js +1 -2
  226. package/dist/domains/dam/composables/damNotifications.js +1 -2
  227. package/dist/domains/dam/composables/damNotificationsConnection.js +1 -2
  228. package/dist/domains/dam/composables/damNotificationsEventBus.js +1 -2
  229. package/dist/domains/dam/composables/extSystemIdForCached.js +1 -2
  230. package/dist/domains/dam/composables/uploadValidations.js +1 -2
  231. package/dist/domains/dam/config/api/damAssetCustomFormApi.js +1 -2
  232. package/dist/domains/dam/config/api/damConfigApi.js +1 -2
  233. package/dist/domains/dam/config/composables/acceptTypeAndSizeHelper.js +1 -2
  234. package/dist/domains/dam/config/composables/damConfigState.js +1 -2
  235. package/dist/domains/dam/config/store/damConfigStore.js +1 -2
  236. package/dist/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.js +1 -2
  237. package/dist/domains/dam/cropper/components/ACropper.js +1 -2
  238. package/dist/domains/dam/cropper/components/ACropper.js.map +1 -1
  239. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js +2 -3
  240. package/dist/domains/dam/cropper/components/ACropper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  241. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.js +1 -2
  242. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  243. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.js +1 -2
  244. package/dist/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.vue_vue_type_script_setup_true_lang.js +1 -2
  245. package/dist/domains/dam/cropper/store/imageRoiStore.js +1 -2
  246. package/dist/domains/dam/cropper/utils/cropperGeometry.js +2 -3
  247. package/dist/domains/dam/cropper/utils/cropperGeometry.js.map +1 -1
  248. package/dist/domains/dam/cropper/utils/cropperJsService.js +1 -2
  249. package/dist/domains/dam/cropper/utils/damAssetImageRoiSelectLoader.js +1 -2
  250. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.js +1 -2
  251. package/dist/domains/dam/imageWidget/components/AImageMediaWidget.vue_vue_type_script_setup_true_lang.js +1 -2
  252. package/dist/domains/dam/imageWidget/components/AImagePublicInput.js +1 -2
  253. package/dist/domains/dam/imageWidget/components/AImagePublicInput.vue_vue_type_script_setup_true_lang.js +1 -2
  254. package/dist/domains/dam/imageWidget/components/AImageWidget.js +1 -2
  255. package/dist/domains/dam/imageWidget/components/AImageWidget.vue_vue_type_script_setup_true_lang.js +1 -2
  256. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.js +1 -2
  257. package/dist/domains/dam/imageWidget/components/AImageWidgetMultiple.vue_vue_type_script_setup_true_lang.js +1 -2
  258. package/dist/domains/dam/imageWidget/components/AImageWidgetMultipleSimple.js +1 -2
  259. package/dist/domains/dam/imageWidget/components/AImageWidgetMultipleSimple.vue_vue_type_script_setup_true_lang.js +1 -2
  260. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.js +1 -2
  261. package/dist/domains/dam/imageWidget/components/AImageWidgetSimple.vue_vue_type_script_setup_true_lang.js +1 -2
  262. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.js +1 -2
  263. package/dist/domains/dam/imageWidget/components/AMediaWidgetSimple.vue_vue_type_script_setup_true_lang.js +1 -2
  264. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.js +1 -2
  265. package/dist/domains/dam/imageWidget/components/ImageDetailDialogMetadata.vue_vue_type_script_setup_true_lang.js +1 -2
  266. package/dist/domains/dam/imageWidget/components/ImageMassOperations.js +1 -2
  267. package/dist/domains/dam/imageWidget/components/ImageMassOperations.vue_vue_type_script_setup_true_lang.js +1 -2
  268. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.js +1 -2
  269. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js +2 -3
  270. package/dist/domains/dam/imageWidget/components/ImageMediaWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  271. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.js +1 -2
  272. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js +2 -3
  273. package/dist/domains/dam/imageWidget/components/ImageWidgetInner.vue_vue_type_script_setup_true_lang.js.map +1 -1
  274. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.js +1 -2
  275. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleInner.vue_vue_type_script_setup_true_lang.js +1 -2
  276. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.js +1 -2
  277. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleItem.vue_vue_type_script_setup_true_lang.js +1 -2
  278. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.js +1 -2
  279. package/dist/domains/dam/imageWidget/components/ImageWidgetMultipleLimitDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  280. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.js +1 -2
  281. package/dist/domains/dam/imageWidget/components/MediaWidgetSimpleDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  282. package/dist/domains/dam/imageWidget/composables/commonAdminImageOptions.js +1 -2
  283. package/dist/domains/dam/imageWidget/composables/imageActions.js +1 -2
  284. package/dist/domains/dam/imageWidget/composables/imageApiCms.js +1 -2
  285. package/dist/domains/dam/imageWidget/composables/imageDialogDamAuthors.js +1 -2
  286. package/dist/domains/dam/imageWidget/composables/useImageMassOperations.js +1 -2
  287. package/dist/domains/dam/imageWidget/store/imageMediaWidgetStore.js +1 -2
  288. package/dist/domains/dam/imageWidget/store/imageStore.js +1 -2
  289. package/dist/domains/dam/imageWidget/utils/damImage.js +1 -2
  290. package/dist/domains/dam/imageWidget/utils/fieldLockTurns.js +1 -2
  291. package/dist/domains/dam/imageWidget/utils/imageSaves.js +1 -2
  292. package/dist/domains/dam/imageWidget/utils/imageWidgetInkectionKeys.js +1 -2
  293. package/dist/domains/dam/imageWidget/utils/metadataToImageMap.js +1 -2
  294. package/dist/domains/dam/imageWidget/utils/waitLimit.js +1 -2
  295. package/dist/domains/dam/keyword/api/keywordApi.js +1 -2
  296. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.js +1 -2
  297. package/dist/domains/dam/keyword/components/DamKeywordFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  298. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.js +1 -2
  299. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteCachedKeywordChip.vue_vue_type_script_setup_true_lang.js +1 -2
  300. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.js +1 -2
  301. package/dist/domains/dam/keyword/components/KeywordRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js +1 -2
  302. package/dist/domains/dam/keyword/composables/cachedKeywords.js +1 -2
  303. package/dist/domains/dam/keyword/composables/damKeywordConfig.js +1 -2
  304. package/dist/domains/dam/keyword/composables/keywordActions.js +1 -2
  305. package/dist/domains/dam/keyword/factory/KeywordFactory.js +3 -4
  306. package/dist/domains/dam/keyword/factory/KeywordFactory.js.map +1 -1
  307. package/dist/domains/dam/keyword/filter/KeywordFilter.js +1 -2
  308. package/dist/domains/dam/types/Asset.js +1 -2
  309. package/dist/domains/dam/types/AssetFile.js +1 -2
  310. package/dist/domains/dam/types/AssetSelect.js +1 -2
  311. package/dist/domains/dam/types/DamConfig.js +1 -2
  312. package/dist/domains/dam/types/MediaAware.js +1 -2
  313. package/dist/domains/dam/types/UploadQueue.js +1 -2
  314. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.js +1 -2
  315. package/dist/domains/dam/uploadQueue/components/AssetCustomMetadataFormMassOperations.vue_vue_type_script_setup_true_lang.js +1 -2
  316. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.js +1 -2
  317. package/dist/domains/dam/uploadQueue/components/AssetQueueSelectedSidebar.vue_vue_type_script_setup_true_lang.js +1 -2
  318. package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.js +1 -2
  319. package/dist/domains/dam/uploadQueue/components/UploadQueueButtonStop.vue_vue_type_script_setup_true_lang.js +1 -2
  320. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.js +1 -2
  321. package/dist/domains/dam/uploadQueue/components/UploadQueueDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  322. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.js +1 -2
  323. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingle.vue_vue_type_script_setup_true_lang.js +1 -2
  324. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.js +1 -2
  325. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebar.vue_vue_type_script_setup_true_lang.js +1 -2
  326. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.js +1 -2
  327. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadata.vue_vue_type_script_setup_true_lang.js +1 -2
  328. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.js +1 -2
  329. package/dist/domains/dam/uploadQueue/components/UploadQueueDialogSingleSidebarMetadataContent.vue_vue_type_script_setup_true_lang.js +1 -2
  330. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.js +1 -2
  331. package/dist/domains/dam/uploadQueue/components/UploadQueueEditable.vue_vue_type_script_setup_true_lang.js +1 -2
  332. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.js +1 -2
  333. package/dist/domains/dam/uploadQueue/components/UploadQueueItemEditable.vue_vue_type_script_setup_true_lang.js +1 -2
  334. package/dist/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.js +1 -2
  335. package/dist/domains/dam/uploadQueue/components/UploadQueueItemErrorOverlay.vue_vue_type_script_setup_true_lang.js +1 -2
  336. package/dist/domains/dam/uploadQueue/components/uploadQueueBindings.js +1 -2
  337. package/dist/domains/dam/uploadQueue/composables/assetSuggestions.js +1 -2
  338. package/dist/domains/dam/uploadQueue/composables/damUploadChunkSize.js +1 -2
  339. package/dist/domains/dam/uploadQueue/composables/uploadMeter.js +1 -2
  340. package/dist/domains/dam/uploadQueue/composables/uploadQueueItemRefresh.js +1 -2
  341. package/dist/domains/dam/uploadQueue/composables/uploadQueueMassOperations.js +1 -2
  342. package/dist/domains/dam/uploadQueue/composables/uploadService.js +1 -2
  343. package/dist/domains/dam/uploadQueue/composables/useUploadQueueDialog.js +1 -2
  344. package/dist/domains/dam/uploadQueue/core/uploadQueueCore.js +1 -2
  345. package/dist/domains/dam/uploadQueue/core/uploadQueueCoreTypes.js +1 -2
  346. package/dist/domains/dam/uploadQueue/core/uploadQueueFill.js +1 -2
  347. package/dist/domains/dam/uploadQueue/factory/UploadQueueItemFactory.js +1 -2
  348. package/dist/domains/dam/uploadQueue/presets/queuePresets.js +1 -2
  349. package/dist/domains/dam/uploadQueue/presets/uploadPresets.js +1 -2
  350. package/dist/domains/dam/uploadQueue/settlement/uploadPollSchedule.js +1 -2
  351. package/dist/domains/dam/uploadQueue/settlement/uploadPoller.js +1 -2
  352. package/dist/domains/dam/uploadQueue/settlement/uploadSettle.js +1 -2
  353. package/dist/domains/dam/uploadQueue/settlement/uploadSettlement.js +1 -2
  354. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementRuntime.js +1 -2
  355. package/dist/domains/dam/uploadQueue/settlement/uploadSettlementTypes.js +1 -2
  356. package/dist/domains/dam/uploadQueue/store/uploadQueuesStore.js +1 -2
  357. package/dist/domains/dam/uploadQueue/utils/mimeTypeHelper.js +1 -2
  358. package/dist/domains/dam/user/api/assetLicenceApi.js +1 -2
  359. package/dist/domains/dam/user/api/assetLicenceGroupApi.js +1 -2
  360. package/dist/domains/dam/user/api/extSystemApi.js +1 -2
  361. package/dist/domains/dam/user/api/userApi.js +1 -2
  362. package/dist/domains/dam/user/components/DamAssetLicenceGroupRemoteAutocomplete.js +1 -2
  363. package/dist/domains/dam/user/components/DamAssetLicenceGroupRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  364. package/dist/domains/dam/user/components/DamAssetLicenceRemoteAutocomplete.js +1 -2
  365. package/dist/domains/dam/user/components/DamAssetLicenceRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  366. package/dist/domains/dam/user/components/DamDistributionServiceSelect.js +1 -2
  367. package/dist/domains/dam/user/components/DamDistributionServiceSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  368. package/dist/domains/dam/user/components/DamExtSystemRemoteAutocomplete.js +1 -2
  369. package/dist/domains/dam/user/components/DamExtSystemRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  370. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.js +1 -2
  371. package/dist/domains/dam/user/components/DamExternalProviderAssetSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  372. package/dist/domains/dam/user/components/DamUserFilterRemoteAutocomplete.js +1 -2
  373. package/dist/domains/dam/user/components/DamUserFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  374. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.js +1 -2
  375. package/dist/domains/dam/user/components/DamUserRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  376. package/dist/domains/dam/user/composables/assetLicenceActions.js +1 -2
  377. package/dist/domains/dam/user/composables/assetLicenceGroupActions.js +1 -2
  378. package/dist/domains/dam/user/composables/damUserSelectActions.js +1 -2
  379. package/dist/domains/dam/user/composables/extSystemActions.js +1 -2
  380. package/dist/domains/dam/user/filter/AssetLicenceFilter.js +1 -2
  381. package/dist/domains/dam/user/filter/AssetLicenceGroupFilter.js +1 -2
  382. package/dist/domains/dam/user/filter/DamUserFilter.js +1 -2
  383. package/dist/domains/dam/user/filter/ExtSystemFilter.js +1 -2
  384. package/dist/domains/dam/user/types/DamDistributionServiceType.js +1 -2
  385. package/dist/domains/dam/user/types/DamExternalProviderAssetType.js +1 -2
  386. package/dist/domains/filters/bookmarks/api/userAdminConfigApi.d.ts +1 -3
  387. package/dist/domains/filters/bookmarks/api/userAdminConfigApi.js +4 -5
  388. package/dist/domains/filters/bookmarks/api/userAdminConfigApi.js.map +1 -1
  389. package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.js +1 -2
  390. package/dist/domains/filters/bookmarks/components/AFilterBookmarkButton.vue_vue_type_script_setup_true_lang.js +1 -2
  391. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.js +1 -2
  392. package/dist/domains/filters/bookmarks/components/FilterBookmarkDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  393. package/dist/domains/filters/bookmarks/components/FilterBookmarks.js +1 -2
  394. package/dist/domains/filters/bookmarks/components/FilterBookmarks.vue_vue_type_script_setup_true_lang.js +1 -2
  395. package/dist/domains/filters/bookmarks/factory/UserAdminConfigFactory.js +1 -2
  396. package/dist/domains/filters/bookmarks/filter/UserAdminConfigFilter.js +1 -2
  397. package/dist/domains/filters/bookmarks/store/bookmarksStore.js +1 -2
  398. package/dist/domains/filters/bookmarks/types/UserAdminConfig.js +1 -2
  399. package/dist/domains/filters/components/AFilterAdvancedButton.js +1 -2
  400. package/dist/domains/filters/components/AFilterAdvancedButton.vue_vue_type_script_setup_true_lang.js +1 -2
  401. package/dist/domains/filters/components/AFilterBooleanSelect.js +1 -2
  402. package/dist/domains/filters/components/AFilterBooleanSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  403. package/dist/domains/filters/components/AFilterDatetimePicker.js +1 -2
  404. package/dist/domains/filters/components/AFilterDatetimePicker.vue_vue_type_script_setup_true_lang.js +1 -2
  405. package/dist/domains/filters/components/AFilterEmpty.js +1 -2
  406. package/dist/domains/filters/components/AFilterEmpty.vue_vue_type_script_setup_true_lang.js +1 -2
  407. package/dist/domains/filters/components/AFilterInteger.js +1 -2
  408. package/dist/domains/filters/components/AFilterInteger.vue_vue_type_script_setup_true_lang.js +1 -2
  409. package/dist/domains/filters/components/AFilterResetButton.js +1 -2
  410. package/dist/domains/filters/components/AFilterResetButton.vue_vue_type_script_setup_true_lang.js +1 -2
  411. package/dist/domains/filters/components/AFilterString.js +1 -2
  412. package/dist/domains/filters/components/AFilterString.vue_vue_type_script_setup_true_lang.js +1 -2
  413. package/dist/domains/filters/components/AFilterSubmitButton.js +1 -2
  414. package/dist/domains/filters/components/AFilterSubmitButton.vue_vue_type_script_setup_true_lang.js +1 -2
  415. package/dist/domains/filters/components/AFilterTimeInterval.js +1 -2
  416. package/dist/domains/filters/components/AFilterTimeInterval.vue_vue_type_script_setup_true_lang.js +1 -2
  417. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.js +1 -2
  418. package/dist/domains/filters/components/AFilterValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  419. package/dist/domains/filters/components/AFilterWrapper.js +1 -2
  420. package/dist/domains/filters/components/AFilterWrapper.vue_vue_type_script_setup_true_lang.js +1 -2
  421. package/dist/domains/filters/components/AFilterWrapperSidebar.js +1 -2
  422. package/dist/domains/filters/components/AFilterWrapperSidebar.vue_vue_type_script_setup_true_lang.js +1 -2
  423. package/dist/domains/filters/components/FilterDetailItem.js +1 -2
  424. package/dist/domains/filters/components/FilterDetailItem.vue_vue_type_script_setup_true_lang.js +1 -2
  425. package/dist/domains/filters/components/FiltersSelected.js +1 -2
  426. package/dist/domains/filters/components/FiltersSelected.vue_vue_type_script_setup_true_lang.js +1 -2
  427. package/dist/domains/filters/composables/filterFactory.d.ts +31 -2
  428. package/dist/domains/filters/composables/filterFactory.js +79 -69
  429. package/dist/domains/filters/composables/filterFactory.js.map +1 -1
  430. package/dist/domains/filters/composables/filterTimeIntervalTools.js +1 -2
  431. package/dist/domains/filters/datatable/components/ADatatableConfigButton.js +1 -2
  432. package/dist/domains/filters/datatable/components/ADatatableConfigButton.vue_vue_type_script_setup_true_lang.js +1 -2
  433. package/dist/domains/filters/datatable/components/ADatatableOrdering.js +1 -2
  434. package/dist/domains/filters/datatable/components/ADatatableOrdering.vue_vue_type_script_setup_true_lang.js +1 -2
  435. package/dist/domains/filters/datatable/components/ADatatablePagination.js +1 -2
  436. package/dist/domains/filters/datatable/components/ADatatablePagination.vue_vue_type_script_setup_true_lang.js +1 -2
  437. package/dist/domains/filters/datatable/composables/createDatatableColumnsConfig.js +1 -2
  438. package/dist/domains/filters/datatable/utils/datatable.js +1 -2
  439. package/dist/domains/filters/datatable/utils/datatableColumns.js +1 -2
  440. package/dist/domains/filters/utils/filterInjectionKeys.js +1 -2
  441. package/dist/domains/form/components/AFormDatetimePicker.js +1 -2
  442. package/dist/domains/form/components/AFormDatetimePicker.vue_vue_type_script_setup_true_lang.js +1 -2
  443. package/dist/domains/form/components/AFormFlagDatetimePicker.js +1 -2
  444. package/dist/domains/form/components/AFormFlagDatetimePicker.vue_vue_type_script_setup_true_lang.js +1 -2
  445. package/dist/domains/form/components/AFormRemoteCheckbox.js +1 -2
  446. package/dist/domains/form/components/AFormRemoteCheckbox.vue_vue_type_script_setup_true_lang.js +1 -2
  447. package/dist/domains/form/components/AFormRemoteSwitch.js +1 -2
  448. package/dist/domains/form/components/AFormRemoteSwitch.vue_vue_type_script_setup_true_lang.js +1 -2
  449. package/dist/domains/form/components/AFormSwitch.js +1 -2
  450. package/dist/domains/form/components/AFormSwitch.vue_vue_type_script_setup_true_lang.js +1 -2
  451. package/dist/domains/form/components/AFormTextField.js +1 -2
  452. package/dist/domains/form/components/AFormTextField.js.map +1 -1
  453. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js +2 -3
  454. package/dist/domains/form/components/AFormTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  455. package/dist/domains/form/components/AFormTextarea.js +1 -2
  456. package/dist/domains/form/components/AFormTextarea.vue_vue_type_script_setup_true_lang.js +1 -2
  457. package/dist/domains/form/components/AFormValueObjectOptionsSelect.js +1 -2
  458. package/dist/domains/form/components/AFormValueObjectOptionsSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  459. package/dist/domains/form/components/ASystemEntityScope.js +1 -2
  460. package/dist/domains/form/components/ASystemEntityScope.vue_vue_type_script_setup_true_lang.js +1 -2
  461. package/dist/domains/job/api/jobApi.js +1 -2
  462. package/dist/domains/job/components/AJobBaseCreateForm.js +1 -2
  463. package/dist/domains/job/components/AJobBaseCreateForm.vue_vue_type_script_setup_true_lang.js +1 -2
  464. package/dist/domains/job/components/AJobDetailCommon.js +1 -2
  465. package/dist/domains/job/components/AJobDetailCommon.vue_vue_type_script_setup_true_lang.js +1 -2
  466. package/dist/domains/job/components/AJobPriorityChip.js +1 -2
  467. package/dist/domains/job/components/AJobPriorityChip.vue_vue_type_script_setup_true_lang.js +1 -2
  468. package/dist/domains/job/components/AJobStatusChip.js +1 -2
  469. package/dist/domains/job/components/AJobStatusChip.vue_vue_type_script_setup_true_lang.js +1 -2
  470. package/dist/domains/job/composables/jobPriority.js +1 -2
  471. package/dist/domains/job/factory/JobFactory.js +1 -2
  472. package/dist/domains/job/valueObject/JobBaseResource.js +1 -2
  473. package/dist/domains/job/valueObject/JobStatus.js +1 -2
  474. package/dist/domains/listEditor/components/AListEditor.js +1 -2
  475. package/dist/domains/listEditor/components/AListEditor.vue_vue_type_script_setup_true_lang.js +1 -2
  476. package/dist/domains/listEditor/components/ANestedSortableListEditor.js +1 -2
  477. package/dist/domains/listEditor/components/ANestedSortableListEditor.vue_vue_type_script_setup_true_lang.js +1 -2
  478. package/dist/domains/listEditor/components/ASortableListEditor.js +1 -2
  479. package/dist/domains/listEditor/components/ASortableListEditor.vue_vue_type_script_setup_true_lang.js +1 -2
  480. package/dist/domains/listEditor/components/internal/LeChangeParentDialog.js +1 -2
  481. package/dist/domains/listEditor/components/internal/LeChangeParentDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  482. package/dist/domains/listEditor/components/internal/LeDeleteDialog.js +1 -2
  483. package/dist/domains/listEditor/components/internal/LeDeleteDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  484. package/dist/domains/listEditor/components/internal/LeDragHandle.js +1 -2
  485. package/dist/domains/listEditor/components/internal/LeDragHandle.vue_vue_type_script_setup_true_lang.js +1 -2
  486. package/dist/domains/listEditor/components/internal/LeEmptyState.js +1 -2
  487. package/dist/domains/listEditor/components/internal/LeEmptyState.vue_vue_type_script_setup_true_lang.js +1 -2
  488. package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.js +1 -2
  489. package/dist/domains/listEditor/components/internal/LeMoveToPositionDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  490. package/dist/domains/listEditor/components/internal/LeNestedRow.js +1 -2
  491. package/dist/domains/listEditor/components/internal/LeNestedRow.vue_vue_type_script_setup_true_lang.js +1 -2
  492. package/dist/domains/listEditor/components/internal/LeStatus.js +1 -2
  493. package/dist/domains/listEditor/components/internal/LeStatus.vue_vue_type_script_setup_true_lang.js +1 -2
  494. package/dist/domains/listEditor/components/internal/LeUnsavedLabel.js +1 -2
  495. package/dist/domains/listEditor/components/internal/LeUnsavedLabel.vue_vue_type_script_setup_true_lang.js +1 -2
  496. package/dist/domains/listEditor/components/internal/constants.js +1 -2
  497. package/dist/domains/listEditor/composables/useContainerWidth.js +1 -2
  498. package/dist/domains/listEditor/composables/useDeleteDialog.js +1 -2
  499. package/dist/domains/listEditor/composables/useDragInstruction.js +1 -2
  500. package/dist/domains/listEditor/composables/useInlineEditing.js +1 -2
  501. package/dist/domains/listEditor/composables/useIsTouchDevice.js +1 -2
  502. package/dist/domains/listEditor/composables/useKeyboardNav.js +2 -3
  503. package/dist/domains/listEditor/composables/useKeyboardNav.js.map +1 -1
  504. package/dist/domains/listEditor/composables/useListEditorController.js +1 -2
  505. package/dist/domains/listEditor/composables/useListEditorScopeValidity.js +1 -2
  506. package/dist/domains/listEditor/composables/useListEditorStateScope.js +1 -2
  507. package/dist/domains/listEditor/composables/useNestedListEditor.js +1 -2
  508. package/dist/domains/listEditor/composables/useNestedListEditorController.js +1 -2
  509. package/dist/domains/listEditor/composables/useReorderMode.js +1 -2
  510. package/dist/domains/listEditor/utils/listEditorLoader.js +1 -2
  511. package/dist/domains/listEditor/utils/positions.js +1 -2
  512. package/dist/domains/listEditor/utils/resolveCompactText.js +1 -2
  513. package/dist/domains/listEditor/utils/revealInvalidRows.js +1 -2
  514. package/dist/domains/listEditor/utils/tempId.js +1 -2
  515. package/dist/domains/log/api/logApi.js +0 -1
  516. package/dist/domains/log/components/ALogDatatable.js +1 -2
  517. package/dist/domains/log/components/ALogDatatable.vue_vue_type_script_setup_true_lang.js +1 -2
  518. package/dist/domains/log/components/ALogDetail.js +1 -2
  519. package/dist/domains/log/components/ALogDetail.vue_vue_type_script_setup_true_lang.js +1 -2
  520. package/dist/domains/log/components/ALogDetailView.js +1 -2
  521. package/dist/domains/log/components/ALogDetailView.vue_vue_type_script_setup_true_lang.js +1 -2
  522. package/dist/domains/log/components/ALogFilter.js +1 -2
  523. package/dist/domains/log/components/ALogFilter.vue_vue_type_script_setup_true_lang.js +1 -2
  524. package/dist/domains/log/components/ALogLevelChip.js +1 -2
  525. package/dist/domains/log/components/ALogLevelChip.vue_vue_type_script_setup_true_lang.js +1 -2
  526. package/dist/domains/log/components/ALogListView.js +1 -2
  527. package/dist/domains/log/components/ALogListView.vue_vue_type_script_setup_true_lang.js +1 -2
  528. package/dist/domains/log/composables/logActions.js +1 -2
  529. package/dist/domains/log/composables/logType.js +1 -2
  530. package/dist/domains/log/filter/logFilter.js +1 -2
  531. package/dist/domains/log/valueObject/LogLevel.js +6 -7
  532. package/dist/domains/log/valueObject/LogLevel.js.map +1 -1
  533. package/dist/domains/permission/components/APermissionEditor.js +1 -2
  534. package/dist/domains/permission/components/APermissionEditor.vue_vue_type_script_setup_true_lang.js +1 -2
  535. package/dist/domains/permission/components/APermissionGrantEditor.js +1 -2
  536. package/dist/domains/permission/components/APermissionGrantEditor.vue_vue_type_script_setup_true_lang.js +1 -2
  537. package/dist/domains/permission/components/APermissionValueChip.js +1 -2
  538. package/dist/domains/permission/components/APermissionValueChip.vue_vue_type_script_setup_true_lang.js +1 -2
  539. package/dist/domains/permission/composables/permissionActions.js +1 -2
  540. package/dist/domains/permission/config/api/permissionConfigApi.js +1 -2
  541. package/dist/domains/permission/config/composables/permissionConfigActions.js +1 -2
  542. package/dist/domains/permission/config/factory/PermissionConfigFactory.js +1 -2
  543. package/dist/domains/permission/config/store/permissionConfigStore.js +1 -2
  544. package/dist/domains/permission/group/api/permissionGroupApi.js +1 -2
  545. package/dist/domains/permission/group/components/APermissionGroupDatatable.js +1 -2
  546. package/dist/domains/permission/group/components/APermissionGroupDatatable.vue_vue_type_script_setup_true_lang.js +1 -2
  547. package/dist/domains/permission/group/components/APermissionGroupDetail.js +1 -2
  548. package/dist/domains/permission/group/components/APermissionGroupDetail.vue_vue_type_script_setup_true_lang.js +1 -2
  549. package/dist/domains/permission/group/components/APermissionGroupFilter.js +1 -2
  550. package/dist/domains/permission/group/components/APermissionGroupFilter.vue_vue_type_script_setup_true_lang.js +1 -2
  551. package/dist/domains/permission/group/components/APermissionGroupManage.js +1 -2
  552. package/dist/domains/permission/group/components/APermissionGroupManage.vue_vue_type_script_setup_true_lang.js +1 -2
  553. package/dist/domains/permission/group/components/APermissionGroupRemoteAutocomplete.js +1 -2
  554. package/dist/domains/permission/group/components/APermissionGroupRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  555. package/dist/domains/permission/group/composables/cachedPermissionGroups.js +1 -2
  556. package/dist/domains/permission/group/composables/permissionGroupActions.js +1 -2
  557. package/dist/domains/permission/group/composables/permissionGroupValidations.js +1 -2
  558. package/dist/domains/permission/group/factory/PermissionGroupFactory.js +1 -2
  559. package/dist/domains/permission/group/filter/permissionGroupFilter.js +1 -2
  560. package/dist/domains/permission/group/store/permissionGroupStore.js +1 -2
  561. package/dist/domains/permission/valueObject/GrantOrigin.js +1 -2
  562. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.js +1 -2
  563. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  564. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.js +1 -2
  565. package/dist/domains/remoteAutocomplete/components/AFilterRemoteAutocompleteWithMinimal.vue_vue_type_script_setup_true_lang.js +1 -2
  566. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.js +1 -2
  567. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocomplete.vue_vue_type_script_setup_true_lang.js +1 -2
  568. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.js +1 -2
  569. package/dist/domains/remoteAutocomplete/components/AFormRemoteAutocompleteWithCached.vue_vue_type_script_setup_true_lang.js +1 -2
  570. package/dist/domains/remoteAutocomplete/composables/createRemoteAutocomplete.js +1 -2
  571. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.js +1 -2
  572. package/dist/domains/subjectSelect/components/AFilterWrapperSubjectSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  573. package/dist/domains/subjectSelect/components/ASubjectSelect.js +1 -2
  574. package/dist/domains/subjectSelect/components/ASubjectSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  575. package/dist/domains/subjectSelect/composables/useSubjectSelect.js +1 -2
  576. package/dist/domains/subjectSelect/utils/selectStrategies.js +1 -2
  577. package/dist/domains/system/appShell/components/AActionbar.js +1 -2
  578. package/dist/domains/system/appShell/components/AActionbar.vue_vue_type_script_setup_true_lang.js +1 -2
  579. package/dist/domains/system/appShell/components/AActionbarTarget.js +1 -2
  580. package/dist/domains/system/appShell/components/AActionbarTarget.vue_vue_type_script_setup_true_lang.js +1 -2
  581. package/dist/domains/system/appShell/components/ALayoutLoader.js +1 -2
  582. package/dist/domains/system/appShell/components/ALayoutLoader.vue_vue_type_script_setup_true_lang.js +1 -2
  583. package/dist/domains/system/appShell/components/ALayoutSwitch.js +1 -2
  584. package/dist/domains/system/appShell/components/ALayoutSwitch.vue_vue_type_script_setup_true_lang.js +1 -2
  585. package/dist/domains/system/appShell/composables/teleportSlot.js +1 -2
  586. package/dist/domains/system/components/AAdminSwitcher.js +1 -2
  587. package/dist/domains/system/components/AAdminSwitcher.vue_vue_type_script_setup_true_lang.js +1 -2
  588. package/dist/domains/system/components/AAlerts.js +1 -2
  589. package/dist/domains/system/components/AAlerts.vue_vue_type_script_setup_true_lang.js +1 -2
  590. package/dist/domains/system/components/ALanguageSelect.js +1 -2
  591. package/dist/domains/system/components/ALanguageSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  592. package/dist/domains/system/components/AThemeSelect.js +1 -2
  593. package/dist/domains/system/components/AThemeSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  594. package/dist/domains/system/composables/alerts.js +1 -2
  595. package/dist/domains/system/composables/alertsQueue.js +1 -2
  596. package/dist/domains/system/composables/breadcrumbs.d.ts +6 -6
  597. package/dist/domains/system/composables/breadcrumbs.js +8 -9
  598. package/dist/domains/system/composables/breadcrumbs.js.map +1 -1
  599. package/dist/domains/system/composables/languageSettings.js +1 -2
  600. package/dist/domains/system/composables/loginStatus.js +1 -2
  601. package/dist/domains/system/composables/navigationError.js +1 -2
  602. package/dist/domains/system/composables/pageNavigation.js +1 -2
  603. package/dist/domains/system/composables/recordActions.d.ts +41 -0
  604. package/dist/domains/system/composables/recordActions.js +32 -0
  605. package/dist/domains/system/composables/recordActions.js.map +1 -0
  606. package/dist/domains/system/composables/recordPage.d.ts +14 -4
  607. package/dist/domains/system/composables/recordPage.js +37 -36
  608. package/dist/domains/system/composables/recordPage.js.map +1 -1
  609. package/dist/domains/system/composables/routeHistory.js +34 -28
  610. package/dist/domains/system/composables/routeHistory.js.map +1 -1
  611. package/dist/domains/system/composables/sentry.js +1 -2
  612. package/dist/domains/system/composables/themeSettings.js +1 -2
  613. package/dist/domains/system/composables/useDebugFeatures.js +1 -2
  614. package/dist/domains/system/composables/useUnreleasedFeatures.js +1 -2
  615. package/dist/domains/system/composables/useUserActivity.js +1 -2
  616. package/dist/domains/system/flags/components/FlagCountry.js +1 -2
  617. package/dist/domains/system/flags/components/FlagCountry.vue_vue_type_script_setup_true_lang.js +1 -2
  618. package/dist/domains/system/flags/components/FlagEmpty.js +1 -2
  619. package/dist/domains/system/flags/components/FlagEn.js +1 -2
  620. package/dist/domains/system/flags/components/FlagSk.js +1 -2
  621. package/dist/domains/system/store/datatablePageStore.js +1 -2
  622. package/dist/domains/system/systemBar/components/ASystemBar.js +1 -2
  623. package/dist/domains/system/systemBar/components/ASystemBar.vue_vue_type_script_setup_true_lang.js +1 -2
  624. package/dist/domains/system/systemBar/components/ASystemBarNewVersion.js +1 -2
  625. package/dist/domains/system/systemBar/components/ASystemBarNewVersion.vue_vue_type_script_setup_true_lang.js +1 -2
  626. package/dist/domains/system/systemBar/composables/systemBar.js +1 -2
  627. package/dist/domains/system/systemBar/utils/appReload.js +1 -2
  628. package/dist/domains/system/systemBar/utils/pageReload.js +1 -2
  629. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.js +1 -2
  630. package/dist/domains/ui/buttons/action/components/AActionCloseButtonHistory.vue_vue_type_script_setup_true_lang.js +1 -2
  631. package/dist/domains/ui/buttons/action/components/AActionCreateButton.js +1 -2
  632. package/dist/domains/ui/buttons/action/components/AActionCreateButton.vue_vue_type_script_setup_true_lang.js +1 -2
  633. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.js +1 -2
  634. package/dist/domains/ui/buttons/action/components/AActionDeleteButton.vue_vue_type_script_setup_true_lang.js +1 -2
  635. package/dist/domains/ui/buttons/action/components/AActionEditButton.js +1 -2
  636. package/dist/domains/ui/buttons/action/components/AActionEditButton.vue_vue_type_script_setup_true_lang.js +1 -2
  637. package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.js +1 -2
  638. package/dist/domains/ui/buttons/action/components/AActionSaveAndCloseButton.vue_vue_type_script_setup_true_lang.js +1 -2
  639. package/dist/domains/ui/buttons/action/components/AActionSaveButton.js +1 -2
  640. package/dist/domains/ui/buttons/action/components/AActionSaveButton.vue_vue_type_script_setup_true_lang.js +1 -2
  641. package/dist/domains/ui/buttons/components/ABtnSplit.js +1 -2
  642. package/dist/domains/ui/buttons/components/ABtnSplit.vue_vue_type_script_setup_true_lang.js +1 -2
  643. package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.js +1 -2
  644. package/dist/domains/ui/buttons/table/components/ATableCopyIdButton.vue_vue_type_script_setup_true_lang.js +1 -2
  645. package/dist/domains/ui/buttons/table/components/ATableDetailButton.js +1 -2
  646. package/dist/domains/ui/buttons/table/components/ATableDetailButton.vue_vue_type_script_setup_true_lang.js +1 -2
  647. package/dist/domains/ui/buttons/table/components/ATableEditButton.js +1 -2
  648. package/dist/domains/ui/buttons/table/components/ATableEditButton.vue_vue_type_script_setup_true_lang.js +1 -2
  649. package/dist/domains/ui/components/AAnzuUserAvatar.js +1 -2
  650. package/dist/domains/ui/components/AAnzuUserAvatar.vue_vue_type_script_setup_true_lang.js +1 -2
  651. package/dist/domains/ui/components/AAvatarColorPicker.js +1 -2
  652. package/dist/domains/ui/components/AAvatarColorPicker.vue_vue_type_script_setup_true_lang.js +1 -2
  653. package/dist/domains/ui/components/ABooleanSelect.js +1 -2
  654. package/dist/domains/ui/components/ABooleanSelect.vue_vue_type_script_setup_true_lang.js +1 -2
  655. package/dist/domains/ui/components/ABooleanValue.js +1 -2
  656. package/dist/domains/ui/components/ABooleanValue.vue_vue_type_script_setup_true_lang.js +1 -2
  657. package/dist/domains/ui/components/ACard.js +1 -2
  658. package/dist/domains/ui/components/ACard.vue_vue_type_script_setup_true_lang.js +1 -2
  659. package/dist/domains/ui/components/ACardLoader.js +1 -2
  660. package/dist/domains/ui/components/ACardLoader.vue_vue_type_script_setup_true_lang.js +1 -2
  661. package/dist/domains/ui/components/AChipNoLink.js +1 -2
  662. package/dist/domains/ui/components/AChipNoLink.vue_vue_type_script_setup_true_lang.js +1 -2
  663. package/dist/domains/ui/components/ACopyText.js +1 -2
  664. package/dist/domains/ui/components/ACopyText.vue_vue_type_script_setup_true_lang.js +1 -2
  665. package/dist/domains/ui/components/ACreateDialog.js +1 -2
  666. package/dist/domains/ui/components/ACreateDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  667. package/dist/domains/ui/components/ACurrentUserDropdown.js +1 -2
  668. package/dist/domains/ui/components/ACurrentUserDropdown.vue_vue_type_script_setup_true_lang.js +1 -2
  669. package/dist/domains/ui/components/ADialogToolbar.js +1 -2
  670. package/dist/domains/ui/components/ADialogToolbar.vue_vue_type_script_setup_true_lang.js +1 -2
  671. package/dist/domains/ui/components/AIconGroup.js +1 -2
  672. package/dist/domains/ui/components/AIconGroup.vue_vue_type_script_setup_true_lang.js +1 -2
  673. package/dist/domains/ui/components/AProgress.js +1 -2
  674. package/dist/domains/ui/components/AProgress.vue_vue_type_script_setup_true_lang.js +1 -2
  675. package/dist/domains/ui/components/ARow.js +1 -2
  676. package/dist/domains/ui/components/ARow.vue_vue_type_script_setup_true_lang.js +1 -2
  677. package/dist/domains/ui/components/ATimeTrackingFields.js +1 -2
  678. package/dist/domains/ui/components/ATimeTrackingFields.vue_vue_type_script_setup_true_lang.js +1 -2
  679. package/dist/domains/ui/components/AUserAndTimeTrackingFields.js +1 -2
  680. package/dist/domains/ui/components/AUserAndTimeTrackingFields.vue_vue_type_script_setup_true_lang.js +1 -2
  681. package/dist/domains/ui/datetime/components/ADatetime.js +1 -2
  682. package/dist/domains/ui/datetime/components/ADatetime.vue_vue_type_script_setup_true_lang.js +1 -2
  683. package/dist/domains/ui/datetime/components/ADatetimePicker.js +1 -2
  684. package/dist/domains/ui/datetime/components/ADatetimePicker.vue_vue_type_script_setup_true_lang.js +1 -2
  685. package/dist/domains/ui/datetime/components/TimePicker.js +1 -2
  686. package/dist/domains/ui/datetime/components/TimePicker.vue_vue_type_script_setup_true_lang.js +1 -2
  687. package/dist/domains/ui/datetime/composables/remainingTime.js +1 -2
  688. package/dist/domains/ui/file/components/AFileDropzone.js +1 -2
  689. package/dist/domains/ui/file/components/AFileDropzone.vue_vue_type_script_setup_true_lang.js +1 -2
  690. package/dist/domains/ui/file/components/AFileInput.js +1 -2
  691. package/dist/domains/ui/file/components/AFileInput.vue_vue_type_script_setup_true_lang.js +1 -2
  692. package/dist/domains/ui/file/components/AFileInputDialog.js +1 -2
  693. package/dist/domains/ui/file/components/AFileInputDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  694. package/dist/domains/ui/file/composables/dropzone.js +1 -2
  695. package/dist/domains/ui/file/composables/formatAndSizeCheck.js +1 -2
  696. package/dist/domains/ui/file/utils/fileType.js +1 -2
  697. package/dist/domains/ui/view/components/AGenericView.js +1 -2
  698. package/dist/domains/ui/view/components/AGenericView.vue_vue_type_script_setup_true_lang.js +1 -2
  699. package/dist/domains/ui/view/components/ALoginView.js +1 -2
  700. package/dist/domains/ui/view/components/ALoginView.vue_vue_type_script_setup_true_lang.js +1 -2
  701. package/dist/domains/ui/view/components/ALogoutView.js +1 -2
  702. package/dist/domains/ui/view/components/ALogoutView.vue_vue_type_script_setup_true_lang.js +1 -2
  703. package/dist/domains/ui/view/components/ANotFoundView.js +1 -2
  704. package/dist/domains/ui/view/components/ANotFoundView.vue_vue_type_script_setup_true_lang.js +1 -2
  705. package/dist/domains/ui/view/components/AUnauthorizedView.js +1 -2
  706. package/dist/domains/ui/view/components/AUnauthorizedView.vue_vue_type_script_setup_true_lang.js +1 -2
  707. package/dist/domains/unsavedGuard/components/AUnsavedConfirmDialog.js +1 -2
  708. package/dist/domains/unsavedGuard/components/AUnsavedConfirmDialog.vue_vue_type_script_setup_true_lang.js +1 -2
  709. package/dist/domains/unsavedGuard/composables/useUnsavedChangesGuard.js +1 -2
  710. package/dist/domains/unsavedGuard/composables/useUnsavedSection.js +1 -2
  711. package/dist/lib.d.ts +3 -2
  712. package/dist/locales/cs/common/alert.js +1 -2
  713. package/dist/locales/cs/common/anzuUser.js +1 -2
  714. package/dist/locales/cs/common/assetSelect.js +1 -2
  715. package/dist/locales/cs/common/button.js +1 -2
  716. package/dist/locales/cs/common/collab.js +1 -2
  717. package/dist/locales/cs/common/confirmDialog.js +1 -2
  718. package/dist/locales/cs/common/customForm.js +1 -2
  719. package/dist/locales/cs/common/customFormElement.js +1 -2
  720. package/dist/locales/cs/common/damImage.js +1 -2
  721. package/dist/locales/cs/common/dayOfWeek.js +1 -2
  722. package/dist/locales/cs/common/filter.js +1 -2
  723. package/dist/locales/cs/common/job.js +1 -2
  724. package/dist/locales/cs/common/linkDto.js +1 -2
  725. package/dist/locales/cs/common/listItemDto.js +1 -2
  726. package/dist/locales/cs/common/log.js +1 -2
  727. package/dist/locales/cs/common/model.js +1 -2
  728. package/dist/locales/cs/common/permission.js +1 -2
  729. package/dist/locales/cs/common/permissionEditor.js +1 -2
  730. package/dist/locales/cs/common/permissionGroup.js +1 -2
  731. package/dist/locales/cs/common/routeSettings.js +1 -2
  732. package/dist/locales/cs/common/sortable.js +1 -2
  733. package/dist/locales/cs/common/subjectSelect.js +1 -2
  734. package/dist/locales/cs/common/system.js +1 -2
  735. package/dist/locales/cs/common/time.js +1 -2
  736. package/dist/locales/cs/common/userSystem.js +1 -2
  737. package/dist/locales/cs/error/apiDependencyExists.js +1 -2
  738. package/dist/locales/cs/error/apiForbiddenOperation.js +1 -2
  739. package/dist/locales/cs/error/apiTimedOut.js +1 -2
  740. package/dist/locales/cs/error/apiValidation.js +1 -2
  741. package/dist/locales/cs/error/jsValidation.js +1 -2
  742. package/dist/locales/cs/vuetify.js +1 -2
  743. package/dist/locales/cs.js +1 -2
  744. package/dist/locales/en/common/alert.js +1 -2
  745. package/dist/locales/en/common/anzuUser.js +1 -2
  746. package/dist/locales/en/common/assetSelect.js +1 -2
  747. package/dist/locales/en/common/button.js +1 -2
  748. package/dist/locales/en/common/collab.js +1 -2
  749. package/dist/locales/en/common/confirmDialog.js +1 -2
  750. package/dist/locales/en/common/customForm.js +1 -2
  751. package/dist/locales/en/common/customFormElement.js +1 -2
  752. package/dist/locales/en/common/damImage.js +1 -2
  753. package/dist/locales/en/common/dayOfWeek.js +1 -2
  754. package/dist/locales/en/common/filter.js +1 -2
  755. package/dist/locales/en/common/job.js +1 -2
  756. package/dist/locales/en/common/linkDto.js +1 -2
  757. package/dist/locales/en/common/listItemDto.js +1 -2
  758. package/dist/locales/en/common/log.js +1 -2
  759. package/dist/locales/en/common/model.js +1 -2
  760. package/dist/locales/en/common/permission.js +1 -2
  761. package/dist/locales/en/common/permissionEditor.js +1 -2
  762. package/dist/locales/en/common/permissionGroup.js +1 -2
  763. package/dist/locales/en/common/routeSettings.js +1 -2
  764. package/dist/locales/en/common/sortable.js +1 -2
  765. package/dist/locales/en/common/subjectSelect.js +1 -2
  766. package/dist/locales/en/common/system.js +1 -2
  767. package/dist/locales/en/common/time.js +1 -2
  768. package/dist/locales/en/common/userSystem.js +1 -2
  769. package/dist/locales/en/error/apiDependencyExists.js +1 -2
  770. package/dist/locales/en/error/apiForbiddenOperation.js +1 -2
  771. package/dist/locales/en/error/apiTimedOut.js +1 -2
  772. package/dist/locales/en/error/apiValidation.js +1 -2
  773. package/dist/locales/en/error/jsValidation.js +1 -2
  774. package/dist/locales/en/vuetify.js +1 -2
  775. package/dist/locales/en.js +1 -2
  776. package/dist/locales/sk/common/alert.js +1 -2
  777. package/dist/locales/sk/common/anzuUser.js +1 -2
  778. package/dist/locales/sk/common/assetSelect.js +1 -2
  779. package/dist/locales/sk/common/button.js +1 -2
  780. package/dist/locales/sk/common/collab.js +1 -2
  781. package/dist/locales/sk/common/confirmDialog.js +1 -2
  782. package/dist/locales/sk/common/customForm.js +1 -2
  783. package/dist/locales/sk/common/customFormElement.js +1 -2
  784. package/dist/locales/sk/common/damImage.js +1 -2
  785. package/dist/locales/sk/common/dayOfWeek.js +1 -2
  786. package/dist/locales/sk/common/filter.js +1 -2
  787. package/dist/locales/sk/common/job.js +1 -2
  788. package/dist/locales/sk/common/linkDto.js +1 -2
  789. package/dist/locales/sk/common/listItemDto.js +1 -2
  790. package/dist/locales/sk/common/log.js +1 -2
  791. package/dist/locales/sk/common/model.js +1 -2
  792. package/dist/locales/sk/common/permission.js +1 -2
  793. package/dist/locales/sk/common/permissionEditor.js +1 -2
  794. package/dist/locales/sk/common/permissionGroup.js +1 -2
  795. package/dist/locales/sk/common/routeSettings.js +1 -2
  796. package/dist/locales/sk/common/sortable.js +1 -2
  797. package/dist/locales/sk/common/subjectSelect.js +1 -2
  798. package/dist/locales/sk/common/system.js +1 -2
  799. package/dist/locales/sk/common/time.js +1 -2
  800. package/dist/locales/sk/common/userSystem.js +1 -2
  801. package/dist/locales/sk/error/apiDependencyExists.js +1 -2
  802. package/dist/locales/sk/error/apiForbiddenOperation.js +1 -2
  803. package/dist/locales/sk/error/apiTimedOut.js +1 -2
  804. package/dist/locales/sk/error/apiValidation.js +1 -2
  805. package/dist/locales/sk/error/jsValidation.js +1 -2
  806. package/dist/locales/sk/vuetify.js +1 -2
  807. package/dist/locales/sk.js +1 -2
  808. package/dist/plugins/commonVuetifyConfig.js +1 -2
  809. package/dist/plugins/i18n.js +1 -2
  810. package/dist/plugins/pluginOptions.js +1 -2
  811. package/dist/plugins/webfontloader.js +0 -1
  812. package/dist/shared/commonConfig.js +0 -1
  813. package/dist/shared/error/AnzuApiAxiosError.js +1 -2
  814. package/dist/shared/error/AnzuApiCancelledError.js +1 -2
  815. package/dist/shared/error/AnzuApiDependencyExistsError.js +1 -2
  816. package/dist/shared/error/AnzuApiForbiddenError.js +1 -2
  817. package/dist/shared/error/AnzuApiForbiddenOperationError.js +1 -2
  818. package/dist/shared/error/AnzuApiResponseCodeError.js +1 -2
  819. package/dist/shared/error/AnzuApiTimeoutError.js +1 -2
  820. package/dist/shared/error/AnzuApiValidationError.js +1 -2
  821. package/dist/shared/error/AnzuError.js +1 -2
  822. package/dist/shared/error/AnzuFatalError.js +1 -2
  823. package/dist/shared/error/AnzuNewVersionFetchError.js +1 -2
  824. package/dist/shared/error/AuthUnavailableError.js +1 -2
  825. package/dist/shared/error/SessionExpiredError.js +1 -2
  826. package/dist/shared/error/isInCauseChain.js +1 -2
  827. package/dist/shared/injectionKeys.js +1 -2
  828. package/dist/shared/statusCodes.js +1 -2
  829. package/dist/shared/types/CreatedByAware.js +1 -2
  830. package/dist/shared/types/OwnerAware.js +1 -2
  831. package/dist/shared/types/utils.js +1 -2
  832. package/dist/shared/utils/array.js +1 -2
  833. package/dist/shared/utils/boolean.js +1 -2
  834. package/dist/shared/utils/common.js +1 -2
  835. package/dist/shared/utils/datetime.js +0 -1
  836. package/dist/shared/utils/datetimePickerValue.js +0 -1
  837. package/dist/shared/utils/development.js +1 -2
  838. package/dist/shared/utils/enum.js +1 -2
  839. package/dist/shared/utils/envConfig.js +1 -2
  840. package/dist/shared/utils/event.js +1 -2
  841. package/dist/shared/utils/file.js +1 -2
  842. package/dist/shared/utils/generator.js +1 -2
  843. package/dist/shared/utils/history.js +1 -2
  844. package/dist/shared/utils/json.js +1 -2
  845. package/dist/shared/utils/number.js +1 -2
  846. package/dist/shared/utils/object.js +1 -2
  847. package/dist/shared/utils/string.js +1 -2
  848. package/dist/shared/utils/userAndTimeTracking.js +1 -2
  849. package/dist/shared/validators/vuelidate/common/useValidateBetween.js +1 -2
  850. package/dist/shared/validators/vuelidate/common/useValidateCompareDates.js +1 -2
  851. package/dist/shared/validators/vuelidate/common/useValidateEmail.js +1 -2
  852. package/dist/shared/validators/vuelidate/common/useValidateHexColor.js +1 -2
  853. package/dist/shared/validators/vuelidate/common/useValidateMaxLength.js +1 -2
  854. package/dist/shared/validators/vuelidate/common/useValidateMaxValue.js +1 -2
  855. package/dist/shared/validators/vuelidate/common/useValidateMinLength.js +1 -2
  856. package/dist/shared/validators/vuelidate/common/useValidateMinValue.js +1 -2
  857. package/dist/shared/validators/vuelidate/common/useValidateNumeric.js +1 -2
  858. package/dist/shared/validators/vuelidate/common/useValidateRequired.js +1 -2
  859. package/dist/shared/validators/vuelidate/common/useValidateRequiredIf.js +1 -2
  860. package/dist/shared/validators/vuelidate/common/useValidateSlug.js +1 -2
  861. package/dist/shared/validators/vuelidate/common/useValidateStringArrayItemLength.js +1 -2
  862. package/dist/shared/validators/vuelidate/common/useValidateUrl.js +1 -2
  863. package/dist/shared/validators/vuelidate/useValidate.js +1 -2
  864. package/dist/testing/appShell.js +1 -2
  865. package/dist/testing/closeButtons.js +1 -2
  866. package/dist/testing/declaredDependencies.js +1 -2
  867. package/dist/testing/generatedRoutes.js +1 -2
  868. package/dist/testing/routeHistory.js +1 -2
  869. package/dist/testing/sortableLists.js +1 -2
  870. package/dist/testing/typedRouter.js +1 -2
  871. package/dist/vendor/@cropper/element/dist/element.esm.raw.js +2 -3
  872. package/dist/vendor/@cropper/element/dist/element.esm.raw.js.map +1 -1
  873. package/dist/vendor/@cropper/element-canvas/dist/element-canvas.esm.raw.js +2 -3
  874. package/dist/vendor/@cropper/element-canvas/dist/element-canvas.esm.raw.js.map +1 -1
  875. package/dist/vendor/@cropper/element-crosshair/dist/element-crosshair.esm.raw.js +2 -3
  876. package/dist/vendor/@cropper/element-crosshair/dist/element-crosshair.esm.raw.js.map +1 -1
  877. package/dist/vendor/@cropper/element-grid/dist/element-grid.esm.raw.js +2 -3
  878. package/dist/vendor/@cropper/element-grid/dist/element-grid.esm.raw.js.map +1 -1
  879. package/dist/vendor/@cropper/element-handle/dist/element-handle.esm.raw.js +2 -3
  880. package/dist/vendor/@cropper/element-handle/dist/element-handle.esm.raw.js.map +1 -1
  881. package/dist/vendor/@cropper/element-image/dist/element-image.esm.raw.js +77 -62
  882. package/dist/vendor/@cropper/element-image/dist/element-image.esm.raw.js.map +1 -1
  883. package/dist/vendor/@cropper/element-selection/dist/element-selection.esm.raw.js +199 -54
  884. package/dist/vendor/@cropper/element-selection/dist/element-selection.esm.raw.js.map +1 -1
  885. package/dist/vendor/@cropper/element-shade/dist/element-shade.esm.raw.js +12 -6
  886. package/dist/vendor/@cropper/element-shade/dist/element-shade.esm.raw.js.map +1 -1
  887. package/dist/vendor/@cropper/element-viewer/dist/element-viewer.esm.raw.js +9 -10
  888. package/dist/vendor/@cropper/element-viewer/dist/element-viewer.esm.raw.js.map +1 -1
  889. package/dist/vendor/@cropper/utils/dist/utils.esm.raw.js +90 -48
  890. package/dist/vendor/@cropper/utils/dist/utils.esm.raw.js.map +1 -1
  891. package/dist/vendor/{cropperjs2 → cropperjs}/dist/cropper.esm.raw.js +11 -12
  892. package/dist/vendor/cropperjs/dist/cropper.esm.raw.js.map +1 -0
  893. package/dist/vendor/rusha/dist/rusha.js +1 -2
  894. package/dist/vendor/uuid/dist/rng.js +1 -2
  895. package/dist/vendor/uuid/dist/stringify.js +1 -2
  896. package/dist/vendor/uuid/dist/v1.js +1 -2
  897. package/dist/vendor/uuid/dist/v4.js +1 -2
  898. package/package.json +10 -10
  899. package/src/eslint/adminConfig.mjs +2 -1
  900. package/src/eslint/oxlint-admin.json +3 -0
  901. package/dist/vendor/cropperjs2/dist/cropper.esm.raw.js.map +0 -1
@@ -2,7 +2,7 @@ import { isUndefined as e } from "../../../shared/utils/common.js";
2
2
  import { coreDamOptions as t } from "../../../plugins/pluginOptions.js";
3
3
  import { useCommonAdminCoreDamOptions as n } from "./commonAdminCoreDamOptions.js";
4
4
  import { hasInjectionContext as r, inject as i, provide as a } from "vue";
5
- //#region src/domains/dam/composables/damConfigName.ts
5
+ // src/domains/dam/composables/damConfigName.ts
6
6
  var o = Symbol("anzu:dam-config-name");
7
7
  function s(e) {
8
8
  let t = e ?? i(o, void 0) ?? "default";
@@ -14,7 +14,6 @@ function c(e) {
14
14
  function l(r) {
15
15
  r === "default" || e(t.value) || n(r);
16
16
  }
17
- //#endregion
18
17
  export { o as DamConfigNameKey, l as checkDamConfigName, c as inheritedDamConfigName, s as useDamConfigName };
19
18
 
20
19
  //# sourceMappingURL=damConfigName.js.map
@@ -5,7 +5,7 @@ import { useDamNotificationsEventBus as r } from "./damNotificationsEventBus.js"
5
5
  import { setDamNotificationsPushAlive as i } from "./damNotificationsConnection.js";
6
6
  import { effectScope as a, ref as o, watch as s } from "vue";
7
7
  import { useWebSocket as c } from "@vueuse/core";
8
- //#region src/domains/dam/composables/damNotifications.ts
8
+ // src/domains/dam/composables/damNotifications.ts
9
9
  var l = e, u = o(!1), d = void 0, f = void 0, p = void 0;
10
10
  function m({ options: e, configNames: n }) {
11
11
  let a = e.enabled, o = r(), u, d = () => {
@@ -106,7 +106,6 @@ function x() {
106
106
  let e = r();
107
107
  return { addDamNotificationListener: (t, n = {}) => e.on(b(t, n)) };
108
108
  }
109
- //#endregion
110
109
  export { v as destroyDamNotifications, g as initDamNotifications, x as useDamNotifications };
111
110
 
112
111
  //# sourceMappingURL=damNotifications.js.map
@@ -1,5 +1,5 @@
1
1
  import { effectScope as e, shallowRef as t, watch as n } from "vue";
2
- //#region src/domains/dam/composables/damNotificationsConnection.ts
2
+ // src/domains/dam/composables/damNotificationsConnection.ts
3
3
  var r = t(/* @__PURE__ */ new Map()), i = (e, t) => {
4
4
  if (t.every((t) => (r.value.get(t) ?? !1) === e)) return;
5
5
  let n = new Map(r.value);
@@ -14,7 +14,6 @@ function a(t = "default") {
14
14
  }
15
15
  };
16
16
  }
17
- //#endregion
18
17
  export { i as setDamNotificationsPushAlive, a as useDamNotificationsConnection };
19
18
 
20
19
  //# sourceMappingURL=damNotificationsConnection.js.map
@@ -1,5 +1,5 @@
1
1
  import { useEventBus as e } from "@vueuse/core";
2
- //#region src/domains/dam/composables/damNotificationsEventBus.ts
2
+ // src/domains/dam/composables/damNotificationsEventBus.ts
3
3
  var t = Symbol("anzu:damNotificationsEventBusKey");
4
4
  function n() {
5
5
  return e(t);
@@ -20,7 +20,6 @@ var r = {
20
20
  UserUpdated: "user_updated",
21
21
  AssetFileCopied: "asset_file_copied"
22
22
  };
23
- //#endregion
24
23
  export { r as DamNotificationName, t as damNotificationsEventBusKey, n as useDamNotificationsEventBus };
25
24
 
26
25
  //# sourceMappingURL=damNotificationsEventBus.js.map
@@ -1,12 +1,11 @@
1
1
  import { inheritedDamConfigName as e } from "./damConfigName.js";
2
2
  import { ref as t } from "vue";
3
- //#region src/domains/dam/composables/extSystemIdForCached.ts
3
+ // src/domains/dam/composables/extSystemIdForCached.ts
4
4
  var n = /* @__PURE__ */ new Map([["default", t(0)]]);
5
5
  function r(r) {
6
6
  let i = e(r), a = n.get(i);
7
7
  return a || (a = t(0), n.set(i, a)), { cachedExtSystemId: a };
8
8
  }
9
- //#endregion
10
9
  export { r as useExtSystemIdForCached };
11
10
 
12
11
  //# sourceMappingURL=extSystemIdForCached.js.map
@@ -3,7 +3,7 @@ import { useCommonAdminCoreDamOptions as t } from "./commonAdminCoreDamOptions.j
3
3
  import { isImageCreateUpdateAware as n } from "../imageWidget/store/imageMediaWidgetStore.js";
4
4
  import { computed as r } from "vue";
5
5
  import i from "@vuelidate/core";
6
- //#region src/domains/dam/composables/uploadValidations.ts
6
+ // src/domains/dam/composables/uploadValidations.ts
7
7
  var a = Symbol.for("anzu:common:asset-metadata-validation-scope"), o = Symbol.for("anzu:common:image-validation-scope"), s = Symbol.for("anzu:common:author-create-validation-scope");
8
8
  function c(e, t, n) {
9
9
  let r = {};
@@ -16,7 +16,6 @@ function l(a, s, l) {
16
16
  } } } : {});
17
17
  return { v$: i(p, { image: a }, { $scope: o }) };
18
18
  }
19
- //#endregion
20
19
  export { a as ADamAssetMetadataValidationScopeSymbol, s as ADamAuthorCreateValidationScopeSymbol, o as AImageMetadataValidationScopeSymbol, c as buildFieldRules, l as useImageValidation };
21
20
 
22
21
  //# sourceMappingURL=uploadValidations.js.map
@@ -1,7 +1,7 @@
1
1
  import { SYSTEM_CORE_DAM as e } from "../../api/damConstants.js";
2
2
  import { DAM_END_POINT_ASSET_CUSTOM_FORM as t } from "../../api/damEndPoints.js";
3
3
  import { useApiFetchItems as n } from "../../../api/composables/useApiFetchItems.js";
4
- //#region src/domains/dam/config/api/damAssetCustomFormApi.ts
4
+ // src/domains/dam/config/api/damAssetCustomFormApi.ts
5
5
  var r = "assetCustomForm", i = (i, a, o, s = t) => {
6
6
  let { execute: c } = n({
7
7
  client: i,
@@ -22,7 +22,6 @@ var r = "assetCustomForm", i = (i, a, o, s = t) => {
22
22
  });
23
23
  return s({ urlParams: { distributionService: a } });
24
24
  };
25
- //#endregion
26
25
  export { i as fetchAssetCustomFormElements, a as fetchDistributionCustomFormElements };
27
26
 
28
27
  //# sourceMappingURL=damAssetCustomFormApi.js.map
@@ -1,7 +1,7 @@
1
1
  import { useApiRequest as e } from "../../../api/composables/useApiRequest.js";
2
2
  import { SYSTEM_CORE_DAM as t } from "../../api/damConstants.js";
3
3
  import { DAM_END_POINT_CONFIGURATION as n, DAM_END_POINT_PUB_CONFIGURATION as r } from "../../api/damEndPoints.js";
4
- //#region src/domains/dam/config/api/damConfigApi.ts
4
+ // src/domains/dam/config/api/damConfigApi.ts
5
5
  var i = "settings", a = (n, a = r) => {
6
6
  let { execute: o } = e({
7
7
  client: n,
@@ -30,7 +30,6 @@ var i = "settings", a = (n, a = r) => {
30
30
  });
31
31
  return s({ urlParams: { extSystem: r } });
32
32
  };
33
- //#endregion
34
33
  export { o as fetchConfiguration, s as fetchExtSystemConfiguration, a as fetchPubConfiguration };
35
34
 
36
35
  //# sourceMappingURL=damConfigApi.js.map
@@ -1,6 +1,6 @@
1
1
  import { DamAssetType as e } from "../../types/Asset.js";
2
2
  import { computed as t } from "vue";
3
- //#region src/domains/dam/config/composables/acceptTypeAndSizeHelper.ts
3
+ // src/domains/dam/config/composables/acceptTypeAndSizeHelper.ts
4
4
  function n(n = void 0, r) {
5
5
  let i = (e) => {
6
6
  let t = r[e];
@@ -19,7 +19,6 @@ function n(n = void 0, r) {
19
19
  uploadAccept: t(() => Object.keys(a.value).join(","))
20
20
  };
21
21
  }
22
- //#endregion
23
22
  export { n as useDamAcceptTypeAndSizeHelper };
24
23
 
25
24
  //# sourceMappingURL=acceptTypeAndSizeHelper.js.map
@@ -6,7 +6,7 @@ import { fetchConfiguration as s, fetchExtSystemConfiguration as c, fetchPubConf
6
6
  import { useDamConfigStoreOf as u } from "../store/damConfigStore.js";
7
7
  import { damEndPointsOf as d } from "../../composables/commonAdminCoreDamOptions.js";
8
8
  import { checkDamConfigName as f, inheritedDamConfigName as p } from "../../composables/damConfigName.js";
9
- //#region src/domains/dam/config/composables/damConfigState.ts
9
+ // src/domains/dam/config/composables/damConfigState.ts
10
10
  var m = /* @__PURE__ */ new WeakMap();
11
11
  function h(h = void 0, g) {
12
12
  let _ = p(g);
@@ -203,7 +203,6 @@ function h(h = void 0, g) {
203
203
  getDamConfigAssetCustomFormElements: N
204
204
  };
205
205
  }
206
- //#endregion
207
206
  export { h as useDamConfigState };
208
207
 
209
208
  //# sourceMappingURL=damConfigState.js.map
@@ -1,7 +1,7 @@
1
1
  import { UserAuthType as e } from "../../types/DamConfig.js";
2
2
  import { reactive as t, shallowRef as n } from "vue";
3
3
  import { defineStore as r } from "pinia";
4
- //#region src/domains/dam/config/store/damConfigStore.ts
4
+ // src/domains/dam/config/store/damConfigStore.ts
5
5
  var i = () => ({ userAuthType: e.JsonCredentials }), a = () => ({
6
6
  colorSet: {},
7
7
  assetExternalProviders: {},
@@ -43,7 +43,6 @@ function l(e = "default", t) {
43
43
  let n = c.get(e);
44
44
  return n || (n = r("commonAdminDamConfigStore:" + e, o), c.set(e, n)), n(t);
45
45
  }
46
- //#endregion
47
46
  export { s as useDamConfigStore, l as useDamConfigStoreOf };
48
47
 
49
48
  //# sourceMappingURL=damConfigStore.js.map
@@ -1,7 +1,7 @@
1
1
  import { cloneDeep as e, isArray as t, isObject as n, isUndefined as r } from "../../../../shared/utils/common.js";
2
2
  import { defineAuth as i } from "../../../auth/composables/defineAuth.js";
3
3
  import { useCommonAdminCoreDamOptions as a } from "../../composables/commonAdminCoreDamOptions.js";
4
- //#region src/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.ts
4
+ // src/domains/dam/config/utils/damFilterUserAllowedUploadConfigs.ts
5
5
  var o = (e) => n(e) && t(e.adminToExtSystems) && t(e.userToExtSystems) && t(e.resolvedAssetLicences), s = (e) => {
6
6
  let t = a(e).currentUser ?? "dam";
7
7
  if (t === !1) return "all";
@@ -21,7 +21,6 @@ function l(e, t) {
21
21
  let n = s(t);
22
22
  return n === "all" || n !== "none" && !!(n.adminToExtSystems.includes(e.extSystem) || n.userToExtSystems.includes(e.extSystem) || n.resolvedAssetLicences.map((e) => e.id).includes(e.licence));
23
23
  }
24
- //#endregion
25
24
  export { c as filterAllowedImageWidgetSelectConfigs, l as isImageWidgetUploadConfigAllowed };
26
25
 
27
26
  //# sourceMappingURL=damFilterUserAllowedUploadConfigs.js.map
@@ -1,8 +1,7 @@
1
1
  import e from "./ACropper.vue_vue_type_script_setup_true_lang.js";
2
2
  /* empty css */
3
- //#region src/domains/dam/cropper/components/ACropper.vue
3
+ // src/domains/dam/cropper/components/ACropper.vue
4
4
  var t = e;
5
- //#endregion
6
5
  export { t as default };
7
6
 
8
7
  //# sourceMappingURL=ACropper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ACropper.js","names":["_sfc_main","ACropper_vue_vue_type_script_setup_true_lang_default","ACropper_default"],"sources":["../../../../../src/domains/dam/cropper/components/ACropper.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from 'vue'\nimport { useResizeObserver } from '@vueuse/core'\nimport {\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n} from 'cropperjs2'\nimport {\n canvasSizeFor,\n clampRectInside,\n initialSelectionRect,\n isUsableAspectRatio,\n RESIZE_ANCHORS,\n rectsAreClose,\n type Rect,\n type Size,\n} from '@/domains/dam/cropper/utils/cropperGeometry'\nimport type { CropRect } from '@/domains/dam/cropper/utils/cropperTypes'\n\n/**\n * Image cropper built on cropper.js v2's custom elements, replacing the v1-based `ACropperjs`.\n *\n * It lives here, beside `DamAssetImageRoiSelect`, because that is the only thing that uses it and\n * nothing outside this library does. It is not exported: shaping it to one need rather than to a\n * general audience is what keeps it to its size.\n *\n * The crop is bound, not fetched: `v-model` carries it as fractions of the image, and `commit` says\n * the user has finished a gesture. There is no imperative surface — the one thing a host wants to do\n * with a cropper is know where the crop is, and a binding says that better than six methods did.\n *\n * The elements are assembled in script rather than in the template on purpose: a consumer of this\n * library does not configure `isCustomElement` in their own build, and setting element *properties*\n * instead of going through attribute strings avoids the coercion surprises (`NaN`, booleans,\n * fractional numbers) that come with the attribute round-trip.\n */\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n /** The crop, as fractions of the image. Leave it null to start from the default box. */\n modelValue?: CropRect | null\n /** `NaN` (the default) leaves the crop free-form. */\n aspectRatio?: number\n containerStyle?: { [key: string]: string } | undefined\n /** Wash over everything outside the crop — the replacement for overriding `.cropper-modal`. */\n shadeColor?: string\n }>(),\n {\n src: '',\n modelValue: null,\n aspectRatio: NaN,\n containerStyle: undefined,\n shadeColor: 'rgba(0, 0, 0, 0.5)',\n }\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', crop: CropRect): void\n /** The user has finished a gesture; the crop is worth saving. */\n (event: 'commit', crop: CropRect): void\n (event: 'ready'): void\n}>()\n\n// cropper.js registers its elements as a side effect of loading its entry, and this package's\n// `sideEffects` lets the consumer's bundler drop that module once only the classes are used. `$define`\n// is a no-op for an element that is already registered.\nfor (const element of [\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n]) {\n element.$define()\n}\n\n/**\n * Settings the one caller never varies, kept as constants rather than as props nobody passes.\n * Each of them is behaviour, not preference: no checkerboard behind a photograph, the wheel left to\n * the page, pinch zoom kept for tablets, and the minimum canvas cropper.js' own stylesheet declares.\n */\nconst AUTO_CROP_AREA = 0.8\nconst MIN_CONTAINER_WIDTH = 200\nconst MIN_CONTAINER_HEIGHT = 100\n\n// Matched to cropper.js v1's stylesheet so the two components are indistinguishable side by side.\nconst SELECTION_COLOR = 'rgba(51, 153, 255, 0.75)'\nconst FACE_COLOR = 'rgba(255, 255, 255, 0.1)'\nconst GRID_COLOR = 'rgba(238, 238, 238, 0.5)'\nconst CROSSHAIR_COLOR = 'rgba(238, 238, 238, 0.75)'\nconst RESIZE_ACTIONS = [\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n]\n\ninterface CropperParts {\n canvas: CropperCanvas\n image: CropperImage\n selection: CropperSelection\n}\n\nconst hostEl = useTemplateRef<HTMLDivElement>('hostEl')\nconst loading = ref(true)\n\nlet parts: CropperParts | null = null\nlet natural: Size = { width: 0, height: 0 }\n/** The action cropper.js is currently performing, so a clamp knows which edge to hold still. */\nlet currentAction: string | null = null\n/** Guards the re-entrant `$change` a clamp performs from being clamped again. */\nlet clamping = false\n/** Guards the half-applied transforms `$center` emits between its move and its scale. */\nlet centring = false\n/** Invalidates an in-flight build when `src` changes or the component goes away mid-load. */\nlet buildToken = 0\n/** The host box the current layout was computed for — not merely the last one observed. */\nlet laidOut: Size = { width: 0, height: 0 }\n/** The last crop handed out, so a model written straight back is not mistaken for a new one. */\nlet lastEmitted: CropRect | null = null\n/** Watches the ancestors that clip the host; their height is part of the room it has. */\nlet ancestorObserver: ResizeObserver | null = null\n\nconst create = <T extends HTMLElement>(name: string): T => document.createElement(name) as T\n\n/** The image box in canvas coordinates. Read from layout so panning and zooming stay accounted for. */\nconst imageBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const canvasRect = parts.canvas.getBoundingClientRect()\n const imageRect = parts.image.getBoundingClientRect()\n return {\n x: imageRect.left - canvasRect.left,\n y: imageRect.top - canvasRect.top,\n width: imageRect.width,\n height: imageRect.height,\n }\n}\n\n/**\n * Where the crop is allowed to be: the image, but never outside the visible canvas. The two are the\n * same box until the image is zoomed past its frame, and then it is the frame that wins — cropper.js\n * v1 limited its crop box to the canvas and the container both, so a zoomed-in image never let the\n * crop wander off the part of it you could actually see.\n */\nconst constraintBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const image = imageBounds()\n const canvas = parts.canvas.getBoundingClientRect()\n const left = Math.max(image.x, 0)\n const top = Math.max(image.y, 0)\n const right = Math.min(image.x + image.width, canvas.width)\n const bottom = Math.min(image.y + image.height, canvas.height)\n return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) }\n}\n\nconst selectionRect = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const { x, y, width, height } = parts.selection\n return { x, y, width, height }\n}\n\nconst applyRect = (rect: Rect) => {\n if (!parts) return\n clamping = true\n parts.selection.$change(rect.x, rect.y, rect.width, rect.height, props.aspectRatio, true)\n clamping = false\n}\n\n/**\n * Re-fits the image to the canvas. cropper.js only lets `$center` scale and move an image that is\n * marked scalable and translatable — it grants itself that permission while the image is still\n * loading, but not afterwards — so the flags are lifted for the call and put back straight after.\n */\nconst centerImage = () => {\n if (!parts) return\n const { image } = parts\n const { scalable, translatable } = image\n centring = true\n image.scalable = true\n image.translatable = true\n image.$center('contain')\n image.scalable = scalable\n image.translatable = translatable\n centring = false\n}\n\n/**\n * The crop a fresh picture starts with. Computed here rather than handed to cropper.js'\n * `initialCoverage`, whose deferred initialisation would land *after* a `ready` handler had already\n * positioned the crop. It is measured against the image rather than the canvas, which are the same\n * box for a source wider than its container and are not once the image sits centred between margins.\n */\nconst seedInitialCrop = () => {\n if (!parts) return\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return\n const initial = initialSelectionRect(bounds, props.aspectRatio, AUTO_CROP_AREA)\n applyRect({ ...initial, x: initial.x + bounds.x, y: initial.y + bounds.y })\n}\n\n/** Uses the bound crop if there is one, and the default box if there is not. */\nconst applyModelOrSeed = () => {\n const model = props.modelValue\n if (model && model.width > 0 && model.height > 0) applyCrop(model)\n else seedInitialCrop()\n emitCrop()\n}\n\n/** Pulls the selection back inside the image after something moved the image out from under it. */\nconst refit = () => {\n if (!parts || centring) return\n const current = selectionRect()\n if (current.width <= 0 || current.height <= 0) return\n const fitted = clampRectInside(current, constraintBounds(), props.aspectRatio)\n if (!rectsAreClose(current, fitted)) applyRect(fitted)\n}\n\nconst onSelectionChange = (event: Event) => {\n if (clamping || !parts) return\n const detail = (event as CustomEvent<Rect>).detail\n if (!detail) return\n // cropper.js reverses the action when a grip is dragged through the opposite edge, and it records\n // that on the canvas just before emitting this event — one move ahead of the `action` event the\n // tracking below sees. Prefer its own answer, and fall back if a future version stops publishing it.\n const liveAction = (parts.canvas as unknown as { $action?: unknown }).$action\n const action = typeof liveAction === 'string' && liveAction ? liveAction : currentAction\n const anchor = action ? RESIZE_ANCHORS[action] : undefined\n const clamped = clampRectInside(detail, constraintBounds(), props.aspectRatio, anchor)\n if (rectsAreClose(detail, clamped)) return\n // Rejecting the change and re-issuing the clamped one is what keeps the crop sliding along the\n // border instead of freezing there; the shade reads `defaultPrevented` and follows the new values.\n event.preventDefault()\n applyRect(clamped)\n}\n\nconst onActionStart = (event: Event) => {\n currentAction = (event as CustomEvent<{ action?: string }>).detail?.action ?? null\n}\n\nconst onAction = (event: Event) => {\n const action = (event as CustomEvent<{ action?: string }>).detail?.action\n // cropper.js turns a fresh \"select\" drag into the matching corner resize once it knows the\n // direction, and reports the new action on the next move — follow it so the anchor stays right.\n if (action) currentAction = action\n}\n\nconst onActionEnd = () => {\n currentAction = null\n emitCrop(true)\n}\n\n/**\n * The canvas must never see a wheel event: its own handler calls `preventDefault()` unconditionally,\n * which would swallow page scrolling over the picture the way cropper.js v1 never did. Pinching is\n * unaffected — that arrives as pointer events, and the picture stays scalable for it.\n */\nconst onWheelCapture = (event: WheelEvent) => {\n event.stopPropagation()\n}\n\n/**\n * cropper.js emits `transform` *before* it writes the new matrix to the element's style (it sets the\n * new transform to measure the result, puts the old one back, then emits and finally commits). Re-\n * fitting straight away would therefore measure the image as it was: after a zoom out the crop would\n * be judged against the larger, previous picture and left hanging over the edge of the new one.\n */\nconst onImageTransform = () => queueMicrotask(refit)\n\nconst teardown = () => {\n if (parts) {\n const { canvas, image, selection } = parts\n selection.removeEventListener('change', onSelectionChange)\n canvas.removeEventListener('actionstart', onActionStart)\n canvas.removeEventListener('action', onAction)\n canvas.removeEventListener('actionend', onActionEnd)\n image.removeEventListener('transform', onImageTransform)\n }\n // Every canvas, not just the one on `parts`: a build that was superseded while still waiting on\n // its image has already put one in the DOM and has nothing tracking it yet.\n hostEl.value?.querySelectorAll(CropperCanvas.$name).forEach((canvas) => {\n // Disconnecting a `cropper-image` drops its listeners but leaves its request running, and the\n // `$ready()` promise waiting on it keeps this component reachable until the server answers.\n canvas.querySelectorAll<CropperImage>(CropperImage.$name).forEach((image) => {\n if (image.$image) image.$image.src = ''\n })\n canvas.remove()\n })\n ancestorObserver?.disconnect()\n ancestorObserver = null\n parts = null\n natural = { width: 0, height: 0 }\n laidOut = { width: 0, height: 0 }\n currentAction = null\n}\n\n/**\n * How much of the host's height will actually be shown.\n *\n * The host's own `max-height` is the usual answer, and the one `DamAssetImageRoiSelect` relies on.\n * Ancestors count too when they clip with `overflow: hidden` — what they cut off cannot be scrolled\n * back into view, so it is no more reachable than the host's own overflow. An ancestor that\n * scrolls is left alone: there the rest of the picture is a scroll away, not gone.\n */\nconst clippingAncestorsOf = (host: HTMLElement): HTMLElement[] => {\n const found: HTMLElement[] = []\n let ancestor = host.parentElement\n while (ancestor && ancestor !== document.body && ancestor !== document.documentElement) {\n const { overflowY } = window.getComputedStyle(ancestor)\n if (overflowY === 'hidden' || overflowY === 'clip') found.push(ancestor)\n ancestor = ancestor.parentElement\n }\n return found\n}\n\nconst visibleHeightOf = (host: HTMLElement): number => {\n let available = host.clientHeight\n const hostTop = host.getBoundingClientRect().top\n\n clippingAncestorsOf(host).forEach((ancestor) => {\n const rect = ancestor.getBoundingClientRect()\n // From wherever the host starts being visible down to where the ancestor stops showing anything.\n // Taking the ancestor's own top into account matters when the host begins above it: what is\n // scrolled or positioned off the top is just as unreachable as what falls off the bottom.\n const room = rect.bottom - Math.max(rect.top, hostTop)\n if (room > 0) available = Math.min(available, room)\n })\n\n return available\n}\n\n/**\n * Sizes the canvas to the room the host actually gives it, in two passes because the second answer\n * depends on the first: the height a picture wants follows from its width, but a frame with a\n * `max-height` only reveals how much of that it will show once something is in it.\n *\n * cropper.js v1 did the same dance with its `<img>`, and the point of it is that its cropper never\n * overflowed: a tall picture in a short frame was scaled down to fit rather than cut off at the\n * bottom, where the part of the crop hidden by `overflow: hidden` could not be reached again.\n */\nconst sizeCanvas = (canvas: CropperCanvas, host: HTMLElement, availableWidth: number): Size => {\n const size = canvasSizeFor(natural, availableWidth, MIN_CONTAINER_WIDTH, MIN_CONTAINER_HEIGHT)\n canvas.style.width = `${size.width}px`\n canvas.style.height = `${size.height}px`\n\n const visibleHeight = visibleHeightOf(host)\n if (visibleHeight > 0 && visibleHeight < size.height) {\n size.height = Math.max(visibleHeight, MIN_CONTAINER_HEIGHT)\n canvas.style.height = `${size.height}px`\n }\n return size\n}\n\nconst buildSelectionChildren = (selection: CropperSelection) => {\n const grid = create<CropperGrid>(CropperGrid.$name)\n grid.rows = 3\n grid.columns = 3\n grid.covered = true\n grid.themeColor = GRID_COLOR\n grid.setAttribute('role', 'grid')\n selection.appendChild(grid)\n\n const crosshair = create<CropperCrosshair>(CropperCrosshair.$name)\n crosshair.centered = true\n crosshair.themeColor = CROSSHAIR_COLOR\n selection.appendChild(crosshair)\n\n const face = create<CropperHandle>(CropperHandle.$name)\n face.action = 'move'\n face.themeColor = FACE_COLOR\n selection.appendChild(face)\n\n RESIZE_ACTIONS.forEach((action) => {\n const handle = create<CropperHandle>(CropperHandle.$name)\n handle.action = action\n handle.themeColor = SELECTION_COLOR\n selection.appendChild(handle)\n })\n}\n\nconst build = async () => {\n const token = ++buildToken\n teardown()\n loading.value = true\n\n const host = hostEl.value\n if (!host || !props.src) {\n // Nothing to wait for: leaving the spinner up would make an empty cropper look like a stuck one.\n loading.value = false\n return\n }\n\n const canvas = create<CropperCanvas>(CropperCanvas.$name)\n canvas.background = false\n canvas.themeColor = SELECTION_COLOR\n canvas.style.display = 'block'\n sizeCanvas(canvas, host, host.clientWidth)\n\n const image = create<CropperImage>(CropperImage.$name)\n image.alt = ''\n image.initialFit = 'contain'\n image.rotatable = false\n image.skewable = false\n image.translatable = false\n image.scalable = true\n image.src = props.src\n\n const shade = create<CropperShade>(CropperShade.$name)\n shade.themeColor = props.shadeColor\n // Kept out of the way until the first crop box exists, or it would flash across the whole canvas.\n shade.hidden = true\n\n const selectHandle = create<CropperHandle>(CropperHandle.$name)\n selectHandle.action = 'select'\n selectHandle.plain = true\n\n const selection = create<CropperSelection>(CropperSelection.$name)\n selection.themeColor = SELECTION_COLOR\n selection.movable = true\n selection.resizable = true\n selection.outlined = true\n // Keep sub-pixel values: rounding to whole canvas pixels would drift the natural-pixel crop data\n // that callers persist, and cropper.js v1 did not round either.\n selection.precise = true\n selection.aspectRatio = props.aspectRatio\n buildSelectionChildren(selection)\n\n // Listeners go on before anything is connected, so the action in flight is already known by the\n // time the elements' own handlers react to it.\n canvas.addEventListener('actionstart', onActionStart)\n canvas.addEventListener('action', onAction)\n canvas.addEventListener('actionend', onActionEnd)\n image.addEventListener('transform', onImageTransform)\n selection.addEventListener('change', onSelectionChange)\n\n canvas.append(image, shade, selectHandle, selection)\n // The whole tree is attached in one move on purpose: each element wires itself up to its siblings\n // when it connects, and the shade in particular goes looking for the selection. Appending the\n // children one at a time leaves it looking at an empty canvas, and it never follows the crop.\n host.appendChild(canvas)\n // Second pass, now that there is something in the host for its own constraints to act on.\n sizeCanvas(canvas, host, host.clientWidth)\n\n let loaded: HTMLImageElement\n try {\n // The element runs the one request there is; its promise carries the picture that arrived.\n loaded = await image.$ready()\n } catch {\n // Mirrors cropper.js v1, which simply never became ready on a broken source.\n canvas.remove()\n if (token === buildToken) loading.value = false\n return\n }\n if (token !== buildToken) {\n canvas.remove()\n return\n }\n\n parts = { canvas, image, selection }\n // Only now is the picture's own size known, so the canvas gets its real dimensions here rather\n // than from a second request made ahead of time purely to measure it.\n natural = { width: loaded.naturalWidth, height: loaded.naturalHeight }\n sizeCanvas(canvas, host, host.clientWidth)\n\n // A prop that changed while the picture was loading found the watchers with no elements to write\n // to. Re-reading the two that can vary closes that window; it is idempotent otherwise.\n shade.themeColor = props.shadeColor\n selection.aspectRatio = props.aspectRatio\n\n centerImage()\n\n laidOut = hostBox(host)\n observeAncestors(host)\n applyModelOrSeed()\n\n loading.value = false\n emit('ready')\n}\n\n/** Where the crop sits, as fractions of the image. */\nconst currentCrop = (): CropRect | null => {\n if (!parts) return null\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return null\n const rect = selectionRect()\n return {\n x: (rect.x - bounds.x) / bounds.width,\n y: (rect.y - bounds.y) / bounds.height,\n width: rect.width / bounds.width,\n height: rect.height / bounds.height,\n }\n}\n\n/** Puts a crop given in fractions onto the canvas, clamped to the picture. */\nconst applyCrop = (crop: CropRect) => {\n const bounds = imageBounds()\n if (!parts || bounds.width <= 0 || bounds.height <= 0) return\n applyRect(\n clampRectInside(\n {\n x: bounds.x + crop.x * bounds.width,\n y: bounds.y + crop.y * bounds.height,\n width: crop.width * bounds.width,\n height: crop.height * bounds.height,\n },\n constraintBounds(),\n props.aspectRatio\n )\n )\n}\n\nconst cropsAreClose = (a: CropRect | null, b: CropRect | null): boolean =>\n a !== null &&\n b !== null &&\n Math.abs(a.x - b.x) < 0.0005 &&\n Math.abs(a.y - b.y) < 0.0005 &&\n Math.abs(a.width - b.width) < 0.0005 &&\n Math.abs(a.height - b.height) < 0.0005\n\n/**\n * Hands the crop back up. Also called after the component itself has adjusted one — a stored region\n * rarely matches the configured ratio, and the binding should say where the crop really is rather\n * than where it was asked to be.\n */\nconst emitCrop = (alsoCommit = false) => {\n const crop = currentCrop()\n if (!crop) return\n if (alsoCommit || !cropsAreClose(crop, lastEmitted)) {\n lastEmitted = crop\n emit('update:modelValue', crop)\n }\n if (alsoCommit) emit('commit', crop)\n}\n\n/** The room the host has: its width, and the height that will actually be shown. */\nconst hostBox = (host: HTMLElement): Size => ({ width: host.clientWidth, height: visibleHeightOf(host) })\n\n/** Re-fit the image to the new container while keeping the crop the user already chose. */\nconst relayout = () => {\n const host = hostEl.value\n if (!parts || !host) return\n // A crop of no size means the last layout had none either — fall back to the bound one, which is\n // what a cropper built inside a closed panel has been holding all along.\n const wanted = currentCrop() ?? props.modelValue\n\n const size = sizeCanvas(parts.canvas, host, host.clientWidth)\n laidOut = hostBox(host)\n // Re-read the ancestors as well: a cropper can be moved between frames, and the one clipping it\n // now is the one whose height matters.\n observeAncestors(host)\n centerImage()\n if (size.width <= 0 || size.height <= 0) return\n\n if (wanted && wanted.width > 0) applyCrop(wanted)\n else applyModelOrSeed()\n emitCrop()\n}\n\nconst onHostBoxChanged = () => {\n const host = hostEl.value\n if (!host) return\n const box = hostBox(host)\n if (box.width <= 0 || box.height <= 0) return\n // Compared against the box the current layout was built for, so a size seen while the cropper was\n // still loading cannot be mistaken for one that has already been laid out.\n if (box.width === laidOut.width && box.height === laidOut.height) return\n if (!parts) return\n // Deferred a frame: resizing the canvas from inside the observer's own callback is what makes\n // Chromium report an undelivered-notification loop.\n requestAnimationFrame(() => relayout())\n}\n\n// Height counts as much as width: the DAM sizes the cropper with `calc(100vh - 160px)`, so a\n// shorter window shrinks the frame without touching its width.\nuseResizeObserver(hostEl, onHostBoxChanged)\n\n/** An ancestor that clips can change how much it shows without the host's own box moving at all. */\nconst observeAncestors = (host: HTMLElement) => {\n ancestorObserver?.disconnect()\n const ancestors = clippingAncestorsOf(host)\n if (ancestors.length === 0) {\n ancestorObserver = null\n return\n }\n ancestorObserver = new ResizeObserver(onHostBoxChanged)\n ancestors.forEach((ancestor) => ancestorObserver?.observe(ancestor))\n}\n\nwatch(\n () => props.src,\n () => {\n build()\n }\n)\n\nwatch(\n () => props.modelValue,\n (model) => {\n // Ignore the echo of what this component just handed up, or the two would write to each other\n // for as long as the parent keeps binding it back.\n if (!parts || !model || cropsAreClose(model, lastEmitted)) return\n applyCrop(model)\n emitCrop()\n },\n { deep: true }\n)\n\nwatch(\n () => props.shadeColor,\n (shadeColor) => {\n const shade = parts?.canvas.querySelector<CropperShade>(CropperShade.$name)\n if (shade) shade.themeColor = shadeColor\n }\n)\n\nwatch(\n () => props.aspectRatio,\n (aspectRatio) => {\n if (!parts) return\n parts.selection.aspectRatio = aspectRatio\n if (!isUsableAspectRatio(aspectRatio)) return\n const current = selectionRect()\n applyRect(clampRectInside({ ...current, height: current.width / aspectRatio }, constraintBounds(), aspectRatio))\n }\n)\n\nonMounted(() => {\n build()\n})\n\nonBeforeUnmount(() => {\n buildToken += 1\n teardown()\n})\n</script>\n\n<template>\n <div class=\"a-cropper d-flex flex-column\">\n <div\n v-if=\"loading\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular\n class=\"position-absolute\"\n indeterminate\n />\n </div>\n\n <div\n ref=\"hostEl\"\n class=\"a-cropper__container\"\n :style=\"containerStyle\"\n @wheel.capture=\"onWheelCapture\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n// `cropper-crosshair` sizes itself in `em`, so without a size of its own the centre marker would\n// grow and shrink with whatever font the surrounding admin happens to use. 7px is the plus sign\n// cropper.js v1 drew through `.cropper-center`.\n.a-cropper cropper-crosshair {\n font-size: 7px;\n}\n\n// cropper.js v1 drew a `.cropper-line` along each edge of the crop box: a 5px band of the selection\n// colour at a tenth opacity, sitting 3px outside the border and 2px inside it. It is what made the\n// thin outline read as a grabbable edge, so it is drawn here too — as a pair of shadows rather than\n// four elements, which keeps it independent of how the v2 grips happen to be sized.\n.a-cropper cropper-selection[outlined] {\n box-shadow:\n inset 0 0 0 2px rgb(51 153 255 / 10%),\n 0 0 0 3px rgb(51 153 255 / 10%);\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"ACropper.js","names":["_sfc_main","ACropper_vue_vue_type_script_setup_true_lang_default","ACropper_default"],"sources":["../../../../../src/domains/dam/cropper/components/ACropper.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from 'vue'\nimport { useResizeObserver } from '@vueuse/core'\nimport {\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n} from 'cropperjs'\nimport {\n canvasSizeFor,\n clampRectInside,\n initialSelectionRect,\n isUsableAspectRatio,\n RESIZE_ANCHORS,\n rectsAreClose,\n type Rect,\n type Size,\n} from '@/domains/dam/cropper/utils/cropperGeometry'\nimport type { CropRect } from '@/domains/dam/cropper/utils/cropperTypes'\n\n/**\n * Image cropper built on cropper.js v2's custom elements, replacing the v1-based `ACropperjs`.\n *\n * It lives here, beside `DamAssetImageRoiSelect`, because that is the only thing that uses it and\n * nothing outside this library does. It is not exported: shaping it to one need rather than to a\n * general audience is what keeps it to its size.\n *\n * The crop is bound, not fetched: `v-model` carries it as fractions of the image, and `commit` says\n * the user has finished a gesture. There is no imperative surface — the one thing a host wants to do\n * with a cropper is know where the crop is, and a binding says that better than six methods did.\n *\n * The elements are assembled in script rather than in the template on purpose: a consumer of this\n * library does not configure `isCustomElement` in their own build, and setting element *properties*\n * instead of going through attribute strings avoids the coercion surprises (`NaN`, booleans,\n * fractional numbers) that come with the attribute round-trip.\n */\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n /** The crop, as fractions of the image. Leave it null to start from the default box. */\n modelValue?: CropRect | null\n /** `NaN` (the default) leaves the crop free-form. */\n aspectRatio?: number\n containerStyle?: { [key: string]: string } | undefined\n /** Wash over everything outside the crop — the replacement for overriding `.cropper-modal`. */\n shadeColor?: string\n }>(),\n {\n src: '',\n modelValue: null,\n aspectRatio: NaN,\n containerStyle: undefined,\n shadeColor: 'rgba(0, 0, 0, 0.5)',\n }\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', crop: CropRect): void\n /** The user has finished a gesture; the crop is worth saving. */\n (event: 'commit', crop: CropRect): void\n (event: 'ready'): void\n}>()\n\n// cropper.js registers its elements as a side effect of loading its entry, and this package's\n// `sideEffects` lets the consumer's bundler drop that module once only the classes are used. `$define`\n// is a no-op for an element that is already registered.\nfor (const element of [\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n]) {\n element.$define()\n}\n\n/**\n * Settings the one caller never varies, kept as constants rather than as props nobody passes.\n * Each of them is behaviour, not preference: no checkerboard behind a photograph, the wheel left to\n * the page, pinch zoom kept for tablets, and the minimum canvas cropper.js' own stylesheet declares.\n */\nconst AUTO_CROP_AREA = 0.8\nconst MIN_CONTAINER_WIDTH = 200\nconst MIN_CONTAINER_HEIGHT = 100\n\n// Matched to cropper.js v1's stylesheet so the two components are indistinguishable side by side.\nconst SELECTION_COLOR = 'rgba(51, 153, 255, 0.75)'\nconst FACE_COLOR = 'rgba(255, 255, 255, 0.1)'\nconst GRID_COLOR = 'rgba(238, 238, 238, 0.5)'\nconst CROSSHAIR_COLOR = 'rgba(238, 238, 238, 0.75)'\nconst RESIZE_ACTIONS = [\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n]\n\ninterface CropperParts {\n canvas: CropperCanvas\n image: CropperImage\n selection: CropperSelection\n}\n\nconst hostEl = useTemplateRef<HTMLDivElement>('hostEl')\nconst loading = ref(true)\n\nlet parts: CropperParts | null = null\nlet natural: Size = { width: 0, height: 0 }\n/** The action cropper.js is currently performing, so a clamp knows which edge to hold still. */\nlet currentAction: string | null = null\n/** Guards the re-entrant `$change` a clamp performs from being clamped again. */\nlet clamping = false\n/** Guards the half-applied transforms `$center` emits between its move and its scale. */\nlet centring = false\n/** Invalidates an in-flight build when `src` changes or the component goes away mid-load. */\nlet buildToken = 0\n/** The host box the current layout was computed for — not merely the last one observed. */\nlet laidOut: Size = { width: 0, height: 0 }\n/** The last crop handed out, so a model written straight back is not mistaken for a new one. */\nlet lastEmitted: CropRect | null = null\n/** Watches the ancestors that clip the host; their height is part of the room it has. */\nlet ancestorObserver: ResizeObserver | null = null\n\nconst create = <T extends HTMLElement>(name: string): T => document.createElement(name) as T\n\n/** The image box in canvas coordinates. Read from layout so panning and zooming stay accounted for. */\nconst imageBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const canvasRect = parts.canvas.getBoundingClientRect()\n const imageRect = parts.image.getBoundingClientRect()\n return {\n x: imageRect.left - canvasRect.left,\n y: imageRect.top - canvasRect.top,\n width: imageRect.width,\n height: imageRect.height,\n }\n}\n\n/**\n * Where the crop is allowed to be: the image, but never outside the visible canvas. The two are the\n * same box until the image is zoomed past its frame, and then it is the frame that wins — cropper.js\n * v1 limited its crop box to the canvas and the container both, so a zoomed-in image never let the\n * crop wander off the part of it you could actually see.\n */\nconst constraintBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const image = imageBounds()\n const canvas = parts.canvas.getBoundingClientRect()\n const left = Math.max(image.x, 0)\n const top = Math.max(image.y, 0)\n const right = Math.min(image.x + image.width, canvas.width)\n const bottom = Math.min(image.y + image.height, canvas.height)\n return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) }\n}\n\nconst selectionRect = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const { x, y, width, height } = parts.selection\n return { x, y, width, height }\n}\n\nconst applyRect = (rect: Rect) => {\n if (!parts) return\n clamping = true\n parts.selection.$change(rect.x, rect.y, rect.width, rect.height, props.aspectRatio, true)\n clamping = false\n}\n\n/**\n * Re-fits the image to the canvas. cropper.js only lets `$center` scale and move an image that is\n * marked scalable and translatable — it grants itself that permission while the image is still\n * loading, but not afterwards — so the flags are lifted for the call and put back straight after.\n */\nconst centerImage = () => {\n if (!parts) return\n const { image } = parts\n const { scalable, translatable } = image\n centring = true\n image.scalable = true\n image.translatable = true\n image.$center('contain')\n image.scalable = scalable\n image.translatable = translatable\n centring = false\n}\n\n/**\n * The crop a fresh picture starts with. Computed here rather than handed to cropper.js'\n * `initialCoverage`, whose deferred initialisation would land *after* a `ready` handler had already\n * positioned the crop. It is measured against the image rather than the canvas, which are the same\n * box for a source wider than its container and are not once the image sits centred between margins.\n */\nconst seedInitialCrop = () => {\n if (!parts) return\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return\n const initial = initialSelectionRect(bounds, props.aspectRatio, AUTO_CROP_AREA)\n applyRect({ ...initial, x: initial.x + bounds.x, y: initial.y + bounds.y })\n}\n\n/** Uses the bound crop if there is one, and the default box if there is not. */\nconst applyModelOrSeed = () => {\n const model = props.modelValue\n if (model && model.width > 0 && model.height > 0) applyCrop(model)\n else seedInitialCrop()\n emitCrop()\n}\n\n/** Pulls the selection back inside the image after something moved the image out from under it. */\nconst refit = () => {\n if (!parts || centring) return\n const current = selectionRect()\n if (current.width <= 0 || current.height <= 0) return\n const fitted = clampRectInside(current, constraintBounds(), props.aspectRatio)\n if (!rectsAreClose(current, fitted)) applyRect(fitted)\n}\n\nconst onSelectionChange = (event: Event) => {\n if (clamping || !parts) return\n const detail = (event as CustomEvent<Rect>).detail\n if (!detail) return\n // cropper.js reverses the action when a grip is dragged through the opposite edge, and it records\n // that on the canvas just before emitting this event — one move ahead of the `action` event the\n // tracking below sees. Prefer its own answer, and fall back if a future version stops publishing it.\n const liveAction = (parts.canvas as unknown as { $action?: unknown }).$action\n const action = typeof liveAction === 'string' && liveAction ? liveAction : currentAction\n const anchor = action ? RESIZE_ANCHORS[action] : undefined\n const clamped = clampRectInside(detail, constraintBounds(), props.aspectRatio, anchor)\n if (rectsAreClose(detail, clamped)) return\n // Rejecting the change and re-issuing the clamped one is what keeps the crop sliding along the\n // border instead of freezing there; the shade reads `defaultPrevented` and follows the new values.\n event.preventDefault()\n applyRect(clamped)\n}\n\nconst onActionStart = (event: Event) => {\n currentAction = (event as CustomEvent<{ action?: string }>).detail?.action ?? null\n}\n\nconst onAction = (event: Event) => {\n const action = (event as CustomEvent<{ action?: string }>).detail?.action\n // cropper.js turns a fresh \"select\" drag into the matching corner resize once it knows the\n // direction, and reports the new action on the next move — follow it so the anchor stays right.\n if (action) currentAction = action\n}\n\nconst onActionEnd = () => {\n currentAction = null\n emitCrop(true)\n}\n\n/**\n * The canvas must never see a wheel event: its own handler calls `preventDefault()` unconditionally,\n * which would swallow page scrolling over the picture the way cropper.js v1 never did. Pinching is\n * unaffected — that arrives as pointer events, and the picture stays scalable for it.\n */\nconst onWheelCapture = (event: WheelEvent) => {\n event.stopPropagation()\n}\n\n/**\n * cropper.js emits `transform` *before* it writes the new matrix to the element's style (it sets the\n * new transform to measure the result, puts the old one back, then emits and finally commits). Re-\n * fitting straight away would therefore measure the image as it was: after a zoom out the crop would\n * be judged against the larger, previous picture and left hanging over the edge of the new one.\n */\nconst onImageTransform = () => queueMicrotask(refit)\n\nconst teardown = () => {\n if (parts) {\n const { canvas, image, selection } = parts\n selection.removeEventListener('change', onSelectionChange)\n canvas.removeEventListener('actionstart', onActionStart)\n canvas.removeEventListener('action', onAction)\n canvas.removeEventListener('actionend', onActionEnd)\n image.removeEventListener('transform', onImageTransform)\n }\n // Every canvas, not just the one on `parts`: a build that was superseded while still waiting on\n // its image has already put one in the DOM and has nothing tracking it yet.\n hostEl.value?.querySelectorAll(CropperCanvas.$name).forEach((canvas) => {\n // Disconnecting a `cropper-image` drops its listeners but leaves its request running, and the\n // `$ready()` promise waiting on it keeps this component reachable until the server answers.\n canvas.querySelectorAll<CropperImage>(CropperImage.$name).forEach((image) => {\n if (image.$image) image.$image.src = ''\n })\n canvas.remove()\n })\n ancestorObserver?.disconnect()\n ancestorObserver = null\n parts = null\n natural = { width: 0, height: 0 }\n laidOut = { width: 0, height: 0 }\n currentAction = null\n}\n\n/**\n * How much of the host's height will actually be shown.\n *\n * The host's own `max-height` is the usual answer, and the one `DamAssetImageRoiSelect` relies on.\n * Ancestors count too when they clip with `overflow: hidden` — what they cut off cannot be scrolled\n * back into view, so it is no more reachable than the host's own overflow. An ancestor that\n * scrolls is left alone: there the rest of the picture is a scroll away, not gone.\n */\nconst clippingAncestorsOf = (host: HTMLElement): HTMLElement[] => {\n const found: HTMLElement[] = []\n let ancestor = host.parentElement\n while (ancestor && ancestor !== document.body && ancestor !== document.documentElement) {\n const { overflowY } = window.getComputedStyle(ancestor)\n if (overflowY === 'hidden' || overflowY === 'clip') found.push(ancestor)\n ancestor = ancestor.parentElement\n }\n return found\n}\n\nconst visibleHeightOf = (host: HTMLElement): number => {\n let available = host.clientHeight\n const hostTop = host.getBoundingClientRect().top\n\n clippingAncestorsOf(host).forEach((ancestor) => {\n const rect = ancestor.getBoundingClientRect()\n // From wherever the host starts being visible down to where the ancestor stops showing anything.\n // Taking the ancestor's own top into account matters when the host begins above it: what is\n // scrolled or positioned off the top is just as unreachable as what falls off the bottom.\n const room = rect.bottom - Math.max(rect.top, hostTop)\n if (room > 0) available = Math.min(available, room)\n })\n\n return available\n}\n\n/**\n * Sizes the canvas to the room the host actually gives it, in two passes because the second answer\n * depends on the first: the height a picture wants follows from its width, but a frame with a\n * `max-height` only reveals how much of that it will show once something is in it.\n *\n * cropper.js v1 did the same dance with its `<img>`, and the point of it is that its cropper never\n * overflowed: a tall picture in a short frame was scaled down to fit rather than cut off at the\n * bottom, where the part of the crop hidden by `overflow: hidden` could not be reached again.\n */\nconst sizeCanvas = (canvas: CropperCanvas, host: HTMLElement, availableWidth: number): Size => {\n const size = canvasSizeFor(natural, availableWidth, MIN_CONTAINER_WIDTH, MIN_CONTAINER_HEIGHT)\n canvas.style.width = `${size.width}px`\n canvas.style.height = `${size.height}px`\n\n const visibleHeight = visibleHeightOf(host)\n if (visibleHeight > 0 && visibleHeight < size.height) {\n size.height = Math.max(visibleHeight, MIN_CONTAINER_HEIGHT)\n canvas.style.height = `${size.height}px`\n }\n return size\n}\n\nconst buildSelectionChildren = (selection: CropperSelection) => {\n const grid = create<CropperGrid>(CropperGrid.$name)\n grid.rows = 3\n grid.columns = 3\n grid.covered = true\n grid.themeColor = GRID_COLOR\n grid.setAttribute('role', 'grid')\n selection.appendChild(grid)\n\n const crosshair = create<CropperCrosshair>(CropperCrosshair.$name)\n crosshair.centered = true\n crosshair.themeColor = CROSSHAIR_COLOR\n selection.appendChild(crosshair)\n\n const face = create<CropperHandle>(CropperHandle.$name)\n face.action = 'move'\n face.themeColor = FACE_COLOR\n selection.appendChild(face)\n\n RESIZE_ACTIONS.forEach((action) => {\n const handle = create<CropperHandle>(CropperHandle.$name)\n handle.action = action\n handle.themeColor = SELECTION_COLOR\n selection.appendChild(handle)\n })\n}\n\nconst build = async () => {\n const token = ++buildToken\n teardown()\n loading.value = true\n\n const host = hostEl.value\n if (!host || !props.src) {\n // Nothing to wait for: leaving the spinner up would make an empty cropper look like a stuck one.\n loading.value = false\n return\n }\n\n const canvas = create<CropperCanvas>(CropperCanvas.$name)\n canvas.background = false\n canvas.themeColor = SELECTION_COLOR\n canvas.style.display = 'block'\n sizeCanvas(canvas, host, host.clientWidth)\n\n const image = create<CropperImage>(CropperImage.$name)\n image.alt = ''\n image.initialFit = 'contain'\n image.rotatable = false\n image.skewable = false\n image.translatable = false\n image.scalable = true\n image.src = props.src\n\n const shade = create<CropperShade>(CropperShade.$name)\n shade.themeColor = props.shadeColor\n // Kept out of the way until the first crop box exists, or it would flash across the whole canvas.\n shade.hidden = true\n\n const selectHandle = create<CropperHandle>(CropperHandle.$name)\n selectHandle.action = 'select'\n selectHandle.plain = true\n\n const selection = create<CropperSelection>(CropperSelection.$name)\n selection.themeColor = SELECTION_COLOR\n selection.movable = true\n selection.resizable = true\n selection.outlined = true\n // Keep sub-pixel values: rounding to whole canvas pixels would drift the natural-pixel crop data\n // that callers persist, and cropper.js v1 did not round either.\n selection.precise = true\n selection.aspectRatio = props.aspectRatio\n buildSelectionChildren(selection)\n\n // Listeners go on before anything is connected, so the action in flight is already known by the\n // time the elements' own handlers react to it.\n canvas.addEventListener('actionstart', onActionStart)\n canvas.addEventListener('action', onAction)\n canvas.addEventListener('actionend', onActionEnd)\n image.addEventListener('transform', onImageTransform)\n selection.addEventListener('change', onSelectionChange)\n\n canvas.append(image, shade, selectHandle, selection)\n // The whole tree is attached in one move on purpose: each element wires itself up to its siblings\n // when it connects, and the shade in particular goes looking for the selection. Appending the\n // children one at a time leaves it looking at an empty canvas, and it never follows the crop.\n host.appendChild(canvas)\n // Second pass, now that there is something in the host for its own constraints to act on.\n sizeCanvas(canvas, host, host.clientWidth)\n\n let loaded: HTMLImageElement\n try {\n // The element runs the one request there is; its promise carries the picture that arrived.\n loaded = await image.$ready()\n } catch {\n // Mirrors cropper.js v1, which simply never became ready on a broken source.\n canvas.remove()\n if (token === buildToken) loading.value = false\n return\n }\n if (token !== buildToken) {\n canvas.remove()\n return\n }\n\n parts = { canvas, image, selection }\n // Only now is the picture's own size known, so the canvas gets its real dimensions here rather\n // than from a second request made ahead of time purely to measure it.\n natural = { width: loaded.naturalWidth, height: loaded.naturalHeight }\n sizeCanvas(canvas, host, host.clientWidth)\n\n // A prop that changed while the picture was loading found the watchers with no elements to write\n // to. Re-reading the two that can vary closes that window; it is idempotent otherwise.\n shade.themeColor = props.shadeColor\n selection.aspectRatio = props.aspectRatio\n\n centerImage()\n\n laidOut = hostBox(host)\n observeAncestors(host)\n applyModelOrSeed()\n\n loading.value = false\n emit('ready')\n}\n\n/** Where the crop sits, as fractions of the image. */\nconst currentCrop = (): CropRect | null => {\n if (!parts) return null\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return null\n const rect = selectionRect()\n return {\n x: (rect.x - bounds.x) / bounds.width,\n y: (rect.y - bounds.y) / bounds.height,\n width: rect.width / bounds.width,\n height: rect.height / bounds.height,\n }\n}\n\n/** Puts a crop given in fractions onto the canvas, clamped to the picture. */\nconst applyCrop = (crop: CropRect) => {\n const bounds = imageBounds()\n if (!parts || bounds.width <= 0 || bounds.height <= 0) return\n applyRect(\n clampRectInside(\n {\n x: bounds.x + crop.x * bounds.width,\n y: bounds.y + crop.y * bounds.height,\n width: crop.width * bounds.width,\n height: crop.height * bounds.height,\n },\n constraintBounds(),\n props.aspectRatio\n )\n )\n}\n\nconst cropsAreClose = (a: CropRect | null, b: CropRect | null): boolean =>\n a !== null &&\n b !== null &&\n Math.abs(a.x - b.x) < 0.0005 &&\n Math.abs(a.y - b.y) < 0.0005 &&\n Math.abs(a.width - b.width) < 0.0005 &&\n Math.abs(a.height - b.height) < 0.0005\n\n/**\n * Hands the crop back up. Also called after the component itself has adjusted one — a stored region\n * rarely matches the configured ratio, and the binding should say where the crop really is rather\n * than where it was asked to be.\n */\nconst emitCrop = (alsoCommit = false) => {\n const crop = currentCrop()\n if (!crop) return\n if (alsoCommit || !cropsAreClose(crop, lastEmitted)) {\n lastEmitted = crop\n emit('update:modelValue', crop)\n }\n if (alsoCommit) emit('commit', crop)\n}\n\n/** The room the host has: its width, and the height that will actually be shown. */\nconst hostBox = (host: HTMLElement): Size => ({ width: host.clientWidth, height: visibleHeightOf(host) })\n\n/** Re-fit the image to the new container while keeping the crop the user already chose. */\nconst relayout = () => {\n const host = hostEl.value\n if (!parts || !host) return\n // A crop of no size means the last layout had none either — fall back to the bound one, which is\n // what a cropper built inside a closed panel has been holding all along.\n const wanted = currentCrop() ?? props.modelValue\n\n const size = sizeCanvas(parts.canvas, host, host.clientWidth)\n laidOut = hostBox(host)\n // Re-read the ancestors as well: a cropper can be moved between frames, and the one clipping it\n // now is the one whose height matters.\n observeAncestors(host)\n centerImage()\n if (size.width <= 0 || size.height <= 0) return\n\n if (wanted && wanted.width > 0) applyCrop(wanted)\n else applyModelOrSeed()\n emitCrop()\n}\n\nconst onHostBoxChanged = () => {\n const host = hostEl.value\n if (!host) return\n const box = hostBox(host)\n if (box.width <= 0 || box.height <= 0) return\n // Compared against the box the current layout was built for, so a size seen while the cropper was\n // still loading cannot be mistaken for one that has already been laid out.\n if (box.width === laidOut.width && box.height === laidOut.height) return\n if (!parts) return\n // Deferred a frame: resizing the canvas from inside the observer's own callback is what makes\n // Chromium report an undelivered-notification loop.\n requestAnimationFrame(() => relayout())\n}\n\n// Height counts as much as width: the DAM sizes the cropper with `calc(100vh - 160px)`, so a\n// shorter window shrinks the frame without touching its width.\nuseResizeObserver(hostEl, onHostBoxChanged)\n\n/** An ancestor that clips can change how much it shows without the host's own box moving at all. */\nconst observeAncestors = (host: HTMLElement) => {\n ancestorObserver?.disconnect()\n const ancestors = clippingAncestorsOf(host)\n if (ancestors.length === 0) {\n ancestorObserver = null\n return\n }\n ancestorObserver = new ResizeObserver(onHostBoxChanged)\n ancestors.forEach((ancestor) => ancestorObserver?.observe(ancestor))\n}\n\nwatch(\n () => props.src,\n () => {\n build()\n }\n)\n\nwatch(\n () => props.modelValue,\n (model) => {\n // Ignore the echo of what this component just handed up, or the two would write to each other\n // for as long as the parent keeps binding it back.\n if (!parts || !model || cropsAreClose(model, lastEmitted)) return\n applyCrop(model)\n emitCrop()\n },\n { deep: true }\n)\n\nwatch(\n () => props.shadeColor,\n (shadeColor) => {\n const shade = parts?.canvas.querySelector<CropperShade>(CropperShade.$name)\n if (shade) shade.themeColor = shadeColor\n }\n)\n\nwatch(\n () => props.aspectRatio,\n (aspectRatio) => {\n if (!parts) return\n parts.selection.aspectRatio = aspectRatio\n if (!isUsableAspectRatio(aspectRatio)) return\n const current = selectionRect()\n applyRect(clampRectInside({ ...current, height: current.width / aspectRatio }, constraintBounds(), aspectRatio))\n }\n)\n\nonMounted(() => {\n build()\n})\n\nonBeforeUnmount(() => {\n buildToken += 1\n teardown()\n})\n</script>\n\n<template>\n <div class=\"a-cropper d-flex flex-column\">\n <div\n v-if=\"loading\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular\n class=\"position-absolute\"\n indeterminate\n />\n </div>\n\n <div\n ref=\"hostEl\"\n class=\"a-cropper__container\"\n :style=\"containerStyle\"\n @wheel.capture=\"onWheelCapture\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n// `cropper-crosshair` sizes itself in `em`, so without a size of its own the centre marker would\n// grow and shrink with whatever font the surrounding admin happens to use. 7px is the plus sign\n// cropper.js v1 drew through `.cropper-center`.\n.a-cropper cropper-crosshair {\n font-size: 7px;\n}\n\n// cropper.js v1 drew a `.cropper-line` along each edge of the crop box: a 5px band of the selection\n// colour at a tenth opacity, sitting 3px outside the border and 2px inside it. It is what made the\n// thin outline read as a grabbable edge, so it is drawn here too — as a pair of shadows rather than\n// four elements, which keeps it independent of how the v2 grips happen to be sized.\n.a-cropper cropper-selection[outlined] {\n box-shadow:\n inset 0 0 0 2px rgb(51 153 255 / 10%),\n 0 0 0 3px rgb(51 153 255 / 10%);\n}\n</style>\n"],"mappings":""}
@@ -5,12 +5,12 @@ import r from "../../../../vendor/@cropper/element-handle/dist/element-handle.es
5
5
  import i from "../../../../vendor/@cropper/element-selection/dist/element-selection.esm.raw.js";
6
6
  import a from "../../../../vendor/@cropper/element-grid/dist/element-grid.esm.raw.js";
7
7
  import o from "../../../../vendor/@cropper/element-crosshair/dist/element-crosshair.esm.raw.js";
8
- import "../../../../vendor/cropperjs2/dist/cropper.esm.raw.js";
8
+ import "../../../../vendor/cropperjs/dist/cropper.esm.raw.js";
9
9
  import { RESIZE_ANCHORS as s, canvasSizeFor as c, clampRectInside as l, initialSelectionRect as u, isUsableAspectRatio as d, rectsAreClose as f } from "../utils/cropperGeometry.js";
10
10
  import { createCommentVNode as ee, createElementBlock as p, createElementVNode as te, createVNode as ne, defineComponent as m, normalizeStyle as re, onBeforeUnmount as ie, onMounted as ae, openBlock as h, ref as oe, useTemplateRef as se, watch as g } from "vue";
11
11
  import { useResizeObserver as ce } from "@vueuse/core";
12
12
  import { VProgressCircular as le } from "vuetify/components/VProgressCircular";
13
- //#region src/domains/dam/cropper/components/ACropper.vue?vue&type=script&setup=true&lang.ts
13
+ // src/domains/dam/cropper/components/ACropper.vue?vue&type=script&setup=true&lang.ts
14
14
  var ue = { class: "a-cropper d-flex flex-column" }, de = {
15
15
  key: 0,
16
16
  class: "d-flex w-100 align-center justify-center"
@@ -285,7 +285,6 @@ var ue = { class: "a-cropper d-flex flex-column" }, de = {
285
285
  }, null, 36)]));
286
286
  }
287
287
  });
288
- //#endregion
289
288
  export { y as default };
290
289
 
291
290
  //# sourceMappingURL=ACropper.vue_vue_type_script_setup_true_lang.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ACropper.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_component_VProgressCircular","_createCommentVNode","_createElementVNode","_normalizeStyle","CropperCanvas","CropperImage","CropperShade","CropperHandle","CropperSelection","CropperGrid","CropperCrosshair","_hoisted_1","_hoisted_2","AUTO_CROP_AREA","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","SELECTION_COLOR","FACE_COLOR","GRID_COLOR","CROSSHAIR_COLOR","ACropper_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","element","RESIZE_ACTIONS","hostEl","useTemplateRef","loading","ref","parts","natural","currentAction","clamping","centring","buildToken","laidOut","lastEmitted","ancestorObserver","create","name","imageBounds","canvasRect","imageRect","constraintBounds","image","canvas","left","top","right","bottom","selectionRect","applyRect","rect","centerImage","scalable","translatable","seedInitialCrop","bounds","initial","initialSelectionRect","applyModelOrSeed","model","applyCrop","emitCrop","refit","current","fitted","clampRectInside","rectsAreClose","onSelectionChange","detail","event","liveAction","action","anchor","RESIZE_ANCHORS","clamped","onActionStart","onAction","onActionEnd","onWheelCapture","onImageTransform","teardown","selection","clippingAncestorsOf","found","ancestor","host","overflowY","visibleHeightOf","available","hostTop","room","sizeCanvas","size","canvasSizeFor","availableWidth","visibleHeight","buildSelectionChildren","grid","crosshair","face","handle","build","token","shade","selectHandle","loaded","hostBox","observeAncestors","currentCrop","crop","cropsAreClose","a","b","alsoCommit","relayout","wanted","onHostBoxChanged","box","ancestors","watch","shadeColor","aspectRatio","isUsableAspectRatio","onMounted","onBeforeUnmount","openBlock","createElementBlock","createVNode","VProgressCircular","createCommentVNode","createElementVNode","normalizeStyle"],"sources":["../../../../../src/domains/dam/cropper/components/ACropper.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from 'vue'\nimport { useResizeObserver } from '@vueuse/core'\nimport {\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n} from 'cropperjs2'\nimport {\n canvasSizeFor,\n clampRectInside,\n initialSelectionRect,\n isUsableAspectRatio,\n RESIZE_ANCHORS,\n rectsAreClose,\n type Rect,\n type Size,\n} from '@/domains/dam/cropper/utils/cropperGeometry'\nimport type { CropRect } from '@/domains/dam/cropper/utils/cropperTypes'\n\n/**\n * Image cropper built on cropper.js v2's custom elements, replacing the v1-based `ACropperjs`.\n *\n * It lives here, beside `DamAssetImageRoiSelect`, because that is the only thing that uses it and\n * nothing outside this library does. It is not exported: shaping it to one need rather than to a\n * general audience is what keeps it to its size.\n *\n * The crop is bound, not fetched: `v-model` carries it as fractions of the image, and `commit` says\n * the user has finished a gesture. There is no imperative surface — the one thing a host wants to do\n * with a cropper is know where the crop is, and a binding says that better than six methods did.\n *\n * The elements are assembled in script rather than in the template on purpose: a consumer of this\n * library does not configure `isCustomElement` in their own build, and setting element *properties*\n * instead of going through attribute strings avoids the coercion surprises (`NaN`, booleans,\n * fractional numbers) that come with the attribute round-trip.\n */\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n /** The crop, as fractions of the image. Leave it null to start from the default box. */\n modelValue?: CropRect | null\n /** `NaN` (the default) leaves the crop free-form. */\n aspectRatio?: number\n containerStyle?: { [key: string]: string } | undefined\n /** Wash over everything outside the crop — the replacement for overriding `.cropper-modal`. */\n shadeColor?: string\n }>(),\n {\n src: '',\n modelValue: null,\n aspectRatio: NaN,\n containerStyle: undefined,\n shadeColor: 'rgba(0, 0, 0, 0.5)',\n }\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', crop: CropRect): void\n /** The user has finished a gesture; the crop is worth saving. */\n (event: 'commit', crop: CropRect): void\n (event: 'ready'): void\n}>()\n\n// cropper.js registers its elements as a side effect of loading its entry, and this package's\n// `sideEffects` lets the consumer's bundler drop that module once only the classes are used. `$define`\n// is a no-op for an element that is already registered.\nfor (const element of [\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n]) {\n element.$define()\n}\n\n/**\n * Settings the one caller never varies, kept as constants rather than as props nobody passes.\n * Each of them is behaviour, not preference: no checkerboard behind a photograph, the wheel left to\n * the page, pinch zoom kept for tablets, and the minimum canvas cropper.js' own stylesheet declares.\n */\nconst AUTO_CROP_AREA = 0.8\nconst MIN_CONTAINER_WIDTH = 200\nconst MIN_CONTAINER_HEIGHT = 100\n\n// Matched to cropper.js v1's stylesheet so the two components are indistinguishable side by side.\nconst SELECTION_COLOR = 'rgba(51, 153, 255, 0.75)'\nconst FACE_COLOR = 'rgba(255, 255, 255, 0.1)'\nconst GRID_COLOR = 'rgba(238, 238, 238, 0.5)'\nconst CROSSHAIR_COLOR = 'rgba(238, 238, 238, 0.75)'\nconst RESIZE_ACTIONS = [\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n]\n\ninterface CropperParts {\n canvas: CropperCanvas\n image: CropperImage\n selection: CropperSelection\n}\n\nconst hostEl = useTemplateRef<HTMLDivElement>('hostEl')\nconst loading = ref(true)\n\nlet parts: CropperParts | null = null\nlet natural: Size = { width: 0, height: 0 }\n/** The action cropper.js is currently performing, so a clamp knows which edge to hold still. */\nlet currentAction: string | null = null\n/** Guards the re-entrant `$change` a clamp performs from being clamped again. */\nlet clamping = false\n/** Guards the half-applied transforms `$center` emits between its move and its scale. */\nlet centring = false\n/** Invalidates an in-flight build when `src` changes or the component goes away mid-load. */\nlet buildToken = 0\n/** The host box the current layout was computed for — not merely the last one observed. */\nlet laidOut: Size = { width: 0, height: 0 }\n/** The last crop handed out, so a model written straight back is not mistaken for a new one. */\nlet lastEmitted: CropRect | null = null\n/** Watches the ancestors that clip the host; their height is part of the room it has. */\nlet ancestorObserver: ResizeObserver | null = null\n\nconst create = <T extends HTMLElement>(name: string): T => document.createElement(name) as T\n\n/** The image box in canvas coordinates. Read from layout so panning and zooming stay accounted for. */\nconst imageBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const canvasRect = parts.canvas.getBoundingClientRect()\n const imageRect = parts.image.getBoundingClientRect()\n return {\n x: imageRect.left - canvasRect.left,\n y: imageRect.top - canvasRect.top,\n width: imageRect.width,\n height: imageRect.height,\n }\n}\n\n/**\n * Where the crop is allowed to be: the image, but never outside the visible canvas. The two are the\n * same box until the image is zoomed past its frame, and then it is the frame that wins — cropper.js\n * v1 limited its crop box to the canvas and the container both, so a zoomed-in image never let the\n * crop wander off the part of it you could actually see.\n */\nconst constraintBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const image = imageBounds()\n const canvas = parts.canvas.getBoundingClientRect()\n const left = Math.max(image.x, 0)\n const top = Math.max(image.y, 0)\n const right = Math.min(image.x + image.width, canvas.width)\n const bottom = Math.min(image.y + image.height, canvas.height)\n return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) }\n}\n\nconst selectionRect = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const { x, y, width, height } = parts.selection\n return { x, y, width, height }\n}\n\nconst applyRect = (rect: Rect) => {\n if (!parts) return\n clamping = true\n parts.selection.$change(rect.x, rect.y, rect.width, rect.height, props.aspectRatio, true)\n clamping = false\n}\n\n/**\n * Re-fits the image to the canvas. cropper.js only lets `$center` scale and move an image that is\n * marked scalable and translatable — it grants itself that permission while the image is still\n * loading, but not afterwards — so the flags are lifted for the call and put back straight after.\n */\nconst centerImage = () => {\n if (!parts) return\n const { image } = parts\n const { scalable, translatable } = image\n centring = true\n image.scalable = true\n image.translatable = true\n image.$center('contain')\n image.scalable = scalable\n image.translatable = translatable\n centring = false\n}\n\n/**\n * The crop a fresh picture starts with. Computed here rather than handed to cropper.js'\n * `initialCoverage`, whose deferred initialisation would land *after* a `ready` handler had already\n * positioned the crop. It is measured against the image rather than the canvas, which are the same\n * box for a source wider than its container and are not once the image sits centred between margins.\n */\nconst seedInitialCrop = () => {\n if (!parts) return\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return\n const initial = initialSelectionRect(bounds, props.aspectRatio, AUTO_CROP_AREA)\n applyRect({ ...initial, x: initial.x + bounds.x, y: initial.y + bounds.y })\n}\n\n/** Uses the bound crop if there is one, and the default box if there is not. */\nconst applyModelOrSeed = () => {\n const model = props.modelValue\n if (model && model.width > 0 && model.height > 0) applyCrop(model)\n else seedInitialCrop()\n emitCrop()\n}\n\n/** Pulls the selection back inside the image after something moved the image out from under it. */\nconst refit = () => {\n if (!parts || centring) return\n const current = selectionRect()\n if (current.width <= 0 || current.height <= 0) return\n const fitted = clampRectInside(current, constraintBounds(), props.aspectRatio)\n if (!rectsAreClose(current, fitted)) applyRect(fitted)\n}\n\nconst onSelectionChange = (event: Event) => {\n if (clamping || !parts) return\n const detail = (event as CustomEvent<Rect>).detail\n if (!detail) return\n // cropper.js reverses the action when a grip is dragged through the opposite edge, and it records\n // that on the canvas just before emitting this event — one move ahead of the `action` event the\n // tracking below sees. Prefer its own answer, and fall back if a future version stops publishing it.\n const liveAction = (parts.canvas as unknown as { $action?: unknown }).$action\n const action = typeof liveAction === 'string' && liveAction ? liveAction : currentAction\n const anchor = action ? RESIZE_ANCHORS[action] : undefined\n const clamped = clampRectInside(detail, constraintBounds(), props.aspectRatio, anchor)\n if (rectsAreClose(detail, clamped)) return\n // Rejecting the change and re-issuing the clamped one is what keeps the crop sliding along the\n // border instead of freezing there; the shade reads `defaultPrevented` and follows the new values.\n event.preventDefault()\n applyRect(clamped)\n}\n\nconst onActionStart = (event: Event) => {\n currentAction = (event as CustomEvent<{ action?: string }>).detail?.action ?? null\n}\n\nconst onAction = (event: Event) => {\n const action = (event as CustomEvent<{ action?: string }>).detail?.action\n // cropper.js turns a fresh \"select\" drag into the matching corner resize once it knows the\n // direction, and reports the new action on the next move — follow it so the anchor stays right.\n if (action) currentAction = action\n}\n\nconst onActionEnd = () => {\n currentAction = null\n emitCrop(true)\n}\n\n/**\n * The canvas must never see a wheel event: its own handler calls `preventDefault()` unconditionally,\n * which would swallow page scrolling over the picture the way cropper.js v1 never did. Pinching is\n * unaffected — that arrives as pointer events, and the picture stays scalable for it.\n */\nconst onWheelCapture = (event: WheelEvent) => {\n event.stopPropagation()\n}\n\n/**\n * cropper.js emits `transform` *before* it writes the new matrix to the element's style (it sets the\n * new transform to measure the result, puts the old one back, then emits and finally commits). Re-\n * fitting straight away would therefore measure the image as it was: after a zoom out the crop would\n * be judged against the larger, previous picture and left hanging over the edge of the new one.\n */\nconst onImageTransform = () => queueMicrotask(refit)\n\nconst teardown = () => {\n if (parts) {\n const { canvas, image, selection } = parts\n selection.removeEventListener('change', onSelectionChange)\n canvas.removeEventListener('actionstart', onActionStart)\n canvas.removeEventListener('action', onAction)\n canvas.removeEventListener('actionend', onActionEnd)\n image.removeEventListener('transform', onImageTransform)\n }\n // Every canvas, not just the one on `parts`: a build that was superseded while still waiting on\n // its image has already put one in the DOM and has nothing tracking it yet.\n hostEl.value?.querySelectorAll(CropperCanvas.$name).forEach((canvas) => {\n // Disconnecting a `cropper-image` drops its listeners but leaves its request running, and the\n // `$ready()` promise waiting on it keeps this component reachable until the server answers.\n canvas.querySelectorAll<CropperImage>(CropperImage.$name).forEach((image) => {\n if (image.$image) image.$image.src = ''\n })\n canvas.remove()\n })\n ancestorObserver?.disconnect()\n ancestorObserver = null\n parts = null\n natural = { width: 0, height: 0 }\n laidOut = { width: 0, height: 0 }\n currentAction = null\n}\n\n/**\n * How much of the host's height will actually be shown.\n *\n * The host's own `max-height` is the usual answer, and the one `DamAssetImageRoiSelect` relies on.\n * Ancestors count too when they clip with `overflow: hidden` — what they cut off cannot be scrolled\n * back into view, so it is no more reachable than the host's own overflow. An ancestor that\n * scrolls is left alone: there the rest of the picture is a scroll away, not gone.\n */\nconst clippingAncestorsOf = (host: HTMLElement): HTMLElement[] => {\n const found: HTMLElement[] = []\n let ancestor = host.parentElement\n while (ancestor && ancestor !== document.body && ancestor !== document.documentElement) {\n const { overflowY } = window.getComputedStyle(ancestor)\n if (overflowY === 'hidden' || overflowY === 'clip') found.push(ancestor)\n ancestor = ancestor.parentElement\n }\n return found\n}\n\nconst visibleHeightOf = (host: HTMLElement): number => {\n let available = host.clientHeight\n const hostTop = host.getBoundingClientRect().top\n\n clippingAncestorsOf(host).forEach((ancestor) => {\n const rect = ancestor.getBoundingClientRect()\n // From wherever the host starts being visible down to where the ancestor stops showing anything.\n // Taking the ancestor's own top into account matters when the host begins above it: what is\n // scrolled or positioned off the top is just as unreachable as what falls off the bottom.\n const room = rect.bottom - Math.max(rect.top, hostTop)\n if (room > 0) available = Math.min(available, room)\n })\n\n return available\n}\n\n/**\n * Sizes the canvas to the room the host actually gives it, in two passes because the second answer\n * depends on the first: the height a picture wants follows from its width, but a frame with a\n * `max-height` only reveals how much of that it will show once something is in it.\n *\n * cropper.js v1 did the same dance with its `<img>`, and the point of it is that its cropper never\n * overflowed: a tall picture in a short frame was scaled down to fit rather than cut off at the\n * bottom, where the part of the crop hidden by `overflow: hidden` could not be reached again.\n */\nconst sizeCanvas = (canvas: CropperCanvas, host: HTMLElement, availableWidth: number): Size => {\n const size = canvasSizeFor(natural, availableWidth, MIN_CONTAINER_WIDTH, MIN_CONTAINER_HEIGHT)\n canvas.style.width = `${size.width}px`\n canvas.style.height = `${size.height}px`\n\n const visibleHeight = visibleHeightOf(host)\n if (visibleHeight > 0 && visibleHeight < size.height) {\n size.height = Math.max(visibleHeight, MIN_CONTAINER_HEIGHT)\n canvas.style.height = `${size.height}px`\n }\n return size\n}\n\nconst buildSelectionChildren = (selection: CropperSelection) => {\n const grid = create<CropperGrid>(CropperGrid.$name)\n grid.rows = 3\n grid.columns = 3\n grid.covered = true\n grid.themeColor = GRID_COLOR\n grid.setAttribute('role', 'grid')\n selection.appendChild(grid)\n\n const crosshair = create<CropperCrosshair>(CropperCrosshair.$name)\n crosshair.centered = true\n crosshair.themeColor = CROSSHAIR_COLOR\n selection.appendChild(crosshair)\n\n const face = create<CropperHandle>(CropperHandle.$name)\n face.action = 'move'\n face.themeColor = FACE_COLOR\n selection.appendChild(face)\n\n RESIZE_ACTIONS.forEach((action) => {\n const handle = create<CropperHandle>(CropperHandle.$name)\n handle.action = action\n handle.themeColor = SELECTION_COLOR\n selection.appendChild(handle)\n })\n}\n\nconst build = async () => {\n const token = ++buildToken\n teardown()\n loading.value = true\n\n const host = hostEl.value\n if (!host || !props.src) {\n // Nothing to wait for: leaving the spinner up would make an empty cropper look like a stuck one.\n loading.value = false\n return\n }\n\n const canvas = create<CropperCanvas>(CropperCanvas.$name)\n canvas.background = false\n canvas.themeColor = SELECTION_COLOR\n canvas.style.display = 'block'\n sizeCanvas(canvas, host, host.clientWidth)\n\n const image = create<CropperImage>(CropperImage.$name)\n image.alt = ''\n image.initialFit = 'contain'\n image.rotatable = false\n image.skewable = false\n image.translatable = false\n image.scalable = true\n image.src = props.src\n\n const shade = create<CropperShade>(CropperShade.$name)\n shade.themeColor = props.shadeColor\n // Kept out of the way until the first crop box exists, or it would flash across the whole canvas.\n shade.hidden = true\n\n const selectHandle = create<CropperHandle>(CropperHandle.$name)\n selectHandle.action = 'select'\n selectHandle.plain = true\n\n const selection = create<CropperSelection>(CropperSelection.$name)\n selection.themeColor = SELECTION_COLOR\n selection.movable = true\n selection.resizable = true\n selection.outlined = true\n // Keep sub-pixel values: rounding to whole canvas pixels would drift the natural-pixel crop data\n // that callers persist, and cropper.js v1 did not round either.\n selection.precise = true\n selection.aspectRatio = props.aspectRatio\n buildSelectionChildren(selection)\n\n // Listeners go on before anything is connected, so the action in flight is already known by the\n // time the elements' own handlers react to it.\n canvas.addEventListener('actionstart', onActionStart)\n canvas.addEventListener('action', onAction)\n canvas.addEventListener('actionend', onActionEnd)\n image.addEventListener('transform', onImageTransform)\n selection.addEventListener('change', onSelectionChange)\n\n canvas.append(image, shade, selectHandle, selection)\n // The whole tree is attached in one move on purpose: each element wires itself up to its siblings\n // when it connects, and the shade in particular goes looking for the selection. Appending the\n // children one at a time leaves it looking at an empty canvas, and it never follows the crop.\n host.appendChild(canvas)\n // Second pass, now that there is something in the host for its own constraints to act on.\n sizeCanvas(canvas, host, host.clientWidth)\n\n let loaded: HTMLImageElement\n try {\n // The element runs the one request there is; its promise carries the picture that arrived.\n loaded = await image.$ready()\n } catch {\n // Mirrors cropper.js v1, which simply never became ready on a broken source.\n canvas.remove()\n if (token === buildToken) loading.value = false\n return\n }\n if (token !== buildToken) {\n canvas.remove()\n return\n }\n\n parts = { canvas, image, selection }\n // Only now is the picture's own size known, so the canvas gets its real dimensions here rather\n // than from a second request made ahead of time purely to measure it.\n natural = { width: loaded.naturalWidth, height: loaded.naturalHeight }\n sizeCanvas(canvas, host, host.clientWidth)\n\n // A prop that changed while the picture was loading found the watchers with no elements to write\n // to. Re-reading the two that can vary closes that window; it is idempotent otherwise.\n shade.themeColor = props.shadeColor\n selection.aspectRatio = props.aspectRatio\n\n centerImage()\n\n laidOut = hostBox(host)\n observeAncestors(host)\n applyModelOrSeed()\n\n loading.value = false\n emit('ready')\n}\n\n/** Where the crop sits, as fractions of the image. */\nconst currentCrop = (): CropRect | null => {\n if (!parts) return null\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return null\n const rect = selectionRect()\n return {\n x: (rect.x - bounds.x) / bounds.width,\n y: (rect.y - bounds.y) / bounds.height,\n width: rect.width / bounds.width,\n height: rect.height / bounds.height,\n }\n}\n\n/** Puts a crop given in fractions onto the canvas, clamped to the picture. */\nconst applyCrop = (crop: CropRect) => {\n const bounds = imageBounds()\n if (!parts || bounds.width <= 0 || bounds.height <= 0) return\n applyRect(\n clampRectInside(\n {\n x: bounds.x + crop.x * bounds.width,\n y: bounds.y + crop.y * bounds.height,\n width: crop.width * bounds.width,\n height: crop.height * bounds.height,\n },\n constraintBounds(),\n props.aspectRatio\n )\n )\n}\n\nconst cropsAreClose = (a: CropRect | null, b: CropRect | null): boolean =>\n a !== null &&\n b !== null &&\n Math.abs(a.x - b.x) < 0.0005 &&\n Math.abs(a.y - b.y) < 0.0005 &&\n Math.abs(a.width - b.width) < 0.0005 &&\n Math.abs(a.height - b.height) < 0.0005\n\n/**\n * Hands the crop back up. Also called after the component itself has adjusted one — a stored region\n * rarely matches the configured ratio, and the binding should say where the crop really is rather\n * than where it was asked to be.\n */\nconst emitCrop = (alsoCommit = false) => {\n const crop = currentCrop()\n if (!crop) return\n if (alsoCommit || !cropsAreClose(crop, lastEmitted)) {\n lastEmitted = crop\n emit('update:modelValue', crop)\n }\n if (alsoCommit) emit('commit', crop)\n}\n\n/** The room the host has: its width, and the height that will actually be shown. */\nconst hostBox = (host: HTMLElement): Size => ({ width: host.clientWidth, height: visibleHeightOf(host) })\n\n/** Re-fit the image to the new container while keeping the crop the user already chose. */\nconst relayout = () => {\n const host = hostEl.value\n if (!parts || !host) return\n // A crop of no size means the last layout had none either — fall back to the bound one, which is\n // what a cropper built inside a closed panel has been holding all along.\n const wanted = currentCrop() ?? props.modelValue\n\n const size = sizeCanvas(parts.canvas, host, host.clientWidth)\n laidOut = hostBox(host)\n // Re-read the ancestors as well: a cropper can be moved between frames, and the one clipping it\n // now is the one whose height matters.\n observeAncestors(host)\n centerImage()\n if (size.width <= 0 || size.height <= 0) return\n\n if (wanted && wanted.width > 0) applyCrop(wanted)\n else applyModelOrSeed()\n emitCrop()\n}\n\nconst onHostBoxChanged = () => {\n const host = hostEl.value\n if (!host) return\n const box = hostBox(host)\n if (box.width <= 0 || box.height <= 0) return\n // Compared against the box the current layout was built for, so a size seen while the cropper was\n // still loading cannot be mistaken for one that has already been laid out.\n if (box.width === laidOut.width && box.height === laidOut.height) return\n if (!parts) return\n // Deferred a frame: resizing the canvas from inside the observer's own callback is what makes\n // Chromium report an undelivered-notification loop.\n requestAnimationFrame(() => relayout())\n}\n\n// Height counts as much as width: the DAM sizes the cropper with `calc(100vh - 160px)`, so a\n// shorter window shrinks the frame without touching its width.\nuseResizeObserver(hostEl, onHostBoxChanged)\n\n/** An ancestor that clips can change how much it shows without the host's own box moving at all. */\nconst observeAncestors = (host: HTMLElement) => {\n ancestorObserver?.disconnect()\n const ancestors = clippingAncestorsOf(host)\n if (ancestors.length === 0) {\n ancestorObserver = null\n return\n }\n ancestorObserver = new ResizeObserver(onHostBoxChanged)\n ancestors.forEach((ancestor) => ancestorObserver?.observe(ancestor))\n}\n\nwatch(\n () => props.src,\n () => {\n build()\n }\n)\n\nwatch(\n () => props.modelValue,\n (model) => {\n // Ignore the echo of what this component just handed up, or the two would write to each other\n // for as long as the parent keeps binding it back.\n if (!parts || !model || cropsAreClose(model, lastEmitted)) return\n applyCrop(model)\n emitCrop()\n },\n { deep: true }\n)\n\nwatch(\n () => props.shadeColor,\n (shadeColor) => {\n const shade = parts?.canvas.querySelector<CropperShade>(CropperShade.$name)\n if (shade) shade.themeColor = shadeColor\n }\n)\n\nwatch(\n () => props.aspectRatio,\n (aspectRatio) => {\n if (!parts) return\n parts.selection.aspectRatio = aspectRatio\n if (!isUsableAspectRatio(aspectRatio)) return\n const current = selectionRect()\n applyRect(clampRectInside({ ...current, height: current.width / aspectRatio }, constraintBounds(), aspectRatio))\n }\n)\n\nonMounted(() => {\n build()\n})\n\nonBeforeUnmount(() => {\n buildToken += 1\n teardown()\n})\n</script>\n\n<template>\n <div class=\"a-cropper d-flex flex-column\">\n <div\n v-if=\"loading\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular\n class=\"position-absolute\"\n indeterminate\n />\n </div>\n\n <div\n ref=\"hostEl\"\n class=\"a-cropper__container\"\n :style=\"containerStyle\"\n @wheel.capture=\"onWheelCapture\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n// `cropper-crosshair` sizes itself in `em`, so without a size of its own the centre marker would\n// grow and shrink with whatever font the surrounding admin happens to use. 7px is the plus sign\n// cropper.js v1 drew through `.cropper-center`.\n.a-cropper cropper-crosshair {\n font-size: 7px;\n}\n\n// cropper.js v1 drew a `.cropper-line` along each edge of the crop box: a 5px band of the selection\n// colour at a tenth opacity, sitting 3px outside the border and 2px inside it. It is what made the\n// thin outline read as a grabbable edge, so it is drawn here too — as a pair of shadows rather than\n// four elements, which keeps it independent of how the v2 grips happen to be sized.\n.a-cropper cropper-selection[outlined] {\n box-shadow:\n inset 0 0 0 2px rgb(51 153 255 / 10%),\n 0 0 0 3px rgb(51 153 255 / 10%);\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"ACropper.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_component_VProgressCircular","_createCommentVNode","_createElementVNode","_normalizeStyle","CropperCanvas","CropperImage","CropperShade","CropperHandle","CropperSelection","CropperGrid","CropperCrosshair","_hoisted_1","_hoisted_2","AUTO_CROP_AREA","MIN_CONTAINER_WIDTH","MIN_CONTAINER_HEIGHT","SELECTION_COLOR","FACE_COLOR","GRID_COLOR","CROSSHAIR_COLOR","ACropper_vue_vue_type_script_setup_true_lang_default","__emit","props","__props","emit","element","RESIZE_ACTIONS","hostEl","useTemplateRef","loading","ref","parts","natural","currentAction","clamping","centring","buildToken","laidOut","lastEmitted","ancestorObserver","create","name","imageBounds","canvasRect","imageRect","constraintBounds","image","canvas","left","top","right","bottom","selectionRect","applyRect","rect","centerImage","scalable","translatable","seedInitialCrop","bounds","initial","initialSelectionRect","applyModelOrSeed","model","applyCrop","emitCrop","refit","current","fitted","clampRectInside","rectsAreClose","onSelectionChange","detail","event","liveAction","action","anchor","RESIZE_ANCHORS","clamped","onActionStart","onAction","onActionEnd","onWheelCapture","onImageTransform","teardown","selection","clippingAncestorsOf","found","ancestor","host","overflowY","visibleHeightOf","available","hostTop","room","sizeCanvas","size","canvasSizeFor","availableWidth","visibleHeight","buildSelectionChildren","grid","crosshair","face","handle","build","token","shade","selectHandle","loaded","hostBox","observeAncestors","currentCrop","crop","cropsAreClose","a","b","alsoCommit","relayout","wanted","onHostBoxChanged","box","ancestors","watch","shadeColor","aspectRatio","isUsableAspectRatio","onMounted","onBeforeUnmount","openBlock","createElementBlock","createVNode","VProgressCircular","createCommentVNode","createElementVNode","normalizeStyle"],"sources":["../../../../../src/domains/dam/cropper/components/ACropper.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from 'vue'\nimport { useResizeObserver } from '@vueuse/core'\nimport {\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n} from 'cropperjs'\nimport {\n canvasSizeFor,\n clampRectInside,\n initialSelectionRect,\n isUsableAspectRatio,\n RESIZE_ANCHORS,\n rectsAreClose,\n type Rect,\n type Size,\n} from '@/domains/dam/cropper/utils/cropperGeometry'\nimport type { CropRect } from '@/domains/dam/cropper/utils/cropperTypes'\n\n/**\n * Image cropper built on cropper.js v2's custom elements, replacing the v1-based `ACropperjs`.\n *\n * It lives here, beside `DamAssetImageRoiSelect`, because that is the only thing that uses it and\n * nothing outside this library does. It is not exported: shaping it to one need rather than to a\n * general audience is what keeps it to its size.\n *\n * The crop is bound, not fetched: `v-model` carries it as fractions of the image, and `commit` says\n * the user has finished a gesture. There is no imperative surface — the one thing a host wants to do\n * with a cropper is know where the crop is, and a binding says that better than six methods did.\n *\n * The elements are assembled in script rather than in the template on purpose: a consumer of this\n * library does not configure `isCustomElement` in their own build, and setting element *properties*\n * instead of going through attribute strings avoids the coercion surprises (`NaN`, booleans,\n * fractional numbers) that come with the attribute round-trip.\n */\n\nconst props = withDefaults(\n defineProps<{\n src?: string\n /** The crop, as fractions of the image. Leave it null to start from the default box. */\n modelValue?: CropRect | null\n /** `NaN` (the default) leaves the crop free-form. */\n aspectRatio?: number\n containerStyle?: { [key: string]: string } | undefined\n /** Wash over everything outside the crop — the replacement for overriding `.cropper-modal`. */\n shadeColor?: string\n }>(),\n {\n src: '',\n modelValue: null,\n aspectRatio: NaN,\n containerStyle: undefined,\n shadeColor: 'rgba(0, 0, 0, 0.5)',\n }\n)\n\nconst emit = defineEmits<{\n (event: 'update:modelValue', crop: CropRect): void\n /** The user has finished a gesture; the crop is worth saving. */\n (event: 'commit', crop: CropRect): void\n (event: 'ready'): void\n}>()\n\n// cropper.js registers its elements as a side effect of loading its entry, and this package's\n// `sideEffects` lets the consumer's bundler drop that module once only the classes are used. `$define`\n// is a no-op for an element that is already registered.\nfor (const element of [\n CropperCanvas,\n CropperCrosshair,\n CropperGrid,\n CropperHandle,\n CropperImage,\n CropperSelection,\n CropperShade,\n]) {\n element.$define()\n}\n\n/**\n * Settings the one caller never varies, kept as constants rather than as props nobody passes.\n * Each of them is behaviour, not preference: no checkerboard behind a photograph, the wheel left to\n * the page, pinch zoom kept for tablets, and the minimum canvas cropper.js' own stylesheet declares.\n */\nconst AUTO_CROP_AREA = 0.8\nconst MIN_CONTAINER_WIDTH = 200\nconst MIN_CONTAINER_HEIGHT = 100\n\n// Matched to cropper.js v1's stylesheet so the two components are indistinguishable side by side.\nconst SELECTION_COLOR = 'rgba(51, 153, 255, 0.75)'\nconst FACE_COLOR = 'rgba(255, 255, 255, 0.1)'\nconst GRID_COLOR = 'rgba(238, 238, 238, 0.5)'\nconst CROSSHAIR_COLOR = 'rgba(238, 238, 238, 0.75)'\nconst RESIZE_ACTIONS = [\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n]\n\ninterface CropperParts {\n canvas: CropperCanvas\n image: CropperImage\n selection: CropperSelection\n}\n\nconst hostEl = useTemplateRef<HTMLDivElement>('hostEl')\nconst loading = ref(true)\n\nlet parts: CropperParts | null = null\nlet natural: Size = { width: 0, height: 0 }\n/** The action cropper.js is currently performing, so a clamp knows which edge to hold still. */\nlet currentAction: string | null = null\n/** Guards the re-entrant `$change` a clamp performs from being clamped again. */\nlet clamping = false\n/** Guards the half-applied transforms `$center` emits between its move and its scale. */\nlet centring = false\n/** Invalidates an in-flight build when `src` changes or the component goes away mid-load. */\nlet buildToken = 0\n/** The host box the current layout was computed for — not merely the last one observed. */\nlet laidOut: Size = { width: 0, height: 0 }\n/** The last crop handed out, so a model written straight back is not mistaken for a new one. */\nlet lastEmitted: CropRect | null = null\n/** Watches the ancestors that clip the host; their height is part of the room it has. */\nlet ancestorObserver: ResizeObserver | null = null\n\nconst create = <T extends HTMLElement>(name: string): T => document.createElement(name) as T\n\n/** The image box in canvas coordinates. Read from layout so panning and zooming stay accounted for. */\nconst imageBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const canvasRect = parts.canvas.getBoundingClientRect()\n const imageRect = parts.image.getBoundingClientRect()\n return {\n x: imageRect.left - canvasRect.left,\n y: imageRect.top - canvasRect.top,\n width: imageRect.width,\n height: imageRect.height,\n }\n}\n\n/**\n * Where the crop is allowed to be: the image, but never outside the visible canvas. The two are the\n * same box until the image is zoomed past its frame, and then it is the frame that wins — cropper.js\n * v1 limited its crop box to the canvas and the container both, so a zoomed-in image never let the\n * crop wander off the part of it you could actually see.\n */\nconst constraintBounds = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const image = imageBounds()\n const canvas = parts.canvas.getBoundingClientRect()\n const left = Math.max(image.x, 0)\n const top = Math.max(image.y, 0)\n const right = Math.min(image.x + image.width, canvas.width)\n const bottom = Math.min(image.y + image.height, canvas.height)\n return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) }\n}\n\nconst selectionRect = (): Rect => {\n if (!parts) return { x: 0, y: 0, width: 0, height: 0 }\n const { x, y, width, height } = parts.selection\n return { x, y, width, height }\n}\n\nconst applyRect = (rect: Rect) => {\n if (!parts) return\n clamping = true\n parts.selection.$change(rect.x, rect.y, rect.width, rect.height, props.aspectRatio, true)\n clamping = false\n}\n\n/**\n * Re-fits the image to the canvas. cropper.js only lets `$center` scale and move an image that is\n * marked scalable and translatable — it grants itself that permission while the image is still\n * loading, but not afterwards — so the flags are lifted for the call and put back straight after.\n */\nconst centerImage = () => {\n if (!parts) return\n const { image } = parts\n const { scalable, translatable } = image\n centring = true\n image.scalable = true\n image.translatable = true\n image.$center('contain')\n image.scalable = scalable\n image.translatable = translatable\n centring = false\n}\n\n/**\n * The crop a fresh picture starts with. Computed here rather than handed to cropper.js'\n * `initialCoverage`, whose deferred initialisation would land *after* a `ready` handler had already\n * positioned the crop. It is measured against the image rather than the canvas, which are the same\n * box for a source wider than its container and are not once the image sits centred between margins.\n */\nconst seedInitialCrop = () => {\n if (!parts) return\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return\n const initial = initialSelectionRect(bounds, props.aspectRatio, AUTO_CROP_AREA)\n applyRect({ ...initial, x: initial.x + bounds.x, y: initial.y + bounds.y })\n}\n\n/** Uses the bound crop if there is one, and the default box if there is not. */\nconst applyModelOrSeed = () => {\n const model = props.modelValue\n if (model && model.width > 0 && model.height > 0) applyCrop(model)\n else seedInitialCrop()\n emitCrop()\n}\n\n/** Pulls the selection back inside the image after something moved the image out from under it. */\nconst refit = () => {\n if (!parts || centring) return\n const current = selectionRect()\n if (current.width <= 0 || current.height <= 0) return\n const fitted = clampRectInside(current, constraintBounds(), props.aspectRatio)\n if (!rectsAreClose(current, fitted)) applyRect(fitted)\n}\n\nconst onSelectionChange = (event: Event) => {\n if (clamping || !parts) return\n const detail = (event as CustomEvent<Rect>).detail\n if (!detail) return\n // cropper.js reverses the action when a grip is dragged through the opposite edge, and it records\n // that on the canvas just before emitting this event — one move ahead of the `action` event the\n // tracking below sees. Prefer its own answer, and fall back if a future version stops publishing it.\n const liveAction = (parts.canvas as unknown as { $action?: unknown }).$action\n const action = typeof liveAction === 'string' && liveAction ? liveAction : currentAction\n const anchor = action ? RESIZE_ANCHORS[action] : undefined\n const clamped = clampRectInside(detail, constraintBounds(), props.aspectRatio, anchor)\n if (rectsAreClose(detail, clamped)) return\n // Rejecting the change and re-issuing the clamped one is what keeps the crop sliding along the\n // border instead of freezing there; the shade reads `defaultPrevented` and follows the new values.\n event.preventDefault()\n applyRect(clamped)\n}\n\nconst onActionStart = (event: Event) => {\n currentAction = (event as CustomEvent<{ action?: string }>).detail?.action ?? null\n}\n\nconst onAction = (event: Event) => {\n const action = (event as CustomEvent<{ action?: string }>).detail?.action\n // cropper.js turns a fresh \"select\" drag into the matching corner resize once it knows the\n // direction, and reports the new action on the next move — follow it so the anchor stays right.\n if (action) currentAction = action\n}\n\nconst onActionEnd = () => {\n currentAction = null\n emitCrop(true)\n}\n\n/**\n * The canvas must never see a wheel event: its own handler calls `preventDefault()` unconditionally,\n * which would swallow page scrolling over the picture the way cropper.js v1 never did. Pinching is\n * unaffected — that arrives as pointer events, and the picture stays scalable for it.\n */\nconst onWheelCapture = (event: WheelEvent) => {\n event.stopPropagation()\n}\n\n/**\n * cropper.js emits `transform` *before* it writes the new matrix to the element's style (it sets the\n * new transform to measure the result, puts the old one back, then emits and finally commits). Re-\n * fitting straight away would therefore measure the image as it was: after a zoom out the crop would\n * be judged against the larger, previous picture and left hanging over the edge of the new one.\n */\nconst onImageTransform = () => queueMicrotask(refit)\n\nconst teardown = () => {\n if (parts) {\n const { canvas, image, selection } = parts\n selection.removeEventListener('change', onSelectionChange)\n canvas.removeEventListener('actionstart', onActionStart)\n canvas.removeEventListener('action', onAction)\n canvas.removeEventListener('actionend', onActionEnd)\n image.removeEventListener('transform', onImageTransform)\n }\n // Every canvas, not just the one on `parts`: a build that was superseded while still waiting on\n // its image has already put one in the DOM and has nothing tracking it yet.\n hostEl.value?.querySelectorAll(CropperCanvas.$name).forEach((canvas) => {\n // Disconnecting a `cropper-image` drops its listeners but leaves its request running, and the\n // `$ready()` promise waiting on it keeps this component reachable until the server answers.\n canvas.querySelectorAll<CropperImage>(CropperImage.$name).forEach((image) => {\n if (image.$image) image.$image.src = ''\n })\n canvas.remove()\n })\n ancestorObserver?.disconnect()\n ancestorObserver = null\n parts = null\n natural = { width: 0, height: 0 }\n laidOut = { width: 0, height: 0 }\n currentAction = null\n}\n\n/**\n * How much of the host's height will actually be shown.\n *\n * The host's own `max-height` is the usual answer, and the one `DamAssetImageRoiSelect` relies on.\n * Ancestors count too when they clip with `overflow: hidden` — what they cut off cannot be scrolled\n * back into view, so it is no more reachable than the host's own overflow. An ancestor that\n * scrolls is left alone: there the rest of the picture is a scroll away, not gone.\n */\nconst clippingAncestorsOf = (host: HTMLElement): HTMLElement[] => {\n const found: HTMLElement[] = []\n let ancestor = host.parentElement\n while (ancestor && ancestor !== document.body && ancestor !== document.documentElement) {\n const { overflowY } = window.getComputedStyle(ancestor)\n if (overflowY === 'hidden' || overflowY === 'clip') found.push(ancestor)\n ancestor = ancestor.parentElement\n }\n return found\n}\n\nconst visibleHeightOf = (host: HTMLElement): number => {\n let available = host.clientHeight\n const hostTop = host.getBoundingClientRect().top\n\n clippingAncestorsOf(host).forEach((ancestor) => {\n const rect = ancestor.getBoundingClientRect()\n // From wherever the host starts being visible down to where the ancestor stops showing anything.\n // Taking the ancestor's own top into account matters when the host begins above it: what is\n // scrolled or positioned off the top is just as unreachable as what falls off the bottom.\n const room = rect.bottom - Math.max(rect.top, hostTop)\n if (room > 0) available = Math.min(available, room)\n })\n\n return available\n}\n\n/**\n * Sizes the canvas to the room the host actually gives it, in two passes because the second answer\n * depends on the first: the height a picture wants follows from its width, but a frame with a\n * `max-height` only reveals how much of that it will show once something is in it.\n *\n * cropper.js v1 did the same dance with its `<img>`, and the point of it is that its cropper never\n * overflowed: a tall picture in a short frame was scaled down to fit rather than cut off at the\n * bottom, where the part of the crop hidden by `overflow: hidden` could not be reached again.\n */\nconst sizeCanvas = (canvas: CropperCanvas, host: HTMLElement, availableWidth: number): Size => {\n const size = canvasSizeFor(natural, availableWidth, MIN_CONTAINER_WIDTH, MIN_CONTAINER_HEIGHT)\n canvas.style.width = `${size.width}px`\n canvas.style.height = `${size.height}px`\n\n const visibleHeight = visibleHeightOf(host)\n if (visibleHeight > 0 && visibleHeight < size.height) {\n size.height = Math.max(visibleHeight, MIN_CONTAINER_HEIGHT)\n canvas.style.height = `${size.height}px`\n }\n return size\n}\n\nconst buildSelectionChildren = (selection: CropperSelection) => {\n const grid = create<CropperGrid>(CropperGrid.$name)\n grid.rows = 3\n grid.columns = 3\n grid.covered = true\n grid.themeColor = GRID_COLOR\n grid.setAttribute('role', 'grid')\n selection.appendChild(grid)\n\n const crosshair = create<CropperCrosshair>(CropperCrosshair.$name)\n crosshair.centered = true\n crosshair.themeColor = CROSSHAIR_COLOR\n selection.appendChild(crosshair)\n\n const face = create<CropperHandle>(CropperHandle.$name)\n face.action = 'move'\n face.themeColor = FACE_COLOR\n selection.appendChild(face)\n\n RESIZE_ACTIONS.forEach((action) => {\n const handle = create<CropperHandle>(CropperHandle.$name)\n handle.action = action\n handle.themeColor = SELECTION_COLOR\n selection.appendChild(handle)\n })\n}\n\nconst build = async () => {\n const token = ++buildToken\n teardown()\n loading.value = true\n\n const host = hostEl.value\n if (!host || !props.src) {\n // Nothing to wait for: leaving the spinner up would make an empty cropper look like a stuck one.\n loading.value = false\n return\n }\n\n const canvas = create<CropperCanvas>(CropperCanvas.$name)\n canvas.background = false\n canvas.themeColor = SELECTION_COLOR\n canvas.style.display = 'block'\n sizeCanvas(canvas, host, host.clientWidth)\n\n const image = create<CropperImage>(CropperImage.$name)\n image.alt = ''\n image.initialFit = 'contain'\n image.rotatable = false\n image.skewable = false\n image.translatable = false\n image.scalable = true\n image.src = props.src\n\n const shade = create<CropperShade>(CropperShade.$name)\n shade.themeColor = props.shadeColor\n // Kept out of the way until the first crop box exists, or it would flash across the whole canvas.\n shade.hidden = true\n\n const selectHandle = create<CropperHandle>(CropperHandle.$name)\n selectHandle.action = 'select'\n selectHandle.plain = true\n\n const selection = create<CropperSelection>(CropperSelection.$name)\n selection.themeColor = SELECTION_COLOR\n selection.movable = true\n selection.resizable = true\n selection.outlined = true\n // Keep sub-pixel values: rounding to whole canvas pixels would drift the natural-pixel crop data\n // that callers persist, and cropper.js v1 did not round either.\n selection.precise = true\n selection.aspectRatio = props.aspectRatio\n buildSelectionChildren(selection)\n\n // Listeners go on before anything is connected, so the action in flight is already known by the\n // time the elements' own handlers react to it.\n canvas.addEventListener('actionstart', onActionStart)\n canvas.addEventListener('action', onAction)\n canvas.addEventListener('actionend', onActionEnd)\n image.addEventListener('transform', onImageTransform)\n selection.addEventListener('change', onSelectionChange)\n\n canvas.append(image, shade, selectHandle, selection)\n // The whole tree is attached in one move on purpose: each element wires itself up to its siblings\n // when it connects, and the shade in particular goes looking for the selection. Appending the\n // children one at a time leaves it looking at an empty canvas, and it never follows the crop.\n host.appendChild(canvas)\n // Second pass, now that there is something in the host for its own constraints to act on.\n sizeCanvas(canvas, host, host.clientWidth)\n\n let loaded: HTMLImageElement\n try {\n // The element runs the one request there is; its promise carries the picture that arrived.\n loaded = await image.$ready()\n } catch {\n // Mirrors cropper.js v1, which simply never became ready on a broken source.\n canvas.remove()\n if (token === buildToken) loading.value = false\n return\n }\n if (token !== buildToken) {\n canvas.remove()\n return\n }\n\n parts = { canvas, image, selection }\n // Only now is the picture's own size known, so the canvas gets its real dimensions here rather\n // than from a second request made ahead of time purely to measure it.\n natural = { width: loaded.naturalWidth, height: loaded.naturalHeight }\n sizeCanvas(canvas, host, host.clientWidth)\n\n // A prop that changed while the picture was loading found the watchers with no elements to write\n // to. Re-reading the two that can vary closes that window; it is idempotent otherwise.\n shade.themeColor = props.shadeColor\n selection.aspectRatio = props.aspectRatio\n\n centerImage()\n\n laidOut = hostBox(host)\n observeAncestors(host)\n applyModelOrSeed()\n\n loading.value = false\n emit('ready')\n}\n\n/** Where the crop sits, as fractions of the image. */\nconst currentCrop = (): CropRect | null => {\n if (!parts) return null\n const bounds = imageBounds()\n if (bounds.width <= 0 || bounds.height <= 0) return null\n const rect = selectionRect()\n return {\n x: (rect.x - bounds.x) / bounds.width,\n y: (rect.y - bounds.y) / bounds.height,\n width: rect.width / bounds.width,\n height: rect.height / bounds.height,\n }\n}\n\n/** Puts a crop given in fractions onto the canvas, clamped to the picture. */\nconst applyCrop = (crop: CropRect) => {\n const bounds = imageBounds()\n if (!parts || bounds.width <= 0 || bounds.height <= 0) return\n applyRect(\n clampRectInside(\n {\n x: bounds.x + crop.x * bounds.width,\n y: bounds.y + crop.y * bounds.height,\n width: crop.width * bounds.width,\n height: crop.height * bounds.height,\n },\n constraintBounds(),\n props.aspectRatio\n )\n )\n}\n\nconst cropsAreClose = (a: CropRect | null, b: CropRect | null): boolean =>\n a !== null &&\n b !== null &&\n Math.abs(a.x - b.x) < 0.0005 &&\n Math.abs(a.y - b.y) < 0.0005 &&\n Math.abs(a.width - b.width) < 0.0005 &&\n Math.abs(a.height - b.height) < 0.0005\n\n/**\n * Hands the crop back up. Also called after the component itself has adjusted one — a stored region\n * rarely matches the configured ratio, and the binding should say where the crop really is rather\n * than where it was asked to be.\n */\nconst emitCrop = (alsoCommit = false) => {\n const crop = currentCrop()\n if (!crop) return\n if (alsoCommit || !cropsAreClose(crop, lastEmitted)) {\n lastEmitted = crop\n emit('update:modelValue', crop)\n }\n if (alsoCommit) emit('commit', crop)\n}\n\n/** The room the host has: its width, and the height that will actually be shown. */\nconst hostBox = (host: HTMLElement): Size => ({ width: host.clientWidth, height: visibleHeightOf(host) })\n\n/** Re-fit the image to the new container while keeping the crop the user already chose. */\nconst relayout = () => {\n const host = hostEl.value\n if (!parts || !host) return\n // A crop of no size means the last layout had none either — fall back to the bound one, which is\n // what a cropper built inside a closed panel has been holding all along.\n const wanted = currentCrop() ?? props.modelValue\n\n const size = sizeCanvas(parts.canvas, host, host.clientWidth)\n laidOut = hostBox(host)\n // Re-read the ancestors as well: a cropper can be moved between frames, and the one clipping it\n // now is the one whose height matters.\n observeAncestors(host)\n centerImage()\n if (size.width <= 0 || size.height <= 0) return\n\n if (wanted && wanted.width > 0) applyCrop(wanted)\n else applyModelOrSeed()\n emitCrop()\n}\n\nconst onHostBoxChanged = () => {\n const host = hostEl.value\n if (!host) return\n const box = hostBox(host)\n if (box.width <= 0 || box.height <= 0) return\n // Compared against the box the current layout was built for, so a size seen while the cropper was\n // still loading cannot be mistaken for one that has already been laid out.\n if (box.width === laidOut.width && box.height === laidOut.height) return\n if (!parts) return\n // Deferred a frame: resizing the canvas from inside the observer's own callback is what makes\n // Chromium report an undelivered-notification loop.\n requestAnimationFrame(() => relayout())\n}\n\n// Height counts as much as width: the DAM sizes the cropper with `calc(100vh - 160px)`, so a\n// shorter window shrinks the frame without touching its width.\nuseResizeObserver(hostEl, onHostBoxChanged)\n\n/** An ancestor that clips can change how much it shows without the host's own box moving at all. */\nconst observeAncestors = (host: HTMLElement) => {\n ancestorObserver?.disconnect()\n const ancestors = clippingAncestorsOf(host)\n if (ancestors.length === 0) {\n ancestorObserver = null\n return\n }\n ancestorObserver = new ResizeObserver(onHostBoxChanged)\n ancestors.forEach((ancestor) => ancestorObserver?.observe(ancestor))\n}\n\nwatch(\n () => props.src,\n () => {\n build()\n }\n)\n\nwatch(\n () => props.modelValue,\n (model) => {\n // Ignore the echo of what this component just handed up, or the two would write to each other\n // for as long as the parent keeps binding it back.\n if (!parts || !model || cropsAreClose(model, lastEmitted)) return\n applyCrop(model)\n emitCrop()\n },\n { deep: true }\n)\n\nwatch(\n () => props.shadeColor,\n (shadeColor) => {\n const shade = parts?.canvas.querySelector<CropperShade>(CropperShade.$name)\n if (shade) shade.themeColor = shadeColor\n }\n)\n\nwatch(\n () => props.aspectRatio,\n (aspectRatio) => {\n if (!parts) return\n parts.selection.aspectRatio = aspectRatio\n if (!isUsableAspectRatio(aspectRatio)) return\n const current = selectionRect()\n applyRect(clampRectInside({ ...current, height: current.width / aspectRatio }, constraintBounds(), aspectRatio))\n }\n)\n\nonMounted(() => {\n build()\n})\n\nonBeforeUnmount(() => {\n buildToken += 1\n teardown()\n})\n</script>\n\n<template>\n <div class=\"a-cropper d-flex flex-column\">\n <div\n v-if=\"loading\"\n class=\"d-flex w-100 align-center justify-center\"\n >\n <VProgressCircular\n class=\"position-absolute\"\n indeterminate\n />\n </div>\n\n <div\n ref=\"hostEl\"\n class=\"a-cropper__container\"\n :style=\"containerStyle\"\n @wheel.capture=\"onWheelCapture\"\n />\n </div>\n</template>\n\n<style lang=\"scss\">\n// `cropper-crosshair` sizes itself in `em`, so without a size of its own the centre marker would\n// grow and shrink with whatever font the surrounding admin happens to use. 7px is the plus sign\n// cropper.js v1 drew through `.cropper-center`.\n.a-cropper cropper-crosshair {\n font-size: 7px;\n}\n\n// cropper.js v1 drew a `.cropper-line` along each edge of the crop box: a 5px band of the selection\n// colour at a tenth opacity, sitting 3px outside the border and 2px inside it. It is what made the\n// thin outline read as a grabbable edge, so it is drawn here too — as a pair of shadows rather than\n// four elements, which keeps it independent of how the v2 grips happen to be sized.\n.a-cropper cropper-selection[outlined] {\n box-shadow:\n inset 0 0 0 2px rgb(51 153 255 / 10%),\n 0 0 0 3px rgb(51 153 255 / 10%);\n}\n</style>\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import e from "./DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js";
2
- //#region src/domains/dam/cropper/components/DamAssetImageRoiSelect.vue
2
+ // src/domains/dam/cropper/components/DamAssetImageRoiSelect.vue
3
3
  var t = e;
4
- //#endregion
5
4
  export { t as default };
6
5
 
7
6
  //# sourceMappingURL=DamAssetImageRoiSelect.js.map
@@ -11,7 +11,7 @@ import u from "./ACropper.js";
11
11
  import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createVNode as g, defineComponent as _, onUnmounted as v, openBlock as y, ref as b, unref as x, watch as S } from "vue";
12
12
  import { VProgressCircular as C } from "vuetify/components/VProgressCircular";
13
13
  import { VImg as w } from "vuetify/components/VImg";
14
- //#region src/domains/dam/cropper/components/DamAssetImageRoiSelect.vue?vue&type=script&setup=true&lang.ts
14
+ // src/domains/dam/cropper/components/DamAssetImageRoiSelect.vue?vue&type=script&setup=true&lang.ts
15
15
  var T = {
16
16
  key: 0,
17
17
  class: "d-flex w-100 align-center justify-center"
@@ -94,7 +94,6 @@ var T = {
94
94
  }, null, 8, ["src", "max-height"])) : m("", !0)], 64));
95
95
  }
96
96
  });
97
- //#endregion
98
97
  export { D as default };
99
98
 
100
99
  //# sourceMappingURL=DamAssetImageRoiSelect.vue_vue_type_script_setup_true_lang.js.map
@@ -1,7 +1,6 @@
1
1
  import e from "./DamAssetImageRoiSelectLazy.vue_vue_type_script_setup_true_lang.js";
2
- //#region src/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.vue
2
+ // src/domains/dam/cropper/components/DamAssetImageRoiSelectLazy.vue
3
3
  var t = e;
4
- //#endregion
5
4
  export { t as default };
6
5
 
7
6
  //# sourceMappingURL=DamAssetImageRoiSelectLazy.js.map