@shapio/cms 0.5.8 → 0.5.10

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 (343) hide show
  1. package/dist/admin/assets/{AssetTile-BrMzsUZD.js → AssetTile-DecaDqjj.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-BrMzsUZD.js.map → AssetTile-DecaDqjj.js.map} +1 -1
  3. package/dist/admin/assets/AssistError-rslPtgWB.js +2 -0
  4. package/dist/admin/assets/{AssistError-Cs-r9Ssc.js.map → AssistError-rslPtgWB.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js → BlockMenuItems-JHFue7Qt.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js.map → BlockMenuItems-JHFue7Qt.js.map} +1 -1
  7. package/dist/admin/assets/Body-7NgJl9Pi.js +2 -0
  8. package/dist/admin/assets/Body-7NgJl9Pi.js.map +1 -0
  9. package/dist/admin/assets/Builder-DmlYcgiP.js +2 -0
  10. package/dist/admin/assets/Builder-DmlYcgiP.js.map +1 -0
  11. package/dist/admin/assets/{CodeEditor-CBCR73Wd.js → CodeEditor-Dv1FtkvI.js} +2 -2
  12. package/dist/admin/assets/{CodeEditor-CBCR73Wd.js.map → CodeEditor-Dv1FtkvI.js.map} +1 -1
  13. package/dist/admin/assets/{CopyButton-CxFsBHfF.js → CopyButton-Brnpfqe0.js} +2 -2
  14. package/dist/admin/assets/{CopyButton-CxFsBHfF.js.map → CopyButton-Brnpfqe0.js.map} +1 -1
  15. package/dist/admin/assets/{CursorPager-BW2U3v6l.js → CursorPager-C7cAK5Qe.js} +2 -2
  16. package/dist/admin/assets/{CursorPager-BW2U3v6l.js.map → CursorPager-C7cAK5Qe.js.map} +1 -1
  17. package/dist/admin/assets/{ExternalLink-BITMgS1K.js → ExternalLink-D80sb5Jj.js} +2 -2
  18. package/dist/admin/assets/{ExternalLink-BITMgS1K.js.map → ExternalLink-D80sb5Jj.js.map} +1 -1
  19. package/dist/admin/assets/{FocalPoint-CpZTve1E.js → FocalPoint-Bhtb1gUa.js} +2 -2
  20. package/dist/admin/assets/{FocalPoint-CpZTve1E.js.map → FocalPoint-Bhtb1gUa.js.map} +1 -1
  21. package/dist/admin/assets/Form-Cf1ephPH.js +2 -0
  22. package/dist/admin/assets/Form-Cf1ephPH.js.map +1 -0
  23. package/dist/admin/assets/FormCheckboxGroup-BzVZFR3W.js +2 -0
  24. package/dist/admin/assets/FormCheckboxGroup-BzVZFR3W.js.map +1 -0
  25. package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js → FormRadioGroup-BzmLzRnI.js} +2 -2
  26. package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js.map → FormRadioGroup-BzmLzRnI.js.map} +1 -1
  27. package/dist/admin/assets/FormSelectField-Cl7EjXc3.js +2 -0
  28. package/dist/admin/assets/FormSelectField-Cl7EjXc3.js.map +1 -0
  29. package/dist/admin/assets/FormSheet-CLZpd_7B.js +2 -0
  30. package/dist/admin/assets/FormSheet-CLZpd_7B.js.map +1 -0
  31. package/dist/admin/assets/{FormSwitchField-BLOh7qei.js → FormSwitchField-BbqQ3tx_.js} +2 -2
  32. package/dist/admin/assets/{FormSwitchField-BLOh7qei.js.map → FormSwitchField-BbqQ3tx_.js.map} +1 -1
  33. package/dist/admin/assets/{FormTextareaField-CO115n_u.js → FormTextareaField-9RN5Pt3B.js} +2 -2
  34. package/dist/admin/assets/{FormTextareaField-CO115n_u.js.map → FormTextareaField-9RN5Pt3B.js.map} +1 -1
  35. package/dist/admin/assets/{HintedLabel-DzHnEdIK.js → HintedLabel-D9IVF0EE.js} +2 -2
  36. package/dist/admin/assets/{HintedLabel-DzHnEdIK.js.map → HintedLabel-D9IVF0EE.js.map} +1 -1
  37. package/dist/admin/assets/{InfoHint-CSEtcHjL.js → InfoHint-tlSeZB9U.js} +2 -2
  38. package/dist/admin/assets/{InfoHint-CSEtcHjL.js.map → InfoHint-tlSeZB9U.js.map} +1 -1
  39. package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js → InlineConfirm-Kj9AOIFO.js} +2 -2
  40. package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js.map → InlineConfirm-Kj9AOIFO.js.map} +1 -1
  41. package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js → InsertMenuItem-CHAp2tH7.js} +2 -2
  42. package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js.map → InsertMenuItem-CHAp2tH7.js.map} +1 -1
  43. package/dist/admin/assets/{LinkTabs-8SmS1vCd.js → LinkTabs-oQXsy1I3.js} +2 -2
  44. package/dist/admin/assets/{LinkTabs-8SmS1vCd.js.map → LinkTabs-oQXsy1I3.js.map} +1 -1
  45. package/dist/admin/assets/{Match-CcD9KxHH.js → Match-BfNRwPfR.js} +2 -2
  46. package/dist/admin/assets/{Match-CcD9KxHH.js.map → Match-BfNRwPfR.js.map} +1 -1
  47. package/dist/admin/assets/{NoAccess-C8RLPN0I.js → NoAccess-DnEpYj9l.js} +2 -2
  48. package/dist/admin/assets/{NoAccess-C8RLPN0I.js.map → NoAccess-DnEpYj9l.js.map} +1 -1
  49. package/dist/admin/assets/Panel-Bcl09TtM.js.map +1 -1
  50. package/dist/admin/assets/{QueryView-xMP_uJ_t.js → QueryView-B86NcRt5.js} +2 -2
  51. package/dist/admin/assets/{QueryView-xMP_uJ_t.js.map → QueryView-B86NcRt5.js.map} +1 -1
  52. package/dist/admin/assets/{RadioTile-DQFmni5A.js → RadioTile-Bwd2Pmlk.js} +2 -2
  53. package/dist/admin/assets/RadioTile-Bwd2Pmlk.js.map +1 -0
  54. package/dist/admin/assets/{RichTextField-CVHRIbnu.js → RichTextField-Dou79MHF.js} +4 -4
  55. package/dist/admin/assets/RichTextField-Dou79MHF.js.map +1 -0
  56. package/dist/admin/assets/{RowTitle-Bqt6evG9.js → RowTitle-DH9OZs3g.js} +2 -2
  57. package/dist/admin/assets/{RowTitle-Bqt6evG9.js.map → RowTitle-DH9OZs3g.js.map} +1 -1
  58. package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js → SecretReveal-D95oACLj.js} +2 -2
  59. package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js.map → SecretReveal-D95oACLj.js.map} +1 -1
  60. package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js → SharedGlyph-Chwb1EIS.js} +2 -2
  61. package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js.map → SharedGlyph-Chwb1EIS.js.map} +1 -1
  62. package/dist/admin/assets/StepList-D9iHsUZJ.js +2 -0
  63. package/dist/admin/assets/StepList-D9iHsUZJ.js.map +1 -0
  64. package/dist/admin/assets/Structure-CewJL1b3.js +2 -0
  65. package/dist/admin/assets/{Structure-D8csgrIt.js.map → Structure-CewJL1b3.js.map} +1 -1
  66. package/dist/admin/assets/{SubNavLink-CiCaVV8U.js → SubNavLink-7Cs1LqMv.js} +2 -2
  67. package/dist/admin/assets/SubNavLink-7Cs1LqMv.js.map +1 -0
  68. package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js → SuggestAltButton-BK1uo4yC.js} +2 -2
  69. package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js.map → SuggestAltButton-BK1uo4yC.js.map} +1 -1
  70. package/dist/admin/assets/{TextLink-HRn66VL1.js → TextLink-Dfs5wsc5.js} +2 -2
  71. package/dist/admin/assets/{TextLink-HRn66VL1.js.map → TextLink-Dfs5wsc5.js.map} +1 -1
  72. package/dist/admin/assets/{Thumbnail-DNj5TRBI.js → Thumbnail-C2A_Ub77.js} +2 -2
  73. package/dist/admin/assets/{Thumbnail-DNj5TRBI.js.map → Thumbnail-C2A_Ub77.js.map} +1 -1
  74. package/dist/admin/assets/Trans-CPoNNUK1.js +2 -0
  75. package/dist/admin/assets/Trans-CPoNNUK1.js.map +1 -0
  76. package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js → UnsavedChangesGuard-BsEyn9oH.js} +2 -2
  77. package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js.map → UnsavedChangesGuard-BsEyn9oH.js.map} +1 -1
  78. package/dist/admin/assets/{UserAvatar-p-jV-LoD.js → UserAvatar-CgGKOFfP.js} +2 -2
  79. package/dist/admin/assets/{UserAvatar-p-jV-LoD.js.map → UserAvatar-CgGKOFfP.js.map} +1 -1
  80. package/dist/admin/assets/auth-BFSvtV59.js +2 -0
  81. package/dist/admin/assets/{auth-CQO4MBUj.js.map → auth-BFSvtV59.js.map} +1 -1
  82. package/dist/admin/assets/{badge-CqKF1pwz.js → badge-DGqA_yr_.js} +2 -2
  83. package/dist/admin/assets/{badge-CqKF1pwz.js.map → badge-DGqA_yr_.js.map} +1 -1
  84. package/dist/admin/assets/baseExtensions-TVKN1UwW.js.map +1 -1
  85. package/dist/admin/assets/{boxes-CAygw8zF.js → boxes-_5klpWNM.js} +2 -2
  86. package/dist/admin/assets/{boxes-CAygw8zF.js.map → boxes-_5klpWNM.js.map} +1 -1
  87. package/dist/admin/assets/{calendar-clock-BZGtAvWR.js → calendar-clock-VXok22Xj.js} +2 -2
  88. package/dist/admin/assets/{calendar-clock-BZGtAvWR.js.map → calendar-clock-VXok22Xj.js.map} +1 -1
  89. package/dist/admin/assets/changeSets-B6HxCJ4A.js +2 -0
  90. package/dist/admin/assets/{changeSets-8EburmT0.js.map → changeSets-B6HxCJ4A.js.map} +1 -1
  91. package/dist/admin/assets/chevron-left-CkRxDtvO.js +2 -0
  92. package/dist/admin/assets/{chevron-left-DGU3HGYG.js.map → chevron-left-CkRxDtvO.js.map} +1 -1
  93. package/dist/admin/assets/{circle-check-C37MSJqX.js → circle-check-DtDq7QMo.js} +2 -2
  94. package/dist/admin/assets/{circle-check-C37MSJqX.js.map → circle-check-DtDq7QMo.js.map} +1 -1
  95. package/dist/admin/assets/{clock-2arjsgZ4.js → clock-BtvZR9KD.js} +2 -2
  96. package/dist/admin/assets/{clock-2arjsgZ4.js.map → clock-BtvZR9KD.js.map} +1 -1
  97. package/dist/admin/assets/cn-DVhJ55Mo.js.map +1 -1
  98. package/dist/admin/assets/{constants-a_15vqOh.js → constants-DY3YJAKH.js} +2 -2
  99. package/dist/admin/assets/{constants-a_15vqOh.js.map → constants-DY3YJAKH.js.map} +1 -1
  100. package/dist/admin/assets/content-BNZF26Ve.js +3 -0
  101. package/dist/admin/assets/content-BNZF26Ve.js.map +1 -0
  102. package/dist/admin/assets/{contentCounts-DP7YYeZZ.js → contentCounts-BzC7IQqP.js} +2 -2
  103. package/dist/admin/assets/{contentCounts-DP7YYeZZ.js.map → contentCounts-BzC7IQqP.js.map} +1 -1
  104. package/dist/admin/assets/{contentTypes-84uc0bjR.js → contentTypes-Bz2xpqGf.js} +2 -2
  105. package/dist/admin/assets/{contentTypes-84uc0bjR.js.map → contentTypes-Bz2xpqGf.js.map} +1 -1
  106. package/dist/admin/assets/{context-IKYdzQJ-.js → context-CEVKblBl.js} +2 -2
  107. package/dist/admin/assets/{context-IKYdzQJ-.js.map → context-CEVKblBl.js.map} +1 -1
  108. package/dist/admin/assets/{copy-CsSRHgKZ.js → copy-B7vIq8DS.js} +2 -2
  109. package/dist/admin/assets/{copy-CsSRHgKZ.js.map → copy-B7vIq8DS.js.map} +1 -1
  110. package/dist/admin/assets/createLucideIcon-BOsNKleB.js +2 -0
  111. package/dist/admin/assets/createLucideIcon-BOsNKleB.js.map +1 -0
  112. package/dist/admin/assets/develop-D6CtwuYj.js +11 -0
  113. package/dist/admin/assets/develop-D6CtwuYj.js.map +1 -0
  114. package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js → dropdown-menu-Bz7CLcRK.js} +2 -2
  115. package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js.map → dropdown-menu-Bz7CLcRK.js.map} +1 -1
  116. package/dist/admin/assets/{ellipsis-F91991on.js → ellipsis-Ci0rsbCJ.js} +2 -2
  117. package/dist/admin/assets/{ellipsis-F91991on.js.map → ellipsis-Ci0rsbCJ.js.map} +1 -1
  118. package/dist/admin/assets/{entryLink-CVB-TdIn.js → entryLink-B0hSb_dN.js} +2 -2
  119. package/dist/admin/assets/{entryLink-CVB-TdIn.js.map → entryLink-B0hSb_dN.js.map} +1 -1
  120. package/dist/admin/assets/es2015-Cv57ynE1.js +42 -0
  121. package/dist/admin/assets/es2015-Cv57ynE1.js.map +1 -0
  122. package/dist/admin/assets/{external-link-CdG6kHfA.js → external-link-Bs9YRzvY.js} +2 -2
  123. package/dist/admin/assets/{external-link-CdG6kHfA.js.map → external-link-Bs9YRzvY.js.map} +1 -1
  124. package/dist/admin/assets/{field-COOzRptX.js → field-D-xWW2E7.js} +2 -2
  125. package/dist/admin/assets/{field-COOzRptX.js.map → field-D-xWW2E7.js.map} +1 -1
  126. package/dist/admin/assets/{file-stack-28ZtO1xW.js → file-stack-X4OGmkLA.js} +2 -2
  127. package/dist/admin/assets/{file-stack-28ZtO1xW.js.map → file-stack-X4OGmkLA.js.map} +1 -1
  128. package/dist/admin/assets/{fileRoute-s7mCMYUJ.js → fileRoute-DMal-zYL.js} +2 -2
  129. package/dist/admin/assets/{fileRoute-s7mCMYUJ.js.map → fileRoute-DMal-zYL.js.map} +1 -1
  130. package/dist/admin/assets/{folder-plus-DIk0pWkP.js → folder-plus-De2GNvry.js} +2 -2
  131. package/dist/admin/assets/{folder-plus-DIk0pWkP.js.map → folder-plus-De2GNvry.js.map} +1 -1
  132. package/dist/admin/assets/followPlural-CsgeALTW.js +2 -0
  133. package/dist/admin/assets/followPlural-CsgeALTW.js.map +1 -0
  134. package/dist/admin/assets/{globe-DFr3Gd2w.js → globe-DBw84s8Z.js} +2 -2
  135. package/dist/admin/assets/{globe-DFr3Gd2w.js.map → globe-DBw84s8Z.js.map} +1 -1
  136. package/dist/admin/assets/{image-DT79QFa_.js → image-CX4mT-_R.js} +2 -2
  137. package/dist/admin/assets/{image-DT79QFa_.js.map → image-CX4mT-_R.js.map} +1 -1
  138. package/dist/admin/assets/{image-off-DFs5upyX.js → image-off-CVaH_qKf.js} +2 -2
  139. package/dist/admin/assets/{image-off-DFs5upyX.js.map → image-off-CVaH_qKf.js.map} +1 -1
  140. package/dist/admin/assets/inbox-C0PVc6UI.js +2 -0
  141. package/dist/admin/assets/inbox-C0PVc6UI.js.map +1 -0
  142. package/dist/admin/assets/{inbox-CySnQydm.js → inbox-D9SmWt5L.js} +2 -2
  143. package/dist/admin/assets/{inbox-CySnQydm.js.map → inbox-D9SmWt5L.js.map} +1 -1
  144. package/dist/admin/assets/index-BqtCXB0u.js +4 -0
  145. package/dist/admin/assets/index-BqtCXB0u.js.map +1 -0
  146. package/dist/admin/assets/index-DZsQq6fY.css +2 -0
  147. package/dist/admin/assets/{key-round-D36CePnN.js → key-round-C8sd9CLN.js} +2 -2
  148. package/dist/admin/assets/{key-round-D36CePnN.js.map → key-round-C8sd9CLN.js.map} +1 -1
  149. package/dist/admin/assets/{labels-DQckbLGW.js → labels-BtktCNGw.js} +2 -2
  150. package/dist/admin/assets/{labels-DQckbLGW.js.map → labels-BtktCNGw.js.map} +1 -1
  151. package/dist/admin/assets/{languages-CzbTaQv9.js → languages-DLjdz6gb.js} +2 -2
  152. package/dist/admin/assets/{languages-CzbTaQv9.js.map → languages-DLjdz6gb.js.map} +1 -1
  153. package/dist/admin/assets/{layers-BmcodiaH.js → layers-swLuw-3a.js} +2 -2
  154. package/dist/admin/assets/{layers-BmcodiaH.js.map → layers-swLuw-3a.js.map} +1 -1
  155. package/dist/admin/assets/{link-2-off-CoJNwrxm.js → link-2-off-CEsI5T8h.js} +2 -2
  156. package/dist/admin/assets/{link-2-off-CoJNwrxm.js.map → link-2-off-CEsI5T8h.js.map} +1 -1
  157. package/dist/admin/assets/{link-Pyr2Y35S.js → link-C98FG_p5.js} +2 -2
  158. package/dist/admin/assets/{link-Pyr2Y35S.js.map → link-C98FG_p5.js.map} +1 -1
  159. package/dist/admin/assets/locales-CkuC7TJ1.js +2 -0
  160. package/dist/admin/assets/{locales-Bg3htKo8.js.map → locales-CkuC7TJ1.js.map} +1 -1
  161. package/dist/admin/assets/media-CbGSd_Mw.js +2 -0
  162. package/dist/admin/assets/{media-BCnVhaDH.js.map → media-CbGSd_Mw.js.map} +1 -1
  163. package/dist/admin/assets/{media-CURizGns.js → media-CeZGDGh7.js} +2 -2
  164. package/dist/admin/assets/{media-CURizGns.js.map → media-CeZGDGh7.js.map} +1 -1
  165. package/dist/admin/assets/network-BflLSKFO.js +2 -0
  166. package/dist/admin/assets/network-BflLSKFO.js.map +1 -0
  167. package/dist/admin/assets/{plus-BoDtdLCo.js → plus-cr9ZfO6j.js} +2 -2
  168. package/dist/admin/assets/{plus-BoDtdLCo.js.map → plus-cr9ZfO6j.js.map} +1 -1
  169. package/dist/admin/assets/publishing-BkxBplUZ.js +2 -0
  170. package/dist/admin/assets/publishing-BkxBplUZ.js.map +1 -0
  171. package/dist/admin/assets/{radio-group-4ok5evXq.js → radio-group-CRuWQnuV.js} +2 -2
  172. package/dist/admin/assets/{radio-group-4ok5evXq.js.map → radio-group-CRuWQnuV.js.map} +1 -1
  173. package/dist/admin/assets/{rotate-ccw-DL6TzcZh.js → rotate-ccw-BP8Ba-mY.js} +2 -2
  174. package/dist/admin/assets/{rotate-ccw-DL6TzcZh.js.map → rotate-ccw-BP8Ba-mY.js.map} +1 -1
  175. package/dist/admin/assets/schedules-BIyBlsYZ.js +2 -0
  176. package/dist/admin/assets/{schedules-BmB9Y73z.js.map → schedules-BIyBlsYZ.js.map} +1 -1
  177. package/dist/admin/assets/schema-6eUoC8fJ.js +2 -0
  178. package/dist/admin/assets/schema-6eUoC8fJ.js.map +1 -0
  179. package/dist/admin/assets/{scroll-text-PqeZm472.js → scroll-text-B5vfi9fD.js} +2 -2
  180. package/dist/admin/assets/{scroll-text-PqeZm472.js.map → scroll-text-B5vfi9fD.js.map} +1 -1
  181. package/dist/admin/assets/{search-BdwIwOzC.js → search-wj7zbkx1.js} +2 -2
  182. package/dist/admin/assets/{search-BdwIwOzC.js.map → search-wj7zbkx1.js.map} +1 -1
  183. package/dist/admin/assets/{searchSchemas-CSScloG8.js → searchSchemas-DAnwh3I3.js} +2 -2
  184. package/dist/admin/assets/{searchSchemas-CSScloG8.js.map → searchSchemas-DAnwh3I3.js.map} +1 -1
  185. package/dist/admin/assets/{sections-DqBzSKMP.js → sections-CWL-XD6m.js} +2 -2
  186. package/dist/admin/assets/sections-CWL-XD6m.js.map +1 -0
  187. package/dist/admin/assets/{sections-BTS683ur.js → sections-DBQpB0uv.js} +2 -2
  188. package/dist/admin/assets/{sections-BTS683ur.js.map → sections-DBQpB0uv.js.map} +1 -1
  189. package/dist/admin/assets/{select-C0USI-Ox.js → select-DVrPV1b3.js} +2 -2
  190. package/dist/admin/assets/{select-C0USI-Ox.js.map → select-DVrPV1b3.js.map} +1 -1
  191. package/dist/admin/assets/{send-XPWo3m4u.js → send-CzFdgUc_.js} +2 -2
  192. package/dist/admin/assets/{send-XPWo3m4u.js.map → send-CzFdgUc_.js.map} +1 -1
  193. package/dist/admin/assets/seo-Bd0sWQMo.js +2 -0
  194. package/dist/admin/assets/{seo-CceGYTIX.js.map → seo-Bd0sWQMo.js.map} +1 -1
  195. package/dist/admin/assets/settings-CqnrPmzR.js +2 -0
  196. package/dist/admin/assets/{settings-B60vHpZd.js.map → settings-CqnrPmzR.js.map} +1 -1
  197. package/dist/admin/assets/shapes-ZAkMBB-Z.js +6 -0
  198. package/dist/admin/assets/shapes-ZAkMBB-Z.js.map +1 -0
  199. package/dist/admin/assets/{skeleton-B5MP72Kw.js → skeleton-CiX26LnL.js} +2 -2
  200. package/dist/admin/assets/{skeleton-B5MP72Kw.js.map → skeleton-CiX26LnL.js.map} +1 -1
  201. package/dist/admin/assets/{snapshots-DUI2t-qF.js → snapshots-DbFQNJgN.js} +2 -2
  202. package/dist/admin/assets/{snapshots-DUI2t-qF.js.map → snapshots-DbFQNJgN.js.map} +1 -1
  203. package/dist/admin/assets/{sparkles-CvT-jxrW.js → sparkles-D_kmZJVd.js} +2 -2
  204. package/dist/admin/assets/{sparkles-CvT-jxrW.js.map → sparkles-D_kmZJVd.js.map} +1 -1
  205. package/dist/admin/assets/src-CMor9izq.js +7 -0
  206. package/dist/admin/assets/src-CMor9izq.js.map +1 -0
  207. package/dist/admin/assets/{stableId-BrtQedPy.js → stableId-g1uxJGSz.js} +2 -2
  208. package/dist/admin/assets/{stableId-BrtQedPy.js.map → stableId-g1uxJGSz.js.map} +1 -1
  209. package/dist/admin/assets/{store-CdIFG90N.js → store-CznhNKEi.js} +2 -2
  210. package/dist/admin/assets/{store-CdIFG90N.js.map → store-CznhNKEi.js.map} +1 -1
  211. package/dist/admin/assets/{switch-Dp6WYNam.js → switch-CiVf05NF.js} +2 -2
  212. package/dist/admin/assets/{switch-Dp6WYNam.js.map → switch-CiVf05NF.js.map} +1 -1
  213. package/dist/admin/assets/{theme-65PB8uAu.js → theme-Cv-MfOv8.js} +2 -2
  214. package/dist/admin/assets/theme-Cv-MfOv8.js.map +1 -0
  215. package/dist/admin/assets/titles-DrQhW8z3.js +2 -0
  216. package/dist/admin/assets/titles-DrQhW8z3.js.map +1 -0
  217. package/dist/admin/assets/tokens-B1S81Epe.js +2 -0
  218. package/dist/admin/assets/{tokens-ixHjAkDK.js.map → tokens-B1S81Epe.js.map} +1 -1
  219. package/dist/admin/assets/{tooltip-BGP1DVBt.js → tooltip-Bqf3oyqC.js} +2 -2
  220. package/dist/admin/assets/{tooltip-BGP1DVBt.js.map → tooltip-Bqf3oyqC.js.map} +1 -1
  221. package/dist/admin/assets/{undo-2-BiTANHFz.js → undo-2-DpwwRQTf.js} +2 -2
  222. package/dist/admin/assets/{undo-2-BiTANHFz.js.map → undo-2-DpwwRQTf.js.map} +1 -1
  223. package/dist/admin/assets/useContentSchema-B_q1rMrG.js +2 -0
  224. package/dist/admin/assets/useContentSchema-B_q1rMrG.js.map +1 -0
  225. package/dist/admin/assets/useCursorPager-BHYqHb3M.js +2 -0
  226. package/dist/admin/assets/{useCursorPager-0zHjlm-7.js.map → useCursorPager-BHYqHb3M.js.map} +1 -1
  227. package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js → useDiscardGuard-C4QTfiU4.js} +2 -2
  228. package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js.map → useDiscardGuard-C4QTfiU4.js.map} +1 -1
  229. package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js → useMediaPickerDialog-BLrVV1Kn.js} +2 -2
  230. package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js.map → useMediaPickerDialog-BLrVV1Kn.js.map} +1 -1
  231. package/dist/admin/assets/{useMediaUploader-CBcq1ICg.js → useMediaUploader-CFy6lasO.js} +2 -2
  232. package/dist/admin/assets/useMediaUploader-CFy6lasO.js.map +1 -0
  233. package/dist/admin/assets/useModelIndex-NU-WlHQY.js +2 -0
  234. package/dist/admin/assets/useModelIndex-NU-WlHQY.js.map +1 -0
  235. package/dist/admin/assets/useNetworkPermission-DehDln-U.js +2 -0
  236. package/dist/admin/assets/{useNetworkPermission-Cts98h9d.js.map → useNetworkPermission-DehDln-U.js.map} +1 -1
  237. package/dist/admin/assets/{usePaletteItems-DtReWmkd.js → usePaletteItems-CFpNlSOs.js} +2 -2
  238. package/dist/admin/assets/{usePaletteItems-DtReWmkd.js.map → usePaletteItems-CFpNlSOs.js.map} +1 -1
  239. package/dist/admin/assets/usePlaces-BA4x6503.js +2 -0
  240. package/dist/admin/assets/usePlaces-BA4x6503.js.map +1 -0
  241. package/dist/admin/assets/useResolvedDefinitions-30lnwFQ1.js +2 -0
  242. package/dist/admin/assets/useResolvedDefinitions-30lnwFQ1.js.map +1 -0
  243. package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js → useResolvedScheme-BVM4qLct.js} +2 -2
  244. package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js.map → useResolvedScheme-BVM4qLct.js.map} +1 -1
  245. package/dist/admin/assets/useSaveShortcut-DQuNL1uJ.js +2 -0
  246. package/dist/admin/assets/useSaveShortcut-DQuNL1uJ.js.map +1 -0
  247. package/dist/admin/assets/{useSchemaScopeAccess-ByrxIdKM.js → useSchemaScopeAccess-JXOMx51q.js} +2 -2
  248. package/dist/admin/assets/{useSchemaScopeAccess-ByrxIdKM.js.map → useSchemaScopeAccess-JXOMx51q.js.map} +1 -1
  249. package/dist/admin/assets/users-38jLQ7zr.js +2 -0
  250. package/dist/admin/assets/users-38jLQ7zr.js.map +1 -0
  251. package/dist/admin/assets/{users-DM7CXUBJ.js → users-DYwcVDqp.js} +2 -2
  252. package/dist/admin/assets/{users-DM7CXUBJ.js.map → users-DYwcVDqp.js.map} +1 -1
  253. package/dist/admin/assets/{zod-Cry7YvLY.js → zod-ZaQjjiAq.js} +2 -2
  254. package/dist/admin/assets/{zod-Cry7YvLY.js.map → zod-ZaQjjiAq.js.map} +1 -1
  255. package/dist/admin/index.html +60 -58
  256. package/dist/cli.js +1 -1
  257. package/dist/{cliMain-papyXJDd.js → cliMain-CTntiVc2.js} +107 -30
  258. package/dist/cliMain-CTntiVc2.js.map +1 -0
  259. package/dist/config.d.ts +2 -2
  260. package/dist/config.js +1 -1
  261. package/dist/{contentDisposition-DOL2Xt0l.js → contentDisposition-DzhPhncr.js} +2 -2
  262. package/dist/{contentDisposition-DOL2Xt0l.js.map → contentDisposition-DzhPhncr.js.map} +1 -1
  263. package/dist/index.d.ts +43 -6
  264. package/dist/index.js +2 -2
  265. package/dist/{public-COKbHR-N.d.ts → public-CMFaGDyf.d.ts} +50 -8
  266. package/dist/{public-B57h4F7Y.js → public-sJCQaNaP.js} +2 -2
  267. package/dist/public-sJCQaNaP.js.map +1 -0
  268. package/dist/{s3Adapter-U01iEAcK.js → s3Adapter-CZcCl0sy.js} +2 -2
  269. package/dist/{s3Adapter-U01iEAcK.js.map → s3Adapter-CZcCl0sy.js.map} +1 -1
  270. package/dist/{worker-B-sC-eY2.js → worker-DHm2JwMZ.js} +3140 -1292
  271. package/dist/worker-DHm2JwMZ.js.map +1 -0
  272. package/package.json +5 -5
  273. package/dist/admin/assets/AssistError-Cs-r9Ssc.js +0 -2
  274. package/dist/admin/assets/Body-BzZD-TZT.js +0 -2
  275. package/dist/admin/assets/Body-BzZD-TZT.js.map +0 -1
  276. package/dist/admin/assets/Builder-DW-GJA_q.js +0 -2
  277. package/dist/admin/assets/Builder-DW-GJA_q.js.map +0 -1
  278. package/dist/admin/assets/Form-lNrRHc0I.js +0 -2
  279. package/dist/admin/assets/Form-lNrRHc0I.js.map +0 -1
  280. package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js +0 -2
  281. package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js.map +0 -1
  282. package/dist/admin/assets/FormSelectField-BzE9Lq9i.js +0 -2
  283. package/dist/admin/assets/FormSelectField-BzE9Lq9i.js.map +0 -1
  284. package/dist/admin/assets/RadioTile-DQFmni5A.js.map +0 -1
  285. package/dist/admin/assets/RichTextField-CVHRIbnu.js.map +0 -1
  286. package/dist/admin/assets/StepList-BXGYD9eJ.js +0 -2
  287. package/dist/admin/assets/StepList-BXGYD9eJ.js.map +0 -1
  288. package/dist/admin/assets/Structure-D8csgrIt.js +0 -2
  289. package/dist/admin/assets/SubNavLink-CiCaVV8U.js.map +0 -1
  290. package/dist/admin/assets/auth-CQO4MBUj.js +0 -2
  291. package/dist/admin/assets/changeSets-8EburmT0.js +0 -2
  292. package/dist/admin/assets/chevron-left-DGU3HGYG.js +0 -2
  293. package/dist/admin/assets/content-CAjkbZEY.js +0 -3
  294. package/dist/admin/assets/content-CAjkbZEY.js.map +0 -1
  295. package/dist/admin/assets/createLucideIcon-CLmh7Go-.js +0 -2
  296. package/dist/admin/assets/createLucideIcon-CLmh7Go-.js.map +0 -1
  297. package/dist/admin/assets/develop-BOqvnlgt.js +0 -11
  298. package/dist/admin/assets/develop-BOqvnlgt.js.map +0 -1
  299. package/dist/admin/assets/es2015-BHmI7wjK.js +0 -42
  300. package/dist/admin/assets/es2015-BHmI7wjK.js.map +0 -1
  301. package/dist/admin/assets/followPlural-Cm7v_Udv.js +0 -2
  302. package/dist/admin/assets/followPlural-Cm7v_Udv.js.map +0 -1
  303. package/dist/admin/assets/inbox-DGO2D8fa.js +0 -2
  304. package/dist/admin/assets/inbox-DGO2D8fa.js.map +0 -1
  305. package/dist/admin/assets/index-BIIU9ZI6.js +0 -4
  306. package/dist/admin/assets/index-BIIU9ZI6.js.map +0 -1
  307. package/dist/admin/assets/index-lxe7WimO.css +0 -2
  308. package/dist/admin/assets/locales-Bg3htKo8.js +0 -2
  309. package/dist/admin/assets/media-BCnVhaDH.js +0 -2
  310. package/dist/admin/assets/network-BixABr0o.js +0 -2
  311. package/dist/admin/assets/network-BixABr0o.js.map +0 -1
  312. package/dist/admin/assets/publishing-Dke9bSKp.js +0 -2
  313. package/dist/admin/assets/publishing-Dke9bSKp.js.map +0 -1
  314. package/dist/admin/assets/schedules-BmB9Y73z.js +0 -2
  315. package/dist/admin/assets/schema-D-qo7XSF.js +0 -2
  316. package/dist/admin/assets/schema-D-qo7XSF.js.map +0 -1
  317. package/dist/admin/assets/sections-DqBzSKMP.js.map +0 -1
  318. package/dist/admin/assets/seo-CceGYTIX.js +0 -2
  319. package/dist/admin/assets/settings-B60vHpZd.js +0 -2
  320. package/dist/admin/assets/shapes-B5twqZcp.js +0 -6
  321. package/dist/admin/assets/shapes-B5twqZcp.js.map +0 -1
  322. package/dist/admin/assets/src-ndgTSYLX.js +0 -7
  323. package/dist/admin/assets/src-ndgTSYLX.js.map +0 -1
  324. package/dist/admin/assets/theme-65PB8uAu.js.map +0 -1
  325. package/dist/admin/assets/titles-CQiqqDw-.js +0 -2
  326. package/dist/admin/assets/titles-CQiqqDw-.js.map +0 -1
  327. package/dist/admin/assets/tokens-ixHjAkDK.js +0 -2
  328. package/dist/admin/assets/useContentSchema-DtYfhsd2.js +0 -2
  329. package/dist/admin/assets/useContentSchema-DtYfhsd2.js.map +0 -1
  330. package/dist/admin/assets/useCursorPager-0zHjlm-7.js +0 -2
  331. package/dist/admin/assets/useMediaUploader-CBcq1ICg.js.map +0 -1
  332. package/dist/admin/assets/useNetworkPermission-Cts98h9d.js +0 -2
  333. package/dist/admin/assets/usePlaces-DC47wVeU.js +0 -2
  334. package/dist/admin/assets/usePlaces-DC47wVeU.js.map +0 -1
  335. package/dist/admin/assets/useQueries-CirW3Mvp.js +0 -2
  336. package/dist/admin/assets/useQueries-CirW3Mvp.js.map +0 -1
  337. package/dist/admin/assets/useSaveShortcut-rKtp1qK7.js +0 -2
  338. package/dist/admin/assets/useSaveShortcut-rKtp1qK7.js.map +0 -1
  339. package/dist/admin/assets/users-2iJYwlJb.js +0 -2
  340. package/dist/admin/assets/users-2iJYwlJb.js.map +0 -1
  341. package/dist/cliMain-papyXJDd.js.map +0 -1
  342. package/dist/public-B57h4F7Y.js.map +0 -1
  343. package/dist/worker-B-sC-eY2.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-65PB8uAu.js","names":["persistentStorage","persist","create","THEME_KEY_PATTERN","THEME_VARIANTS","resolveScheme","variants","appearance","lookValue","theme","variant","BUILT_IN_THEMES","DEFAULT_THEME_KEY","DEFAULT_THEME_VARIANTS","THEME_STORAGE_KEY","THEME_STORAGE_VERSION","DEFAULT_THEME_STATE","LEGACY_THEME_STATE","isRecord","value","isThemeVariant","migrateThemeState","version","sanitizeThemeState","persisted","state","cached","meta","useThemeStore","set","current"],"sources":["../../src/helpers/theme.ts","../../src/constants/themes.ts","../../src/stores/theme.ts"],"sourcesContent":["import type { ThemeVariant } from '@shapio/schema';\n\n/**\n * The variant actually rendered: the saved one when the theme has it, else the theme's first. Nothing follows\n * the operating system. public/theme-init.js repeats this before first paint (test/themeInit.test.ts keeps\n * the two in step).\n */\nexport const resolveScheme = (appearance: ThemeVariant, variants: readonly ThemeVariant[]): ThemeVariant =>\n variants.includes(appearance) ? appearance : (variants[0] ?? appearance);\n\n/** A look is one variant of one theme; its radio value is `<theme key>:<variant>` (keys never hold a colon). */\nexport const lookValue = (theme: string, variant: ThemeVariant) => `${theme}:${variant}`;\n","import type { BuiltInThemeKey, ThemeVariant } from '@shapio/schema';\n\nexport type BuiltInThemeMeta = {\n key: BuiltInThemeKey;\n /** The one variant the theme defines (styles/themes/<key>.css): every built-in theme is a single look. */\n variants: readonly ThemeVariant[];\n};\n\n/** The admin's own looks, in menu order: dark, then light. Names and descriptions: `appearance.themes.<key>.*`. */\nexport const BUILT_IN_THEMES: readonly BuiltInThemeMeta[] = [\n { key: 'shapio', variants: ['dark'] },\n { key: 'classic', variants: ['dark'] },\n { key: 'murdered-out', variants: ['dark'] },\n { key: 'forest', variants: ['dark'] },\n { key: 'snowed', variants: ['light'] },\n { key: 'butter', variants: ['light'] },\n];\n\nexport const DEFAULT_THEME_KEY: BuiltInThemeKey = 'shapio';\n\nexport const DEFAULT_THEME_VARIANTS: readonly ThemeVariant[] = ['dark'];\n","import { THEME_KEY_PATTERN, THEME_VARIANTS, type ThemeVariant } from '@shapio/schema';\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { BUILT_IN_THEMES, DEFAULT_THEME_KEY, DEFAULT_THEME_VARIANTS } from '@/constants/themes';\nimport { persistentStorage } from '@/helpers/safeStorage';\nimport { resolveScheme } from '@/helpers/theme';\n\ntype ThemeState = {\n /** A theme key: built in (constants/themes.ts) or declared by an extension. */\n theme: string;\n /** The variant of that theme the person picked (a look is one theme in one variant). */\n appearance: ThemeVariant;\n /**\n * The chosen theme's variants, cached so public/theme-init.js can render an extension theme's look before\n * the admin has loaded the theme list.\n */\n variants: readonly ThemeVariant[];\n setLook: (theme: string, appearance: ThemeVariant, variants: readonly ThemeVariant[]) => void;\n};\n\n/** Key and shape are read before first paint by public/theme-init.js; keep them in sync. */\nexport const THEME_STORAGE_KEY = 'shapio.theme';\n\n/** 1: `{ preference }`, before themes. 2: themes plus System / Light / Dark. 3: one look, nothing follows the OS. */\nconst THEME_STORAGE_VERSION = 3;\n\ntype PersistedTheme = Pick<ThemeState, 'theme' | 'appearance' | 'variants'>;\n\nexport const DEFAULT_THEME_STATE: PersistedTheme = {\n theme: DEFAULT_THEME_KEY,\n appearance: 'dark',\n variants: DEFAULT_THEME_VARIANTS,\n};\n\n/** Version 1 (the original palette, any colour mode) becomes Cobalt, the original dark look. */\nconst LEGACY_THEME_STATE: PersistedTheme = { theme: 'classic', appearance: 'dark', variants: ['dark'] };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst isThemeVariant = (value: unknown): value is ThemeVariant =>\n typeof value === 'string' && (THEME_VARIANTS as readonly string[]).includes(value);\n\nexport const migrateThemeState = (persisted: unknown, version: number): PersistedTheme =>\n version < 2 ? LEGACY_THEME_STATE : sanitizeThemeState(isRecord(persisted) ? persisted : {});\n\n/**\n * Drops anything malformed (edited storage, an older admin) back to the defaults, field by field. A built-in\n * theme's variants come from the registry, not the cache (they changed in version 3), and the appearance is\n * always a variant the theme has: version 2's \"system\", or a variant a theme lost, becomes its first.\n */\nconst sanitizeThemeState = (state: Record<string, unknown>): PersistedTheme => {\n const theme =\n typeof state.theme === 'string' && THEME_KEY_PATTERN.test(state.theme)\n ? state.theme\n : DEFAULT_THEME_STATE.theme;\n const cached = Array.isArray(state.variants)\n ? THEME_VARIANTS.filter((variant) => (state.variants as unknown[]).includes(variant))\n : [];\n const variants =\n BUILT_IN_THEMES.find((meta) => meta.key === theme)?.variants ??\n (cached.length > 0 ? cached : DEFAULT_THEME_STATE.variants);\n const appearance = isThemeVariant(state.appearance) ? state.appearance : (variants[0] ?? 'dark');\n return { theme, appearance: resolveScheme(appearance, variants), variants };\n};\n\nexport const useThemeStore = create<ThemeState>()(\n persist(\n (set) => ({\n ...DEFAULT_THEME_STATE,\n setLook: (theme, appearance, variants) => set({ theme, appearance, variants }),\n }),\n {\n name: THEME_STORAGE_KEY,\n storage: persistentStorage,\n version: THEME_STORAGE_VERSION,\n migrate: migrateThemeState,\n partialize: ({ theme, appearance, variants }) => ({ theme, appearance, variants }),\n merge: (persisted, current) => ({\n ...current,\n ...sanitizeThemeState(isRecord(persisted) ? persisted : {}),\n }),\n },\n ),\n);\n"],"mappings":"qEAOA,IAAaK,GAAiB,EAA0B,IACtDC,EAAS,SAASC,CAAU,EAAIA,EAAcD,EAAS,IAAMC,EAGlDC,GAAa,EAAe,IAA0B,GAAGC,EAAM,GAAGC,ICFlEC,EAA+C,CAC1D,CAAE,IAAK,SAAU,SAAU,CAAC,MAAM,CAAE,EACpC,CAAE,IAAK,UAAW,SAAU,CAAC,MAAM,CAAE,EACrC,CAAE,IAAK,eAAgB,SAAU,CAAC,MAAM,CAAE,EAC1C,CAAE,IAAK,SAAU,SAAU,CAAC,MAAM,CAAE,EACpC,CAAE,IAAK,SAAU,SAAU,CAAC,OAAO,CAAE,EACrC,CAAE,IAAK,SAAU,SAAU,CAAC,OAAO,CAAE,CACvC,EAEaC,EAAqC,SAErCC,EAAkD,CAAC,MAAM,ECCzDC,EAAoB,eAG3BC,EAAwB,EAIjBC,EAAsC,CACjD,MAAOJ,EACP,WAAY,OACZ,SAAUC,CACZ,EAGMI,EAAqC,CAAE,MAAO,UAAW,WAAY,OAAQ,SAAU,CAAC,MAAM,CAAE,EAEhGC,EAAY,GAChB,OAAOC,GAAU,YAAYA,EAEzBC,EAAkB,GACtB,OAAOD,GAAU,UAAaf,EAAqC,SAASe,CAAK,EAEtEE,GAAqB,EAAoB,IACpDC,EAAU,EAAIL,EAAqBM,EAAmBL,EAASM,CAAS,EAAIA,EAAY,CAAC,CAAC,EAOtFD,EAAsB,GAAmD,CAC7E,IAAMd,EACJ,OAAOgB,EAAM,OAAU,UAAYtB,EAAkB,KAAKsB,EAAM,KAAK,EACjEA,EAAM,MACNT,EAAoB,MACpBU,EAAS,MAAM,QAAQD,EAAM,QAAQ,EACvCrB,EAAe,OAAQ,GAAaqB,EAAM,SAAuB,SAASf,CAAO,CAAC,EAClF,CAAC,EACCJ,EACJK,EAAgB,KAAM,GAASgB,EAAK,MAAQlB,CAAK,CAAC,EAAE,WACnDiB,EAAO,OAAS,EAAIA,EAASV,EAAoB,UAEpD,MAAO,CAAE,QAAO,WAAYX,EADTe,EAAeK,EAAM,UAAU,EAAIA,EAAM,WAAcnB,EAAS,IAAM,OACnCA,CAAQ,EAAG,UAAS,CAC5E,EAEasB,EAAgB1B,EAAmB,CAAC,CAC/CD,EACG,IAAS,CACR,GAAGe,EACH,SAAU,EAAO,EAAY,IAAaa,EAAI,CAAE,QAAO,aAAY,UAAS,CAAC,CAC/E,GACA,CACE,KAAMf,EACN,QAASd,EACT,QAASe,EACT,QAASM,EACT,YAAa,CAAE,QAAO,aAAY,eAAgB,CAAE,QAAO,aAAY,UAAS,GAChF,OAAQ,EAAW,KAAa,CAC9B,GAAGS,EACH,GAAGP,EAAmBL,EAASM,CAAS,EAAIA,EAAY,CAAC,CAAC,CAC5D,EACF,CACF,CACF"}
