@shapio/cms 0.5.6 → 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 (361) hide show
  1. package/dist/admin/assets/{AssetTile-_qRYsivK.js → AssetTile-H0hABhB2.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-_qRYsivK.js.map → AssetTile-H0hABhB2.js.map} +1 -1
  3. package/dist/admin/assets/AssistError-1s3PuY0X.js +2 -0
  4. package/dist/admin/assets/{AssistError-CMXQWiQo.js.map → AssistError-1s3PuY0X.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-WIrbyv1a.js → BlockMenuItems-a8zXdfcF.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-WIrbyv1a.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-BYc1IVsQ.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-NMvrWgxT.js → CodeEditor-BLbJZE9v.js} +2 -2
  12. package/dist/admin/assets/{CodeEditor-NMvrWgxT.js.map → CodeEditor-BLbJZE9v.js.map} +1 -1
  13. package/dist/admin/assets/{CopyButton-B0RuxynJ.js → CopyButton-BOtR_h1H.js} +2 -2
  14. package/dist/admin/assets/{CopyButton-B0RuxynJ.js.map → CopyButton-BOtR_h1H.js.map} +1 -1
  15. package/dist/admin/assets/{CursorPager-CQZsKNxR.js → CursorPager-DwLW13ov.js} +2 -2
  16. package/dist/admin/assets/{CursorPager-CQZsKNxR.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-BYu2fOTb.js → FocalPoint-n-a_AXKN.js} +2 -2
  20. package/dist/admin/assets/{FocalPoint-BYu2fOTb.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-Bz8KERs1.js → FormCheckboxGroup-1fYisXrr.js} +2 -2
  24. package/dist/admin/assets/FormCheckboxGroup-1fYisXrr.js.map +1 -0
  25. package/dist/admin/assets/{FormRadioGroup-c-wyx7dq.js → FormRadioGroup-B0VZyb1t.js} +2 -2
  26. package/dist/admin/assets/{FormRadioGroup-c-wyx7dq.js.map → FormRadioGroup-B0VZyb1t.js.map} +1 -1
  27. package/dist/admin/assets/{FormSelectField-ijG9qPpb.js → FormSelectField-Br8bkwRF.js} +2 -2
  28. package/dist/admin/assets/{FormSelectField-ijG9qPpb.js.map → FormSelectField-Br8bkwRF.js.map} +1 -1
  29. package/dist/admin/assets/{FormSwitchField-Bp3hNpeP.js → FormSwitchField-d8G-YCSX.js} +2 -2
  30. package/dist/admin/assets/{FormSwitchField-Bp3hNpeP.js.map → FormSwitchField-d8G-YCSX.js.map} +1 -1
  31. package/dist/admin/assets/{FormTextareaField-BSKMqHcW.js → FormTextareaField-BSKNeTPW.js} +2 -2
  32. package/dist/admin/assets/{FormTextareaField-BSKMqHcW.js.map → FormTextareaField-BSKNeTPW.js.map} +1 -1
  33. package/dist/admin/assets/{HintedLabel-BrLH4NQW.js → HintedLabel-CiTDE112.js} +2 -2
  34. package/dist/admin/assets/{HintedLabel-BrLH4NQW.js.map → HintedLabel-CiTDE112.js.map} +1 -1
  35. package/dist/admin/assets/{InfoHint-Dyzyf59c.js → InfoHint-B3XcXtiN.js} +2 -2
  36. package/dist/admin/assets/{InfoHint-Dyzyf59c.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-Bixf1ygj.js → Match-Dc8bXsKo.js} +2 -2
  44. package/dist/admin/assets/{Match-Bixf1ygj.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--_vvV7dC.js → QueryView-KFtwko9F.js} +2 -2
  50. package/dist/admin/assets/{QueryView--_vvV7dC.js.map → QueryView-KFtwko9F.js.map} +1 -1
  51. package/dist/admin/assets/{RadioTile-BCp6auUz.js → RadioTile-CzfxWgHx.js} +2 -2
  52. package/dist/admin/assets/{RadioTile-BCp6auUz.js.map → RadioTile-CzfxWgHx.js.map} +1 -1
  53. package/dist/admin/assets/{RichTextField-fWNjndUc.js → RichTextField-BsBoOAP-.js} +5 -5
  54. package/dist/admin/assets/{RichTextField-fWNjndUc.js.map → RichTextField-BsBoOAP-.js.map} +1 -1
  55. package/dist/admin/assets/{RowTitle-B4CE8tt7.js → RowTitle-Cn5mAU58.js} +2 -2
  56. package/dist/admin/assets/{RowTitle-B4CE8tt7.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-71FTypoi.js → SharedGlyph-CA8tb7UH.js} +2 -2
  60. package/dist/admin/assets/{SharedGlyph-71FTypoi.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-B2HZ9UZu.js +2 -0
  64. package/dist/admin/assets/{Structure-Dk87778W.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-CxS8IR6m.js → SuggestAltButton-CqDLAuoa.js} +2 -2
  68. package/dist/admin/assets/{SuggestAltButton-CxS8IR6m.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-D7IbSpsP.js → UserAvatar-BItYDTyH.js} +2 -2
  76. package/dist/admin/assets/{UserAvatar-D7IbSpsP.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-vLiQczOd.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-CKGh8uwT.js → constants-miV4q1ur.js} +2 -2
  94. package/dist/admin/assets/{constants-CKGh8uwT.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-DzQ_0v36.js → contentTypes-CQsHL657.js} +2 -2
  100. package/dist/admin/assets/{contentTypes-DzQ_0v36.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-CVAnm22s.js → dropdown-menu-0dyAtBEd.js} +2 -2
  110. package/dist/admin/assets/{dropdown-menu-CVAnm22s.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-Bg-JRgsB.js → field-C6NmRYUN.js} +2 -2
  120. package/dist/admin/assets/{field-Bg-JRgsB.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-DQCI1nMN.js → fileRoute-Bm90K4UY.js} +2 -2
  124. package/dist/admin/assets/{fileRoute-DQCI1nMN.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-BrwwGWnv.js → labels-B2HIVxXg.js} +2 -2
  145. package/dist/admin/assets/{labels-BrwwGWnv.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-CpSDO3M7.js.map → publishing-DdmWXRaM.js.map} +1 -1
  166. package/dist/admin/assets/{radio-group-DQ3sC1ol.js → radio-group-BoN9R_3K.js} +2 -2
  167. package/dist/admin/assets/{radio-group-DQ3sC1ol.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-D4S2ceA0.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-Cl1LrzqH.js.map → sections-BfxPwK0u.js.map} +1 -1
  184. package/dist/admin/assets/{select-DjCAH45V.js → select-Bp8kO5Ko.js} +2 -2
  185. package/dist/admin/assets/{select-DjCAH45V.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-DJ4k3LtY.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-D4eOLKLY.js → skeleton-vXOCdnJv.js} +2 -2
  197. package/dist/admin/assets/{skeleton-D4eOLKLY.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-B2R13aVU.js → switch-B1xClhNG.js} +2 -2
  211. package/dist/admin/assets/{switch-B2R13aVU.js.map → switch-B1xClhNG.js.map} +1 -1
  212. package/dist/admin/assets/theme-65PB8uAu.js +2 -0
  213. package/dist/admin/assets/{theme-X-qeg74W.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-u2epXfJF.js → tooltip-CS_8cJu2.js} +2 -2
  219. package/dist/admin/assets/{tooltip-u2epXfJF.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-DaQHlL19.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-C23eOHQR.js.map → useMediaPickerDialog-xvQ8cofO.js.map} +1 -1
  230. package/dist/admin/assets/useMediaUploader-BVNTeSAU.js +2 -0
  231. package/dist/admin/assets/{useMediaUploader-CTViR0LX.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-Cg8TdO85.js → useResolvedScheme-CScQpr-P.js} +2 -2
  241. package/dist/admin/assets/{useResolvedScheme-Cg8TdO85.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-D5i60ErJ.js → zod-hUh5nXnX.js} +2 -2
  249. package/dist/admin/assets/{zod-D5i60ErJ.js.map → zod-hUh5nXnX.js.map} +1 -1
  250. package/dist/admin/index.html +59 -60
  251. package/dist/cli.js +10 -5696
  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 +23 -6
  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-CtPzkzf0.js → s3Adapter-U01iEAcK.js} +2 -2
  265. package/dist/{s3Adapter-CtPzkzf0.js.map → s3Adapter-U01iEAcK.js.map} +1 -1
  266. package/dist/{worker-DRCCGGjl.js → worker-jspgh10V.js} +5735 -3982
  267. package/dist/worker-jspgh10V.js.map +1 -0
  268. package/package.json +5 -5
  269. package/dist/admin/assets/AssistError-CMXQWiQo.js +0 -2
  270. package/dist/admin/assets/Body-BYc1IVsQ.js +0 -2
  271. package/dist/admin/assets/Builder-CwHpRhZN.js +0 -2
  272. package/dist/admin/assets/Builder-CwHpRhZN.js.map +0 -1
  273. package/dist/admin/assets/ConfirmDialog-Rd6WDt6q.js +0 -2
  274. package/dist/admin/assets/ConfirmDialog-Rd6WDt6q.js.map +0 -1
  275. package/dist/admin/assets/Form-CiZUsLPp.js +0 -2
  276. package/dist/admin/assets/Form-CiZUsLPp.js.map +0 -1
  277. package/dist/admin/assets/FormCheckboxGroup-Bz8KERs1.js.map +0 -1
  278. package/dist/admin/assets/InsertMenuItem-BvRDuXtd.js +0 -2
  279. package/dist/admin/assets/InsertMenuItem-BvRDuXtd.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-BhSqdWqh.js +0 -2
  283. package/dist/admin/assets/SecretReveal-BhSqdWqh.js.map +0 -1
  284. package/dist/admin/assets/StepList-CZJmwy9e.js +0 -2
  285. package/dist/admin/assets/StepList-CZJmwy9e.js.map +0 -1
  286. package/dist/admin/assets/Structure-Dk87778W.js +0 -2
  287. package/dist/admin/assets/Thumbnail-BwbCNpgQ.js +0 -2
  288. package/dist/admin/assets/Thumbnail-BwbCNpgQ.js.map +0 -1
  289. package/dist/admin/assets/UnsavedChangesGuard-C6nD55Fn.js +0 -2
  290. package/dist/admin/assets/UnsavedChangesGuard-C6nD55Fn.js.map +0 -1
  291. package/dist/admin/assets/auth-C4fHG9Iu.js +0 -2
  292. package/dist/admin/assets/auth-C4fHG9Iu.js.map +0 -1
  293. package/dist/admin/assets/badge-vLiQczOd.js +0 -2
  294. package/dist/admin/assets/changeSets-D5VevASj.js +0 -2
  295. package/dist/admin/assets/changeSets-D5VevASj.js.map +0 -1
  296. package/dist/admin/assets/chevron-left-CZXrLV99.js +0 -2
  297. package/dist/admin/assets/content-Cbavyq0x.js +0 -3
  298. package/dist/admin/assets/content-Cbavyq0x.js.map +0 -1
  299. package/dist/admin/assets/contentCounts-DknqJ4kh.js +0 -2
  300. package/dist/admin/assets/context-fImO9k99.js +0 -2
  301. package/dist/admin/assets/createLucideIcon-CqygG5K6.js +0 -2
  302. package/dist/admin/assets/createLucideIcon-CqygG5K6.js.map +0 -1
  303. package/dist/admin/assets/develop-BDqMOEql.js +0 -11
  304. package/dist/admin/assets/develop-BDqMOEql.js.map +0 -1
  305. package/dist/admin/assets/es2015-BKfbx3rz.js +0 -42
  306. package/dist/admin/assets/es2015-BKfbx3rz.js.map +0 -1
  307. package/dist/admin/assets/followPlural-D0bENI5E.js +0 -2
  308. package/dist/admin/assets/followPlural-D0bENI5E.js.map +0 -1
  309. package/dist/admin/assets/inbox-Dfy4YBZ2.js +0 -2
  310. package/dist/admin/assets/inbox-Dfy4YBZ2.js.map +0 -1
  311. package/dist/admin/assets/index-BEM45u2w.css +0 -2
  312. package/dist/admin/assets/index-M4TUI1dl.js +0 -4
  313. package/dist/admin/assets/index-M4TUI1dl.js.map +0 -1
  314. package/dist/admin/assets/loader-circle-C-9trZPI.js +0 -2
  315. package/dist/admin/assets/loader-circle-C-9trZPI.js.map +0 -1
  316. package/dist/admin/assets/locales-e7B5t6id.js +0 -2
  317. package/dist/admin/assets/media-DBdx-UmR.js +0 -2
  318. package/dist/admin/assets/media-DBdx-UmR.js.map +0 -1
  319. package/dist/admin/assets/media-VCJUbYzJ.js +0 -2
  320. package/dist/admin/assets/network-BpbMYp6D.js +0 -2
  321. package/dist/admin/assets/network-BpbMYp6D.js.map +0 -1
  322. package/dist/admin/assets/pencil-BVSFlU14.js +0 -2
  323. package/dist/admin/assets/pencil-BVSFlU14.js.map +0 -1
  324. package/dist/admin/assets/publishing-CpSDO3M7.js +0 -2
  325. package/dist/admin/assets/schedules-CBGpjEg7.js +0 -2
  326. package/dist/admin/assets/schema-D9BgCVzZ.js +0 -2
  327. package/dist/admin/assets/schema-D9BgCVzZ.js.map +0 -1
  328. package/dist/admin/assets/searchSchemas-D4S2ceA0.js +0 -2
  329. package/dist/admin/assets/sections-Cl1LrzqH.js +0 -2
  330. package/dist/admin/assets/seo-DJ4k3LtY.js +0 -2
  331. package/dist/admin/assets/settings-DRZ33PTg.js +0 -2
  332. package/dist/admin/assets/settings-DRZ33PTg.js.map +0 -1
  333. package/dist/admin/assets/settle-LRKtTN_e.js +0 -2
  334. package/dist/admin/assets/settle-LRKtTN_e.js.map +0 -1
  335. package/dist/admin/assets/shapes-BJe3IMuj.js +0 -6
  336. package/dist/admin/assets/shapes-BJe3IMuj.js.map +0 -1
  337. package/dist/admin/assets/snapshots-CT-zs6Up.js +0 -2
  338. package/dist/admin/assets/snapshots-CT-zs6Up.js.map +0 -1
  339. package/dist/admin/assets/src-DUpL-qwG.js +0 -7
  340. package/dist/admin/assets/src-DUpL-qwG.js.map +0 -1
  341. package/dist/admin/assets/store-DknnssoQ.js +0 -2
  342. package/dist/admin/assets/theme-X-qeg74W.js +0 -2
  343. package/dist/admin/assets/titles-CLh5ftA2.js +0 -2
  344. package/dist/admin/assets/titles-CLh5ftA2.js.map +0 -1
  345. package/dist/admin/assets/tokens-BlIDIMY9.js +0 -2
  346. package/dist/admin/assets/useAuditLabels-DWBpLOTB.js +0 -2
  347. package/dist/admin/assets/useAuditLabels-DWBpLOTB.js.map +0 -1
  348. package/dist/admin/assets/useContentSchema-DaQHlL19.js +0 -2
  349. package/dist/admin/assets/useCursorPager-Dc-9B67j.js +0 -2
  350. package/dist/admin/assets/useDiscardGuard-BVJGUCiH.js +0 -2
  351. package/dist/admin/assets/useDiscardGuard-BVJGUCiH.js.map +0 -1
  352. package/dist/admin/assets/useMediaPickerDialog-C23eOHQR.js +0 -2
  353. package/dist/admin/assets/useMediaUploader-CTViR0LX.js +0 -2
  354. package/dist/admin/assets/useNetworkPermission-CegwqQXR.js +0 -2
  355. package/dist/admin/assets/usePaletteItems-B3y2t7Ly.js +0 -2
  356. package/dist/admin/assets/usePlaces-CAXr-IO9.js +0 -2
  357. package/dist/admin/assets/useQueries-CX6eFr24.js +0 -2
  358. package/dist/admin/assets/users-CDoJRL24.js +0 -2
  359. package/dist/admin/assets/users-CDoJRL24.js.map +0 -1
  360. package/dist/config.js.map +0 -1
  361. package/dist/worker-DRCCGGjl.js.map +0 -1
