@shapio/cms 0.5.5 → 0.5.7

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 (360) hide show
  1. package/dist/admin/assets/{AssetTile-CaYPqR_F.js → AssetTile-H0hABhB2.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-CaYPqR_F.js.map → AssetTile-H0hABhB2.js.map} +1 -1
  3. package/dist/admin/assets/AssistError-1s3PuY0X.js +2 -0
  4. package/dist/admin/assets/{AssistError-drmpXSbS.js.map → AssistError-1s3PuY0X.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-D-jZ0oaU.js → BlockMenuItems-a8zXdfcF.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-D-jZ0oaU.js.map → BlockMenuItems-a8zXdfcF.js.map} +1 -1
  7. package/dist/admin/assets/Body-BzZD-TZT.js +2 -0
  8. package/dist/admin/assets/{Body-Gn_z2KPN.js.map → Body-BzZD-TZT.js.map} +1 -1
  9. package/dist/admin/assets/Builder-60jO_nbS.js +2 -0
  10. package/dist/admin/assets/Builder-60jO_nbS.js.map +1 -0
  11. package/dist/admin/assets/{CodeEditor-CzRU6och.js → CodeEditor-BLbJZE9v.js} +2 -2
  12. package/dist/admin/assets/{CodeEditor-CzRU6och.js.map → CodeEditor-BLbJZE9v.js.map} +1 -1
  13. package/dist/admin/assets/{CopyButton-h4HYhnYp.js → CopyButton-BOtR_h1H.js} +2 -2
  14. package/dist/admin/assets/{CopyButton-h4HYhnYp.js.map → CopyButton-BOtR_h1H.js.map} +1 -1
  15. package/dist/admin/assets/{CursorPager-H4SpVYw7.js → CursorPager-DwLW13ov.js} +2 -2
  16. package/dist/admin/assets/{CursorPager-H4SpVYw7.js.map → CursorPager-DwLW13ov.js.map} +1 -1
  17. package/dist/admin/assets/{ExternalLink-BNq7nAYL.js → ExternalLink-BITMgS1K.js} +2 -2
  18. package/dist/admin/assets/{ExternalLink-BNq7nAYL.js.map → ExternalLink-BITMgS1K.js.map} +1 -1
  19. package/dist/admin/assets/{FocalPoint-CSeKI4Iw.js → FocalPoint-n-a_AXKN.js} +2 -2
  20. package/dist/admin/assets/{FocalPoint-CSeKI4Iw.js.map → FocalPoint-n-a_AXKN.js.map} +1 -1
  21. package/dist/admin/assets/Form-D_4fhOy0.js +2 -0
  22. package/dist/admin/assets/Form-D_4fhOy0.js.map +1 -0
  23. package/dist/admin/assets/{FormCheckboxGroup-V3IKrvzc.js → FormCheckboxGroup-1fYisXrr.js} +2 -2
  24. package/dist/admin/assets/FormCheckboxGroup-1fYisXrr.js.map +1 -0
  25. package/dist/admin/assets/{FormRadioGroup-DIv-MYgn.js → FormRadioGroup-B0VZyb1t.js} +2 -2
  26. package/dist/admin/assets/{FormRadioGroup-DIv-MYgn.js.map → FormRadioGroup-B0VZyb1t.js.map} +1 -1
  27. package/dist/admin/assets/{FormSelectField-CUhaPIMY.js → FormSelectField-Br8bkwRF.js} +2 -2
  28. package/dist/admin/assets/{FormSelectField-CUhaPIMY.js.map → FormSelectField-Br8bkwRF.js.map} +1 -1
  29. package/dist/admin/assets/{FormSwitchField-DW8ysyk_.js → FormSwitchField-d8G-YCSX.js} +2 -2
  30. package/dist/admin/assets/{FormSwitchField-DW8ysyk_.js.map → FormSwitchField-d8G-YCSX.js.map} +1 -1
  31. package/dist/admin/assets/{FormTextareaField-DbqZ-MwI.js → FormTextareaField-BSKNeTPW.js} +2 -2
  32. package/dist/admin/assets/{FormTextareaField-DbqZ-MwI.js.map → FormTextareaField-BSKNeTPW.js.map} +1 -1
  33. package/dist/admin/assets/{HintedLabel-BlLtqVVz.js → HintedLabel-CiTDE112.js} +2 -2
  34. package/dist/admin/assets/{HintedLabel-BlLtqVVz.js.map → HintedLabel-CiTDE112.js.map} +1 -1
  35. package/dist/admin/assets/{InfoHint-bYMd_t0J.js → InfoHint-B3XcXtiN.js} +2 -2
  36. package/dist/admin/assets/{InfoHint-bYMd_t0J.js.map → InfoHint-B3XcXtiN.js.map} +1 -1
  37. package/dist/admin/assets/InlineConfirm-BfsNH5S_.js +2 -0
  38. package/dist/admin/assets/InlineConfirm-BfsNH5S_.js.map +1 -0
  39. package/dist/admin/assets/InsertMenuItem-BGwDW_Lu.js +2 -0
  40. package/dist/admin/assets/InsertMenuItem-BGwDW_Lu.js.map +1 -0
  41. package/dist/admin/assets/{LinkTabs-ByB2eCIr.js → LinkTabs-8SmS1vCd.js} +2 -2
  42. package/dist/admin/assets/{LinkTabs-ByB2eCIr.js.map → LinkTabs-8SmS1vCd.js.map} +1 -1
  43. package/dist/admin/assets/{Match-GDx_orOH.js → Match-Dc8bXsKo.js} +2 -2
  44. package/dist/admin/assets/{Match-GDx_orOH.js.map → Match-Dc8bXsKo.js.map} +1 -1
  45. package/dist/admin/assets/NoAccess-CKEKPmqD.js +2 -0
  46. package/dist/admin/assets/NoAccess-CKEKPmqD.js.map +1 -0
  47. package/dist/admin/assets/Panel-Bcl09TtM.js +2 -0
  48. package/dist/admin/assets/Panel-Bcl09TtM.js.map +1 -0
  49. package/dist/admin/assets/{QueryView-UBO-U5Wo.js → QueryView-KFtwko9F.js} +2 -2
  50. package/dist/admin/assets/{QueryView-UBO-U5Wo.js.map → QueryView-KFtwko9F.js.map} +1 -1
  51. package/dist/admin/assets/{RadioTile-CJbIIV8t.js → RadioTile-CzfxWgHx.js} +2 -2
  52. package/dist/admin/assets/{RadioTile-CJbIIV8t.js.map → RadioTile-CzfxWgHx.js.map} +1 -1
  53. package/dist/admin/assets/{RichTextField-M7HyUhYF.js → RichTextField-BsBoOAP-.js} +5 -5
  54. package/dist/admin/assets/{RichTextField-M7HyUhYF.js.map → RichTextField-BsBoOAP-.js.map} +1 -1
  55. package/dist/admin/assets/{RowTitle-DoxDM1XL.js → RowTitle-Cn5mAU58.js} +2 -2
  56. package/dist/admin/assets/{RowTitle-DoxDM1XL.js.map → RowTitle-Cn5mAU58.js.map} +1 -1
  57. package/dist/admin/assets/SecretReveal-BCOJAisI.js +2 -0
  58. package/dist/admin/assets/SecretReveal-BCOJAisI.js.map +1 -0
  59. package/dist/admin/assets/{SharedGlyph-D1OMHXPf.js → SharedGlyph-CA8tb7UH.js} +2 -2
  60. package/dist/admin/assets/{SharedGlyph-D1OMHXPf.js.map → SharedGlyph-CA8tb7UH.js.map} +1 -1
  61. package/dist/admin/assets/StepList-sriwGP1e.js +2 -0
  62. package/dist/admin/assets/StepList-sriwGP1e.js.map +1 -0
  63. package/dist/admin/assets/{Structure-CO4aJZVP.js → Structure-B2HZ9UZu.js} +2 -2
  64. package/dist/admin/assets/{Structure-CO4aJZVP.js.map → Structure-B2HZ9UZu.js.map} +1 -1
  65. package/dist/admin/assets/{SubNavLink-CPJFIt1j.js → SubNavLink-CiCaVV8U.js} +2 -2
  66. package/dist/admin/assets/{SubNavLink-CPJFIt1j.js.map → SubNavLink-CiCaVV8U.js.map} +1 -1
  67. package/dist/admin/assets/{SuggestAltButton-CbRUxD5s.js → SuggestAltButton-CqDLAuoa.js} +2 -2
  68. package/dist/admin/assets/{SuggestAltButton-CbRUxD5s.js.map → SuggestAltButton-CqDLAuoa.js.map} +1 -1
  69. package/dist/admin/assets/{TextLink-DnrMaF2F.js → TextLink-HRn66VL1.js} +2 -2
  70. package/dist/admin/assets/{TextLink-DnrMaF2F.js.map → TextLink-HRn66VL1.js.map} +1 -1
  71. package/dist/admin/assets/Thumbnail-mFfESZiW.js +2 -0
  72. package/dist/admin/assets/Thumbnail-mFfESZiW.js.map +1 -0
  73. package/dist/admin/assets/UnsavedChangesGuard-C8cDQGEA.js +2 -0
  74. package/dist/admin/assets/UnsavedChangesGuard-C8cDQGEA.js.map +1 -0
  75. package/dist/admin/assets/{UserAvatar-Bl32IpG_.js → UserAvatar-BItYDTyH.js} +2 -2
  76. package/dist/admin/assets/{UserAvatar-Bl32IpG_.js.map → UserAvatar-BItYDTyH.js.map} +1 -1
  77. package/dist/admin/assets/auth-CQO4MBUj.js +2 -0
  78. package/dist/admin/assets/auth-CQO4MBUj.js.map +1 -0
  79. package/dist/admin/assets/badge-DNQwGXBl.js +2 -0
  80. package/dist/admin/assets/{badge-ydvfgE8a.js.map → badge-DNQwGXBl.js.map} +1 -1
  81. package/dist/admin/assets/{boxes-D6Y4Cenx.js → boxes-CAygw8zF.js} +2 -2
  82. package/dist/admin/assets/{boxes-D6Y4Cenx.js.map → boxes-CAygw8zF.js.map} +1 -1
  83. package/dist/admin/assets/{calendar-clock-DFUgXWXg.js → calendar-clock-BZGtAvWR.js} +2 -2
  84. package/dist/admin/assets/{calendar-clock-DFUgXWXg.js.map → calendar-clock-BZGtAvWR.js.map} +1 -1
  85. package/dist/admin/assets/changeSets-EMTUJT0M.js +2 -0
  86. package/dist/admin/assets/changeSets-EMTUJT0M.js.map +1 -0
  87. package/dist/admin/assets/chevron-left-DGU3HGYG.js +2 -0
  88. package/dist/admin/assets/{chevron-left-CZXrLV99.js.map → chevron-left-DGU3HGYG.js.map} +1 -1
  89. package/dist/admin/assets/{circle-check-De27poaB.js → circle-check-C37MSJqX.js} +2 -2
  90. package/dist/admin/assets/{circle-check-De27poaB.js.map → circle-check-C37MSJqX.js.map} +1 -1
  91. package/dist/admin/assets/{clock-BGAXsuo4.js → clock-2arjsgZ4.js} +2 -2
  92. package/dist/admin/assets/{clock-BGAXsuo4.js.map → clock-2arjsgZ4.js.map} +1 -1
  93. package/dist/admin/assets/{constants-esJAnNTh.js → constants-miV4q1ur.js} +2 -2
  94. package/dist/admin/assets/{constants-esJAnNTh.js.map → constants-miV4q1ur.js.map} +1 -1
  95. package/dist/admin/assets/content-CgZS_S7P.js +3 -0
  96. package/dist/admin/assets/content-CgZS_S7P.js.map +1 -0
  97. package/dist/admin/assets/contentCounts-DP7YYeZZ.js +2 -0
  98. package/dist/admin/assets/{contentCounts-DknqJ4kh.js.map → contentCounts-DP7YYeZZ.js.map} +1 -1
  99. package/dist/admin/assets/{contentTypes-C-AKiYu1.js → contentTypes-CQsHL657.js} +2 -2
  100. package/dist/admin/assets/{contentTypes-C-AKiYu1.js.map → contentTypes-CQsHL657.js.map} +1 -1
  101. package/dist/admin/assets/context-IKYdzQJ-.js +2 -0
  102. package/dist/admin/assets/{context-fImO9k99.js.map → context-IKYdzQJ-.js.map} +1 -1
  103. package/dist/admin/assets/{copy-B5owk67M.js → copy-CsSRHgKZ.js} +2 -2
  104. package/dist/admin/assets/{copy-B5owk67M.js.map → copy-CsSRHgKZ.js.map} +1 -1
  105. package/dist/admin/assets/createLucideIcon-CLmh7Go-.js +2 -0
  106. package/dist/admin/assets/createLucideIcon-CLmh7Go-.js.map +1 -0
  107. package/dist/admin/assets/develop-9ZeAjSIw.js +11 -0
  108. package/dist/admin/assets/develop-9ZeAjSIw.js.map +1 -0
  109. package/dist/admin/assets/{dropdown-menu-C53v9ioW.js → dropdown-menu-0dyAtBEd.js} +2 -2
  110. package/dist/admin/assets/{dropdown-menu-C53v9ioW.js.map → dropdown-menu-0dyAtBEd.js.map} +1 -1
  111. package/dist/admin/assets/{ellipsis-BHtU4ov6.js → ellipsis-F91991on.js} +2 -2
  112. package/dist/admin/assets/{ellipsis-BHtU4ov6.js.map → ellipsis-F91991on.js.map} +1 -1
  113. package/dist/admin/assets/entryLink-CVB-TdIn.js +2 -0
  114. package/dist/admin/assets/entryLink-CVB-TdIn.js.map +1 -0
  115. package/dist/admin/assets/es2015-BJge4oQL.js +42 -0
  116. package/dist/admin/assets/es2015-BJge4oQL.js.map +1 -0
  117. package/dist/admin/assets/{external-link-nZp2VpKw.js → external-link-CdG6kHfA.js} +2 -2
  118. package/dist/admin/assets/{external-link-nZp2VpKw.js.map → external-link-CdG6kHfA.js.map} +1 -1
  119. package/dist/admin/assets/{field-W1dB_h6d.js → field-C6NmRYUN.js} +2 -2
  120. package/dist/admin/assets/{field-W1dB_h6d.js.map → field-C6NmRYUN.js.map} +1 -1
  121. package/dist/admin/assets/{file-stack-8rRouTJj.js → file-stack-28ZtO1xW.js} +2 -2
  122. package/dist/admin/assets/{file-stack-8rRouTJj.js.map → file-stack-28ZtO1xW.js.map} +1 -1
  123. package/dist/admin/assets/{fileRoute-DzWMBrRx.js → fileRoute-Bm90K4UY.js} +2 -2
  124. package/dist/admin/assets/{fileRoute-DzWMBrRx.js.map → fileRoute-Bm90K4UY.js.map} +1 -1
  125. package/dist/admin/assets/{folder-plus-B3L3b389.js → folder-plus-DIk0pWkP.js} +2 -2
  126. package/dist/admin/assets/{folder-plus-B3L3b389.js.map → folder-plus-DIk0pWkP.js.map} +1 -1
  127. package/dist/admin/assets/followPlural-DEr2kxEc.js +2 -0
  128. package/dist/admin/assets/followPlural-DEr2kxEc.js.map +1 -0
  129. package/dist/admin/assets/{globe-DKkjr9MZ.js → globe-DFr3Gd2w.js} +2 -2
  130. package/dist/admin/assets/{globe-DKkjr9MZ.js.map → globe-DFr3Gd2w.js.map} +1 -1
  131. package/dist/admin/assets/{image-B6aL7hP8.js → image-DT79QFa_.js} +2 -2
  132. package/dist/admin/assets/{image-B6aL7hP8.js.map → image-DT79QFa_.js.map} +1 -1
  133. package/dist/admin/assets/{image-off-TVxEyb74.js → image-off-DFs5upyX.js} +2 -2
  134. package/dist/admin/assets/{image-off-TVxEyb74.js.map → image-off-DFs5upyX.js.map} +1 -1
  135. package/dist/admin/assets/inbox-B8XZ8L6s.js +2 -0
  136. package/dist/admin/assets/inbox-B8XZ8L6s.js.map +1 -0
  137. package/dist/admin/assets/{inbox-BKqu1EfP.js → inbox-CySnQydm.js} +2 -2
  138. package/dist/admin/assets/{inbox-BKqu1EfP.js.map → inbox-CySnQydm.js.map} +1 -1
  139. package/dist/admin/assets/index-DoJsnLI1.js +4 -0
  140. package/dist/admin/assets/index-DoJsnLI1.js.map +1 -0
  141. package/dist/admin/assets/index-lxe7WimO.css +2 -0
  142. package/dist/admin/assets/{key-round-Dmdr1vP5.js → key-round-D36CePnN.js} +2 -2
  143. package/dist/admin/assets/{key-round-Dmdr1vP5.js.map → key-round-D36CePnN.js.map} +1 -1
  144. package/dist/admin/assets/{labels-CHE0gg1n.js → labels-B2HIVxXg.js} +2 -2
  145. package/dist/admin/assets/{labels-CHE0gg1n.js.map → labels-B2HIVxXg.js.map} +1 -1
  146. package/dist/admin/assets/{languages-BbfFIygP.js → languages-CzbTaQv9.js} +2 -2
  147. package/dist/admin/assets/{languages-BbfFIygP.js.map → languages-CzbTaQv9.js.map} +1 -1
  148. package/dist/admin/assets/{layers-B0jT4rc4.js → layers-BmcodiaH.js} +2 -2
  149. package/dist/admin/assets/{layers-B0jT4rc4.js.map → layers-BmcodiaH.js.map} +1 -1
  150. package/dist/admin/assets/{link-2-off-DC06jLDj.js → link-2-off-CoJNwrxm.js} +2 -2
  151. package/dist/admin/assets/{link-2-off-DC06jLDj.js.map → link-2-off-CoJNwrxm.js.map} +1 -1
  152. package/dist/admin/assets/{link-B3O0VUVT.js → link-Pyr2Y35S.js} +2 -2
  153. package/dist/admin/assets/{link-B3O0VUVT.js.map → link-Pyr2Y35S.js.map} +1 -1
  154. package/dist/admin/assets/locales-Bg3htKo8.js +2 -0
  155. package/dist/admin/assets/{locales-e7B5t6id.js.map → locales-Bg3htKo8.js.map} +1 -1
  156. package/dist/admin/assets/media-BCnVhaDH.js +2 -0
  157. package/dist/admin/assets/{media-VCJUbYzJ.js.map → media-BCnVhaDH.js.map} +1 -1
  158. package/dist/admin/assets/media-CtbfNgc-.js +2 -0
  159. package/dist/admin/assets/media-CtbfNgc-.js.map +1 -0
  160. package/dist/admin/assets/network--5X46kWN.js +2 -0
  161. package/dist/admin/assets/network--5X46kWN.js.map +1 -0
  162. package/dist/admin/assets/{plus-WfYKHW7G.js → plus-BoDtdLCo.js} +2 -2
  163. package/dist/admin/assets/{plus-WfYKHW7G.js.map → plus-BoDtdLCo.js.map} +1 -1
  164. package/dist/admin/assets/publishing-DdmWXRaM.js +2 -0
  165. package/dist/admin/assets/{publishing-ClNjPLQ9.js.map → publishing-DdmWXRaM.js.map} +1 -1
  166. package/dist/admin/assets/{radio-group-rFxn7cz2.js → radio-group-BoN9R_3K.js} +2 -2
  167. package/dist/admin/assets/{radio-group-rFxn7cz2.js.map → radio-group-BoN9R_3K.js.map} +1 -1
  168. package/dist/admin/assets/{rotate-ccw-Cvc_uA58.js → rotate-ccw-DL6TzcZh.js} +2 -2
  169. package/dist/admin/assets/{rotate-ccw-Cvc_uA58.js.map → rotate-ccw-DL6TzcZh.js.map} +1 -1
  170. package/dist/admin/assets/schedules-BmB9Y73z.js +2 -0
  171. package/dist/admin/assets/{schedules-CBGpjEg7.js.map → schedules-BmB9Y73z.js.map} +1 -1
  172. package/dist/admin/assets/schema-D-qo7XSF.js +2 -0
  173. package/dist/admin/assets/schema-D-qo7XSF.js.map +1 -0
  174. package/dist/admin/assets/{scroll-text-gKYBbibb.js → scroll-text-PqeZm472.js} +2 -2
  175. package/dist/admin/assets/{scroll-text-gKYBbibb.js.map → scroll-text-PqeZm472.js.map} +1 -1
  176. package/dist/admin/assets/{search-CW3iBC4k.js → search-BdwIwOzC.js} +2 -2
  177. package/dist/admin/assets/{search-CW3iBC4k.js.map → search-BdwIwOzC.js.map} +1 -1
  178. package/dist/admin/assets/searchSchemas-DNjfDxmj.js +2 -0
  179. package/dist/admin/assets/{searchSchemas-C4qp-vCa.js.map → searchSchemas-DNjfDxmj.js.map} +1 -1
  180. package/dist/admin/assets/{sections-CN5fIoAr.js → sections-BTS683ur.js} +2 -2
  181. package/dist/admin/assets/{sections-CN5fIoAr.js.map → sections-BTS683ur.js.map} +1 -1
  182. package/dist/admin/assets/sections-BfxPwK0u.js +2 -0
  183. package/dist/admin/assets/{sections-C7Z6Xd8r.js.map → sections-BfxPwK0u.js.map} +1 -1
  184. package/dist/admin/assets/{select-DUhL27UN.js → select-Bp8kO5Ko.js} +2 -2
  185. package/dist/admin/assets/{select-DUhL27UN.js.map → select-Bp8kO5Ko.js.map} +1 -1
  186. package/dist/admin/assets/{send-DRA-Pe46.js → send-XPWo3m4u.js} +2 -2
  187. package/dist/admin/assets/{send-DRA-Pe46.js.map → send-XPWo3m4u.js.map} +1 -1
  188. package/dist/admin/assets/seo-CceGYTIX.js +2 -0
  189. package/dist/admin/assets/{seo-l1ZORjtv.js.map → seo-CceGYTIX.js.map} +1 -1
  190. package/dist/admin/assets/settings-TEbLvC-v.js +2 -0
  191. package/dist/admin/assets/settings-TEbLvC-v.js.map +1 -0
  192. package/dist/admin/assets/settle-CFU6YpQ0.js +2 -0
  193. package/dist/admin/assets/settle-CFU6YpQ0.js.map +1 -0
  194. package/dist/admin/assets/shapes-WrYO9Spf.js +6 -0
  195. package/dist/admin/assets/shapes-WrYO9Spf.js.map +1 -0
  196. package/dist/admin/assets/{skeleton-Dyi_b1wq.js → skeleton-vXOCdnJv.js} +2 -2
  197. package/dist/admin/assets/{skeleton-Dyi_b1wq.js.map → skeleton-vXOCdnJv.js.map} +1 -1
  198. package/dist/admin/assets/slugify-rYFum3Sc.js +2 -0
  199. package/dist/admin/assets/slugify-rYFum3Sc.js.map +1 -0
  200. package/dist/admin/assets/snapshots-DUI2t-qF.js +2 -0
  201. package/dist/admin/assets/snapshots-DUI2t-qF.js.map +1 -0
  202. package/dist/admin/assets/{sparkles-DCRAqbqD.js → sparkles-CvT-jxrW.js} +2 -2
  203. package/dist/admin/assets/{sparkles-DCRAqbqD.js.map → sparkles-CvT-jxrW.js.map} +1 -1
  204. package/dist/admin/assets/src-ndgTSYLX.js +7 -0
  205. package/dist/admin/assets/src-ndgTSYLX.js.map +1 -0
  206. package/dist/admin/assets/{stableId-iRkUbVIP.js → stableId-BrtQedPy.js} +2 -2
  207. package/dist/admin/assets/{stableId-iRkUbVIP.js.map → stableId-BrtQedPy.js.map} +1 -1
  208. package/dist/admin/assets/store-CdIFG90N.js +2 -0
  209. package/dist/admin/assets/{store-DknnssoQ.js.map → store-CdIFG90N.js.map} +1 -1
  210. package/dist/admin/assets/{switch-C3dDDUIk.js → switch-B1xClhNG.js} +2 -2
  211. package/dist/admin/assets/{switch-C3dDDUIk.js.map → switch-B1xClhNG.js.map} +1 -1
  212. package/dist/admin/assets/theme-65PB8uAu.js +2 -0
  213. package/dist/admin/assets/{theme-DPe080iG.js.map → theme-65PB8uAu.js.map} +1 -1
  214. package/dist/admin/assets/titles-CQiqqDw-.js +2 -0
  215. package/dist/admin/assets/titles-CQiqqDw-.js.map +1 -0
  216. package/dist/admin/assets/tokens-ixHjAkDK.js +2 -0
  217. package/dist/admin/assets/{tokens-BlIDIMY9.js.map → tokens-ixHjAkDK.js.map} +1 -1
  218. package/dist/admin/assets/{tooltip-BEaZkRPK.js → tooltip-CS_8cJu2.js} +2 -2
  219. package/dist/admin/assets/{tooltip-BEaZkRPK.js.map → tooltip-CS_8cJu2.js.map} +1 -1
  220. package/dist/admin/assets/{undo-2-Zd1OT6qk.js → undo-2-BiTANHFz.js} +2 -2
  221. package/dist/admin/assets/{undo-2-Zd1OT6qk.js.map → undo-2-BiTANHFz.js.map} +1 -1
  222. package/dist/admin/assets/useContentSchema-DtYfhsd2.js +2 -0
  223. package/dist/admin/assets/{useContentSchema-wLDa2L3f.js.map → useContentSchema-DtYfhsd2.js.map} +1 -1
  224. package/dist/admin/assets/useCursorPager-0zHjlm-7.js +2 -0
  225. package/dist/admin/assets/{useCursorPager-Dc-9B67j.js.map → useCursorPager-0zHjlm-7.js.map} +1 -1
  226. package/dist/admin/assets/useDiscardGuard-CMMJgkI2.js +2 -0
  227. package/dist/admin/assets/useDiscardGuard-CMMJgkI2.js.map +1 -0
  228. package/dist/admin/assets/useMediaPickerDialog-xvQ8cofO.js +2 -0
  229. package/dist/admin/assets/{useMediaPickerDialog-CFN9ZKfe.js.map → useMediaPickerDialog-xvQ8cofO.js.map} +1 -1
  230. package/dist/admin/assets/useMediaUploader-BVNTeSAU.js +2 -0
  231. package/dist/admin/assets/{useMediaUploader-B42H_CMG.js.map → useMediaUploader-BVNTeSAU.js.map} +1 -1
  232. package/dist/admin/assets/useNetworkPermission-Cts98h9d.js +2 -0
  233. package/dist/admin/assets/{useNetworkPermission-CegwqQXR.js.map → useNetworkPermission-Cts98h9d.js.map} +1 -1
  234. package/dist/admin/assets/usePaletteItems-DtReWmkd.js +2 -0
  235. package/dist/admin/assets/{usePaletteItems-B3y2t7Ly.js.map → usePaletteItems-DtReWmkd.js.map} +1 -1
  236. package/dist/admin/assets/usePlaces-DC47wVeU.js +2 -0
  237. package/dist/admin/assets/{usePlaces-CAXr-IO9.js.map → usePlaces-DC47wVeU.js.map} +1 -1
  238. package/dist/admin/assets/useQueries-CirW3Mvp.js +2 -0
  239. package/dist/admin/assets/{useQueries-CX6eFr24.js.map → useQueries-CirW3Mvp.js.map} +1 -1
  240. package/dist/admin/assets/{useResolvedScheme-aV0QDPi3.js → useResolvedScheme-CScQpr-P.js} +2 -2
  241. package/dist/admin/assets/{useResolvedScheme-aV0QDPi3.js.map → useResolvedScheme-CScQpr-P.js.map} +1 -1
  242. package/dist/admin/assets/{useSchemaScopeAccess-DyfiZnzs.js → useSchemaScopeAccess-ByrxIdKM.js} +2 -2
  243. package/dist/admin/assets/{useSchemaScopeAccess-DyfiZnzs.js.map → useSchemaScopeAccess-ByrxIdKM.js.map} +1 -1
  244. package/dist/admin/assets/users-2iJYwlJb.js +2 -0
  245. package/dist/admin/assets/users-2iJYwlJb.js.map +1 -0
  246. package/dist/admin/assets/{users-ohHZnBJW.js → users-DM7CXUBJ.js} +2 -2
  247. package/dist/admin/assets/{users-ohHZnBJW.js.map → users-DM7CXUBJ.js.map} +1 -1
  248. package/dist/admin/assets/{zod-C-k48Hnc.js → zod-hUh5nXnX.js} +2 -2
  249. package/dist/admin/assets/{zod-C-k48Hnc.js.map → zod-hUh5nXnX.js.map} +1 -1
  250. package/dist/admin/index.html +59 -60
  251. package/dist/cli.js +10 -5689
  252. package/dist/cli.js.map +1 -1
  253. package/dist/cliMain-D08HeAd_.js +5771 -0
  254. package/dist/cliMain-D08HeAd_.js.map +1 -0
  255. package/dist/config.d.ts +1 -1
  256. package/dist/config.js +1 -38
  257. package/dist/contentDisposition-DOL2Xt0l.js +90 -0
  258. package/dist/contentDisposition-DOL2Xt0l.js.map +1 -0
  259. package/dist/index.d.ts +30 -8
  260. package/dist/index.js +2 -2
  261. package/dist/public-B57h4F7Y.js +39 -0
  262. package/dist/public-B57h4F7Y.js.map +1 -0
  263. package/dist/{public-BO_wneBL.d.ts → public-COKbHR-N.d.ts} +47 -3
  264. package/dist/{s3Adapter-sL1zP4Zl.js → s3Adapter-U01iEAcK.js} +2 -2
  265. package/dist/{s3Adapter-sL1zP4Zl.js.map → s3Adapter-U01iEAcK.js.map} +1 -1
  266. package/dist/{worker-DMES6pqh.js → worker-jspgh10V.js} +6384 -4527
  267. package/dist/worker-jspgh10V.js.map +1 -0
  268. package/package.json +5 -5
  269. package/dist/admin/assets/AssistError-drmpXSbS.js +0 -2
  270. package/dist/admin/assets/Body-Gn_z2KPN.js +0 -2
  271. package/dist/admin/assets/Builder-DyCcikfS.js +0 -2
  272. package/dist/admin/assets/Builder-DyCcikfS.js.map +0 -1
  273. package/dist/admin/assets/ConfirmDialog-DZRJfdvH.js +0 -2
  274. package/dist/admin/assets/ConfirmDialog-DZRJfdvH.js.map +0 -1
  275. package/dist/admin/assets/Form-DF_YmR1G.js +0 -2
  276. package/dist/admin/assets/Form-DF_YmR1G.js.map +0 -1
  277. package/dist/admin/assets/FormCheckboxGroup-V3IKrvzc.js.map +0 -1
  278. package/dist/admin/assets/InsertMenuItem-D2HGERzb.js +0 -2
  279. package/dist/admin/assets/InsertMenuItem-D2HGERzb.js.map +0 -1
  280. package/dist/admin/assets/Panel-B1TkcP8V.js +0 -2
  281. package/dist/admin/assets/Panel-B1TkcP8V.js.map +0 -1
  282. package/dist/admin/assets/SecretReveal-kCkLH5jg.js +0 -2
  283. package/dist/admin/assets/SecretReveal-kCkLH5jg.js.map +0 -1
  284. package/dist/admin/assets/StepList-BIQjDaWQ.js +0 -2
  285. package/dist/admin/assets/StepList-BIQjDaWQ.js.map +0 -1
  286. package/dist/admin/assets/Thumbnail-D1XuDElk.js +0 -2
  287. package/dist/admin/assets/Thumbnail-D1XuDElk.js.map +0 -1
  288. package/dist/admin/assets/UnsavedChangesGuard-C1n7egF6.js +0 -2
  289. package/dist/admin/assets/UnsavedChangesGuard-C1n7egF6.js.map +0 -1
  290. package/dist/admin/assets/auth-C4fHG9Iu.js +0 -2
  291. package/dist/admin/assets/auth-C4fHG9Iu.js.map +0 -1
  292. package/dist/admin/assets/badge-ydvfgE8a.js +0 -2
  293. package/dist/admin/assets/changeSets-DgfCKja3.js +0 -2
  294. package/dist/admin/assets/changeSets-DgfCKja3.js.map +0 -1
  295. package/dist/admin/assets/chevron-left-CZXrLV99.js +0 -2
  296. package/dist/admin/assets/content-DsMSB6Wb.js +0 -3
  297. package/dist/admin/assets/content-DsMSB6Wb.js.map +0 -1
  298. package/dist/admin/assets/contentCounts-DknqJ4kh.js +0 -2
  299. package/dist/admin/assets/context-fImO9k99.js +0 -2
  300. package/dist/admin/assets/createLucideIcon-CqygG5K6.js +0 -2
  301. package/dist/admin/assets/createLucideIcon-CqygG5K6.js.map +0 -1
  302. package/dist/admin/assets/develop-DL-2W9jv.js +0 -11
  303. package/dist/admin/assets/develop-DL-2W9jv.js.map +0 -1
  304. package/dist/admin/assets/es2015-DrAA1N2V.js +0 -42
  305. package/dist/admin/assets/es2015-DrAA1N2V.js.map +0 -1
  306. package/dist/admin/assets/followPlural-D-5ZJqJF.js +0 -2
  307. package/dist/admin/assets/followPlural-D-5ZJqJF.js.map +0 -1
  308. package/dist/admin/assets/inbox-DUqOrFEA.js +0 -2
  309. package/dist/admin/assets/inbox-DUqOrFEA.js.map +0 -1
  310. package/dist/admin/assets/index-BEM45u2w.css +0 -2
  311. package/dist/admin/assets/index-D03RZB7e.js +0 -4
  312. package/dist/admin/assets/index-D03RZB7e.js.map +0 -1
  313. package/dist/admin/assets/loader-circle-C-9trZPI.js +0 -2
  314. package/dist/admin/assets/loader-circle-C-9trZPI.js.map +0 -1
  315. package/dist/admin/assets/locales-e7B5t6id.js +0 -2
  316. package/dist/admin/assets/media-BUUEsWxd.js +0 -2
  317. package/dist/admin/assets/media-BUUEsWxd.js.map +0 -1
  318. package/dist/admin/assets/media-VCJUbYzJ.js +0 -2
  319. package/dist/admin/assets/network-Bolr2lmf.js +0 -2
  320. package/dist/admin/assets/network-Bolr2lmf.js.map +0 -1
  321. package/dist/admin/assets/pencil-BVSFlU14.js +0 -2
  322. package/dist/admin/assets/pencil-BVSFlU14.js.map +0 -1
  323. package/dist/admin/assets/publishing-ClNjPLQ9.js +0 -2
  324. package/dist/admin/assets/schedules-CBGpjEg7.js +0 -2
  325. package/dist/admin/assets/schema-D9BgCVzZ.js +0 -2
  326. package/dist/admin/assets/schema-D9BgCVzZ.js.map +0 -1
  327. package/dist/admin/assets/searchSchemas-C4qp-vCa.js +0 -2
  328. package/dist/admin/assets/sections-C7Z6Xd8r.js +0 -2
  329. package/dist/admin/assets/seo-l1ZORjtv.js +0 -2
  330. package/dist/admin/assets/settings-DgoG3H8C.js +0 -2
  331. package/dist/admin/assets/settings-DgoG3H8C.js.map +0 -1
  332. package/dist/admin/assets/settle-LRKtTN_e.js +0 -2
  333. package/dist/admin/assets/settle-LRKtTN_e.js.map +0 -1
  334. package/dist/admin/assets/shapes-BZ87ap5s.js +0 -6
  335. package/dist/admin/assets/shapes-BZ87ap5s.js.map +0 -1
  336. package/dist/admin/assets/snapshots-CT-zs6Up.js +0 -2
  337. package/dist/admin/assets/snapshots-CT-zs6Up.js.map +0 -1
  338. package/dist/admin/assets/src-BcLeD2-K.js +0 -7
  339. package/dist/admin/assets/src-BcLeD2-K.js.map +0 -1
  340. package/dist/admin/assets/store-DknnssoQ.js +0 -2
  341. package/dist/admin/assets/theme-DPe080iG.js +0 -2
  342. package/dist/admin/assets/titles-C5PaMgFJ.js +0 -2
  343. package/dist/admin/assets/titles-C5PaMgFJ.js.map +0 -1
  344. package/dist/admin/assets/tokens-BlIDIMY9.js +0 -2
  345. package/dist/admin/assets/useAuditLabels-DWBpLOTB.js +0 -2
  346. package/dist/admin/assets/useAuditLabels-DWBpLOTB.js.map +0 -1
  347. package/dist/admin/assets/useContentSchema-wLDa2L3f.js +0 -2
  348. package/dist/admin/assets/useCursorPager-Dc-9B67j.js +0 -2
  349. package/dist/admin/assets/useDiscardGuard-WTUINqD5.js +0 -2
  350. package/dist/admin/assets/useDiscardGuard-WTUINqD5.js.map +0 -1
  351. package/dist/admin/assets/useMediaPickerDialog-CFN9ZKfe.js +0 -2
  352. package/dist/admin/assets/useMediaUploader-B42H_CMG.js +0 -2
  353. package/dist/admin/assets/useNetworkPermission-CegwqQXR.js +0 -2
  354. package/dist/admin/assets/usePaletteItems-B3y2t7Ly.js +0 -2
  355. package/dist/admin/assets/usePlaces-CAXr-IO9.js +0 -2
  356. package/dist/admin/assets/useQueries-CX6eFr24.js +0 -2
  357. package/dist/admin/assets/users-CDoJRL24.js +0 -2
  358. package/dist/admin/assets/users-CDoJRL24.js.map +0 -1
  359. package/dist/config.js.map +0 -1
  360. package/dist/worker-DMES6pqh.js.map +0 -1
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{t as r}from"./loader-circle-C-9trZPI.js";import{c as i,i as a,l as o,n as s,o as c,r as l,s as u,t as d,u as f}from"./media-VCJUbYzJ.js";import{T as ee,h as te}from"./auth-C4fHG9Iu.js";import{A as ne,O as p,_ as re,a as ie,c as ae,d as oe,f as se,i as ce,k as le,l as ue,m as de,n as m,p as fe,r as h,t as pe,u as me,v as he}from"./badge-ydvfgE8a.js";import{m as ge,n as g,t as _}from"./createLucideIcon-CqygG5K6.js";import{o as _e}from"./RowTitle-DoxDM1XL.js";import{t as ve}from"./fileRoute-DzWMBrRx.js";import{E as v,a as ye,i as be,n as xe}from"./InfoHint-bYMd_t0J.js";import{T as y,x as Se}from"./es2015-DrAA1N2V.js";import{c as Ce,i as b,n as we,t as x}from"./skeleton-Dyi_b1wq.js";import{a as Te,i as S,o as Ee,r as C,t as De}from"./ConfirmDialog-DZRJfdvH.js";import{t as Oe}from"./external-link-nZp2VpKw.js";import{_ as w,a as ke,n as Ae,o as je,r as Me,t as Ne}from"./field-W1dB_h6d.js";import{t as Pe}from"./FocalPoint-CSeKI4Iw.js";import{t as Fe}from"./ellipsis-BHtU4ov6.js";import{a as Ie,c as T,i as Le,n as Re,o as ze,r as E,s as Be}from"./Thumbnail-D1XuDElk.js";import{t as D}from"./folder-plus-B3L3b389.js";import{t as Ve}from"./globe-DKkjr9MZ.js";import{a as He,c as Ue,i as We,n as Ge,o as Ke,r as O,t as qe}from"./useMediaUploader-B42H_CMG.js";import{t as k}from"./inbox-BKqu1EfP.js";import{a as A,l as Je,p as Ye,r as Xe,t as Ze}from"./dropdown-menu-C53v9ioW.js";import{t as j}from"./pencil-BVSFlU14.js";import{t as M}from"./cn-DVhJ55Mo.js";import{t as Qe}from"./switch-C3dDDUIk.js";import{c as $e,n as et,o as N,r as tt,t as nt,u as P}from"./zod-C-k48Hnc.js";import{t as F}from"./settle-LRKtTN_e.js";import{g as I,h as L,v as R}from"./table-zG68ipQc.js";import{t as rt}from"./useDiscardGuard-WTUINqD5.js";import{i as z,r as it}from"./constants-DCtq_UOe.js";import{t as at}from"./SuggestAltButton-CbRUxD5s.js";import{t as ot}from"./Panel-B1TkcP8V.js";import{t as st}from"./CopyButton-h4HYhnYp.js";import{t as B}from"./FormTextareaField-DbqZ-MwI.js";var V={name:`folder-input`,size:24,node:[[`path`,{d:`M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1`,key:`fm4g5t`}],[`path`,{d:`M2 13h10`,key:`pgb2dq`}],[`path`,{d:`m9 16 3-3-3-3`,key:`6m91ic`}]]};V.node;var ct=_(V),H={name:`folder-open`,size:24,node:[[`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`,key:`usdka0`}]]};H.node;var lt=_(H),U={name:`folder`,size:24,node:[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]};U.node;var W=_(U),G=e(t(),1),ut=I({filename:N().max(255,`validation.tooLong`),alt:R().max(1e3,`validation.tooLong`),caption:R().max(4e3,`validation.tooLong`),focalPoint:I({x:L().min(0).max(1),y:L().min(0).max(1)}).nullable()}),K=e=>({filename:e?.filename??``,alt:e?.alt??``,caption:e?.caption??``,focalPoint:e?.focalPoint??null}),dt=(e,t)=>({expectedVersion:e.version,...t.filename===e.filename?{}:{filename:t.filename.trim()},...t.alt===e.alt?{}:{alt:t.alt},...t.caption===e.caption?{}:{caption:t.caption},...JSON.stringify(t.focalPoint)===JSON.stringify(e.focalPoint)?{}:{focalPoint:t.focalPoint}}),ft=e=>{let t=o(),n=P({resolver:nt(ut),defaultValues:K(e)}),{reset:r}=n;return(0,G.useEffect)(()=>{r(K(e)),t.reset()},[e?.id,r]),{form:n,onSubmit:n.handleSubmit(async n=>{if(!e)return;let i=await F(t.mutateAsync({id:e.id,input:dt(e,n)}));i.ok&&(r(K(i.value)),v.success(y.t(`media.details.saved`)))}),pending:t.isPending,error:t.error}},pt=e=>{let t=e instanceof ge?e.details:void 0;return typeof t?.usageCount==`number`?t.usageCount:0},mt=(e,t,n)=>{let r=s(),[i,a]=(0,G.useState)(void 0),[o,c]=(0,G.useState)(!1),[l,u]=(0,G.useState)(0),d=e=>{v.success(y.t(`media.delete.done`,{name:e.filename})),n()};return{blockedUsageCount:i&&i.assetId===e?.id?i.usageCount:void 0,confirm:async()=>{if(e){try{await r.mutateAsync({id:e.id,force:!1})}catch(n){if(!te(n,`MEDIA_IN_USE`))throw n;let i=pt(n);if(!t)throw a({assetId:e.id,usageCount:i}),n;r.reset(),u(i),c(!0);return}d(e)}},force:{open:o,usageCount:l,pending:r.isPending,error:r.error,onOpenChange:c,confirm:()=>{e&&r.mutate({id:e.id,force:!0},{onSuccess:()=>{c(!1),d(e)}})}}}},q=e(n(),1),ht=({asset:e,onDeleted:t})=>{let{t:n}=g(),{isOwner:r}=T(),i=mt(e,r,t),a=i.blockedUsageCount;return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(C,{tone:`danger`,align:`start`,side:`top`,title:n(`media.delete.title`,{name:e.filename}),description:a===void 0?n(`media.delete.description`):`${n(`media.delete.inUseDescription`,{count:a})} ${n(`media.delete.onlyOwners`)}`,confirmLabel:n(`common.delete`),onConfirm:i.confirm,trigger:(0,q.jsxs)(b,{variant:`destructive-ghost`,children:[(0,q.jsx)(w,{"aria-hidden":`true`}),n(`media.delete.action`)]})}),(0,q.jsx)(De,{open:i.force.open,onOpenChange:i.force.onOpenChange,title:n(`media.delete.inUseTitle`),description:`${n(`media.delete.inUseDescription`,{count:i.force.usageCount})} ${n(`media.delete.ownerMayForce`)}`,confirmLabel:n(`media.delete.force`),destructive:!0,pending:i.force.pending,error:i.force.error,onConfirm:i.force.confirm})]})},gt=({asset:e,form:t,onSubmit:n,pending:r,error:i,readOnly:a})=>{let{t:o}=g(),s=$e({control:t.control,name:`focalPoint`}),c=E(e.mimeType);return(0,q.jsx)(`form`,{noValidate:!0,"aria-label":o(`media.details.formLabel`),onSubmit:e=>{e.preventDefault(),n()},children:(0,q.jsx)(`fieldset`,{disabled:a,className:`contents`,children:(0,q.jsxs)(ke,{children:[(0,q.jsx)(et,{control:t.control,name:`filename`,label:o(`media.fields.filename`),autoComplete:`off`}),c?(0,q.jsx)(B,{control:t.control,name:`alt`,label:o(`media.fields.alt`),rows:2,placeholder:o(`media.details.altHint`)}):null,c&&!a?(0,q.jsx)(at,{assetId:e.id,mimeType:e.mimeType,onSuggest:e=>t.setValue(`alt`,e,{shouldDirty:!0,shouldValidate:!0})}):null,(0,q.jsx)(B,{control:t.control,name:`caption`,label:o(`media.fields.caption`),rows:2}),c&&!a?(0,q.jsx)(Pe,{imageUrl:e.url,value:s.field.value,onChange:e=>s.field.onChange(e)}):null,(0,q.jsx)(S,{error:i}),a?null:(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(re,{pending:r,pendingLabel:o(`common.saving`),disabled:!t.formState.isDirty,children:o(`common.saveChanges`)})})]})})})},_t=e=>e.variants.find(e=>e.name===`w1280`&&e.url)?.url??e.variants.find(e=>e.name===`w640`&&e.url)?.url??e.url,vt=({asset:e})=>{let{t}=g();return E(e.mimeType)?(0,q.jsx)(`img`,{src:_t(e),alt:e.alt||t(`media.details.previewOf`,{name:e.filename}),className:`max-h-72 w-full rounded-lg border bg-muted object-contain`}):e.mimeType.startsWith(`video/`)?(0,q.jsx)(`video`,{src:e.url,controls:!0,preload:`metadata`,className:`max-h-72 w-full rounded-lg border bg-muted`}):e.mimeType.startsWith(`audio/`)?(0,q.jsx)(`audio`,{src:e.url,controls:!0,preload:`metadata`,className:`w-full`}):(0,q.jsxs)(`div`,{className:`flex flex-col items-center gap-3 rounded-lg border bg-muted px-4 py-8`,children:[(0,q.jsx)(Le,{mimeType:e.mimeType,className:`size-10 text-muted-foreground`}),(0,q.jsx)(b,{asChild:!0,variant:`outline`,size:`sm`,children:(0,q.jsxs)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,children:[(0,q.jsx)(Oe,{"aria-hidden":`true`}),t(`media.details.openFile`)]})})]})},J=({title:e,children:t})=>(0,q.jsxs)(`section`,{className:`space-y-3`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-semibold`,children:e}),t]}),yt=({assetId:e})=>{let{t}=g(),n=u(e);return n.isPending?(0,q.jsx)(x,{className:`h-8 w-full`}):n.isError?(0,q.jsx)(h,{error:n.error,onRetry:()=>void n.refetch()}):n.data.total===0?(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:t(`media.usage.none`)}):(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(`p`,{className:`text-sm`,children:t(`media.usage.count`,{count:n.data.total})}),(0,q.jsx)(`ul`,{className:`divide-y rounded-lg border`,children:n.data.items.map(e=>(0,q.jsxs)(`li`,{className:`flex min-w-0 items-center gap-2 px-3 py-2`,children:[(0,q.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-mono text-xs`,title:e.entryId,children:t(`media.usage.entry`,{id:e.entryId})}),(0,q.jsx)(pe,{variant:`outline`,className:`font-mono`,children:e.locale}),(0,q.jsx)(m,{size:`sm`,tone:e.state===`published`?`success`:`neutral`,label:e.state===`published`?t(`media.usage.published`):t(`media.usage.draft`)})]},`${e.entryId}:${e.fieldId}:${e.locale}:${e.state}`))})]})},bt=({asset:e,canManage:t})=>{let{t:n}=g(),r=o(),[i,a]=(0,G.useState)(!1),s=e.visibility===`private`,c=s?`public`:`private`,l=n(s?`media.visibility.privateExplanation`:`media.visibility.publicExplanation`);return(0,q.jsxs)(Ne,{orientation:`horizontal`,children:[(0,q.jsxs)(Ae,{children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[s?(0,q.jsx)(ne,{"aria-hidden":`true`,className:`size-4 text-muted-foreground`}):(0,q.jsx)(Ve,{"aria-hidden":`true`,className:`size-4 text-muted-foreground`}),(0,q.jsx)(je,{htmlFor:`asset-private`,children:n(`media.visibility.privateLabel`)})]}),(0,q.jsx)(Me,{id:`asset-private-description`,children:t?l:`${l} ${n(`media.visibility.needsManage`)}`})]}),(0,q.jsx)(C,{tone:c===`public`?`danger`:`default`,open:i,onOpenChange:a,title:n(c===`private`?`media.visibility.makePrivateTitle`:`media.visibility.makePublicTitle`),description:n(c===`private`?`media.visibility.makePrivateDescription`:`media.visibility.makePublicDescription`),confirmLabel:n(c===`private`?`media.visibility.makePrivate`:`media.visibility.makePublic`),onConfirm:()=>r.mutateAsync({id:e.id,input:{expectedVersion:e.version,visibility:c}}).then(()=>v.success(n(`media.visibility.changed`))),children:(0,q.jsx)(Qe,{id:`asset-private`,checked:s,disabled:!t||r.isPending,"aria-describedby":`asset-private-description`,onCheckedChange:()=>a(!0)})})]})},xt=({assetId:e,onClose:t,onReplace:n})=>{let{t:r}=g(),i=a(e),o=i.data,{canWrite:s,canManage:c}=T(),l=ft(o),{requestOpenChange:u,discardPrompt:d}=rt({dirty:l.form.formState.isDirty,pending:l.pending,onOpenChange:e=>{e||(l.form.reset(),t())}}),f=o?ze[o.status]:void 0;return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(ae,{open:e!==void 0,onOpenChange:u,children:(0,q.jsxs)(me,{size:`sm`,children:[(0,q.jsxs)(fe,{children:[(0,q.jsx)(de,{className:`pr-8 break-all`,children:o?.filename??r(`media.details.title`)}),(0,q.jsx)(oe,{className:`text-meta`,children:o?[Re(o.filename,o.mimeType),Be(o.sizeBytes),o.width&&o.height?r(`media.dimensions`,{width:o.width,height:o.height}):``].filter(Boolean).join(` · `):r(`common.loading`)}),o&&f?(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 pt-1`,children:[(0,q.jsx)(m,{tone:f.tone,label:r(f.labelKey)}),o.visibility===`private`?(0,q.jsx)(m,{tone:`muted`,label:r(`media.visibility.private`)}):null,(0,q.jsx)(`span`,{className:`ml-auto`,children:(0,q.jsx)(st,{value:o.url})})]}):null]}),(0,q.jsxs)(ue,{className:`space-y-6`,children:[i.isPending?(0,q.jsx)(he,{rows:3}):null,i.isError?(0,q.jsx)(h,{error:i.error,onRetry:()=>void i.refetch()}):null,o&&f?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsx)(vt,{asset:o}),o.urlExpiresAt?(0,q.jsx)(`p`,{className:`text-meta text-muted-foreground`,children:r(`media.details.signedLinkNote`)}):null,o.processingError?(0,q.jsxs)(Te,{variant:`destructive`,children:[(0,q.jsx)(le,{"aria-hidden":`true`}),(0,q.jsx)(Ee,{children:o.processingError})]}):null]}),(0,q.jsx)(J,{title:r(`media.details.metadata`),children:(0,q.jsx)(gt,{asset:o,form:l.form,onSubmit:()=>void l.onSubmit(),pending:l.pending,error:l.error,readOnly:!s})}),(0,q.jsx)(J,{title:r(`media.usage.title`),children:(0,q.jsx)(yt,{assetId:o.id})}),(0,q.jsx)(J,{title:r(`media.visibility.title`),children:(0,q.jsx)(bt,{asset:o,canManage:c})}),(0,q.jsx)(J,{title:r(`media.variants.title`),children:(0,q.jsx)(Ie,{asset:o})})]}):null]}),o&&(s||c)?(0,q.jsxs)(se,{className:`flex-row flex-wrap justify-between`,children:[c?(0,q.jsx)(ht,{asset:o,onDeleted:t}):null,s?(0,q.jsx)(O,{variant:`outline`,multiple:!1,label:r(`media.details.replace`),onFiles:([e])=>e?n(o.id,e):void 0,className:`ml-auto`}):null]}):null]})}),d]})},Y=e=>e.dataTransfer.types.includes(`Files`),St=({enabled:e,onFiles:t,children:n,className:r})=>{let{t:i}=g(),[a,o]=(0,G.useState)(!1),s=(0,G.useRef)(0);return e?(0,q.jsxs)(`div`,{className:M(`relative`,r),onDragEnter:e=>{Y(e)&&(s.current+=1,o(!0))},onDragLeave:()=>{s.current=Math.max(0,s.current-1),s.current===0&&o(!1)},onDragOver:e=>{Y(e)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)},onDrop:e=>{e.preventDefault(),s.current=0,o(!1);let n=[...e.dataTransfer.files];n.length>0&&t(n)},children:[n,a?(0,q.jsxs)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-primary bg-background/90 text-primary`,children:[(0,q.jsx)(Ke,{className:`size-8`}),(0,q.jsx)(`p`,{className:`font-semibold`,children:i(`media.upload.dropHere`)})]}):null]}):(0,q.jsx)(`div`,{className:r,children:n})},X=e=>{let t=Map.groupBy(e,t=>t.parentId&&e.some(e=>e.id===t.parentId)?t.parentId:null),n=(e,r)=>[...t.get(e)??[]].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({...e,depth:r,children:n(e.id,r+1)}));return n(null,0)},Z=e=>e.flatMap(e=>[e,...Z(e.children)]),Ct=I({name:N().max(255,`validation.tooLong`)}),wt=(e,t)=>{let n=d(),r=f(),i=e.mode===`rename`?e.folder.name:``,a=P({resolver:nt(Ct),defaultValues:{name:i}}),o=a.handleSubmit(async({name:i})=>{let a=i.trim();if(e.mode===`rename`&&a===e.folder.name){t();return}(await F(e.mode===`rename`?r.mutateAsync({id:e.folder.id,input:{expectedVersion:e.folder.version,name:a}}):n.mutateAsync({name:a,parentId:e.parentId}))).ok&&(v.success(y.t(e.mode===`rename`?`media.folders.renamed`:`media.folders.created`,{name:a})),t())}),s=e.mode===`rename`?r:n;return{form:a,onSubmit:o,initialName:i,pending:s.isPending,error:s.error}},Q=({edit:e,onDone:t})=>{let{t:n}=g(),i=(0,G.useId)(),{form:a,onSubmit:o,initialName:s,pending:c,error:l}=wt(e,()=>t(!0)),{setFocus:u}=a;(0,G.useEffect)(()=>{u(`name`,{shouldSelect:!0})},[u]);let d=a.formState.errors.name?.message??(l?Se(l):void 0),f=e.mode===`create`;return(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`form`,{noValidate:!0,onSubmit:e=>void o(e),onKeyDown:e=>{e.key===`Escape`&&!c&&(e.preventDefault(),e.stopPropagation(),t(!0))},onBlur:e=>{let n=e.relatedTarget;n instanceof Node&&e.currentTarget.contains(n)||!c&&a.getValues(`name`).trim()===s&&t(!1)},className:`flex items-center gap-1 py-0.5 pl-1`,children:[f?(0,q.jsx)(D,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,q.jsx)(j,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}),(0,q.jsx)(we,{...a.register(`name`),inputSize:`sm`,autoComplete:`off`,spellCheck:!1,readOnly:c,"aria-label":f?n(`media.folders.newName`):n(`media.folders.renameLabel`,{name:e.folder.name}),"aria-invalid":d?!0:void 0,"aria-describedby":d?i:void 0,className:`h-8 px-2`}),(0,q.jsx)(b,{type:`submit`,variant:`ghost`,size:`icon-xs`,disabled:c,"aria-label":n(f?`media.folders.create`:`media.folders.saveName`),children:c?(0,q.jsx)(r,{"aria-hidden":`true`,className:`animate-spin`}):(0,q.jsx)(Ce,{"aria-hidden":`true`})}),(0,q.jsx)(b,{type:`button`,variant:`ghost`,size:`icon-xs`,disabled:c,"aria-label":n(`common.cancel`),onClick:()=>t(!0),children:(0,q.jsx)(p,{"aria-hidden":`true`})})]}),(0,q.jsx)(`div`,{className:`pl-6`,children:(0,q.jsx)(tt,{id:i,message:d})})]})},$=`flex h-9 min-w-0 items-center gap-2.5 rounded-lg text-left text-sm font-medium text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-[current=true]:bg-accent aria-[current=true]:font-semibold aria-[current=true]:text-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0`,Tt=({folder:e,canManage:t,actions:n})=>{let{t:r}=g(),i=(0,G.useRef)(!1),a=e=>()=>{i.current=!0,e()};return(0,q.jsxs)(Ze,{children:[(0,q.jsx)(C,{tone:`danger`,open:n.deletingId===e.id,onOpenChange:t=>n.onDeleteOpenChange(e,t),title:r(`media.folders.deleteTitle`,{name:e.name}),description:r(`media.folders.deleteDescription`),confirmLabel:r(`common.delete`),onConfirm:()=>n.onDelete(e),children:(0,q.jsx)(Ye,{asChild:!0,children:(0,q.jsx)(b,{variant:`ghost`,size:`icon-xs`,"aria-label":r(`media.folders.actions`,{name:e.name}),className:`absolute right-1.5`,"data-folder-menu":e.id,children:(0,q.jsx)(Fe,{"aria-hidden":`true`})})})}),(0,q.jsxs)(Xe,{align:`end`,onCloseAutoFocus:e=>{i.current&&(i.current=!1,e.preventDefault())},children:[(0,q.jsxs)(A,{onSelect:a(()=>n.onCreate(e.id)),children:[(0,q.jsx)(D,{"aria-hidden":`true`}),r(`media.folders.newSubfolder`)]}),(0,q.jsxs)(A,{onSelect:a(()=>n.onRename(e)),children:[(0,q.jsx)(j,{"aria-hidden":`true`}),r(`media.folders.rename`)]}),t?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Je,{}),(0,q.jsxs)(A,{variant:`destructive`,onSelect:a(()=>n.onDeleteOpenChange(e,!0)),children:[(0,q.jsx)(w,{"aria-hidden":`true`}),r(`common.delete`)]})]}):null]})]})},Et=({node:e,currentId:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s})=>{let c=e.id===t,l=c?lt:W,u=a?.mode===`rename`&&a.folder.id===e.id?a:void 0,d=a?.mode===`create`&&a.parentId===e.id?a:void 0;return(0,q.jsxs)(`li`,{children:[u?(0,q.jsx)(Q,{edit:u,onDone:o}):(0,q.jsxs)(`div`,{className:`relative flex items-center`,children:[(0,q.jsxs)(`button`,{type:`button`,"aria-current":c?`true`:void 0,onClick:()=>s(e.id),className:M($,`flex-1 pl-2.5`,n?`pr-9`:`pr-2.5`),children:[(0,q.jsx)(l,{"aria-hidden":`true`}),(0,q.jsx)(`span`,{className:`truncate`,children:e.name}),(0,q.jsx)(`span`,{className:`ml-auto text-xs font-medium text-muted-foreground tabular-nums`,children:e.assetCount})]}),n?(0,q.jsx)(Tt,{folder:e,canManage:r,actions:i}):null]}),e.children.length>0||d?(0,q.jsxs)(`ul`,{className:`mt-0.5 ml-4 space-y-0.5 border-l pl-1.5`,children:[d?(0,q.jsx)(`li`,{children:(0,q.jsx)(Q,{edit:d,onDone:o})}):null,e.children.map(e=>(0,q.jsx)(Et,{node:e,currentId:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s},e.id))]}):null]})},Dt=({current:e,icon:t,label:n,onClick:r})=>(0,q.jsxs)(`button`,{type:`button`,"aria-current":e?`true`:void 0,onClick:r,className:M($,`w-full px-2.5`),children:[t,(0,q.jsx)(`span`,{className:`truncate`,children:n})]}),Ot=({folders:e,current:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s,className:c})=>{let{t:l}=g(),u=(0,G.useMemo)(()=>X(e??[]),[e]),d=a?.mode===`create`&&a.parentId===null?a:void 0;return(0,q.jsx)(ot,{title:l(`media.folders.title`),flush:!0,className:c,bodyClassName:`p-2`,children:(0,q.jsxs)(`nav`,{"aria-label":l(`media.folders.title`),className:`space-y-1`,children:[(0,q.jsxs)(`ul`,{className:`space-y-0.5`,children:[(0,q.jsx)(`li`,{children:(0,q.jsx)(Dt,{current:t===void 0,icon:(0,q.jsx)(Ue,{"aria-hidden":`true`}),label:l(`media.folders.all`),onClick:()=>s(void 0)})}),(0,q.jsx)(`li`,{children:(0,q.jsx)(Dt,{current:t===z,icon:(0,q.jsx)(k,{"aria-hidden":`true`}),label:l(`media.folders.unfiled`),onClick:()=>s(z)})})]}),e===void 0?(0,q.jsx)(x,{className:`h-8 w-full`}):u.length>0||d?(0,q.jsxs)(`ul`,{className:`space-y-0.5 border-t pt-1`,children:[d?(0,q.jsx)(`li`,{children:(0,q.jsx)(Q,{edit:d,onDone:o})}):null,u.map(e=>(0,q.jsx)(Et,{node:e,currentId:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s},e.id))]}):null]})})},kt=()=>{let[e,t]=(0,G.useState)(new Set);return{selected:e,toggle:(0,G.useCallback)((e,n)=>t(t=>{let r=new Set(t);return n?r.add(e):r.delete(e),r}),[]),clear:(0,G.useCallback)(()=>t(new Set),[])}},At=e=>{let t=e.mode===`rename`?e.folder.id:e.parentId,n=t===null?`[data-new-folder]`:`[data-folder-menu="${CSS.escape(t)}"]`;return document.querySelector(n)},jt=e=>{let[t,n]=(0,G.useState)(void 0),[r,i]=(0,G.useState)(void 0),a=l();return{actions:{onCreate:e=>n({mode:`create`,parentId:e}),onRename:e=>n({mode:`rename`,folder:e}),deletingId:r,onDeleteOpenChange:(e,t)=>i(t?e.id:void 0),onDelete:t=>a.mutateAsync(t.id).then(()=>{v.success(y.t(`media.folders.deleted`,{name:t.name})),e(t)})},editing:t,stopEditing:e=>{let r=t;n(void 0),r&&e&&requestAnimationFrame(()=>At(r)?.focus())}}},Mt=()=>{let e=_e({from:`/app/media`}),t=ee({from:`/media`});return{search:e,setSearch:(e,n=!1)=>void t({search:t=>({...t,...e}),replace:n}),assetQuery:{...e.folder?{folder:e.folder}:{},...e.q?{search:e.q}:{},...e.type?{mimeType:it[e.type]}:{}}}},Nt=e=>{if(![`ArrowDown`,`ArrowUp`,`Home`,`End`].includes(e.key))return;let t=[...e.currentTarget.querySelectorAll(`button:not(:disabled)`)];if(t.length===0)return;e.preventDefault();let n=t.findIndex(e=>e===document.activeElement),r=t.length-1;t[e.key===`Home`?0:e.key===`End`?r:e.key===`ArrowDown`?Math.min(n+1,r):Math.max(n-1,0)]?.focus()},Pt=(e,t)=>{let n=i(),[r,a]=(0,G.useState)(void 0);return{target:n.isPending?r:void 0,pending:n.isPending,error:n.error,reset:n.reset,moveTo:async r=>{a(r);let i=await F(n.mutateAsync({assetIds:[...e],folderId:r}));i.ok&&(v.success(y.t(`media.move.done`,{count:i.value.moved.length})),t())}}},Ft=({icon:e,label:t,depth:n,pending:i,disabled:a,onClick:o})=>(0,q.jsx)(`li`,{children:(0,q.jsxs)(`button`,{type:`button`,disabled:a,"aria-busy":i||void 0,onClick:o,style:{"--depth":n},className:M($,`w-full pr-2.5 pl-[calc(0.625rem+var(--depth)*1rem)] disabled:opacity-50`),children:[i?(0,q.jsx)(r,{"aria-hidden":`true`,className:`animate-spin`}):e,(0,q.jsx)(`span`,{className:`truncate`,children:t})]})}),It=({assetIds:e,onMoved:t})=>{let{t:n}=g(),r=(0,G.useId)(),[i,a]=(0,G.useState)(!1),o=c(),s=(0,G.useMemo)(()=>Z(X(o.data??[])),[o.data]),l=Pt(e,()=>{a(!1),t()});return(0,q.jsxs)(xe,{open:i,onOpenChange:e=>{l.pending||(e&&l.reset(),a(e))},modal:!0,children:[(0,q.jsx)(ye,{asChild:!0,children:(0,q.jsxs)(b,{size:`sm`,variant:`outline`,children:[(0,q.jsx)(ct,{"aria-hidden":`true`}),n(`media.move.action`)]})}),(0,q.jsxs)(be,{align:`end`,"aria-labelledby":r,className:`w-72 space-y-2 p-2`,children:[(0,q.jsx)(`p`,{id:r,className:`px-2.5 pt-1 text-sm font-semibold`,children:n(`media.move.title`,{count:e.length})}),(0,q.jsxs)(`ul`,{className:`max-h-72 space-y-0.5 overflow-y-auto`,onKeyDown:Nt,children:[(0,q.jsx)(Ft,{icon:(0,q.jsx)(k,{"aria-hidden":`true`}),label:n(`media.folders.none`),depth:0,pending:l.target===null,disabled:l.pending,onClick:()=>void l.moveTo(null)}),s.map(e=>(0,q.jsx)(Ft,{icon:(0,q.jsx)(W,{"aria-hidden":`true`}),label:e.name,depth:e.depth,pending:l.target===e.id,disabled:l.pending,onClick:()=>void l.moveTo(e.id)},e.id))]}),o.isPending?(0,q.jsx)(x,{className:`h-8 w-full`}):null,(0,q.jsx)(S,{error:l.error})]})]})},Lt=({selected:e,onClear:t})=>{let{t:n}=g();return(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 rounded-xl border bg-accent py-1.5 pr-1.5 pl-4 text-accent-foreground`,children:[(0,q.jsx)(`span`,{role:`status`,"aria-live":`polite`,className:`mr-auto text-sm font-medium`,children:n(`media.selectedCount`,{count:e.size})}),(0,q.jsx)(It,{assetIds:[...e],onMoved:t}),(0,q.jsxs)(b,{size:`sm`,variant:`ghost`,onClick:t,children:[(0,q.jsx)(p,{"aria-hidden":`true`}),n(`media.clearSelection`)]})]})},Rt=ve(`/app/media`)({component:()=>{let{t:e}=g(),{search:t,setSearch:n,assetQuery:r}=Mt(),i=c(),{canWrite:a,canManage:o}=T(),s=qe(),l=kt(),u=jt(e=>{t.folder===e.id&&n({folder:void 0})}),d=t.folder&&t.folder!==`root`?t.folder:null,f=e=>s.enqueue(e,{folderId:d,visibility:`public`});return(0,q.jsxs)(ie,{width:`full`,children:[(0,q.jsx)(ce,{title:e(`media.title`),actions:a?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(b,{variant:`outline`,"data-new-folder":!0,onClick:()=>u.actions.onCreate(null),children:[(0,q.jsx)(D,{"aria-hidden":`true`}),e(`media.folders.new`)]}),(0,q.jsx)(O,{label:e(`media.upload.action`),onFiles:f})]}):null}),(0,q.jsxs)(`div`,{className:`grid gap-6 lg:grid-cols-[13.75rem_minmax(0,1fr)]`,children:[(0,q.jsx)(Ot,{folders:i.data,current:t.folder,canWrite:a,canManage:o,actions:u.actions,editing:u.editing,onEditDone:u.stopEditing,onSelect:e=>{l.clear(),n({folder:e})},className:`lg:self-start`}),(0,q.jsxs)(St,{enabled:a,onFiles:f,className:`min-h-96 min-w-0 space-y-4`,children:[(0,q.jsx)(Ge,{onRetry:s.retry,onDismiss:s.dismiss}),(0,q.jsx)(We,{query:t.q,type:t.type,view:t.view??`grid`,onQueryChange:e=>n({q:e},!0),onTypeChange:e=>n({type:e}),onViewChange:e=>n({view:e})}),l.selected.size>0?(0,q.jsx)(Lt,{selected:l.selected,onClear:l.clear}):null,(0,q.jsx)(He,{query:r,filtered:!!(t.q||t.type),view:t.view??`grid`,selected:l.selected,selectable:a,activeId:t.asset,onSelectChange:l.toggle,onOpen:e=>n({asset:e.id})})]})]}),(0,q.jsx)(xt,{assetId:t.asset,onClose:()=>n({asset:void 0}),onReplace:(e,t)=>s.enqueue([t],{folderId:null,visibility:`public`,replaceAssetId:e})})]})}});export{Rt as mediaLazyRoute};
2
- //# sourceMappingURL=media-BUUEsWxd.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"media-BUUEsWxd.js","names":["__iconData","__iconData","z.object","z.string","z.number","zodResolver","i18next","useState","i18next","_Fragment","Trash2","useState","_Fragment","AlertTriangle","useState","useRef","z.object","zodResolver","i18next","useId","Loader2","useRef","MoreHorizontal","_Fragment","Trash2","useMemo","useState","useCallback","useState","i18next","useState","i18next","Loader2","useId","useState","useMemo","_Fragment","__toESM","require_jsx_runtime","LoaderCircle","useMoveMediaAssets","useMediaAsset","useUpdateMediaAsset","useDeleteMediaAsset","useMediaFolders","useDeleteMediaFolder","useMediaUsage","useCreateMediaFolder","useUpdateMediaFolder","useNavigate","hasErrorCode","Lock","X","SubmitButton","Page","Sheet","SheetDescription","SheetFooter","PageHeader","TriangleAlert","SheetBody","SheetTitle","StatusChip","SheetHeader","ErrorState","Badge","SheetContent","LoadingState","ShapioApiError","useTranslation","createLucideIcon","useSearch","createLazyRoute","toast","PopoverTrigger","PopoverContent","Popover","instance","describeError","Check","Button","Input","Skeleton","Alert","FormError","AlertDescription","InlineConfirm","ConfirmDialog","ExternalLink","Trash","FieldGroup","FieldContent","FieldLabel","FieldDescription","Field","FocalPoint","Ellipsis","Variants","useMediaPermissions","FileIcon","fileKindLabel","MEDIA_STATUS_DISPLAY","isImage","formatBytes","FolderPlus","Globe","Library","Images","Toolbar","UploadQueue","Upload","UploadButton","useMediaUploader","Inbox","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuContent","DropdownMenu","Pencil","cn","Switch","useController","FormTextField","requiredText","FormFieldError","u","useForm","settle","object","number","string","useDiscardGuard","ROOT_FOLDER","MIME_FILTER_BY_TYPE","SuggestAltButton","Panel","CopyButton","FormTextareaField","__iconData$2","FolderInput","__iconData$1","FolderOpen","__iconData","Folder","import_react","require_react","detailsSchema","valuesFor","asset","changesFrom","values","useAssetDetailsForm","update","form","reset","result","usageCountOf","details","error","useDeleteAssetFlow","remove","blocked","setBlocked","forceOpen","setForceOpen","forceUsageCount","setForceUsageCount","deleted","target","onDeleted","usageCount","isOwner","import_jsx_runtime","DeleteAction","deletion","t","MetadataForm","focal","image","event","onSubmit","readOnly","alt","value","previewImageUrl","variant","Preview","Section","title","children","Usage","usage","assetId","item","Visibility","confirming","setConfirming","isPrivate","next","consequence","canManage","Details","query","open","onClose","status","requestOpenChange","canWrite","file","onReplace","discardPrompt","hasFiles","Dropzone","dragging","setDragging","depth","enabled","className","files","onFiles","buildFolderTree","byParent","folders","folder","candidate","build","parentId","a","b","flattenFolderTree","nodes","node","folderSchema","useFolderForm","createFolder","updateFolder","initialName","edit","trimmed","name","onDone","mutation","EditRow","errorId","setFocus","message","creating","pending","FOLDER_ROW_CLASSES","Menu","handingOff","handOff","action","actions","Item","current","currentId","Icon","renameEdit","editing","childEdit","onEditDone","onSelect","child","ScopeButton","icon","label","FolderTree","tree","topLevelEdit","useAssetSelection","selected","setSelected","checked","id","openerOf","selector","useFolderActions","setEditing","deletingId","setDeletingId","deleteFolder","returnFocus","useMediaSearch","search","navigate","previous","changes","moveFocusWithArrows","buttons","index","button","last","useMoveToFolder","move","setTarget","folderId","assetIds","onMoved","Choice","MovePopover","titleId","setOpen","choices","SelectionBar","onClear","mediaLazyRoute","uploader","selection","folderActions","setSearch","uploadFolder","upload","assetQuery"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/folder-input.mjs","../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/folder-open.mjs","../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/folder.mjs","../../src/features/Media/hooks/useAssetDetailsForm.ts","../../src/features/Media/hooks/useDeleteAssetFlow.ts","../../src/features/Media/Details/DeleteAction/index.tsx","../../src/features/Media/Details/MetadataForm/index.tsx","../../src/features/Media/Details/Preview/index.tsx","../../src/features/Media/Details/Section/index.tsx","../../src/features/Media/Details/Usage/index.tsx","../../src/features/Media/Details/Visibility/index.tsx","../../src/features/Media/Details/index.tsx","../../src/features/Media/Dropzone/index.tsx","../../src/features/Media/helpers/folderTree.ts","../../src/features/Media/hooks/useFolderForm.ts","../../src/features/Media/FolderTree/EditRow/index.tsx","../../src/features/Media/FolderTree/constants.ts","../../src/features/Media/FolderTree/Menu/index.tsx","../../src/features/Media/FolderTree/Item/index.tsx","../../src/features/Media/FolderTree/ScopeButton/index.tsx","../../src/features/Media/FolderTree/index.tsx","../../src/features/Media/hooks/useAssetSelection.ts","../../src/features/Media/hooks/useFolderActions.ts","../../src/features/Media/hooks/useMediaSearch.ts","../../src/features/Media/helpers/arrowFocus.ts","../../src/features/Media/hooks/useMoveToFolder.ts","../../src/features/Media/MovePopover/Choice/index.tsx","../../src/features/Media/MovePopover/index.tsx","../../src/features/Media/SelectionBar/index.tsx","../../src/features/Media/index.tsx","../../src/app/lazyRoutes/media.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"folder-input\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M2 9V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\",\n key: \"fm4g5t\"\n }\n ],\n [\"path\", { d: \"M2 13h10\", key: \"pgb2dq\" }],\n [\"path\", { d: \"m9 16 3-3-3-3\", key: \"6m91ic\" }]\n ]\n};\n__iconData.node;\nconst FolderInput = createLucideIcon(__iconData);\n\nexport { __iconData, FolderInput as default };\n//# sourceMappingURL=folder-input.mjs.map\n","/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"folder-open\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",\n key: \"usdka0\"\n }\n ]\n ]\n};\n__iconData.node;\nconst FolderOpen = createLucideIcon(__iconData);\n\nexport { __iconData, FolderOpen as default };\n//# sourceMappingURL=folder-open.mjs.map\n","/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"folder\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n ]\n};\n__iconData.node;\nconst Folder = createLucideIcon(__iconData);\n\nexport { __iconData, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { MediaAsset, UpdateMediaAssetInput } from '@shapio/client';\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useUpdateMediaAsset } from '@/api/media';\nimport { i18next } from '@/app/i18n';\nimport { settle } from '@/helpers/settle';\nimport { requiredText } from '@/helpers/validation';\n\nconst MAX_FILENAME = 255;\nconst MAX_ALT = 1000;\nconst MAX_CAPTION = 4000;\n\nconst detailsSchema = z.object({\n filename: requiredText().max(MAX_FILENAME, 'validation.tooLong'),\n alt: z.string().max(MAX_ALT, 'validation.tooLong'),\n caption: z.string().max(MAX_CAPTION, 'validation.tooLong'),\n focalPoint: z.object({ x: z.number().min(0).max(1), y: z.number().min(0).max(1) }).nullable(),\n});\n\nexport type AssetDetailsValues = z.infer<typeof detailsSchema>;\n\nconst valuesFor = (asset: MediaAsset | undefined): AssetDetailsValues => ({\n filename: asset?.filename ?? '',\n alt: asset?.alt ?? '',\n caption: asset?.caption ?? '',\n focalPoint: asset?.focalPoint ?? null,\n});\n\n/** Only what changed is sent, with the version the editor saw (409 VERSION_CONFLICT if it moved). */\nconst changesFrom = (asset: MediaAsset, values: AssetDetailsValues): UpdateMediaAssetInput => ({\n expectedVersion: asset.version,\n ...(values.filename !== asset.filename ? { filename: values.filename.trim() } : {}),\n ...(values.alt !== asset.alt ? { alt: values.alt } : {}),\n ...(values.caption !== asset.caption ? { caption: values.caption } : {}),\n ...(JSON.stringify(values.focalPoint) !== JSON.stringify(asset.focalPoint)\n ? { focalPoint: values.focalPoint }\n : {}),\n});\n\n/** File name, alt text, caption and focal point of one asset. */\nexport const useAssetDetailsForm = (asset: MediaAsset | undefined) => {\n const update = useUpdateMediaAsset();\n const form = useForm<AssetDetailsValues>({\n resolver: zodResolver(detailsSchema),\n defaultValues: valuesFor(asset),\n });\n const { reset } = form;\n // A different asset (or a fresh load of this one) starts from what the server has.\n useEffect(() => {\n reset(valuesFor(asset));\n update.reset();\n // The mutation object changes identity on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [asset?.id, reset]);\n const onSubmit = form.handleSubmit(async (values) => {\n if (!asset) {\n return;\n }\n const result = await settle(update.mutateAsync({ id: asset.id, input: changesFrom(asset, values) }));\n if (result.ok) {\n reset(valuesFor(result.value));\n toast.success(i18next.t('media.details.saved'));\n }\n });\n return { form, onSubmit, pending: update.isPending, error: update.error };\n};\n","import { ShapioApiError, type MediaAsset } from '@shapio/client';\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { hasErrorCode } from '@/api/errors';\nimport { useDeleteMediaAsset } from '@/api/media';\nimport { i18next } from '@/app/i18n';\n\nconst usageCountOf = (error: unknown): number => {\n const details =\n error instanceof ShapioApiError ? (error.details as { usageCount?: unknown } | undefined) : undefined;\n return typeof details?.usageCount === 'number' ? details.usageCount : 0;\n};\n\n/**\n * Delete, with the server's protection surfaced: a referenced asset answers 409 MEDIA_IN_USE. For an owner\n * the inline confirmation then hands over to a blocking \"Delete anyway\" dialog (which sends `force`); for\n * anyone else the inline confirmation stays open and explains why it can't be deleted.\n */\nexport const useDeleteAssetFlow = (\n asset: MediaAsset | undefined,\n isOwner: boolean,\n onDeleted: () => void,\n) => {\n const remove = useDeleteMediaAsset();\n const [blocked, setBlocked] = useState<{ assetId: string; usageCount: number } | undefined>(undefined);\n const [forceOpen, setForceOpen] = useState(false);\n // Kept while the dialog animates out, so its text doesn't change.\n const [forceUsageCount, setForceUsageCount] = useState(0);\n const deleted = (target: MediaAsset) => {\n toast.success(i18next.t('media.delete.done', { name: target.filename }));\n onDeleted();\n };\n return {\n /** Set once a non-owner's delete was refused because content uses the file. */\n blockedUsageCount: blocked && blocked.assetId === asset?.id ? blocked.usageCount : undefined,\n /** The inline confirmation's action: rejects (and the popover shows why) unless it was handed over. */\n confirm: async () => {\n if (!asset) {\n return;\n }\n try {\n await remove.mutateAsync({ id: asset.id, force: false });\n } catch (error) {\n if (!hasErrorCode(error, 'MEDIA_IN_USE')) {\n throw error;\n }\n const usageCount = usageCountOf(error);\n if (!isOwner) {\n setBlocked({ assetId: asset.id, usageCount });\n throw error;\n }\n remove.reset();\n setForceUsageCount(usageCount);\n setForceOpen(true);\n return;\n }\n deleted(asset);\n },\n force: {\n open: forceOpen,\n usageCount: forceUsageCount,\n pending: remove.isPending,\n error: remove.error,\n onOpenChange: setForceOpen,\n confirm: () => {\n if (asset) {\n remove.mutate(\n { id: asset.id, force: true },\n {\n onSuccess: () => {\n setForceOpen(false);\n deleted(asset);\n },\n },\n );\n }\n },\n },\n };\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { ConfirmDialog } from '@/components/ConfirmDialog';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Button } from '@/components/ui/button';\nimport { useMediaPermissions } from '@/hooks/useMediaPermissions';\nimport { useDeleteAssetFlow } from '../../hooks/useDeleteAssetFlow';\n\ntype DeleteActionProps = { asset: MediaAsset; onDeleted: () => void };\n\n/**\n * \"Delete file\", confirmed inline. If content still uses the file, the confirmation says so; only an owner\n * can then delete it anyway, through a blocking dialog (it leaves that content pointing at a missing file).\n */\nexport const DeleteAction = ({ asset, onDeleted }: DeleteActionProps) => {\n const { t } = useTranslation();\n const { isOwner } = useMediaPermissions();\n const deletion = useDeleteAssetFlow(asset, isOwner, onDeleted);\n const blocked = deletion.blockedUsageCount;\n return (\n <>\n <InlineConfirm\n tone=\"danger\"\n align=\"start\"\n side=\"top\"\n title={t('media.delete.title', { name: asset.filename })}\n description={\n blocked === undefined\n ? t('media.delete.description')\n : `${t('media.delete.inUseDescription', { count: blocked })} ${t('media.delete.onlyOwners')}`\n }\n confirmLabel={t('common.delete')}\n onConfirm={deletion.confirm}\n trigger={\n <Button variant=\"destructive-ghost\">\n <Trash2 aria-hidden=\"true\" />\n {t('media.delete.action')}\n </Button>\n }\n />\n <ConfirmDialog\n open={deletion.force.open}\n onOpenChange={deletion.force.onOpenChange}\n title={t('media.delete.inUseTitle')}\n description={`${t('media.delete.inUseDescription', { count: deletion.force.usageCount })} ${t(\n 'media.delete.ownerMayForce',\n )}`}\n confirmLabel={t('media.delete.force')}\n destructive\n pending={deletion.force.pending}\n error={deletion.force.error}\n onConfirm={deletion.force.confirm}\n />\n </>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { useController, type UseFormReturn } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FocalPoint } from '@/components/FocalPoint';\nimport { FormError } from '@/components/FormError';\nimport { FormTextareaField } from '@/components/FormTextareaField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { SuggestAltButton } from '@/components/SuggestAltButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { isImage } from '../../helpers/fileKind';\nimport type { AssetDetailsValues } from '../../hooks/useAssetDetailsForm';\n\ntype MetadataFormProps = {\n asset: MediaAsset;\n form: UseFormReturn<AssetDetailsValues>;\n onSubmit: () => void;\n pending: boolean;\n error: unknown;\n readOnly: boolean;\n};\n\n/** File name, alt text, caption and (images) focal point; saved together. */\nexport const MetadataForm = ({ asset, form, onSubmit, pending, error, readOnly }: MetadataFormProps) => {\n const { t } = useTranslation();\n const focal = useController({ control: form.control, name: 'focalPoint' });\n const image = isImage(asset.mimeType);\n return (\n <form\n noValidate\n aria-label={t('media.details.formLabel')}\n onSubmit={(event) => {\n event.preventDefault();\n onSubmit();\n }}\n >\n <fieldset disabled={readOnly} className=\"contents\">\n <FieldGroup>\n <FormTextField\n control={form.control}\n name=\"filename\"\n label={t('media.fields.filename')}\n autoComplete=\"off\"\n />\n {image ? (\n <FormTextareaField\n control={form.control}\n name=\"alt\"\n label={t('media.fields.alt')}\n rows={2}\n placeholder={t('media.details.altHint')}\n />\n ) : null}\n {image && !readOnly ? (\n <SuggestAltButton\n assetId={asset.id}\n mimeType={asset.mimeType}\n onSuggest={(alt) => form.setValue('alt', alt, { shouldDirty: true, shouldValidate: true })}\n />\n ) : null}\n <FormTextareaField\n control={form.control}\n name=\"caption\"\n label={t('media.fields.caption')}\n rows={2}\n />\n {image && !readOnly ? (\n <FocalPoint\n imageUrl={asset.url}\n value={focal.field.value}\n onChange={(value) => focal.field.onChange(value)}\n />\n ) : null}\n <FormError error={error} />\n {readOnly ? null : (\n <div className=\"flex justify-end\">\n <SubmitButton\n pending={pending}\n pendingLabel={t('common.saving')}\n disabled={!form.formState.isDirty}\n >\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n )}\n </FieldGroup>\n </fieldset>\n </form>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { ExternalLink } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { FileIcon } from '../../FileIcon';\nimport { isImage } from '../../helpers/fileKind';\n\ntype PreviewProps = { asset: MediaAsset };\n\n/** The widest ready variant up to 1280 px, else the original. */\nconst previewImageUrl = (asset: MediaAsset): string =>\n asset.variants.find((variant) => variant.name === 'w1280' && variant.url)?.url ??\n asset.variants.find((variant) => variant.name === 'w640' && variant.url)?.url ??\n asset.url;\n\n/** Images, video and audio play inline; other files show their type and an Open link. */\nexport const Preview = ({ asset }: PreviewProps) => {\n const { t } = useTranslation();\n if (isImage(asset.mimeType)) {\n return (\n <img\n src={previewImageUrl(asset)}\n alt={asset.alt || t('media.details.previewOf', { name: asset.filename })}\n className=\"max-h-72 w-full rounded-lg border bg-muted object-contain\"\n />\n );\n }\n if (asset.mimeType.startsWith('video/')) {\n return (\n <video\n src={asset.url}\n controls\n preload=\"metadata\"\n className=\"max-h-72 w-full rounded-lg border bg-muted\"\n />\n );\n }\n if (asset.mimeType.startsWith('audio/')) {\n return <audio src={asset.url} controls preload=\"metadata\" className=\"w-full\" />;\n }\n return (\n <div className=\"flex flex-col items-center gap-3 rounded-lg border bg-muted px-4 py-8\">\n <FileIcon mimeType={asset.mimeType} className=\"size-10 text-muted-foreground\" />\n <Button asChild variant=\"outline\" size=\"sm\">\n <a href={asset.url} target=\"_blank\" rel=\"noopener noreferrer\">\n <ExternalLink aria-hidden=\"true\" />\n {t('media.details.openFile')}\n </a>\n </Button>\n </div>\n );\n};\n","import type { ReactNode } from 'react';\n\ntype SectionProps = { title: string; children: ReactNode };\n\n/** A titled block of the details sheet. */\nexport const Section = ({ title, children }: SectionProps) => (\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {children}\n </section>\n);\n","import { useTranslation } from 'react-i18next';\nimport { useMediaUsage } from '@/api/media';\nimport { ErrorState } from '@/components/ErrorState';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Badge } from '@/components/ui/badge';\nimport { Skeleton } from '@/components/ui/skeleton';\n\ntype UsageProps = { assetId: string };\n\n/** \"Used in\": the entries whose draft or published version references the asset. */\nexport const Usage = ({ assetId }: UsageProps) => {\n const { t } = useTranslation();\n const usage = useMediaUsage(assetId);\n if (usage.isPending) {\n return <Skeleton className=\"h-8 w-full\" />;\n }\n if (usage.isError) {\n return <ErrorState error={usage.error} onRetry={() => void usage.refetch()} />;\n }\n if (usage.data.total === 0) {\n return <p className=\"text-sm text-muted-foreground\">{t('media.usage.none')}</p>;\n }\n return (\n <div className=\"space-y-2\">\n <p className=\"text-sm\">{t('media.usage.count', { count: usage.data.total })}</p>\n <ul className=\"divide-y rounded-lg border\">\n {usage.data.items.map((item) => (\n <li\n key={`${item.entryId}:${item.fieldId}:${item.locale}:${item.state}`}\n className=\"flex min-w-0 items-center gap-2 px-3 py-2\"\n >\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs\" title={item.entryId}>\n {t('media.usage.entry', { id: item.entryId })}\n </span>\n <Badge variant=\"outline\" className=\"font-mono\">\n {item.locale}\n </Badge>\n <StatusChip\n size=\"sm\"\n tone={item.state === 'published' ? 'success' : 'neutral'}\n label={item.state === 'published' ? t('media.usage.published') : t('media.usage.draft')}\n />\n </li>\n ))}\n </ul>\n </div>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { Globe, Lock } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useUpdateMediaAsset } from '@/api/media';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Field, FieldContent, FieldDescription, FieldLabel } from '@/components/ui/field';\nimport { Switch } from '@/components/ui/switch';\n\ntype VisibilityProps = { asset: MediaAsset; canManage: boolean };\n\n/**\n * Public files have a stable URL anyone can open; private files only open through signed links that\n * expire. One line says what the current setting means. Changing it needs `media.manage` and is confirmed\n * beside the switch, because it changes who can see the file.\n */\nexport const Visibility = ({ asset, canManage }: VisibilityProps) => {\n const { t } = useTranslation();\n const update = useUpdateMediaAsset();\n const [confirming, setConfirming] = useState(false);\n const isPrivate = asset.visibility === 'private';\n const next = isPrivate ? 'public' : 'private';\n const consequence = isPrivate\n ? t('media.visibility.privateExplanation')\n : t('media.visibility.publicExplanation');\n return (\n <Field orientation=\"horizontal\">\n <FieldContent>\n <div className=\"flex items-center gap-1.5\">\n {isPrivate ? (\n <Lock aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n ) : (\n <Globe aria-hidden=\"true\" className=\"size-4 text-muted-foreground\" />\n )}\n <FieldLabel htmlFor=\"asset-private\">{t('media.visibility.privateLabel')}</FieldLabel>\n </div>\n <FieldDescription id=\"asset-private-description\">\n {canManage ? consequence : `${consequence} ${t('media.visibility.needsManage')}`}\n </FieldDescription>\n </FieldContent>\n <InlineConfirm\n tone={next === 'public' ? 'danger' : 'default'}\n open={confirming}\n onOpenChange={setConfirming}\n title={\n next === 'private' ? t('media.visibility.makePrivateTitle') : t('media.visibility.makePublicTitle')\n }\n description={\n next === 'private'\n ? t('media.visibility.makePrivateDescription')\n : t('media.visibility.makePublicDescription')\n }\n confirmLabel={\n next === 'private' ? t('media.visibility.makePrivate') : t('media.visibility.makePublic')\n }\n onConfirm={() =>\n update\n .mutateAsync({ id: asset.id, input: { expectedVersion: asset.version, visibility: next } })\n .then(() => toast.success(t('media.visibility.changed')))\n }\n >\n <Switch\n id=\"asset-private\"\n checked={isPrivate}\n disabled={!canManage || update.isPending}\n aria-describedby=\"asset-private-description\"\n onCheckedChange={() => setConfirming(true)}\n />\n </InlineConfirm>\n </Field>\n );\n};\n","import { AlertTriangle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useMediaAsset } from '@/api/media';\nimport { CopyButton } from '@/components/CopyButton';\nimport { ErrorState } from '@/components/ErrorState';\nimport { LoadingState } from '@/components/LoadingState';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { useDiscardGuard } from '@/hooks/useDiscardGuard';\nimport { useMediaPermissions } from '@/hooks/useMediaPermissions';\nimport { fileKindLabel } from '../helpers/fileKind';\nimport { formatBytes } from '../helpers/formatBytes';\nimport { MEDIA_STATUS_DISPLAY } from '../helpers/statusDisplay';\nimport { useAssetDetailsForm } from '../hooks/useAssetDetailsForm';\nimport { UploadButton } from '../UploadButton';\nimport { DeleteAction } from './DeleteAction';\nimport { MetadataForm } from './MetadataForm';\nimport { Preview } from './Preview';\nimport { Section } from './Section';\nimport { Usage } from './Usage';\nimport { Variants } from './Variants';\nimport { Visibility } from './Visibility';\n\ntype DetailsProps = {\n assetId: string | undefined;\n onClose: () => void;\n onReplace: (assetId: string, file: File) => void;\n};\n\n/** One asset: preview, metadata, focal point, visibility, variants, \"used in\", replace and delete. */\nexport const Details = ({ assetId, onClose, onReplace }: DetailsProps) => {\n const { t } = useTranslation();\n const query = useMediaAsset(assetId);\n const asset = query.data;\n const { canWrite, canManage } = useMediaPermissions();\n const details = useAssetDetailsForm(asset);\n const { requestOpenChange, discardPrompt } = useDiscardGuard({\n dirty: details.form.formState.isDirty,\n pending: details.pending,\n onOpenChange: (open) => {\n if (!open) {\n details.form.reset();\n onClose();\n }\n },\n });\n const status = asset ? MEDIA_STATUS_DISPLAY[asset.status] : undefined;\n return (\n <>\n <Sheet open={assetId !== undefined} onOpenChange={requestOpenChange}>\n <SheetContent size=\"sm\">\n <SheetHeader>\n <SheetTitle className=\"pr-8 break-all\">{asset?.filename ?? t('media.details.title')}</SheetTitle>\n <SheetDescription className=\"text-meta\">\n {asset\n ? [\n fileKindLabel(asset.filename, asset.mimeType),\n formatBytes(asset.sizeBytes),\n asset.width && asset.height\n ? t('media.dimensions', { width: asset.width, height: asset.height })\n : '',\n ]\n .filter(Boolean)\n .join(' · ')\n : t('common.loading')}\n </SheetDescription>\n {asset && status ? (\n // In the fixed header, not the scrolling body: the focus trap wraps here without scrolling.\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n {asset.visibility === 'private' ? (\n <StatusChip tone=\"muted\" label={t('media.visibility.private')} />\n ) : null}\n <span className=\"ml-auto\">\n <CopyButton value={asset.url} />\n </span>\n </div>\n ) : null}\n </SheetHeader>\n <SheetBody className=\"space-y-6\">\n {query.isPending ? <LoadingState rows={3} /> : null}\n {query.isError ? <ErrorState error={query.error} onRetry={() => void query.refetch()} /> : null}\n {asset && status ? (\n <>\n <div className=\"space-y-3\">\n <Preview asset={asset} />\n {asset.urlExpiresAt ? (\n <p className=\"text-meta text-muted-foreground\">{t('media.details.signedLinkNote')}</p>\n ) : null}\n {asset.processingError ? (\n <Alert variant=\"destructive\">\n <AlertTriangle aria-hidden=\"true\" />\n <AlertDescription>{asset.processingError}</AlertDescription>\n </Alert>\n ) : null}\n </div>\n <Section title={t('media.details.metadata')}>\n <MetadataForm\n asset={asset}\n form={details.form}\n onSubmit={() => void details.onSubmit()}\n pending={details.pending}\n error={details.error}\n readOnly={!canWrite}\n />\n </Section>\n <Section title={t('media.usage.title')}>\n <Usage assetId={asset.id} />\n </Section>\n <Section title={t('media.visibility.title')}>\n <Visibility asset={asset} canManage={canManage} />\n </Section>\n <Section title={t('media.variants.title')}>\n <Variants asset={asset} />\n </Section>\n </>\n ) : null}\n </SheetBody>\n {asset && (canWrite || canManage) ? (\n <SheetFooter className=\"flex-row flex-wrap justify-between\">\n {canManage ? <DeleteAction asset={asset} onDeleted={onClose} /> : null}\n {canWrite ? (\n <UploadButton\n variant=\"outline\"\n multiple={false}\n label={t('media.details.replace')}\n onFiles={([file]) => (file ? onReplace(asset.id, file) : undefined)}\n className=\"ml-auto\"\n />\n ) : null}\n </SheetFooter>\n ) : null}\n </SheetContent>\n </Sheet>\n {discardPrompt}\n </>\n );\n};\n","import { Upload } from 'lucide-react';\nimport { useRef, useState, type DragEvent, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cn } from '@/helpers/cn';\n\ntype DropzoneProps = {\n enabled: boolean;\n onFiles: (files: File[]) => void;\n children: ReactNode;\n className?: string;\n};\n\nconst hasFiles = (event: DragEvent) => event.dataTransfer.types.includes('Files');\n\n/**\n * Drop files anywhere over the library to upload them. A pointer shortcut only: the Upload button is the\n * keyboard and screen-reader path, so the overlay is hidden from assistive technology.\n */\nexport const Dropzone = ({ enabled, onFiles, children, className }: DropzoneProps) => {\n const { t } = useTranslation();\n const [dragging, setDragging] = useState(false);\n const depth = useRef(0);\n if (!enabled) {\n return <div className={className}>{children}</div>;\n }\n return (\n <div\n className={cn('relative', className)}\n onDragEnter={(event) => {\n if (hasFiles(event)) {\n depth.current += 1;\n setDragging(true);\n }\n }}\n onDragLeave={() => {\n depth.current = Math.max(0, depth.current - 1);\n if (depth.current === 0) {\n setDragging(false);\n }\n }}\n onDragOver={(event) => {\n if (hasFiles(event)) {\n event.preventDefault();\n event.dataTransfer.dropEffect = 'copy';\n }\n }}\n onDrop={(event) => {\n event.preventDefault();\n depth.current = 0;\n setDragging(false);\n const files = [...event.dataTransfer.files];\n if (files.length > 0) {\n onFiles(files);\n }\n }}\n >\n {children}\n {dragging ? (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-20 flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-primary bg-background/90 text-primary\"\n >\n <Upload className=\"size-8\" />\n <p className=\"font-semibold\">{t('media.upload.dropHere')}</p>\n </div>\n ) : null}\n </div>\n );\n};\n","import type { MediaFolder } from '@shapio/client';\n\nexport type FolderNode = MediaFolder & { children: FolderNode[]; depth: number };\n\n/** Builds the folder tree from the flat list, siblings sorted by name. Orphans (parent missing) go to the root. */\nexport const buildFolderTree = (folders: readonly MediaFolder[]): FolderNode[] => {\n const byParent = Map.groupBy(folders, (folder) =>\n folder.parentId && folders.some((candidate) => candidate.id === folder.parentId) ? folder.parentId : null,\n );\n const build = (parentId: string | null, depth: number): FolderNode[] =>\n [...(byParent.get(parentId) ?? [])]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((folder) => ({ ...folder, depth, children: build(folder.id, depth + 1) }));\n return build(null, 0);\n};\n\n/** Depth-first: every folder with its depth, for pickers that show the tree as an indented list. */\nexport const flattenFolderTree = (nodes: readonly FolderNode[]): FolderNode[] =>\n nodes.flatMap((node) => [node, ...flattenFolderTree(node.children)]);\n\n/** The folder and everything under it (a folder cannot move into these). */\nexport const descendantIds = (folders: readonly MediaFolder[], id: string): Set<string> => {\n const result = new Set([id]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const folder of folders) {\n if (folder.parentId && result.has(folder.parentId) && !result.has(folder.id)) {\n result.add(folder.id);\n grew = true;\n }\n }\n }\n return result;\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { MediaFolder } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { useCreateMediaFolder, useUpdateMediaFolder } from '@/api/media';\nimport { i18next } from '@/app/i18n';\nimport { settle } from '@/helpers/settle';\nimport { requiredText } from '@/helpers/validation';\n\nconst MAX_NAME_LENGTH = 255;\n\nconst folderSchema = z.object({ name: requiredText().max(MAX_NAME_LENGTH, 'validation.tooLong') });\n\nexport type FolderValues = z.infer<typeof folderSchema>;\n\n/** What the inline folder row edits: a new folder (under `parentId`) or the name of `folder`. */\nexport type FolderEdit =\n { mode: 'create'; parentId: string | null } | { mode: 'rename'; folder: MediaFolder };\n\n/** The inline folder row's form: creates a folder or renames one, then calls `onDone`. */\nexport const useFolderForm = (edit: FolderEdit, onDone: () => void) => {\n const createFolder = useCreateMediaFolder();\n const updateFolder = useUpdateMediaFolder();\n const initialName = edit.mode === 'rename' ? edit.folder.name : '';\n const form = useForm<FolderValues>({\n resolver: zodResolver(folderSchema),\n defaultValues: { name: initialName },\n });\n const onSubmit = form.handleSubmit(async ({ name }) => {\n const trimmed = name.trim();\n if (edit.mode === 'rename' && trimmed === edit.folder.name) {\n onDone();\n return;\n }\n const result = await settle(\n edit.mode === 'rename'\n ? updateFolder.mutateAsync({\n id: edit.folder.id,\n input: { expectedVersion: edit.folder.version, name: trimmed },\n })\n : createFolder.mutateAsync({ name: trimmed, parentId: edit.parentId }),\n );\n if (result.ok) {\n toast.success(\n i18next.t(edit.mode === 'rename' ? 'media.folders.renamed' : 'media.folders.created', {\n name: trimmed,\n }),\n );\n onDone();\n }\n });\n const mutation = edit.mode === 'rename' ? updateFolder : createFolder;\n return { form, onSubmit, initialName, pending: mutation.isPending, error: mutation.error };\n};\n","import { Check, FolderPlus, Loader2, Pencil, X } from 'lucide-react';\nimport { useEffect, useId, type FocusEvent, type KeyboardEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { describeError } from '@/helpers/describeError';\nimport { useFolderForm, type FolderEdit } from '../../hooks/useFolderForm';\n\ntype EditRowProps = {\n edit: FolderEdit;\n /** `returnFocus`: false when focus already left the row (a click elsewhere), so it isn't pulled back. */\n onDone: (returnFocus: boolean) => void;\n};\n\n/**\n * A folder name being typed in place, in the tree (the caller's list item): a new folder or a rename. Enter saves, Escape cancels;\n * leaving the row without changing anything cancels too.\n */\nexport const EditRow = ({ edit, onDone }: EditRowProps) => {\n const { t } = useTranslation();\n const errorId = useId();\n const { form, onSubmit, initialName, pending, error } = useFolderForm(edit, () => onDone(true));\n const { setFocus } = form;\n useEffect(() => {\n setFocus('name', { shouldSelect: true });\n }, [setFocus]);\n const fieldError = form.formState.errors.name?.message;\n const message = fieldError ?? (error ? describeError(error) : undefined);\n const creating = edit.mode === 'create';\n const cancelOnEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && !pending) {\n event.preventDefault();\n event.stopPropagation();\n onDone(true);\n }\n };\n const cancelWhenLeftUnchanged = (event: FocusEvent<HTMLFormElement>) => {\n const next = event.relatedTarget;\n if (next instanceof Node && event.currentTarget.contains(next)) {\n return;\n }\n if (!pending && form.getValues('name').trim() === initialName) {\n onDone(false);\n }\n };\n return (\n <div>\n <form\n noValidate\n onSubmit={(event) => void onSubmit(event)}\n onKeyDown={cancelOnEscape}\n onBlur={cancelWhenLeftUnchanged}\n className=\"flex items-center gap-1 py-0.5 pl-1\"\n >\n {creating ? (\n <FolderPlus aria-hidden=\"true\" className=\"size-4 shrink-0 text-muted-foreground\" />\n ) : (\n <Pencil aria-hidden=\"true\" className=\"size-4 shrink-0 text-muted-foreground\" />\n )}\n <Input\n {...form.register('name')}\n inputSize=\"sm\"\n autoComplete=\"off\"\n spellCheck={false}\n readOnly={pending}\n aria-label={\n creating ? t('media.folders.newName') : t('media.folders.renameLabel', { name: edit.folder.name })\n }\n aria-invalid={message ? true : undefined}\n aria-describedby={message ? errorId : undefined}\n className=\"h-8 px-2\"\n />\n <Button\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon-xs\"\n disabled={pending}\n aria-label={creating ? t('media.folders.create') : t('media.folders.saveName')}\n >\n {pending ? <Loader2 aria-hidden=\"true\" className=\"animate-spin\" /> : <Check aria-hidden=\"true\" />}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n disabled={pending}\n aria-label={t('common.cancel')}\n onClick={() => onDone(true)}\n >\n <X aria-hidden=\"true\" />\n </Button>\n </form>\n <div className=\"pl-6\">\n <FormFieldError id={errorId} message={message} />\n </div>\n </div>\n );\n};\n","/** A 36px folder-rail row: muted until hovered, accent pill while it is the current scope. */\nexport const FOLDER_ROW_CLASSES =\n 'flex h-9 min-w-0 items-center gap-2.5 rounded-lg text-left text-sm font-medium text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-[current=true]:bg-accent aria-[current=true]:font-semibold aria-[current=true]:text-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0';\n","import type { MediaFolder } from '@shapio/client';\nimport { FolderPlus, MoreHorizontal, Pencil, Trash2 } from 'lucide-react';\nimport { useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Button } from '@/components/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\n\nexport type FolderActions = {\n onCreate: (parentId: string | null) => void;\n onRename: (folder: MediaFolder) => void;\n /** The folder whose delete confirmation is open. */\n deletingId: string | undefined;\n onDeleteOpenChange: (folder: MediaFolder, open: boolean) => void;\n onDelete: (folder: MediaFolder) => Promise<unknown>;\n};\n\ntype MenuProps = { folder: MediaFolder; canManage: boolean; actions: FolderActions };\n\n/**\n * A folder's \"…\" menu: new subfolder and rename (an inline row takes focus), delete (confirmed in a popover\n * anchored to this button).\n */\nexport const Menu = ({ folder, canManage, actions }: MenuProps) => {\n const { t } = useTranslation();\n // A menu item hands focus to the inline row or the delete confirmation instead of the menu button.\n const handingOff = useRef(false);\n const handOff = (action: () => void) => () => {\n handingOff.current = true;\n action();\n };\n return (\n <DropdownMenu>\n <InlineConfirm\n tone=\"danger\"\n open={actions.deletingId === folder.id}\n onOpenChange={(open) => actions.onDeleteOpenChange(folder, open)}\n title={t('media.folders.deleteTitle', { name: folder.name })}\n description={t('media.folders.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={() => actions.onDelete(folder)}\n >\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n aria-label={t('media.folders.actions', { name: folder.name })}\n className=\"absolute right-1.5\"\n data-folder-menu={folder.id}\n >\n <MoreHorizontal aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n </InlineConfirm>\n <DropdownMenuContent\n align=\"end\"\n onCloseAutoFocus={(event) => {\n if (handingOff.current) {\n handingOff.current = false;\n event.preventDefault();\n }\n }}\n >\n <DropdownMenuItem onSelect={handOff(() => actions.onCreate(folder.id))}>\n <FolderPlus aria-hidden=\"true\" />\n {t('media.folders.newSubfolder')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={handOff(() => actions.onRename(folder))}>\n <Pencil aria-hidden=\"true\" />\n {t('media.folders.rename')}\n </DropdownMenuItem>\n {canManage ? (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n variant=\"destructive\"\n onSelect={handOff(() => actions.onDeleteOpenChange(folder, true))}\n >\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n};\n","import { Folder, FolderOpen } from 'lucide-react';\nimport { cn } from '@/helpers/cn';\nimport type { FolderNode } from '../../helpers/folderTree';\nimport type { FolderEdit } from '../../hooks/useFolderForm';\nimport { FOLDER_ROW_CLASSES } from '../constants';\nimport { EditRow } from '../EditRow';\nimport { Menu, type FolderActions } from '../Menu';\n\ntype ItemProps = {\n node: FolderNode;\n currentId: string | undefined;\n canWrite: boolean;\n canManage: boolean;\n actions: FolderActions;\n /** The inline row being edited anywhere in the tree. */\n editing: FolderEdit | undefined;\n onEditDone: (returnFocus: boolean) => void;\n onSelect: (id: string) => void;\n};\n\n/** A folder (button + actions menu, or its name being edited) and its subfolders, as a nested list. */\nexport const Item = ({\n node,\n currentId,\n canWrite,\n canManage,\n actions,\n editing,\n onEditDone,\n onSelect,\n}: ItemProps) => {\n const current = node.id === currentId;\n const Icon = current ? FolderOpen : Folder;\n const renameEdit = editing?.mode === 'rename' && editing.folder.id === node.id ? editing : undefined;\n const childEdit = editing?.mode === 'create' && editing.parentId === node.id ? editing : undefined;\n return (\n <li>\n {renameEdit ? (\n <EditRow edit={renameEdit} onDone={onEditDone} />\n ) : (\n <div className=\"relative flex items-center\">\n <button\n type=\"button\"\n aria-current={current ? 'true' : undefined}\n onClick={() => onSelect(node.id)}\n className={cn(FOLDER_ROW_CLASSES, 'flex-1 pl-2.5', canWrite ? 'pr-9' : 'pr-2.5')}\n >\n <Icon aria-hidden=\"true\" />\n <span className=\"truncate\">{node.name}</span>\n <span className=\"ml-auto text-xs font-medium text-muted-foreground tabular-nums\">\n {node.assetCount}\n </span>\n </button>\n {canWrite ? <Menu folder={node} canManage={canManage} actions={actions} /> : null}\n </div>\n )}\n {node.children.length > 0 || childEdit ? (\n <ul className=\"mt-0.5 ml-4 space-y-0.5 border-l pl-1.5\">\n {childEdit ? (\n <li>\n <EditRow edit={childEdit} onDone={onEditDone} />\n </li>\n ) : null}\n {node.children.map((child) => (\n <Item\n key={child.id}\n node={child}\n currentId={currentId}\n canWrite={canWrite}\n canManage={canManage}\n actions={actions}\n editing={editing}\n onEditDone={onEditDone}\n onSelect={onSelect}\n />\n ))}\n </ul>\n ) : null}\n </li>\n );\n};\n","import type { ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\nimport { FOLDER_ROW_CLASSES } from '../constants';\n\ntype ScopeButtonProps = { current: boolean; icon: ReactNode; label: string; onClick: () => void };\n\n/** \"All media\" and \"Not in a folder\": scopes above the folder list. */\nexport const ScopeButton = ({ current, icon, label, onClick }: ScopeButtonProps) => (\n <button\n type=\"button\"\n aria-current={current ? 'true' : undefined}\n onClick={onClick}\n className={cn(FOLDER_ROW_CLASSES, 'w-full px-2.5')}\n >\n {icon}\n <span className=\"truncate\">{label}</span>\n </button>\n);\n","import type { MediaFolder } from '@shapio/client';\nimport { Images, Inbox } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Panel } from '@/components/Panel';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { ROOT_FOLDER } from '../constants';\nimport { buildFolderTree } from '../helpers/folderTree';\nimport type { FolderEdit } from '../hooks/useFolderForm';\nimport { EditRow } from './EditRow';\nimport { Item } from './Item';\nimport type { FolderActions } from './Menu';\nimport { ScopeButton } from './ScopeButton';\n\ntype FolderTreeProps = {\n folders: readonly MediaFolder[] | undefined;\n /** A folder ID, `root`, or undefined for every folder. */\n current: string | undefined;\n canWrite: boolean;\n canManage: boolean;\n actions: FolderActions;\n /** The folder name being typed in place (a new folder or a rename), if any. */\n editing: FolderEdit | undefined;\n onEditDone: (returnFocus: boolean) => void;\n onSelect: (folder: string | undefined) => void;\n className?: string;\n};\n\n/**\n * The folder rail: \"All media\", \"Not in a folder\", then every folder with rename / new subfolder / delete.\n * New top-level folders come from the page header; new and renamed folders are named in place.\n */\nexport const FolderTree = ({\n folders,\n current,\n canWrite,\n canManage,\n actions,\n editing,\n onEditDone,\n onSelect,\n className,\n}: FolderTreeProps) => {\n const { t } = useTranslation();\n const tree = useMemo(() => buildFolderTree(folders ?? []), [folders]);\n const topLevelEdit = editing?.mode === 'create' && editing.parentId === null ? editing : undefined;\n return (\n <Panel title={t('media.folders.title')} flush className={className} bodyClassName=\"p-2\">\n <nav aria-label={t('media.folders.title')} className=\"space-y-1\">\n <ul className=\"space-y-0.5\">\n <li>\n <ScopeButton\n current={current === undefined}\n icon={<Images aria-hidden=\"true\" />}\n label={t('media.folders.all')}\n onClick={() => onSelect(undefined)}\n />\n </li>\n <li>\n <ScopeButton\n current={current === ROOT_FOLDER}\n icon={<Inbox aria-hidden=\"true\" />}\n label={t('media.folders.unfiled')}\n onClick={() => onSelect(ROOT_FOLDER)}\n />\n </li>\n </ul>\n {folders === undefined ? (\n <Skeleton className=\"h-8 w-full\" />\n ) : tree.length > 0 || topLevelEdit ? (\n <ul className=\"space-y-0.5 border-t pt-1\">\n {topLevelEdit ? (\n <li>\n <EditRow edit={topLevelEdit} onDone={onEditDone} />\n </li>\n ) : null}\n {tree.map((node) => (\n <Item\n key={node.id}\n node={node}\n currentId={current}\n canWrite={canWrite}\n canManage={canManage}\n actions={actions}\n editing={editing}\n onEditDone={onEditDone}\n onSelect={onSelect}\n />\n ))}\n </ul>\n ) : null}\n </nav>\n </Panel>\n );\n};\n","import { useCallback, useState } from 'react';\n\n/** The assets ticked for bulk actions. */\nexport const useAssetSelection = () => {\n const [selected, setSelected] = useState<ReadonlySet<string>>(new Set());\n const toggle = useCallback(\n (id: string, checked: boolean) =>\n setSelected((current) => {\n const next = new Set(current);\n if (checked) {\n next.add(id);\n } else {\n next.delete(id);\n }\n return next;\n }),\n [],\n );\n const clear = useCallback(() => setSelected(new Set()), []);\n return { selected, toggle, clear };\n};\n","import type { MediaFolder } from '@shapio/client';\nimport { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useDeleteMediaFolder } from '@/api/media';\nimport { i18next } from '@/app/i18n';\nimport type { FolderActions } from '../FolderTree/Menu';\nimport type { FolderEdit } from './useFolderForm';\n\n/**\n * Where focus returns after an inline folder row: the page header's \"New folder\" button (`data-new-folder`)\n * for a top-level folder, otherwise the folder's actions button (`data-folder-menu` = its ID).\n */\nconst openerOf = (edit: FolderEdit): HTMLElement | null => {\n const id = edit.mode === 'rename' ? edit.folder.id : edit.parentId;\n const selector = id === null ? '[data-new-folder]' : `[data-folder-menu=\"${CSS.escape(id)}\"]`;\n return document.querySelector<HTMLElement>(selector);\n};\n\n/**\n * Create, rename and delete folders: the inline row being edited (create/rename happen in the tree, not a\n * dialog) and the folder whose delete confirmation is open.\n */\nexport const useFolderActions = (onDeleted: (folder: MediaFolder) => void) => {\n const [editing, setEditing] = useState<FolderEdit | undefined>(undefined);\n const [deletingId, setDeletingId] = useState<string | undefined>(undefined);\n const deleteFolder = useDeleteMediaFolder();\n const actions: FolderActions = {\n onCreate: (parentId) => setEditing({ mode: 'create', parentId }),\n onRename: (folder) => setEditing({ mode: 'rename', folder }),\n deletingId,\n onDeleteOpenChange: (folder, open) => setDeletingId(open ? folder.id : undefined),\n onDelete: (folder) =>\n deleteFolder.mutateAsync(folder.id).then(() => {\n toast.success(i18next.t('media.folders.deleted', { name: folder.name }));\n onDeleted(folder);\n }),\n };\n return {\n actions,\n editing,\n /**\n * Closes the inline row. With `returnFocus`, focus goes back to what opened it (the header button or\n * the folder's actions button) once the tree has re-rendered; not when focus already moved elsewhere.\n */\n stopEditing: (returnFocus: boolean) => {\n const edit = editing;\n setEditing(undefined);\n if (edit && returnFocus) {\n requestAnimationFrame(() => openerOf(edit)?.focus());\n }\n },\n };\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport type { MediaSearch } from '@/app/searchSchemas';\nimport { MIME_FILTER_BY_TYPE } from '../constants';\n\n/** Folder, filters, view and the open asset live in the URL (bookmarkable, back-button friendly). */\nexport const useMediaSearch = () => {\n const search = useSearch({ from: '/app/media' });\n const navigate = useNavigate({ from: '/media' });\n const setSearch = (changes: Partial<MediaSearch>, replace = false) =>\n void navigate({ search: (previous) => ({ ...previous, ...changes }), replace });\n return {\n search,\n setSearch,\n /** The API query for the current folder and filters. */\n assetQuery: {\n ...(search.folder ? { folder: search.folder } : {}),\n ...(search.q ? { search: search.q } : {}),\n ...(search.type ? { mimeType: MIME_FILTER_BY_TYPE[search.type] } : {}),\n },\n };\n};\n","import type { KeyboardEvent } from 'react';\n\n/**\n * Up/Down (and Home/End) move focus between the enabled buttons inside `event.currentTarget`, for short\n * pick lists where Tab alone would be slow.\n */\nexport const moveFocusWithArrows = (event: KeyboardEvent<HTMLElement>) => {\n const keys = ['ArrowDown', 'ArrowUp', 'Home', 'End'];\n if (!keys.includes(event.key)) {\n return;\n }\n const buttons = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('button:not(:disabled)')];\n if (buttons.length === 0) {\n return;\n }\n event.preventDefault();\n const index = buttons.findIndex((button) => button === document.activeElement);\n const last = buttons.length - 1;\n const next =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? last\n : event.key === 'ArrowDown'\n ? Math.min(index + 1, last)\n : Math.max(index - 1, 0);\n buttons[next]?.focus();\n};\n","import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useMoveMediaAssets } from '@/api/media';\nimport { i18next } from '@/app/i18n';\nimport { settle } from '@/helpers/settle';\n\n/** The move target while a move runs: a folder ID, or null for \"no folder\". */\ntype MoveTarget = string | null;\n\n/** Moves assets into a folder (or out of every folder) and reports it; `onMoved` runs on success. */\nexport const useMoveToFolder = (assetIds: readonly string[], onMoved: () => void) => {\n const move = useMoveMediaAssets();\n const [target, setTarget] = useState<MoveTarget | undefined>(undefined);\n return {\n /** The folder being moved into while the request runs. */\n target: move.isPending ? target : undefined,\n pending: move.isPending,\n error: move.error,\n reset: move.reset,\n moveTo: async (folderId: MoveTarget) => {\n setTarget(folderId);\n const result = await settle(move.mutateAsync({ assetIds: [...assetIds], folderId }));\n if (result.ok) {\n toast.success(i18next.t('media.move.done', { count: result.value.moved.length }));\n onMoved();\n }\n },\n };\n};\n","import { Loader2 } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\nimport { FOLDER_ROW_CLASSES } from '../../FolderTree/constants';\n\ntype ChoiceProps = {\n icon: ReactNode;\n label: string;\n /** Nesting level, indents the row (a runtime value, passed as a CSS variable). */\n depth: number;\n pending: boolean;\n disabled: boolean;\n onClick: () => void;\n};\n\n/** One folder in the move popover, indented by its depth; a spinner while the move into it runs. */\nexport const Choice = ({ icon, label, depth, pending, disabled, onClick }: ChoiceProps) => (\n <li>\n <button\n type=\"button\"\n disabled={disabled}\n aria-busy={pending || undefined}\n onClick={onClick}\n style={{ '--depth': depth } as CSSProperties}\n className={cn(\n FOLDER_ROW_CLASSES,\n 'w-full pr-2.5 pl-[calc(0.625rem+var(--depth)*1rem)] disabled:opacity-50',\n )}\n >\n {pending ? <Loader2 aria-hidden=\"true\" className=\"animate-spin\" /> : icon}\n <span className=\"truncate\">{label}</span>\n </button>\n </li>\n);\n","import { Folder, FolderInput, Inbox } from 'lucide-react';\nimport { useId, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useMediaFolders } from '@/api/media';\nimport { FormError } from '@/components/FormError';\nimport { Button } from '@/components/ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { moveFocusWithArrows } from '../helpers/arrowFocus';\nimport { buildFolderTree, flattenFolderTree } from '../helpers/folderTree';\nimport { useMoveToFolder } from '../hooks/useMoveToFolder';\nimport { Choice } from './Choice';\n\ntype MovePopoverProps = { assetIds: readonly string[]; onMoved: () => void };\n\n/**\n * \"Move to…\" for the selected files: a popover with the folder tree; choosing a folder moves them at once.\n * Up and Down move through the folders.\n */\nexport const MovePopover = ({ assetIds, onMoved }: MovePopoverProps) => {\n const { t } = useTranslation();\n const titleId = useId();\n const [open, setOpen] = useState(false);\n const folders = useMediaFolders();\n const choices = useMemo(() => flattenFolderTree(buildFolderTree(folders.data ?? [])), [folders.data]);\n const move = useMoveToFolder(assetIds, () => {\n setOpen(false);\n onMoved();\n });\n const changeOpen = (next: boolean) => {\n if (move.pending) {\n return;\n }\n if (next) {\n move.reset();\n }\n setOpen(next);\n };\n return (\n <Popover open={open} onOpenChange={changeOpen} modal>\n <PopoverTrigger asChild>\n <Button size=\"sm\" variant=\"outline\">\n <FolderInput aria-hidden=\"true\" />\n {t('media.move.action')}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" aria-labelledby={titleId} className=\"w-72 space-y-2 p-2\">\n <p id={titleId} className=\"px-2.5 pt-1 text-sm font-semibold\">\n {t('media.move.title', { count: assetIds.length })}\n </p>\n <ul className=\"max-h-72 space-y-0.5 overflow-y-auto\" onKeyDown={moveFocusWithArrows}>\n <Choice\n icon={<Inbox aria-hidden=\"true\" />}\n label={t('media.folders.none')}\n depth={0}\n pending={move.target === null}\n disabled={move.pending}\n onClick={() => void move.moveTo(null)}\n />\n {choices.map((folder) => (\n <Choice\n key={folder.id}\n icon={<Folder aria-hidden=\"true\" />}\n label={folder.name}\n depth={folder.depth}\n pending={move.target === folder.id}\n disabled={move.pending}\n onClick={() => void move.moveTo(folder.id)}\n />\n ))}\n </ul>\n {folders.isPending ? <Skeleton className=\"h-8 w-full\" /> : null}\n <FormError error={move.error} />\n </PopoverContent>\n </Popover>\n );\n};\n","import { X } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { MovePopover } from '../MovePopover';\n\ntype SelectionBarProps = { selected: ReadonlySet<string>; onClear: () => void };\n\n/** Bulk actions for the ticked assets. Announced when the selection changes. */\nexport const SelectionBar = ({ selected, onClear }: SelectionBarProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"flex flex-wrap items-center gap-2 rounded-xl border bg-accent py-1.5 pr-1.5 pl-4 text-accent-foreground\">\n <span role=\"status\" aria-live=\"polite\" className=\"mr-auto text-sm font-medium\">\n {t('media.selectedCount', { count: selected.size })}\n </span>\n <MovePopover assetIds={[...selected]} onMoved={onClear} />\n <Button size=\"sm\" variant=\"ghost\" onClick={onClear}>\n <X aria-hidden=\"true\" />\n {t('media.clearSelection')}\n </Button>\n </div>\n );\n};\n","import { FolderPlus } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useMediaFolders } from '@/api/media';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Button } from '@/components/ui/button';\nimport { useMediaPermissions } from '@/hooks/useMediaPermissions';\nimport { useMediaUploader } from '@/hooks/useMediaUploader';\nimport { ROOT_FOLDER } from './constants';\nimport { Details } from './Details';\nimport { Dropzone } from './Dropzone';\nimport { FolderTree } from './FolderTree';\nimport { useAssetSelection } from './hooks/useAssetSelection';\nimport { useFolderActions } from './hooks/useFolderActions';\nimport { useMediaSearch } from './hooks/useMediaSearch';\nimport { Library } from './Library';\nimport { SelectionBar } from './SelectionBar';\nimport { Toolbar } from './Toolbar';\nimport { UploadButton } from './UploadButton';\nimport { UploadQueue } from './UploadQueue';\n\n/** The media library: folders, search and filters, uploads (drop or pick), bulk move and asset details. Folders are created and renamed in place. */\nexport const Media = () => {\n const { t } = useTranslation();\n const { search, setSearch, assetQuery } = useMediaSearch();\n const folders = useMediaFolders();\n const { canWrite, canManage } = useMediaPermissions();\n const uploader = useMediaUploader();\n const selection = useAssetSelection();\n const folderActions = useFolderActions((folder) => {\n if (search.folder === folder.id) {\n setSearch({ folder: undefined });\n }\n });\n const uploadFolder = search.folder && search.folder !== ROOT_FOLDER ? search.folder : null;\n const upload = (files: File[]) => uploader.enqueue(files, { folderId: uploadFolder, visibility: 'public' });\n return (\n <Page width=\"full\">\n <PageHeader\n title={t('media.title')}\n actions={\n canWrite ? (\n <>\n <Button variant=\"outline\" data-new-folder onClick={() => folderActions.actions.onCreate(null)}>\n <FolderPlus aria-hidden=\"true\" />\n {t('media.folders.new')}\n </Button>\n <UploadButton label={t('media.upload.action')} onFiles={upload} />\n </>\n ) : null\n }\n />\n <div className=\"grid gap-6 lg:grid-cols-[13.75rem_minmax(0,1fr)]\">\n <FolderTree\n folders={folders.data}\n current={search.folder}\n canWrite={canWrite}\n canManage={canManage}\n actions={folderActions.actions}\n editing={folderActions.editing}\n onEditDone={folderActions.stopEditing}\n onSelect={(folder) => {\n selection.clear();\n setSearch({ folder });\n }}\n className=\"lg:self-start\"\n />\n <Dropzone enabled={canWrite} onFiles={upload} className=\"min-h-96 min-w-0 space-y-4\">\n <UploadQueue onRetry={uploader.retry} onDismiss={uploader.dismiss} />\n <Toolbar\n query={search.q}\n type={search.type}\n view={search.view ?? 'grid'}\n onQueryChange={(q) => setSearch({ q }, true)}\n onTypeChange={(type) => setSearch({ type })}\n onViewChange={(view) => setSearch({ view })}\n />\n {selection.selected.size > 0 ? (\n <SelectionBar selected={selection.selected} onClear={selection.clear} />\n ) : null}\n <Library\n query={assetQuery}\n filtered={Boolean(search.q || search.type)}\n view={search.view ?? 'grid'}\n selected={selection.selected}\n selectable={canWrite}\n activeId={search.asset}\n onSelectChange={selection.toggle}\n onOpen={(asset) => setSearch({ asset: asset.id })}\n />\n </Dropzone>\n </div>\n <Details\n assetId={search.asset}\n onClose={() => setSearch({ asset: undefined })}\n onReplace={(assetId, file) =>\n uploader.enqueue([file], { folderId: null, visibility: 'public', replaceAssetId: assetId })\n }\n />\n </Page>\n );\n};\n","import { createLazyRoute } from '@tanstack/react-router';\nimport { Media } from '@/features/Media';\n\n/** The media library, loaded on first visit. */\nexport const mediaLazyRoute = createLazyRoute('/app/media')({ component: Media });\n"],"ignoreList":[0,1,2],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{$ as e,A as t,G as n,H as r,M as i,O as a,W as o,i as s,j as c,lt as l,o as u}from"./loader-circle-C-9trZPI.js";var d=class extends r{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:r}=e,i=super.createResult(e,t),{isFetching:a,isRefetching:s,isError:c,isRefetchError:l}=i,u=r.fetchMeta?.fetchMore?.direction,d=c&&u===`forward`,f=a&&u===`forward`,p=c&&u===`backward`,m=a&&u===`backward`;return{...i,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:o(t,r.data),hasPreviousPage:n(t,r.data),isFetchNextPageError:d,isFetchingNextPage:f,isFetchPreviousPageError:p,isFetchingPreviousPage:m,isRefetchError:l&&!d&&!p,isRefetching:s&&!f&&!m}}};function f(e,t){return i(e,d,t)}var p={silent:!0},m=2e3,h=e=>e.status===`processing`||e.variants.some(e=>e.status===`pending`),g=()=>c({queryKey:a.media.folders,queryFn:()=>u.media.folders.list()}),_=t=>f({queryKey:a.media.assets(t),queryFn:({pageParam:e})=>u.media.assets.list({...t,limit:48,...e?{cursor:e}:{}}),initialPageParam:void 0,getNextPageParam:e=>e.nextCursor??void 0,placeholderData:e,refetchInterval:e=>e.state.data?.pages.some(e=>e.items.some(h))?m:!1}),v=e=>c({queryKey:a.media.asset(e??``),queryFn:()=>u.media.assets.get(e??``),enabled:e!==void 0,refetchInterval:e=>e.state.data&&h(e.state.data)?m:!1}),y=e=>c({queryKey:a.media.usage(e??``),queryFn:()=>u.media.assets.usage(e??``),enabled:e!==void 0,meta:p}),b=()=>{let e=l();return()=>e.invalidateQueries({queryKey:a.media.all})},x=()=>{let e=l(),n=b();return t({mutationKey:[`media`,`assets`,`update`],meta:p,mutationFn:({id:e,input:t})=>s(()=>u.media.assets.update(e,t)),onSuccess:t=>(e.setQueryData(a.media.asset(t.id),t),n())})},S=()=>{let e=b();return t({mutationKey:[`media`,`assets`,`delete`],meta:p,mutationFn:({id:e,force:t})=>s(()=>u.media.assets.remove(e,{force:t})),onSuccess:e})},C=()=>{let e=b();return t({mutationKey:[`media`,`assets`,`move`],mutationFn:e=>s(()=>u.media.assets.move(e)),onSettled:e})},w=()=>{let e=b();return t({mutationKey:[`media`,`folders`,`create`],meta:p,mutationFn:e=>s(()=>u.media.folders.create(e)),onSuccess:e})},T=()=>{let e=b();return t({mutationKey:[`media`,`folders`,`update`],meta:p,mutationFn:({id:e,input:t})=>s(()=>u.media.folders.update(e,t)),onSuccess:e})},E=()=>{let e=b();return t({mutationKey:[`media`,`folders`,`delete`],mutationFn:e=>s(()=>u.media.folders.remove(e)),onSettled:e})};export{_ as a,C as c,f as d,v as i,x as l,S as n,g as o,E as r,y as s,w as t,T as u};
2
- //# sourceMappingURL=media-VCJUbYzJ.js.map
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{A as r,O as i,g as a,h as o,i as s,j as c,lt as l,m as u,o as d}from"./loader-circle-C-9trZPI.js";import{C as f,T as p,u as m,x as h}from"./auth-C4fHG9Iu.js";import{O as ee,_ as te,a as g,i as _,j as ne,n as re,o as v,r as ie,t as y}from"./badge-ydvfgE8a.js";import{n as b,t as ae}from"./createLucideIcon-CqygG5K6.js";import{i as x,n as S,o as oe,t as se}from"./RowTitle-DoxDM1XL.js";import{t as C}from"./fileRoute-DzWMBrRx.js";import{t as ce}from"./UnsavedChangesGuard-C1n7egF6.js";import{t as w}from"./FormCheckboxGroup-V3IKrvzc.js";import{$ as le}from"./src-BcLeD2-K.js";import{E as T,S as ue}from"./InfoHint-bYMd_t0J.js";import{T as E,x as de}from"./es2015-DrAA1N2V.js";import{n as fe,t as pe}from"./Form-DF_YmR1G.js";import{u as me}from"./constants-esJAnNTh.js";import{t as he}from"./boxes-D6Y4Cenx.js";import{i as D,n as ge,r as _e}from"./skeleton-Dyi_b1wq.js";import{a as ve,i as ye,n as be,r as xe,s as Se,t as Ce}from"./select-DUhL27UN.js";import{t as we}from"./CursorPager-H4SpVYw7.js";import{a as Te,i as O,n as Ee,o as De,r as k,t as Oe}from"./ConfirmDialog-DZRJfdvH.js";import{_ as ke,a as Ae,c as je,o as A,s as Me,t as j}from"./field-W1dB_h6d.js";import{t as Ne}from"./link-B3O0VUVT.js";import{t as Pe}from"./ellipsis-BHtU4ov6.js";import{t as Fe}from"./search-CW3iBC4k.js";import{a as M,l as Ie,p as Le,r as Re,t as ze}from"./dropdown-menu-C53v9ioW.js";import{t as Be}from"./pencil-BVSFlU14.js";import{t as N}from"./plus-WfYKHW7G.js";import{t as Ve}from"./scroll-text-gKYBbibb.js";import{_ as He,b as Ue,d as We,f as Ge,g as Ke,h as qe,p as Je,v as Ye,x as Xe,y as Ze}from"./searchSchemas-C4qp-vCa.js";import{i as Qe,n as $e,r as et,t as tt}from"./useAuditLabels-DWBpLOTB.js";import{t as nt}from"./users-ohHZnBJW.js";import{t as rt}from"./cn-DVhJ55Mo.js";import{t as it}from"./UserAvatar-Bl32IpG_.js";import{n as at,t as ot}from"./radio-group-rFxn7cz2.js";import{t as st}from"./switch-C3dDDUIk.js";import{d as ct,f as lt,i as ut,l as dt,n as P,o as F,r as ft,t as I,u as L}from"./zod-C-k48Hnc.js";import{t as R}from"./settle-LRKtTN_e.js";import{a as z,f as pt,g as B,i as V,l as mt,n as H,o as U,r as W,s as G,t as K,u as ht,v as q}from"./table-zG68ipQc.js";import{t as gt}from"./HintedLabel-BlLtqVVz.js";import{m as _t,s as vt}from"./schema-D9BgCVzZ.js";import{t as J}from"./QueryView-UBO-U5Wo.js";import{t as yt}from"./FormRadioGroup-DIv-MYgn.js";import{t as bt}from"./useNetworkPermission-CegwqQXR.js";import{t as Y}from"./Panel-B1TkcP8V.js";import{a as xt,i as St}from"./followPlural-D-5ZJqJF.js";import{t as Ct}from"./FormTextareaField-DbqZ-MwI.js";import{n as X,t as wt}from"./FormSelectField-CUhaPIMY.js";import{a as Tt,c as Et,i as Dt,n as Ot,o as kt,r as At,s as jt,t as Mt}from"./users-CDoJRL24.js";import{a as Nt,n as Pt,o as Ft,r as It,s as Lt,t as Rt}from"./SecretReveal-kCkLH5jg.js";import{t as zt}from"./useConfirmTarget-9JmfiY2X.js";import{t as Bt}from"./LinkTabs-ByB2eCIr.js";var Vt=[`read`,`create`,`update`,`delete`,`publish`,`schemaManage`],Ht=[`read`,`readDrafts`],Ut=[`schema.create`,`users.manage`,`roles.manage`,`tokens.manage`,`audit.read`,`sites.manage`,`media.read`,`media.write`,`media.manage`,`publishing.manage`,`webhooks.manage`,`deployments.manage`,`deployments.trigger`,`changes.manage`,`changes.ship`,`site.settings`],Z=[`read`,`create`,`update`,`delete`,`publish`],Wt={name:`book-open`,size:24,node:[[`path`,{d:`M12 5v16`,key:`1f6ucr`}],[`path`,{d:`M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z`,key:`1fyvmf`}]]};Wt.node;var Gt=ae(Wt),Kt={name:`sliders-horizontal`,size:24,node:[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]};Kt.node;var qt=ae(Kt),Q=e(n(),1),Jt=()=>{let{t:e}=b(),t=_t(),{locked:n,reason:r}=xt(),i=n?null:(0,Q.jsx)(D,{asChild:!0,children:(0,Q.jsxs)(h,{to:`/network/content-types/new`,children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),e(`contentTypes.network.create`)]})});return(0,Q.jsxs)(g,{children:[(0,Q.jsx)(_,{title:e(`contentTypes.network.title`),meta:t.data?e(`contentTypes.network.count`,{count:t.data.length}):void 0,actions:i}),n?(0,Q.jsx)(St,{reason:r}):null,(0,Q.jsx)(J,{query:t,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:he,title:e(`contentTypes.network.empty`),description:e(`contentTypes.network.emptyDescription`),action:i}),children:e=>(0,Q.jsx)(fe,{items:e,showKind:!0,markShared:!1})})]})},Yt=[`collection`,`singleton`,`component`],Xt=()=>{let{t:e}=b();return(0,Q.jsx)(pe,{title:e(`contentTypes.network.newTitle`),kinds:Yt,back:f({to:`/network/content-types`}),backLabel:e(`contentTypes.network.title`),scope:`network`})},$=e(t(),1),Zt=e=>Promise.all([e.invalidateQueries({queryKey:i.sites.all}),e.invalidateQueries({queryKey:i.me})]),Qt=()=>c({queryKey:i.sites.all,queryFn:()=>d.sites.list(),meta:{silent:!0}}),$t=e=>c({queryKey:i.sites.site(e),queryFn:()=>d.sites.get(e),meta:{silent:!0}}),en=()=>{let e=Qt();return{names:(0,$.useMemo)(()=>new Map((e.data??[]).map(e=>[e.id,e.name])),[e.data]),error:e.error}},tn=()=>{let e=l();return r({mutationKey:[`sites`,`create`],meta:{silent:!0},mutationFn:e=>s(()=>d.sites.create(e)),onSuccess:()=>Zt(e)})},nn=()=>{let e=l();return r({mutationKey:[`sites`,`update`],meta:{silent:!0},mutationFn:({id:e,input:t})=>s(()=>d.sites.update(e,t)),onSettled:()=>Zt(e)})},rn=()=>{let e=l();return r({mutationKey:[`sites`,`delete`],meta:{silent:!0},mutationFn:e=>s(()=>d.sites.remove(e.id)),onSuccess:(t,n)=>{if(n.key===u().key){a();return}return e.removeQueries({queryKey:i.sites.site(n.id)}),Zt(e)}})},an=e=>c({queryKey:i.sites.appRoles(e),queryFn:()=>d.sites.appRoles.get(e),meta:{silent:!0}}),on=()=>{let e=l();return r({mutationKey:[`sites`,`appRoles`,`set`],meta:{silent:!0},mutationFn:({id:e,input:t})=>s(()=>d.sites.appRoles.set(e,t)),onSuccess:t=>e.setQueryData(i.sites.appRoles(t.siteId),t)})},sn=e=>{let t=on(),n=L({defaultValues:{public:e.public,authenticated:e.authenticated}}),{reset:r,formState:i}=n;return(0,$.useEffect)(()=>{i.isDirty||r({public:e.public,authenticated:e.authenticated})},[e,r,i.isDirty]),{form:n,onSubmit:n.handleSubmit(async n=>{let i=await R(t.mutateAsync({id:e.siteId,input:n}));i.ok&&(r({public:i.value.public,authenticated:i.value.authenticated}),T.success(E.t(`sites.appRoles.saved`)))}),setBindings:t}},cn=({bindings:e,roles:t,canManage:n})=>{let{t:r}=b(),{form:i,onSubmit:a,setBindings:o}=sn(e),s=t.map(e=>({value:e.id,label:e.name})),{isDirty:c}=i.formState;return(0,Q.jsxs)(`form`,{noValidate:!0,onSubmit:e=>void a(e),children:[(0,Q.jsxs)(Ae,{children:[(0,Q.jsx)(w,{control:i.control,name:`public`,legend:r(`sites.appRoles.public`),options:s,disabled:!n}),(0,Q.jsx)(w,{control:i.control,name:`authenticated`,legend:r(`sites.appRoles.authenticated`),options:s,disabled:!n}),(0,Q.jsx)(O,{error:o.error}),n?(0,Q.jsx)(`div`,{children:(0,Q.jsx)(te,{pending:o.isPending,pendingLabel:r(`common.saving`),disabled:!c,children:r(`common.saveChanges`)})}):null]}),(0,Q.jsx)(ce,{when:c})]})},ln=({siteId:e,canManage:t})=>{let{t:n}=b(),r=an(e),i=qe();return(0,Q.jsx)(Y,{title:n(`sites.appRoles.title`),description:n(`sites.appRoles.description`),children:(0,Q.jsx)(J,{query:r,children:e=>(0,Q.jsx)(J,{query:i,children:n=>(0,Q.jsx)(cn,{bindings:e,roles:n,canManage:t})})})})},un=({site:e})=>{let{t}=b(),n=p(),r=rn();return(0,Q.jsx)(Y,{title:t(`sites.danger`),description:t(`sites.deleteDescription`),children:(0,Q.jsx)(k,{tone:`danger`,title:t(`sites.deleteTitle`,{name:e.name}),description:t(`sites.deleteConsequence`),confirmLabel:t(`common.delete`),onConfirm:async()=>{await r.mutateAsync(e),e.key!==u().key&&(T.success(t(`sites.deleted`,{name:e.name})),n({to:`/network/sites`}))},trigger:(0,Q.jsx)(D,{variant:`destructive-ghost`,children:t(`sites.delete`)})})})},dn=B({name:F().max(200,`validation.tooLong`)}),fn=e=>{let t=nn(),n=L({resolver:I(dn),defaultValues:{name:e.name}}),{reset:r,formState:i}=n;return(0,$.useEffect)(()=>{i.isDirty||r({name:e.name})},[e.name,r,i.isDirty]),{form:n,onSubmit:n.handleSubmit(async({name:n})=>{let i=await R(t.mutateAsync({id:e.id,input:{expectedVersion:e.version,name:n}}));i.ok&&(r({name:i.value.name}),T.success(E.t(`sites.renamed`)))}),updateSite:t}},pn=`site-key`,mn=`site-key-hint`,hn=({site:e,canManage:t})=>{let{t:n}=b(),{form:r,onSubmit:i,updateSite:a}=fn(e),{isDirty:o}=r.formState;return(0,Q.jsxs)(Y,{title:n(`sites.details`),children:[(0,Q.jsx)(`form`,{noValidate:!0,onSubmit:e=>void i(e),className:`max-w-md`,children:(0,Q.jsxs)(Ae,{children:[(0,Q.jsx)(P,{control:r.control,name:`name`,label:n(`sites.name`),autoComplete:`off`,readOnly:!t}),(0,Q.jsxs)(j,{children:[(0,Q.jsx)(gt,{htmlFor:pn,label:n(`sites.key`),hint:n(`sites.keyHint`),hintId:mn}),(0,Q.jsx)(ge,{id:pn,value:e.key,readOnly:!0,className:`font-mono`,"aria-describedby":mn})]}),(0,Q.jsx)(O,{error:a.error}),t?(0,Q.jsx)(`div`,{children:(0,Q.jsx)(te,{pending:a.isPending,pendingLabel:n(`common.saving`),disabled:!o,children:n(`common.saveChanges`)})}):null]})}),(0,Q.jsx)(ce,{when:o})]})},gn=()=>{let{t:e}=b(),{siteId:t}=ne({from:`/app/network/sites/$siteId`}),n=$t(t),r=bt(`sites.manage`),i=bt(`roles.manage`);return(0,Q.jsx)(g,{width:`narrow`,children:(0,Q.jsx)(J,{query:n,children:t=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{breadcrumb:[{label:e(`sites.title`),link:f({to:`/network/sites`})}],title:t.name,badge:t.isPrimary?(0,Q.jsx)(y,{variant:`secondary`,children:e(`sites.primary`)}):null,meta:t.key,actions:(0,Q.jsx)(D,{variant:`outline`,onClick:()=>o(t.key),children:e(`sites.open`)})}),(0,Q.jsx)(hn,{site:t,canManage:r},t.id),(0,Q.jsx)(ln,{siteId:t.id,canManage:i}),r&&!t.isPrimary?(0,Q.jsx)(un,{site:t}):null]})})})},_n=B({name:F().max(200,`validation.tooLong`),key:q().trim().regex(/^[a-z][a-z0-9-]{0,62}$/,`validation.siteKey`)}),vn={name:``,key:``},yn=(e,t)=>{let n=tn(),r=L({resolver:I(_n),defaultValues:vn}),{reset:i}=r;return(0,$.useEffect)(()=>{e&&i(vn)},[e,i]),{form:r,onSubmit:r.handleSubmit(async e=>{let r=await R(n.mutateAsync(e));r.ok&&(i(vn),t(r.value))}),createSite:n}},bn=({open:e,onOpenChange:t,onCreated:n})=>{let{t:r}=b(),{form:i,onSubmit:a,createSite:o}=yn(e,n);return(0,Q.jsxs)(X,{open:e,onOpenChange:t,size:`md`,title:r(`sites.createTitle`),dirty:i.formState.isDirty,pending:o.isPending,submitLabel:r(`common.create`),pendingLabel:r(`common.saving`),onSubmit:e=>void a(e),children:[(0,Q.jsx)(P,{control:i.control,name:`name`,label:r(`sites.name`),autoComplete:`off`}),(0,Q.jsx)(P,{control:i.control,name:`key`,label:r(`sites.key`),autoComplete:`off`,spellCheck:!1,hint:r(`sites.keyHint`),description:r(`sites.keyFixed`)}),(0,Q.jsx)(O,{error:o.error})]})},xn=({sites:e})=>{let{t}=b();return(0,Q.jsx)(G,{children:(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:t(`sites.name`)}),(0,Q.jsx)(V,{children:t(`sites.key`)}),(0,Q.jsx)(V,{children:t(`sites.createdAt`)}),(0,Q.jsx)(V,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:t(`common.actions`)})})]})}),(0,Q.jsx)(H,{children:e.map(e=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(W,{children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(se,{asChild:!0,children:(0,Q.jsx)(h,{to:`/network/sites/$siteId`,params:{siteId:e.id},children:e.name})}),e.isPrimary?(0,Q.jsx)(y,{variant:`secondary`,children:t(`sites.primary`)}):null]})}),(0,Q.jsx)(W,{className:`font-mono text-xs`,children:e.key}),(0,Q.jsx)(W,{title:S(e.createdAt),children:x(e.createdAt)}),(0,Q.jsx)(W,{className:`text-right`,children:(0,Q.jsx)(D,{variant:`outline`,size:`sm`,"aria-label":t(`sites.openNamed`,{name:e.name}),onClick:()=>o(e.key),children:t(`sites.open`)})})]},e.id))})]})})},Sn=()=>{let{t:e}=b(),t=p(),n=Qt(),r=bt(`sites.manage`),[i,a]=(0,$.useState)(!1);return(0,Q.jsxs)(g,{children:[(0,Q.jsx)(_,{title:e(`sites.title`),meta:n.data?e(`sites.count`,{count:n.data.length}):void 0,actions:r?(0,Q.jsxs)(D,{onClick:()=>a(!0),children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),e(`sites.create`)]}):null}),(0,Q.jsx)(J,{query:n,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:me,title:e(`sites.empty`)}),children:e=>(0,Q.jsx)(xn,{sites:e})}),r?(0,Q.jsx)(bn,{open:i,onOpenChange:a,onCreated:n=>{a(!1),T.success(e(`sites.created`,{name:n.name})),t({to:`/network/sites/$siteId`,params:{siteId:n.id}})}}):null]})},Cn=`all`,wn=e=>We.includes(e),Tn=({action:e,actorType:t,onChange:n})=>{let{t:r}=b(),[i,a]=(0,$.useState)(e??``),o=!!e||!!t;return(0,Q.jsxs)(`form`,{role:`search`,className:`flex w-full flex-wrap items-center gap-2`,onSubmit:e=>{e.preventDefault(),n({action:i.trim()||void 0,actorType:t})},children:[(0,Q.jsx)(_e,{htmlFor:`audit-action`,className:`sr-only`,children:r(`audit.filterAction`)}),(0,Q.jsxs)(`div`,{className:`relative w-full sm:w-80`,children:[(0,Q.jsx)(Fe,{"aria-hidden":`true`,className:`absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(ge,{id:`audit-action`,inputSize:`sm`,value:i,placeholder:r(`audit.filterActionPlaceholder`),onChange:e=>a(e.target.value),onBlur:()=>n({action:i.trim()||void 0,actorType:t}),className:`pl-8`})]}),(0,Q.jsx)(_e,{htmlFor:`audit-actor-type`,className:`sr-only`,children:r(`audit.filterActor`)}),(0,Q.jsxs)(Ce,{value:t??Cn,onValueChange:t=>n({action:e,actorType:wn(t)?t:void 0}),children:[(0,Q.jsx)(ye,{id:`audit-actor-type`,size:`sm`,className:`w-44`,children:(0,Q.jsx)(ve,{})}),(0,Q.jsxs)(be,{children:[(0,Q.jsx)(xe,{value:Cn,children:r(`audit.allActors`)}),We.map(e=>(0,Q.jsx)(xe,{value:e,children:r(`audit.actorTypes.${e}`)},e))]})]}),o?(0,Q.jsx)(D,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>{a(``),n({action:void 0,actorType:void 0})},children:r(`audit.clearFilters`)}):null]})},En=()=>{let e=oe({from:`/app/network/audit-log`}),t=p({from:`/network/audit-log`}),[n,r]=(0,$.useState)([]),i=e=>void t({search:t=>({...t,...e})});return{search:e,goFirst:e.cursor===void 0?void 0:()=>{r([]),i({cursor:void 0})},goPrevious:n.length===0?void 0:()=>{i({cursor:n.at(-1)}),r(e=>e.slice(0,-1))},goNext:t=>{r(t=>[...t,e.cursor]),i({cursor:t})},setFilters:e=>{r([]),i({...e,cursor:void 0})}}},Dn=e=>e.targetType?`${e.targetType}:${e.targetId??``}`:void 0,On=({events:e})=>{let{t}=b(),{actionLabel:n,targetLabel:r}=tt();return(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:t(`audit.actor`)}),(0,Q.jsx)(V,{children:t(`audit.action`)}),(0,Q.jsx)(V,{children:t(`audit.target`)}),(0,Q.jsx)(V,{children:t(`audit.outcome`)}),(0,Q.jsx)(V,{children:t(`audit.ipAddress`)}),(0,Q.jsx)(V,{children:t(`audit.when`)})]})}),(0,Q.jsx)(H,{children:e.map(e=>{let i=t(`audit.actorTypes.${e.actorType}`),a=e.actorName??e.actorEmail??i,o=e.actorName&&e.actorEmail?e.actorEmail:e.actorName||e.actorEmail?i:e.actorId??void 0,s=n(e.action),c=Dn(e),l=$e(e.metadata);return(0,Q.jsxs)(U,{children:[(0,Q.jsx)(W,{children:(0,Q.jsxs)(`span`,{className:`flex items-center gap-2.5`,children:[(0,Q.jsx)(it,{name:a,size:`sm`}),(0,Q.jsxs)(`span`,{className:`min-w-0`,children:[(0,Q.jsx)(`span`,{className:`block max-w-48 truncate text-sm font-semibold`,children:a}),o?(0,Q.jsx)(`span`,{className:`block max-w-48 truncate text-xs text-muted-foreground`,title:o,children:o}):null]})]})}),(0,Q.jsx)(W,{title:e.action,children:s?(0,Q.jsx)(y,{variant:`secondary`,children:s}):(0,Q.jsx)(y,{variant:`secondary`,className:`font-mono`,children:e.action})}),(0,Q.jsx)(W,{className:`max-w-64`,title:c,children:e.targetType?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`span`,{className:`block truncate text-sm`,children:r(e.targetType)??(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:e.targetType})}),(0,Q.jsx)(`span`,{className:`block truncate text-xs text-muted-foreground`,children:l??(0,Q.jsx)(`span`,{className:`font-mono`,children:e.targetId})})]}):(0,Q.jsx)(`span`,{className:`text-muted-foreground`,children:t(`common.none`)})}),(0,Q.jsx)(W,{children:(0,Q.jsx)(re,{tone:e.outcome===`success`?`success`:`danger`,label:e.outcome===`success`?t(`audit.success`):t(`audit.failure`)})}),(0,Q.jsx)(W,{className:`font-mono text-xs`,children:e.ip??t(`common.unknown`)}),(0,Q.jsx)(W,{className:`whitespace-nowrap`,title:S(e.occurredAt),children:x(e.occurredAt)})]},e.id)})})]})},kn=()=>{let{t:e}=b(),{search:t,goFirst:n,goPrevious:r,goNext:i,setFilters:a}=En(),o=et({cursor:t.cursor,limit:50,action:t.action,actorType:t.actorType}),s=o.data?.nextCursor;return(0,Q.jsxs)(g,{width:`full`,children:[(0,Q.jsx)(_,{title:e(`audit.title`)}),(0,Q.jsx)(G,{toolbar:(0,Q.jsx)(Tn,{action:t.action,actorType:t.actorType,onChange:a},`${t.action??``}|${t.actorType??``}`),footer:(0,Q.jsx)(we,{onFirst:n,onPrevious:r,onNext:s?()=>i(s):void 0}),children:(0,Q.jsx)(J,{query:o,loadingRows:8,isEmpty:e=>e.items.length===0&&t.cursor===void 0,empty:(0,Q.jsx)(v,{size:`panel`,icon:Ve,title:e(`audit.empty`)}),children:e=>(0,Q.jsx)(On,{events:e.items})})})]})},An={admin:Vt,delivery:Ht},jn={admin:[...Vt,...Ut],delivery:Ht},Mn=[...jn.admin,...jn.delivery],Nn={read:`roles.actions.read`,readDrafts:`roles.actions.readDrafts`,create:`roles.actions.create`,update:`roles.actions.update`,delete:`roles.actions.delete`,publish:`roles.actions.publish`,schemaManage:`roles.actions.schemaManage`,"schema.create":`roles.actions.schemaCreate`,"users.manage":`roles.actions.usersManage`,"roles.manage":`roles.actions.rolesManage`,"tokens.manage":`roles.actions.tokensManage`,"audit.read":`roles.actions.auditRead`,"sites.manage":`roles.actions.sitesManage`,"media.read":`roles.actions.mediaRead`,"media.write":`roles.actions.mediaWrite`,"media.manage":`roles.actions.mediaManage`,"publishing.manage":`roles.actions.publishingManage`,"webhooks.manage":`roles.actions.webhooksManage`,"deployments.manage":`roles.actions.deploymentsManage`,"deployments.trigger":`roles.actions.deploymentsTrigger`,"changes.manage":`roles.actions.changesManage`,"changes.ship":`roles.actions.changesShip`,"site.settings":`roles.actions.siteSettings`},Pn=[`admin`,`delivery`],Fn=/^[a-z][a-z0-9-]{0,62}$/,In=B({key:q().trim().regex(Fn,`validation.roleKey`),name:F(),description:q().trim(),kind:mt([`admin`,`delivery`]),actions:ht(pt(e=>Mn.includes(e)))}),Ln=e=>e.modelId===null&&e.condition===null&&e.fieldIds===null,Rn=e=>({key:e?.key??``,name:e?.name??``,description:e?.description??``,kind:e?.kind??`admin`,actions:(e?.permissions??[]).filter(Ln).map(e=>e.action)}),zn=e=>({action:e,modelId:null,condition:null,fieldIds:null}),Bn=(e,t)=>t.filter(t=>jn[e].includes(t)).map(zn),Vn=(e,t,n)=>{let r=Pt(),i=Lt(),a=L({resolver:I(In),defaultValues:Rn(t)}),{reset:o}=a;(0,$.useEffect)(()=>{e&&o(Rn(t))},[e,t,o]);let s=a.handleSubmit(async({key:e,name:a,description:o,kind:s,actions:c})=>{if(t){let e=t.permissions.filter(e=>!Ln(e));if(!(await R(i.mutateAsync({id:t.id,input:{expectedVersion:t.version,name:a,description:o,permissions:[...e,...Bn(s,c)]}}))).ok)return;T.success(E.t(`roles.saved`))}else{if(!(await R(r.mutateAsync({key:e,name:a,description:o,kind:s,permissions:Bn(s,c)}))).ok)return;T.success(E.t(`roles.created`))}n()}),c=t?i:r;return{form:a,onSubmit:s,pending:c.isPending,error:c.error}},Hn={admin:`roles.kindAdmin`,delivery:`roles.kindDelivery`},Un={readDrafts:`roles.actions.readDraftsHint`},Wn=({open:e,onOpenChange:t,role:n})=>{let{t:r}=b(),{form:i,onSubmit:a,pending:o,error:s}=Vn(e,n,()=>t(!1)),c=n!==void 0,l=i.watch(`kind`);return(0,Q.jsxs)(X,{open:e,onOpenChange:t,size:`md`,title:r(c?`roles.editTitle`:`roles.createTitle`),dirty:i.formState.isDirty,pending:o,submitLabel:r(c?`common.saveChanges`:`common.create`),pendingLabel:r(`common.saving`),onSubmit:e=>void a(e),children:[(0,Q.jsx)(P,{control:i.control,name:`name`,label:r(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(P,{control:i.control,name:`key`,label:r(`roles.key`),hint:r(`roles.keyHint`),autoComplete:`off`,spellCheck:!1,className:`font-mono`,disabled:c}),(0,Q.jsx)(Ct,{control:i.control,name:`description`,label:r(`roles.roleDescription`),rows:2}),(0,Q.jsx)(wt,{control:i.control,name:`kind`,label:r(`roles.kind`),hint:r(`roles.kindHint`),options:Pn.map(e=>({value:e,label:r(Hn[e])})),disabled:c}),(0,Q.jsx)(w,{control:i.control,name:`actions`,legend:r(`roles.contentPermissions`),options:An[l].map(e=>{let t=Un[e];return{value:e,label:r(Nn[e]),...t?{hint:r(t)}:{}}})}),l===`admin`?(0,Q.jsx)(w,{control:i.control,name:`actions`,legend:r(`roles.instancePermissions`),options:Ut.map(e=>({value:e,label:r(Nn[e])}))}):null,(0,Q.jsx)(O,{error:s})]})},Gn=({roles:e,onEdit:t,onDelete:n})=>{let{t:r}=b();return(0,Q.jsx)(G,{children:(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:r(`roles.name`)}),(0,Q.jsx)(V,{children:r(`roles.key`)}),(0,Q.jsx)(V,{children:r(`roles.kind`)}),(0,Q.jsx)(V,{children:r(`roles.permissions`)}),(0,Q.jsx)(V,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:r(`common.actions`)})})]})}),(0,Q.jsx)(H,{children:e.map(e=>(0,Q.jsxs)(U,{children:[(0,Q.jsxs)(W,{className:`max-w-xs`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(se,{children:e.name}),(0,Q.jsx)(y,{variant:e.isSystem?`secondary`:`outline`,children:e.isSystem?r(`roles.builtIn`):r(`roles.custom`)})]}),e.description?(0,Q.jsx)(`span`,{className:`block truncate text-meta whitespace-normal text-muted-foreground`,children:e.description}):null]}),(0,Q.jsx)(W,{className:`font-mono text-xs`,children:e.key}),(0,Q.jsx)(W,{children:e.kind===`admin`?r(`roles.kindAdmin`):r(`roles.kindDelivery`)}),(0,Q.jsx)(W,{children:r(`roles.permissionsCount`,{count:e.permissions.length})}),(0,Q.jsx)(W,{className:`text-right`,children:e.isSystem?null:(0,Q.jsxs)(ze,{children:[(0,Q.jsx)(Le,{asChild:!0,children:(0,Q.jsx)(D,{variant:`ghost`,size:`icon-sm`,"aria-label":`${r(`common.actions`)}: ${e.name}`,children:(0,Q.jsx)(Pe,{"aria-hidden":`true`})})}),(0,Q.jsxs)(Re,{align:`end`,children:[(0,Q.jsxs)(M,{onSelect:()=>t(e),children:[(0,Q.jsx)(Be,{"aria-hidden":`true`}),r(`common.edit`)]}),(0,Q.jsxs)(M,{variant:`destructive`,onSelect:()=>n(e),children:[(0,Q.jsx)(ke,{"aria-hidden":`true`}),r(`common.delete`)]})]})]})})]},e.id))})]})})},Kn=()=>{let{t:e}=b();return(0,Q.jsx)(Bt,{label:e(`roles.sections`),tabs:[{to:`/network/roles`,label:e(`roles.tabAdmin`)},{to:`/network/roles/app`,label:e(`roles.tabApp`)}]})},qn=()=>{let{t:e}=b(),t=Ft(),n=It(),r=zt(),[i,a]=(0,$.useState)({open:!1,role:void 0});return(0,Q.jsxs)(g,{width:`full`,children:[(0,Q.jsx)(_,{title:e(`roles.title`),tabs:(0,Q.jsx)(Kn,{}),actions:(0,Q.jsxs)(D,{onClick:()=>a({open:!0,role:void 0}),children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),e(`roles.create`)]})}),(0,Q.jsx)(J,{query:t,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:Xe,title:e(`roles.empty`)}),children:e=>(0,Q.jsx)(Gn,{roles:e,onEdit:e=>a({open:!0,role:e}),onDelete:e=>r.ask(e)})}),(0,Q.jsx)(Wn,{open:i.open,onOpenChange:e=>a(t=>({...t,open:e})),role:i.role}),(0,Q.jsx)(Oe,{open:r.open,onOpenChange:r.onOpenChange,title:e(`roles.deleteTitle`,{name:r.target?.name??``}),description:e(`roles.deleteDescription`),confirmLabel:e(`common.delete`),destructive:!0,onConfirm:()=>{r.target&&n.mutate(r.target.id,{onSuccess:()=>T.success(e(`roles.deleted`))})}})]})},Jn=B({key:q().trim().regex(Fn,`validation.roleKey`),name:F(),description:q().trim()}),Yn={key:``,name:``,description:``},Xn=(e,t)=>{let n=Ke(),r=L({resolver:I(Jn),defaultValues:Yn}),{reset:i}=r;return(0,$.useEffect)(()=>{e&&i(Yn)},[e,i]),{form:r,onSubmit:r.handleSubmit(async e=>{let r=await R(n.mutateAsync({...e,permissions:[]}));r.ok&&(T.success(E.t(`appRoles.created`)),t(r.value))}),createAppRole:n}},Zn=({open:e,onOpenChange:t,onCreated:n})=>{let{t:r}=b(),{form:i,onSubmit:a,createAppRole:o}=Xn(e,n);return(0,Q.jsxs)(X,{open:e,onOpenChange:t,size:`md`,title:r(`appRoles.createTitle`),dirty:i.formState.isDirty,pending:o.isPending,submitLabel:r(`common.create`),pendingLabel:r(`common.saving`),onSubmit:e=>void a(e),children:[(0,Q.jsx)(P,{control:i.control,name:`name`,label:r(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(P,{control:i.control,name:`key`,label:r(`roles.key`),hint:r(`roles.keyHint`),autoComplete:`off`,spellCheck:!1,className:`font-mono`}),(0,Q.jsx)(Ct,{control:i.control,name:`description`,label:r(`roles.roleDescription`),rows:2}),(0,Q.jsx)(O,{error:o.error})]})},Qn=e=>e.permissions.some(e=>e.action===`read`&&e.modelId===null&&e.condition===null),$n=()=>{let e=Ye();return{grantReadAll:t=>e.mutate({id:t.id,input:{expectedVersion:t.version,permissions:[...t.permissions.filter(e=>e.action!==`read`||e.modelId!==null),{action:`read`,modelId:null,condition:null,fieldIds:null}]}},{onSuccess:()=>T.success(E.t(`appRoles.readAllGranted`,{name:t.name})),onError:e=>T.error(de(e))}),pendingRoleId:e.isPending?e.variables?.id:void 0}},er=({role:e,onDelete:t})=>{let{t:n}=b(),[r,i]=(0,$.useState)(!1);return(0,Q.jsxs)(ze,{children:[(0,Q.jsx)(k,{tone:`danger`,open:r,onOpenChange:i,title:n(`roles.deleteTitle`,{name:e.name}),description:n(`appRoles.deleteDescription`),confirmLabel:n(`common.delete`),onConfirm:()=>t(e),children:(0,Q.jsx)(Le,{asChild:!0,children:(0,Q.jsx)(D,{variant:`ghost`,size:`icon-sm`,"aria-label":`${n(`common.actions`)}: ${e.name}`,children:(0,Q.jsx)(Pe,{"aria-hidden":`true`})})})}),(0,Q.jsxs)(Re,{align:`end`,onCloseAutoFocus:e=>r&&e.preventDefault(),children:[(0,Q.jsx)(M,{asChild:!0,children:(0,Q.jsxs)(h,{to:`/network/roles/app/$roleId`,params:{roleId:e.id},children:[(0,Q.jsx)(qt,{"aria-hidden":`true`}),n(`appRoles.editPermissions`)]})}),e.isSystem?null:(0,Q.jsxs)(M,{variant:`destructive`,onSelect:()=>i(!0),children:[(0,Q.jsx)(ke,{"aria-hidden":`true`}),n(`common.delete`)]})]})]})},tr={public:`appRoles.holdersPublic`,authenticated:`appRoles.holdersAuthenticated`},nr=e=>Object.hasOwn(tr,e)?tr[e]:void 0,rr=({roles:e,onDelete:t,onGrantReadAll:n,pendingRoleId:r})=>{let{t:i}=b();return(0,Q.jsx)(G,{children:(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:i(`roles.name`)}),(0,Q.jsx)(V,{children:i(`roles.key`)}),(0,Q.jsx)(V,{children:i(`appRoles.heldBy`)}),(0,Q.jsx)(V,{children:i(`roles.permissions`)}),(0,Q.jsx)(V,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:i(`common.actions`)})})]})}),(0,Q.jsx)(H,{children:e.map(e=>{let a=e.isSystem?nr(e.key):void 0;return(0,Q.jsxs)(U,{children:[(0,Q.jsxs)(W,{className:`max-w-xs`,children:[(0,Q.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(se,{asChild:!0,children:(0,Q.jsx)(h,{to:`/network/roles/app/$roleId`,params:{roleId:e.id},children:e.name})}),(0,Q.jsx)(y,{variant:e.isSystem?`secondary`:`outline`,children:e.isSystem?i(`roles.builtIn`):i(`roles.custom`)})]}),e.description?(0,Q.jsx)(`span`,{className:`block text-meta whitespace-normal text-muted-foreground`,children:e.description}):null]}),(0,Q.jsx)(W,{className:`font-mono text-xs`,children:e.key}),(0,Q.jsx)(W,{children:a?i(a):i(`appRoles.userCount`,{count:e.userCount})}),(0,Q.jsx)(W,{children:(0,Q.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2`,children:[i(`roles.permissionsCount`,{count:e.permissions.length}),e.isSystem&&!Qn(e)?(0,Q.jsxs)(D,{variant:`outline`,size:`sm`,disabled:r===e.id,"aria-label":`${i(`appRoles.grantReadAll`)}: ${e.name}`,onClick:()=>n(e),children:[(0,Q.jsx)(Gt,{"aria-hidden":`true`}),i(`appRoles.grantReadAll`)]}):null]})}),(0,Q.jsx)(W,{className:`text-right`,children:(0,Q.jsx)(er,{role:e,onDelete:t})})]},e.id)})})]})})},ir=()=>{let{t:e}=b(),t=p(),n=qe(),r=He(),[i,a]=(0,$.useState)(!1),{grantReadAll:o,pendingRoleId:s}=$n(),c=async t=>{await r.mutateAsync(t.id),T.success(e(`roles.deleted`))};return(0,Q.jsxs)(g,{width:`full`,children:[(0,Q.jsx)(_,{title:e(`appRoles.title`),tabs:(0,Q.jsx)(Kn,{}),actions:(0,Q.jsxs)(D,{onClick:()=>a(!0),children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),e(`appRoles.create`)]})}),(0,Q.jsx)(J,{query:n,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:Xe,title:e(`roles.empty`)}),children:t=>(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[t.some(e=>e.isSystem&&!Qn(e))?(0,Q.jsxs)(Te,{variant:`info`,role:`note`,children:[(0,Q.jsx)(ue,{"aria-hidden":`true`}),(0,Q.jsx)(De,{children:e(`appRoles.denyByDefault`)})]}):null,(0,Q.jsx)(rr,{roles:t,onDelete:c,onGrantReadAll:o,pendingRoleId:s})]})}),(0,Q.jsx)(Zn,{open:i,onOpenChange:a,onCreated:e=>{a(!1),t({to:`/network/roles/app/$roleId`,params:{roleId:e.id}})}})]})},ar=new Set([`read`,`update`,`delete`,`publish`]),or=new Set([`read`,`create`,`update`]),sr={read:`appRoles.actions.read`,create:`appRoles.actions.create`,update:`appRoles.actions.update`,delete:`appRoles.actions.delete`,publish:`appRoles.actions.publish`},cr=e=>{let t={};for(let n of e){let e=n.modelId??`*`;t[e]={...t[e],[n.action]:{ownOnly:n.condition===`ownedByPrincipal`,fieldIds:n.fieldIds===null?null:[...n.fieldIds].sort()}}}return t},lr=e=>Object.keys(e).sort((e,t)=>e===`*`?-1:t===`*`?1:e.localeCompare(t)).flatMap(t=>Z.flatMap(n=>{let r=e[t]?.[n];return r?[{action:n,modelId:t===`*`?null:t,condition:r.ownOnly&&ar.has(n)?`ownedByPrincipal`:null,fieldIds:or.has(n)?r.fieldIds:null}]:[]})),ur=(e,t,n,r)=>{let i={...e[t]};return r?i[n]=r:delete i[n],{...e,[t]:i}},dr=(e,t,n,r)=>ur(e,t,n,r?e[t]?.[n]??{ownOnly:!1,fieldIds:null}:void 0),fr=(e,t,n,r)=>{let i=e[t]?.[n];return i?ur(e,t,n,{...i,...r}):e},pr=(e,t)=>Z.some(n=>t?.[n]!==void 0&&(ar.has(n)||e!==`*`&&or.has(n))),mr=(e,t,n,r)=>t.reduce((e,t)=>dr(e,t,n,r),e),hr=(e,t,n)=>{let r=t.filter(t=>e[t]?.[n]!==void 0).length;return r===0?!1:r===t.length||`indeterminate`},gr=B({name:F(),description:q().trim()}),_r=e=>{let t=Ye(),n=L({resolver:I(gr),defaultValues:{name:e.name,description:e.description}}),[r,i]=(0,$.useState)(()=>cr(e.permissions)),a=(0,$.useMemo)(()=>JSON.stringify(lr(cr(e.permissions))),[e.permissions]),o=(0,$.useMemo)(()=>lr(r),[r]),s=JSON.stringify(o)!==a,c=!e.isSystem&&n.formState.isDirty,l=n.handleSubmit(async n=>{(await R(t.mutateAsync({id:e.id,input:{expectedVersion:e.version,...c?n:{},...s?{permissions:o}:{}}}))).ok&&T.success(E.t(`roles.saved`))});return{form:n,matrix:r,setMatrix:i,dirty:s||c,onSubmit:l,pending:t.isPending,error:t.error}},vr=`all`,yr=`selected`,br=({id:e,rowKey:t,fields:n,grants:r,onChange:i})=>{let{t:a}=b(),o=(n??[]).filter(e=>!e.deprecated);return(0,Q.jsx)(`div`,{id:e,className:`grid gap-6 border-t bg-muted/40 px-5 py-4 md:grid-cols-2`,children:Z.map(n=>{let s=r[n],c=ar.has(n),l=t!==`*`&&or.has(n);if(!s||!c&&!l)return null;let u=`${e}-${n}`;return(0,Q.jsxs)(je,{className:`gap-3`,children:[(0,Q.jsx)(Me,{variant:`label`,children:a(sr[n])}),c?(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(A,{htmlFor:`${u}-own`,children:a(`appRoles.ownOnly`)}),(0,Q.jsx)(st,{id:`${u}-own`,checked:s.ownOnly,onCheckedChange:e=>i(n,{ownOnly:e})})]}):null,l?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(ot,{"aria-label":a(`appRoles.fieldScope`),value:s.fieldIds===null?vr:yr,onValueChange:e=>i(n,{fieldIds:e===vr?null:o.filter(e=>e.public).map(e=>e.id)}),children:[(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(at,{id:`${u}-all`,value:vr}),(0,Q.jsx)(A,{htmlFor:`${u}-all`,className:`font-normal`,children:a(`appRoles.allPublicFields`)})]}),(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(at,{id:`${u}-selected`,value:yr}),(0,Q.jsx)(A,{htmlFor:`${u}-selected`,className:`font-normal`,children:a(`appRoles.selectedFields`)})]})]}),s.fieldIds===null?null:(0,Q.jsx)(`div`,{className:`grid gap-2 pl-6 sm:grid-cols-2`,children:o.map(e=>{let t=s.fieldIds??[],r=`${u}-field-${e.id}`;return(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(Ee,{id:r,checked:t.includes(e.id),onCheckedChange:r=>i(n,{fieldIds:r===!0?[...t,e.id].sort():t.filter(t=>t!==e.id)})}),(0,Q.jsxs)(A,{htmlFor:r,className:`font-normal`,children:[e.label,e.public?null:(0,Q.jsx)(y,{variant:`secondary`,children:a(`appRoles.notPublic`)})]})]},e.id)})})]}):null]},n)})})},xr=({label:e,detail:t,grants:n,optionsId:r,expanded:i,canExpand:a,onToggle:o,onToggleExpanded:s})=>{let{t:c}=b();return(0,Q.jsxs)(U,{className:`hover:bg-transparent has-aria-expanded:bg-transparent`,children:[(0,Q.jsx)(W,{className:`sticky left-0 z-10 h-9 bg-card py-0`,children:(0,Q.jsxs)(`span`,{className:`flex items-baseline gap-2`,children:[(0,Q.jsx)(`span`,{className:`font-semibold`,children:e}),(0,Q.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:t})]})}),Z.map(t=>(0,Q.jsx)(W,{className:`h-9 py-0 text-center`,children:(0,Q.jsx)(Ee,{checked:n[t]!==void 0,onCheckedChange:e=>o(t,e===!0),"aria-label":`${c(sr[t])}: ${e}`,className:`align-middle`})},t)),(0,Q.jsx)(W,{className:`h-9 py-0 text-right`,children:(0,Q.jsxs)(D,{type:`button`,variant:`ghost`,size:`xs`,disabled:!a,"aria-expanded":i,"aria-controls":i?r:void 0,"aria-label":`${c(`appRoles.options`)}: ${e}`,onClick:s,children:[c(`appRoles.options`),(0,Q.jsx)(Se,{"aria-hidden":`true`,className:rt(`transition-transform`,i&&`rotate-180`)})]})})]})},Sr=({matrix:e,models:t,onChange:n})=>{let{t:r}=b(),[i,a]=(0,$.useState)(new Set),o=e=>a(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n}),s=[{key:`*`,label:r(`appRoles.allModels`),detail:r(`appRoles.allModelsHint`),fields:void 0},...t.map(e=>e.definition).filter(le).map(e=>({key:e.id,label:e.label,detail:e.apiKey,fields:e.fields}))],c=s.map(e=>e.key);return(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{className:`sticky left-0 z-10 min-w-60 bg-muted`,children:r(`appRoles.model`)}),Z.map(t=>{let i=r(sr[t]);return(0,Q.jsx)(V,{className:`w-24 bg-muted`,children:(0,Q.jsxs)(`span`,{className:`flex items-center justify-center gap-2`,children:[(0,Q.jsx)(Ee,{checked:hr(e,c,t),onCheckedChange:r=>n(mr(e,c,t,r===!0)),"aria-label":r(`appRoles.everyRow`,{action:i})}),i]})},t)}),(0,Q.jsx)(V,{className:`bg-muted`,children:(0,Q.jsx)(`span`,{className:`sr-only`,children:r(`appRoles.options`)})})]})}),(0,Q.jsx)(H,{children:s.map(t=>{let r=e[t.key]??{},a=pr(t.key,r),s=a&&i.has(t.key),c=`app-role-options-${t.key===`*`?`all`:t.key}`;return(0,Q.jsxs)($.Fragment,{children:[(0,Q.jsx)(xr,{label:t.label,detail:t.detail,grants:r,optionsId:c,expanded:s,canExpand:a,onToggle:(r,i)=>n(dr(e,t.key,r,i)),onToggleExpanded:()=>o(t.key)}),s?(0,Q.jsx)(U,{className:`hover:bg-transparent`,children:(0,Q.jsx)(W,{colSpan:Z.length+2,className:`h-auto p-0 whitespace-normal`,children:(0,Q.jsx)(br,{id:c,rowKey:t.key,fields:t.fields,grants:r,onChange:(r,i)=>n(fr(e,t.key,r,i))})})}):null]},t.key)})})]})},Cr={public:`appRoles.publicExplained`,authenticated:`appRoles.authenticatedExplained`},wr=e=>Object.hasOwn(Cr,e)?Cr[e]:void 0,Tr=({role:e,models:t})=>{let{t:n}=b(),r=_r(e),i=e.isSystem?wr(e.key):void 0,a=[{label:n(`roles.title`),link:f({to:`/network/roles`})},{label:n(`appRoles.title`),link:f({to:`/network/roles/app`})}];return(0,Q.jsxs)(`form`,{noValidate:!0,className:`space-y-6`,onSubmit:e=>void r.onSubmit(e),children:[(0,Q.jsx)(_,{sticky:!0,breadcrumb:a,title:e.name,badge:e.isSystem?(0,Q.jsx)(y,{variant:`secondary`,children:n(`roles.builtIn`)}):null,meta:i?n(i):e.description||void 0,actions:(0,Q.jsx)(te,{pending:r.pending,pendingLabel:n(`common.saving`),disabled:!r.dirty,children:n(`common.saveChanges`)})}),e.isSystem?null:(0,Q.jsx)(Y,{title:n(`appRoles.details`),children:(0,Q.jsxs)(Ae,{className:`max-w-xl`,children:[(0,Q.jsx)(P,{control:r.form.control,name:`name`,label:n(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(Ct,{control:r.form.control,name:`description`,label:n(`roles.roleDescription`),rows:2})]})}),(0,Q.jsx)(Y,{title:n(`roles.permissions`),description:n(`appRoles.permissionsHint`),flush:!0,children:(0,Q.jsx)(Sr,{matrix:r.matrix,models:t,onChange:r.setMatrix})}),(0,Q.jsx)(O,{error:r.error}),(0,Q.jsx)(ce,{when:r.dirty&&!r.pending})]})},Er=()=>{let{roleId:e}=ne({from:`/app/network/roles/app/$roleId`}),t=Je(e),n=vt(`model`);return(0,Q.jsx)(g,{width:`full`,children:(0,Q.jsx)(J,{query:t,loadingRows:6,children:e=>(0,Q.jsx)(J,{query:n,loadingRows:6,children:t=>(0,Q.jsx)(Tr,{role:e,models:t},`${e.id}:${e.version}`)})})})},Dr=()=>{let{t:e}=b(),t=m().data?.emailDelivery,n=At(),[r,i]=(0,$.useState)(void 0),a=async({id:e,email:t})=>{let r=await n.mutateAsync(e);i({...r,email:t})};return{revealed:r,emailDelivery:t,reveal:a,announceInvitation:async n=>{if(t===`console`){await a(n);return}T.success(e(`users.invited`,{email:n.email}),{action:{label:e(`users.copyLink`),onClick:()=>void R(a(n))}})},dismiss:()=>i(void 0),keepFocusOnReveal:e=>{r&&e.preventDefault()}}},Or=({link:e,emailDelivery:t,onDismiss:n})=>{let{t:r}=b(),i=S(e.expiresAt);return(0,Q.jsx)(Rt,{title:r(`users.invitationLink.title`,{email:e.email}),description:r(t===`console`?`users.invitationLink.noEmailDescription`:`users.invitationLink.description`,{date:i}),label:r(`users.invitationLink.label`),secret:e.acceptUrl,dismissLabel:r(`users.invitationLink.done`),onDismiss:n})},kr=({assignments:e,roleNames:t,siteNames:n})=>{let{t:r}=b(),i=n.size>1;return e.map(({roleId:e,siteId:a})=>{let o=t.get(e)??r(`common.unknown`),s=a===null?r(`sites.switcher.allSites`):n.get(a)??r(`common.unknown`);return(0,Q.jsx)(y,{variant:`outline`,children:i?r(`users.access.badge`,{role:o,site:s}):o},`${e}:${a??``}`)})},Ar=({siteNames:e,onCopyLink:t,onCloseAutoFocus:n})=>{let{t:r}=b(),i=Mt(),{names:a}=Nt(),o=Tt();return i.isError?(0,Q.jsx)(ie,{error:i.error,onRetry:()=>void i.refetch()}):!i.data||i.data.length===0?null:(0,Q.jsx)(Y,{title:r(`users.invitationsTitle`),flush:!0,children:(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:r(`users.email`)}),(0,Q.jsx)(V,{children:r(`users.roles`)}),(0,Q.jsx)(V,{children:r(`users.invitationExpires`)}),(0,Q.jsx)(V,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:r(`common.actions`)})})]})}),(0,Q.jsx)(H,{children:i.data.map(i=>(0,Q.jsxs)(U,{children:[(0,Q.jsx)(W,{children:(0,Q.jsx)(se,{children:i.email})}),(0,Q.jsx)(W,{children:(0,Q.jsx)(`span`,{className:`flex flex-wrap gap-1`,children:(0,Q.jsx)(kr,{assignments:i.assignments,roleNames:a,siteNames:e})})}),(0,Q.jsx)(W,{title:S(i.expiresAt),children:x(i.expiresAt)}),(0,Q.jsx)(W,{children:(0,Q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,Q.jsx)(k,{tone:`default`,title:r(`users.invitationLink.confirmTitle`,{email:i.email}),description:r(`users.invitationLink.confirmDescription`),confirmLabel:r(`users.invitationLink.create`),onConfirm:()=>t(i),onCloseAutoFocus:n,trigger:(0,Q.jsxs)(D,{variant:`outline`,size:`sm`,"aria-label":`${r(`users.copyLink`)}: ${i.email}`,children:[(0,Q.jsx)(Ne,{"aria-hidden":`true`}),r(`users.copyLink`)]})}),(0,Q.jsx)(k,{tone:`danger`,title:r(`users.revokeInvitationTitle`,{email:i.email}),description:r(`users.revokeInvitationDescription`),confirmLabel:r(`common.revoke`),onConfirm:async()=>{await o.mutateAsync(i.id),T.success(r(`users.invitationRevoked`))},trigger:(0,Q.jsx)(D,{variant:`outline`,size:`sm`,"aria-label":`${r(`common.revoke`)}: ${i.email}`,children:r(`common.revoke`)})})]})})]},i.id))})]})})},jr=e=>e??`all`,Mr=(e,t)=>{let n=new Map;for(let{roleId:r,siteId:i}of e){let e=jr(i);(!n.has(e)||r===t)&&n.set(e,r)}return[...n].map(([e,t])=>({site:e,roleId:t}))},Nr=e=>e.map(({site:e,roleId:t})=>({roleId:t,siteId:e===`all`?null:e})),Pr=e=>ht(B({site:q().min(1),roleId:q().min(1,`validation.selectRole`)})).min(1).superRefine((t,n)=>{let r=new Set;t.forEach((t,i)=>{r.has(t.site)&&n.addIssue({code:`custom`,path:[i,`site`],message:`validation.siteTwice`}),r.add(t.site),e!==void 0&&t.roleId===e&&t.site!==`all`&&n.addIssue({code:`custom`,path:[i,`roleId`],message:`validation.ownerAllSites`})})}),Fr=(e,t,n)=>{let r=new Set(e.map(e=>e.site)),i=[`all`,...t].find(e=>!r.has(e));return i===void 0?void 0:{site:i,roleId:n}},Ir=({control:e,roleOptions:t,siteOptions:n,siteIds:r,multiSite:i,defaultRoleId:a})=>{let{t:o}=b(),{fields:s,append:c,remove:l}=dt({control:e,name:`rows`}),{errors:u}=ct({control:e,name:`rows`}),d=lt({control:e,name:`rows`}),f=(e,t)=>`rows.${e}.${t}`;if(!i)return(0,Q.jsx)(yt,{control:e,name:f(0,`roleId`),legend:o(`users.role`),options:t});let p=Fr(d??[],r,a??``),m=u.rows;return(0,Q.jsxs)(je,{children:[(0,Q.jsx)(Me,{variant:`label`,children:o(`users.access.title`)}),(0,Q.jsx)(`div`,{className:`space-y-3`,children:s.map((r,i)=>(0,Q.jsxs)(`fieldset`,{"aria-label":o(`users.access.row`,{n:i+1}),className:`grid grid-cols-[1fr_1fr_auto] items-start gap-3`,children:[(0,Q.jsx)(wt,{control:e,name:f(i,`site`),label:o(`users.access.site`),options:n}),(0,Q.jsx)(wt,{control:e,name:f(i,`roleId`),label:o(`users.role`),options:t}),(0,Q.jsx)(D,{type:`button`,variant:`ghost`,size:`icon`,className:`mt-7`,disabled:s.length===1,"aria-label":o(`users.access.remove`,{n:i+1}),onClick:()=>l(i),children:(0,Q.jsx)(ee,{"aria-hidden":`true`})})]},r.id))}),(0,Q.jsx)(ft,{message:m?.root?.message??m?.message}),(0,Q.jsx)(`div`,{children:(0,Q.jsxs)(D,{type:`button`,variant:`outline`,size:`sm`,disabled:!p,onClick:()=>p&&c(p),children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),o(`users.access.add`)]})})]})},Lr={owner:`owner`,editor:`editor`},Rr=({includeOwner:e,heldRoleIds:t=[]})=>{let n=Ft(),r=(n.data??[]).filter(e=>e.kind===`admin`),i=e=>e===Lr.owner;return{options:r.filter(n=>!i(n.key)||e||t.includes(n.id)).map(e=>({value:e.id,label:e.name,...e.description?{description:e.description}:{}})),editorRoleId:r.find(e=>e.key===Lr.editor)?.id,ownerRoleId:r.find(e=>i(e.key))?.id,isPending:n.isPending,error:n.error}},zr=({includeOwner:e,heldRoleIds:t})=>{let{t:n}=b(),r=Rr({includeOwner:e,...t?{heldRoleIds:t}:{}}),i=Qt(),a=(0,$.useMemo)(()=>[{value:`all`,label:n(`sites.switcher.allSites`)},...(i.data??[]).map(e=>({value:e.id,label:e.name}))],[i.data,n]),o=(0,$.useMemo)(()=>(i.data??[]).map(e=>e.id),[i.data]);return{roleOptions:r.options,siteOptions:a,siteIds:o,multiSite:o.length>1,editorRoleId:r.editorRoleId,ownerRoleId:r.ownerRoleId,error:r.error??i.error}},Br=e=>({email:``,rows:[{site:`all`,roleId:e}]}),Vr=({open:e,defaultRoleId:t,ownerRoleId:n,onInvited:r,onDone:i})=>{let a=Ot(),o=(0,$.useMemo)(()=>B({email:ut(),rows:Pr(n)}),[n]),s=L({resolver:I(o),defaultValues:Br(``)}),{reset:c}=s;return(0,$.useEffect)(()=>{e&&c(Br(t??``))},[e,t,c]),{form:s,onSubmit:s.handleSubmit(async({email:e,rows:n})=>{let o=await R(a.mutateAsync({email:e,assignments:Nr(n)}));o.ok&&(await R(r(o.value)),c(Br(t??``)),i())}),invite:a}},Hr=({open:e,onOpenChange:t,onInvited:n,onCloseAutoFocus:r})=>{let{t:i}=b(),a=zr({includeOwner:!1}),{form:o,onSubmit:s,invite:c}=Vr({open:e,defaultRoleId:a.editorRoleId,ownerRoleId:a.ownerRoleId,onInvited:n,onDone:()=>t(!1)});return(0,Q.jsxs)(X,{open:e,onOpenChange:t,size:`md`,title:i(`users.inviteTitle`),dirty:o.formState.isDirty,pending:o.formState.isSubmitting,submitLabel:i(`users.invite`),pendingLabel:i(`common.saving`),onSubmit:e=>void s(e),onCloseAutoFocus:r,children:[(0,Q.jsx)(P,{control:o.control,name:`email`,label:i(`users.email`),type:`email`,autoComplete:`off`}),(0,Q.jsx)(Ir,{control:o.control,roleOptions:a.roleOptions,siteOptions:a.siteOptions,siteIds:a.siteIds,multiSite:a.multiSite,defaultRoleId:a.editorRoleId}),(0,Q.jsx)(O,{error:c.error??a.error})]})},Ur=(e,t,n,r)=>{let i=jt(),a=(0,$.useMemo)(()=>B({rows:Pr(n)}),[n]),o=L({resolver:I(a),defaultValues:{rows:[]}}),{reset:s}=o;return(0,$.useEffect)(()=>{e&&s({rows:Mr(t.assignments,n)})},[e,t.assignments,n,s]),{form:o,onSubmit:o.handleSubmit(async({rows:e})=>{(await R(i.mutateAsync({id:t.id,input:{assignments:Nr(e)}}))).ok&&(T.success(E.t(`users.rolesSaved`)),r())}),updateUser:i}},Wr=()=>m().data?.roles.some(e=>e.key===Lr.owner)??!1,Gr=({open:e,onOpenChange:t,user:n})=>{let{t:r}=b(),i=zr({includeOwner:Wr(),heldRoleIds:n.assignments.map(e=>e.roleId)}),{form:a,onSubmit:o,updateUser:s}=Ur(e,n,i.ownerRoleId,()=>t(!1));return(0,Q.jsxs)(X,{open:e,onOpenChange:t,size:`md`,title:r(`users.accessTitle`,{name:n.name||n.email}),dirty:a.formState.isDirty,pending:s.isPending,submitLabel:r(`common.saveChanges`),pendingLabel:r(`common.saving`),onSubmit:e=>void o(e),children:[(0,Q.jsx)(Ir,{control:a.control,roleOptions:i.roleOptions,siteOptions:i.siteOptions,siteIds:i.siteIds,multiSite:i.multiSite,defaultRoleId:i.editorRoleId}),(0,Q.jsx)(O,{error:s.error??i.error})]})},Kr=({user:e,roleNames:t,siteNames:n,isSelf:r,onToggleStatus:i,onRemove:a})=>{let{t:o}=b(),[s,c]=(0,$.useState)(void 0),[l,u]=(0,$.useState)(!1),d=e.name||e.email;return(0,Q.jsxs)(U,{children:[(0,Q.jsx)(W,{children:(0,Q.jsx)(Ge,{name:d,email:e.email,badge:r?(0,Q.jsx)(y,{variant:`secondary`,children:o(`users.you`)}):null})}),(0,Q.jsxs)(W,{children:[(0,Q.jsx)(`span`,{className:`flex flex-wrap gap-1`,children:(0,Q.jsx)(kr,{assignments:e.assignments,roleNames:t,siteNames:n})}),s===void 0?null:(0,Q.jsx)(Gr,{open:s,onOpenChange:c,user:e})]}),(0,Q.jsx)(W,{children:e.status===`active`?(0,Q.jsx)(re,{tone:`success`,label:o(`users.active`)}):(0,Q.jsx)(re,{tone:`muted`,label:o(`users.disabled`)})}),(0,Q.jsx)(W,{title:S(e.lastLoginAt)||void 0,children:e.lastLoginAt?x(e.lastLoginAt):o(`common.never`)}),(0,Q.jsx)(W,{className:`text-right`,children:r?null:(0,Q.jsxs)(ze,{children:[(0,Q.jsx)(k,{tone:`danger`,open:l,onOpenChange:u,title:o(`users.removeTitle`,{name:d}),description:o(`users.removeDescription`),confirmLabel:o(`common.remove`),onConfirm:()=>a(e),children:(0,Q.jsx)(Le,{asChild:!0,children:(0,Q.jsx)(D,{variant:`ghost`,size:`icon-sm`,"aria-label":`${o(`common.actions`)}: ${d}`,children:(0,Q.jsx)(Pe,{"aria-hidden":`true`})})})}),(0,Q.jsxs)(Re,{align:`end`,onCloseAutoFocus:e=>(l||s)&&e.preventDefault(),children:[(0,Q.jsxs)(M,{onSelect:()=>c(!0),children:[(0,Q.jsx)(Xe,{"aria-hidden":`true`}),o(`users.editAccess`)]}),(0,Q.jsxs)(M,{onSelect:()=>i(e),children:[e.status===`active`?(0,Q.jsx)(Ze,{"aria-hidden":`true`}):(0,Q.jsx)(Ue,{"aria-hidden":`true`}),e.status===`active`?o(`users.disable`):o(`users.enable`)]}),(0,Q.jsx)(Ie,{}),(0,Q.jsxs)(M,{variant:`destructive`,onSelect:()=>u(!0),children:[(0,Q.jsx)(ke,{"aria-hidden":`true`}),o(`common.remove`)]})]})]})})]})},qr=({users:e,roleNames:t,siteNames:n,currentUserId:r,onToggleStatus:i,onRemove:a})=>{let{t:o}=b();return(0,Q.jsx)(G,{children:(0,Q.jsxs)(K,{children:[(0,Q.jsx)(z,{children:(0,Q.jsxs)(U,{children:[(0,Q.jsx)(V,{children:o(`users.name`)}),(0,Q.jsx)(V,{children:o(`users.roles`)}),(0,Q.jsx)(V,{children:o(`users.status`)}),(0,Q.jsx)(V,{children:o(`users.lastLogin`)}),(0,Q.jsx)(V,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:o(`common.actions`)})})]})}),(0,Q.jsx)(H,{children:e.map(e=>(0,Q.jsx)(Kr,{user:e,roleNames:t,siteNames:n,isSelf:e.id===r,onToggleStatus:i,onRemove:a},e.id))})]})})},Jr={sites:C(`/app/network/sites`)({component:Sn}),site:C(`/app/network/sites/$siteId`)({component:gn}),contentTypes:C(`/app/network/content-types/`)({component:Jt}),newContentType:C(`/app/network/content-types/new`)({component:Xt}),users:C(`/app/network/users`)({component:()=>{let{t:e}=b(),{data:t}=m(),n=Et(),{names:r}=Nt(),{names:i}=en(),a=kt(),o=Dt(),[s,c]=(0,$.useState)(!1),l=Dr(),u=async t=>{await o.mutateAsync(t.id),T.success(e(`users.removed`))};return(0,Q.jsxs)(g,{children:[(0,Q.jsx)(_,{title:e(`users.title`),actions:(0,Q.jsxs)(D,{onClick:()=>c(!0),children:[(0,Q.jsx)(Qe,{"aria-hidden":`true`}),e(`users.invite`)]})}),(0,Q.jsx)(J,{query:n,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:nt,title:e(`users.empty`)}),children:n=>(0,Q.jsx)(qr,{users:n,roleNames:r,siteNames:i,currentUserId:t?.user.id,onToggleStatus:t=>a.mutate({id:t.id,status:t.status===`active`?`disabled`:`active`},{onSuccess:()=>T.success(e(`users.statusChanged`))}),onRemove:u})}),l.revealed?(0,Q.jsx)(Or,{link:l.revealed,emailDelivery:l.emailDelivery,onDismiss:l.dismiss},l.revealed.acceptUrl):null,(0,Q.jsx)(Ar,{siteNames:i,onCopyLink:l.reveal,onCloseAutoFocus:l.keepFocusOnReveal}),(0,Q.jsx)(Hr,{open:s,onOpenChange:c,onInvited:l.announceInvitation,onCloseAutoFocus:l.keepFocusOnReveal})]})}}),roles:C(`/app/network/roles`)({component:qn}),appRoles:C(`/app/network/roles/app`)({component:ir}),appRole:C(`/app/network/roles/app/$roleId`)({component:Er}),auditLog:C(`/app/network/audit-log`)({component:kn})};export{Jr as networkLazyRoutes};
2
- //# sourceMappingURL=network-Bolr2lmf.js.map