@@ -1,2 +0,0 @@
1
- import{A as e,Ht as t,Pt as n,Vt as r,bn as i,ct as a,j as o,un as s,ut as c}from"./src-ndgTSYLX.js";import{tt as l}from"./auth-CQO4MBUj.js";var u={silent:!0},d=(e,t)=>l({queryKey:n.content.list(e,t),queryFn:()=>c.content.list(e,t),placeholderData:s,meta:u}),f=(e,n,r=!0)=>t({...d(e,n),enabled:r}),p=(e,t,r)=>l({queryKey:n.content.entry(e,t,r),queryFn:()=>c.content.get(e,t,r?{locale:r}:{}),staleTime:1/0,meta:u}),m=(e,n,r,i=!0)=>t({...p(e,n,r),enabled:i}),h=(e,t,r)=>(e.setQueryData(n.content.entry(t,r.id,r.locale),r),e.invalidateQueries({predicate:e=>e.queryKey[0]===`content`&&e.queryKey[1]===t&&(e.queryKey[2]===`list`||e.queryKey[2]===`revisions`)})),g=e=>{let t=i();return r({mutationKey:[`content`,e,`create`],meta:u,mutationFn:t=>a(()=>c.content.create(e,t)),onSuccess:n=>h(t,e,n)})},_=e=>{let t=i();return r({mutationKey:[`content`,e,`save`],meta:u,mutationFn:({id:t,input:n})=>a(()=>c.content.update(e,t,n)),onSuccess:n=>h(t,e,n)})},v=e=>e&&e.length>0?{locales:e}:{},y=e=>{let t=i();return r({mutationKey:[`content`,e,`publish`],meta:u,mutationFn:({id:t,locales:n,...r})=>a(()=>c.content.publish(e,t,{...v(n),...r})),onSuccess:n=>h(t,e,n)})},b=e=>{let t=i();return r({mutationKey:[`content`,e,`unpublish`],meta:u,mutationFn:({id:t,locales:n})=>a(()=>c.content.unpublish(e,t,v(n))),onSuccess:n=>h(t,e,n)})},x=e=>{let t=i();return r({mutationKey:[`content`,e,`duplicate`],mutationFn:t=>a(()=>c.content.duplicate(e,t)),onSuccess:n=>h(t,e,n)})},S=e=>{let t=i();return r({mutationKey:[`content`,e,`delete`],meta:u,mutationFn:t=>a(()=>c.content.remove(e,t)),onSuccess:()=>t.invalidateQueries({queryKey:n.content.model(e)})})},C=(e,r,i,a)=>t({queryKey:n.content.revisions(e,r,i),queryFn:()=>c.content.history(e,r,i?{locale:i}:{}),enabled:a,staleTime:0,meta:u}),w=(e,r,i)=>t({queryKey:n.content.revision(e,r,i??``),queryFn:()=>c.content.revision(e,r,i??``),enabled:i!==void 0,staleTime:1/0,meta:u}),T=e=>{let t=i();return r({mutationKey:[`content`,e,`restore`],meta:u,mutationFn:({id:t,revisionId:n,expectedVersion:r})=>a(()=>c.content.restore(e,t,n,r)),onSuccess:n=>h(t,e,n)})},E=e=>o(e),D=t=>{let n=E(t);return n!==void 0&&e.has(n.type)},O=(e,t)=>{let n=E(e),r=n?t[n.apiKey]:void 0;return typeof r==`string`&&r.trim()!==``?r:typeof r==`number`?String(r):void 0},k=e=>e.slice(0,8),A=(e,t,n)=>O(e,t.data)??`${n} · ${k(t.id)}`;export{_,E as a,g as c,m as d,C as f,w as g,T as h,k as i,S as l,y as m,D as n,d as o,f as p,A as r,p as s,O as t,x as u,b as v};
2
- //# sourceMappingURL=titles-CQiqqDw-.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"titles-CQiqqDw-.js","names":["TEXT_TITLE_FIELD_TYPES","useQuery","queryKeys","useMutation","useQueryClient","withCsrf","effectiveTitleField","keepPreviousData","adminApi","queryOptions","silent","entryListQueryOptions","modelKey","query","useEntryList","entryQueryOptions","id","locale","useEntry","rememberEntry","queryClient","entry","useCreateEntry","input","useSaveEntry","localesBody","locales","usePublishEntry","versions","useUnpublishEntry","useDuplicateEntry","useDeleteEntry","useEntryHistory","useRevision","revisionId","useRestoreRevision","expectedVersion","titleFieldOf","model","isSearchable","title","entryTitle","value","data","shortId","labelOf","item","untitled"],"sources":["../../src/api/content.ts","../../src/fields/helpers/titles.ts"],"sourcesContent":["import type { AdminEntry, ContentListQuery, CreateEntryInput, UpdateEntryInput } from '@shapio/client';\nimport {\n keepPreviousData,\n queryOptions,\n useMutation,\n useQuery,\n useQueryClient,\n type QueryClient,\n} from '@tanstack/react-query';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\n/**\n * Content of any model (`/api/admin/content/:modelKey`). Mutations are silent: the entry form and list\n * show failures themselves (inline issues, the conflict dialog, the \"still referenced\" explanation).\n */\nconst silent = { silent: true } as const;\n\nexport const entryListQueryOptions = (modelKey: string, query: ContentListQuery) =>\n queryOptions({\n queryKey: queryKeys.content.list(modelKey, query),\n queryFn: () => adminApi.content.list(modelKey, query),\n placeholderData: keepPreviousData,\n meta: silent,\n });\n\nexport const useEntryList = (modelKey: string, query: ContentListQuery, enabled = true) =>\n useQuery({ ...entryListQueryOptions(modelKey, query), enabled });\n\nexport const entryQueryOptions = (modelKey: string, id: string, locale: string | undefined) =>\n queryOptions({\n queryKey: queryKeys.content.entry(modelKey, id, locale),\n queryFn: () => adminApi.content.get(modelKey, id, locale ? { locale } : {}),\n // The form owns the values once loaded; it is refreshed explicitly (conflicts, restores, locales).\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useEntry = (modelKey: string, id: string, locale: string | undefined, enabled = true) =>\n useQuery({ ...entryQueryOptions(modelKey, id, locale), enabled });\n\n/** Remembers a write's result as the entry's latest state and refreshes that model's lists. */\nconst rememberEntry = (queryClient: QueryClient, modelKey: string, entry: AdminEntry) => {\n queryClient.setQueryData(queryKeys.content.entry(modelKey, entry.id, entry.locale), entry);\n return queryClient.invalidateQueries({\n predicate: (query) =>\n query.queryKey[0] === 'content' &&\n query.queryKey[1] === modelKey &&\n (query.queryKey[2] === 'list' || query.queryKey[2] === 'revisions'),\n });\n};\n\nexport const useCreateEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'create'],\n meta: silent,\n mutationFn: (input: CreateEntryInput) => withCsrf(() => adminApi.content.create(modelKey, input)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useSaveEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'save'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateEntryInput }) =>\n withCsrf(() => adminApi.content.update(modelKey, id, input)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\n/** Omitting `locales` targets the request's default locale; it is the only form a non-localized model accepts. */\ntype LocalesVariables = { id: string; locales?: string[] };\n\n/** The body never carries an empty `locales` array: the API requires at least one locale when it is sent. */\nconst localesBody = (locales?: string[]) => (locales && locales.length > 0 ? { locales } : {});\n\n/** The draft version(s) the editor saw: the API refuses (409) to publish a draft that moved since. */\ntype PublishVariables = LocalesVariables & {\n expectedVersion?: number;\n expectedVersions?: Record<string, number>;\n};\n\nexport const usePublishEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'publish'],\n meta: silent,\n mutationFn: ({ id, locales, ...versions }: PublishVariables) =>\n withCsrf(() => adminApi.content.publish(modelKey, id, { ...localesBody(locales), ...versions })),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useUnpublishEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'unpublish'],\n meta: silent,\n mutationFn: ({ id, locales }: LocalesVariables) =>\n withCsrf(() => adminApi.content.unpublish(modelKey, id, localesBody(locales))),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\nexport const useDuplicateEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'duplicate'],\n mutationFn: (id: string) => withCsrf(() => adminApi.content.duplicate(modelKey, id)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n\n/** 409 ENTRY_REFERENCED comes back to the caller, which explains what still points at the entry. */\nexport const useDeleteEntry = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'delete'],\n meta: silent,\n mutationFn: (id: string) => withCsrf(() => adminApi.content.remove(modelKey, id)),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.content.model(modelKey) }),\n });\n};\n\n/** The entry's revisions (with authors) and publications in a locale, for the history sheet. */\nexport const useEntryHistory = (modelKey: string, id: string, locale: string | undefined, enabled: boolean) =>\n useQuery({\n queryKey: queryKeys.content.revisions(modelKey, id, locale),\n queryFn: () => adminApi.content.history(modelKey, id, locale ? { locale } : {}),\n enabled,\n staleTime: 0,\n meta: silent,\n });\n\nexport const useRevision = (modelKey: string, id: string, revisionId: string | undefined) =>\n useQuery({\n queryKey: queryKeys.content.revision(modelKey, id, revisionId ?? ''),\n queryFn: () => adminApi.content.revision(modelKey, id, revisionId ?? ''),\n enabled: revisionId !== undefined,\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useRestoreRevision = (modelKey: string) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['content', modelKey, 'restore'],\n meta: silent,\n mutationFn: ({\n id,\n revisionId,\n expectedVersion,\n }: {\n id: string;\n revisionId: string;\n expectedVersion: number;\n }) => withCsrf(() => adminApi.content.restore(modelKey, id, revisionId, expectedVersion)),\n onSuccess: (entry) => rememberEntry(queryClient, modelKey, entry),\n });\n};\n","import type { AdminEntryListItem } from '@shapio/client';\nimport {\n effectiveTitleField,\n TEXT_TITLE_FIELD_TYPES,\n type FieldDefinition,\n type ModelDefinition,\n} from '@shapio/schema';\n\n/**\n * The field that labels a model's entries in lists, pickers and relation summaries: the configured title\n * field, or the first text field when none is set (the same rule the API's `q` search uses).\n */\nexport const titleFieldOf = (model: ModelDefinition): FieldDefinition | undefined =>\n effectiveTitleField(model);\n\n/** Whether the list API's `q` search works for this model (it searches the title field, if it is text). */\nexport const isSearchable = (model: ModelDefinition): boolean => {\n const title = titleFieldOf(model);\n return title !== undefined && TEXT_TITLE_FIELD_TYPES.has(title.type);\n};\n\n/** An entry's label: its title field's text, or undefined (callers show \"Untitled\"). */\nexport const entryTitle = (\n model: ModelDefinition,\n data: Readonly<Record<string, unknown>>,\n): string | undefined => {\n const title = titleFieldOf(model);\n const value = title ? data[title.apiKey] : undefined;\n return typeof value === 'string' && value.trim() !== ''\n ? value\n : typeof value === 'number'\n ? String(value)\n : undefined;\n};\n\nexport const shortId = (id: string) => id.slice(0, 8);\n\nexport const labelOf = (\n model: ModelDefinition,\n item: Pick<AdminEntryListItem, 'id' | 'data'>,\n untitled: string,\n) => entryTitle(model, item.data) ?? `${untitled} · ${shortId(item.id)}`;\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{Ht as e,Pt as t,Vt as n,bn as r,ct as i,ut as a}from"./src-ndgTSYLX.js";var o=()=>e({queryKey:t.tokens,queryFn:()=>a.tokens.list(),meta:{silent:!0}}),s=()=>{let e=r();return n({mutationKey:[`tokens`,`create`],meta:{silent:!0},mutationFn:e=>i(()=>a.tokens.create(e)),onSuccess:()=>e.invalidateQueries({queryKey:t.tokens})})},c=()=>{let e=r();return n({mutationKey:[`tokens`,`revoke`],mutationFn:e=>i(()=>a.tokens.revoke(e)),onSettled:()=>e.invalidateQueries({queryKey:t.tokens})})};export{s as n,c as r,o as t};
2
- //# sourceMappingURL=tokens-ixHjAkDK.js.map
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{Q as n}from"./src-ndgTSYLX.js";import{a as r}from"./schema-D-qo7XSF.js";var i=e(t(),1),a=()=>{let{definitions:e,error:t}=r();return{schema:(0,i.useMemo)(()=>{if(!e)return;let t=new Map,r=new Map;for(let{definition:i}of e)n(i)?r.set(i.id,i):t.set(i.id,i);return{models:t,components:r,sortedModels:[...t.values()].sort((e,t)=>e.label.localeCompare(t.label))}},[e]),error:t}},o=(e,t)=>e.sortedModels.find(e=>e.apiKey===t);export{a as n,o as t};
2
- //# sourceMappingURL=useContentSchema-DtYfhsd2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useContentSchema-DtYfhsd2.js","names":["useMemo","__toESM","isComponentDefinition","useAllDefinitions","import_react","require_react","useContentSchema","definitions","models","components","definition","a","b","findModelByKey","schema","model","modelKey"],"sources":["../../src/features/Content/hooks/useContentSchema.ts"],"sourcesContent":["import { isComponentDefinition, type ComponentDefinition, type ModelDefinition } from '@shapio/schema';\nimport { useMemo } from 'react';\nimport { useAllDefinitions } from '@/api/schema';\n\nexport type ContentSchema = {\n models: ReadonlyMap<string, ModelDefinition>;\n components: ReadonlyMap<string, ComponentDefinition>;\n /** Collections and singletons, in label order (for navigation). */\n sortedModels: readonly ModelDefinition[];\n};\n\n/**\n * The active schema as the content screens need it. Models are data (CONTRIBUTING.md rule 2): routes carry a\n * model's API key and resolve it here at render time, so a model created a moment ago works at once.\n */\nexport const useContentSchema = (): { schema: ContentSchema | undefined; error: unknown } => {\n const { definitions, error } = useAllDefinitions();\n const schema = useMemo(() => {\n if (!definitions) {\n return undefined;\n }\n const models = new Map<string, ModelDefinition>();\n const components = new Map<string, ComponentDefinition>();\n for (const { definition } of definitions) {\n if (isComponentDefinition(definition)) {\n components.set(definition.id, definition);\n } else {\n models.set(definition.id, definition);\n }\n }\n const sortedModels = [...models.values()].sort((a, b) => a.label.localeCompare(b.label));\n return { models, components, sortedModels };\n }, [definitions]);\n return { schema, error };\n};\n\nexport const findModelByKey = (schema: ContentSchema, modelKey: string): ModelDefinition | undefined =>\n schema.sortedModels.find((model) => model.apiKey === modelKey);\n"],"mappings":"oLAeaM,MAAgF,CAC3F,GAAM,CAAE,cAAa,SAAUH,EAAkB,EAiBjD,MAAO,CAAE,QAAA,EAhBMH,EAAAA,QAAAA,KAAc,CAC3B,GAAI,CAACO,EACH,OAEF,IAAMC,EAAS,IAAI,IACbC,EAAa,IAAI,IACvB,IAAK,GAAM,CAAE,gBAAgBF,EACvBL,EAAsBQ,CAAU,EAClCD,EAAW,IAAIC,EAAW,GAAIA,CAAU,EAExCF,EAAO,IAAIE,EAAW,GAAIA,CAAU,EAIxC,MAAO,CAAE,SAAQ,aAAY,aADR,CAAC,GAAGF,EAAO,OAAO,CAAC,CAAC,CAAC,MAAM,EAAG,IAAMG,EAAE,MAAM,cAAcC,EAAE,KAAK,CACzD,CAAa,CAC5C,EAAG,CAACL,CAAW,CACN,EAAQ,OAAM,CACzB,EAEaM,GAAkB,EAAuB,IACpDC,EAAO,aAAa,KAAM,GAAUC,EAAM,SAAWC,CAAQ"}
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{Ht as n,Pt as r,Vt as i,bn as a,ct as o,un as s,ut as c}from"./src-ndgTSYLX.js";import{t as l}from"./createLucideIcon-CLmh7Go-.js";import{a as u,n as d,t as f}from"./publishing-B7zv1e7j.js";var p={name:`rocket`,size:24,node:[[`path`,{d:`M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5`,key:`qeys4`}],[`path`,{d:`M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09`,key:`u4xsad`}],[`path`,{d:`M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z`,key:`676m9`}],[`path`,{d:`M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05`,key:`92ym6u`}]]};p.node;var m=l(p),h=e(t(),1),g=(e,t,n,r)=>{(0,h.useEffect)(()=>{e&&(t(n),r())},[e,t,n,r])},_={silent:!0},v=e=>e?u:!1,y=()=>n({queryKey:r.publishing.deployments.connections,queryFn:()=>c.deployments.connections.list(),refetchInterval:e=>v(e.state.data?.some(e=>e.latestRun?d.has(e.latestRun.status):!1)??!1),meta:_}),b=e=>n({queryKey:r.publishing.deployments.connection(e),queryFn:()=>c.deployments.connections.get(e),refetchInterval:e=>v(e.state.data?.latestRun?d.has(e.state.data.latestRun.status):!1),meta:_}),x=e=>n({queryKey:r.publishing.deployments.runs(e),queryFn:()=>c.deployments.runs.list(e),placeholderData:s,refetchInterval:e=>v(e.state.data?.items.some(e=>d.has(e.status))??!1),meta:_}),S=e=>n({queryKey:r.publishing.deployments.run(e),queryFn:()=>c.deployments.runs.get(e),refetchInterval:e=>v(e.state.data?d.has(e.state.data.status):!1),meta:_}),C=()=>{let e=a();return()=>e.invalidateQueries({queryKey:r.publishing.deployments.all})},w=()=>{let e=C();return i({mutationKey:[`deployments`,`create`],meta:_,mutationFn:e=>o(()=>c.deployments.connections.create(e)),onSuccess:e})},T=()=>{let e=a(),t=C();return i({mutationKey:[`deployments`,`update`],meta:_,mutationFn:({id:e,input:t})=>o(()=>c.deployments.connections.update(e,t)),onSuccess:({generatedSecrets:n,...i})=>(e.setQueryData(r.publishing.deployments.connection(i.id),i),t())})},E=()=>{let e=a(),t=C();return i({mutationKey:[`deployments`,`delete`],mutationFn:e=>o(()=>c.deployments.connections.remove(e)),onSuccess:(n,i)=>(e.removeQueries({queryKey:r.publishing.deployments.connection(i)}),t())})},D=()=>i({mutationKey:[`deployments`,`test`],mutationFn:e=>o(()=>c.deployments.connections.test(e))}),O=()=>{let e=C();return i({mutationKey:[`deployments`,`trigger`],mutationFn:e=>o(()=>c.deployments.connections.trigger(e)),onSuccess:e})},k=()=>{let e=C();return i({mutationKey:[`deployments`,`retry`],mutationFn:e=>o(()=>c.deployments.runs.retry(e)),onSuccess:e})},A={publish:`publishing.actions.publish`,unpublish:`publishing.actions.unpublish`},j={generic_webhook:`publishing.deployments.providers.generic_webhook`,cloudflare_pages:`publishing.deployments.providers.cloudflare_pages`,vercel:`publishing.deployments.providers.vercel`,netlify:`publishing.deployments.providers.netlify`,github:`publishing.deployments.providers.github`},M={publish:`publishing.deployments.triggers.publish`,change_set:`publishing.deployments.triggers.changeSet`,schema:`publishing.deployments.triggers.schema`,manual:`publishing.deployments.triggers.manual`},N={publish:`publishing.deployments.runTriggers.publish`,change_set:`publishing.deployments.runTriggers.changeSet`,schema:`publishing.deployments.runTriggers.schema`,manual:`publishing.deployments.runTriggers.manual`,retry:`publishing.deployments.runTriggers.retry`},P={shapio:`publishing.deployments.sources.shapio`,callback:`publishing.deployments.sources.callback`,provider:`publishing.deployments.sources.provider`},F={silent:!0},I=()=>n({queryKey:r.publishing.webhooks.list,queryFn:()=>c.webhooks.list(),meta:F}),L=()=>n({queryKey:r.publishing.webhooks.events,queryFn:()=>c.webhooks.events(),staleTime:1/0,meta:F}),R=e=>n({queryKey:r.publishing.webhooks.webhook(e),queryFn:()=>c.webhooks.get(e),meta:F}),z=(e,t)=>n({queryKey:r.publishing.webhooks.deliveries(e,t),queryFn:()=>c.webhooks.deliveries(e,{cursor:t,limit:25}),placeholderData:s,refetchInterval:e=>e.state.data?.items.some(e=>f.has(e.status))?u:!1,meta:F}),B=()=>{let e=a();return()=>e.invalidateQueries({queryKey:r.publishing.webhooks.all})},V=()=>{let e=B();return i({mutationKey:[`webhooks`,`create`],meta:F,mutationFn:e=>o(()=>c.webhooks.create(e)),onSuccess:e})},H=()=>{let e=a(),t=B();return i({mutationKey:[`webhooks`,`update`],meta:F,mutationFn:({id:e,input:t})=>o(()=>c.webhooks.update(e,t)),onSuccess:n=>(e.setQueryData(r.publishing.webhooks.webhook(n.id),n),t())})},U=()=>{let e=B();return i({mutationKey:[`webhooks`,`delete`],mutationFn:e=>o(()=>c.webhooks.remove(e)),onSuccess:e})},W=()=>{let e=B();return i({mutationKey:[`webhooks`,`rotateSecret`],mutationFn:e=>o(()=>c.webhooks.rotateSecret(e)),onSuccess:e})},G=()=>{let e=B();return i({mutationKey:[`webhooks`,`test`],mutationFn:e=>o(()=>c.webhooks.test(e)),onSuccess:e})},K=()=>{let e=B();return i({mutationKey:[`webhooks`,`redeliver`],mutationFn:({id:e,deliveryId:t})=>o(()=>c.webhooks.redeliver(e,t)),onSuccess:e})},q=(e,t)=>{let[n,r]=(0,h.useState)([]);return{pagerProps:i=>({onFirst:e===void 0?void 0:()=>{r([]),t(void 0)},onPrevious:n.length===0?void 0:()=>{t(n.at(-1)),r(e=>e.slice(0,-1))},onNext:i?()=>{r(t=>[...t,e]),t(i)}:void 0}),resetPager:()=>r([])}};export{k as C,g as D,T as E,m as O,x as S,O as T,w as _,W as a,y as b,R as c,I as d,j as f,M as g,P as h,K as i,z as l,N as m,V as n,G as o,A as p,U as r,H as s,q as t,L as u,E as v,D as w,S as x,b as y};
2
- //# sourceMappingURL=useCursorPager-0zHjlm-7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMediaUploader-CBcq1ICg.js","names":["__iconData","__iconData","useRef","useRef","_Fragment","i18next","CheckCircle2","XCircle","Loader2","useState","_Fragment","useCallback","i18next","__toESM","require_jsx_runtime","queryKeys","LoaderCircle","useQueryClient","withCsrf","apiBaseUrl","create","adminApi","useMediaAssets","Lock","X","StatusChip","EmptyState","ErrorState","LoadingState","resolveUploadUrl","buildUploadForm","useTranslation","createLucideIcon","formatRelativeTime","formatDateTime","RowTitle","logError","toast","instance","describeError","Button","Input","SelectValue","SelectTrigger","SelectContent","ChevronUp","SelectItem","ChevronDown","Select","Checkbox","CircleCheck","CircleX","fileKindLabel","MEDIA_STATUS_DISPLAY","formatBytes","Thumbnail","Search","List","RotateCcw","cn","TableHeader","TableHead","TableBody","TableRow","TableCell","TableCard","Table","useSearchInput","MEDIA_TYPE_FILTERS","Panel","__iconData$2","Images","__iconData$1","LayoutGrid","__iconData","Upload","import_react","require_react","selectionRange","from","anchor","ids","to","target","useRangeSelection","range","shiftKey","id","rangeId","onSelectChange","checked","import_jsx_runtime","Card","status","asset","selected","active","event","selectable","onSelect","onOpen","t","AssetGrid","assets","activeId","AssetTable","isSelected","Library","query","items","page","scoped","filtered","view","ALL_TYPES","TYPE_LABEL_KEYS","Toolbar","onQueryChange","text","setText","type","onTypeChange","value","filter","onViewChange","UploadButton","buttonProps","input","label","files","onFiles","useMediaUploadsStore","set","state","item","patch","UploadTransferError","body","uploadWithProgress","request","url","onProgress","resolve","reject","signal","form","describeUploadError","error","PERCENT","Row","percent","statusText","onRetry","onDismiss","UploadQueue","clearFinished","showFinished","setShowFinished","failed","done","settled","expanded","current","FALLBACK_MIME_TYPE","requestGrant","details","uploadFile","grant","onConfirming","useMediaUploader","queryClient","run","update","file","options","add","candidate","remove"],"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/images.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/layout-grid.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/upload.mjs","../../src/features/Media/helpers/selectionRange.ts","../../src/features/Media/hooks/useRangeSelection.ts","../../src/features/Media/AssetGrid/Card/index.tsx","../../src/features/Media/AssetGrid/index.tsx","../../src/features/Media/AssetTable/index.tsx","../../src/features/Media/Library/index.tsx","../../src/features/Media/Toolbar/index.tsx","../../src/features/Media/UploadButton/index.tsx","../../src/stores/mediaUploads.ts","../../src/helpers/uploadWithProgress.ts","../../src/features/Media/helpers/describeUploadError.ts","../../src/features/Media/UploadQueue/Row/index.tsx","../../src/features/Media/UploadQueue/index.tsx","../../src/hooks/useMediaUploader.ts"],"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: \"images\",\n size: 24,\n node: [\n [\"path\", { d: \"m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16\", key: \"9kzy35\" }],\n [\"path\", { d: \"M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2\", key: \"1t0f0t\" }],\n [\"circle\", { cx: \"13\", cy: \"7\", r: \"1\", fill: \"currentColor\", key: \"1obus6\" }],\n [\"rect\", { x: \"8\", y: \"2\", width: \"14\", height: \"14\", rx: \"2\", key: \"1gvhby\" }]\n ]\n};\n__iconData.node;\nconst Images = createLucideIcon(__iconData);\n\nexport { __iconData, Images as default };\n//# sourceMappingURL=images.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: \"layout-grid\",\n size: 24,\n node: [\n [\"rect\", { width: \"7\", height: \"7\", x: \"3\", y: \"3\", rx: \"1\", key: \"1g98yp\" }],\n [\"rect\", { width: \"7\", height: \"7\", x: \"14\", y: \"3\", rx: \"1\", key: \"6d4xhi\" }],\n [\"rect\", { width: \"7\", height: \"7\", x: \"14\", y: \"14\", rx: \"1\", key: \"nxv5o0\" }],\n [\"rect\", { width: \"7\", height: \"7\", x: \"3\", y: \"14\", rx: \"1\", key: \"1bb6yr\" }]\n ]\n};\n__iconData.node;\nconst LayoutGrid = createLucideIcon(__iconData);\n\nexport { __iconData, LayoutGrid as default };\n//# sourceMappingURL=layout-grid.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: \"upload\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 3v12\", key: \"1x0j5s\" }],\n [\"path\", { d: \"m17 8-5-5-5 5\", key: \"7q97r8\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }]\n ]\n};\n__iconData.node;\nconst Upload = createLucideIcon(__iconData);\n\nexport { __iconData, Upload as default };\n//# sourceMappingURL=upload.mjs.map\n","/**\n * The items a shift-click selects: from the anchor (the last item toggled) to the clicked one, inclusive,\n * in list order. Undefined when there is no usable anchor (then the click toggles one item).\n */\nexport const selectionRange = (\n ids: readonly string[],\n anchor: string | undefined,\n target: string,\n): string[] | undefined => {\n const from = anchor === undefined ? -1 : ids.indexOf(anchor);\n const to = ids.indexOf(target);\n if (from === -1 || to === -1) {\n return undefined;\n }\n return ids.slice(Math.min(from, to), Math.max(from, to) + 1);\n};\n","import { useRef } from 'react';\nimport { selectionRange } from '../helpers/selectionRange';\n\ntype SelectRequest = { id: string; checked: boolean; shiftKey: boolean };\n\n/**\n * Shift-click selection over an ordered list: a plain toggle sets the anchor; a shift toggle selects\n * everything from the anchor to the clicked item. Works through `onSelectChange` alone, so any owner of the\n * selection (the library, the media picker) gets ranges without new props.\n */\nexport const useRangeSelection = (\n ids: readonly string[],\n onSelectChange: (id: string, checked: boolean) => void,\n) => {\n const anchor = useRef<string | undefined>(undefined);\n const select = ({ id, checked, shiftKey }: SelectRequest) => {\n const range = shiftKey ? selectionRange(ids, anchor.current, id) : undefined;\n if (range) {\n for (const rangeId of range) {\n onSelectChange(rangeId, true);\n }\n } else {\n onSelectChange(id, checked);\n }\n anchor.current = id;\n };\n return { select };\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { cn } from '@/helpers/cn';\nimport { fileKindLabel } from '../../helpers/fileKind';\nimport { formatBytes } from '../../helpers/formatBytes';\nimport { MEDIA_STATUS_DISPLAY } from '../../helpers/statusDisplay';\nimport { Thumbnail } from '../../Thumbnail';\n\ntype CardProps = {\n asset: MediaAsset;\n selected: boolean;\n selectable: boolean;\n active: boolean;\n /** `shiftKey`: extend the selection to here from the last item toggled. */\n onSelect: (checked: boolean, shiftKey: boolean) => void;\n onOpen: () => void;\n};\n\n/**\n * One asset tile: a button that opens its details (shift-click selects instead), and a checkbox for bulk\n * actions. The square thumbnail, then the name and \"PNG · 120 kB\".\n */\nexport const Card = ({ asset, selected, selectable, active, onSelect, onOpen }: CardProps) => {\n const { t } = useTranslation();\n const status = MEDIA_STATUS_DISPLAY[asset.status];\n return (\n <li\n className={cn(\n 'group relative overflow-hidden rounded-xl border bg-card transition-shadow focus-within:ring-[3px] focus-within:ring-ring/50 hover:border-input',\n (selected || active) && 'border-primary ring-2 ring-primary hover:border-primary',\n )}\n >\n <button\n type=\"button\"\n onClick={(event) => {\n if (event.shiftKey && selectable) {\n onSelect(!selected, true);\n return;\n }\n onOpen();\n }}\n className=\"flex w-full flex-col text-left outline-none\"\n aria-label={t('media.openDetails', { name: asset.filename })}\n >\n <Thumbnail asset={asset} className=\"aspect-square w-full border-b\" />\n <span className=\"flex min-w-0 flex-col gap-0.5 px-3 py-2.5\">\n <span className=\"truncate text-sm font-medium\" title={asset.filename}>\n {asset.filename}\n </span>\n <span className=\"flex min-w-0 items-center gap-1.5 text-meta text-muted-foreground\">\n <span className=\"truncate\">\n {fileKindLabel(asset.filename, asset.mimeType)} · {formatBytes(asset.sizeBytes)}\n </span>\n {asset.visibility === 'private' ? (\n <Lock aria-hidden=\"true\" className=\"size-3.5 shrink-0\" />\n ) : null}\n </span>\n </span>\n </button>\n {asset.status === 'ready' ? null : (\n <StatusChip\n tone={status.tone}\n label={t(status.labelKey)}\n size=\"sm\"\n className=\"pointer-events-none absolute top-2 right-2\"\n />\n )}\n {selectable ? (\n <Checkbox\n checked={selected}\n onClick={(event) => {\n if (event.shiftKey) {\n event.preventDefault();\n onSelect(!selected, true);\n }\n }}\n onCheckedChange={(checked) => onSelect(checked === true, false)}\n aria-label={t('media.select', { name: asset.filename })}\n className=\"absolute top-2 left-2 bg-card\"\n />\n ) : null}\n </li>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useRangeSelection } from '../hooks/useRangeSelection';\nimport { Card } from './Card';\n\ntype AssetGridProps = {\n assets: readonly MediaAsset[];\n selected: ReadonlySet<string>;\n selectable: boolean;\n activeId: string | undefined;\n onSelectChange: (id: string, checked: boolean) => void;\n onOpen: (asset: MediaAsset) => void;\n};\n\n/** Square tiles that fill the width; shift-click (tile or checkbox) selects a range. */\nexport const AssetGrid = ({\n assets,\n selected,\n selectable,\n activeId,\n onSelectChange,\n onOpen,\n}: AssetGridProps) => {\n const { t } = useTranslation();\n const range = useRangeSelection(\n assets.map((asset) => asset.id),\n onSelectChange,\n );\n return (\n <ul\n aria-label={t('media.assetsLabel', { count: assets.length })}\n className=\"grid grid-cols-[repeat(auto-fill,minmax(160px,1fr))] gap-4\"\n >\n {assets.map((asset) => (\n <Card\n key={asset.id}\n asset={asset}\n selected={selected.has(asset.id)}\n selectable={selectable}\n active={asset.id === activeId}\n onSelect={(checked, shiftKey) => range.select({ id: asset.id, checked, shiftKey })}\n onOpen={() => onOpen(asset)}\n />\n ))}\n </ul>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { TableCard } from '@/components/TableCard';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { fileKindLabel } from '../helpers/fileKind';\nimport { formatBytes } from '../helpers/formatBytes';\nimport { MEDIA_STATUS_DISPLAY } from '../helpers/statusDisplay';\nimport { useRangeSelection } from '../hooks/useRangeSelection';\nimport { Thumbnail } from '../Thumbnail';\n\ntype AssetTableProps = {\n assets: readonly MediaAsset[];\n selected: ReadonlySet<string>;\n selectable: boolean;\n onSelectChange: (id: string, checked: boolean) => void;\n onOpen: (asset: MediaAsset) => void;\n};\n\n/** The list view: name, type, size, status and date per asset; shift-click a checkbox to select a range. */\nexport const AssetTable = ({ assets, selected, selectable, onSelectChange, onOpen }: AssetTableProps) => {\n const { t } = useTranslation();\n const range = useRangeSelection(\n assets.map((asset) => asset.id),\n onSelectChange,\n );\n return (\n <TableCard>\n <Table>\n <TableHeader>\n <TableRow>\n {selectable ? (\n <TableHead className=\"w-10\">\n <span className=\"sr-only\">{t('media.selection')}</span>\n </TableHead>\n ) : null}\n <TableHead>{t('media.fields.filename')}</TableHead>\n <TableHead>{t('media.fields.type')}</TableHead>\n <TableHead className=\"text-right\">{t('media.fields.size')}</TableHead>\n <TableHead>{t('media.fields.status')}</TableHead>\n <TableHead>{t('media.fields.uploaded')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {assets.map((asset) => {\n const status = MEDIA_STATUS_DISPLAY[asset.status];\n const isSelected = selected.has(asset.id);\n return (\n <TableRow key={asset.id} data-state={isSelected ? 'selected' : undefined}>\n {selectable ? (\n <TableCell>\n <Checkbox\n checked={isSelected}\n onClick={(event) => {\n if (event.shiftKey) {\n event.preventDefault();\n range.select({ id: asset.id, checked: !isSelected, shiftKey: true });\n }\n }}\n onCheckedChange={(checked) =>\n range.select({ id: asset.id, checked: checked === true, shiftKey: false })\n }\n aria-label={t('media.select', { name: asset.filename })}\n />\n </TableCell>\n ) : null}\n <TableCell className=\"max-w-96\">\n <span className=\"flex min-w-0 items-center gap-3\">\n <Thumbnail asset={asset} className=\"size-8 shrink-0 rounded-md\" />\n <RowTitle asChild className=\"min-w-0 truncate text-left\">\n <button type=\"button\" onClick={() => onOpen(asset)}>\n {asset.filename}\n </button>\n </RowTitle>\n {asset.visibility === 'private' ? (\n <Lock\n role=\"img\"\n aria-label={t('media.visibility.private')}\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n />\n ) : null}\n </span>\n </TableCell>\n <TableCell className=\"text-muted-foreground\" title={asset.mimeType}>\n {fileKindLabel(asset.filename, asset.mimeType)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">{formatBytes(asset.sizeBytes)}</TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} size=\"sm\" />\n </TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(asset.createdAt)}>\n {formatRelativeTime(asset.createdAt)}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </TableCard>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { Images } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useMediaAssets } from '@/api/media';\nimport { EmptyState } from '@/components/EmptyState';\nimport { ErrorState } from '@/components/ErrorState';\nimport { LoadingState } from '@/components/LoadingState';\nimport { Button } from '@/components/ui/button';\nimport { AssetGrid } from '../AssetGrid';\nimport { AssetTable } from '../AssetTable';\nimport type { MediaView } from '../constants';\n\ntype LibraryProps = {\n query: Parameters<typeof useMediaAssets>[0];\n filtered: boolean;\n view: MediaView;\n selected: ReadonlySet<string>;\n selectable: boolean;\n activeId: string | undefined;\n onSelectChange: (id: string, checked: boolean) => void;\n onOpen: (asset: MediaAsset) => void;\n};\n\n/** The assets of the current folder and filters: loading, error, empty, grid or list, and \"Load more\". */\nexport const Library = ({\n query,\n filtered,\n view,\n selected,\n selectable,\n activeId,\n onSelectChange,\n onOpen,\n}: LibraryProps) => {\n const { t } = useTranslation();\n const assets = useMediaAssets(query);\n if (assets.isPending) {\n return <LoadingState rows={4} />;\n }\n if (assets.isError) {\n return <ErrorState error={assets.error} onRetry={() => void assets.refetch()} />;\n }\n const items = assets.data.pages.flatMap((page) => page.items);\n if (items.length === 0) {\n // The whole library is empty: a page-sized empty state. An empty folder or search: a quieter one.\n const scoped = filtered || query.folder !== undefined;\n return (\n <EmptyState\n icon={Images}\n size={scoped ? 'panel' : 'page'}\n title={filtered ? t('media.emptyFiltered') : scoped ? t('media.emptyFolder') : t('media.empty')}\n />\n );\n }\n return (\n <div className=\"space-y-4\">\n {view === 'grid' ? (\n <AssetGrid\n assets={items}\n selected={selected}\n selectable={selectable}\n activeId={activeId}\n onSelectChange={onSelectChange}\n onOpen={onOpen}\n />\n ) : (\n <AssetTable\n assets={items}\n selected={selected}\n selectable={selectable}\n onSelectChange={onSelectChange}\n onOpen={onOpen}\n />\n )}\n {assets.hasNextPage ? (\n <div className=\"flex justify-center\">\n <Button\n variant=\"outline\"\n disabled={assets.isFetchingNextPage}\n aria-busy={assets.isFetchingNextPage || undefined}\n onClick={() => void assets.fetchNextPage()}\n >\n {assets.isFetchingNextPage ? t('common.loading') : t('media.loadMore')}\n </Button>\n </div>\n ) : null}\n </div>\n );\n};\n","import { LayoutGrid, List, Search } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { useSearchInput } from '@/hooks/useSearchInput';\nimport { MEDIA_TYPE_FILTERS, type MediaTypeFilter, type MediaView } from '../constants';\n\ntype ToolbarProps = {\n query: string | undefined;\n type: MediaTypeFilter | undefined;\n view: MediaView;\n onQueryChange: (query: string | undefined) => void;\n onTypeChange: (type: MediaTypeFilter | undefined) => void;\n onViewChange: (view: MediaView) => void;\n};\n\nconst ALL_TYPES = 'all';\n\nconst TYPE_LABEL_KEYS = {\n image: 'media.types.image',\n video: 'media.types.video',\n audio: 'media.types.audio',\n pdf: 'media.types.pdf',\n} as const satisfies Record<MediaTypeFilter, string>;\n\n/** Search, type filter and grid/list switch. */\nexport const Toolbar = ({ query, type, view, onQueryChange, onTypeChange, onViewChange }: ToolbarProps) => {\n const { t } = useTranslation();\n const { text, setText } = useSearchInput(query, onQueryChange);\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative min-w-48 flex-1\">\n <Search\n aria-hidden=\"true\"\n className=\"absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <Input\n type=\"search\"\n value={text}\n onChange={(event) => setText(event.target.value)}\n aria-label={t('media.search')}\n placeholder={t('media.searchPlaceholder')}\n inputSize=\"sm\"\n className=\"pl-8\"\n />\n </div>\n <Select\n value={type ?? ALL_TYPES}\n onValueChange={(value) => onTypeChange(value === ALL_TYPES ? undefined : (value as MediaTypeFilter))}\n >\n <SelectTrigger size=\"sm\" aria-label={t('media.typeFilter')} className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL_TYPES}>{t('media.types.all')}</SelectItem>\n {MEDIA_TYPE_FILTERS.map((filter) => (\n <SelectItem key={filter} value={filter}>\n {t(TYPE_LABEL_KEYS[filter])}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div\n role=\"group\"\n aria-label={t('media.view')}\n className=\"flex h-9 items-center gap-0.5 rounded-lg border border-input px-px\"\n >\n <Button\n variant={view === 'grid' ? 'secondary' : 'ghost'}\n size=\"icon-sm\"\n aria-pressed={view === 'grid'}\n aria-label={t('media.viewGrid')}\n onClick={() => onViewChange('grid')}\n >\n <LayoutGrid aria-hidden=\"true\" />\n </Button>\n <Button\n variant={view === 'list' ? 'secondary' : 'ghost'}\n size=\"icon-sm\"\n aria-pressed={view === 'list'}\n aria-label={t('media.viewList')}\n onClick={() => onViewChange('list')}\n >\n <List aria-hidden=\"true\" />\n </Button>\n </div>\n </div>\n );\n};\n","import { Upload } from 'lucide-react';\nimport { useRef, type ComponentProps } from 'react';\nimport { Button } from '@/components/ui/button';\n\ntype UploadButtonProps = Omit<ComponentProps<typeof Button>, 'onClick'> & {\n label: string;\n multiple?: boolean;\n onFiles: (files: File[]) => void;\n};\n\n/** A button that opens the file picker (the keyboard path; dropping files is the pointer shortcut). */\nexport const UploadButton = ({ label, multiple = true, onFiles, ...buttonProps }: UploadButtonProps) => {\n const input = useRef<HTMLInputElement>(null);\n return (\n <>\n <Button {...buttonProps} onClick={() => input.current?.click()}>\n <Upload aria-hidden=\"true\" />\n {label}\n </Button>\n <input\n ref={input}\n type=\"file\"\n multiple={multiple}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"sr-only\"\n onChange={(event) => {\n const files = [...(event.target.files ?? [])];\n event.target.value = '';\n if (files.length > 0) {\n onFiles(files);\n }\n }}\n />\n </>\n );\n};\n","import type { MediaVisibility } from '@shapio/client';\nimport { create } from 'zustand';\n\nexport type UploadStatus = 'uploading' | 'confirming' | 'done' | 'failed';\n\nexport type UploadItem = {\n id: string;\n file: File;\n folderId: string | null;\n visibility: MediaVisibility;\n /** Set when the upload replaces this asset's file. */\n replaceAssetId: string | undefined;\n status: UploadStatus;\n /** 0 to 1 while the bytes are sent. */\n progress: number;\n error: unknown;\n assetId: string | undefined;\n};\n\ntype MediaUploadsState = {\n items: UploadItem[];\n add: (item: UploadItem) => void;\n update: (id: string, patch: Partial<UploadItem>) => void;\n remove: (id: string) => void;\n clearFinished: () => void;\n};\n\n/** Uploads in flight and recently finished (client-only; kept while the admin is open, not persisted). */\nexport const useMediaUploadsStore = create<MediaUploadsState>()((set) => ({\n items: [],\n add: (item) => set((state) => ({ items: [...state.items, item] })),\n update: (id, patch) =>\n set((state) => ({ items: state.items.map((item) => (item.id === id ? { ...item, ...patch } : item)) })),\n remove: (id) => set((state) => ({ items: state.items.filter((item) => item.id !== id) })),\n clearFinished: () => set((state) => ({ items: state.items.filter((item) => item.status !== 'done') })),\n}));\n","/** The storage (bucket or Shapio's upload route) refused the bytes; `status` 0 means the request never completed. */\nexport class UploadTransferError extends Error {\n readonly status: number;\n readonly body: string;\n\n constructor(status: number, body: string) {\n super(`Upload failed with status ${status}`);\n this.name = 'UploadTransferError';\n this.status = status;\n this.body = body;\n }\n}\n\ntype UploadWithProgressInput = {\n url: string;\n form: FormData;\n onProgress: (fraction: number) => void;\n signal?: AbortSignal;\n};\n\n/**\n * POSTs a multipart form with upload progress (fetch cannot report it, so this uses XMLHttpRequest).\n * No credentials are sent: the grant's fields authorise the upload, whether it goes to a bucket or to Shapio.\n */\nexport const uploadWithProgress = ({ url, form, onProgress, signal }: UploadWithProgressInput) =>\n new Promise<void>((resolve, reject) => {\n const request = new XMLHttpRequest();\n request.open('POST', url);\n request.withCredentials = false;\n request.upload.onprogress = (event) => {\n if (event.lengthComputable && event.total > 0) {\n onProgress(event.loaded / event.total);\n }\n };\n request.onload = () => {\n if (request.status >= 200 && request.status < 300) {\n onProgress(1);\n resolve();\n return;\n }\n reject(new UploadTransferError(request.status, request.responseText));\n };\n request.onerror = () => reject(new UploadTransferError(0, ''));\n request.onabort = () => reject(new DOMException('Upload cancelled', 'AbortError'));\n signal?.addEventListener('abort', () => request.abort(), { once: true });\n request.send(form);\n });\n","import { i18next } from '@/app/i18n';\nimport { describeError } from '@/helpers/describeError';\nimport { UploadTransferError } from '@/helpers/uploadWithProgress';\n\n/** Why an upload failed, for the queue. Storage refusals (bucket or upload route) get their own message. */\nexport const describeUploadError = (error: unknown): string => {\n if (error instanceof UploadTransferError) {\n if (error.status === 0) {\n return i18next.t('media.upload.unreachable');\n }\n if (error.status === 413 || /EntityTooLarge/.test(error.body)) {\n return i18next.t('errors.codes.FILE_TOO_LARGE');\n }\n return i18next.t('media.upload.transferFailed', { status: error.status });\n }\n return describeError(error);\n};\n","import { CheckCircle2, Loader2, RotateCcw, X, XCircle } from 'lucide-react';\nimport type { CSSProperties } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/helpers/cn';\nimport type { UploadItem } from '@/stores/mediaUploads';\nimport { describeUploadError } from '../../helpers/describeUploadError';\nimport { formatBytes } from '../../helpers/formatBytes';\n\ntype RowProps = { item: UploadItem; onRetry: () => void; onDismiss: () => void };\n\nconst PERCENT = 100;\n\n/** One upload: name, size, progress (a real progressbar), and Retry/Dismiss when it failed. */\nexport const Row = ({ item, onRetry, onDismiss }: RowProps) => {\n const { t } = useTranslation();\n const percent = Math.round(item.progress * PERCENT);\n const statusText =\n item.status === 'uploading'\n ? t('media.upload.uploading', { percent })\n : item.status === 'confirming'\n ? t('media.upload.checking')\n : item.status === 'done'\n ? t('media.upload.done')\n : describeUploadError(item.error);\n return (\n <li className=\"flex items-start gap-3 px-5 py-2.5\">\n <span className=\"mt-0.5 shrink-0\">\n {item.status === 'done' ? (\n <CheckCircle2 aria-hidden=\"true\" className=\"size-4 text-success\" />\n ) : item.status === 'failed' ? (\n <XCircle aria-hidden=\"true\" className=\"size-4 text-destructive\" />\n ) : (\n <Loader2\n aria-hidden=\"true\"\n className=\"size-4 animate-spin text-muted-foreground motion-reduce:animate-none\"\n />\n )}\n </span>\n <div className=\"min-w-0 flex-1 space-y-1\">\n <p className=\"flex items-baseline gap-2 text-sm\">\n <span className=\"truncate font-medium\">{item.file.name}</span>\n <span className=\"shrink-0 text-meta text-muted-foreground\">{formatBytes(item.file.size)}</span>\n </p>\n {item.status === 'uploading' || item.status === 'confirming' ? (\n <div\n role=\"progressbar\"\n aria-label={t('media.upload.progress', { name: item.file.name })}\n aria-valuemin={0}\n aria-valuemax={PERCENT}\n aria-valuenow={percent}\n className=\"h-1.5 overflow-hidden rounded-full bg-muted\"\n style={{ '--upload-progress': `${percent}%` } as CSSProperties}\n >\n <div className=\"h-full w-[var(--upload-progress)] bg-primary transition-[width]\" />\n </div>\n ) : null}\n <p\n className={cn('text-meta', item.status === 'failed' ? 'text-destructive' : 'text-muted-foreground')}\n >\n {statusText}\n </p>\n </div>\n {item.status === 'failed' ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={t('media.upload.retry', { name: item.file.name })}\n onClick={onRetry}\n >\n <RotateCcw aria-hidden=\"true\" />\n </Button>\n ) : null}\n {item.status === 'failed' || item.status === 'done' ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={t('media.upload.dismiss', { name: item.file.name })}\n onClick={onDismiss}\n >\n <X aria-hidden=\"true\" />\n </Button>\n ) : null}\n </li>\n );\n};\n","import { ChevronDown, ChevronUp } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Panel } from '@/components/Panel';\nimport { Button } from '@/components/ui/button';\nimport { useMediaUploadsStore } from '@/stores/mediaUploads';\nimport { Row } from './Row';\n\ntype UploadQueueProps = { onRetry: (id: string) => void; onDismiss: (id: string) => void };\n\n/**\n * Uploads in progress and recently finished, newest last, as a compact panel. Once nothing is running or\n * failed it collapses to one line (\"3 uploaded\"); failures stay open until retried or dismissed.\n */\nexport const UploadQueue = ({ onRetry, onDismiss }: UploadQueueProps) => {\n const { t } = useTranslation();\n const items = useMediaUploadsStore((state) => state.items);\n const clearFinished = useMediaUploadsStore((state) => state.clearFinished);\n const [showFinished, setShowFinished] = useState(false);\n if (items.length === 0) {\n return null;\n }\n const active = items.filter((item) => item.status === 'uploading' || item.status === 'confirming').length;\n const failed = items.filter((item) => item.status === 'failed').length;\n const done = items.length - active - failed;\n const settled = active === 0 && failed === 0;\n const expanded = !settled || showFinished;\n return (\n <Panel\n title={t('media.upload.queueTitle')}\n titleAs=\"h2\"\n flush={expanded}\n actions={\n <>\n <span role=\"status\" aria-live=\"polite\" className=\"text-meta text-muted-foreground\">\n {settled\n ? t('media.upload.doneSummary', { count: done })\n : t('media.upload.summary', { active, failed })}\n </span>\n {settled ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-expanded={expanded}\n aria-label={expanded ? t('media.upload.hideFinished') : t('media.upload.showFinished')}\n onClick={() => setShowFinished((current) => !current)}\n >\n {expanded ? <ChevronUp aria-hidden=\"true\" /> : <ChevronDown aria-hidden=\"true\" />}\n </Button>\n ) : null}\n {done > 0 ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={clearFinished}>\n {t('media.upload.clearFinished')}\n </Button>\n ) : null}\n </>\n }\n bodyClassName={expanded ? undefined : 'hidden'}\n >\n {expanded ? (\n <ul className=\"max-h-64 divide-y overflow-y-auto\">\n {items.map((item) => (\n <Row\n key={item.id}\n item={item}\n onRetry={() => onRetry(item.id)}\n onDismiss={() => onDismiss(item.id)}\n />\n ))}\n </ul>\n ) : null}\n </Panel>\n );\n};\n","import { buildUploadForm, type MediaAsset, type MediaVisibility, type UploadGrant } from '@shapio/client';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { adminApi, apiBaseUrl } from '@/api/client';\nimport { withCsrf } from '@/api/csrf';\nimport { queryKeys } from '@/api/queryKeys';\nimport { i18next } from '@/app/i18n';\nimport { logError } from '@/helpers/reportError';\nimport { resolveUploadUrl } from '@/helpers/resolveUploadUrl';\nimport { uploadWithProgress } from '@/helpers/uploadWithProgress';\nimport { useMediaUploadsStore, type UploadItem } from '@/stores/mediaUploads';\n\nconst FALLBACK_MIME_TYPE = 'application/octet-stream';\n\ntype UploadTarget = Pick<UploadItem, 'file' | 'folderId' | 'visibility' | 'replaceAssetId'>;\n\nconst requestGrant = (item: UploadTarget): Promise<UploadGrant> => {\n const details = {\n filename: item.file.name,\n mimeType: item.file.type || FALLBACK_MIME_TYPE,\n sizeBytes: item.file.size,\n };\n return withCsrf(() =>\n item.replaceAssetId\n ? adminApi.media.assets.replace(item.replaceAssetId, details)\n : adminApi.media.uploads.create({ ...details, folderId: item.folderId, visibility: item.visibility }),\n );\n};\n\n/** Grant, send (with progress), confirm: one file into the library. Throws when any step fails. */\nconst uploadFile = async (\n item: UploadTarget,\n onProgress: (progress: number) => void,\n onConfirming: () => void,\n): Promise<MediaAsset> => {\n const grant = await requestGrant(item);\n await uploadWithProgress({\n url: resolveUploadUrl(grant, apiBaseUrl()),\n form: buildUploadForm(grant, item.file, item.file.name),\n onProgress,\n });\n onConfirming();\n return withCsrf(() => adminApi.media.uploads.confirm(grant.grantId));\n};\n\n/** What an editor gets back from `uploadOne`: the new asset's ID and its library alt text. */\nexport type UploadedMedia = { id: string; alt: string | null };\n\ntype EnqueueOptions = { folderId: string | null; visibility: MediaVisibility; replaceAssetId?: string };\n\n/**\n * The upload flow, the same for local disk and S3: ask for a grant, send the form to the grant's URL\n * (with progress), then confirm so the server checks the bytes and records the asset. A failed upload stays\n * in the queue with its error; retrying starts again with a fresh grant (grants are single-use).\n */\nexport const useMediaUploader = () => {\n const queryClient = useQueryClient();\n const { add, update, remove } = useMediaUploadsStore.getState();\n\n const run = useCallback(\n async (item: UploadItem) => {\n update(item.id, { status: 'uploading', progress: 0, error: undefined });\n try {\n const asset = await uploadFile(\n item,\n (progress) => update(item.id, { progress }),\n () => update(item.id, { status: 'confirming' }),\n );\n update(item.id, { status: 'done', assetId: asset.id });\n if (item.replaceAssetId) {\n toast.success(i18next.t('media.upload.replaced', { name: item.file.name }));\n }\n } catch (error) {\n logError(error, `uploading ${item.file.name}`);\n update(item.id, { status: 'failed', error });\n } finally {\n await queryClient.invalidateQueries({ queryKey: queryKeys.media.all });\n }\n },\n [queryClient, update],\n );\n\n const enqueue = useCallback(\n (files: readonly File[], options: EnqueueOptions) => {\n for (const file of files) {\n const item: UploadItem = {\n id: crypto.randomUUID(),\n file,\n folderId: options.folderId,\n visibility: options.visibility,\n replaceAssetId: options.replaceAssetId,\n status: 'uploading',\n progress: 0,\n error: undefined,\n assetId: undefined,\n };\n add(item);\n void run(item);\n }\n },\n [add, run],\n );\n\n const retry = useCallback(\n (id: string) => {\n const item = useMediaUploadsStore.getState().items.find((candidate) => candidate.id === id);\n if (item) {\n void run(item);\n }\n },\n [run],\n );\n\n /**\n * One file uploaded outside the queue (a file dropped into rich text): resolves with the new asset, or\n * rejects so the caller can undo its placeholder. Public, in the root folder.\n */\n const uploadOne = useCallback(\n async (file: File): Promise<UploadedMedia> => {\n try {\n const asset = await uploadFile(\n { file, folderId: null, visibility: 'public', replaceAssetId: undefined },\n () => undefined,\n () => undefined,\n );\n queryClient.setQueryData(queryKeys.media.asset(asset.id), asset);\n return { id: asset.id, alt: asset.alt || null };\n } finally {\n await queryClient.invalidateQueries({ queryKey: queryKeys.media.all });\n }\n },\n [queryClient],\n );\n\n return { enqueue, retry, dismiss: remove, uploadOne };\n};\n"],"ignoreList":[0,1,2],"mappings":"0xCASA,IAAMA,EAAa,CACjB,KAAM,SACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,iDAAkD,IAAK,QAAS,CAAC,EAC/E,CAAC,OAAQ,CAAE,EAAG,uDAAwD,IAAK,QAAS,CAAC,EACrF,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,IAAK,EAAG,IAAK,KAAM,eAAgB,IAAK,QAAS,CAAC,EAC7E,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,KAAM,OAAQ,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,CAChF,CACF,EACAA,EAAW,KACX,IAAMuE,EAASvC,EAAiBhC,CAAU,ECXpCC,EAAa,CACjB,KAAM,cACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC5E,CAAC,OAAQ,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,KAAM,EAAG,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC7E,CAAC,OAAQ,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,KAAM,EAAG,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,EAC9E,CAAC,OAAQ,CAAE,MAAO,IAAK,OAAQ,IAAK,EAAG,IAAK,EAAG,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,CAC/E,CACF,EACAA,EAAW,KACX,IAAMwE,EAAazC,EAAiB/B,CAAU,ECXxCyE,EAAa,CACjB,KAAM,SACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,EAC9C,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAS,CAAC,CAC5E,CACF,EACAA,EAAW,KACX,IAAMC,EAAS3C,EAAiB0C,CAAU,aCf7BI,IACX,EACA,EACA,IACyB,CACzB,IAAMC,EAAOC,IAAW,IAAA,GAAY,GAAKC,EAAI,QAAQD,CAAM,EACrDE,EAAKD,EAAI,QAAQE,CAAM,EAC7B,GAAIJ,IAAS,IAAMG,IAAO,GAG1B,OAAOD,EAAI,MAAM,KAAK,IAAIF,EAAMG,CAAE,EAAG,KAAK,IAAIH,EAAMG,CAAE,EAAI,CAAC,CAC7D,ECLaE,GACX,EACA,IACG,CACH,IAAMJ,GAAA,EAAS9E,EAAAA,OAAAA,CAA2B,IAAA,EAAS,EAYnD,MAAO,CAAE,QAXO,CAAE,KAAI,UAAS,cAA8B,CAC3D,IAAMmF,EAAQC,EAAWR,GAAeG,EAAKD,EAAO,QAASO,CAAE,EAAI,IAAA,GACnE,GAAIF,EACF,IAAK,IAAMG,KAAWH,EACpBI,EAAeD,EAAS,EAAI,OAG9BC,EAAeF,EAAIG,CAAO,EAE5B,EAAO,QAAUH,CACnB,CACgB,CAClB,aCFaK,IAAQ,CAAE,QAAO,WAAU,aAAY,SAAQ,WAAU,YAAwB,CAC5F,GAAM,CAAE,KAAM7D,EAAe,EACvB8D,EAASxC,EAAqByC,EAAM,QAC1C,OACE,EAAAH,EAAA,KAAA,CAAC,KAAD,CACE,UAAWhC,EACT,mJACCoC,GAAYC,IAAW,yDAC1B,EAJF,SAAA,EAME,EAAAL,EAAA,KAAA,CAAC,SAAD,CACE,KAAK,SACL,QAAU,GAAU,CAClB,GAAIM,EAAM,UAAYC,EAAY,CAChCC,EAAS,CAACJ,EAAU,EAAI,EACxB,MACF,CACAK,EAAO,CACT,EACA,UAAU,8CACV,aAAYC,EAAE,oBAAqB,CAAE,KAAMP,EAAM,QAAS,CAAC,EAV7D,SAAA,EAYE,EAAAH,EAAA,IAAA,CAACpC,EAAD,CAAkB,QAAO,UAAU,+BAAiC,CAAA,GACpE,EAAAoC,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,4CAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,+BAA+B,MAAOG,EAAM,SACzD,SAAAA,EAAM,QACH,CAAA,GACN,EAAAH,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,oEAAhB,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,WAAhB,SAAA,CACGvC,EAAc0C,EAAM,SAAUA,EAAM,QAAQ,EAAE,MAAIxC,EAAYwC,EAAM,SAAS,CAC1E,CACL,CAAA,EAAAA,EAAM,aAAe,WACpB,EAAAH,EAAA,IAAA,CAACpE,EAAD,CAAM,cAAY,OAAO,UAAU,mBAAqB,CAAA,EACtD,IACA,CACF,CAAA,CAAA,CACA,CAAA,CAAA,IACPuE,EAAM,SAAW,QAAU,MAC1B,EAAAH,EAAA,IAAA,CAAClE,EAAD,CACE,KAAMoE,EAAO,KACb,MAAOQ,EAAER,EAAO,QAAQ,EACxB,KAAK,KACL,UAAU,4CACX,CAAA,EAEFK,GACC,EAAAP,EAAA,IAAA,CAAC1C,EAAD,CACE,QAAS8C,EACT,QAAU,GAAU,CACdE,EAAM,WACRA,EAAM,eAAe,EACrBE,EAAS,CAACJ,EAAU,EAAI,EAE5B,EACA,gBAAkB,GAAYI,EAAST,IAAY,GAAM,EAAK,EAC9D,aAAYW,EAAE,eAAgB,CAAE,KAAMP,EAAM,QAAS,CAAC,EACtD,UAAU,+BACX,CAAA,EACC,IACF,GAER,ECvEaQ,IAAa,CACxB,SACA,WACA,aACA,WACA,iBACA,YACoB,CACpB,GAAM,CAAE,KAAMvE,EAAe,EACvBsD,EAAQD,EACZmB,EAAO,IAAK,GAAUT,EAAM,EAAE,EAC9BL,CACF,EACA,OACE,EAAAE,EAAA,IAAA,CAAC,KAAD,CACE,aAAYU,EAAE,oBAAqB,CAAE,MAAOE,EAAO,MAAO,CAAC,EAC3D,UAAU,6DAET,SAAAA,EAAO,IAAK,IACX,EAAAZ,EAAA,IAAA,CAACC,GAAD,CAES,QACP,SAAUG,EAAS,IAAID,EAAM,EAAE,EACnB,aACZ,OAAQA,EAAM,KAAOU,EACrB,UAAW,EAAS,IAAanB,EAAM,OAAO,CAAE,GAAIS,EAAM,GAAI,UAAS,UAAS,CAAC,EACjF,WAAcM,EAAON,CAAK,CAC3B,EAPMA,EAAM,EAOZ,CACF,CACC,CAAA,CAER,ECtBaW,IAAc,CAAE,SAAQ,WAAU,aAAY,iBAAgB,YAA8B,CACvG,GAAM,CAAE,KAAM1E,EAAe,EACvBsD,EAAQD,EACZmB,EAAO,IAAK,GAAUT,EAAM,EAAE,EAC9BL,CACF,EACA,OACE,EAAAE,EAAA,IAAA,CAAC1B,EAAD,CAAA,UACE,EAAA0B,EAAA,KAAA,CAACzB,EAAD,CAAA,SAAA,EACE,EAAAyB,EAAA,IAAA,CAAC/B,EAAD,CAAA,UACE,EAAA+B,EAAA,KAAA,CAAC5B,EAAD,CAAA,SAAA,CACGmC,GACC,EAAAP,EAAA,IAAA,CAAC9B,EAAD,CAAW,UAAU,OACnB,UAAA,EAAA8B,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,UAAW,SAAAU,EAAE,iBAAiB,CAAQ,CAAA,CAC7C,CAAA,EACT,MACJ,EAAAV,EAAA,IAAA,CAAC9B,EAAD,CAAA,SAAYwC,EAAE,uBAAuB,CAAa,CAAA,GAClD,EAAAV,EAAA,IAAA,CAAC9B,EAAD,CAAA,SAAYwC,EAAE,mBAAmB,CAAa,CAAA,GAC9C,EAAAV,EAAA,IAAA,CAAC9B,EAAD,CAAW,UAAU,aAAc,SAAAwC,EAAE,mBAAmB,CAAa,CAAA,GACrE,EAAAV,EAAA,IAAA,CAAC9B,EAAD,CAAA,SAAYwC,EAAE,qBAAqB,CAAa,CAAA,GAChD,EAAAV,EAAA,IAAA,CAAC9B,EAAD,CAAA,SAAYwC,EAAE,uBAAuB,CAAa,CAAA,CAC1C,CAAA,CAAA,CACC,CAAA,GACb,EAAAV,EAAA,IAAA,CAAC7B,EAAD,CAAA,SACGyC,EAAO,IAAK,GAAU,CACrB,IAAMV,EAASxC,EAAqByC,EAAM,QACpCY,EAAaX,EAAS,IAAID,EAAM,EAAE,EACxC,OACE,EAAAH,EAAA,KAAA,CAAC5B,EAAD,CAAyB,aAAY2C,EAAa,WAAa,IAAA,GAA/D,SAAA,CACGR,GACC,EAAAP,EAAA,IAAA,CAAC3B,EAAD,CAAA,UACE,EAAA2B,EAAA,IAAA,CAAC1C,EAAD,CACE,QAASyD,EACT,QAAU,GAAU,CACdT,EAAM,WACRA,EAAM,eAAe,EACrBZ,EAAM,OAAO,CAAE,GAAIS,EAAM,GAAI,QAAS,CAACY,EAAY,SAAU,EAAK,CAAC,EAEvE,EACA,gBAAkB,GAChBrB,EAAM,OAAO,CAAE,GAAIS,EAAM,GAAI,QAASJ,IAAY,GAAM,SAAU,EAAM,CAAC,EAE3E,aAAYW,EAAE,eAAgB,CAAE,KAAMP,EAAM,QAAS,CAAC,CACvD,CAAA,CACQ,CAAA,EACT,MACJ,EAAAH,EAAA,IAAA,CAAC3B,EAAD,CAAW,UAAU,WACnB,UAAA,EAAA2B,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,kCAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAACpC,EAAD,CAAkB,QAAO,UAAU,4BAA8B,CAAA,GACjE,EAAAoC,EAAA,IAAA,CAACxD,GAAD,CAAU,QAAA,GAAQ,UAAU,6BAC1B,UAAA,EAAAwD,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,YAAeS,EAAON,CAAK,EAC9C,SAAAA,EAAM,QACD,CAAA,CACA,CAAA,EACTA,EAAM,aAAe,WACpB,EAAAH,EAAA,IAAA,CAACpE,EAAD,CACE,KAAK,MACL,aAAY8E,EAAE,0BAA0B,EACxC,UAAU,yCACX,CAAA,EACC,IACA,GACG,CAAA,GACX,EAAAV,EAAA,IAAA,CAAC3B,EAAD,CAAW,UAAU,wBAAwB,MAAO8B,EAAM,SACvD,SAAA1C,EAAc0C,EAAM,SAAUA,EAAM,QAAQ,CACpC,CAAA,GACX,EAAAH,EAAA,IAAA,CAAC3B,EAAD,CAAW,UAAU,0BAA2B,SAAAV,EAAYwC,EAAM,SAAS,CAAa,CAAA,GACxF,EAAAH,EAAA,IAAA,CAAC3B,EAAD,CAAA,UACE,EAAA2B,EAAA,IAAA,CAAClE,EAAD,CAAY,KAAMoE,EAAO,KAAM,MAAOQ,EAAER,EAAO,QAAQ,EAAG,KAAK,IAAM,CAAA,CAC5D,CAAA,GACX,EAAAF,EAAA,IAAA,CAAC3B,EAAD,CAAW,UAAU,oBAAoB,MAAO9B,GAAe4D,EAAM,SAAS,EAC3E,SAAA7D,GAAmB6D,EAAM,SAAS,CAC1B,CAAA,CACH,CA7CK,EAAAA,EAAM,EA6CX,CAEd,CAAC,CACQ,CAAA,CACN,CAAA,CAAA,CACE,CAAA,CAEf,EChFaa,IAAW,CACtB,QACA,WACA,OACA,WACA,aACA,WACA,iBACA,YACkB,CAClB,GAAM,CAAE,KAAM5E,EAAe,EACvBwE,EAASjF,EAAesF,CAAK,EACnC,GAAIL,EAAO,UACT,OAAO,EAAAZ,EAAA,IAAA,CAAC/D,GAAD,CAAc,KAAM,CAAI,CAAA,EAEjC,GAAI2E,EAAO,QACT,OAAO,EAAAZ,EAAA,IAAA,CAAChE,GAAD,CAAY,MAAO4E,EAAO,MAAO,YAAe,KAAKA,EAAO,QAAQ,CAAI,CAAA,EAEjF,IAAMM,EAAQN,EAAO,KAAK,MAAM,QAAS,GAASO,EAAK,KAAK,EAC5D,GAAID,EAAM,SAAW,EAAG,CAEtB,IAAME,EAASC,GAAYJ,EAAM,SAAW,IAAA,GAC5C,OACE,EAAAjB,EAAA,IAAA,CAACjE,GAAD,CACE,KAAM6C,EACN,KAAMwC,EAAS,QAAU,OACzB,MAAkBV,EAAXW,EAAa,sBAAyBD,EAAW,oBAAyB,aAAa,CAC/F,CAAA,CAEL,CACA,OACE,EAAApB,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,YAAf,SAAA,CACGsB,IAAS,QACR,EAAAtB,EAAA,IAAA,CAACW,GAAD,CACE,OAAQO,EACE,WACE,aACF,WACM,iBACR,QACT,CAAA,GAED,EAAAlB,EAAA,IAAA,CAACc,GAAD,CACE,OAAQI,EACE,WACE,aACI,iBACR,QACT,CAAA,EAEFN,EAAO,aACN,EAAAZ,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,sBACb,UAAA,EAAAA,EAAA,IAAA,CAACnD,EAAD,CACE,QAAQ,UACR,SAAU+D,EAAO,mBACjB,YAAWA,EAAO,oBAAsB,IAAA,GACxC,YAAe,KAAKA,EAAO,cAAc,EAExC,SAAAA,EAAO,mBAAqBF,EAAE,gBAAgB,EAAIA,EAAE,gBAAgB,CAC/D,CAAA,CACL,CAAA,EACH,IACD,GAET,ECvEMa,EAAY,MAEZC,GAAkB,CACtB,MAAO,oBACP,MAAO,oBACP,MAAO,oBACP,IAAK,iBACP,EAGaC,IAAW,CAAE,QAAO,OAAM,OAAM,gBAAe,eAAc,kBAAiC,CACzG,GAAM,CAAE,KAAMrF,EAAe,EACvB,CAAE,OAAM,WAAYoC,GAAeyC,EAAOS,CAAa,EAC7D,OACE,EAAA1B,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oCAAf,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,2BAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAACnC,EAAD,CACE,cAAY,OACZ,UAAU,yEACX,CAAA,GACD,EAAAmC,EAAA,IAAA,CAAClD,GAAD,CACE,KAAK,SACL,MAAO6E,EACP,SAAW,GAAUC,EAAQtB,EAAM,OAAO,KAAK,EAC/C,aAAYI,EAAE,cAAc,EAC5B,YAAaA,EAAE,yBAAyB,EACxC,UAAU,KACV,UAAU,MACX,CAAA,CACE,KACL,EAAAV,EAAA,KAAA,CAAC3C,GAAD,CACE,MAAOwE,GAAQN,EACf,cAAgB,GAAUO,EAAaC,IAAUR,EAAY,IAAA,GAAaQ,CAAyB,EAFrG,SAAA,EAIE,EAAA/B,EAAA,IAAA,CAAChD,EAAD,CAAe,KAAK,KAAK,aAAY0D,EAAE,kBAAkB,EAAG,UAAU,OACpE,UAAA,EAAAV,EAAA,IAAA,CAACjD,EAAD,CAAc,CAAA,CACD,CAAA,GACf,EAAAiD,EAAA,KAAA,CAAC/C,EAAD,CAAA,SAAA,EACE,EAAA+C,EAAA,IAAA,CAAC7C,EAAD,CAAY,MAAOoE,EAAY,SAAAb,EAAE,iBAAiB,CAAc,CAAA,EAC/DjC,GAAmB,IAAK,IACvB,EAAAuB,EAAA,IAAA,CAAC7C,EAAD,CAAyB,MAAO6E,EAC7B,SAAAtB,EAAEc,GAAgBQ,EAAO,CAChB,EAFKA,CAEL,CACb,CACY,CAAA,CAAA,CACT,KACR,EAAAhC,EAAA,KAAA,CAAC,MAAD,CACE,KAAK,QACL,aAAYU,EAAE,YAAY,EAC1B,UAAU,qEAHZ,SAAA,EAKE,EAAAV,EAAA,IAAA,CAACnD,EAAD,CACE,QAASyE,IAAS,OAAS,YAAc,QACzC,KAAK,UACL,eAAcA,IAAS,OACvB,aAAYZ,EAAE,gBAAgB,EAC9B,YAAeuB,EAAa,MAAM,EAElC,UAAA,EAAAjC,EAAA,IAAA,CAAClB,EAAD,CAAY,cAAY,MAAQ,CAAA,CAC1B,CAAA,GACR,EAAAkB,EAAA,IAAA,CAACnD,EAAD,CACE,QAASyE,IAAS,OAAS,YAAc,QACzC,KAAK,UACL,eAAcA,IAAS,OACvB,aAAYZ,EAAE,gBAAgB,EAC9B,YAAeuB,EAAa,MAAM,EAElC,UAAA,EAAAjC,EAAA,IAAA,CAAClC,EAAD,CAAM,cAAY,MAAQ,CAAA,CACpB,CAAA,CACL,GACF,GAET,EC9EaoE,IAAgB,CAAE,QAAO,WAAW,GAAM,UAAS,GAAGC,KAAqC,CACtG,IAAMC,GAAA,EAAQ5H,EAAAA,OAAAA,CAAyB,IAAI,EAC3C,OACE,EAAAwF,EAAA,KAAA,CAAAvF,EAAAA,SAAA,CAAA,SAAA,EACE,EAAAuF,EAAA,KAAA,CAACnD,EAAD,CAAQ,GAAIsF,EAAa,YAAeC,EAAM,SAAS,MAAM,EAA7D,SAAA,EACE,EAAApC,EAAA,IAAA,CAAChB,EAAD,CAAQ,cAAY,MAAQ,CAAA,EAC3BqD,CACK,CACR,CAAA,GAAA,EAAArC,EAAA,IAAA,CAAC,QAAD,CACE,IAAKoC,EACL,KAAK,OACK,WACV,SAAU,GACV,cAAY,OACZ,UAAU,UACV,SAAW,GAAU,CACnB,IAAME,EAAQ,CAAC,GAAIhC,EAAM,OAAO,OAAS,CAAC,CAAE,EAC5C,EAAM,OAAO,MAAQ,GACjBgC,EAAM,OAAS,GACjBC,EAAQD,CAAK,CAEjB,CACD,CAAA,CACD,CAAA,CAAA,CAEN,ECRaE,EAAuB/G,EAA0B,CAAC,CAAE,IAAS,CACxE,MAAO,CAAC,EACR,IAAM,GAASgH,EAAK,IAAW,CAAE,MAAO,CAAC,GAAGC,EAAM,MAAOC,CAAI,CAAE,EAAE,EACjE,QAAS,EAAI,IACXF,EAAK,IAAW,CAAE,MAAOC,EAAM,MAAM,IAAK,GAAUC,EAAK,KAAO/C,EAAK,CAAE,GAAG+C,EAAM,GAAGC,CAAM,EAAID,CAAK,CAAE,EAAE,EACxG,OAAS,GAAOF,EAAK,IAAW,CAAE,MAAOC,EAAM,MAAM,OAAQ,GAASC,EAAK,KAAO/C,CAAE,CAAE,EAAE,EACxF,kBAAqB6C,EAAK,IAAW,CAAE,MAAOC,EAAM,MAAM,OAAQ,GAASC,EAAK,SAAW,MAAM,CAAE,EAAE,CACvG,EAAE,EClCWE,EAAb,cAAyC,KAAM,CAC7C,OACA,KAEA,YAAY,EAAgB,EAAc,CACxC,MAAM,6BAA6B3C,GAAQ,EAC3C,KAAK,KAAO,sBACZ,KAAK,OAASA,EACd,KAAK,KAAO4C,CACd,CACF,EAaaC,IAAsB,CAAE,MAAK,OAAM,aAAY,YAC1D,IAAI,SAAe,EAAS,IAAW,CACrC,IAAMC,EAAU,IAAI,eACpBA,EAAQ,KAAK,OAAQC,CAAG,EACxB,EAAQ,gBAAkB,GAC1B,EAAQ,OAAO,WAAc,GAAU,CACjC3C,EAAM,kBAAoBA,EAAM,MAAQ,GAC1C4C,EAAW5C,EAAM,OAASA,EAAM,KAAK,CAEzC,EACA,EAAQ,WAAe,CACrB,GAAI0C,EAAQ,QAAU,KAAOA,EAAQ,OAAS,IAAK,CACjDE,EAAW,CAAC,EACZC,EAAQ,EACR,MACF,CACAC,EAAO,IAAIP,EAAoBG,EAAQ,OAAQA,EAAQ,YAAY,CAAC,CACtE,EACA,EAAQ,YAAgBI,EAAO,IAAIP,EAAoB,EAAG,EAAE,CAAC,EAC7D,EAAQ,YAAgBO,EAAO,IAAI,aAAa,mBAAoB,YAAY,CAAC,EACjFC,GAAQ,iBAAiB,YAAeL,EAAQ,MAAM,EAAG,CAAE,KAAM,EAAK,CAAC,EACvEA,EAAQ,KAAKM,CAAI,CACnB,CAAC,ECzCUC,GAAuB,GAC9BC,aAAiBX,EACfW,EAAM,SAAW,EACZ9I,EAAQ,EAAE,0BAA0B,EAEzC8I,EAAM,SAAW,KAAO,iBAAiB,KAAKA,EAAM,IAAI,EACnD9I,EAAQ,EAAE,6BAA6B,EAEzCA,EAAQ,EAAE,8BAA+B,CAAE,OAAQ8I,EAAM,MAAO,CAAC,EAEnE5G,GAAc4G,CAAK,ECJtBC,EAAU,IAGHC,IAAO,CAAE,OAAM,UAAS,eAA0B,CAC7D,GAAM,CAAE,KAAMtH,EAAe,EACvBuH,EAAU,KAAK,MAAMhB,EAAK,SAAWc,CAAO,EAC5CG,EACJjB,EAAK,SAAW,YACZjC,EAAE,yBAA0B,CAAE,SAAQ,CAAC,EACvCiC,EAAK,SAAW,aACdjC,EAAE,uBAAuB,EACzBiC,EAAK,SAAW,OACdjC,EAAE,mBAAmB,EACrB6C,GAAoBZ,EAAK,KAAK,EACxC,OACE,EAAA3C,EAAA,KAAA,CAAC,KAAD,CAAI,UAAU,qCAAd,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kBACb,SAAA2C,EAAK,SAAW,QACf,EAAA3C,EAAA,IAAA,CAACrF,GAAD,CAAc,cAAY,OAAO,UAAU,qBAAuB,CAAA,EAChEgI,EAAK,SAAW,UAClB,EAAA3C,EAAA,IAAA,CAACpF,GAAD,CAAS,cAAY,OAAO,UAAU,yBAA2B,CAAA,GAEjE,EAAAoF,EAAA,IAAA,CAACnF,EAAD,CACE,cAAY,OACZ,UAAU,sEACX,CAAA,CAEC,CAAA,GACN,EAAAmF,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,2BAAf,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAU,oCAAb,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,uBAAwB,SAAA2C,EAAK,KAAK,IAAW,CAAA,GAC7D,EAAA3C,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2CAA4C,SAAArC,EAAYgF,EAAK,KAAK,IAAI,CAAQ,CAAA,CAC7F,IACFA,EAAK,SAAW,aAAeA,EAAK,SAAW,cAC9C,EAAA3C,EAAA,IAAA,CAAC,MAAD,CACE,KAAK,cACL,aAAYU,EAAE,wBAAyB,CAAE,KAAMiC,EAAK,KAAK,IAAK,CAAC,EAC/D,gBAAe,EACf,gBAAec,EACf,gBAAeE,EACf,UAAU,8CACV,MAAO,CAAE,oBAAqB,GAAGA,EAAQ,EAAG,EAE5C,UAAA,EAAA3D,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iEAAmE,CAAA,CAC/E,CAAA,EACH,MACJ,EAAAA,EAAA,IAAA,CAAC,IAAD,CACE,UAAWhC,EAAG,YAAa2E,EAAK,SAAW,SAAW,mBAAqB,uBAAuB,EAEjG,SAAAiB,CACA,CAAA,CACA,IACJjB,EAAK,SAAW,UACf,EAAA3C,EAAA,IAAA,CAACnD,EAAD,CACE,QAAQ,QACR,KAAK,UACL,aAAY6D,EAAE,qBAAsB,CAAE,KAAMiC,EAAK,KAAK,IAAK,CAAC,EAC5D,QAASkB,EAET,UAAA,EAAA7D,EAAA,IAAA,CAACjC,EAAD,CAAW,cAAY,MAAQ,CAAA,CACzB,CAAA,EACN,KACH4E,EAAK,SAAW,UAAYA,EAAK,SAAW,QAC3C,EAAA3C,EAAA,IAAA,CAACnD,EAAD,CACE,QAAQ,QACR,KAAK,UACL,aAAY6D,EAAE,uBAAwB,CAAE,KAAMiC,EAAK,KAAK,IAAK,CAAC,EAC9D,QAASmB,EAET,UAAA,EAAA9D,EAAA,IAAA,CAACnE,EAAD,CAAG,cAAY,MAAQ,CAAA,CACjB,CAAA,EACN,IACF,GAER,ECvEakI,IAAe,CAAE,UAAS,eAAkC,CACvE,GAAM,CAAE,KAAM3H,EAAe,EACvB8E,EAAQsB,EAAsB,GAAUE,EAAM,KAAK,EACnDsB,EAAgBxB,EAAsB,GAAUE,EAAM,aAAa,EACnE,CAACuB,EAAcC,IAAA,EAAmBpJ,EAAAA,SAAAA,CAAS,EAAK,EACtD,GAAIoG,EAAM,SAAW,EACnB,OAAO,KAET,IAAMb,EAASa,EAAM,OAAQ,GAASyB,EAAK,SAAW,aAAeA,EAAK,SAAW,YAAY,CAAC,CAAC,OAC7FwB,EAASjD,EAAM,OAAQ,GAASyB,EAAK,SAAW,QAAQ,CAAC,CAAC,OAC1DyB,EAAOlD,EAAM,OAASb,EAAS8D,EAC/BE,EAAUhE,IAAW,GAAK8D,IAAW,EACrCG,EAAW,CAACD,GAAWJ,EAC7B,OACE,EAAAjE,EAAA,IAAA,CAACtB,GAAD,CACE,MAAOgC,EAAE,yBAAyB,EAClC,QAAQ,KACR,MAAO4D,EACP,SACE,EAAAtE,EAAA,KAAA,CAAAjF,EAAAA,SAAA,CAAA,SAAA,EACE,EAAAiF,EAAA,IAAA,CAAC,OAAD,CAAM,KAAK,SAAS,YAAU,SAAS,UAAU,kCAC9C,SAAAqE,EACG3D,EAAE,2BAA4B,CAAE,MAAO0D,CAAK,CAAC,EAC7C1D,EAAE,uBAAwB,CAAE,SAAQ,QAAO,CAAC,CAC5C,CAAA,EACL2D,GACC,EAAArE,EAAA,IAAA,CAACnD,EAAD,CACE,QAAQ,QACR,KAAK,UACL,gBAAeyH,EACf,aAAuB5D,EAAX4D,EAAa,4BAAiC,2BAA2B,EACrF,YAAeJ,EAAiB,GAAY,CAACK,CAAO,EAEnD,SAAAD,GAAW,EAAAtE,EAAA,IAAA,CAAC9C,GAAD,CAAW,cAAY,MAAQ,CAAA,GAAI,EAAA8C,EAAA,IAAA,CAAC5C,GAAD,CAAa,cAAY,MAAQ,CAAA,CAC1E,CAAA,EACN,KACHgH,EAAO,GACN,EAAApE,EAAA,IAAA,CAACnD,EAAD,CAAQ,QAAQ,QAAQ,KAAK,KAAK,QAASmH,EACxC,SAAAtD,EAAE,4BAA4B,CACzB,CAAA,EACN,IACJ,CAAA,CAAA,EAEJ,cAAe4D,EAAW,IAAA,GAAY,SAErC,SAAAA,GACC,EAAAtE,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,oCACX,SAAAkB,EAAM,IAAK,IACV,EAAAlB,EAAA,IAAA,CAAC0D,GAAD,CAEQ,OACN,YAAeG,EAAQlB,EAAK,EAAE,EAC9B,cAAiBmB,EAAUnB,EAAK,EAAE,CACnC,EAJMA,EAAK,EAIX,CACF,CACC,CAAA,EACF,IACC,CAAA,CAEX,EC5DM6B,GAAqB,2BAIrBC,GAAgB,GAA6C,CACjE,IAAMC,EAAU,CACd,SAAU/B,EAAK,KAAK,KACpB,SAAUA,EAAK,KAAK,MAAQ6B,GAC5B,UAAW7B,EAAK,KAAK,IACvB,EACA,OAAOpH,MACLoH,EAAK,eACDjH,EAAS,MAAM,OAAO,QAAQiH,EAAK,eAAgB+B,CAAO,EAC1DhJ,EAAS,MAAM,QAAQ,OAAO,CAAE,GAAGgJ,EAAS,SAAU/B,EAAK,SAAU,WAAYA,EAAK,UAAW,CAAC,CACxG,CACF,EAGMgC,EAAa,MACjB,EACA,EACA,IACwB,CACxB,IAAMC,EAAQ,MAAMH,GAAa9B,CAAI,EAOrC,OANA,MAAMI,GAAmB,CACvB,IAAK7G,GAAiB0I,EAAOpJ,EAAW,CAAC,EACzC,KAAMW,EAAgByI,EAAOjC,EAAK,KAAMA,EAAK,KAAK,IAAI,EACtD,YACF,CAAC,EACDkC,EAAa,EACNtJ,MAAeG,EAAS,MAAM,QAAQ,QAAQkJ,EAAM,OAAO,CAAC,CACrE,EAYaE,OAAyB,CACpC,IAAMC,EAAczJ,EAAe,EAC7B,CAAE,MAAK,SAAQ,UAAWkH,EAAqB,SAAS,EAExDwC,GAAA,EAAMhK,EAAAA,YAAAA,CACV,KAAO,IAAqB,CAC1BiK,EAAOtC,EAAK,GAAI,CAAE,OAAQ,YAAa,SAAU,EAAG,MAAO,IAAA,EAAU,CAAC,EACtE,GAAI,CACF,IAAMxC,EAAQ,MAAMwE,EAClBhC,EACC,GAAasC,EAAOtC,EAAK,GAAI,CAAE,UAAS,CAAC,MACpCsC,EAAOtC,EAAK,GAAI,CAAE,OAAQ,YAAa,CAAC,CAChD,EACAsC,EAAOtC,EAAK,GAAI,CAAE,OAAQ,OAAQ,QAASxC,EAAM,EAAG,CAAC,EACjDwC,EAAK,gBACPjG,EAAM,QAAQzB,EAAQ,EAAE,wBAAyB,CAAE,KAAM0H,EAAK,KAAK,IAAK,CAAC,CAAC,CAE9E,OAASa,EAAO,CACd/G,GAAS+G,EAAO,aAAab,EAAK,KAAK,MAAM,EAC7CsC,EAAOtC,EAAK,GAAI,CAAE,OAAQ,SAAU,OAAM,CAAC,CAC7C,QAAU,CACR,MAAMoC,EAAY,kBAAkB,CAAE,SAAU3J,EAAU,MAAM,GAAI,CAAC,CACvE,CACF,EACA,CAAC2J,EAAaE,CAAM,CACtB,EAsDA,MAAO,CAAE,SAAA,EApDOjK,EAAAA,YAAAA,EACb,EAAwB,IAA4B,CACnD,IAAK,IAAMkK,KAAQ5C,EAAO,CACxB,IAAMK,EAAmB,CACvB,GAAI,OAAO,WAAW,EACtB,OACA,SAAUwC,EAAQ,SAClB,WAAYA,EAAQ,WACpB,eAAgBA,EAAQ,eACxB,OAAQ,YACR,SAAU,EACV,MAAO,IAAA,GACP,QAAS,IAAA,EACX,EACAC,EAAIzC,CAAI,EACRqC,EAASrC,CAAI,CACf,CACF,EACA,CAACyC,EAAKJ,CAAG,CAkCF,EAAS,OAAA,EA/BJhK,EAAAA,YAAAA,CACX,GAAe,CACd,IAAM2H,EAAOH,EAAqB,SAAS,CAAC,CAAC,MAAM,KAAM,GAAc6C,EAAU,KAAOzF,CAAE,EACtF+C,GACFqC,EAASrC,CAAI,CAEjB,EACA,CAACqC,CAAG,CAwBY,EAAO,QAASM,EAAQ,WAAA,EAjBxBtK,EAAAA,YAAAA,CAChB,KAAO,IAAuC,CAC5C,GAAI,CACF,IAAMmF,EAAQ,MAAMwE,EAClB,CAAE,OAAM,SAAU,KAAM,WAAY,SAAU,eAAgB,IAAA,EAAU,MAClE,IAAA,OACA,IAAA,EACR,EAEA,OADAI,EAAY,aAAa3J,EAAU,MAAM,MAAM+E,EAAM,EAAE,EAAGA,CAAK,EACxD,CAAE,GAAIA,EAAM,GAAI,IAAKA,EAAM,KAAO,IAAK,CAChD,QAAU,CACR,MAAM4E,EAAY,kBAAkB,CAAE,SAAU3J,EAAU,MAAM,GAAI,CAAC,CACvE,CACF,EACA,CAAC2J,CAAW,CAG4B,CAAU,CACtD"}
@@ -1,2 +0,0 @@
1
- import{u as e}from"./auth-CQO4MBUj.js";var t=t=>e().data?.networkPermissions.includes(t)??!1;export{t};
2
- //# sourceMappingURL=useNetworkPermission-Cts98h9d.js.map
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{Pt as n,bn as r}from"./src-ndgTSYLX.js";import{u as i}from"./auth-CQO4MBUj.js";import{t as a}from"./createLucideIcon-CLmh7Go-.js";import{l as o}from"./schema-D-qo7XSF.js";import{t as s}from"./modelPermissions-DZ1lWfQZ.js";import{t as c}from"./contentCounts-DP7YYeZZ.js";var l={name:`file-plus-corner`,size:24,node:[[`path`,{d:`M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35`,key:`17jvcc`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M14 19h6`,key:`bvotb8`}],[`path`,{d:`M17 16v6`,key:`18yu1i`}]],aliases:[`file-plus-2`]};l.node;var u=a(l),d=e(t(),1),f=e=>{let t=r(),{data:a,isFetching:o}=i(),s=(0,d.useRef)(new Set);(0,d.useEffect)(()=>{if(!a||!e||o)return;let r=e.map(({definition:e})=>e.id).filter(e=>!(e in a.modelPermissions)&&!s.current.has(e));if(r.length>0){for(let e of r)s.current.add(e);t.invalidateQueries({queryKey:n.me})}},[e,a,o,t])},p={collection:0,singleton:1},m=()=>{let{data:e}=i(),{data:t}=o(`model`),n=c();return f(t),(0,d.useMemo)(()=>t?.flatMap(({definition:t,scope:r})=>t.kind!==`component`&&s(e,t.id,`read`)?[{id:t.id,apiKey:t.apiKey,label:t.label,kind:t.kind,count:t.kind===`collection`?n?.get(t.id):void 0,canCreate:s(e,t.id,`create`),shared:r===`network`}]:[]).sort((e,t)=>p[e.kind]-p[t.kind]||e.label.localeCompare(t.label)),[t,n,e])};export{u as n,m as t};
2
- //# sourceMappingURL=usePlaces-DC47wVeU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usePlaces-DC47wVeU.js","names":["useRef","useMemo","__toESM","queryKeys","useQueryClient","useMe","createLucideIcon","useDefinitions","canOnModel","useContentCounts","__iconData","FilePlusCorner","import_react","require_react","useModelPermissionsRefresh","queryClient","me","asked","definitions","isFetching","unknown","definition","id","KIND_ORDER","usePlaces","counts","scope","a","b"],"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/file-plus-corner.mjs","../../src/features/Shell/hooks/useModelPermissionsRefresh.ts","../../src/features/Shell/hooks/usePlaces.ts"],"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: \"file-plus-corner\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35\",\n key: \"17jvcc\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"path\", { d: \"M14 19h6\", key: \"bvotb8\" }],\n [\"path\", { d: \"M17 16v6\", key: \"18yu1i\" }]\n ],\n aliases: [\"file-plus-2\"]\n};\n__iconData.node;\nconst FilePlusCorner = createLucideIcon(__iconData);\n\nexport { __iconData, FilePlusCorner as default };\n//# sourceMappingURL=file-plus-corner.mjs.map\n","import type { DefinitionListItem } from '@shapio/client';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useRef } from 'react';\nimport { useMe } from '@/api/auth';\nimport { queryKeys } from '@/api/queryKeys';\n\n/**\n * `me.modelPermissions` is keyed by model ID and read once a minute, so a model created since (here or in\n * another session) is missing from it. When the registry shows such a model, re-read `me` once for it.\n */\nexport const useModelPermissionsRefresh = (definitions: readonly DefinitionListItem[] | undefined) => {\n const queryClient = useQueryClient();\n const { data: me, isFetching } = useMe();\n const asked = useRef(new Set<string>());\n useEffect(() => {\n if (!me || !definitions || isFetching) {\n return;\n }\n const unknown = definitions\n .map(({ definition }) => definition.id)\n .filter((id) => !(id in me.modelPermissions) && !asked.current.has(id));\n if (unknown.length > 0) {\n for (const id of unknown) {\n asked.current.add(id);\n }\n void queryClient.invalidateQueries({ queryKey: queryKeys.me });\n }\n }, [definitions, me, isFetching, queryClient]);\n};\n","import { useMemo } from 'react';\nimport { useMe } from '@/api/auth';\nimport { useContentCounts } from '@/api/contentCounts';\nimport { useDefinitions } from '@/api/schema';\nimport { canOnModel } from '@/helpers/modelPermissions';\nimport { useModelPermissionsRefresh } from './useModelPermissionsRefresh';\n\n/** A content type as editors see it: a place in the sidebar. */\nexport type Place = {\n id: string;\n apiKey: string;\n label: string;\n kind: 'collection' | 'singleton';\n /** Entries the admin can read; undefined until counts load (or for single types, which need none). */\n count: number | undefined;\n canCreate: boolean;\n /** Shared with all sites (rather than this site's own). */\n shared: boolean;\n};\n\nconst KIND_ORDER = { collection: 0, singleton: 1 } as const;\n\n/**\n * The places the admin may read, from the model registry: collections, then single types, by label. Models\n * are data (CONTRIBUTING.md rule 2), so a model created a moment ago appears as soon as the registry refreshes.\n */\nexport const usePlaces = (): Place[] | undefined => {\n const { data: me } = useMe();\n const { data: definitions } = useDefinitions('model');\n const counts = useContentCounts();\n useModelPermissionsRefresh(definitions);\n return useMemo(\n () =>\n definitions\n ?.flatMap(({ definition, scope }): Place[] =>\n definition.kind !== 'component' && canOnModel(me, definition.id, 'read')\n ? [\n {\n id: definition.id,\n apiKey: definition.apiKey,\n label: definition.label,\n kind: definition.kind,\n count: definition.kind === 'collection' ? counts?.get(definition.id) : undefined,\n canCreate: canOnModel(me, definition.id, 'create'),\n shared: scope === 'network',\n },\n ]\n : [],\n )\n .sort((a, b) => KIND_ORDER[a.kind] - KIND_ORDER[b.kind] || a.label.localeCompare(b.label)),\n [definitions, counts, me],\n );\n};\n"],"ignoreList":[0],"mappings":"2WASA,IAAMU,EAAa,CACjB,KAAM,mBACN,KAAM,GACN,KAAM,CACJ,CACE,OACA,CACE,EAAG,0GACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAS,CAAC,EACxD,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAC3C,EACA,QAAS,CAAC,aAAa,CACzB,EACAA,EAAW,KACX,IAAMC,EAAiBL,EAAiBI,CAAU,aCjBrCI,EAA8B,GAA2D,CACpG,IAAMC,EAAcX,EAAe,EAC7B,CAAE,KAAMY,EAAI,cAAeX,EAAM,EACjCY,GAAA,EAAQjB,EAAAA,OAAAA,CAAO,IAAI,GAAa,GACtC,EAAAY,EAAA,UAAA,KAAgB,CACd,GAAI,CAACI,GAAM,CAACE,GAAeC,EACzB,OAEF,IAAMC,EAAUF,EACb,KAAK,CAAE,gBAAiBG,EAAW,EAAE,CAAC,CACtC,OAAQ,GAAO,EAAEC,KAAMN,EAAG,mBAAqB,CAACC,EAAM,QAAQ,IAAIK,CAAE,CAAC,EACxE,GAAIF,EAAQ,OAAS,EAAG,CACtB,IAAK,IAAME,KAAMF,EACfH,EAAM,QAAQ,IAAIK,CAAE,EAEtBP,EAAiB,kBAAkB,CAAE,SAAUZ,EAAU,EAAG,CAAC,CAC/D,CACF,EAAG,CAACe,EAAaF,EAAIG,EAAYJ,CAAW,CAAC,CAC/C,ECRMQ,EAAa,CAAE,WAAY,EAAG,UAAW,CAAE,EAMpCC,MAAuC,CAClD,GAAM,CAAE,KAAMR,GAAOX,EAAM,EACrB,CAAE,KAAMa,GAAgBX,EAAe,OAAO,EAC9CkB,EAAShB,EAAiB,EAEhC,OADAK,EAA2BI,CAAW,GACtC,EAAOjB,EAAAA,QAAAA,KAEHiB,GACI,SAAS,CAAE,aAAY,WACvBG,EAAW,OAAS,aAAeb,EAAWQ,EAAIK,EAAW,GAAI,MAAM,EACnE,CACE,CACE,GAAIA,EAAW,GACf,OAAQA,EAAW,OACnB,MAAOA,EAAW,MAClB,KAAMA,EAAW,KACjB,MAAOA,EAAW,OAAS,aAAeI,GAAQ,IAAIJ,EAAW,EAAE,EAAI,IAAA,GACvE,UAAWb,EAAWQ,EAAIK,EAAW,GAAI,QAAQ,EACjD,OAAQK,IAAU,SACpB,CACF,EACA,CAAC,CACP,CAAC,CACA,MAAM,EAAG,IAAMH,EAAWI,EAAE,MAAQJ,EAAWK,EAAE,OAASD,EAAE,MAAM,cAAcC,EAAE,KAAK,CAAC,EAC7F,CAACV,EAAaO,EAAQT,CAAE,CAC1B,CACF"}
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{$t as n,Gt as r,Jt as i,Kt as a,Wt as o,Xt as s,Yt as c,Zt as l,_n as u,bn as d,hn as f,in as p,on as m,pn as h,qt as g}from"./src-ndgTSYLX.js";function _(e,t){let n=new Set(t);return e.filter(e=>!n.has(e))}var v=class extends m{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l=[];constructor(e,t,n){super(),this.#e=e,this.#r=n,this.#n=[],this.#i=[],this.#t=[],this.setQueries(t)}onSubscribe(){this.listeners.size===1&&this.#i.forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,this.#i.forEach(e=>{e.destroy()})}setQueries(e,t){this.#n=e,this.#r=t,p.batch(()=>{let e=this.#i,t=this.#p(this.#n);t.forEach(e=>e.observer.setOptions(e.defaultedQueryOptions));let n=t.map(e=>e.observer),r=n.map(e=>e.getCurrentResult()),i=e.length!==n.length,a=n.some((t,n)=>t!==e[n]),o=i||a,s=o?!0:r.some((e,t)=>{let n=this.#t[t];return!n||!u(e,n)});(o||s)&&(o&&(this.#l=t,this.#i=n),this.#t=r,this.hasListeners()&&(o&&(_(e,n).forEach(e=>{e.destroy()}),_(n,e).forEach(e=>{e.subscribe(t=>{this.#m(e,t)})})),this.#h()))})}getCurrentResult(){return this.#t}getQueries(){return this.#i.map(e=>e.getCurrentQuery())}getObservers(){return this.#i}getOptimisticResult(e,t){let n=this.#p(e),r=n.map(e=>e.observer.getOptimisticResult(e.defaultedQueryOptions)),i=n.map(e=>e.defaultedQueryOptions.queryHash);return[r,e=>this.#d(e??r,t,i),()=>this.#u(r,n)]}#u(e,t){let n=new Set;return t.map((r,i)=>{let a=e[i];return r.defaultedQueryOptions.notifyOnChangeProps?a:r.observer.trackResult(a,e=>{n.has(e)||(n.add(e),t.forEach(t=>{t.observer.trackProp(e)}))})})}#d(e,t,n){if(t){let r=this.#c,i=n!==void 0&&r!==void 0&&(r.length!==n.length||n.some((e,t)=>e!==r[t]));return(this.#t!==this.#s||i||t!==this.#o)&&(this.#o=t,this.#s=this.#t,n!==void 0&&(this.#c=n),this.#a=f(this.#a,t(e))),this.#a}return e}#f(){return!this.#r?.combine||this.#i.some((e,t)=>e.options.suspense&&this.#t[t]?.data===void 0)}#p(e){let t=new Map;this.#i.forEach(e=>{let n=e.options.queryHash;if(!n)return;let r=t.get(n);r?r.push(e):t.set(n,[e])});let r=[];return e.forEach(e=>{let i=this.#e.defaultQueryOptions(e),a=t.get(i.queryHash)?.shift()??new n(this.#e,i);r.push({defaultedQueryOptions:i,observer:a})}),r}#m(e,t){let n=this.#i.indexOf(e);n!==-1&&(this.#t=this.#t.slice(),this.#t[n]=t,this.#h())}#h(){if(this.hasListeners()){let e=this.#f(),t=this.#a,n=e?t:this.#d(this.#u(this.#t,this.#l),this.#r?.combine);(e||t!==n)&&p.batch(()=>{this.listeners.forEach(e=>{e(this.#t)})})}}},y=e(t(),1);function b({queries:e,...t},u){let f=d(u),m=l(),_=s(),b=t.subscribed!==!1,x=y.useMemo(()=>e.map(e=>{let t=f.defaultQueryOptions(e);return t._optimisticResults=m?`isRestoring`:b?`optimistic`:void 0,t}),[e,f,m,b]);x.forEach(e=>{o(e);let t=f.getQueryCache().get(e.queryHash);g(e,_,t)}),c(_);let[S]=y.useState(()=>new v(f,x,t)),[C,w,T]=S.getOptimisticResult(x,t.combine),E=!m&&b;y.useSyncExternalStore(y.useCallback(e=>E?S.subscribe(p.batchCalls(e)):h,[S,E]),()=>S.getCurrentResult(),()=>S.getCurrentResult()),y.useEffect(()=>{S.setQueries(x,t)},[x,t,S]);let D=C.some((e,t)=>a(x[t],e))?C.flatMap((e,t)=>{let i=x[t];if(i&&a(i,e)){let e=new n(f,i);return r(i,e,_)}return[]}):[];if(D.length>0)throw Promise.all(D);let O=C.find((e,t)=>{let n=x[t];return n&&i({result:e,errorResetBoundary:_,throwOnError:n.throwOnError,query:f.getQueryCache().get(n.queryHash),suspense:n.suspense})});if(O)throw O.error;return w(T())}export{b as t};
2
- //# sourceMappingURL=useQueries-CirW3Mvp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useQueries-CirW3Mvp.js","names":["__toESM","QueryObserver","fetchOptimistic","getHasError","shouldSuspend","ensureSuspenseTimers","useQueryErrorResetBoundary","useClearResetErrorBoundary","useIsRestoring","shallowEqualObjects","useQueryClient","replaceEqualDeep","notifyManager","Subscribable","noop","ensurePreventErrorBoundaryRetry","difference","excludeSet","array2","array1","x","QueriesObserver","#client","client","#options","options","#queries","#observers","#result","queries","observer","#onUpdate","result","prevObservers","newObserverMatches","#findMatchingObservers","match","newObservers","newResult","hasLengthChange","hasIndexChange","index","hasStructuralChange","hasResultChange","prev","#observerMatches","#notify","matches","queryHashes","#combineResult","r","combine","#trackResult","trackedProps","observerResult","accessedProp","m","lastHashes","#lastQueryHashes","queryHashesChanged","hash","i","#lastResult","#lastCombine","#combinedResult","input","prevObserversMap","key","previousObservers","observers","defaultedOptions","shouldSkipCombine","#shouldSkipCombine","previousResult","listener","import_react","require_react","useQueries","queryClient","isRestoring","errorResetBoundary","subscribed","defaultedQueries","opts","queryOptions","query","optimisticResult","getCombinedResult","trackResult","shouldSubscribe","onStoreChange","suspensePromises","queryObserver","firstSingleResultWhichShouldThrow"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.104.0/node_modules/@tanstack/query-core/build/modern/queriesObserver.js","../../../../node_modules/.pnpm/@tanstack+react-query@5.104.0_react@19.3.0/node_modules/@tanstack/react-query/build/modern/useQueries.js"],"sourcesContent":["import { replaceEqualDeep, shallowEqualObjects } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { QueryObserver } from \"./queryObserver.js\";\n//#region src/queriesObserver.ts\nfunction difference(array1, array2) {\n\tconst excludeSet = new Set(array2);\n\treturn array1.filter((x) => !excludeSet.has(x));\n}\n/**\n* A `QueriesObserver` watches an array of queries at once, exposing them as\n* a single array of `QueryObserverResult`s (or, when a `combine` option is\n* given, as a combined value derived from that array). It manages one\n* internal `QueryObserver` per query, and is the primitive that framework\n* adapters (e.g. `useQueries`) build their hooks on top of.\n*\n* @example\n* ```ts\n* const observer = new QueriesObserver(queryClient, [\n* { queryKey: ['post', 1], queryFn: fetchPost },\n* { queryKey: ['post', 2], queryFn: fetchPost },\n* ])\n*\n* const unsubscribe = observer.subscribe((result) => {\n* console.log(result)\n* })\n* ```\n*/\nvar QueriesObserver = class extends Subscribable {\n\t#client;\n\t#result;\n\t#queries;\n\t#options;\n\t#observers;\n\t#combinedResult;\n\t#lastCombine;\n\t#lastResult;\n\t#lastQueryHashes;\n\t#observerMatches = [];\n\tconstructor(client, queries, options) {\n\t\tsuper();\n\t\tthis.#client = client;\n\t\tthis.#options = options;\n\t\tthis.#queries = [];\n\t\tthis.#observers = [];\n\t\tthis.#result = [];\n\t\tthis.setQueries(queries);\n\t}\n\tonSubscribe() {\n\t\tif (this.listeners.size === 1) this.#observers.forEach((observer) => {\n\t\t\tobserver.subscribe((result) => {\n\t\t\t\tthis.#onUpdate(observer, result);\n\t\t\t});\n\t\t});\n\t}\n\tonUnsubscribe() {\n\t\tif (!this.listeners.size) this.destroy();\n\t}\n\t/**\n\t* Stops observing all queries: clears all listeners and destroys every\n\t* underlying `QueryObserver` this observer manages.\n\t*/\n\tdestroy() {\n\t\tthis.listeners = /* @__PURE__ */ new Set();\n\t\tthis.#observers.forEach((observer) => {\n\t\t\tobserver.destroy();\n\t\t});\n\t}\n\t/**\n\t* Replaces the set of queries being observed. Existing `QueryObserver`s\n\t* are reused for queries that match an already-observed query hash;\n\t* observers for queries that are no longer present are destroyed, and new\n\t* observers are created and subscribed to for newly added queries.\n\t*\n\t* @example\n\t* ```ts\n\t* observer.setQueries([\n\t* { queryKey: ['post', 1], queryFn: fetchPost },\n\t* { queryKey: ['post', 3], queryFn: fetchPost },\n\t* ])\n\t* ```\n\t*/\n\tsetQueries(queries, options) {\n\t\tthis.#queries = queries;\n\t\tthis.#options = options;\n\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\tconst queryHashes = queries.map((query) => this.#client.defaultQueryOptions(query).queryHash);\n\t\t\tif (new Set(queryHashes).size !== queryHashes.length) console.warn(\"[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.\");\n\t\t}\n\t\tnotifyManager.batch(() => {\n\t\t\tconst prevObservers = this.#observers;\n\t\t\tconst newObserverMatches = this.#findMatchingObservers(this.#queries);\n\t\t\tnewObserverMatches.forEach((match) => match.observer.setOptions(match.defaultedQueryOptions));\n\t\t\tconst newObservers = newObserverMatches.map((match) => match.observer);\n\t\t\tconst newResult = newObservers.map((observer) => observer.getCurrentResult());\n\t\t\tconst hasLengthChange = prevObservers.length !== newObservers.length;\n\t\t\tconst hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);\n\t\t\tconst hasStructuralChange = hasLengthChange || hasIndexChange;\n\t\t\tconst hasResultChange = hasStructuralChange ? true : newResult.some((result, index) => {\n\t\t\t\tconst prev = this.#result[index];\n\t\t\t\treturn !prev || !shallowEqualObjects(result, prev);\n\t\t\t});\n\t\t\tif (!hasStructuralChange && !hasResultChange) return;\n\t\t\tif (hasStructuralChange) {\n\t\t\t\tthis.#observerMatches = newObserverMatches;\n\t\t\t\tthis.#observers = newObservers;\n\t\t\t}\n\t\t\tthis.#result = newResult;\n\t\t\tif (!this.hasListeners()) return;\n\t\t\tif (hasStructuralChange) {\n\t\t\t\tdifference(prevObservers, newObservers).forEach((observer) => {\n\t\t\t\t\tobserver.destroy();\n\t\t\t\t});\n\t\t\t\tdifference(newObservers, prevObservers).forEach((observer) => {\n\t\t\t\t\tobserver.subscribe((result) => {\n\t\t\t\t\t\tthis.#onUpdate(observer, result);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.#notify();\n\t\t});\n\t}\n\t/**\n\t* Returns the most recently computed array of `QueryObserverResult`s, one\n\t* per observed query, in the same order as the queries passed to the\n\t* constructor or `setQueries`.\n\t*\n\t* @example\n\t* ```ts\n\t* const results = observer.getCurrentResult()\n\t* const data = results.map((result) => result.data)\n\t* ```\n\t*/\n\tgetCurrentResult() {\n\t\treturn this.#result;\n\t}\n\t/**\n\t* Returns the underlying `Query` instances currently being observed, in\n\t* the same order as the queries passed to the constructor or `setQueries`.\n\t*/\n\tgetQueries() {\n\t\treturn this.#observers.map((observer) => observer.getCurrentQuery());\n\t}\n\t/**\n\t* Returns the underlying `QueryObserver` instances this observer manages,\n\t* in the same order as the queries passed to the constructor or\n\t* `setQueries`.\n\t*/\n\tgetObservers() {\n\t\treturn this.#observers;\n\t}\n\t/**\n\t* The `QueriesObserver` counterpart of {@link QueryObserver#getOptimisticResult} — computes\n\t* the result for the given (already-defaulted) queries right now, synchronously. Called by\n\t* framework adapters (e.g. `useQueries`) ahead of subscribing, returning a tuple of the raw\n\t* per-query results, a function to compute the combined result from them, and a function to\n\t* wrap the results for property-access tracking.\n\t*/\n\tgetOptimisticResult(queries, combine) {\n\t\tconst matches = this.#findMatchingObservers(queries);\n\t\tconst result = matches.map((match) => match.observer.getOptimisticResult(match.defaultedQueryOptions));\n\t\tconst queryHashes = matches.map((match) => match.defaultedQueryOptions.queryHash);\n\t\treturn [\n\t\t\tresult,\n\t\t\t(r) => {\n\t\t\t\treturn this.#combineResult(r ?? result, combine, queryHashes);\n\t\t\t},\n\t\t\t() => {\n\t\t\t\treturn this.#trackResult(result, matches);\n\t\t\t}\n\t\t];\n\t}\n\t#trackResult(result, matches) {\n\t\tconst trackedProps = /* @__PURE__ */ new Set();\n\t\treturn matches.map((match, index) => {\n\t\t\tconst observerResult = result[index];\n\t\t\treturn !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => {\n\t\t\t\tif (!trackedProps.has(accessedProp)) {\n\t\t\t\t\ttrackedProps.add(accessedProp);\n\t\t\t\t\tmatches.forEach((m) => {\n\t\t\t\t\t\tm.observer.trackProp(accessedProp);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}) : observerResult;\n\t\t});\n\t}\n\t#combineResult(input, combine, queryHashes) {\n\t\tif (combine) {\n\t\t\tconst lastHashes = this.#lastQueryHashes;\n\t\t\tconst queryHashesChanged = queryHashes !== void 0 && lastHashes !== void 0 && (lastHashes.length !== queryHashes.length || queryHashes.some((hash, i) => hash !== lastHashes[i]));\n\t\t\tif (this.#result !== this.#lastResult || queryHashesChanged || combine !== this.#lastCombine) {\n\t\t\t\tthis.#lastCombine = combine;\n\t\t\t\tthis.#lastResult = this.#result;\n\t\t\t\tif (queryHashes !== void 0) this.#lastQueryHashes = queryHashes;\n\t\t\t\tthis.#combinedResult = replaceEqualDeep(this.#combinedResult, combine(input));\n\t\t\t}\n\t\t\treturn this.#combinedResult;\n\t\t}\n\t\treturn input;\n\t}\n\t#shouldSkipCombine() {\n\t\treturn !this.#options?.combine || this.#observers.some((observer, index) => {\n\t\t\treturn observer.options.suspense && this.#result[index]?.data === void 0;\n\t\t});\n\t}\n\t#findMatchingObservers(queries) {\n\t\tconst prevObserversMap = /* @__PURE__ */ new Map();\n\t\tthis.#observers.forEach((observer) => {\n\t\t\tconst key = observer.options.queryHash;\n\t\t\tif (!key) return;\n\t\t\tconst previousObservers = prevObserversMap.get(key);\n\t\t\tif (previousObservers) previousObservers.push(observer);\n\t\t\telse prevObserversMap.set(key, [observer]);\n\t\t});\n\t\tconst observers = [];\n\t\tqueries.forEach((options) => {\n\t\t\tconst defaultedOptions = this.#client.defaultQueryOptions(options);\n\t\t\tconst observer = prevObserversMap.get(defaultedOptions.queryHash)?.shift() ?? new QueryObserver(this.#client, defaultedOptions);\n\t\t\tobservers.push({\n\t\t\t\tdefaultedQueryOptions: defaultedOptions,\n\t\t\t\tobserver\n\t\t\t});\n\t\t});\n\t\treturn observers;\n\t}\n\t#onUpdate(observer, result) {\n\t\tconst index = this.#observers.indexOf(observer);\n\t\tif (index !== -1) {\n\t\t\tthis.#result = this.#result.slice();\n\t\t\tthis.#result[index] = result;\n\t\t\tthis.#notify();\n\t\t}\n\t}\n\t#notify() {\n\t\tif (this.hasListeners()) {\n\t\t\tconst shouldSkipCombine = this.#shouldSkipCombine();\n\t\t\tconst previousResult = this.#combinedResult;\n\t\t\tconst newResult = shouldSkipCombine ? previousResult : this.#combineResult(this.#trackResult(this.#result, this.#observerMatches), this.#options?.combine);\n\t\t\tif (shouldSkipCombine || previousResult !== newResult) notifyManager.batch(() => {\n\t\t\t\tthis.listeners.forEach((listener) => {\n\t\t\t\t\tlistener(this.#result);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n};\n//#endregion\nexport { QueriesObserver };\n\n//# sourceMappingURL=queriesObserver.js.map","\"use client\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport { ensurePreventErrorBoundaryRetry, getHasError, useClearResetErrorBoundary } from \"./errorBoundaryUtils.js\";\nimport { ensureSuspenseTimers, fetchOptimistic, shouldSuspend } from \"./suspense.js\";\nimport * as React from \"react\";\nimport { QueriesObserver, QueryObserver, noop, notifyManager } from \"@tanstack/query-core\";\n//#region src/useQueries.ts\n/**\n* The `useQueries` hook can be used to fetch a variable number of queries.\n*\n* The `queries` key accepts an array with query option objects mostly identical to `useQuery` — the top-level\n* `subscribed` option isn't accepted per query (see `placeholderData` below for another difference). A custom\n* `QueryClient` is supplied once, as `useQueries`' own top-level second argument, rather than per query.\n*\n* Having the same query key more than once in the array of query objects may cause some data to be shared\n* between queries. To avoid this, consider de-duplicating the queries and map the results back to the desired\n* structure.\n*\n* The `combine` option can be used to combine the results of the queries into a single value. The result will\n* be structurally shared to be as referentially stable as possible.\n*\n* @remarks The `combine` function only re-runs if it changed referentially, or if any of the query results\n* changed. An inlined `combine` function, as shown in the example below, therefore runs on every render — wrap\n* it in `useCallback`, or extract it to a stable function reference if it doesn't have any dependencies, to\n* avoid that.\n*\n* Unlike `useQuery`, `useQueries` cannot infer the `data` argument of an _inline_ `select` from its sibling\n* `queryFn`. Because `useQueries` infers the type of the whole `queries` array at once, the `select` parameter\n* of a query object written inline cannot be contextually typed from that same object's `queryFn`, so it falls\n* back to `unknown` — a [known TypeScript limitation](https://github.com/TanStack/query/issues/6556). Annotate\n* the `select` parameter explicitly, or define the query with {@link queryOptions}, which resolves its types in\n* a single object _before_ it reaches `useQueries`, to work around this — see the example below. The same\n* limitation applies to {@link useSuspenseQueries}.\n*\n* `placeholderData` is supported here too, but unlike `useQuery`, it doesn't receive information from\n* previously rendered queries, because the number of queries can differ between renders.\n* @param queryClient - Use this to provide a custom `QueryClient`. Otherwise, the one from the nearest context\n* will be used.\n* @returns The combined result. Without `combine`, this is an array with all the query results, in the same\n* order as the input. When `combine` is provided, this is the value returned by `combine` instead.\n*\n* @example\n* ```tsx\n* import { useQueries } from '@tanstack/react-query'\n*\n* function Posts({ ids }: { ids: Array<number> }) {\n* const postQueries = useQueries({\n* queries: ids.map((id) => ({\n* queryKey: ['post', id],\n* queryFn: () => fetchPost(id),\n* staleTime: Infinity,\n* })),\n* })\n*\n* return (\n* <ul>\n* {postQueries.map((query, index) => {\n* if (query.isPending) return <li key={ids[index]}>Loading...</li>\n* if (query.isError) return <li key={ids[index]}>Error: {query.error.message}</li>\n* return <li key={ids[index]}>{query.data.title}</li>\n* })}\n* </ul>\n* )\n* }\n* ```\n*\n* @example\n* Combining results into a single value:\n* ```tsx\n* import { useQueries } from '@tanstack/react-query'\n*\n* function Posts({ ids }: { ids: Array<number> }) {\n* const { data, isPending, isError } = useQueries({\n* queries: ids.map((id) => ({\n* queryKey: ['post', id],\n* queryFn: () => fetchPost(id),\n* })),\n* combine: (postQueries) => {\n* return {\n* data: postQueries.map((query) => query.data),\n* isPending: postQueries.some((query) => query.isPending),\n* isError: postQueries.some((query) => query.isError),\n* }\n* },\n* })\n*\n* if (isPending) return 'Loading...'\n* if (isError) return 'Error loading posts'\n*\n* return (\n* <ul>\n* {data.map((post) => (\n* <li key={post?.id}>{post?.title}</li>\n* ))}\n* </ul>\n* )\n* }\n* ```\n*\n* @example\n* Typing `select` via {@link queryOptions}. Note that spreading a `queryOptions` result and overriding\n* `select` inline still falls back to `unknown` — wrap the spread in `queryOptions` again so the override is\n* resolved before it reaches `useQueries`:\n* ```tsx\n* import { queryOptions, useQueries } from '@tanstack/react-query'\n*\n* const postOptions = (id: number) =>\n* queryOptions({\n* queryKey: ['post', id],\n* queryFn: () => fetchPost(id),\n* })\n*\n* function PostTitle({ id }: { id: number }) {\n* const [{ data: broken }] = useQueries({\n* queries: [\n* {\n* ...postOptions(id),\n* // ❌ `data` is `unknown` here\n* select: (data) => data.title,\n* },\n* ],\n* })\n*\n* const [{ data: fixed }] = useQueries({\n* queries: [\n* queryOptions({\n* ...postOptions(id),\n* // ✅ `data` is `Post`\n* select: (data) => data.title,\n* }),\n* ],\n* })\n*\n* return <h1>{fixed}</h1>\n* }\n* ```\n*/\nfunction useQueries({ queries, ...options }, queryClient) {\n\tconst client = useQueryClient(queryClient);\n\tconst isRestoring = useIsRestoring();\n\tconst errorResetBoundary = useQueryErrorResetBoundary();\n\tconst subscribed = options.subscribed !== false;\n\tconst defaultedQueries = React.useMemo(() => queries.map((opts) => {\n\t\tconst defaultedOptions = client.defaultQueryOptions(opts);\n\t\tdefaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : subscribed ? \"optimistic\" : void 0;\n\t\treturn defaultedOptions;\n\t}), [\n\t\tqueries,\n\t\tclient,\n\t\tisRestoring,\n\t\tsubscribed\n\t]);\n\tdefaultedQueries.forEach((queryOptions) => {\n\t\tensureSuspenseTimers(queryOptions);\n\t\tconst query = client.getQueryCache().get(queryOptions.queryHash);\n\t\tensurePreventErrorBoundaryRetry(queryOptions, errorResetBoundary, query);\n\t});\n\tuseClearResetErrorBoundary(errorResetBoundary);\n\tconst [observer] = React.useState(() => new QueriesObserver(client, defaultedQueries, options));\n\tconst [optimisticResult, getCombinedResult, trackResult] = observer.getOptimisticResult(defaultedQueries, options.combine);\n\tconst shouldSubscribe = !isRestoring && subscribed;\n\tReact.useSyncExternalStore(React.useCallback((onStoreChange) => shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop, [observer, shouldSubscribe]), () => observer.getCurrentResult(), () => observer.getCurrentResult());\n\tReact.useEffect(() => {\n\t\tobserver.setQueries(defaultedQueries, options);\n\t}, [\n\t\tdefaultedQueries,\n\t\toptions,\n\t\tobserver\n\t]);\n\tconst suspensePromises = optimisticResult.some((result, index) => shouldSuspend(defaultedQueries[index], result)) ? optimisticResult.flatMap((result, index) => {\n\t\tconst opts = defaultedQueries[index];\n\t\tif (opts && shouldSuspend(opts, result)) {\n\t\t\tconst queryObserver = new QueryObserver(client, opts);\n\t\t\treturn fetchOptimistic(opts, queryObserver, errorResetBoundary);\n\t\t}\n\t\treturn [];\n\t}) : [];\n\tif (suspensePromises.length > 0) throw Promise.all(suspensePromises);\n\tconst firstSingleResultWhichShouldThrow = optimisticResult.find((result, index) => {\n\t\tconst query = defaultedQueries[index];\n\t\treturn query && getHasError({\n\t\t\tresult,\n\t\t\terrorResetBoundary,\n\t\t\tthrowOnError: query.throwOnError,\n\t\t\tquery: client.getQueryCache().get(query.queryHash),\n\t\t\tsuspense: query.suspense\n\t\t});\n\t});\n\tif (firstSingleResultWhichShouldThrow) throw firstSingleResultWhichShouldThrow.error;\n\treturn getCombinedResult(trackResult());\n}\n//#endregion\nexport { useQueries };\n\n//# sourceMappingURL=useQueries.js.map"],"ignoreList":[0,1],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";var n=e(t(),1),r=(e,t)=>{let r=(0,n.useRef)(e);(0,n.useEffect)(()=>{r.current=e}),(0,n.useEffect)(()=>{if(!t)return;let e=e=>{(e.metaKey||e.ctrlKey)&&!e.altKey&&e.key.toLowerCase()===`s`&&(e.preventDefault(),r.current())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t])};export{r as t};
2
- //# sourceMappingURL=useSaveShortcut-rKtp1qK7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSaveShortcut-rKtp1qK7.js","names":["useRef","__toESM","import_react","require_react","useSaveShortcut","latest","onSave","enabled","onKeyDown","event"],"sources":["../../src/hooks/useSaveShortcut.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/**\n * Mod+S runs `onSave` (instead of the browser's \"save page\") while `enabled`. The entry form saves with it,\n * the model builder opens its review.\n */\nexport const useSaveShortcut = (onSave: () => void, enabled: boolean) => {\n const latest = useRef(onSave);\n useEffect(() => {\n latest.current = onSave;\n });\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && !event.altKey && event.key.toLowerCase() === 's') {\n event.preventDefault();\n latest.current();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [enabled]);\n};\n"],"mappings":"qGAMaI,GAAmB,EAAoB,IAAqB,CACvE,IAAMC,GAAA,EAASL,EAAAA,OAAAA,CAAOM,CAAM,GAC5B,EAAAJ,EAAA,UAAA,KAAgB,CACd,EAAO,QAAUI,CACnB,CAAC,GACD,EAAAJ,EAAA,UAAA,KAAgB,CACd,GAAI,CAACK,EACH,OAEF,IAAMC,EAAa,GAAyB,EACrCC,EAAM,SAAWA,EAAM,UAAY,CAACA,EAAM,QAAUA,EAAM,IAAI,YAAY,IAAM,MACnFA,EAAM,eAAe,EACrBJ,EAAO,QAAQ,EAEnB,EAEA,OADA,OAAO,iBAAiB,UAAWG,CAAS,MAC/B,OAAO,oBAAoB,UAAWA,CAAS,CAC9D,EAAG,CAACD,CAAO,CAAC,CACd"}
@@ -1,2 +0,0 @@
1
- import{Ht as e,Pt as t,Vt as n,bn as r,ct as i,un as a,ut as o}from"./src-ndgTSYLX.js";import{n as s,t as c}from"./createLucideIcon-CLmh7Go-.js";var l={name:`user-plus`,size:24,node:[[`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`,key:`1yyitq`}],[`circle`,{cx:`9`,cy:`7`,r:`4`,key:`nufk8`}],[`line`,{x1:`19`,x2:`19`,y1:`8`,y2:`14`,key:`1bvyxn`}],[`line`,{x1:`22`,x2:`16`,y1:`11`,y2:`11`,key:`1shjgl`}]]};l.node;var u=c(l),d=n=>e({queryKey:t.audit.list(n),queryFn:()=>o.audit.list(n),placeholderData:a,meta:{silent:!0}}),f=[`name`,`title`,`label`,`email`,`filename`,`apiKey`],p=e=>{if(typeof e!=`object`||!e)return;let t=e;for(let e of f){let n=t[e];if(typeof n==`string`&&n.trim()!==``)return n}},m={"admin_user.create":`audit.actions.adminUserCreate`,"admin_user.delete":`audit.actions.adminUserDelete`,"admin_user.password_change":`audit.actions.adminUserPasswordChange`,"admin_user.update":`audit.actions.adminUserUpdate`,"api_token.create":`audit.actions.apiTokenCreate`,"api_token.revoke":`audit.actions.apiTokenRevoke`,"app_auth.refresh_reuse":`audit.actions.appAuthRefreshReuse`,"app_role.create":`audit.actions.appRoleCreate`,"app_role.delete":`audit.actions.appRoleDelete`,"app_role.update":`audit.actions.appRoleUpdate`,"app_user.block":`audit.actions.appUserBlock`,"app_user.unblock":`audit.actions.appUserUnblock`,"app_user.confirm_email":`audit.actions.appUserConfirmEmail`,"app_user.confirmation_resend":`audit.actions.appUserConfirmationResend`,"app_user.delete":`audit.actions.appUserDelete`,"app_user.oauth_link":`audit.actions.appUserOauthLink`,"app_user.password_change":`audit.actions.appUserPasswordChange`,"app_user.password_reset":`audit.actions.appUserPasswordReset`,"app_user.password_reset_request":`audit.actions.appUserPasswordResetRequest`,"app_user.register":`audit.actions.appUserRegister`,"app_user.roles_change":`audit.actions.appUserRolesChange`,"app_user.update":`audit.actions.appUserUpdate`,"assist.alt_text":`audit.actions.assistAltText`,"assist.content_ops":`audit.actions.assistContentOps`,"assist.rewrite":`audit.actions.assistRewrite`,"assist.schema_draft":`audit.actions.assistSchemaDraft`,"assist.summarize":`audit.actions.assistSummarize`,"assist.translate":`audit.actions.assistTranslate`,"auth.login":`audit.actions.authLogin`,"auth.logout":`audit.actions.authLogout`,"auth.password_reset":`audit.actions.authPasswordReset`,"auth.password_reset_request":`audit.actions.authPasswordResetRequest`,"change_set.create":`audit.actions.changeSetCreate`,"change_set.discard":`audit.actions.changeSetDiscard`,"change_set.item_add":`audit.actions.changeSetItemAdd`,"change_set.item_changed_after_review":`audit.actions.changeSetItemChangedAfterReview`,"change_set.item_remove":`audit.actions.changeSetItemRemove`,"change_set.schedule":`audit.actions.changeSetSchedule`,"change_set.schema_draft":`audit.actions.changeSetSchemaDraft`,"change_set.schema_draft_remove":`audit.actions.changeSetSchemaDraftRemove`,"change_set.ship":`audit.actions.changeSetShip`,"change_set.shipping":`audit.actions.changeSetShipping`,"change_set.unschedule":`audit.actions.changeSetUnschedule`,"change_set.update":`audit.actions.changeSetUpdate`,"content.delete":`audit.actions.contentDelete`,"content.publish":`audit.actions.contentPublish`,"content.restore":`audit.actions.contentRestore`,"content.unpublish":`audit.actions.contentUnpublish`,"deployment.retry":`audit.actions.deploymentRetry`,"deployment.trigger":`audit.actions.deploymentTrigger`,"deployment_connection.create":`audit.actions.deploymentConnectionCreate`,"deployment_connection.delete":`audit.actions.deploymentConnectionDelete`,"deployment_connection.update":`audit.actions.deploymentConnectionUpdate`,"invitation.accept":`audit.actions.invitationAccept`,"invitation.create":`audit.actions.invitationCreate`,"invitation.link":`audit.actions.invitationLink`,"invitation.revoke":`audit.actions.invitationRevoke`,"job.retry":`audit.actions.jobRetry`,"locale.create":`audit.actions.localeCreate`,"locale.delete":`audit.actions.localeDelete`,"locale.update":`audit.actions.localeUpdate`,"media.delete":`audit.actions.mediaDelete`,"media.folder.delete":`audit.actions.mediaFolderDelete`,"media.replace":`audit.actions.mediaReplace`,"media.upload":`audit.actions.mediaUpload`,"media.visibility.change":`audit.actions.mediaVisibilityChange`,"preview_token.create":`audit.actions.previewTokenCreate`,"preview_token.revoke":`audit.actions.previewTokenRevoke`,"publishing.schedule":`audit.actions.publishingSchedule`,"publishing.schedule.publish":`audit.actions.publishingSchedulePublish`,"publishing.schedule.unpublish":`audit.actions.publishingScheduleUnpublish`,"publishing.schedule.cancel":`audit.actions.publishingScheduleCancel`,"publishing.schedule.execute":`audit.actions.publishingScheduleExecute`,"role.create":`audit.actions.roleCreate`,"role.delete":`audit.actions.roleDelete`,"role.update":`audit.actions.roleUpdate`,"schema.activate":`audit.actions.schemaActivate`,"schema.change.request":`audit.actions.schemaChangeRequest`,"schema.create":`audit.actions.schemaCreate`,"schema.delete":`audit.actions.schemaDelete`,"schema.scope":`audit.actions.schemaScope`,"schema.settings.update":`audit.actions.schemaSettingsUpdate`,"session.revoke":`audit.actions.sessionRevoke`,"session.revoke_all":`audit.actions.sessionRevokeAll`,"setup.complete":`audit.actions.setupComplete`,"transfer.import":`audit.actions.transferImport`,"webhook.create":`audit.actions.webhookCreate`,"webhook.delete":`audit.actions.webhookDelete`,"webhook.redeliver":`audit.actions.webhookRedeliver`,"webhook.rotate_secret":`audit.actions.webhookRotateSecret`,"webhook.test":`audit.actions.webhookTest`,"webhook.update":`audit.actions.webhookUpdate`},h={admin_invitation:`audit.targets.adminInvitation`,admin_role:`audit.targets.adminRole`,admin_session:`audit.targets.adminSession`,admin_user:`audit.targets.adminUser`,api_token:`audit.targets.apiToken`,app_role:`audit.targets.appRole`,app_user:`audit.targets.appUser`,change_set:`audit.targets.changeSet`,component:`audit.targets.component`,deployment_connection:`audit.targets.deploymentConnection`,entry:`audit.targets.entry`,job:`audit.targets.job`,locale:`audit.targets.locale`,media_asset:`audit.targets.mediaAsset`,media_folder:`audit.targets.mediaFolder`,model:`audit.targets.model`,preview_token:`audit.targets.previewToken`,schemaSettings:`audit.targets.schemaSettings`,webhook:`audit.targets.webhook`},g=e=>Object.hasOwn(m,e),_=e=>Object.hasOwn(h,e),v=()=>{let{t:e}=s();return{actionLabel:t=>g(t)?e(m[t]):void 0,targetLabel:t=>_(t)?e(h[t]):void 0}},y=()=>e({queryKey:t.users,queryFn:()=>o.users.list(),meta:{silent:!0}}),b=()=>e({queryKey:t.invitations,queryFn:()=>o.invitations.list(),meta:{silent:!0}}),x=()=>{let e=r();return n({mutationKey:[`invitations`,`create`],meta:{silent:!0},mutationFn:e=>i(()=>o.invitations.create(e)),onSuccess:()=>e.invalidateQueries({queryKey:t.invitations})})},S=()=>{let e=r();return n({mutationKey:[`invitations`,`revoke`],mutationFn:e=>i(()=>o.invitations.revoke(e)),onSettled:()=>e.invalidateQueries({queryKey:t.invitations})})},C=()=>n({mutationKey:[`invitations`,`link`],mutationFn:e=>i(()=>o.invitations.link(e))}),w=()=>{let e=r();return n({mutationKey:[`users`,`update`],meta:{silent:!0},mutationFn:({id:e,input:t})=>i(()=>o.users.update(e,t)),onSettled:()=>e.invalidateQueries({queryKey:t.users})})},T=()=>{let e=r();return n({mutationKey:[`users`,`setStatus`],mutationFn:({id:e,status:t})=>i(()=>o.users.update(e,{status:t})),onSettled:()=>e.invalidateQueries({queryKey:t.users})})},E=()=>{let e=r();return n({mutationKey:[`users`,`remove`],mutationFn:e=>i(()=>o.users.remove(e)),onSettled:()=>e.invalidateQueries({queryKey:t.users})})};export{S as a,y as c,d,u as f,E as i,v as l,x as n,T as o,C as r,w as s,b as t,p as u};
2
- //# sourceMappingURL=users-2iJYwlJb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"users-2iJYwlJb.js","names":["useQuery","queryKeys","useMutation","useQueryClient","withCsrf","keepPreviousData","adminApi","useTranslation","createLucideIcon","__iconData","UserPlus","useAuditEvents","query","NAME_FIELDS","auditTargetName","metadata","record","field","value","AUDIT_ACTION_LABEL_KEYS","AUDIT_TARGET_LABEL_KEYS","isActionCode","code","isTargetType","type","useAuditLabels","t","useUsers","useInvitations","useInviteUser","queryClient","input","useRevokeInvitation","id","useIssueInvitationLink","useUpdateUser","useSetUserStatus","useRemoveUser"],"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/user-plus.mjs","../../src/api/audit.ts","../../src/helpers/auditTargetName.ts","../../src/constants/auditLabels.ts","../../src/hooks/useAuditLabels.ts","../../src/api/users.ts"],"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: \"user-plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"8\", y2: \"14\", key: \"1bvyxn\" }],\n [\"line\", { x1: \"22\", x2: \"16\", y1: \"11\", y2: \"11\", key: \"1shjgl\" }]\n ]\n};\n__iconData.node;\nconst UserPlus = createLucideIcon(__iconData);\n\nexport { __iconData, UserPlus as default };\n//# sourceMappingURL=user-plus.mjs.map\n","import type { AuditQuery } from '@shapio/client';\nimport { keepPreviousData, useQuery } from '@tanstack/react-query';\nimport { adminApi } from './client';\nimport { queryKeys } from './queryKeys';\n\nexport const useAuditEvents = (query: AuditQuery) =>\n useQuery({\n queryKey: queryKeys.audit.list(query),\n queryFn: () => adminApi.audit.list(query),\n placeholderData: keepPreviousData,\n meta: { silent: true },\n });\n","/** Metadata fields that name an audit event's target, in order of preference. */\nconst NAME_FIELDS = ['name', 'title', 'label', 'email', 'filename', 'apiKey'] as const;\n\n/** The target's name as the server recorded it in the event's metadata, if it did. */\nexport const auditTargetName = (metadata: unknown): string | undefined => {\n if (typeof metadata !== 'object' || metadata === null) {\n return undefined;\n }\n const record = metadata as Record<string, unknown>;\n for (const field of NAME_FIELDS) {\n const value = record[field];\n if (typeof value === 'string' && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n};\n","/**\n * Translation keys for the audit action codes and target types the API records (apps/api: `recordAudit` and\n * route `config.audit` declarations). Codes contain dots, which i18next reads as nesting, hence the maps.\n * A code missing here is shown raw.\n */\nexport const AUDIT_ACTION_LABEL_KEYS = {\n 'admin_user.create': 'audit.actions.adminUserCreate',\n 'admin_user.delete': 'audit.actions.adminUserDelete',\n 'admin_user.password_change': 'audit.actions.adminUserPasswordChange',\n 'admin_user.update': 'audit.actions.adminUserUpdate',\n 'api_token.create': 'audit.actions.apiTokenCreate',\n 'api_token.revoke': 'audit.actions.apiTokenRevoke',\n 'app_auth.refresh_reuse': 'audit.actions.appAuthRefreshReuse',\n 'app_role.create': 'audit.actions.appRoleCreate',\n 'app_role.delete': 'audit.actions.appRoleDelete',\n 'app_role.update': 'audit.actions.appRoleUpdate',\n 'app_user.block': 'audit.actions.appUserBlock',\n 'app_user.unblock': 'audit.actions.appUserUnblock',\n 'app_user.confirm_email': 'audit.actions.appUserConfirmEmail',\n 'app_user.confirmation_resend': 'audit.actions.appUserConfirmationResend',\n 'app_user.delete': 'audit.actions.appUserDelete',\n 'app_user.oauth_link': 'audit.actions.appUserOauthLink',\n 'app_user.password_change': 'audit.actions.appUserPasswordChange',\n 'app_user.password_reset': 'audit.actions.appUserPasswordReset',\n 'app_user.password_reset_request': 'audit.actions.appUserPasswordResetRequest',\n 'app_user.register': 'audit.actions.appUserRegister',\n 'app_user.roles_change': 'audit.actions.appUserRolesChange',\n 'app_user.update': 'audit.actions.appUserUpdate',\n 'assist.alt_text': 'audit.actions.assistAltText',\n 'assist.content_ops': 'audit.actions.assistContentOps',\n 'assist.rewrite': 'audit.actions.assistRewrite',\n 'assist.schema_draft': 'audit.actions.assistSchemaDraft',\n 'assist.summarize': 'audit.actions.assistSummarize',\n 'assist.translate': 'audit.actions.assistTranslate',\n 'auth.login': 'audit.actions.authLogin',\n 'auth.logout': 'audit.actions.authLogout',\n 'auth.password_reset': 'audit.actions.authPasswordReset',\n 'auth.password_reset_request': 'audit.actions.authPasswordResetRequest',\n 'change_set.create': 'audit.actions.changeSetCreate',\n 'change_set.discard': 'audit.actions.changeSetDiscard',\n 'change_set.item_add': 'audit.actions.changeSetItemAdd',\n 'change_set.item_changed_after_review': 'audit.actions.changeSetItemChangedAfterReview',\n 'change_set.item_remove': 'audit.actions.changeSetItemRemove',\n 'change_set.schedule': 'audit.actions.changeSetSchedule',\n 'change_set.schema_draft': 'audit.actions.changeSetSchemaDraft',\n 'change_set.schema_draft_remove': 'audit.actions.changeSetSchemaDraftRemove',\n 'change_set.ship': 'audit.actions.changeSetShip',\n 'change_set.shipping': 'audit.actions.changeSetShipping',\n 'change_set.unschedule': 'audit.actions.changeSetUnschedule',\n 'change_set.update': 'audit.actions.changeSetUpdate',\n 'content.delete': 'audit.actions.contentDelete',\n 'content.publish': 'audit.actions.contentPublish',\n 'content.restore': 'audit.actions.contentRestore',\n 'content.unpublish': 'audit.actions.contentUnpublish',\n 'deployment.retry': 'audit.actions.deploymentRetry',\n 'deployment.trigger': 'audit.actions.deploymentTrigger',\n 'deployment_connection.create': 'audit.actions.deploymentConnectionCreate',\n 'deployment_connection.delete': 'audit.actions.deploymentConnectionDelete',\n 'deployment_connection.update': 'audit.actions.deploymentConnectionUpdate',\n 'invitation.accept': 'audit.actions.invitationAccept',\n 'invitation.create': 'audit.actions.invitationCreate',\n 'invitation.link': 'audit.actions.invitationLink',\n 'invitation.revoke': 'audit.actions.invitationRevoke',\n 'job.retry': 'audit.actions.jobRetry',\n 'locale.create': 'audit.actions.localeCreate',\n 'locale.delete': 'audit.actions.localeDelete',\n 'locale.update': 'audit.actions.localeUpdate',\n 'media.delete': 'audit.actions.mediaDelete',\n 'media.folder.delete': 'audit.actions.mediaFolderDelete',\n 'media.replace': 'audit.actions.mediaReplace',\n 'media.upload': 'audit.actions.mediaUpload',\n 'media.visibility.change': 'audit.actions.mediaVisibilityChange',\n 'preview_token.create': 'audit.actions.previewTokenCreate',\n 'preview_token.revoke': 'audit.actions.previewTokenRevoke',\n 'publishing.schedule': 'audit.actions.publishingSchedule',\n 'publishing.schedule.publish': 'audit.actions.publishingSchedulePublish',\n 'publishing.schedule.unpublish': 'audit.actions.publishingScheduleUnpublish',\n 'publishing.schedule.cancel': 'audit.actions.publishingScheduleCancel',\n 'publishing.schedule.execute': 'audit.actions.publishingScheduleExecute',\n 'role.create': 'audit.actions.roleCreate',\n 'role.delete': 'audit.actions.roleDelete',\n 'role.update': 'audit.actions.roleUpdate',\n 'schema.activate': 'audit.actions.schemaActivate',\n 'schema.change.request': 'audit.actions.schemaChangeRequest',\n 'schema.create': 'audit.actions.schemaCreate',\n 'schema.delete': 'audit.actions.schemaDelete',\n 'schema.scope': 'audit.actions.schemaScope',\n 'schema.settings.update': 'audit.actions.schemaSettingsUpdate',\n 'session.revoke': 'audit.actions.sessionRevoke',\n 'session.revoke_all': 'audit.actions.sessionRevokeAll',\n 'setup.complete': 'audit.actions.setupComplete',\n 'transfer.import': 'audit.actions.transferImport',\n 'webhook.create': 'audit.actions.webhookCreate',\n 'webhook.delete': 'audit.actions.webhookDelete',\n 'webhook.redeliver': 'audit.actions.webhookRedeliver',\n 'webhook.rotate_secret': 'audit.actions.webhookRotateSecret',\n 'webhook.test': 'audit.actions.webhookTest',\n 'webhook.update': 'audit.actions.webhookUpdate',\n} as const;\n\nexport const AUDIT_TARGET_LABEL_KEYS = {\n admin_invitation: 'audit.targets.adminInvitation',\n admin_role: 'audit.targets.adminRole',\n admin_session: 'audit.targets.adminSession',\n admin_user: 'audit.targets.adminUser',\n api_token: 'audit.targets.apiToken',\n app_role: 'audit.targets.appRole',\n app_user: 'audit.targets.appUser',\n change_set: 'audit.targets.changeSet',\n component: 'audit.targets.component',\n deployment_connection: 'audit.targets.deploymentConnection',\n entry: 'audit.targets.entry',\n job: 'audit.targets.job',\n locale: 'audit.targets.locale',\n media_asset: 'audit.targets.mediaAsset',\n media_folder: 'audit.targets.mediaFolder',\n model: 'audit.targets.model',\n preview_token: 'audit.targets.previewToken',\n schemaSettings: 'audit.targets.schemaSettings',\n webhook: 'audit.targets.webhook',\n} as const;\n","import { useTranslation } from 'react-i18next';\nimport { AUDIT_ACTION_LABEL_KEYS, AUDIT_TARGET_LABEL_KEYS } from '@/constants/auditLabels';\n\nconst isActionCode = (code: string): code is keyof typeof AUDIT_ACTION_LABEL_KEYS =>\n Object.hasOwn(AUDIT_ACTION_LABEL_KEYS, code);\n\nconst isTargetType = (type: string): type is keyof typeof AUDIT_TARGET_LABEL_KEYS =>\n Object.hasOwn(AUDIT_TARGET_LABEL_KEYS, type);\n\n/**\n * Human labels for audit action codes (\"auth.login\" → \"Signed in\") and target types (\"admin_user\" →\n * \"Admin user\"). Undefined for a code the admin doesn't know yet (a newer server, an extension's route):\n * callers then show the raw code.\n */\nexport const useAuditLabels = () => {\n const { t } = useTranslation();\n return {\n actionLabel: (code: string) => (isActionCode(code) ? t(AUDIT_ACTION_LABEL_KEYS[code]) : undefined),\n targetLabel: (type: string) => (isTargetType(type) ? t(AUDIT_TARGET_LABEL_KEYS[type]) : undefined),\n };\n};\n","import type { AdminUserStatus, InviteUserInput, UpdateAdminUserInput } from '@shapio/client';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nexport const useUsers = () =>\n useQuery({ queryKey: queryKeys.users, queryFn: () => adminApi.users.list(), meta: { silent: true } });\n\nexport const useInvitations = () =>\n useQuery({\n queryKey: queryKeys.invitations,\n queryFn: () => adminApi.invitations.list(),\n meta: { silent: true },\n });\n\nexport const useInviteUser = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['invitations', 'create'],\n meta: { silent: true },\n mutationFn: (input: InviteUserInput) => withCsrf(() => adminApi.invitations.create(input)),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.invitations }),\n });\n};\n\nexport const useRevokeInvitation = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['invitations', 'revoke'],\n mutationFn: (id: string) => withCsrf(() => adminApi.invitations.revoke(id)),\n onSettled: () => queryClient.invalidateQueries({ queryKey: queryKeys.invitations }),\n });\n};\n\n/** A fresh accept link to send by hand; any earlier link for the invitation stops working. */\nexport const useIssueInvitationLink = () =>\n useMutation({\n mutationKey: ['invitations', 'link'],\n mutationFn: (id: string) => withCsrf(() => adminApi.invitations.link(id)),\n });\n\nexport const useUpdateUser = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['users', 'update'],\n meta: { silent: true },\n mutationFn: ({ id, input }: { id: string; input: UpdateAdminUserInput }) =>\n withCsrf(() => adminApi.users.update(id, input)),\n onSettled: () => queryClient.invalidateQueries({ queryKey: queryKeys.users }),\n });\n};\n\nexport const useSetUserStatus = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['users', 'setStatus'],\n mutationFn: ({ id, status }: { id: string; status: AdminUserStatus }) =>\n withCsrf(() => adminApi.users.update(id, { status })),\n onSettled: () => queryClient.invalidateQueries({ queryKey: queryKeys.users }),\n });\n};\n\nexport const useRemoveUser = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['users', 'remove'],\n mutationFn: (id: string) => withCsrf(() => adminApi.users.remove(id)),\n onSettled: () => queryClient.invalidateQueries({ queryKey: queryKeys.users }),\n });\n};\n"],"ignoreList":[0],"mappings":"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"}