@@ -0,0 +1,2 @@
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{at as r}from"./src-ndgTSYLX.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-BCnVhaDH.js";import{E as ee,S as te,g as ne}from"./auth-CQO4MBUj.js";import{A as re,O as p,_ as ie,a as ae,c as oe,d as se,f as ce,i as le,k as ue,l as de,m as fe,n as m,p as pe,r as h,t as me,u as he,v as ge}from"./badge-DNQwGXBl.js";import{m as _e,n as g,t as _}from"./createLucideIcon-CLmh7Go-.js";import{o as ve,t as ye}from"./RowTitle-Cn5mAU58.js";import{t as be}from"./fileRoute-Bm90K4UY.js";import{E as v,a as xe,i as Se,n as Ce}from"./InfoHint-B3XcXtiN.js";import{T as y,x as we}from"./es2015-BJge4oQL.js";import{c as Te,i as b,n as Ee,t as x}from"./skeleton-vXOCdnJv.js";import{a as S,o as De,r as Oe,s as ke,t as C}from"./InlineConfirm-BfsNH5S_.js";import{t as Ae}from"./external-link-CdG6kHfA.js";import{_ as w,a as je,n as Me,o as Ne,r as Pe,t as Fe}from"./field-C6NmRYUN.js";import{t as Ie}from"./FocalPoint-n-a_AXKN.js";import{t as Le}from"./ellipsis-F91991on.js";import{a as Re,c as T,i as ze,l as E,n as Be,o as Ve,r as D,s as He}from"./Thumbnail-mFfESZiW.js";import{t as O}from"./folder-plus-DIk0pWkP.js";import{t as Ue}from"./globe-DFr3Gd2w.js";import{a as We,c as Ge,i as Ke,n as qe,o as Je,r as k,t as Ye}from"./useMediaUploader-BVNTeSAU.js";import{t as A}from"./inbox-CySnQydm.js";import{a as j,l as Xe,p as Ze,r as Qe,t as $e}from"./dropdown-menu-0dyAtBEd.js";import{t as M}from"./cn-DVhJ55Mo.js";import{t as et}from"./switch-B1xClhNG.js";import{c as tt,n as nt,o as N,r as rt,t as it,u as P}from"./zod-hUh5nXnX.js";import{t as F}from"./settle-CFU6YpQ0.js";import{g as I,h as L,v as R}from"./table-zG68ipQc.js";import{t as at}from"./useDiscardGuard-CMMJgkI2.js";import{i as z,r as ot}from"./constants-DCtq_UOe.js";import{t as st}from"./SuggestAltButton-CqDLAuoa.js";import{t as ct}from"./Panel-Bcl09TtM.js";import{n as lt}from"./useContentSchema-DtYfhsd2.js";import{t as ut}from"./CopyButton-BOtR_h1H.js";import{t as B}from"./FormTextareaField-BSKNeTPW.js";import{t as dt}from"./entryLink-CVB-TdIn.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 ft=_(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 pt=_(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),mt=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}),ht=(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}}),gt=e=>{let t=o(),n=P({resolver:it(mt),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:ht(e,n)}));i.ok&&(r(K(i.value)),v.success(y.t(`media.details.saved`)))}),pending:t.isPending,error:t.error}},_t=e=>{let t=e instanceof _e?e.details:void 0;return typeof t?.usageCount==`number`?t.usageCount:0},vt=(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(!ne(n,`MEDIA_IN_USE`))throw n;let i=_t(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),yt=({asset:e,onDeleted:t})=>{let{t:n}=g(),{isOwner:r}=T(),i=vt(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)(Oe,{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})]})},bt=({asset:e,form:t,onSubmit:n,pending:r,error:i,readOnly:a})=>{let{t:o}=g(),s=tt({control:t.control,name:`focalPoint`}),c=D(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)(je,{children:[(0,q.jsx)(nt,{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)(st,{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)(Ie,{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)(ie,{pending:r,pendingLabel:o(`common.saving`),disabled:!t.formState.isDirty,children:o(`common.saveChanges`)})})]})})})},xt=e=>e.variants.find(e=>e.name===`w1280`&&e.url)?.url??e.variants.find(e=>e.name===`w640`&&e.url)?.url??e.url,St=({asset:e})=>{let{t}=g();return D(e.mimeType)?(0,q.jsx)(`img`,{src:xt(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)(ze,{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)(Ae,{"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]}),Ct=({usage:e,model:t})=>{let{t:n}=g();return(0,q.jsxs)(`li`,{className:`flex min-w-0 items-center gap-2 px-3 py-2`,children:[(0,q.jsx)(`div`,{className:`min-w-0 flex-1 space-y-0.5`,children:t?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(ye,{asChild:!0,className:`block truncate text-sm`,children:(0,q.jsx)(te,{...dt(t.apiKey,e.entryId,t.kind,{locale:e.locale}),children:e.title??n(`content.untitled`)})}),(0,q.jsx)(`p`,{className:`truncate text-meta text-muted-foreground`,children:t.label})]}):(0,q.jsx)(`p`,{className:`truncate text-sm text-muted-foreground`,children:n(`media.usage.hidden`)})}),(0,q.jsx)(me,{variant:`outline`,className:`font-mono`,children:e.locale}),(0,q.jsx)(m,{size:`sm`,tone:e.state===`published`?`success`:`neutral`,label:e.state===`published`?n(`media.usage.published`):n(`media.usage.draft`)})]})},wt=({assetId:e})=>{let{t}=g(),n=u(e),{schema:r}=lt();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.jsx)(Ct,{usage:e,model:r?.models.get(e.modelId)},`${e.entryId}:${e.fieldId}:${e.locale}:${e.state}`))})]})},Tt=({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)(Fe,{orientation:`horizontal`,children:[(0,q.jsxs)(Me,{children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[s?(0,q.jsx)(re,{"aria-hidden":`true`,className:`size-4 text-muted-foreground`}):(0,q.jsx)(Ue,{"aria-hidden":`true`,className:`size-4 text-muted-foreground`}),(0,q.jsx)(Ne,{htmlFor:`asset-private`,children:n(`media.visibility.privateLabel`)})]}),(0,q.jsx)(Pe,{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)(et,{id:`asset-private`,checked:s,disabled:!t||r.isPending,"aria-describedby":`asset-private-description`,onCheckedChange:()=>a(!0)})})]})},Et=({assetId:e,onClose:t,onReplace:n})=>{let{t:r}=g(),i=a(e),o=i.data,{canWrite:s,canManage:c}=T(),l=gt(o),{requestOpenChange:u,discardPrompt:d}=at({dirty:l.form.formState.isDirty,pending:l.pending,onOpenChange:e=>{e||(l.form.reset(),t())}}),f=o?Ve[o.status]:void 0;return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(oe,{open:e!==void 0,onOpenChange:u,children:(0,q.jsxs)(he,{size:`sm`,children:[(0,q.jsxs)(pe,{children:[(0,q.jsx)(fe,{className:`pr-8 break-all`,children:o?.filename??r(`media.details.title`)}),(0,q.jsx)(se,{className:`text-meta`,children:o?[Be(o.filename,o.mimeType),He(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)(ut,{value:o.url})})]}):null]}),(0,q.jsxs)(de,{className:`space-y-6`,children:[i.isPending?(0,q.jsx)(ge,{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)(St,{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)(De,{variant:`destructive`,children:[(0,q.jsx)(ue,{"aria-hidden":`true`}),(0,q.jsx)(ke,{children:o.processingError})]}):null]}),(0,q.jsx)(J,{title:r(`media.details.metadata`),children:(0,q.jsx)(bt,{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)(wt,{assetId:o.id})}),(0,q.jsx)(J,{title:r(`media.visibility.title`),children:(0,q.jsx)(Tt,{asset:o,canManage:c})}),(0,q.jsx)(J,{title:r(`media.variants.title`),children:(0,q.jsx)(Re,{asset:o})})]}):null]}),o&&(s||c)?(0,q.jsxs)(ce,{className:`flex-row flex-wrap justify-between`,children:[c?(0,q.jsx)(yt,{asset:o,onDeleted:t}):null,s?(0,q.jsx)(k,{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`),Dt=({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)(Je,{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)]),Ot=I({name:N().max(255,`validation.tooLong`)}),kt=(e,t)=>{let n=d(),r=f(),i=e.mode===`rename`?e.folder.name:``,a=P({resolver:it(Ot),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}=kt(e,()=>t(!0)),{setFocus:u}=a;(0,G.useEffect)(()=>{u(`name`,{shouldSelect:!0})},[u]);let d=a.formState.errors.name?.message??(l?we(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)(O,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,q.jsx)(E,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}),(0,q.jsx)(Ee,{...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)(Te,{"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)(rt,{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`,At=({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)($e,{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)(Ze,{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)(Le,{"aria-hidden":`true`})})})}),(0,q.jsxs)(Qe,{align:`end`,onCloseAutoFocus:e=>{i.current&&(i.current=!1,e.preventDefault())},children:[(0,q.jsxs)(j,{onSelect:a(()=>n.onCreate(e.id)),children:[(0,q.jsx)(O,{"aria-hidden":`true`}),r(`media.folders.newSubfolder`)]}),(0,q.jsxs)(j,{onSelect:a(()=>n.onRename(e)),children:[(0,q.jsx)(E,{"aria-hidden":`true`}),r(`media.folders.rename`)]}),t?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Xe,{}),(0,q.jsxs)(j,{variant:`destructive`,onSelect:a(()=>n.onDeleteOpenChange(e,!0)),children:[(0,q.jsx)(w,{"aria-hidden":`true`}),r(`common.delete`)]})]}):null]})]})},jt=({node:e,currentId:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s})=>{let c=e.id===t,l=c?pt: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)(At,{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)(jt,{node:e,currentId:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s},e.id))]}):null]})},Mt=({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})]}),Nt=({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)(ct,{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)(Mt,{current:t===void 0,icon:(0,q.jsx)(Ge,{"aria-hidden":`true`}),label:l(`media.folders.all`),onClick:()=>s(void 0)})}),(0,q.jsx)(`li`,{children:(0,q.jsx)(Mt,{current:t===z,icon:(0,q.jsx)(A,{"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)(jt,{node:e,currentId:t,canWrite:n,canManage:r,actions:i,editing:a,onEditDone:o,onSelect:s},e.id))]}):null]})})},Pt=()=>{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),[])}},Ft=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)},It=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(()=>Ft(r)?.focus())}}},Lt=()=>{let e=ve({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:ot[e.type]}:{}}}},Rt=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()},zt=(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())}}},Bt=({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})]})}),Vt=({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=zt(e,()=>{a(!1),t()});return(0,q.jsxs)(Ce,{open:i,onOpenChange:e=>{l.pending||(e&&l.reset(),a(e))},modal:!0,children:[(0,q.jsx)(xe,{asChild:!0,children:(0,q.jsxs)(b,{size:`sm`,variant:`outline`,children:[(0,q.jsx)(ft,{"aria-hidden":`true`}),n(`media.move.action`)]})}),(0,q.jsxs)(Se,{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:Rt,children:[(0,q.jsx)(Bt,{icon:(0,q.jsx)(A,{"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)(Bt,{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})]})]})},Ht=({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)(Vt,{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`)]})]})},Ut=be(`/app/media`)({component:()=>{let{t:e}=g(),{search:t,setSearch:n,assetQuery:r}=Lt(),i=c(),{canWrite:a,canManage:o}=T(),s=Ye(),l=Pt(),u=It(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)(ae,{width:`full`,children:[(0,q.jsx)(le,{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)(O,{"aria-hidden":`true`}),e(`media.folders.new`)]}),(0,q.jsx)(k,{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)(Nt,{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)(Dt,{enabled:a,onFiles:f,className:`min-h-96 min-w-0 space-y-4`,children:[(0,q.jsx)(qe,{onRetry:s.retry,onDismiss:s.dismiss}),(0,q.jsx)(Ke,{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)(Ht,{selected:l.selected,onClear:l.clear}):null,(0,q.jsx)(We,{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)(Et,{assetId:t.asset,onClose:()=>n({asset:void 0}),onReplace:(e,t)=>s.enqueue([t],{folderId:null,visibility:`public`,replaceAssetId:e})})]})}});export{Ut as mediaLazyRoute};
2
+ //# sourceMappingURL=media-CtbfNgc-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-CtbfNgc-.js","names":["__iconData","__iconData","z.object","z.string","z.number","zodResolver","i18next","useState","i18next","_Fragment","Trash2","_Fragment","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","Link","hasErrorCode","Lock","X","SubmitButton","Page","Sheet","SheetDescription","SheetFooter","PageHeader","TriangleAlert","SheetBody","SheetTitle","StatusChip","SheetHeader","ErrorState","Badge","SheetContent","LoadingState","ShapioApiError","useTranslation","createLucideIcon","useSearch","RowTitle","createLazyRoute","toast","PopoverTrigger","PopoverContent","Popover","instance","describeError","Check","Button","Input","Skeleton","FormError","Alert","ConfirmDialog","AlertDescription","InlineConfirm","ExternalLink","Trash","FieldGroup","FieldContent","FieldLabel","FieldDescription","Field","FocalPoint","Ellipsis","Variants","useMediaPermissions","FileIcon","Pencil","fileKindLabel","MEDIA_STATUS_DISPLAY","isImage","formatBytes","FolderPlus","Globe","Library","Images","Toolbar","UploadQueue","Upload","UploadButton","useMediaUploader","Inbox","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuTrigger","DropdownMenuContent","DropdownMenu","cn","Switch","useController","FormTextField","requiredText","FormFieldError","u","useForm","settle","object","number","string","useDiscardGuard","ROOT_FOLDER","MIME_FILTER_BY_TYPE","SuggestAltButton","Panel","useContentSchema","CopyButton","FormTextareaField","entryLink","__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","Row","model","usage","Usage","assetId","item","schema","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/Row/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 type { MediaUsage } from '@shapio/client';\nimport type { ModelDefinition } from '@shapio/schema';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Badge } from '@/components/ui/badge';\nimport { entryLink } from '@/features/Inbox/helpers/entryLink';\n\ntype RowProps = {\n usage: MediaUsage;\n /** The entry's model, when the admin may read it; without it the entry is named but not linked. */\n model: ModelDefinition | undefined;\n};\n\n/** One entry version using the asset: its title linking to the entry in that locale, the type, locale and state. */\nexport const Row = ({ usage, model }: RowProps) => {\n const { t } = useTranslation();\n return (\n <li className=\"flex min-w-0 items-center gap-2 px-3 py-2\">\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n {model ? (\n <>\n <RowTitle asChild className=\"block truncate text-sm\">\n <Link {...entryLink(model.apiKey, usage.entryId, model.kind, { locale: usage.locale })}>\n {usage.title ?? t('content.untitled')}\n </Link>\n </RowTitle>\n <p className=\"truncate text-meta text-muted-foreground\">{model.label}</p>\n </>\n ) : (\n <p className=\"truncate text-sm text-muted-foreground\">{t('media.usage.hidden')}</p>\n )}\n </div>\n <Badge variant=\"outline\" className=\"font-mono\">\n {usage.locale}\n </Badge>\n <StatusChip\n size=\"sm\"\n tone={usage.state === 'published' ? 'success' : 'neutral'}\n label={usage.state === 'published' ? t('media.usage.published') : t('media.usage.draft')}\n />\n </li>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useMediaUsage } from '@/api/media';\nimport { ErrorState } from '@/components/ErrorState';\nimport { Skeleton } from '@/components/ui/skeleton';\nimport { useContentSchema } from '@/features/Content/hooks/useContentSchema';\nimport { Row } from './Row';\n\ntype UsageProps = { assetId: string };\n\n/** \"Used in\": the entries whose draft or published version references the asset, by title and type. */\nexport const Usage = ({ assetId }: UsageProps) => {\n const { t } = useTranslation();\n const usage = useMediaUsage(assetId);\n const { schema } = useContentSchema();\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 <Row\n key={`${item.entryId}:${item.fieldId}:${item.locale}:${item.state}`}\n usage={item}\n model={schema?.models.get(item.modelId)}\n />\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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"}
@@ -0,0 +1,2 @@
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{Ht as r,Pt as i,Vt as a,_t as o,bn as s,ct as c,gt as l,ht as u,ut as d}from"./src-ndgTSYLX.js";import{E as f,S as p,u as m,w as h}from"./auth-CQO4MBUj.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-DNQwGXBl.js";import{n as b,t as ae}from"./createLucideIcon-CLmh7Go-.js";import{i as x,n as S,o as oe,t as se}from"./RowTitle-Cn5mAU58.js";import{t as C}from"./fileRoute-Bm90K4UY.js";import{t as w}from"./UnsavedChangesGuard-C8cDQGEA.js";import{t as ce}from"./FormCheckboxGroup-1fYisXrr.js";import{E as T,S as le}from"./InfoHint-B3XcXtiN.js";import{T as E,x as ue}from"./es2015-BJge4oQL.js";import{n as de,r as fe,t as pe}from"./Form-D_4fhOy0.js";import{u as me}from"./constants-miV4q1ur.js";import{t as he}from"./boxes-CAygw8zF.js";import{i as D,n as ge,r as _e}from"./skeleton-vXOCdnJv.js";import{a as ve,i as ye,n as be,r as xe,s as Se,t as Ce}from"./select-Bp8kO5Ko.js";import{t as we}from"./CursorPager-DwLW13ov.js";import{a as O,i as Te,o as Ee,r as De,s as Oe,t as k}from"./InlineConfirm-BfsNH5S_.js";import{_ as ke,a as A,c as Ae,o as je,s as Me,t as j}from"./field-C6NmRYUN.js";import{t as Ne}from"./link-Pyr2Y35S.js";import{t as Pe}from"./ellipsis-F91991on.js";import{t as Fe}from"./search-BdwIwOzC.js";import{a as M,l as Ie,p as Le,r as Re,t as ze}from"./dropdown-menu-0dyAtBEd.js";import{t as N}from"./plus-BoDtdLCo.js";import{t as Be}from"./scroll-text-PqeZm472.js";import{_ as Ve,b as He,d as Ue,f as We,g as Ge,h as Ke,p as qe,v as Je,x as Ye,y as Xe}from"./searchSchemas-DNjfDxmj.js";import{a as Ze,c as Qe,d as $e,f as et,i as tt,l as nt,n as rt,o as it,r as at,s as ot,t as st,u as ct}from"./users-2iJYwlJb.js";import{t as lt}from"./users-DM7CXUBJ.js";import{t as ut}from"./cn-DVhJ55Mo.js";import{t as dt}from"./UserAvatar-BItYDTyH.js";import{n as ft,t as pt}from"./radio-group-BoN9R_3K.js";import{t as mt}from"./switch-B1xClhNG.js";import{d as ht,f as P,i as gt,l as _t,n as F,o as I,r as vt,t as L,u as R}from"./zod-hUh5nXnX.js";import{t as z}from"./settle-CFU6YpQ0.js";import{a as B,f as yt,g as V,i as H,l as bt,n as U,o as W,r as G,s as K,t as q,u as xt,v as J}from"./table-zG68ipQc.js";import{t as St}from"./HintedLabel-CiTDE112.js";import{t as Ct}from"./SharedGlyph-CA8tb7UH.js";import{_ as wt,d as Tt}from"./schema-D-qo7XSF.js";import{t as Y}from"./QueryView-KFtwko9F.js";import{t as Et}from"./FormRadioGroup-B0VZyb1t.js";import{t as Dt}from"./useNetworkPermission-Cts98h9d.js";import{t as Ot}from"./slugify-rYFum3Sc.js";import{t as X}from"./Panel-Bcl09TtM.js";import{a as kt,i as At}from"./followPlural-DEr2kxEc.js";import{t as jt}from"./FormTextareaField-BSKNeTPW.js";import{n as Z,t as Mt}from"./FormSelectField-Br8bkwRF.js";import{a as Nt,c as Pt,n as Ft,o as It,r as Lt,s as Rt,t as zt}from"./SecretReveal-BCOJAisI.js";import{t as Bt}from"./useConfirmTarget-9JmfiY2X.js";import{t as Vt}from"./LinkTabs-8SmS1vCd.js";var Ht=[`read`,`create`,`update`,`delete`,`publish`,`schemaManage`],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`],Wt=[`read`,`create`,`update`,`delete`,`publish`],Gt={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`}]]};Gt.node;var Kt=ae(Gt),qt={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`}]]};qt.node;var Jt=ae(qt),Q=e(n(),1),Yt=()=>{let{t:e}=b(),t=wt(),{locked:n,reason:r}=kt(),i=n?null:(0,Q.jsx)(D,{asChild:!0,children:(0,Q.jsxs)(p,{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)(At,{reason:r}):null,(0,Q.jsx)(Y,{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})})]})},Xt=[`collection`,`singleton`,`component`],Zt=()=>{let{t:e}=b();return(0,Q.jsx)(pe,{title:e(`contentTypes.network.newTitle`),kinds:Xt,back:h({to:`/network/content-types`}),backLabel:e(`contentTypes.network.title`),scope:`network`})},$=e(t(),1),Qt=e=>Promise.all([e.invalidateQueries({queryKey:i.sites.all}),e.invalidateQueries({queryKey:i.me})]),$t=()=>r({queryKey:i.sites.all,queryFn:()=>d.sites.list(),meta:{silent:!0}}),en=e=>r({queryKey:i.sites.site(e),queryFn:()=>d.sites.get(e),meta:{silent:!0}}),tn=()=>{let e=$t();return{names:(0,$.useMemo)(()=>new Map((e.data??[]).map(e=>[e.id,e.name])),[e.data]),error:e.error}},nn=()=>{let e=s();return a({mutationKey:[`sites`,`create`],meta:{silent:!0},mutationFn:e=>c(()=>d.sites.create(e)),onSuccess:()=>Qt(e)})},rn=()=>{let e=s();return a({mutationKey:[`sites`,`update`],meta:{silent:!0},mutationFn:({id:e,input:t})=>c(()=>d.sites.update(e,t)),onSettled:()=>Qt(e)})},an=()=>{let e=s();return a({mutationKey:[`sites`,`delete`],meta:{silent:!0},mutationFn:e=>c(()=>d.sites.remove(e.id)),onSuccess:(t,n)=>{if(n.key===u().key){o();return}return e.removeQueries({queryKey:i.sites.site(n.id)}),Qt(e)}})},on=e=>r({queryKey:i.sites.appRoles(e),queryFn:()=>d.sites.appRoles.get(e),meta:{silent:!0}}),sn=()=>{let e=s();return a({mutationKey:[`sites`,`appRoles`,`set`],meta:{silent:!0},mutationFn:({id:e,input:t})=>c(()=>d.sites.appRoles.set(e,t)),onSuccess:t=>e.setQueryData(i.sites.appRoles(t.siteId),t)})},cn=e=>{let t=sn(),n=R({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 z(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}},ln=({bindings:e,roles:t,canManage:n})=>{let{t:r}=b(),{form:i,onSubmit:a,setBindings:o}=cn(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)(A,{children:[(0,Q.jsx)(ce,{control:i.control,name:`public`,legend:r(`sites.appRoles.public`),options:s,disabled:!n}),(0,Q.jsx)(ce,{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)(w,{when:c})]})},un=({siteId:e,canManage:t})=>{let{t:n}=b(),r=on(e),i=Ke();return(0,Q.jsx)(X,{title:n(`sites.appRoles.title`),description:n(`sites.appRoles.description`),children:(0,Q.jsx)(Y,{query:r,children:e=>(0,Q.jsx)(Y,{query:i,children:n=>(0,Q.jsx)(ln,{bindings:e,roles:n,canManage:t})})})})},dn=({site:e})=>{let{t}=b(),n=f(),r=an();return(0,Q.jsx)(X,{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`)})})})},fn=V({name:I().max(200,`validation.tooLong`)}),pn=e=>{let t=rn(),n=R({resolver:L(fn),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 z(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}},mn=`site-key`,hn=`site-key-hint`,gn=({site:e,canManage:t})=>{let{t:n}=b(),{form:r,onSubmit:i,updateSite:a}=pn(e),{isDirty:o}=r.formState;return(0,Q.jsxs)(X,{title:n(`sites.details`),children:[(0,Q.jsx)(`form`,{noValidate:!0,onSubmit:e=>void i(e),className:`max-w-md`,children:(0,Q.jsxs)(A,{children:[(0,Q.jsx)(F,{control:r.control,name:`name`,label:n(`sites.name`),autoComplete:`off`,readOnly:!t}),(0,Q.jsxs)(j,{children:[(0,Q.jsx)(St,{htmlFor:mn,label:n(`sites.key`),hint:n(`sites.keyHint`),hintId:hn}),(0,Q.jsx)(ge,{id:mn,value:e.key,readOnly:!0,className:`font-mono`,"aria-describedby":hn})]}),(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)(w,{when:o})]})},_n=()=>{let{t:e}=b(),{siteId:t}=ne({from:`/app/network/sites/$siteId`}),n=en(t),r=Dt(`sites.manage`),i=Dt(`roles.manage`);return(0,Q.jsx)(g,{width:`narrow`,children:(0,Q.jsx)(Y,{query:n,children:t=>(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(_,{breadcrumb:[{label:e(`sites.title`),link:h({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:()=>l(t.key),children:e(`sites.open`)})}),(0,Q.jsx)(gn,{site:t,canManage:r},t.id),(0,Q.jsx)(un,{siteId:t.id,canManage:i}),r&&!t.isPrimary?(0,Q.jsx)(dn,{site:t}):null]})})})},vn=63,yn=e=>Ot(e).replace(/^[^a-z]+/,``).slice(0,vn).replace(/-+$/,``),bn=V({name:I().max(200,`validation.tooLong`),key:J().trim().regex(/^[a-z][a-z0-9-]{0,62}$/,`validation.siteKey`)}),xn={name:``,key:``},Sn=(e,t)=>{let n=nn(),r=R({resolver:L(bn),defaultValues:xn}),{reset:i,getValues:a,setValue:o}=r;return de(P({control:r.control,name:`name`}),(0,$.useCallback)(()=>a(`key`),[a]),(0,$.useCallback)(e=>o(`key`,e,{shouldValidate:!1}),[o]),yn),(0,$.useEffect)(()=>{e&&i(xn)},[e,i]),{form:r,onSubmit:r.handleSubmit(async e=>{let r=await z(n.mutateAsync(e));r.ok&&(i(xn),t(r.value))}),createSite:n}},Cn=({open:e,onOpenChange:t,onCreated:n})=>{let{t:r}=b(),{form:i,onSubmit:a,createSite:o}=Sn(e,n);return(0,Q.jsxs)(Z,{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)(F,{control:i.control,name:`name`,label:r(`sites.name`),autoComplete:`off`}),(0,Q.jsx)(F,{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})]})},wn=({sites:e})=>{let{t}=b();return(0,Q.jsx)(K,{children:(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{children:t(`sites.name`)}),(0,Q.jsx)(H,{children:t(`sites.key`)}),(0,Q.jsx)(H,{children:t(`sites.createdAt`)}),(0,Q.jsx)(H,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:t(`common.actions`)})})]})}),(0,Q.jsx)(U,{children:e.map(e=>(0,Q.jsxs)(W,{children:[(0,Q.jsx)(G,{children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(se,{asChild:!0,children:(0,Q.jsx)(p,{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)(G,{className:`font-mono text-xs`,children:e.key}),(0,Q.jsx)(G,{title:S(e.createdAt),children:x(e.createdAt)}),(0,Q.jsx)(G,{className:`text-right`,children:(0,Q.jsx)(D,{variant:`outline`,size:`sm`,"aria-label":t(`sites.openNamed`,{name:e.name}),onClick:()=>l(e.key),children:t(`sites.open`)})})]},e.id))})]})})},Tn=()=>{let{t:e}=b(),t=f(),n=$t(),r=Dt(`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)(Y,{query:n,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:me,title:e(`sites.empty`)}),children:e=>(0,Q.jsx)(wn,{sites:e})}),r?(0,Q.jsx)(Cn,{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]})},En=`all`,Dn=e=>Ue.includes(e),On=({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??En,onValueChange:t=>n({action:e,actorType:Dn(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:En,children:r(`audit.allActors`)}),Ue.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]})},kn=()=>{let e=oe({from:`/app/network/audit-log`}),t=f({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})}}},An=e=>e.targetType?`${e.targetType}:${e.targetId??``}`:void 0,jn=({events:e})=>{let{t}=b(),{actionLabel:n,targetLabel:r}=nt();return(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{children:t(`audit.actor`)}),(0,Q.jsx)(H,{children:t(`audit.action`)}),(0,Q.jsx)(H,{children:t(`audit.target`)}),(0,Q.jsx)(H,{children:t(`audit.outcome`)}),(0,Q.jsx)(H,{children:t(`audit.ipAddress`)}),(0,Q.jsx)(H,{children:t(`audit.when`)})]})}),(0,Q.jsx)(U,{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=An(e),l=ct(e.metadata);return(0,Q.jsxs)(W,{children:[(0,Q.jsx)(G,{children:(0,Q.jsxs)(`span`,{className:`flex items-center gap-2.5`,children:[(0,Q.jsx)(dt,{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)(G,{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)(G,{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)(G,{children:(0,Q.jsx)(re,{tone:e.outcome===`success`?`success`:`danger`,label:e.outcome===`success`?t(`audit.success`):t(`audit.failure`)})}),(0,Q.jsx)(G,{className:`font-mono text-xs`,children:e.ip??t(`common.unknown`)}),(0,Q.jsx)(G,{className:`whitespace-nowrap`,title:S(e.occurredAt),children:x(e.occurredAt)})]},e.id)})})]})},Mn=()=>{let{t:e}=b(),{search:t,goFirst:n,goPrevious:r,goNext:i,setFilters:a}=kn(),o=$e({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)(K,{toolbar:(0,Q.jsx)(On,{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)(Y,{query:o,loadingRows:8,isEmpty:e=>e.items.length===0&&t.cursor===void 0,empty:(0,Q.jsx)(v,{size:`panel`,icon:Be,title:e(`audit.empty`)}),children:e=>(0,Q.jsx)(jn,{events:e.items})})})]})},Nn={admin:{actions:Ht,ownOnlyActions:new Set([`read`,`update`,`delete`,`publish`]),fieldScopedActions:new Set([`read`,`create`,`update`])},delivery:{actions:[`read`],ownOnlyActions:new Set,fieldScopedActions:new Set([`read`])}},Pn={admin:Ut,delivery:[`readDrafts`]},Fn={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`},In=[`admin`,`delivery`],Ln=/^[a-z][a-z0-9-]{0,62}$/,Rn=V({key:J().trim().regex(Ln,`validation.roleKey`),name:I(),description:J().trim(),kind:bt([`admin`,`delivery`])}),zn={key:``,name:``,description:``,kind:`admin`},Bn=(e,t)=>{let n=Ft(),r=R({resolver:L(Rn),defaultValues:zn}),{reset:i,getValues:a,setValue:o}=r;return de(P({control:r.control,name:`name`}),(0,$.useCallback)(()=>a(`key`),[a]),(0,$.useCallback)(e=>o(`key`,e,{shouldValidate:!1}),[o]),yn),(0,$.useEffect)(()=>{e&&i(zn)},[e,i]),{form:r,onSubmit:r.handleSubmit(async e=>{let r=await z(n.mutateAsync({...e,permissions:[]}));r.ok&&(T.success(E.t(`roles.created`)),t(r.value))}),createRole:n}},Vn={admin:`roles.kindAdmin`,delivery:`roles.kindDelivery`},Hn=({open:e,onOpenChange:t,onCreated:n})=>{let{t:r}=b(),{form:i,onSubmit:a,createRole:o}=Bn(e,n);return(0,Q.jsxs)(Z,{open:e,onOpenChange:t,size:`md`,title:r(`roles.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)(F,{control:i.control,name:`name`,label:r(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(F,{control:i.control,name:`key`,label:r(`roles.key`),hint:r(`roles.keyHint`),autoComplete:`off`,spellCheck:!1,className:`font-mono`}),(0,Q.jsx)(jt,{control:i.control,name:`description`,label:r(`roles.roleDescription`),rows:2}),(0,Q.jsx)(Mt,{control:i.control,name:`kind`,label:r(`roles.kind`),hint:r(`roles.kindHint`),options:In.map(e=>({value:e,label:r(Vn[e])}))}),(0,Q.jsx)(O,{error:o.error})]})},Un=({roles:e,onDelete:t})=>{let{t:n}=b();return(0,Q.jsx)(K,{children:(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{children:n(`roles.name`)}),(0,Q.jsx)(H,{children:n(`roles.key`)}),(0,Q.jsx)(H,{children:n(`roles.kind`)}),(0,Q.jsx)(H,{children:n(`roles.permissions`)}),(0,Q.jsx)(H,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:n(`common.actions`)})})]})}),(0,Q.jsx)(U,{children:e.map(e=>(0,Q.jsxs)(W,{children:[(0,Q.jsxs)(G,{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)(p,{to:`/network/roles/$roleId`,params:{roleId:e.id},children:e.name})}),(0,Q.jsx)(y,{variant:e.isSystem?`secondary`:`outline`,children:e.isSystem?n(`roles.builtIn`):n(`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)(G,{className:`font-mono text-xs`,children:e.key}),(0,Q.jsx)(G,{children:e.kind===`admin`?n(`roles.kindAdmin`):n(`roles.kindDelivery`)}),(0,Q.jsx)(G,{children:n(`roles.permissionsCount`,{count:e.permissions.length})}),(0,Q.jsx)(G,{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":`${n(`common.actions`)}: ${e.name}`,children:(0,Q.jsx)(Pe,{"aria-hidden":`true`})})}),(0,Q.jsxs)(Re,{align:`end`,children:[(0,Q.jsx)(M,{asChild:!0,children:(0,Q.jsxs)(p,{to:`/network/roles/$roleId`,params:{roleId:e.id},children:[(0,Q.jsx)(Jt,{"aria-hidden":`true`}),n(`roles.editPermissions`)]})}),(0,Q.jsxs)(M,{variant:`destructive`,onSelect:()=>t(e),children:[(0,Q.jsx)(ke,{"aria-hidden":`true`}),n(`common.delete`)]})]})]})})]},e.id))})]})})},Wn=()=>{let{t:e}=b();return(0,Q.jsx)(Vt,{label:e(`roles.sections`),tabs:[{to:`/network/roles`,label:e(`roles.tabAdmin`)},{to:`/network/roles/app`,label:e(`roles.tabApp`)}]})},Gn=()=>{let{t:e}=b(),t=Rt(),n=Lt(),r=Bt(),i=f(),[a,o]=(0,$.useState)(!1);return(0,Q.jsxs)(g,{width:`full`,children:[(0,Q.jsx)(_,{title:e(`roles.title`),tabs:(0,Q.jsx)(Wn,{}),actions:(0,Q.jsxs)(D,{onClick:()=>o(!0),children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),e(`roles.create`)]})}),(0,Q.jsx)(Y,{query:t,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:Ye,title:e(`roles.empty`)}),children:e=>(0,Q.jsx)(Un,{roles:e,onDelete:e=>r.ask(e)})}),(0,Q.jsx)(Hn,{open:a,onOpenChange:o,onCreated:e=>{o(!1),i({to:`/network/roles/$roleId`,params:{roleId:e.id}})}}),(0,Q.jsx)(De,{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`))})}})]})},Kn=V({key:J().trim().regex(Ln,`validation.roleKey`),name:I(),description:J().trim()}),qn={key:``,name:``,description:``},Jn=(e,t)=>{let n=Ge(),r=R({resolver:L(Kn),defaultValues:qn}),{reset:i,getValues:a,setValue:o}=r;return de(P({control:r.control,name:`name`}),(0,$.useCallback)(()=>a(`key`),[a]),(0,$.useCallback)(e=>o(`key`,e,{shouldValidate:!1}),[o]),yn),(0,$.useEffect)(()=>{e&&i(qn)},[e,i]),{form:r,onSubmit:r.handleSubmit(async e=>{let r=await z(n.mutateAsync({...e,permissions:[]}));r.ok&&(T.success(E.t(`appRoles.created`)),t(r.value))}),createAppRole:n}},Yn=({open:e,onOpenChange:t,onCreated:n})=>{let{t:r}=b(),{form:i,onSubmit:a,createAppRole:o}=Jn(e,n);return(0,Q.jsxs)(Z,{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)(F,{control:i.control,name:`name`,label:r(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(F,{control:i.control,name:`key`,label:r(`roles.key`),hint:r(`roles.keyHint`),autoComplete:`off`,spellCheck:!1,className:`font-mono`}),(0,Q.jsx)(jt,{control:i.control,name:`description`,label:r(`roles.roleDescription`),rows:2}),(0,Q.jsx)(O,{error:o.error})]})},Xn=e=>e.permissions.some(e=>e.action===`read`&&e.modelId===null&&e.condition===null),Zn=()=>{let e=Je();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(ue(e))}),pendingRoleId:e.isPending?e.variables?.id:void 0}},Qn=({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)(p,{to:`/network/roles/app/$roleId`,params:{roleId:e.id},children:[(0,Q.jsx)(Jt,{"aria-hidden":`true`}),n(`roles.editPermissions`)]})}),e.isSystem?null:(0,Q.jsxs)(M,{variant:`destructive`,onSelect:()=>i(!0),children:[(0,Q.jsx)(ke,{"aria-hidden":`true`}),n(`common.delete`)]})]})]})},$n={public:`appRoles.holdersPublic`,authenticated:`appRoles.holdersAuthenticated`},er=e=>Object.hasOwn($n,e)?$n[e]:void 0,tr=({roles:e,onDelete:t,onGrantReadAll:n,pendingRoleId:r})=>{let{t:i}=b();return(0,Q.jsx)(K,{children:(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{children:i(`roles.name`)}),(0,Q.jsx)(H,{children:i(`roles.key`)}),(0,Q.jsx)(H,{children:i(`appRoles.heldBy`)}),(0,Q.jsx)(H,{children:i(`roles.permissions`)}),(0,Q.jsx)(H,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:i(`common.actions`)})})]})}),(0,Q.jsx)(U,{children:e.map(e=>{let a=e.isSystem?er(e.key):void 0;return(0,Q.jsxs)(W,{children:[(0,Q.jsxs)(G,{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)(p,{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)(G,{className:`font-mono text-xs`,children:e.key}),(0,Q.jsx)(G,{children:a?i(a):i(`appRoles.userCount`,{count:e.userCount})}),(0,Q.jsx)(G,{children:(0,Q.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2`,children:[i(`roles.permissionsCount`,{count:e.permissions.length}),e.isSystem&&!Xn(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)(Kt,{"aria-hidden":`true`}),i(`appRoles.grantReadAll`)]}):null]})}),(0,Q.jsx)(G,{className:`text-right`,children:(0,Q.jsx)(Qn,{role:e,onDelete:t})})]},e.id)})})]})})},nr=()=>{let{t:e}=b(),t=f(),n=Ke(),r=Ve(),[i,a]=(0,$.useState)(!1),{grantReadAll:o,pendingRoleId:s}=Zn(),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)(Wn,{}),actions:(0,Q.jsxs)(D,{onClick:()=>a(!0),children:[(0,Q.jsx)(N,{"aria-hidden":`true`}),e(`appRoles.create`)]})}),(0,Q.jsx)(Y,{query:n,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:Ye,title:e(`roles.empty`)}),children:t=>(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[t.some(e=>e.isSystem&&!Xn(e))?(0,Q.jsxs)(Ee,{variant:`info`,role:`note`,children:[(0,Q.jsx)(le,{"aria-hidden":`true`}),(0,Q.jsx)(Oe,{children:e(`appRoles.denyByDefault`)})]}):null,(0,Q.jsx)(tr,{roles:t,onDelete:c,onGrantReadAll:o,pendingRoleId:s})]})}),(0,Q.jsx)(Yn,{open:i,onOpenChange:a,onCreated:e=>{a(!1),t({to:`/network/roles/app/$roleId`,params:{roleId:e.id}})}})]})},rr={read:`roles.matrix.actions.read`,create:`roles.matrix.actions.create`,update:`roles.matrix.actions.update`,delete:`roles.matrix.actions.delete`,publish:`roles.matrix.actions.publish`,schemaManage:`roles.matrix.actions.schemaManage`},ir=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},ar=(e,t)=>Object.keys(e).sort((e,t)=>e===`*`?-1:t===`*`?1:e.localeCompare(t)).flatMap(n=>t.actions.flatMap(t=>{let r=e[n]?.[t];return r?[{action:t,modelId:n===`*`?null:n,condition:r.ownOnly?`ownedByPrincipal`:null,fieldIds:r.fieldIds}]:[]})),or=(e,t,n,r)=>{let i={...e[t]};return r?i[n]=r:delete i[n],{...e,[t]:i}},sr=(e,t,n,r)=>or(e,t,n,r?e[t]?.[n]??{ownOnly:!1,fieldIds:null}:void 0),cr=(e,t,n,r)=>{let i=e[t]?.[n];return i?or(e,t,n,{...i,...r}):e},lr=(e,t)=>t.ownOnlyActions.has(e),ur=(e,t,n)=>e!==`*`&&n.fieldScopedActions.has(t),dr=(e,t,n,r)=>({ownOnly:n.ownOnly&&!lr(t,r),fieldIds:ur(e,t,r)?null:n.fieldIds}),fr=(e,t,n,r)=>{let i=dr(e,t,n,r);return lr(t,r)||ur(e,t,r)||i.ownOnly||i.fieldIds!==null},pr=(e,t,n)=>n.actions.some(r=>{let i=t?.[r];return i!==void 0&&fr(e,r,i,n)}),mr=(e,t,n)=>Object.keys(e).filter(e=>e!==`*`&&!t.has(e)).sort().flatMap(t=>n.actions.flatMap(n=>{let r=e[t]?.[n];return r?[{modelId:t,action:n,grant:r}]:[]})),hr=(e,t,n,r)=>t.reduce((e,t)=>sr(e,t,n,r),e),gr=(e,t,n)=>{let r=t.filter(t=>e[t]?.[n]!==void 0).length;return r===0?!1:r===t.length||`indeterminate`},_r=(e,t,n)=>{let r=e.filter(e=>!e.deprecated),i=r.map(e=>({id:e.id,label:e.label,note:n===`delivery`&&!e.public?`notPublic`:void 0})),a=new Set(r.map(e=>e.id));for(let n of t??[])if(!a.has(n)){let t=e.find(e=>e.id===n);i.push({id:n,label:t?.label,note:t?`deprecated`:`unknown`})}return{choices:i,defaultSelection:(n===`admin`?r:r.filter(e=>e.public)).map(e=>e.id)}},vr=`all`,yr=`selected`,br=({id:e,fields:t,fieldIds:n,audience:r,readOnly:i,onChange:a})=>{let{t:o}=b(),{choices:s,defaultSelection:c}=_r(t,n,r),l=n??[];return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(pt,{"aria-label":o(`roles.matrix.fieldScope`),value:n===null?vr:yr,disabled:i,onValueChange:e=>a(e===vr?null:c),children:[(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(ft,{id:`${e}-all`,value:vr}),(0,Q.jsx)(je,{htmlFor:`${e}-all`,className:`font-normal`,children:o(r===`admin`?`roles.matrix.allFields`:`roles.matrix.allPublicFields`)})]}),(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(ft,{id:`${e}-selected`,value:yr}),(0,Q.jsx)(je,{htmlFor:`${e}-selected`,className:`font-normal`,children:o(`roles.matrix.selectedFields`)})]})]}),n===null?null:(0,Q.jsx)(`div`,{className:`grid gap-2 pl-6 sm:grid-cols-2`,children:s.map(t=>{let n=`${e}-field-${t.id}`;return(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(Te,{id:n,checked:l.includes(t.id),disabled:i,onCheckedChange:e=>a(e===!0?[...l,t.id].sort():l.filter(e=>e!==t.id))}),(0,Q.jsxs)(je,{htmlFor:n,className:`font-normal`,children:[t.label??(0,Q.jsx)(`span`,{className:`font-mono text-xs`,children:t.id}),t.note===`notPublic`?(0,Q.jsx)(y,{variant:`secondary`,children:o(`roles.matrix.notPublic`)}):null,t.note===`deprecated`?(0,Q.jsx)(y,{variant:`secondary`,children:o(`roles.matrix.deprecatedField`)}):null,t.note===`unknown`?(0,Q.jsx)(y,{variant:`secondary`,children:o(`roles.matrix.unknownField`)}):null]})]},t.id)})})]})},xr=({id:e,checked:t,disabled:n,onCheckedChange:r})=>{let{t:i}=b();return(0,Q.jsxs)(j,{orientation:`horizontal`,children:[(0,Q.jsx)(je,{htmlFor:e,children:i(`roles.matrix.ownOnly`)}),(0,Q.jsx)(mt,{id:e,checked:t,disabled:n,onCheckedChange:r})]})},Sr=({id:e,rules:t,rowKey:n,fields:r,grants:i,audience:a,readOnly:o,onChange:s})=>{let{t:c}=b();return(0,Q.jsx)(`div`,{id:e,className:`sticky left-0 grid max-w-[100cqw] gap-6 border-t bg-muted/40 px-5 py-4 @3xl:grid-cols-2`,children:t.actions.map(l=>{let u=i[l];if(!u||!fr(n,l,u,t))return null;let d=`${e}-${l}`,f=dr(n,l,u,t);return(0,Q.jsxs)(Ae,{className:`gap-3`,children:[(0,Q.jsx)(Me,{variant:`label`,children:c(rr[l])}),lr(l,t)?(0,Q.jsx)(xr,{id:`${d}-own`,checked:u.ownOnly,disabled:o,onCheckedChange:e=>s(l,{ownOnly:e})}):null,ur(n,l,t)?(0,Q.jsx)(br,{id:d,fields:r??[],fieldIds:u.fieldIds,audience:a,readOnly:o,onChange:e=>s(l,{fieldIds:e})}):null,f.ownOnly?(0,Q.jsx)(j,{children:(0,Q.jsx)(`p`,{className:`text-meta text-muted-foreground`,children:c(`roles.matrix.fixedOwnOnly`)})}):null,f.fieldIds===null?null:(0,Q.jsx)(j,{children:(0,Q.jsx)(`p`,{className:`text-meta text-muted-foreground`,children:c(`roles.matrix.fixedFields`,{fields:f.fieldIds.join(`, `)||`–`})})})]},l)})})},Cr=({actions:e,label:t,detail:n,shared:r,siteName:i,readOnly:a,grants:o,optionsId:s,expanded:c,canExpand:l,onToggle:u,onToggleExpanded:d})=>{let{t:f}=b();return(0,Q.jsxs)(W,{className:`hover:bg-transparent has-aria-expanded:bg-transparent`,children:[(0,Q.jsx)(G,{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:t}),r?(0,Q.jsx)(Ct,{className:`self-center`}):null,(0,Q.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:i?`${i} · ${n}`:n})]})}),e.map(e=>(0,Q.jsx)(G,{className:`h-9 py-0 text-center`,children:(0,Q.jsx)(Te,{checked:o[e]!==void 0,disabled:a,onCheckedChange:t=>u(e,t===!0),"aria-label":`${f(rr[e])}: ${t}`,className:`align-middle`})},e)),(0,Q.jsx)(G,{className:`h-9 py-0 text-right`,children:(0,Q.jsxs)(D,{type:`button`,variant:`ghost`,size:`xs`,disabled:!l,"aria-expanded":c,"aria-controls":c?s:void 0,"aria-label":`${f(`roles.matrix.options`)}: ${t}`,onClick:d,children:[f(`roles.matrix.options`),(0,Q.jsx)(Se,{"aria-hidden":`true`,className:ut(`transition-transform`,c&&`rotate-180`)})]})})]})},wr=({matrix:e,listedKeys:t,rules:n,readOnly:r,onRemove:i})=>{let{t:a}=b(),o=mr(e,t,n);return o.length===0?null:(0,Q.jsxs)(`section`,{"aria-labelledby":`unlisted-grants-title`,className:`space-y-3 border-t px-5 py-4`,children:[(0,Q.jsx)(`h3`,{id:`unlisted-grants-title`,className:`text-sm font-semibold`,children:a(`roles.matrix.unlistedTitle`)}),(0,Q.jsx)(`ul`,{className:`space-y-2`,children:o.map(({modelId:e,action:t,grant:n})=>{let o=a(rr[t]);return(0,Q.jsxs)(`li`,{className:`flex items-center justify-between gap-3`,children:[(0,Q.jsxs)(`span`,{className:`min-w-0 text-sm`,children:[(0,Q.jsx)(`span`,{className:`font-semibold`,children:o}),` `,(0,Q.jsx)(`span`,{className:`font-mono text-xs break-all text-muted-foreground`,children:e}),n.ownOnly?(0,Q.jsx)(`span`,{className:`block text-meta text-muted-foreground`,children:a(`roles.matrix.ownOnly`)}):null,n.fieldIds===null?null:(0,Q.jsx)(`span`,{className:`block text-meta text-muted-foreground`,children:a(`roles.matrix.fixedFields`,{fields:n.fieldIds.join(`, `)||`–`})})]}),r?null:(0,Q.jsxs)(D,{type:`button`,variant:`ghost`,size:`xs`,"aria-label":a(`roles.matrix.removeGrant`,{action:o,model:e}),onClick:()=>i(e,t),children:[(0,Q.jsx)(ee,{"aria-hidden":`true`}),a(`common.remove`)]})]},`${e}:${t}`)})})]})},Tr=({matrix:e,models:t,showSites:n,rules:r,audience:i,readOnly:a=!1,onChange:o})=>{let{t:s}=b(),[c,l]=(0,$.useState)(new Set),u=e=>l(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n}),d=[{key:`*`,label:s(`roles.matrix.allModels`),detail:s(`roles.matrix.allModelsHint`),shared:!1,siteName:void 0,fields:void 0},...t.map(({definition:e,site:t})=>({key:e.id,label:e.label,detail:e.apiKey,shared:t===null,siteName:n?t?.name:void 0,fields:e.fields}))],f=d.map(e=>e.key);return(0,Q.jsxs)(`div`,{className:`@container`,children:[(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{className:`sticky left-0 z-10 min-w-60 bg-muted`,children:s(`roles.matrix.model`)}),r.actions.map(t=>{let n=s(rr[t]);return(0,Q.jsx)(H,{className:`w-24 bg-muted`,children:(0,Q.jsxs)(`span`,{className:`flex items-center justify-center gap-2`,children:[(0,Q.jsx)(Te,{checked:gr(e,f,t),disabled:a,onCheckedChange:n=>o(hr(e,f,t,n===!0)),"aria-label":s(`roles.matrix.everyRow`,{action:n})}),n]})},t)}),(0,Q.jsx)(H,{className:`bg-muted`,children:(0,Q.jsx)(`span`,{className:`sr-only`,children:s(`roles.matrix.options`)})})]})}),(0,Q.jsx)(U,{children:d.map(t=>{let n=e[t.key]??{},s=pr(t.key,n,r),l=s&&c.has(t.key),d=`permission-options-${t.key===`*`?`all`:t.key}`;return(0,Q.jsxs)($.Fragment,{children:[(0,Q.jsx)(Cr,{actions:r.actions,label:t.label,detail:t.detail,shared:t.shared,siteName:t.siteName,readOnly:a,grants:n,optionsId:d,expanded:l,canExpand:s,onToggle:(n,r)=>o(sr(e,t.key,n,r)),onToggleExpanded:()=>u(t.key)}),l?(0,Q.jsx)(W,{className:`hover:bg-transparent`,children:(0,Q.jsx)(G,{colSpan:r.actions.length+2,className:`h-auto p-0 whitespace-normal`,children:(0,Q.jsx)(Sr,{id:d,rules:r,rowKey:t.key,fields:t.fields,grants:n,audience:i,readOnly:a,onChange:(n,r)=>o(cr(e,t.key,n,r))})})}):null]},t.key)})})]}),(0,Q.jsx)(wr,{matrix:e,listedKeys:new Set(f),rules:r,readOnly:a,onRemove:(t,n)=>o(sr(e,t,n,!1))})]})},Er={actions:Wt,ownOnlyActions:new Set([`read`,`update`,`delete`,`publish`]),fieldScopedActions:new Set([`read`,`create`,`update`])},Dr=V({name:I(),description:J().trim()}),Or=e=>{let t=Je(),n=R({resolver:L(Dr),defaultValues:{name:e.name,description:e.description}}),[r,i]=(0,$.useState)(()=>ir(e.permissions)),a=(0,$.useMemo)(()=>JSON.stringify(ar(ir(e.permissions),Er)),[e.permissions]),o=(0,$.useMemo)(()=>ar(r,Er),[r]),s=JSON.stringify(o)!==a,c=!e.isSystem&&n.formState.isDirty,l=n.handleSubmit(async n=>{(await z(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}},kr={public:`appRoles.publicExplained`,authenticated:`appRoles.authenticatedExplained`},Ar=e=>Object.hasOwn(kr,e)?kr[e]:void 0,jr=({role:e,models:t,showSites:n})=>{let{t:r}=b(),i=Or(e),a=e.isSystem?Ar(e.key):void 0,o=[{label:r(`roles.title`),link:h({to:`/network/roles`})},{label:r(`appRoles.title`),link:h({to:`/network/roles/app`})}];return(0,Q.jsxs)(`form`,{noValidate:!0,className:`space-y-6`,onSubmit:e=>void i.onSubmit(e),children:[(0,Q.jsx)(_,{sticky:!0,breadcrumb:o,title:e.name,badge:e.isSystem?(0,Q.jsx)(y,{variant:`secondary`,children:r(`roles.builtIn`)}):null,meta:a?r(a):e.description||void 0,actions:(0,Q.jsx)(te,{pending:i.pending,pendingLabel:r(`common.saving`),disabled:!i.dirty,children:r(`common.saveChanges`)})}),e.isSystem?null:(0,Q.jsx)(X,{title:r(`appRoles.details`),children:(0,Q.jsxs)(A,{className:`max-w-xl`,children:[(0,Q.jsx)(F,{control:i.form.control,name:`name`,label:r(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(jt,{control:i.form.control,name:`description`,label:r(`roles.roleDescription`),rows:2})]})}),(0,Q.jsx)(X,{title:r(`roles.permissions`),description:r(`appRoles.permissionsHint`),flush:!0,children:(0,Q.jsx)(Tr,{matrix:i.matrix,models:t,showSites:n,rules:Er,audience:`delivery`,onChange:i.setMatrix})}),(0,Q.jsx)(O,{error:i.error}),(0,Q.jsx)(w,{when:i.dirty&&!i.pending})]})},Mr=()=>{let{roleId:e}=ne({from:`/app/network/roles/app/$roleId`}),t=qe(e),n=Tt();return(0,Q.jsx)(g,{width:`full`,children:(0,Q.jsx)(Y,{query:t,loadingRows:6,children:e=>(0,Q.jsx)(Y,{query:n,loadingRows:6,children:({models:t,siteCount:n})=>(0,Q.jsx)(jr,{role:e,models:t,showSites:n>1},`${e.id}:${e.version}`)})})})},Nr=e=>Ht.includes(e.action),Pr=(e,t)=>Pn[e].includes(t.action)&&t.modelId===null&&t.condition===null&&t.fieldIds===null,Fr=(e,t)=>{let n=Nn[e].actions,r=t.filter(e=>Nr(e)&&n.includes(e.action));return{matrix:ir(r),actions:t.filter(t=>Pr(e,t)).map(e=>e.action),others:t.filter(t=>!r.includes(t)&&!Pr(e,t))}},Ir=(e,t)=>{let n=Pn[e];return[...ar(t.matrix,Nn[e]),...n.filter(e=>t.actions.includes(e)).map(e=>({action:e,modelId:null,condition:null,fieldIds:null})),...t.others]},Lr=V({name:I(),description:J().trim(),actions:xt(yt(e=>typeof e==`string`))}),Rr=e=>{let t=Pt(),n=(0,$.useMemo)(()=>Fr(e.kind,e.permissions),[e.kind,e.permissions]),r=R({resolver:L(Lr),defaultValues:{name:e.name,description:e.description,actions:n.actions}}),[i,a]=(0,$.useState)(n.matrix),o=P({control:r.control,name:`actions`}),s=(0,$.useMemo)(()=>JSON.stringify(Ir(e.kind,n)),[e.kind,n]),c=(0,$.useMemo)(()=>Ir(e.kind,{matrix:i,actions:o,others:n.others}),[e.kind,i,o,n.others]),l=JSON.stringify(c)!==s,{dirtyFields:u}=r.formState,d=!!(u.name??u.description),f=r.handleSubmit(async({name:n,description:r})=>{(await z(t.mutateAsync({id:e.id,input:{expectedVersion:e.version,...d?{name:n,description:r}:{},...l?{permissions:c}:{}}}))).ok&&T.success(E.t(`roles.saved`))});return{form:r,matrix:i,setMatrix:a,dirty:l||d,onSubmit:f,pending:t.isPending,error:t.error}},zr={admin:`roles.kindAdmin`,delivery:`roles.kindDelivery`},Br={admin:`roles.contentHintAdmin`,delivery:`roles.contentHintDelivery`},Vr={admin:`roles.instancePermissions`,delivery:`roles.drafts`},Hr=({role:e,models:t,showSites:n})=>{let{t:r}=b(),i=Rr(e),a=e.isSystem,o=[{label:r(`roles.title`),link:h({to:`/network/roles`})}];return(0,Q.jsxs)(`form`,{noValidate:!0,className:`space-y-6`,onSubmit:e=>void i.onSubmit(e),children:[(0,Q.jsx)(_,{sticky:!0,breadcrumb:o,title:e.name,badge:(0,Q.jsx)(y,{variant:e.isSystem?`secondary`:`outline`,children:e.isSystem?r(`roles.builtIn`):r(`roles.custom`)}),meta:`${r(zr[e.kind])} · ${e.key}`,actions:a?null:(0,Q.jsx)(te,{pending:i.pending,pendingLabel:r(`common.saving`),disabled:!i.dirty,children:r(`common.saveChanges`)})}),a?(0,Q.jsxs)(Ee,{variant:`info`,role:`note`,children:[(0,Q.jsx)(le,{"aria-hidden":`true`}),(0,Q.jsx)(Oe,{children:r(`roles.builtInReadOnly`)})]}):(0,Q.jsx)(X,{title:r(`roles.details`),children:(0,Q.jsxs)(A,{className:`max-w-xl`,children:[(0,Q.jsx)(F,{control:i.form.control,name:`name`,label:r(`roles.name`),autoComplete:`off`}),(0,Q.jsx)(jt,{control:i.form.control,name:`description`,label:r(`roles.roleDescription`),rows:2})]})}),(0,Q.jsx)(X,{title:r(`roles.contentPermissions`),description:r(Br[e.kind]),flush:!0,children:(0,Q.jsx)(Tr,{matrix:i.matrix,models:t,showSites:n,rules:Nn[e.kind],audience:e.kind===`admin`?`admin`:`delivery`,readOnly:a,onChange:i.setMatrix})}),(0,Q.jsx)(X,{children:(0,Q.jsx)(ce,{control:i.form.control,name:`actions`,legend:r(Vr[e.kind]),disabled:a,options:Pn[e.kind].map(e=>({value:e,label:r(Fn[e]),...e===`readDrafts`?{hint:r(`roles.actions.readDraftsHint`)}:{}}))})}),(0,Q.jsx)(O,{error:i.error}),(0,Q.jsx)(w,{when:i.dirty&&!i.pending})]})},Ur=()=>{let{roleId:e}=ne({from:`/app/network/roles/$roleId`}),t=Nt(e),n=Tt();return(0,Q.jsx)(g,{width:`full`,children:(0,Q.jsx)(Y,{query:t,loadingRows:6,children:e=>(0,Q.jsx)(Y,{query:n,loadingRows:6,children:({models:t,siteCount:n})=>(0,Q.jsx)(Hr,{role:e,models:t,showSites:n>1},`${e.id}:${e.version}`)})})})},Wr=()=>{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 z(a(n))}})},dismiss:()=>i(void 0),keepFocusOnReveal:e=>{r&&e.preventDefault()}}},Gr=({link:e,emailDelivery:t,onDismiss:n})=>{let{t:r}=b(),i=S(e.expiresAt);return(0,Q.jsx)(zt,{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??``}`)})},qr=({siteNames:e,onCopyLink:t,onCloseAutoFocus:n})=>{let{t:r}=b(),i=st(),{names:a}=It(),o=Ze();return i.isError?(0,Q.jsx)(ie,{error:i.error,onRetry:()=>void i.refetch()}):!i.data||i.data.length===0?null:(0,Q.jsx)(X,{title:r(`users.invitationsTitle`),flush:!0,children:(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{children:r(`users.email`)}),(0,Q.jsx)(H,{children:r(`users.roles`)}),(0,Q.jsx)(H,{children:r(`users.invitationExpires`)}),(0,Q.jsx)(H,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:r(`common.actions`)})})]})}),(0,Q.jsx)(U,{children:i.data.map(i=>(0,Q.jsxs)(W,{children:[(0,Q.jsx)(G,{children:(0,Q.jsx)(se,{children:i.email})}),(0,Q.jsx)(G,{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)(G,{title:S(i.expiresAt),children:x(i.expiresAt)}),(0,Q.jsx)(G,{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`,Yr=(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}))},Xr=e=>e.map(({site:e,roleId:t})=>({roleId:t,siteId:e===`all`?null:e})),Zr=e=>xt(V({site:J().min(1),roleId:J().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`})})}),Qr=(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}},$r=({control:e,roleOptions:t,siteOptions:n,siteIds:r,multiSite:i,defaultRoleId:a})=>{let{t:o}=b(),{fields:s,append:c,remove:l}=_t({control:e,name:`rows`}),{errors:u}=ht({control:e,name:`rows`}),d=P({control:e,name:`rows`}),f=(e,t)=>`rows.${e}.${t}`;if(!i)return(0,Q.jsx)(Et,{control:e,name:f(0,`roleId`),legend:o(`users.role`),options:t});let p=Qr(d??[],r,a??``),m=u.rows;return(0,Q.jsxs)(Ae,{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)(Mt,{control:e,name:f(i,`site`),label:o(`users.access.site`),options:n}),(0,Q.jsx)(Mt,{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)(vt,{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`)]})})]})},ei={owner:`owner`,editor:`editor`},ti=({includeOwner:e,heldRoleIds:t=[]})=>{let n=Rt(),r=(n.data??[]).filter(e=>e.kind===`admin`),i=e=>e===ei.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===ei.editor)?.id,ownerRoleId:r.find(e=>i(e.key))?.id,isPending:n.isPending,error:n.error}},ni=({includeOwner:e,heldRoleIds:t})=>{let{t:n}=b(),r=ti({includeOwner:e,...t?{heldRoleIds:t}:{}}),i=$t(),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}},ri=e=>({email:``,rows:[{site:`all`,roleId:e}]}),ii=({open:e,defaultRoleId:t,ownerRoleId:n,onInvited:r,onDone:i})=>{let a=rt(),o=(0,$.useMemo)(()=>V({email:gt(),rows:Zr(n)}),[n]),s=R({resolver:L(o),defaultValues:ri(``)}),{reset:c}=s;return(0,$.useEffect)(()=>{e&&c(ri(t??``))},[e,t,c]),{form:s,onSubmit:s.handleSubmit(async({email:e,rows:n})=>{let o=await z(a.mutateAsync({email:e,assignments:Xr(n)}));o.ok&&(await z(r(o.value)),c(ri(t??``)),i())}),invite:a}},ai=({open:e,onOpenChange:t,onInvited:n,onCloseAutoFocus:r})=>{let{t:i}=b(),a=ni({includeOwner:!1}),{form:o,onSubmit:s,invite:c}=ii({open:e,defaultRoleId:a.editorRoleId,ownerRoleId:a.ownerRoleId,onInvited:n,onDone:()=>t(!1)});return(0,Q.jsxs)(Z,{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)(F,{control:o.control,name:`email`,label:i(`users.email`),type:`email`,autoComplete:`off`}),(0,Q.jsx)($r,{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})]})},oi=(e,t,n,r)=>{let i=ot(),a=(0,$.useMemo)(()=>V({rows:Zr(n)}),[n]),o=R({resolver:L(a),defaultValues:{rows:[]}}),{reset:s}=o;return(0,$.useEffect)(()=>{e&&s({rows:Yr(t.assignments,n)})},[e,t.assignments,n,s]),{form:o,onSubmit:o.handleSubmit(async({rows:e})=>{(await z(i.mutateAsync({id:t.id,input:{assignments:Xr(e)}}))).ok&&(T.success(E.t(`users.rolesSaved`)),r())}),updateUser:i}},si=()=>m().data?.roles.some(e=>e.key===ei.owner)??!1,ci=({open:e,onOpenChange:t,user:n})=>{let{t:r}=b(),i=ni({includeOwner:si(),heldRoleIds:n.assignments.map(e=>e.roleId)}),{form:a,onSubmit:o,updateUser:s}=oi(e,n,i.ownerRoleId,()=>t(!1));return(0,Q.jsxs)(Z,{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)($r,{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})]})},li=(e,t)=>new Intl.ListFormat(t,{type:`conjunction`}).format(e.map(e=>`“${e.name}”`)),ui=e=>{let{t,i18n:n}=b(),[r,i]=(0,$.useState)(null),[a,o]=(0,$.useState)(`remove`),s=e=>{e&&o(e),i(e)},c=e.name||e.email,l=e.apiTokens,u=li(l,n.language);return{kind:r,setKind:s,copy:{remove:{title:t(`users.removeTitle`,{name:c}),description:l.length>0?t(`users.removeDescriptionWithTokens`,{count:l.length,names:u}):t(`users.removeDescription`),confirmLabel:t(`common.remove`)},disable:{title:t(`users.disableTitle`,{name:c}),description:t(`users.disableDescriptionWithTokens`,{count:l.length,names:u}),confirmLabel:t(`users.disable`)}}[a],disableNeedsConfirm:e.status===`active`&&l.length>0}},di=({user:e,roleNames:t,siteNames:n,isSelf:r,onToggleStatus:i,onRemove:a})=>{let{t:o}=b(),[s,c]=(0,$.useState)(void 0),l=ui(e),u=e.name||e.email;return(0,Q.jsxs)(W,{children:[(0,Q.jsx)(G,{children:(0,Q.jsx)(We,{name:u,email:e.email,badge:r?(0,Q.jsx)(y,{variant:`secondary`,children:o(`users.you`)}):null})}),(0,Q.jsxs)(G,{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)(ci,{open:s,onOpenChange:c,user:e})]}),(0,Q.jsx)(G,{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)(G,{title:S(e.lastLoginAt)||void 0,children:e.lastLoginAt?x(e.lastLoginAt):o(`common.never`)}),(0,Q.jsx)(G,{className:`text-right`,children:r?null:(0,Q.jsxs)(ze,{children:[(0,Q.jsx)(k,{tone:`danger`,open:l.kind!==null,onOpenChange:e=>!e&&l.setKind(null),title:l.copy.title,description:l.copy.description,confirmLabel:l.copy.confirmLabel,onConfirm:()=>l.kind===`disable`?i(e):a(e),children:(0,Q.jsx)(Le,{asChild:!0,children:(0,Q.jsx)(D,{variant:`ghost`,size:`icon-sm`,"aria-label":`${o(`common.actions`)}: ${u}`,children:(0,Q.jsx)(Pe,{"aria-hidden":`true`})})})}),(0,Q.jsxs)(Re,{align:`end`,onCloseAutoFocus:e=>(l.kind!==null||s)&&e.preventDefault(),children:[(0,Q.jsxs)(M,{onSelect:()=>c(!0),children:[(0,Q.jsx)(Ye,{"aria-hidden":`true`}),o(`users.editAccess`)]}),(0,Q.jsxs)(M,{onSelect:()=>{if(l.disableNeedsConfirm){l.setKind(`disable`);return}z(i(e))},children:[e.status===`active`?(0,Q.jsx)(Xe,{"aria-hidden":`true`}):(0,Q.jsx)(He,{"aria-hidden":`true`}),e.status===`active`?o(`users.disable`):o(`users.enable`)]}),(0,Q.jsx)(Ie,{}),(0,Q.jsxs)(M,{variant:`destructive`,onSelect:()=>l.setKind(`remove`),children:[(0,Q.jsx)(ke,{"aria-hidden":`true`}),o(`common.remove`)]})]})]})})]})},fi=({users:e,roleNames:t,siteNames:n,currentUserId:r,onToggleStatus:i,onRemove:a})=>{let{t:o}=b();return(0,Q.jsx)(K,{children:(0,Q.jsxs)(q,{children:[(0,Q.jsx)(B,{children:(0,Q.jsxs)(W,{children:[(0,Q.jsx)(H,{children:o(`users.name`)}),(0,Q.jsx)(H,{children:o(`users.roles`)}),(0,Q.jsx)(H,{children:o(`users.status`)}),(0,Q.jsx)(H,{children:o(`users.lastLogin`)}),(0,Q.jsx)(H,{children:(0,Q.jsx)(`span`,{className:`sr-only`,children:o(`common.actions`)})})]})}),(0,Q.jsx)(U,{children:e.map(e=>(0,Q.jsx)(di,{user:e,roleNames:t,siteNames:n,isSelf:e.id===r,onToggleStatus:i,onRemove:a},e.id))})]})})},pi={sites:C(`/app/network/sites`)({component:Tn}),site:C(`/app/network/sites/$siteId`)({component:_n}),contentTypes:C(`/app/network/content-types/`)({component:Yt}),newContentType:C(`/app/network/content-types/new`)({component:Zt}),users:C(`/app/network/users`)({component:()=>{let{t:e}=b(),{data:t}=m(),n=Qe(),{names:r}=It(),{names:i}=tn(),a=it(),o=tt(),[s,c]=(0,$.useState)(!1),l=Wr(),u=async t=>{await a.mutateAsync({id:t.id,status:t.status===`active`?`disabled`:`active`}),T.success(e(`users.statusChanged`))},d=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)(et,{"aria-hidden":`true`}),e(`users.invite`)]})}),(0,Q.jsx)(Y,{query:n,isEmpty:e=>e.length===0,empty:(0,Q.jsx)(v,{icon:lt,title:e(`users.empty`)}),children:e=>(0,Q.jsx)(fi,{users:e,roleNames:r,siteNames:i,currentUserId:t?.user.id,onToggleStatus:u,onRemove:d})}),l.revealed?(0,Q.jsx)(Gr,{link:l.revealed,emailDelivery:l.emailDelivery,onDismiss:l.dismiss},l.revealed.acceptUrl):null,(0,Q.jsx)(qr,{siteNames:i,onCopyLink:l.reveal,onCloseAutoFocus:l.keepFocusOnReveal}),(0,Q.jsx)(ai,{open:s,onOpenChange:c,onInvited:l.announceInvitation,onCloseAutoFocus:l.keepFocusOnReveal})]})}}),roles:C(`/app/network/roles`)({component:Gn}),role:C(`/app/network/roles/$roleId`)({component:Ur}),appRoles:C(`/app/network/roles/app`)({component:nr}),appRole:C(`/app/network/roles/app/$roleId`)({component:Mr}),auditLog:C(`/app/network/audit-log`)({component:Mn})};export{pi as networkLazyRoutes};
2
+ //# sourceMappingURL=network--5X46kWN.js.map