@shapio/cms 0.3.0 → 0.4.0

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 (323) hide show
  1. package/dist/admin/apple-touch-icon.png +0 -0
  2. package/dist/admin/assets/AssetTile-C-Mu0BRF.js +2 -0
  3. package/dist/admin/assets/AssetTile-C-Mu0BRF.js.map +1 -0
  4. package/dist/admin/assets/{AssistError-BITJ_tpg.js → AssistError-B-bnaHhJ.js} +2 -2
  5. package/dist/admin/assets/{AssistError-BITJ_tpg.js.map → AssistError-B-bnaHhJ.js.map} +1 -1
  6. package/dist/admin/assets/{BlockMenuItems-CcluK965.js → BlockMenuItems-Dn9WULjL.js} +3 -3
  7. package/dist/admin/assets/{BlockMenuItems-CcluK965.js.map → BlockMenuItems-Dn9WULjL.js.map} +1 -1
  8. package/dist/admin/assets/Body-C0SwduLi.js +2 -0
  9. package/dist/admin/assets/{Body-BXa9DhtH.js.map → Body-C0SwduLi.js.map} +1 -1
  10. package/dist/admin/assets/Builder-C11yUgu9.js +2 -0
  11. package/dist/admin/assets/Builder-C11yUgu9.js.map +1 -0
  12. package/dist/admin/assets/{ConfirmDialog-B9nWhIIz.js → ConfirmDialog-BfpN2MQx.js} +2 -2
  13. package/dist/admin/assets/{ConfirmDialog-B9nWhIIz.js.map → ConfirmDialog-BfpN2MQx.js.map} +1 -1
  14. package/dist/admin/assets/{CopyButton-BoWb-xi1.js → CopyButton-Dxbzp7hC.js} +2 -2
  15. package/dist/admin/assets/{CopyButton-BoWb-xi1.js.map → CopyButton-Dxbzp7hC.js.map} +1 -1
  16. package/dist/admin/assets/{CursorPager-BnxmTk47.js → CursorPager-DkZs6rPg.js} +2 -2
  17. package/dist/admin/assets/{CursorPager-BnxmTk47.js.map → CursorPager-DkZs6rPg.js.map} +1 -1
  18. package/dist/admin/assets/{ExternalLink-Eeb9mONJ.js → ExternalLink-KdO72pTj.js} +2 -2
  19. package/dist/admin/assets/{ExternalLink-Eeb9mONJ.js.map → ExternalLink-KdO72pTj.js.map} +1 -1
  20. package/dist/admin/assets/FocalPoint-r1MG_y-r.js +2 -0
  21. package/dist/admin/assets/FocalPoint-r1MG_y-r.js.map +1 -0
  22. package/dist/admin/assets/Form-D8vp4Kd_.js +2 -0
  23. package/dist/admin/assets/{Form-DZRLD3vH.js.map → Form-D8vp4Kd_.js.map} +1 -1
  24. package/dist/admin/assets/{FormCheckboxGroup-uIC2XQIL.js → FormCheckboxGroup-8ObPh9cH.js} +2 -2
  25. package/dist/admin/assets/{FormCheckboxGroup-uIC2XQIL.js.map → FormCheckboxGroup-8ObPh9cH.js.map} +1 -1
  26. package/dist/admin/assets/{FormRadioGroup-hd95vPOu.js → FormRadioGroup-CAB3qzVS.js} +2 -2
  27. package/dist/admin/assets/{FormRadioGroup-hd95vPOu.js.map → FormRadioGroup-CAB3qzVS.js.map} +1 -1
  28. package/dist/admin/assets/{FormSelectField-D7VHmnx5.js → FormSelectField-C7hE05Wq.js} +2 -2
  29. package/dist/admin/assets/{FormSelectField-D7VHmnx5.js.map → FormSelectField-C7hE05Wq.js.map} +1 -1
  30. package/dist/admin/assets/{FormSwitchField-ft8Jbe6E.js → FormSwitchField-7EEYkGOH.js} +2 -2
  31. package/dist/admin/assets/{FormSwitchField-ft8Jbe6E.js.map → FormSwitchField-7EEYkGOH.js.map} +1 -1
  32. package/dist/admin/assets/{FormTextareaField-DzyOzfZb.js → FormTextareaField-BasuRoXW.js} +2 -2
  33. package/dist/admin/assets/{FormTextareaField-DzyOzfZb.js.map → FormTextareaField-BasuRoXW.js.map} +1 -1
  34. package/dist/admin/assets/{HintedLabel-CvC46uy_.js → HintedLabel-BDV81kIT.js} +2 -2
  35. package/dist/admin/assets/{HintedLabel-CvC46uy_.js.map → HintedLabel-BDV81kIT.js.map} +1 -1
  36. package/dist/admin/assets/{InfoHint-GJLRVumb.js → InfoHint-DWn9kLf1.js} +2 -2
  37. package/dist/admin/assets/{InfoHint-GJLRVumb.js.map → InfoHint-DWn9kLf1.js.map} +1 -1
  38. package/dist/admin/assets/InsertMenuItem-DhJk5BeH.js +2 -0
  39. package/dist/admin/assets/InsertMenuItem-DhJk5BeH.js.map +1 -0
  40. package/dist/admin/assets/{LinkTabs-BZSlA57U.js → LinkTabs-stM3j4aH.js} +2 -2
  41. package/dist/admin/assets/{LinkTabs-BZSlA57U.js.map → LinkTabs-stM3j4aH.js.map} +1 -1
  42. package/dist/admin/assets/{Match-DdxTHHM4.js → Match-Zu4pwfCC.js} +2 -2
  43. package/dist/admin/assets/{Match-DdxTHHM4.js.map → Match-Zu4pwfCC.js.map} +1 -1
  44. package/dist/admin/assets/{Panel-iIKjEURi.js → Panel-ClY9b33D.js} +2 -2
  45. package/dist/admin/assets/{Panel-iIKjEURi.js.map → Panel-ClY9b33D.js.map} +1 -1
  46. package/dist/admin/assets/{QueryView-D6aZQJRN.js → QueryView-Cu-KPtQI.js} +2 -2
  47. package/dist/admin/assets/{QueryView-D6aZQJRN.js.map → QueryView-Cu-KPtQI.js.map} +1 -1
  48. package/dist/admin/assets/{RadioTile-BpB79rIK.js → RadioTile-Ci0LucKI.js} +2 -2
  49. package/dist/admin/assets/RadioTile-Ci0LucKI.js.map +1 -0
  50. package/dist/admin/assets/RichTextField-BcYOFkeW.js +144 -0
  51. package/dist/admin/assets/{RichTextField-BuHCONPu.js.map → RichTextField-BcYOFkeW.js.map} +1 -1
  52. package/dist/admin/assets/{RowTitle--uFCpx8n.js → RowTitle-BdDgA5Lb.js} +2 -2
  53. package/dist/admin/assets/{RowTitle--uFCpx8n.js.map → RowTitle-BdDgA5Lb.js.map} +1 -1
  54. package/dist/admin/assets/{SecretReveal-DFpzeNE0.js → SecretReveal-ai1uMW_b.js} +2 -2
  55. package/dist/admin/assets/{SecretReveal-DFpzeNE0.js.map → SecretReveal-ai1uMW_b.js.map} +1 -1
  56. package/dist/admin/assets/{SharedGlyph-Cqkx30tn.js → SharedGlyph-y6ZsA_gz.js} +2 -2
  57. package/dist/admin/assets/{SharedGlyph-Cqkx30tn.js.map → SharedGlyph-y6ZsA_gz.js.map} +1 -1
  58. package/dist/admin/assets/{StepList-BY5MuJPJ.js → StepList-xmD9CPZl.js} +2 -2
  59. package/dist/admin/assets/{StepList-BY5MuJPJ.js.map → StepList-xmD9CPZl.js.map} +1 -1
  60. package/dist/admin/assets/Structure-DGt-TDk5.js +2 -0
  61. package/dist/admin/assets/{Structure-CqRa2t7z.js.map → Structure-DGt-TDk5.js.map} +1 -1
  62. package/dist/admin/assets/{SubNavLink-B2o4kSZ9.js → SubNavLink-YjjaDN40.js} +2 -2
  63. package/dist/admin/assets/{SubNavLink-B2o4kSZ9.js.map → SubNavLink-YjjaDN40.js.map} +1 -1
  64. package/dist/admin/assets/{SuggestAltButton-4rf2xhEJ.js → SuggestAltButton-D1-v_0wB.js} +2 -2
  65. package/dist/admin/assets/{SuggestAltButton-4rf2xhEJ.js.map → SuggestAltButton-D1-v_0wB.js.map} +1 -1
  66. package/dist/admin/assets/{TextLink-D15oyXlc.js → TextLink-DIqr5zkJ.js} +2 -2
  67. package/dist/admin/assets/{TextLink-D15oyXlc.js.map → TextLink-DIqr5zkJ.js.map} +1 -1
  68. package/dist/admin/assets/Thumbnail-cjA7fSWh.js +2 -0
  69. package/dist/admin/assets/Thumbnail-cjA7fSWh.js.map +1 -0
  70. package/dist/admin/assets/{UnsavedChangesGuard-DgOASh0p.js → UnsavedChangesGuard-B57D0278.js} +2 -2
  71. package/dist/admin/assets/{UnsavedChangesGuard-DgOASh0p.js.map → UnsavedChangesGuard-B57D0278.js.map} +1 -1
  72. package/dist/admin/assets/{UserAvatar-BocvNVL-.js → UserAvatar--pMv2i3c.js} +2 -2
  73. package/dist/admin/assets/{UserAvatar-BocvNVL-.js.map → UserAvatar--pMv2i3c.js.map} +1 -1
  74. package/dist/admin/assets/{auth-pcS9CCXu.js → auth-YVfK3SxF.js} +2 -2
  75. package/dist/admin/assets/{auth-pcS9CCXu.js.map → auth-YVfK3SxF.js.map} +1 -1
  76. package/dist/admin/assets/{badge-DD0mE96i.js → badge-C5oMRtwJ.js} +2 -2
  77. package/dist/admin/assets/{badge-DD0mE96i.js.map → badge-C5oMRtwJ.js.map} +1 -1
  78. package/dist/admin/assets/{boxes-DcK-kaSa.js → boxes-DRvd25_u.js} +2 -2
  79. package/dist/admin/assets/{boxes-DcK-kaSa.js.map → boxes-DRvd25_u.js.map} +1 -1
  80. package/dist/admin/assets/{calendar-clock-DEwACe0M.js → calendar-clock-VENf4s1R.js} +2 -2
  81. package/dist/admin/assets/{calendar-clock-DEwACe0M.js.map → calendar-clock-VENf4s1R.js.map} +1 -1
  82. package/dist/admin/assets/{changeSets-BjUEfYbj.js → changeSets-CObZV8H2.js} +2 -2
  83. package/dist/admin/assets/{changeSets-BjUEfYbj.js.map → changeSets-CObZV8H2.js.map} +1 -1
  84. package/dist/admin/assets/chevron-left-D2DnQyeV.js +2 -0
  85. package/dist/admin/assets/{chevron-left-BsQYDUEC.js.map → chevron-left-D2DnQyeV.js.map} +1 -1
  86. package/dist/admin/assets/{circle-check-Dq1owihe.js → circle-check-jmRQz1Jq.js} +2 -2
  87. package/dist/admin/assets/{circle-check-Dq1owihe.js.map → circle-check-jmRQz1Jq.js.map} +1 -1
  88. package/dist/admin/assets/{clock-DQvkffqQ.js → clock-DrSTMGjp.js} +2 -2
  89. package/dist/admin/assets/{clock-DQvkffqQ.js.map → clock-DrSTMGjp.js.map} +1 -1
  90. package/dist/admin/assets/cn-CL1YHRrS.js +2 -0
  91. package/dist/admin/assets/cn-CL1YHRrS.js.map +1 -0
  92. package/dist/admin/assets/coerce-B4MJTGg1.js +2 -0
  93. package/dist/admin/assets/{coerce-OsqQRj19.js.map → coerce-B4MJTGg1.js.map} +1 -1
  94. package/dist/admin/assets/constants-DT4WPUvz.js +2 -0
  95. package/dist/admin/assets/{constants-SrImR6C3.js.map → constants-DT4WPUvz.js.map} +1 -1
  96. package/dist/admin/assets/content-HvisCB5m.js +3 -0
  97. package/dist/admin/assets/content-HvisCB5m.js.map +1 -0
  98. package/dist/admin/assets/{contentCounts-Ch3uMXVU.js → contentCounts-DzIvdeXR.js} +2 -2
  99. package/dist/admin/assets/{contentCounts-Ch3uMXVU.js.map → contentCounts-DzIvdeXR.js.map} +1 -1
  100. package/dist/admin/assets/{contentTypes-BCOdUK_Z.js → contentTypes-ArLEfM29.js} +2 -2
  101. package/dist/admin/assets/{contentTypes-BCOdUK_Z.js.map → contentTypes-ArLEfM29.js.map} +1 -1
  102. package/dist/admin/assets/context-4Jl20mYc.js +2 -0
  103. package/dist/admin/assets/context-4Jl20mYc.js.map +1 -0
  104. package/dist/admin/assets/{copy-BDc3r0fO.js → copy-t6kAFw-O.js} +2 -2
  105. package/dist/admin/assets/{copy-BDc3r0fO.js.map → copy-t6kAFw-O.js.map} +1 -1
  106. package/dist/admin/assets/{dateTimeLocal-C92tyKwz.js → dateTimeLocal-IDUOKulz.js} +2 -2
  107. package/dist/admin/assets/{dateTimeLocal-C92tyKwz.js.map → dateTimeLocal-IDUOKulz.js.map} +1 -1
  108. package/dist/admin/assets/develop-DvKYqVeK.js +11 -0
  109. package/dist/admin/assets/develop-DvKYqVeK.js.map +1 -0
  110. package/dist/admin/assets/dropdown-menu-DPzDthV7.js +2 -0
  111. package/dist/admin/assets/dropdown-menu-DPzDthV7.js.map +1 -0
  112. package/dist/admin/assets/{ellipsis-NK0pWgqU.js → ellipsis-DEHUaCkn.js} +2 -2
  113. package/dist/admin/assets/{ellipsis-NK0pWgqU.js.map → ellipsis-DEHUaCkn.js.map} +1 -1
  114. package/dist/admin/assets/external-link-B8UFREQ_.js +2 -0
  115. package/dist/admin/assets/external-link-B8UFREQ_.js.map +1 -0
  116. package/dist/admin/assets/{fileRoute-C2tOrKhO.js → fileRoute-sJvv4Ipn.js} +2 -2
  117. package/dist/admin/assets/{fileRoute-C2tOrKhO.js.map → fileRoute-sJvv4Ipn.js.map} +1 -1
  118. package/dist/admin/assets/folder-plus-iDg1hhew.js +2 -0
  119. package/dist/admin/assets/folder-plus-iDg1hhew.js.map +1 -0
  120. package/dist/admin/assets/followPlural-tOh6gDgT.js +2 -0
  121. package/dist/admin/assets/{followPlural-CN6cQfNk.js.map → followPlural-tOh6gDgT.js.map} +1 -1
  122. package/dist/admin/assets/{globe-CuElSilX.js → globe-TooNSp9V.js} +2 -2
  123. package/dist/admin/assets/{globe-CuElSilX.js.map → globe-TooNSp9V.js.map} +1 -1
  124. package/dist/admin/assets/{image-CsH8dZve.js → image-CXZXXH58.js} +2 -2
  125. package/dist/admin/assets/{image-CsH8dZve.js.map → image-CXZXXH58.js.map} +1 -1
  126. package/dist/admin/assets/{image-off-B_uBCsYu.js → image-off-cxva5G-Y.js} +2 -2
  127. package/dist/admin/assets/{image-off-B_uBCsYu.js.map → image-off-cxva5G-Y.js.map} +1 -1
  128. package/dist/admin/assets/{inbox-3iAHL3pC.js → inbox-B8c9Kj_z.js} +2 -2
  129. package/dist/admin/assets/{inbox-3iAHL3pC.js.map → inbox-B8c9Kj_z.js.map} +1 -1
  130. package/dist/admin/assets/{inbox-DsuXNaKE.js → inbox-nfR2K7f6.js} +2 -2
  131. package/dist/admin/assets/{inbox-DsuXNaKE.js.map → inbox-nfR2K7f6.js.map} +1 -1
  132. package/dist/admin/assets/index-Bbb2ER3l.css +2 -0
  133. package/dist/admin/assets/index-C6FrF34G.js +4 -0
  134. package/dist/admin/assets/index-C6FrF34G.js.map +1 -0
  135. package/dist/admin/assets/{key-round-B17HiT3K.js → key-round-CFJ61iCd.js} +2 -2
  136. package/dist/admin/assets/{key-round-B17HiT3K.js.map → key-round-CFJ61iCd.js.map} +1 -1
  137. package/dist/admin/assets/languages-eh7U4anI.js +2 -0
  138. package/dist/admin/assets/languages-eh7U4anI.js.map +1 -0
  139. package/dist/admin/assets/layers-mGfmMsKE.js +2 -0
  140. package/dist/admin/assets/layers-mGfmMsKE.js.map +1 -0
  141. package/dist/admin/assets/link-2-off-DbZzRN_w.js +2 -0
  142. package/dist/admin/assets/link-2-off-DbZzRN_w.js.map +1 -0
  143. package/dist/admin/assets/{link-bhHmG4Tc.js → link-b2pFaN-A.js} +2 -2
  144. package/dist/admin/assets/{link-bhHmG4Tc.js.map → link-b2pFaN-A.js.map} +1 -1
  145. package/dist/admin/assets/{locales-BzPbz8FF.js → locales-oBD0q1pN.js} +2 -2
  146. package/dist/admin/assets/{locales-BzPbz8FF.js.map → locales-oBD0q1pN.js.map} +1 -1
  147. package/dist/admin/assets/{media-Xzot1ueY.js → media-5ks_0Rre.js} +2 -2
  148. package/dist/admin/assets/{media-Xzot1ueY.js.map → media-5ks_0Rre.js.map} +1 -1
  149. package/dist/admin/assets/media-BzivlEh2.js +2 -0
  150. package/dist/admin/assets/{media-WLnWaL7U.js.map → media-BzivlEh2.js.map} +1 -1
  151. package/dist/admin/assets/network-Cj04CpFi.js +2 -0
  152. package/dist/admin/assets/network-Cj04CpFi.js.map +1 -0
  153. package/dist/admin/assets/{pencil-Bdp2z9D_.js → pencil-C7eD5mlZ.js} +2 -2
  154. package/dist/admin/assets/{pencil-Bdp2z9D_.js.map → pencil-C7eD5mlZ.js.map} +1 -1
  155. package/dist/admin/assets/{plus-BN_iSsnp.js → plus-BDZHQBlU.js} +2 -2
  156. package/dist/admin/assets/{plus-BN_iSsnp.js.map → plus-BDZHQBlU.js.map} +1 -1
  157. package/dist/admin/assets/{preload-helper-DAbCfXID.js → preload-helper-CJNJ4S3k.js} +2 -2
  158. package/dist/admin/assets/{preload-helper-DAbCfXID.js.map → preload-helper-CJNJ4S3k.js.map} +1 -1
  159. package/dist/admin/assets/publishing-ChHkrwvr.js +2 -0
  160. package/dist/admin/assets/{publishing-d9yhMwgA.js.map → publishing-ChHkrwvr.js.map} +1 -1
  161. package/dist/admin/assets/{radio-group-DHIxK-IU.js → radio-group-DSK5LPaM.js} +2 -2
  162. package/dist/admin/assets/{radio-group-DHIxK-IU.js.map → radio-group-DSK5LPaM.js.map} +1 -1
  163. package/dist/admin/assets/{rotate-ccw-CBoZle-b.js → rotate-ccw-DCWwb4Ga.js} +2 -2
  164. package/dist/admin/assets/{rotate-ccw-CBoZle-b.js.map → rotate-ccw-DCWwb4Ga.js.map} +1 -1
  165. package/dist/admin/assets/{schedules-Dy89Nm6P.js → schedules-DXrBSypK.js} +2 -2
  166. package/dist/admin/assets/{schedules-Dy89Nm6P.js.map → schedules-DXrBSypK.js.map} +1 -1
  167. package/dist/admin/assets/{schema-B4smPFcR.js → schema-B7L9OJrX.js} +2 -2
  168. package/dist/admin/assets/{schema-B4smPFcR.js.map → schema-B7L9OJrX.js.map} +1 -1
  169. package/dist/admin/assets/{scroll-text-UbyzpWh-.js → scroll-text-BLThe4Ki.js} +2 -2
  170. package/dist/admin/assets/{scroll-text-UbyzpWh-.js.map → scroll-text-BLThe4Ki.js.map} +1 -1
  171. package/dist/admin/assets/{file-text-DxXAmmxL.js → search-CcJQqtRw.js} +2 -2
  172. package/dist/admin/assets/search-CcJQqtRw.js.map +1 -0
  173. package/dist/admin/assets/{searchSchemas-BxRnxenn.js → searchSchemas-BdwAFaVO.js} +2 -2
  174. package/dist/admin/assets/{searchSchemas-BxRnxenn.js.map → searchSchemas-BdwAFaVO.js.map} +1 -1
  175. package/dist/admin/assets/{sections-Bb3Q4bcY.js → sections-TIN_Nl1b.js} +2 -2
  176. package/dist/admin/assets/{sections-Bb3Q4bcY.js.map → sections-TIN_Nl1b.js.map} +1 -1
  177. package/dist/admin/assets/sections-iNOzo7pL.js +2 -0
  178. package/dist/admin/assets/sections-iNOzo7pL.js.map +1 -0
  179. package/dist/admin/assets/{select-tHVWX85X.js → select-DyD7qIkJ.js} +2 -2
  180. package/dist/admin/assets/{select-tHVWX85X.js.map → select-DyD7qIkJ.js.map} +1 -1
  181. package/dist/admin/assets/{send-BqECHYi6.js → send-CbP0Rc9_.js} +2 -2
  182. package/dist/admin/assets/{send-BqECHYi6.js.map → send-CbP0Rc9_.js.map} +1 -1
  183. package/dist/admin/assets/seo-uMm2fGPB.js +2 -0
  184. package/dist/admin/assets/seo-uMm2fGPB.js.map +1 -0
  185. package/dist/admin/assets/settings-CJVORrIV.js +2 -0
  186. package/dist/admin/assets/settings-CJVORrIV.js.map +1 -0
  187. package/dist/admin/assets/skeleton-B5GJgv7y.js +42 -0
  188. package/dist/admin/assets/skeleton-B5GJgv7y.js.map +1 -0
  189. package/dist/admin/assets/snapshots-DkyyrWX3.js +2 -0
  190. package/dist/admin/assets/{snapshots-BQrhsCmC.js.map → snapshots-DkyyrWX3.js.map} +1 -1
  191. package/dist/admin/assets/{sparkles-BW4CbD6W.js → sparkles-D88gf3vX.js} +2 -2
  192. package/dist/admin/assets/{sparkles-BW4CbD6W.js.map → sparkles-D88gf3vX.js.map} +1 -1
  193. package/dist/admin/assets/src-B2qcqjNM.js +4 -0
  194. package/dist/admin/assets/src-B2qcqjNM.js.map +1 -0
  195. package/dist/admin/assets/{stableId-C9Yq5iUw.js → stableId-DlNKh3HM.js} +2 -2
  196. package/dist/admin/assets/{stableId-C9Yq5iUw.js.map → stableId-DlNKh3HM.js.map} +1 -1
  197. package/dist/admin/assets/{store-BphwUzV5.js → store-jUWyOXDG.js} +2 -2
  198. package/dist/admin/assets/{store-BphwUzV5.js.map → store-jUWyOXDG.js.map} +1 -1
  199. package/dist/admin/assets/{switch-BVy02Vc8.js → switch-DbIrjP3h.js} +2 -2
  200. package/dist/admin/assets/{switch-BVy02Vc8.js.map → switch-DbIrjP3h.js.map} +1 -1
  201. package/dist/admin/assets/table-DQ5ILlSh.js +56 -0
  202. package/dist/admin/assets/table-DQ5ILlSh.js.map +1 -0
  203. package/dist/admin/assets/tabs-BJhfL-lw.js +5 -0
  204. package/dist/admin/assets/tabs-BJhfL-lw.js.map +1 -0
  205. package/dist/admin/assets/{textarea-B8Vl5gJ1.js → textarea-FwSvwmyT.js} +2 -2
  206. package/dist/admin/assets/{textarea-B8Vl5gJ1.js.map → textarea-FwSvwmyT.js.map} +1 -1
  207. package/dist/admin/assets/theme-C0Tv6M38.js +2 -0
  208. package/dist/admin/assets/theme-C0Tv6M38.js.map +1 -0
  209. package/dist/admin/assets/{titles-B2z5ckxG.js → titles-uL13bpi8.js} +2 -2
  210. package/dist/admin/assets/{titles-B2z5ckxG.js.map → titles-uL13bpi8.js.map} +1 -1
  211. package/dist/admin/assets/{tokens-Fh_OeIlf.js → tokens-C-20gLAT.js} +2 -2
  212. package/dist/admin/assets/{tokens-Fh_OeIlf.js.map → tokens-C-20gLAT.js.map} +1 -1
  213. package/dist/admin/assets/{tooltip-DwqM3opE.js → tooltip-BK5FqmJ0.js} +2 -2
  214. package/dist/admin/assets/{tooltip-DwqM3opE.js.map → tooltip-BK5FqmJ0.js.map} +1 -1
  215. package/dist/admin/assets/{undo-2-D4Fz4JMZ.js → undo-2-CLy2zklL.js} +2 -2
  216. package/dist/admin/assets/{undo-2-D4Fz4JMZ.js.map → undo-2-CLy2zklL.js.map} +1 -1
  217. package/dist/admin/assets/{useAuditLabels-DKrsrciQ.js → useAuditLabels-BJF7M5RY.js} +2 -2
  218. package/dist/admin/assets/{useAuditLabels-DKrsrciQ.js.map → useAuditLabels-BJF7M5RY.js.map} +1 -1
  219. package/dist/admin/assets/{useConfirmTarget-Dp8mCulm.js → useConfirmTarget-BUvlrGSW.js} +2 -2
  220. package/dist/admin/assets/{useConfirmTarget-Dp8mCulm.js.map → useConfirmTarget-BUvlrGSW.js.map} +1 -1
  221. package/dist/admin/assets/useContentSchema-BCdLYsKa.js +2 -0
  222. package/dist/admin/assets/{useContentSchema-Bv4_6VJR.js.map → useContentSchema-BCdLYsKa.js.map} +1 -1
  223. package/dist/admin/assets/{useCursorPager-B1upg5EU.js → useCursorPager-CzB6NDOB.js} +2 -2
  224. package/dist/admin/assets/{useCursorPager-B1upg5EU.js.map → useCursorPager-CzB6NDOB.js.map} +1 -1
  225. package/dist/admin/assets/{useDiscardGuard-34ynGJIk.js → useDiscardGuard-CGFgC3xY.js} +2 -2
  226. package/dist/admin/assets/{useDiscardGuard-34ynGJIk.js.map → useDiscardGuard-CGFgC3xY.js.map} +1 -1
  227. package/dist/admin/assets/useMediaPickerDialog-BOkGEyG7.js +2 -0
  228. package/dist/admin/assets/useMediaPickerDialog-BOkGEyG7.js.map +1 -0
  229. package/dist/admin/assets/useMediaUploader-D1ouV8jc.js +2 -0
  230. package/dist/admin/assets/useMediaUploader-D1ouV8jc.js.map +1 -0
  231. package/dist/admin/assets/{usePaletteItems-62-TZhy7.js → usePaletteItems-neKzBlys.js} +2 -2
  232. package/dist/admin/assets/{usePaletteItems-62-TZhy7.js.map → usePaletteItems-neKzBlys.js.map} +1 -1
  233. package/dist/admin/assets/{usePlaces-CY6f2DmI.js → usePlaces-6iTN15Xy.js} +2 -2
  234. package/dist/admin/assets/{usePlaces-CY6f2DmI.js.map → usePlaces-6iTN15Xy.js.map} +1 -1
  235. package/dist/admin/assets/{useQueries-BuKJBA0M.js → useQueries-CYfcxI0Q.js} +2 -2
  236. package/dist/admin/assets/{useQueries-BuKJBA0M.js.map → useQueries-CYfcxI0Q.js.map} +1 -1
  237. package/dist/admin/assets/useResolvedScheme-D0moXjaP.js +2 -0
  238. package/dist/admin/assets/{searchSchema-CvOhn4FV.js.map → useResolvedScheme-D0moXjaP.js.map} +1 -1
  239. package/dist/admin/assets/useSchemaScopeAccess-WQKmj8_3.js +2 -0
  240. package/dist/admin/assets/useSchemaScopeAccess-WQKmj8_3.js.map +1 -0
  241. package/dist/admin/assets/{users-BOn2ohJQ.js → users-B01EH47o.js} +2 -2
  242. package/dist/admin/assets/{users-BOn2ohJQ.js.map → users-B01EH47o.js.map} +1 -1
  243. package/dist/admin/assets/{users-BkKc4MNB.js → users-BgTNDPXx.js} +2 -2
  244. package/dist/admin/assets/{users-BkKc4MNB.js.map → users-BgTNDPXx.js.map} +1 -1
  245. package/dist/admin/assets/{zod-BHAd1wTC.js → zod-CS0EvbwG.js} +2 -2
  246. package/dist/admin/assets/{zod-BHAd1wTC.js.map → zod-CS0EvbwG.js.map} +1 -1
  247. package/dist/admin/favicon-32.png +0 -0
  248. package/dist/admin/favicon.svg +2 -2
  249. package/dist/admin/index.html +60 -56
  250. package/dist/admin/theme-init.js +44 -10
  251. package/dist/cli.js +48 -14
  252. package/dist/cli.js.map +1 -1
  253. package/dist/config.d.ts +2 -2
  254. package/dist/config.js.map +1 -1
  255. package/dist/index.d.ts +11 -224
  256. package/dist/index.js +1 -1
  257. package/dist/{public-CGO8RBn3.d.ts → public-BSbOGbK-.d.ts} +268 -6
  258. package/dist/{worker-BLXy8aRW.js → worker-i1rY2TIZ.js} +2416 -668
  259. package/dist/worker-i1rY2TIZ.js.map +1 -0
  260. package/package.json +5 -5
  261. package/dist/admin/assets/Body-BXa9DhtH.js +0 -2
  262. package/dist/admin/assets/Builder-DcpRfXuc.js +0 -2
  263. package/dist/admin/assets/Builder-DcpRfXuc.js.map +0 -1
  264. package/dist/admin/assets/Form-DZRLD3vH.js +0 -2
  265. package/dist/admin/assets/InsertMenuItem-D976G0Rj.js +0 -2
  266. package/dist/admin/assets/InsertMenuItem-D976G0Rj.js.map +0 -1
  267. package/dist/admin/assets/RadioTile-BpB79rIK.js.map +0 -1
  268. package/dist/admin/assets/RichTextField-BuHCONPu.js +0 -144
  269. package/dist/admin/assets/Structure-CqRa2t7z.js +0 -2
  270. package/dist/admin/assets/Thumbnail-CP5mfgNY.js +0 -2
  271. package/dist/admin/assets/Thumbnail-CP5mfgNY.js.map +0 -1
  272. package/dist/admin/assets/arrow-up-gf_j6SVQ.js +0 -2
  273. package/dist/admin/assets/arrow-up-gf_j6SVQ.js.map +0 -1
  274. package/dist/admin/assets/chevron-left-BsQYDUEC.js +0 -2
  275. package/dist/admin/assets/circle-x-Dx6zIZko.js +0 -2
  276. package/dist/admin/assets/circle-x-Dx6zIZko.js.map +0 -1
  277. package/dist/admin/assets/cn-BQ3voEft.js +0 -2
  278. package/dist/admin/assets/cn-BQ3voEft.js.map +0 -1
  279. package/dist/admin/assets/coerce-OsqQRj19.js +0 -2
  280. package/dist/admin/assets/constants-SrImR6C3.js +0 -2
  281. package/dist/admin/assets/content-_SLbbnfX.js +0 -3
  282. package/dist/admin/assets/content-_SLbbnfX.js.map +0 -1
  283. package/dist/admin/assets/develop-DS9TlDmv.js +0 -11
  284. package/dist/admin/assets/develop-DS9TlDmv.js.map +0 -1
  285. package/dist/admin/assets/dropdown-menu-gmP2Rp3n.js +0 -2
  286. package/dist/admin/assets/dropdown-menu-gmP2Rp3n.js.map +0 -1
  287. package/dist/admin/assets/external-link-D3Aoi2yX.js +0 -2
  288. package/dist/admin/assets/external-link-D3Aoi2yX.js.map +0 -1
  289. package/dist/admin/assets/file-text-DxXAmmxL.js.map +0 -1
  290. package/dist/admin/assets/followPlural-CN6cQfNk.js +0 -2
  291. package/dist/admin/assets/index-BLYOgCKc.css +0 -2
  292. package/dist/admin/assets/index-BSzXA60W.js +0 -4
  293. package/dist/admin/assets/index-BSzXA60W.js.map +0 -1
  294. package/dist/admin/assets/link-2-off-hWGS8LW6.js +0 -2
  295. package/dist/admin/assets/link-2-off-hWGS8LW6.js.map +0 -1
  296. package/dist/admin/assets/list-DRtRdjBC.js +0 -2
  297. package/dist/admin/assets/list-DRtRdjBC.js.map +0 -1
  298. package/dist/admin/assets/media-WLnWaL7U.js +0 -2
  299. package/dist/admin/assets/network-DHGqLwji.js +0 -2
  300. package/dist/admin/assets/network-DHGqLwji.js.map +0 -1
  301. package/dist/admin/assets/publishing-d9yhMwgA.js +0 -2
  302. package/dist/admin/assets/search-_YlNpPvU.js +0 -2
  303. package/dist/admin/assets/search-_YlNpPvU.js.map +0 -1
  304. package/dist/admin/assets/searchSchema-CvOhn4FV.js +0 -2
  305. package/dist/admin/assets/sections-DiySZZHb.js +0 -2
  306. package/dist/admin/assets/sections-DiySZZHb.js.map +0 -1
  307. package/dist/admin/assets/settings-D-v8gL8F.js +0 -2
  308. package/dist/admin/assets/settings-D-v8gL8F.js.map +0 -1
  309. package/dist/admin/assets/skeleton-C3QLIh7W.js +0 -42
  310. package/dist/admin/assets/skeleton-C3QLIh7W.js.map +0 -1
  311. package/dist/admin/assets/snapshots-BQrhsCmC.js +0 -2
  312. package/dist/admin/assets/src-XaU0N8C-.js +0 -4
  313. package/dist/admin/assets/src-XaU0N8C-.js.map +0 -1
  314. package/dist/admin/assets/table-CZYtdoHn.js +0 -56
  315. package/dist/admin/assets/table-CZYtdoHn.js.map +0 -1
  316. package/dist/admin/assets/tabs-quHbeVxA.js +0 -5
  317. package/dist/admin/assets/tabs-quHbeVxA.js.map +0 -1
  318. package/dist/admin/assets/useContentSchema-Bv4_6VJR.js +0 -2
  319. package/dist/admin/assets/useMediaUploader-QXSjZStv.js +0 -2
  320. package/dist/admin/assets/useMediaUploader-QXSjZStv.js.map +0 -1
  321. package/dist/admin/assets/useSchemaScopeAccess-DUBeS9kU.js +0 -2
  322. package/dist/admin/assets/useSchemaScopeAccess-DUBeS9kU.js.map +0 -1
  323. package/dist/worker-BLXy8aRW.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{H as n,P as r,V as i,bt as a,i as o,l as s,s as c,ut as l}from"./cn-BQ3voEft.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=o(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:()=>s.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:()=>s.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:()=>s.deployments.runs.list(e),placeholderData:l,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:()=>s.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=>c(()=>s.deployments.connections.create(e)),onSuccess:e})},T=()=>{let e=a(),t=C();return i({mutationKey:[`deployments`,`update`],meta:_,mutationFn:({id:e,input:t})=>c(()=>s.deployments.connections.update(e,t)),onSuccess:n=>(e.setQueryData(r.publishing.deployments.connection(n.id),n),t())})},E=()=>{let e=a(),t=C();return i({mutationKey:[`deployments`,`delete`],mutationFn:e=>c(()=>s.deployments.connections.remove(e)),onSuccess:(n,i)=>(e.removeQueries({queryKey:r.publishing.deployments.connection(i)}),t())})},D=()=>i({mutationKey:[`deployments`,`test`],mutationFn:e=>c(()=>s.deployments.connections.test(e))}),O=()=>{let e=C();return i({mutationKey:[`deployments`,`trigger`],mutationFn:e=>c(()=>s.deployments.connections.trigger(e)),onSuccess:e})},k=()=>{let e=C();return i({mutationKey:[`deployments`,`retry`],mutationFn:e=>c(()=>s.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:()=>s.webhooks.list(),meta:F}),L=()=>n({queryKey:r.publishing.webhooks.events,queryFn:()=>s.webhooks.events(),staleTime:1/0,meta:F}),R=e=>n({queryKey:r.publishing.webhooks.webhook(e),queryFn:()=>s.webhooks.get(e),meta:F}),z=(e,t)=>n({queryKey:r.publishing.webhooks.deliveries(e,t),queryFn:()=>s.webhooks.deliveries(e,{cursor:t,limit:25}),placeholderData:l,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=>c(()=>s.webhooks.create(e)),onSuccess:e})},H=()=>{let e=a(),t=B();return i({mutationKey:[`webhooks`,`update`],meta:F,mutationFn:({id:e,input:t})=>c(()=>s.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=>c(()=>s.webhooks.remove(e)),onSuccess:e})},W=()=>{let e=B();return i({mutationKey:[`webhooks`,`rotateSecret`],mutationFn:e=>c(()=>s.webhooks.rotateSecret(e)),onSuccess:e})},G=()=>{let e=B();return i({mutationKey:[`webhooks`,`test`],mutationFn:e=>c(()=>s.webhooks.test(e)),onSuccess:e})},K=()=>{let e=B();return i({mutationKey:[`webhooks`,`redeliver`],mutationFn:({id:e,deliveryId:t})=>c(()=>s.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-B1upg5EU.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{H as n,P as r,V as i,bt as a,i as o,l as s,s as c,ut as l}from"./cn-CL1YHRrS.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=o(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:()=>s.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:()=>s.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:()=>s.deployments.runs.list(e),placeholderData:l,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:()=>s.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=>c(()=>s.deployments.connections.create(e)),onSuccess:e})},T=()=>{let e=a(),t=C();return i({mutationKey:[`deployments`,`update`],meta:_,mutationFn:({id:e,input:t})=>c(()=>s.deployments.connections.update(e,t)),onSuccess:n=>(e.setQueryData(r.publishing.deployments.connection(n.id),n),t())})},E=()=>{let e=a(),t=C();return i({mutationKey:[`deployments`,`delete`],mutationFn:e=>c(()=>s.deployments.connections.remove(e)),onSuccess:(n,i)=>(e.removeQueries({queryKey:r.publishing.deployments.connection(i)}),t())})},D=()=>i({mutationKey:[`deployments`,`test`],mutationFn:e=>c(()=>s.deployments.connections.test(e))}),O=()=>{let e=C();return i({mutationKey:[`deployments`,`trigger`],mutationFn:e=>c(()=>s.deployments.connections.trigger(e)),onSuccess:e})},k=()=>{let e=C();return i({mutationKey:[`deployments`,`retry`],mutationFn:e=>c(()=>s.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:()=>s.webhooks.list(),meta:F}),L=()=>n({queryKey:r.publishing.webhooks.events,queryFn:()=>s.webhooks.events(),staleTime:1/0,meta:F}),R=e=>n({queryKey:r.publishing.webhooks.webhook(e),queryFn:()=>s.webhooks.get(e),meta:F}),z=(e,t)=>n({queryKey:r.publishing.webhooks.deliveries(e,t),queryFn:()=>s.webhooks.deliveries(e,{cursor:t,limit:25}),placeholderData:l,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=>c(()=>s.webhooks.create(e)),onSuccess:e})},H=()=>{let e=a(),t=B();return i({mutationKey:[`webhooks`,`update`],meta:F,mutationFn:({id:e,input:t})=>c(()=>s.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=>c(()=>s.webhooks.remove(e)),onSuccess:e})},W=()=>{let e=B();return i({mutationKey:[`webhooks`,`rotateSecret`],mutationFn:e=>c(()=>s.webhooks.rotateSecret(e)),onSuccess:e})},G=()=>{let e=B();return i({mutationKey:[`webhooks`,`test`],mutationFn:e=>c(()=>s.webhooks.test(e)),onSuccess:e})},K=()=>{let e=B();return i({mutationKey:[`webhooks`,`redeliver`],mutationFn:({id:e,deliveryId:t})=>c(()=>s.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-CzB6NDOB.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCursorPager-B1upg5EU.js","names":["silent","useState","__toESM","useQuery","queryKeys","useMutation","useQueryClient","createLucideIcon","adminApi","withCsrf","keepPreviousData","PUBLISHING_POLL_INTERVAL_MS","ACTIVE_RUN_STATUSES","ACTIVE_DELIVERY_STATUSES","__iconData","Rocket","import_react","require_react","useResetOnOpen","open","reset","values","resetMutation","silent$1","pollWhileActive","active","useDeploymentConnections","query","connection","useDeploymentConnection","id","useDeploymentRuns","state","run","useDeploymentRun","useInvalidateDeployments","queryClient","useCreateDeploymentConnection","invalidate","input","useUpdateDeploymentConnection","useDeleteDeploymentConnection","useTestDeploymentConnection","useTriggerDeployment","useRetryDeploymentRun","PUBLICATION_ACTION_LABELS","PROVIDER_LABELS","TRIGGER_POLICY_LABELS","RUN_TRIGGER_LABELS","TIMELINE_SOURCE_LABELS","silent","useWebhooks","useWebhookEvents","useWebhook","useWebhookDeliveries","cursor","delivery","useInvalidateWebhooks","useCreateWebhook","useUpdateWebhook","webhook","useDeleteWebhook","useRotateWebhookSecret","useTestWebhook","useRedeliverWebhook","deliveryId","useCursorPager","previousCursors","setPreviousCursors","setCursor","cursors","nextCursor"],"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/rocket.mjs","../../src/features/Publishing/hooks/useResetOnOpen.ts","../../src/api/deployments.ts","../../src/features/Publishing/constants.ts","../../src/api/webhooks.ts","../../src/features/Publishing/hooks/useCursorPager.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: \"rocket\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\", key: \"qeys4\" }],\n [\n \"path\",\n {\n 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\",\n key: \"u4xsad\"\n }\n ],\n [\n \"path\",\n {\n 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\",\n key: \"676m9\"\n }\n ],\n [\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\", key: \"92ym6u\" }]\n ]\n};\n__iconData.node;\nconst Rocket = createLucideIcon(__iconData);\n\nexport { __iconData, Rocket as default };\n//# sourceMappingURL=rocket.mjs.map\n","import { useEffect } from 'react';\nimport type { FieldValues, UseFormReset } from 'react-hook-form';\n\n/**\n * A sheet or popover form starts clean every time it opens: default values, and no error left over from the last\n * attempt. `values` must be stable (a module constant or memoized).\n */\nexport const useResetOnOpen = <TValues extends FieldValues>(\n open: boolean,\n reset: UseFormReset<TValues>,\n values: TValues,\n resetMutation: () => void,\n) => {\n useEffect(() => {\n if (open) {\n reset(values);\n resetMutation();\n }\n }, [open, reset, values, resetMutation]);\n};\n","import type {\n CreateDeploymentConnectionInput,\n DeploymentConnection,\n DeploymentRunQuery,\n UpdateDeploymentConnectionInput,\n} from '@shapio/client';\nimport { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { ACTIVE_RUN_STATUSES, PUBLISHING_POLL_INTERVAL_MS } from '@/constants/publishing';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nconst silent = { silent: true } as const;\n\n/** Polls while the latest runs are still in progress, so statuses move on screen without a reload. */\nconst pollWhileActive = (active: boolean) => (active ? PUBLISHING_POLL_INTERVAL_MS : false);\n\nexport const useDeploymentConnections = () =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.connections,\n queryFn: () => adminApi.deployments.connections.list(),\n refetchInterval: (query) =>\n pollWhileActive(\n query.state.data?.some((connection) =>\n connection.latestRun ? ACTIVE_RUN_STATUSES.has(connection.latestRun.status) : false,\n ) ?? false,\n ),\n meta: silent,\n });\n\nexport const useDeploymentConnection = (id: string) =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.connection(id),\n queryFn: () => adminApi.deployments.connections.get(id),\n refetchInterval: (query) =>\n pollWhileActive(\n query.state.data?.latestRun ? ACTIVE_RUN_STATUSES.has(query.state.data.latestRun.status) : false,\n ),\n meta: silent,\n });\n\nexport const useDeploymentRuns = (query: DeploymentRunQuery) =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.runs(query),\n queryFn: () => adminApi.deployments.runs.list(query),\n placeholderData: keepPreviousData,\n refetchInterval: (state) =>\n pollWhileActive(state.state.data?.items.some((run) => ACTIVE_RUN_STATUSES.has(run.status)) ?? false),\n meta: silent,\n });\n\n/** One run, polled until it reaches a final state (deployed, failed or unknown). */\nexport const useDeploymentRun = (id: string) =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.run(id),\n queryFn: () => adminApi.deployments.runs.get(id),\n refetchInterval: (query) =>\n pollWhileActive(query.state.data ? ACTIVE_RUN_STATUSES.has(query.state.data.status) : false),\n meta: silent,\n });\n\nconst useInvalidateDeployments = () => {\n const queryClient = useQueryClient();\n return () => queryClient.invalidateQueries({ queryKey: queryKeys.publishing.deployments.all });\n};\n\nexport const useCreateDeploymentConnection = () => {\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'create'],\n meta: silent,\n mutationFn: (input: CreateDeploymentConnectionInput) =>\n withCsrf(() => adminApi.deployments.connections.create(input)),\n onSuccess: invalidate,\n });\n};\n\n/** 409 when `expectedVersion` is stale: the caller reloads and tells the user. */\nexport const useUpdateDeploymentConnection = () => {\n const queryClient = useQueryClient();\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'update'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateDeploymentConnectionInput }) =>\n withCsrf(() => adminApi.deployments.connections.update(id, input)),\n onSuccess: (connection: DeploymentConnection) => {\n queryClient.setQueryData(queryKeys.publishing.deployments.connection(connection.id), connection);\n return invalidate();\n },\n });\n};\n\nexport const useDeleteDeploymentConnection = () => {\n const queryClient = useQueryClient();\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'delete'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.connections.remove(id)),\n onSuccess: (_result, id) => {\n queryClient.removeQueries({ queryKey: queryKeys.publishing.deployments.connection(id) });\n return invalidate();\n },\n });\n};\n\n/** Runs the provider's checks (credentials, reachability); the result is shown, not cached. */\nexport const useTestDeploymentConnection = () =>\n useMutation({\n mutationKey: ['deployments', 'test'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.connections.test(id)),\n });\n\nexport const useTriggerDeployment = () => {\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'trigger'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.connections.trigger(id)),\n onSuccess: invalidate,\n });\n};\n\nexport const useRetryDeploymentRun = () => {\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'retry'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.runs.retry(id)),\n onSuccess: invalidate,\n });\n};\n","import type { DeploymentProvider, DeploymentTriggerPolicy, PublicationAction } from '@shapio/client';\n\nexport const PUBLICATION_ACTION_LABELS = {\n publish: 'publishing.actions.publish',\n unpublish: 'publishing.actions.unpublish',\n} as const satisfies Record<PublicationAction, string>;\n\nexport const PROVIDER_LABELS = {\n generic_webhook: 'publishing.deployments.providers.generic_webhook',\n cloudflare_pages: 'publishing.deployments.providers.cloudflare_pages',\n vercel: 'publishing.deployments.providers.vercel',\n netlify: 'publishing.deployments.providers.netlify',\n github: 'publishing.deployments.providers.github',\n} as const satisfies Record<DeploymentProvider, string>;\n\nexport const TRIGGER_POLICY_LABELS = {\n publish: 'publishing.deployments.triggers.publish',\n change_set: 'publishing.deployments.triggers.changeSet',\n schema: 'publishing.deployments.triggers.schema',\n manual: 'publishing.deployments.triggers.manual',\n} as const satisfies Record<DeploymentTriggerPolicy, string>;\n\nexport const RUN_TRIGGER_LABELS = {\n publish: 'publishing.deployments.runTriggers.publish',\n change_set: 'publishing.deployments.runTriggers.changeSet',\n schema: 'publishing.deployments.runTriggers.schema',\n manual: 'publishing.deployments.runTriggers.manual',\n retry: 'publishing.deployments.runTriggers.retry',\n} as const;\n\nexport const TIMELINE_SOURCE_LABELS = {\n shapio: 'publishing.deployments.sources.shapio',\n callback: 'publishing.deployments.sources.callback',\n provider: 'publishing.deployments.sources.provider',\n} as const;\n\n/** Longest error text shown in a table cell; the full text is in the details. */\nexport const ERROR_PREVIEW_LENGTH = 120;\n","import type { CreateWebhookInput, UpdateWebhookInput, Webhook } from '@shapio/client';\nimport { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport {\n ACTIVE_DELIVERY_STATUSES,\n PUBLISHING_PAGE_SIZE,\n PUBLISHING_POLL_INTERVAL_MS,\n} from '@/constants/publishing';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nconst silent = { silent: true } as const;\n\nexport const useWebhooks = () =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.list,\n queryFn: () => adminApi.webhooks.list(),\n meta: silent,\n });\n\n/** The event types a webhook can subscribe to (a fixed catalogue: cached for the session). */\nexport const useWebhookEvents = () =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.events,\n queryFn: () => adminApi.webhooks.events(),\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useWebhook = (id: string) =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.webhook(id),\n queryFn: () => adminApi.webhooks.get(id),\n meta: silent,\n });\n\n/** One page of the delivery log, polled while a delivery on it still has attempts left. */\nexport const useWebhookDeliveries = (id: string, cursor: string | undefined) =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.deliveries(id, cursor),\n queryFn: () => adminApi.webhooks.deliveries(id, { cursor, limit: PUBLISHING_PAGE_SIZE }),\n placeholderData: keepPreviousData,\n refetchInterval: (query) =>\n query.state.data?.items.some((delivery) => ACTIVE_DELIVERY_STATUSES.has(delivery.status))\n ? PUBLISHING_POLL_INTERVAL_MS\n : false,\n meta: silent,\n });\n\nconst useInvalidateWebhooks = () => {\n const queryClient = useQueryClient();\n return () => queryClient.invalidateQueries({ queryKey: queryKeys.publishing.webhooks.all });\n};\n\nexport const useCreateWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'create'],\n meta: silent,\n mutationFn: (input: CreateWebhookInput) => withCsrf(() => adminApi.webhooks.create(input)),\n onSuccess: invalidate,\n });\n};\n\n/** 409 when `expectedVersion` is stale: the caller reloads and tells the user. */\nexport const useUpdateWebhook = () => {\n const queryClient = useQueryClient();\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'update'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateWebhookInput }) =>\n withCsrf(() => adminApi.webhooks.update(id, input)),\n onSuccess: (webhook: Webhook) => {\n queryClient.setQueryData(queryKeys.publishing.webhooks.webhook(webhook.id), webhook);\n return invalidate();\n },\n });\n};\n\nexport const useDeleteWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'delete'],\n mutationFn: (id: string) => withCsrf(() => adminApi.webhooks.remove(id)),\n onSuccess: invalidate,\n });\n};\n\nexport const useRotateWebhookSecret = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'rotateSecret'],\n mutationFn: (id: string) => withCsrf(() => adminApi.webhooks.rotateSecret(id)),\n onSuccess: invalidate,\n });\n};\n\n/** Queues a `webhook.test` delivery; the delivery log shows its outcome. */\nexport const useTestWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'test'],\n mutationFn: (id: string) => withCsrf(() => adminApi.webhooks.test(id)),\n onSuccess: invalidate,\n });\n};\n\nexport const useRedeliverWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'redeliver'],\n mutationFn: ({ id, deliveryId }: { id: string; deliveryId: string }) =>\n withCsrf(() => adminApi.webhooks.redeliver(id, deliveryId)),\n onSuccess: invalidate,\n });\n};\n","import { useState } from 'react';\n\ntype CursorPagerProps = {\n onFirst: (() => void) | undefined;\n onPrevious: (() => void) | undefined;\n onNext: (() => void) | undefined;\n};\n\n/**\n * First / Previous / Next for a forward-only cursor list (newest first). The current cursor lives wherever\n * the caller keeps it (usually the URL); the cursors of earlier pages are remembered here.\n */\nexport const useCursorPager = (\n cursor: string | undefined,\n setCursor: (cursor: string | undefined) => void,\n) => {\n const [previousCursors, setPreviousCursors] = useState<(string | undefined)[]>([]);\n const pagerProps = (nextCursor: string | null): CursorPagerProps => ({\n onFirst:\n cursor === undefined\n ? undefined\n : () => {\n setPreviousCursors([]);\n setCursor(undefined);\n },\n onPrevious:\n previousCursors.length === 0\n ? undefined\n : () => {\n setCursor(previousCursors.at(-1));\n setPreviousCursors((cursors) => cursors.slice(0, -1));\n },\n onNext: nextCursor\n ? () => {\n setPreviousCursors((cursors) => [...cursors, cursor]);\n setCursor(nextCursor);\n }\n : undefined,\n });\n return { pagerProps, resetPager: () => setPreviousCursors([]) };\n};\n"],"ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"useCursorPager-CzB6NDOB.js","names":["silent","useState","__toESM","useQuery","queryKeys","useMutation","useQueryClient","createLucideIcon","adminApi","withCsrf","keepPreviousData","PUBLISHING_POLL_INTERVAL_MS","ACTIVE_RUN_STATUSES","ACTIVE_DELIVERY_STATUSES","__iconData","Rocket","import_react","require_react","useResetOnOpen","open","reset","values","resetMutation","silent$1","pollWhileActive","active","useDeploymentConnections","query","connection","useDeploymentConnection","id","useDeploymentRuns","state","run","useDeploymentRun","useInvalidateDeployments","queryClient","useCreateDeploymentConnection","invalidate","input","useUpdateDeploymentConnection","useDeleteDeploymentConnection","useTestDeploymentConnection","useTriggerDeployment","useRetryDeploymentRun","PUBLICATION_ACTION_LABELS","PROVIDER_LABELS","TRIGGER_POLICY_LABELS","RUN_TRIGGER_LABELS","TIMELINE_SOURCE_LABELS","silent","useWebhooks","useWebhookEvents","useWebhook","useWebhookDeliveries","cursor","delivery","useInvalidateWebhooks","useCreateWebhook","useUpdateWebhook","webhook","useDeleteWebhook","useRotateWebhookSecret","useTestWebhook","useRedeliverWebhook","deliveryId","useCursorPager","previousCursors","setPreviousCursors","setCursor","cursors","nextCursor"],"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/rocket.mjs","../../src/features/Publishing/hooks/useResetOnOpen.ts","../../src/api/deployments.ts","../../src/features/Publishing/constants.ts","../../src/api/webhooks.ts","../../src/features/Publishing/hooks/useCursorPager.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: \"rocket\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\", key: \"qeys4\" }],\n [\n \"path\",\n {\n 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\",\n key: \"u4xsad\"\n }\n ],\n [\n \"path\",\n {\n 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\",\n key: \"676m9\"\n }\n ],\n [\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\", key: \"92ym6u\" }]\n ]\n};\n__iconData.node;\nconst Rocket = createLucideIcon(__iconData);\n\nexport { __iconData, Rocket as default };\n//# sourceMappingURL=rocket.mjs.map\n","import { useEffect } from 'react';\nimport type { FieldValues, UseFormReset } from 'react-hook-form';\n\n/**\n * A sheet or popover form starts clean every time it opens: default values, and no error left over from the last\n * attempt. `values` must be stable (a module constant or memoized).\n */\nexport const useResetOnOpen = <TValues extends FieldValues>(\n open: boolean,\n reset: UseFormReset<TValues>,\n values: TValues,\n resetMutation: () => void,\n) => {\n useEffect(() => {\n if (open) {\n reset(values);\n resetMutation();\n }\n }, [open, reset, values, resetMutation]);\n};\n","import type {\n CreateDeploymentConnectionInput,\n DeploymentConnection,\n DeploymentRunQuery,\n UpdateDeploymentConnectionInput,\n} from '@shapio/client';\nimport { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { ACTIVE_RUN_STATUSES, PUBLISHING_POLL_INTERVAL_MS } from '@/constants/publishing';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nconst silent = { silent: true } as const;\n\n/** Polls while the latest runs are still in progress, so statuses move on screen without a reload. */\nconst pollWhileActive = (active: boolean) => (active ? PUBLISHING_POLL_INTERVAL_MS : false);\n\nexport const useDeploymentConnections = () =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.connections,\n queryFn: () => adminApi.deployments.connections.list(),\n refetchInterval: (query) =>\n pollWhileActive(\n query.state.data?.some((connection) =>\n connection.latestRun ? ACTIVE_RUN_STATUSES.has(connection.latestRun.status) : false,\n ) ?? false,\n ),\n meta: silent,\n });\n\nexport const useDeploymentConnection = (id: string) =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.connection(id),\n queryFn: () => adminApi.deployments.connections.get(id),\n refetchInterval: (query) =>\n pollWhileActive(\n query.state.data?.latestRun ? ACTIVE_RUN_STATUSES.has(query.state.data.latestRun.status) : false,\n ),\n meta: silent,\n });\n\nexport const useDeploymentRuns = (query: DeploymentRunQuery) =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.runs(query),\n queryFn: () => adminApi.deployments.runs.list(query),\n placeholderData: keepPreviousData,\n refetchInterval: (state) =>\n pollWhileActive(state.state.data?.items.some((run) => ACTIVE_RUN_STATUSES.has(run.status)) ?? false),\n meta: silent,\n });\n\n/** One run, polled until it reaches a final state (deployed, failed or unknown). */\nexport const useDeploymentRun = (id: string) =>\n useQuery({\n queryKey: queryKeys.publishing.deployments.run(id),\n queryFn: () => adminApi.deployments.runs.get(id),\n refetchInterval: (query) =>\n pollWhileActive(query.state.data ? ACTIVE_RUN_STATUSES.has(query.state.data.status) : false),\n meta: silent,\n });\n\nconst useInvalidateDeployments = () => {\n const queryClient = useQueryClient();\n return () => queryClient.invalidateQueries({ queryKey: queryKeys.publishing.deployments.all });\n};\n\nexport const useCreateDeploymentConnection = () => {\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'create'],\n meta: silent,\n mutationFn: (input: CreateDeploymentConnectionInput) =>\n withCsrf(() => adminApi.deployments.connections.create(input)),\n onSuccess: invalidate,\n });\n};\n\n/** 409 when `expectedVersion` is stale: the caller reloads and tells the user. */\nexport const useUpdateDeploymentConnection = () => {\n const queryClient = useQueryClient();\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'update'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateDeploymentConnectionInput }) =>\n withCsrf(() => adminApi.deployments.connections.update(id, input)),\n onSuccess: (connection: DeploymentConnection) => {\n queryClient.setQueryData(queryKeys.publishing.deployments.connection(connection.id), connection);\n return invalidate();\n },\n });\n};\n\nexport const useDeleteDeploymentConnection = () => {\n const queryClient = useQueryClient();\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'delete'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.connections.remove(id)),\n onSuccess: (_result, id) => {\n queryClient.removeQueries({ queryKey: queryKeys.publishing.deployments.connection(id) });\n return invalidate();\n },\n });\n};\n\n/** Runs the provider's checks (credentials, reachability); the result is shown, not cached. */\nexport const useTestDeploymentConnection = () =>\n useMutation({\n mutationKey: ['deployments', 'test'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.connections.test(id)),\n });\n\nexport const useTriggerDeployment = () => {\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'trigger'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.connections.trigger(id)),\n onSuccess: invalidate,\n });\n};\n\nexport const useRetryDeploymentRun = () => {\n const invalidate = useInvalidateDeployments();\n return useMutation({\n mutationKey: ['deployments', 'retry'],\n mutationFn: (id: string) => withCsrf(() => adminApi.deployments.runs.retry(id)),\n onSuccess: invalidate,\n });\n};\n","import type { DeploymentProvider, DeploymentTriggerPolicy, PublicationAction } from '@shapio/client';\n\nexport const PUBLICATION_ACTION_LABELS = {\n publish: 'publishing.actions.publish',\n unpublish: 'publishing.actions.unpublish',\n} as const satisfies Record<PublicationAction, string>;\n\nexport const PROVIDER_LABELS = {\n generic_webhook: 'publishing.deployments.providers.generic_webhook',\n cloudflare_pages: 'publishing.deployments.providers.cloudflare_pages',\n vercel: 'publishing.deployments.providers.vercel',\n netlify: 'publishing.deployments.providers.netlify',\n github: 'publishing.deployments.providers.github',\n} as const satisfies Record<DeploymentProvider, string>;\n\nexport const TRIGGER_POLICY_LABELS = {\n publish: 'publishing.deployments.triggers.publish',\n change_set: 'publishing.deployments.triggers.changeSet',\n schema: 'publishing.deployments.triggers.schema',\n manual: 'publishing.deployments.triggers.manual',\n} as const satisfies Record<DeploymentTriggerPolicy, string>;\n\nexport const RUN_TRIGGER_LABELS = {\n publish: 'publishing.deployments.runTriggers.publish',\n change_set: 'publishing.deployments.runTriggers.changeSet',\n schema: 'publishing.deployments.runTriggers.schema',\n manual: 'publishing.deployments.runTriggers.manual',\n retry: 'publishing.deployments.runTriggers.retry',\n} as const;\n\nexport const TIMELINE_SOURCE_LABELS = {\n shapio: 'publishing.deployments.sources.shapio',\n callback: 'publishing.deployments.sources.callback',\n provider: 'publishing.deployments.sources.provider',\n} as const;\n\n/** Longest error text shown in a table cell; the full text is in the details. */\nexport const ERROR_PREVIEW_LENGTH = 120;\n","import type { CreateWebhookInput, UpdateWebhookInput, Webhook } from '@shapio/client';\nimport { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport {\n ACTIVE_DELIVERY_STATUSES,\n PUBLISHING_PAGE_SIZE,\n PUBLISHING_POLL_INTERVAL_MS,\n} from '@/constants/publishing';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nconst silent = { silent: true } as const;\n\nexport const useWebhooks = () =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.list,\n queryFn: () => adminApi.webhooks.list(),\n meta: silent,\n });\n\n/** The event types a webhook can subscribe to (a fixed catalogue: cached for the session). */\nexport const useWebhookEvents = () =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.events,\n queryFn: () => adminApi.webhooks.events(),\n staleTime: Infinity,\n meta: silent,\n });\n\nexport const useWebhook = (id: string) =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.webhook(id),\n queryFn: () => adminApi.webhooks.get(id),\n meta: silent,\n });\n\n/** One page of the delivery log, polled while a delivery on it still has attempts left. */\nexport const useWebhookDeliveries = (id: string, cursor: string | undefined) =>\n useQuery({\n queryKey: queryKeys.publishing.webhooks.deliveries(id, cursor),\n queryFn: () => adminApi.webhooks.deliveries(id, { cursor, limit: PUBLISHING_PAGE_SIZE }),\n placeholderData: keepPreviousData,\n refetchInterval: (query) =>\n query.state.data?.items.some((delivery) => ACTIVE_DELIVERY_STATUSES.has(delivery.status))\n ? PUBLISHING_POLL_INTERVAL_MS\n : false,\n meta: silent,\n });\n\nconst useInvalidateWebhooks = () => {\n const queryClient = useQueryClient();\n return () => queryClient.invalidateQueries({ queryKey: queryKeys.publishing.webhooks.all });\n};\n\nexport const useCreateWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'create'],\n meta: silent,\n mutationFn: (input: CreateWebhookInput) => withCsrf(() => adminApi.webhooks.create(input)),\n onSuccess: invalidate,\n });\n};\n\n/** 409 when `expectedVersion` is stale: the caller reloads and tells the user. */\nexport const useUpdateWebhook = () => {\n const queryClient = useQueryClient();\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'update'],\n meta: silent,\n mutationFn: ({ id, input }: { id: string; input: UpdateWebhookInput }) =>\n withCsrf(() => adminApi.webhooks.update(id, input)),\n onSuccess: (webhook: Webhook) => {\n queryClient.setQueryData(queryKeys.publishing.webhooks.webhook(webhook.id), webhook);\n return invalidate();\n },\n });\n};\n\nexport const useDeleteWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'delete'],\n mutationFn: (id: string) => withCsrf(() => adminApi.webhooks.remove(id)),\n onSuccess: invalidate,\n });\n};\n\nexport const useRotateWebhookSecret = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'rotateSecret'],\n mutationFn: (id: string) => withCsrf(() => adminApi.webhooks.rotateSecret(id)),\n onSuccess: invalidate,\n });\n};\n\n/** Queues a `webhook.test` delivery; the delivery log shows its outcome. */\nexport const useTestWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'test'],\n mutationFn: (id: string) => withCsrf(() => adminApi.webhooks.test(id)),\n onSuccess: invalidate,\n });\n};\n\nexport const useRedeliverWebhook = () => {\n const invalidate = useInvalidateWebhooks();\n return useMutation({\n mutationKey: ['webhooks', 'redeliver'],\n mutationFn: ({ id, deliveryId }: { id: string; deliveryId: string }) =>\n withCsrf(() => adminApi.webhooks.redeliver(id, deliveryId)),\n onSuccess: invalidate,\n });\n};\n","import { useState } from 'react';\n\ntype CursorPagerProps = {\n onFirst: (() => void) | undefined;\n onPrevious: (() => void) | undefined;\n onNext: (() => void) | undefined;\n};\n\n/**\n * First / Previous / Next for a forward-only cursor list (newest first). The current cursor lives wherever\n * the caller keeps it (usually the URL); the cursors of earlier pages are remembered here.\n */\nexport const useCursorPager = (\n cursor: string | undefined,\n setCursor: (cursor: string | undefined) => void,\n) => {\n const [previousCursors, setPreviousCursors] = useState<(string | undefined)[]>([]);\n const pagerProps = (nextCursor: string | null): CursorPagerProps => ({\n onFirst:\n cursor === undefined\n ? undefined\n : () => {\n setPreviousCursors([]);\n setCursor(undefined);\n },\n onPrevious:\n previousCursors.length === 0\n ? undefined\n : () => {\n setCursor(previousCursors.at(-1));\n setPreviousCursors((cursors) => cursors.slice(0, -1));\n },\n onNext: nextCursor\n ? () => {\n setPreviousCursors((cursors) => [...cursors, cursor]);\n setCursor(nextCursor);\n }\n : undefined,\n });\n return { pagerProps, resetPager: () => setPreviousCursors([]) };\n};\n"],"ignoreList":[0],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{j as r}from"./cn-BQ3voEft.js";import{t as i}from"./ConfirmDialog-B9nWhIIz.js";var a=e(t(),1),o=e(n(),1),s=({dirty:e,pending:t=!1,onOpenChange:n})=>{let{t:s}=r(),[c,l]=(0,a.useState)(!1);return{requestOpenChange:r=>{if(!r&&e&&!t){l(!0);return}n(r)},discardPrompt:(0,o.jsx)(i,{open:c,onOpenChange:l,title:s(`unsaved.title`),description:s(`unsaved.description`),cancelLabel:s(`unsaved.stay`),confirmLabel:s(`unsaved.leave`),destructive:!0,onConfirm:()=>{l(!1),n(!1)}})}};export{s as t};
2
- //# sourceMappingURL=useDiscardGuard-34ynGJIk.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{j as r}from"./cn-CL1YHRrS.js";import{t as i}from"./ConfirmDialog-BfpN2MQx.js";var a=e(t(),1),o=e(n(),1),s=({dirty:e,pending:t=!1,onOpenChange:n})=>{let{t:s}=r(),[c,l]=(0,a.useState)(!1);return{requestOpenChange:r=>{if(!r&&e&&!t){l(!0);return}n(r)},discardPrompt:(0,o.jsx)(i,{open:c,onOpenChange:l,title:s(`unsaved.title`),description:s(`unsaved.description`),cancelLabel:s(`unsaved.stay`),confirmLabel:s(`unsaved.leave`),destructive:!0,onConfirm:()=>{l(!1),n(!1)}})}};export{s as t};
2
+ //# sourceMappingURL=useDiscardGuard-CGFgC3xY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDiscardGuard-34ynGJIk.js","names":["useState","_jsx","__toESM","require_jsx_runtime","useTranslation","ConfirmDialog","import_react","require_react","import_jsx_runtime","useDiscardGuard","confirmingDiscard","setConfirmingDiscard","open","dirty","pending","onOpenChange","t"],"sources":["../../src/hooks/useDiscardGuard.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ConfirmDialog } from '@/components/ConfirmDialog';\n\ntype UseDiscardGuardOptions = {\n /** Unsaved edits: closing asks before discarding them. */\n dirty: boolean;\n /** While a save runs, closing is not intercepted (the caller blocks it or lets it finish). */\n pending?: boolean;\n /** The overlay's own open/close handler, called once closing is allowed. */\n onOpenChange: (open: boolean) => void;\n};\n\n/**\n * Dirty-close protection for a sheet (or any overlay with `onOpenChange`). Pass `requestOpenChange` to the\n * overlay instead of `onOpenChange` and render `discardPrompt` beside it: Escape, the overlay, the close\n * button and Cancel then ask \"Discard unsaved changes?\" before closing over unsaved edits.\n */\nexport const useDiscardGuard = ({\n dirty,\n pending = false,\n onOpenChange,\n}: UseDiscardGuardOptions): { requestOpenChange: (open: boolean) => void; discardPrompt: ReactNode } => {\n const { t } = useTranslation();\n const [confirmingDiscard, setConfirmingDiscard] = useState(false);\n const requestOpenChange = (open: boolean) => {\n if (!open && dirty && !pending) {\n setConfirmingDiscard(true);\n return;\n }\n onOpenChange(open);\n };\n const discardPrompt = (\n <ConfirmDialog\n open={confirmingDiscard}\n onOpenChange={setConfirmingDiscard}\n title={t('unsaved.title')}\n description={t('unsaved.description')}\n cancelLabel={t('unsaved.stay')}\n confirmLabel={t('unsaved.leave')}\n destructive\n onConfirm={() => {\n setConfirmingDiscard(false);\n onOpenChange(false);\n }}\n />\n );\n return { requestOpenChange, discardPrompt };\n};\n"],"mappings":"mPAkBaS,GAAmB,CAC9B,QACA,UAAU,GACV,kBACsG,CACtG,GAAM,CAAE,KAAML,EAAe,EACvB,CAACM,EAAmBC,IAAA,EAAwBX,EAAAA,SAAAA,CAAS,EAAK,EAuBhE,MAAO,CAAE,kBAtBkB,GAAkB,CAC3C,GAAI,CAACY,GAAQC,GAAS,CAACC,EAAS,CAC9BH,EAAqB,EAAI,EACzB,MACF,CACAI,EAAaH,CAAI,CACnB,EAgB4B,eAAA,EAd1BX,EAAAA,IAAAA,CAACI,EAAD,CACE,KAAMK,EACN,aAAcC,EACd,MAAOK,EAAE,eAAe,EACxB,YAAaA,EAAE,qBAAqB,EACpC,YAAaA,EAAE,cAAc,EAC7B,aAAcA,EAAE,eAAe,EAC/B,YAAA,GACA,cAAiB,CACfL,EAAqB,EAAK,EAC1BI,EAAa,EAAK,CACpB,CACD,CAEyB,CAAc,CAC5C"}
1
+ {"version":3,"file":"useDiscardGuard-CGFgC3xY.js","names":["useState","_jsx","__toESM","require_jsx_runtime","useTranslation","ConfirmDialog","import_react","require_react","import_jsx_runtime","useDiscardGuard","confirmingDiscard","setConfirmingDiscard","open","dirty","pending","onOpenChange","t"],"sources":["../../src/hooks/useDiscardGuard.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { ConfirmDialog } from '@/components/ConfirmDialog';\n\ntype UseDiscardGuardOptions = {\n /** Unsaved edits: closing asks before discarding them. */\n dirty: boolean;\n /** While a save runs, closing is not intercepted (the caller blocks it or lets it finish). */\n pending?: boolean;\n /** The overlay's own open/close handler, called once closing is allowed. */\n onOpenChange: (open: boolean) => void;\n};\n\n/**\n * Dirty-close protection for a sheet (or any overlay with `onOpenChange`). Pass `requestOpenChange` to the\n * overlay instead of `onOpenChange` and render `discardPrompt` beside it: Escape, the overlay, the close\n * button and Cancel then ask \"Discard unsaved changes?\" before closing over unsaved edits.\n */\nexport const useDiscardGuard = ({\n dirty,\n pending = false,\n onOpenChange,\n}: UseDiscardGuardOptions): { requestOpenChange: (open: boolean) => void; discardPrompt: ReactNode } => {\n const { t } = useTranslation();\n const [confirmingDiscard, setConfirmingDiscard] = useState(false);\n const requestOpenChange = (open: boolean) => {\n if (!open && dirty && !pending) {\n setConfirmingDiscard(true);\n return;\n }\n onOpenChange(open);\n };\n const discardPrompt = (\n <ConfirmDialog\n open={confirmingDiscard}\n onOpenChange={setConfirmingDiscard}\n title={t('unsaved.title')}\n description={t('unsaved.description')}\n cancelLabel={t('unsaved.stay')}\n confirmLabel={t('unsaved.leave')}\n destructive\n onConfirm={() => {\n setConfirmingDiscard(false);\n onOpenChange(false);\n }}\n />\n );\n return { requestOpenChange, discardPrompt };\n};\n"],"mappings":"mPAkBaS,GAAmB,CAC9B,QACA,UAAU,GACV,kBACsG,CACtG,GAAM,CAAE,KAAML,EAAe,EACvB,CAACM,EAAmBC,IAAA,EAAwBX,EAAAA,SAAAA,CAAS,EAAK,EAuBhE,MAAO,CAAE,kBAtBkB,GAAkB,CAC3C,GAAI,CAACY,GAAQC,GAAS,CAACC,EAAS,CAC9BH,EAAqB,EAAI,EACzB,MACF,CACAI,EAAaH,CAAI,CACnB,EAgB4B,eAAA,EAd1BX,EAAAA,IAAAA,CAACI,EAAD,CACE,KAAMK,EACN,aAAcC,EACd,MAAOK,EAAE,eAAe,EACxB,YAAaA,EAAE,qBAAqB,EACpC,YAAaA,EAAE,cAAc,EAC7B,aAAcA,EAAE,eAAe,EAC/B,YAAA,GACA,cAAiB,CACfL,EAAqB,EAAK,EAC1BI,EAAa,EAAK,CACpB,CACD,CAEyB,CAAc,CAC5C"}
@@ -0,0 +1,2 @@
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{P as r,bt as i,j as a,l as o,t as s}from"./cn-CL1YHRrS.js";import{c,d as l,f as u,l as d,m as f,p,u as m}from"./badge-C5oMRtwJ.js";import{U as h}from"./InfoHint-DWn9kLf1.js";import{i as g}from"./skeleton-B5GJgv7y.js";import{a as _,i as v,n as y,r as b,t as x}from"./select-DyD7qIkJ.js";import{c as S}from"./Thumbnail-cjA7fSWh.js";import{a as C,i as w,n as T,r as E,t as D}from"./useMediaUploader-D1ouV8jc.js";import{t as O}from"./languages-eh7U4anI.js";import{r as k}from"./constants-DCtq_UOe.js";var A={draft:`content.status.draft`,published:`content.status.published`,modified:`content.status.modified`},j={draft:`neutral`,published:`success`,modified:`warning`},M=e(n(),1),N=({locales:e,value:t,onChange:n,states:r,size:i,id:o,className:c})=>{let{t:l}=a(),u=e=>{if(!r)return;let t=r.find(t=>t.locale===e);return l(t?A[t.status]:`content.locales.notCreated`)};return(0,M.jsxs)(x,{value:t,onValueChange:n,children:[(0,M.jsxs)(v,{id:o,size:i,"aria-label":o?void 0:l(`content.locales.label`),className:s(`w-full`,c),children:[(0,M.jsx)(O,{"aria-hidden":`true`}),(0,M.jsx)(_,{})]}),(0,M.jsx)(y,{children:e.map(e=>{let t=u(e.code);return(0,M.jsxs)(b,{value:e.code,children:[(0,M.jsx)(`span`,{children:e.label}),(0,M.jsx)(`span`,{className:`font-mono text-xs text-muted-foreground`,children:e.code}),t?(0,M.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`· `,t]}):null]},e.code)})})]})},P=e(t(),1),F=e=>e.startsWith(`image/`)?`image`:e.startsWith(`video/`)?`video`:e.startsWith(`audio/`)?`audio`:e===`application/pdf`||e.startsWith(`text/`)||e.includes(`officedocument`)||e.includes(`opendocument`)||e===`application/msword`?`document`:`other`,I=e=>({id:e.id,filename:e.filename,mimeType:e.mimeType,url:e.url,alt:e.alt,width:e.width,height:e.height}),L=e=>{if(e?.length!==1)return;let[t]=e;return t===`image`||t===`video`||t===`audio`?`${t}/*`:void 0},R=({open:e,options:t,onPick:n,onCancel:s})=>{let{t:_}=a(),v=i(),{canWrite:y}=S(),b=D(),[x,O]=(0,P.useState)(),[A,j]=(0,P.useState)(),[N,I]=(0,P.useState)(`grid`),[R,z]=(0,P.useState)([]),[B,V]=(0,P.useState)(!1),H=t.multiple===!0,U=L(t.allowedKinds),W={...x?{search:x}:{},...U?{mimeType:U}:A?{mimeType:k[A]}:{}},G=(e,t)=>z(n=>t?H?[...n.filter(t=>t!==e),e]:[e]:n.filter(t=>t!==e)),K=()=>{z([]),s()},q=async()=>{V(!0);try{let e=(await Promise.all(R.map(e=>v.fetchQuery({queryKey:r.media.asset(e),queryFn:()=>o.media.assets.get(e)})))).filter(e=>!t.allowedKinds||t.allowedKinds.includes(F(e.mimeType)));z([]),n(e)}catch(e){h(e,`choosing media`)}finally{V(!1)}};return(0,M.jsx)(c,{open:e,onOpenChange:e=>e?void 0:K(),children:(0,M.jsxs)(m,{size:`lg`,...t.allowedKinds?{}:{"aria-describedby":void 0},children:[(0,M.jsxs)(p,{className:`pr-14`,children:[(0,M.jsx)(f,{children:_(H?`content.media.pickTitleMultiple`:`content.media.pickTitle`)}),t.allowedKinds?(0,M.jsx)(l,{children:_(`content.media.allowedKinds`,{kinds:t.allowedKinds.join(`, `)})}):null]}),(0,M.jsxs)(`div`,{className:`space-y-4 px-6 pb-4`,children:[(0,M.jsxs)(`div`,{className:`flex flex-wrap items-start gap-2`,children:[(0,M.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,M.jsx)(w,{query:x,type:U?void 0:A,view:N,onQueryChange:O,onTypeChange:j,onViewChange:I})}),y?(0,M.jsx)(E,{variant:`outline`,label:_(`media.upload.action`),multiple:H,onFiles:e=>b.enqueue(e,{folderId:null,visibility:`public`})}):null]}),(0,M.jsx)(T,{onRetry:b.retry,onDismiss:b.dismiss})]}),(0,M.jsx)(d,{className:`pt-1`,children:(0,M.jsx)(C,{query:W,filtered:!!(x||A),view:N,selected:new Set(R),selectable:!0,activeId:void 0,onSelectChange:G,onOpen:e=>G(e.id,!R.includes(e.id))})}),(0,M.jsxs)(u,{children:[(0,M.jsx)(`span`,{role:`status`,className:`mr-auto text-sm text-muted-foreground`,children:_(`content.media.selectedCount`,{count:R.length})}),(0,M.jsx)(g,{type:`button`,variant:`outline`,onClick:K,children:_(`common.cancel`)}),(0,M.jsx)(g,{type:`button`,disabled:R.length===0||B,onClick:()=>void q(),children:_(`content.media.choose`,{count:R.length})})]})]})})},z=()=>{let[e,t]=(0,P.useState)(null),n=(0,P.useRef)(null),r=(0,P.useCallback)(e=>{n.current?.resolve(e),n.current=null,t(null)},[]);return{pickMedia:(0,P.useCallback)((e={})=>new Promise(r=>{n.current?.resolve(null);let i={options:e,resolve:r};n.current=i,t(i)}),[]),dialog:(0,M.jsx)(R,{open:e!==null,options:e?.options??{},onPick:e=>r(e.map(I)),onCancel:()=>r(null)})}};export{j as i,N as n,A as r,z as t};
2
+ //# sourceMappingURL=useMediaPickerDialog-BOkGEyG7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaPickerDialog-BOkGEyG7.js","names":["useState","useState","useRef","useCallback","_jsx","__toESM","require_jsx_runtime","queryKeys","useQueryClient","useTranslation","adminApi","cn","SheetDescription","SheetFooter","SheetBody","SheetTitle","SheetContent","reportError","Button","SelectValue","SelectTrigger","SelectContent","SelectItem","Select","useMediaPermissions","Library","Toolbar","UploadQueue","UploadButton","useMediaUploader","Languages","MIME_FILTER_BY_TYPE","ENTRY_STATUS_LABEL_KEYS","ENTRY_STATUS_TONES","import_jsx_runtime","LocaleSelect","statusOf","states","state","item","code","t","onChange","id","className","locales","status","locale","import_react","require_react","mediaKindOf","mimeType","toPickedMedia","asset","mimeFilterFor","kinds","kind","MediaPickerSheet","queryClient","uploader","search","setSearch","type","setType","view","setView","selected","setSelected","confirming","setConfirming","multiple","options","forcedMime","query","select","checked","current","close","onCancel","confirm","allowed","onPick","error","Sheet","next","SheetHeader","canWrite","files","useMediaPickerDialog","pending","setPending","pendingRef","settle","assets"],"sources":["../../src/features/Content/helpers/entryStatus.ts","../../src/features/Content/LocaleSelect/index.tsx","../../src/fields/helpers/media.ts","../../src/fields/MediaPickerSheet/index.tsx","../../src/fields/hooks/useMediaPickerDialog.tsx"],"sourcesContent":["import type { EntryStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\nexport const ENTRY_STATUS_LABEL_KEYS = {\n draft: 'content.status.draft',\n published: 'content.status.published',\n modified: 'content.status.modified',\n} as const satisfies Record<EntryStatus, string>;\n\n/** Draft is neutral, published is live (success), published with newer draft changes needs attention. */\nexport const ENTRY_STATUS_TONES = {\n draft: 'neutral',\n published: 'success',\n modified: 'warning',\n} as const satisfies Record<EntryStatus, StatusTone>;\n","import type { EntryLocaleState, Locale } from '@shapio/client';\nimport { Languages } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { cn } from '@/helpers/cn';\nimport { ENTRY_STATUS_LABEL_KEYS } from '../helpers/entryStatus';\n\ntype LocaleSelectProps = {\n locales: readonly Locale[];\n value: string;\n onChange: (code: string) => void;\n /** Per-locale status of an entry; locales without a version are marked \"not created\". */\n states?: readonly EntryLocaleState[];\n /** `sm` (36px) in page headers and toolbars, `default` (40px) in panels. */\n size?: 'default' | 'sm';\n id?: string;\n className?: string;\n};\n\n/** Chooses the content locale (with each locale's status when editing an entry). */\nexport const LocaleSelect = ({\n locales,\n value,\n onChange,\n states,\n size,\n id,\n className,\n}: LocaleSelectProps) => {\n const { t } = useTranslation();\n const statusOf = (code: string) => {\n if (!states) {\n return undefined;\n }\n const state = states.find((item) => item.locale === code);\n return state ? t(ENTRY_STATUS_LABEL_KEYS[state.status]) : t('content.locales.notCreated');\n };\n return (\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger\n id={id}\n size={size}\n aria-label={id ? undefined : t('content.locales.label')}\n className={cn('w-full', className)}\n >\n <Languages aria-hidden=\"true\" />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {locales.map((locale) => {\n const status = statusOf(locale.code);\n return (\n <SelectItem key={locale.code} value={locale.code}>\n <span>{locale.label}</span>\n <span className=\"font-mono text-xs text-muted-foreground\">{locale.code}</span>\n {status ? <span className=\"text-xs text-muted-foreground\">· {status}</span> : null}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n );\n};\n","import type { MediaAsset } from '@shapio/client';\nimport type { MediaKind, PickedMedia } from '@shapio/editor-sdk';\n\n/** The media kind of a MIME type (the server's `allowedKinds` buckets). */\nexport const mediaKindOf = (mimeType: string): MediaKind => {\n if (mimeType.startsWith('image/')) {\n return 'image';\n }\n if (mimeType.startsWith('video/')) {\n return 'video';\n }\n if (mimeType.startsWith('audio/')) {\n return 'audio';\n }\n if (\n mimeType === 'application/pdf' ||\n mimeType.startsWith('text/') ||\n mimeType.includes('officedocument') ||\n mimeType.includes('opendocument') ||\n mimeType === 'application/msword'\n ) {\n return 'document';\n }\n return 'other';\n};\n\n/** What an editor gets back from the picker: never storage keys or attribution. */\nexport const toPickedMedia = (asset: MediaAsset): PickedMedia => ({\n id: asset.id,\n filename: asset.filename,\n mimeType: asset.mimeType,\n url: asset.url,\n alt: asset.alt,\n width: asset.width,\n height: asset.height,\n});\n\n/** The library's server-side type filter for a set of allowed kinds (only when it is one MIME family). */\nexport const mimeFilterFor = (kinds: readonly MediaKind[] | undefined): string | undefined => {\n if (kinds?.length !== 1) {\n return undefined;\n }\n const [kind] = kinds;\n return kind === 'image' || kind === 'video' || kind === 'audio' ? `${kind}/*` : undefined;\n};\n","import type { MediaAsset } from '@shapio/client';\nimport type { MediaPickOptions } from '@shapio/editor-sdk';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { adminApi } from '@/api/client';\nimport { queryKeys } from '@/api/queryKeys';\nimport { Button } from '@/components/ui/button';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { MIME_FILTER_BY_TYPE, type MediaTypeFilter, type MediaView } from '@/features/Media/constants';\nimport { Library } from '@/features/Media/Library';\nimport { Toolbar } from '@/features/Media/Toolbar';\nimport { UploadButton } from '@/features/Media/UploadButton';\nimport { UploadQueue } from '@/features/Media/UploadQueue';\nimport { reportError } from '@/helpers/reportError';\nimport { useMediaPermissions } from '@/hooks/useMediaPermissions';\nimport { useMediaUploader } from '@/hooks/useMediaUploader';\nimport { mediaKindOf, mimeFilterFor } from '../helpers/media';\n\ntype MediaPickerSheetProps = {\n open: boolean;\n options: MediaPickOptions;\n onPick: (assets: MediaAsset[]) => void;\n onCancel: () => void;\n};\n\n/**\n * The media library's components in a large right-hand sheet, so the entry stays in view: search, filter,\n * upload, and choose one or several files. Files of kinds the field does not allow can be seen but not\n * chosen.\n */\nexport const MediaPickerSheet = ({ open, options, onPick, onCancel }: MediaPickerSheetProps) => {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const { canWrite } = useMediaPermissions();\n const uploader = useMediaUploader();\n const [search, setSearch] = useState<string | undefined>();\n const [type, setType] = useState<MediaTypeFilter | undefined>();\n const [view, setView] = useState<MediaView>('grid');\n const [selected, setSelected] = useState<string[]>([]);\n const [confirming, setConfirming] = useState(false);\n const multiple = options.multiple === true;\n const forcedMime = mimeFilterFor(options.allowedKinds);\n const query = {\n ...(search ? { search } : {}),\n ...(forcedMime ? { mimeType: forcedMime } : type ? { mimeType: MIME_FILTER_BY_TYPE[type] } : {}),\n };\n const select = (id: string, checked: boolean) =>\n setSelected((current) => {\n if (!checked) {\n return current.filter((item) => item !== id);\n }\n return multiple ? [...current.filter((item) => item !== id), id] : [id];\n });\n const close = () => {\n setSelected([]);\n onCancel();\n };\n const confirm = async () => {\n setConfirming(true);\n try {\n const assets = await Promise.all(\n selected.map((id) =>\n queryClient.fetchQuery({\n queryKey: queryKeys.media.asset(id),\n queryFn: () => adminApi.media.assets.get(id),\n }),\n ),\n );\n const allowed = assets.filter(\n (asset) => !options.allowedKinds || options.allowedKinds.includes(mediaKindOf(asset.mimeType)),\n );\n setSelected([]);\n onPick(allowed);\n } catch (error) {\n reportError(error, 'choosing media');\n } finally {\n setConfirming(false);\n }\n };\n return (\n <Sheet open={open} onOpenChange={(next) => (next ? undefined : close())}>\n <SheetContent size=\"lg\" {...(options.allowedKinds ? {} : { 'aria-describedby': undefined })}>\n <SheetHeader className=\"pr-14\">\n <SheetTitle>\n {multiple ? t('content.media.pickTitleMultiple') : t('content.media.pickTitle')}\n </SheetTitle>\n {options.allowedKinds ? (\n <SheetDescription>\n {t('content.media.allowedKinds', { kinds: options.allowedKinds.join(', ') })}\n </SheetDescription>\n ) : null}\n </SheetHeader>\n <div className=\"space-y-4 px-6 pb-4\">\n <div className=\"flex flex-wrap items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n <Toolbar\n query={search}\n type={forcedMime ? undefined : type}\n view={view}\n onQueryChange={setSearch}\n onTypeChange={setType}\n onViewChange={setView}\n />\n </div>\n {canWrite ? (\n <UploadButton\n variant=\"outline\"\n label={t('media.upload.action')}\n multiple={multiple}\n onFiles={(files) => uploader.enqueue(files, { folderId: null, visibility: 'public' })}\n />\n ) : null}\n </div>\n <UploadQueue onRetry={uploader.retry} onDismiss={uploader.dismiss} />\n </div>\n {/* A little top padding so the selected tiles' rings aren't clipped by the scroll area. */}\n <SheetBody className=\"pt-1\">\n <Library\n query={query}\n filtered={Boolean(search || type)}\n view={view}\n selected={new Set(selected)}\n selectable\n activeId={undefined}\n onSelectChange={select}\n onOpen={(asset) => select(asset.id, !selected.includes(asset.id))}\n />\n </SheetBody>\n <SheetFooter>\n <span role=\"status\" className=\"mr-auto text-sm text-muted-foreground\">\n {t('content.media.selectedCount', { count: selected.length })}\n </span>\n <Button type=\"button\" variant=\"outline\" onClick={close}>\n {t('common.cancel')}\n </Button>\n <Button type=\"button\" disabled={selected.length === 0 || confirming} onClick={() => void confirm()}>\n {t('content.media.choose', { count: selected.length })}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n );\n};\n","import type { MediaPickOptions, PickedMedia } from '@shapio/editor-sdk';\nimport { useCallback, useRef, useState } from 'react';\nimport { toPickedMedia } from '../helpers/media';\nimport { MediaPickerSheet } from '../MediaPickerSheet';\n\ntype PendingPick = { options: MediaPickOptions; resolve: (assets: PickedMedia[] | null) => void };\n\n/**\n * `pickMedia` for editors (the editor contract's media capability): opens the library in a sheet and resolves\n * with the chosen assets, or null when cancelled. Render `dialog` once in the form.\n */\nexport const useMediaPickerDialog = () => {\n const [pending, setPending] = useState<PendingPick | null>(null);\n const pendingRef = useRef<PendingPick | null>(null);\n const settle = useCallback((assets: PickedMedia[] | null) => {\n pendingRef.current?.resolve(assets);\n pendingRef.current = null;\n setPending(null);\n }, []);\n const pickMedia = useCallback(\n (options: MediaPickOptions = {}) =>\n new Promise<PickedMedia[] | null>((resolve) => {\n pendingRef.current?.resolve(null);\n const next = { options, resolve };\n pendingRef.current = next;\n setPending(next);\n }),\n [],\n );\n const dialog = (\n <MediaPickerSheet\n open={pending !== null}\n options={pending?.options ?? {}}\n onPick={(assets) => settle(assets.map(toPickedMedia))}\n onCancel={() => settle(null)}\n />\n );\n return { pickMedia, dialog };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{I as r,L as i,P as a,bt as o,i as s,j as c,l,p as u,r as d,s as f,t as p,u as ee}from"./cn-CL1YHRrS.js";import{a as te}from"./media-5ks_0Rre.js";import{A as m,O as ne,n as h,o as re,r as ie,v as ae}from"./badge-C5oMRtwJ.js";import{i as g,n as _,t as v}from"./RowTitle-BdDgA5Lb.js";import{G as y,H as b}from"./InfoHint-DWn9kLf1.js";import{N as x,i as S,k as oe,n as se}from"./skeleton-B5GJgv7y.js";import{a as ce,i as le,n as ue,o as de,r as C,s as fe,t as pe}from"./select-DyD7qIkJ.js";import{n as w}from"./ConfirmDialog-BfpN2MQx.js";import{t as me}from"./circle-check-jmRQz1Jq.js";import{n as he}from"./external-link-B8UFREQ_.js";import{n as T,o as E,s as D,t as O}from"./Thumbnail-cjA7fSWh.js";import{t as k}from"./search-CcJQqtRw.js";import{m as A}from"./dropdown-menu-DPzDthV7.js";import{t as j}from"./rotate-ccw-DCWwb4Ga.js";import{a as M,i as N,n as P,o as F,r as I,s as L,t as R}from"./table-DQ5ILlSh.js";import{t as ge}from"./useSearchInput-1fDoEtXe.js";import{t as _e}from"./constants-DCtq_UOe.js";import{t as ve}from"./Panel-ClY9b33D.js";var z={name:`images`,size:24,node:[[`path`,{d:`m22 11-1.296-1.296a2.4 2.4 0 0 0-3.408 0L11 16`,key:`9kzy35`}],[`path`,{d:`M4 8a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2`,key:`1t0f0t`}],[`circle`,{cx:`13`,cy:`7`,r:`1`,fill:`currentColor`,key:`1obus6`}],[`rect`,{x:`8`,y:`2`,width:`14`,height:`14`,rx:`2`,key:`1gvhby`}]]};z.node;var B=s(z),V={name:`layout-grid`,size:24,node:[[`rect`,{width:`7`,height:`7`,x:`3`,y:`3`,rx:`1`,key:`1g98yp`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`3`,rx:`1`,key:`6d4xhi`}],[`rect`,{width:`7`,height:`7`,x:`14`,y:`14`,rx:`1`,key:`nxv5o0`}],[`rect`,{width:`7`,height:`7`,x:`3`,y:`14`,rx:`1`,key:`1bb6yr`}]]};V.node;var H=s(V),U={name:`upload`,size:24,node:[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]};U.node;var W=s(U),G=e(t(),1),ye=(e,t,n)=>{let r=t===void 0?-1:e.indexOf(t),i=e.indexOf(n);if(r!==-1&&i!==-1)return e.slice(Math.min(r,i),Math.max(r,i)+1)},K=(e,t)=>{let n=(0,G.useRef)(void 0);return{select:({id:r,checked:i,shiftKey:a})=>{let o=a?ye(e,n.current,r):void 0;if(o)for(let e of o)t(e,!0);else t(r,i);n.current=r}}},q=e(n(),1),be=({asset:e,selected:t,selectable:n,active:r,onSelect:i,onOpen:a})=>{let{t:o}=c(),s=E[e.status];return(0,q.jsxs)(`li`,{className:p(`group relative overflow-hidden rounded-xl border bg-card transition-shadow focus-within:ring-[3px] focus-within:ring-ring/50 hover:border-input`,(t||r)&&`border-primary ring-2 ring-primary hover:border-primary`),children:[(0,q.jsxs)(`button`,{type:`button`,onClick:e=>{if(e.shiftKey&&n){i(!t,!0);return}a()},className:`flex w-full flex-col text-left outline-none`,"aria-label":o(`media.openDetails`,{name:e.filename}),children:[(0,q.jsx)(O,{asset:e,className:`aspect-square w-full border-b`}),(0,q.jsxs)(`span`,{className:`flex min-w-0 flex-col gap-0.5 px-3 py-2.5`,children:[(0,q.jsx)(`span`,{className:`truncate text-sm font-medium`,title:e.filename,children:e.filename}),(0,q.jsxs)(`span`,{className:`flex min-w-0 items-center gap-1.5 text-meta text-muted-foreground`,children:[(0,q.jsxs)(`span`,{className:`truncate`,children:[T(e.filename,e.mimeType),` · `,D(e.sizeBytes)]}),e.visibility===`private`?(0,q.jsx)(m,{"aria-hidden":`true`,className:`size-3.5 shrink-0`}):null]})]})]}),e.status===`ready`?null:(0,q.jsx)(h,{tone:s.tone,label:o(s.labelKey),size:`sm`,className:`pointer-events-none absolute top-2 right-2`}),n?(0,q.jsx)(w,{checked:t,onClick:e=>{e.shiftKey&&(e.preventDefault(),i(!t,!0))},onCheckedChange:e=>i(e===!0,!1),"aria-label":o(`media.select`,{name:e.filename}),className:`absolute top-2 left-2 bg-card`}):null]})},xe=({assets:e,selected:t,selectable:n,activeId:r,onSelectChange:i,onOpen:a})=>{let{t:o}=c(),s=K(e.map(e=>e.id),i);return(0,q.jsx)(`ul`,{"aria-label":o(`media.assetsLabel`,{count:e.length}),className:`grid grid-cols-[repeat(auto-fill,minmax(160px,1fr))] gap-4`,children:e.map(e=>(0,q.jsx)(be,{asset:e,selected:t.has(e.id),selectable:n,active:e.id===r,onSelect:(t,n)=>s.select({id:e.id,checked:t,shiftKey:n}),onOpen:()=>a(e)},e.id))})},Se=({assets:e,selected:t,selectable:n,onSelectChange:r,onOpen:i})=>{let{t:a}=c(),o=K(e.map(e=>e.id),r);return(0,q.jsx)(L,{children:(0,q.jsxs)(R,{children:[(0,q.jsx)(M,{children:(0,q.jsxs)(F,{children:[n?(0,q.jsx)(N,{className:`w-10`,children:(0,q.jsx)(`span`,{className:`sr-only`,children:a(`media.selection`)})}):null,(0,q.jsx)(N,{children:a(`media.fields.filename`)}),(0,q.jsx)(N,{children:a(`media.fields.type`)}),(0,q.jsx)(N,{className:`text-right`,children:a(`media.fields.size`)}),(0,q.jsx)(N,{children:a(`media.fields.status`)}),(0,q.jsx)(N,{children:a(`media.fields.uploaded`)})]})}),(0,q.jsx)(P,{children:e.map(e=>{let r=E[e.status],s=t.has(e.id);return(0,q.jsxs)(F,{"data-state":s?`selected`:void 0,children:[n?(0,q.jsx)(I,{children:(0,q.jsx)(w,{checked:s,onClick:t=>{t.shiftKey&&(t.preventDefault(),o.select({id:e.id,checked:!s,shiftKey:!0}))},onCheckedChange:t=>o.select({id:e.id,checked:t===!0,shiftKey:!1}),"aria-label":a(`media.select`,{name:e.filename})})}):null,(0,q.jsx)(I,{className:`max-w-96`,children:(0,q.jsxs)(`span`,{className:`flex min-w-0 items-center gap-3`,children:[(0,q.jsx)(O,{asset:e,className:`size-8 shrink-0 rounded-md`}),(0,q.jsx)(v,{asChild:!0,className:`min-w-0 truncate text-left`,children:(0,q.jsx)(`button`,{type:`button`,onClick:()=>i(e),children:e.filename})}),e.visibility===`private`?(0,q.jsx)(m,{role:`img`,"aria-label":a(`media.visibility.private`),className:`size-3.5 shrink-0 text-muted-foreground`}):null]})}),(0,q.jsx)(I,{className:`text-muted-foreground`,title:e.mimeType,children:T(e.filename,e.mimeType)}),(0,q.jsx)(I,{className:`text-right tabular-nums`,children:D(e.sizeBytes)}),(0,q.jsx)(I,{children:(0,q.jsx)(h,{tone:r.tone,label:a(r.labelKey),size:`sm`})}),(0,q.jsx)(I,{className:`whitespace-nowrap`,title:_(e.createdAt),children:g(e.createdAt)})]},e.id)})})]})})},Ce=({query:e,filtered:t,view:n,selected:r,selectable:i,activeId:a,onSelectChange:o,onOpen:s})=>{let{t:l}=c(),u=te(e);if(u.isPending)return(0,q.jsx)(ae,{rows:4});if(u.isError)return(0,q.jsx)(ie,{error:u.error,onRetry:()=>void u.refetch()});let d=u.data.pages.flatMap(e=>e.items);if(d.length===0){let n=t||e.folder!==void 0;return(0,q.jsx)(re,{icon:B,size:n?`panel`:`page`,title:l(t?`media.emptyFiltered`:n?`media.emptyFolder`:`media.empty`)})}return(0,q.jsxs)(`div`,{className:`space-y-4`,children:[n===`grid`?(0,q.jsx)(xe,{assets:d,selected:r,selectable:i,activeId:a,onSelectChange:o,onOpen:s}):(0,q.jsx)(Se,{assets:d,selected:r,selectable:i,onSelectChange:o,onOpen:s}),u.hasNextPage?(0,q.jsx)(`div`,{className:`flex justify-center`,children:(0,q.jsx)(S,{variant:`outline`,disabled:u.isFetchingNextPage,"aria-busy":u.isFetchingNextPage||void 0,onClick:()=>void u.fetchNextPage(),children:u.isFetchingNextPage?l(`common.loading`):l(`media.loadMore`)})}):null]})},J=`all`,we={image:`media.types.image`,video:`media.types.video`,audio:`media.types.audio`,pdf:`media.types.pdf`},Y=({query:e,type:t,view:n,onQueryChange:r,onTypeChange:i,onViewChange:a})=>{let{t:o}=c(),{text:s,setText:l}=ge(e,r);return(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,q.jsxs)(`div`,{className:`relative min-w-48 flex-1`,children:[(0,q.jsx)(k,{"aria-hidden":`true`,className:`absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-muted-foreground`}),(0,q.jsx)(se,{type:`search`,value:s,onChange:e=>l(e.target.value),"aria-label":o(`media.search`),placeholder:o(`media.searchPlaceholder`),inputSize:`sm`,className:`pl-8`})]}),(0,q.jsxs)(pe,{value:t??J,onValueChange:e=>i(e===J?void 0:e),children:[(0,q.jsx)(le,{size:`sm`,"aria-label":o(`media.typeFilter`),className:`w-36`,children:(0,q.jsx)(ce,{})}),(0,q.jsxs)(ue,{children:[(0,q.jsx)(C,{value:J,children:o(`media.types.all`)}),_e.map(e=>(0,q.jsx)(C,{value:e,children:o(we[e])},e))]})]}),(0,q.jsxs)(`div`,{role:`group`,"aria-label":o(`media.view`),className:`flex h-9 items-center gap-0.5 rounded-lg border border-input px-px`,children:[(0,q.jsx)(S,{variant:n===`grid`?`secondary`:`ghost`,size:`icon-sm`,"aria-pressed":n===`grid`,"aria-label":o(`media.viewGrid`),onClick:()=>a(`grid`),children:(0,q.jsx)(H,{"aria-hidden":`true`})}),(0,q.jsx)(S,{variant:n===`list`?`secondary`:`ghost`,size:`icon-sm`,"aria-pressed":n===`list`,"aria-label":o(`media.viewList`),onClick:()=>a(`list`),children:(0,q.jsx)(A,{"aria-hidden":`true`})})]})]})},Te=({label:e,multiple:t=!0,onFiles:n,...r})=>{let i=(0,G.useRef)(null);return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(S,{...r,onClick:()=>i.current?.click(),children:[(0,q.jsx)(W,{"aria-hidden":`true`}),e]}),(0,q.jsx)(`input`,{ref:i,type:`file`,multiple:t,tabIndex:-1,"aria-hidden":`true`,className:`sr-only`,onChange:e=>{let t=[...e.target.files??[]];e.target.value=``,t.length>0&&n(t)}})]})},X=u()(e=>({items:[],add:t=>e(e=>({items:[...e.items,t]})),update:(t,n)=>e(e=>({items:e.items.map(e=>e.id===t?{...e,...n}:e)})),remove:t=>e(e=>({items:e.items.filter(e=>e.id!==t)})),clearFinished:()=>e(e=>({items:e.items.filter(e=>e.status!==`done`)}))})),Z=class extends Error{status;body;constructor(e,t){super(`Upload failed with status ${e}`),this.name=`UploadTransferError`,this.status=e,this.body=t}},Ee=({url:e,form:t,onProgress:n,signal:r})=>new Promise((i,a)=>{let o=new XMLHttpRequest;o.open(`POST`,e),o.withCredentials=!1,o.upload.onprogress=e=>{e.lengthComputable&&e.total>0&&n(e.loaded/e.total)},o.onload=()=>{if(o.status>=200&&o.status<300){n(1),i();return}a(new Z(o.status,o.responseText))},o.onerror=()=>a(new Z(0,``)),o.onabort=()=>a(new DOMException(`Upload cancelled`,`AbortError`)),r?.addEventListener(`abort`,()=>o.abort(),{once:!0}),o.send(t)}),De=e=>e instanceof Z?e.status===0?x.t(`media.upload.unreachable`):e.status===413||/EntityTooLarge/.test(e.body)?x.t(`errors.codes.FILE_TOO_LARGE`):x.t(`media.upload.transferFailed`,{status:e.status}):oe(e),Q=100,Oe=({item:e,onRetry:t,onDismiss:n})=>{let{t:r}=c(),i=Math.round(e.progress*Q),a=e.status===`uploading`?r(`media.upload.uploading`,{percent:i}):e.status===`confirming`?r(`media.upload.checking`):e.status===`done`?r(`media.upload.done`):De(e.error);return(0,q.jsxs)(`li`,{className:`flex items-start gap-3 px-5 py-2.5`,children:[(0,q.jsx)(`span`,{className:`mt-0.5 shrink-0`,children:e.status===`done`?(0,q.jsx)(me,{"aria-hidden":`true`,className:`size-4 text-success`}):e.status===`failed`?(0,q.jsx)(he,{"aria-hidden":`true`,className:`size-4 text-destructive`}):(0,q.jsx)(d,{"aria-hidden":`true`,className:`size-4 animate-spin text-muted-foreground motion-reduce:animate-none`})}),(0,q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[(0,q.jsxs)(`p`,{className:`flex items-baseline gap-2 text-sm`,children:[(0,q.jsx)(`span`,{className:`truncate font-medium`,children:e.file.name}),(0,q.jsx)(`span`,{className:`shrink-0 text-meta text-muted-foreground`,children:D(e.file.size)})]}),e.status===`uploading`||e.status===`confirming`?(0,q.jsx)(`div`,{role:`progressbar`,"aria-label":r(`media.upload.progress`,{name:e.file.name}),"aria-valuemin":0,"aria-valuemax":Q,"aria-valuenow":i,className:`h-1.5 overflow-hidden rounded-full bg-muted`,style:{"--upload-progress":`${i}%`},children:(0,q.jsx)(`div`,{className:`h-full w-[var(--upload-progress)] bg-primary transition-[width]`})}):null,(0,q.jsx)(`p`,{className:p(`text-meta`,e.status===`failed`?`text-destructive`:`text-muted-foreground`),children:a})]}),e.status===`failed`?(0,q.jsx)(S,{variant:`ghost`,size:`icon-sm`,"aria-label":r(`media.upload.retry`,{name:e.file.name}),onClick:t,children:(0,q.jsx)(j,{"aria-hidden":`true`})}):null,e.status===`failed`||e.status===`done`?(0,q.jsx)(S,{variant:`ghost`,size:`icon-sm`,"aria-label":r(`media.upload.dismiss`,{name:e.file.name}),onClick:n,children:(0,q.jsx)(ne,{"aria-hidden":`true`})}):null]})},ke=({onRetry:e,onDismiss:t})=>{let{t:n}=c(),r=X(e=>e.items),i=X(e=>e.clearFinished),[a,o]=(0,G.useState)(!1);if(r.length===0)return null;let s=r.filter(e=>e.status===`uploading`||e.status===`confirming`).length,l=r.filter(e=>e.status===`failed`).length,u=r.length-s-l,d=s===0&&l===0,f=!d||a;return(0,q.jsx)(ve,{title:n(`media.upload.queueTitle`),titleAs:`h2`,flush:f,actions:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`span`,{role:`status`,"aria-live":`polite`,className:`text-meta text-muted-foreground`,children:d?n(`media.upload.doneSummary`,{count:u}):n(`media.upload.summary`,{active:s,failed:l})}),d?(0,q.jsx)(S,{variant:`ghost`,size:`icon-sm`,"aria-expanded":f,"aria-label":n(f?`media.upload.hideFinished`:`media.upload.showFinished`),onClick:()=>o(e=>!e),children:f?(0,q.jsx)(de,{"aria-hidden":`true`}):(0,q.jsx)(fe,{"aria-hidden":`true`})}):null,u>0?(0,q.jsx)(S,{variant:`ghost`,size:`sm`,onClick:i,children:n(`media.upload.clearFinished`)}):null]}),bodyClassName:f?void 0:`hidden`,children:f?(0,q.jsx)(`ul`,{className:`max-h-64 divide-y overflow-y-auto`,children:r.map(n=>(0,q.jsx)(Oe,{item:n,onRetry:()=>e(n.id),onDismiss:()=>t(n.id)},n.id))}):null})},Ae=`application/octet-stream`,je=e=>{let t={filename:e.file.name,mimeType:e.file.type||Ae,sizeBytes:e.file.size};return f(()=>e.replaceAssetId?l.media.assets.replace(e.replaceAssetId,t):l.media.uploads.create({...t,folderId:e.folderId,visibility:e.visibility}))},$=async(e,t,n)=>{let a=await je(e);return await Ee({url:i(a,ee()),form:r(a,e.file,e.file.name),onProgress:t}),n(),f(()=>l.media.uploads.confirm(a.grantId))},Me=()=>{let e=o(),{add:t,update:n,remove:r}=X.getState(),i=(0,G.useCallback)(async t=>{n(t.id,{status:`uploading`,progress:0,error:void 0});try{let e=await $(t,e=>n(t.id,{progress:e}),()=>n(t.id,{status:`confirming`}));n(t.id,{status:`done`,assetId:e.id}),t.replaceAssetId&&y.success(x.t(`media.upload.replaced`,{name:t.file.name}))}catch(e){b(e,`uploading ${t.file.name}`),n(t.id,{status:`failed`,error:e})}finally{await e.invalidateQueries({queryKey:a.media.all})}},[e,n]);return{enqueue:(0,G.useCallback)((e,n)=>{for(let r of e){let e={id:crypto.randomUUID(),file:r,folderId:n.folderId,visibility:n.visibility,replaceAssetId:n.replaceAssetId,status:`uploading`,progress:0,error:void 0,assetId:void 0};t(e),i(e)}},[t,i]),retry:(0,G.useCallback)(e=>{let t=X.getState().items.find(t=>t.id===e);t&&i(t)},[i]),dismiss:r,uploadOne:(0,G.useCallback)(async t=>{try{let n=await $({file:t,folderId:null,visibility:`public`,replaceAssetId:void 0},()=>void 0,()=>void 0);return e.setQueryData(a.media.asset(n.id),n),{id:n.id,alt:n.alt||null}}finally{await e.invalidateQueries({queryKey:a.media.all})}},[e])}};export{Ce as a,B as c,Y as i,ke as n,W as o,Te as r,H as s,Me as t};
2
+ //# sourceMappingURL=useMediaUploader-D1ouV8jc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaUploader-D1ouV8jc.js","names":["__iconData","__iconData","useRef","useRef","_Fragment","i18next","CheckCircle2","XCircle","Loader2","useState","_Fragment","useCallback","i18next","__toESM","require_jsx_runtime","buildUploadForm","resolveUploadUrl","queryKeys","useQueryClient","createLucideIcon","useTranslation","create","LoaderCircle","withCsrf","cn","apiBaseUrl","useMediaAssets","Lock","X","StatusChip","EmptyState","ErrorState","LoadingState","formatRelativeTime","formatDateTime","RowTitle","toast","logError","instance","Button","describeError","Input","SelectValue","SelectTrigger","SelectContent","ChevronUp","SelectItem","ChevronDown","Select","Checkbox","CircleCheck","CircleX","fileKindLabel","MEDIA_STATUS_DISPLAY","formatBytes","Thumbnail","Search","List","RotateCcw","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","adminApi","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":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./store-BphwUzV5.js";var r=e(t(),1),i=`(max-width: 1023px)`,a=e=>{let t=window.matchMedia(i);return t.addEventListener(`change`,e),()=>t.removeEventListener(`change`,e)},o=()=>window.matchMedia(i).matches;function s(){return r.useSyncExternalStore(a,o,()=>!1)}var c=(e,t)=>{let i=(0,r.useId)(),a=n(e=>e.register),o=n(e=>e.unregister);(0,r.useEffect)(()=>(a(i,{group:e,items:t}),()=>o(i)),[i,e,t,a,o])};export{s as n,c as t};
2
- //# sourceMappingURL=usePaletteItems-62-TZhy7.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./store-jUWyOXDG.js";var r=e(t(),1),i=`(max-width: 1023px)`,a=e=>{let t=window.matchMedia(i);return t.addEventListener(`change`,e),()=>t.removeEventListener(`change`,e)},o=()=>window.matchMedia(i).matches;function s(){return r.useSyncExternalStore(a,o,()=>!1)}var c=(e,t)=>{let i=(0,r.useId)(),a=n(e=>e.register),o=n(e=>e.unregister);(0,r.useEffect)(()=>(a(i,{group:e,items:t}),()=>o(i)),[i,e,t,a,o])};export{s as n,c as t};
2
+ //# sourceMappingURL=usePaletteItems-neKzBlys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePaletteItems-62-TZhy7.js","names":["useId","__toESM","usePaletteStore","import_react","require_react","MOBILE_QUERY","subscribe","mql","onChange","getSnapshot","useIsMobile","usePaletteItems","id","register","state","unregister","group","items"],"sources":["../../src/hooks/use-mobile.ts","../../src/components/CommandPalette/hooks/usePaletteItems.ts"],"sourcesContent":["import * as React from 'react';\n\n// Shapio: the sidebar becomes a sheet below lg (DESIGN.md), not md.\nconst MOBILE_BREAKPOINT = 1024;\nconst MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT - 1}px)`;\n\n// Shapio: subscribes with useSyncExternalStore instead of setState in an effect (shadcn's original).\nconst subscribe = (onChange: () => void) => {\n const mql = window.matchMedia(MOBILE_QUERY);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n};\n\nconst getSnapshot = () => window.matchMedia(MOBILE_QUERY).matches;\n\nexport function useIsMobile() {\n return React.useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n","import { useEffect, useId } from 'react';\nimport { usePaletteStore } from '../store';\nimport type { PaletteItem, RegisteredGroup } from '../types';\n\n/**\n * Offers `items` in the palette while the calling component is mounted. Pass a memoized array: a new\n * array re-registers.\n */\nexport const usePaletteItems = (group: RegisteredGroup, items: readonly PaletteItem[]) => {\n const id = useId();\n const register = usePaletteStore((state) => state.register);\n const unregister = usePaletteStore((state) => state.unregister);\n useEffect(() => {\n register(id, { group, items });\n return () => unregister(id);\n }, [id, group, items, register, unregister]);\n};\n"],"mappings":"6IAIMK,EAAe,sBAGfC,EAAa,GAAyB,CAC1C,IAAMC,EAAM,OAAO,WAAWF,CAAY,EAE1C,OADAE,EAAI,iBAAiB,SAAUC,CAAQ,MAC1BD,EAAI,oBAAoB,SAAUC,CAAQ,CACzD,EAEMC,MAAoB,OAAO,WAAWJ,CAAY,CAAC,CAAC,QAE1D,SAAgBK,GAAc,CAC5B,OAAAP,EAAa,qBAAqBG,EAAWG,MAAmB,EAAK,CACvE,CCTA,IAAaE,GAAmB,EAAwB,IAAkC,CACxF,IAAMC,GAAA,EAAKZ,EAAAA,MAAAA,CAAM,EACXa,EAAWX,EAAiB,GAAUY,EAAM,QAAQ,EACpDC,EAAab,EAAiB,GAAUY,EAAM,UAAU,GAC9D,EAAAX,EAAA,UAAA,MACEU,EAASD,EAAI,CAAE,QAAO,OAAM,CAAC,MAChBG,EAAWH,CAAE,GACzB,CAACA,EAAII,EAAOC,EAAOJ,EAAUE,CAAU,CAAC,CAC7C"}
1
+ {"version":3,"file":"usePaletteItems-neKzBlys.js","names":["useId","__toESM","usePaletteStore","import_react","require_react","MOBILE_QUERY","subscribe","mql","onChange","getSnapshot","useIsMobile","usePaletteItems","id","register","state","unregister","group","items"],"sources":["../../src/hooks/use-mobile.ts","../../src/components/CommandPalette/hooks/usePaletteItems.ts"],"sourcesContent":["import * as React from 'react';\n\n// Shapio: the sidebar becomes a sheet below lg (DESIGN.md), not md.\nconst MOBILE_BREAKPOINT = 1024;\nconst MOBILE_QUERY = `(max-width: ${MOBILE_BREAKPOINT - 1}px)`;\n\n// Shapio: subscribes with useSyncExternalStore instead of setState in an effect (shadcn's original).\nconst subscribe = (onChange: () => void) => {\n const mql = window.matchMedia(MOBILE_QUERY);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n};\n\nconst getSnapshot = () => window.matchMedia(MOBILE_QUERY).matches;\n\nexport function useIsMobile() {\n return React.useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n","import { useEffect, useId } from 'react';\nimport { usePaletteStore } from '../store';\nimport type { PaletteItem, RegisteredGroup } from '../types';\n\n/**\n * Offers `items` in the palette while the calling component is mounted. Pass a memoized array: a new\n * array re-registers.\n */\nexport const usePaletteItems = (group: RegisteredGroup, items: readonly PaletteItem[]) => {\n const id = useId();\n const register = usePaletteStore((state) => state.register);\n const unregister = usePaletteStore((state) => state.unregister);\n useEffect(() => {\n register(id, { group, items });\n return () => unregister(id);\n }, [id, group, items, register, unregister]);\n};\n"],"mappings":"6IAIMK,EAAe,sBAGfC,EAAa,GAAyB,CAC1C,IAAMC,EAAM,OAAO,WAAWF,CAAY,EAE1C,OADAE,EAAI,iBAAiB,SAAUC,CAAQ,MAC1BD,EAAI,oBAAoB,SAAUC,CAAQ,CACzD,EAEMC,MAAoB,OAAO,WAAWJ,CAAY,CAAC,CAAC,QAE1D,SAAgBK,GAAc,CAC5B,OAAAP,EAAa,qBAAqBG,EAAWG,MAAmB,EAAK,CACvE,CCTA,IAAaE,GAAmB,EAAwB,IAAkC,CACxF,IAAMC,GAAA,EAAKZ,EAAAA,MAAAA,CAAM,EACXa,EAAWX,EAAiB,GAAUY,EAAM,QAAQ,EACpDC,EAAab,EAAiB,GAAUY,EAAM,UAAU,GAC9D,EAAAX,EAAA,UAAA,MACEU,EAASD,EAAI,CAAE,QAAO,OAAM,CAAC,MAChBG,EAAWH,CAAE,GACzB,CAACA,EAAII,EAAOC,EAAOJ,EAAUE,CAAU,CAAC,CAC7C"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{P as n,bt as r,i}from"./cn-BQ3voEft.js";import{u as a}from"./auth-pcS9CCXu.js";import{s as o}from"./schema-B4smPFcR.js";import{t as s}from"./modelPermissions-DZ1lWfQZ.js";import{t as c}from"./contentCounts-Ch3uMXVU.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=i(l),d=e(t(),1),f=e=>{let t=r(),{data:i,isFetching:o}=a(),s=(0,d.useRef)(new Set);(0,d.useEffect)(()=>{if(!i||!e||o)return;let r=e.map(({definition:e})=>e.id).filter(e=>!(e in i.modelPermissions)&&!s.current.has(e));if(r.length>0){for(let e of r)s.current.add(e);t.invalidateQueries({queryKey:n.me})}},[e,i,o,t])},p={collection:0,singleton:1},m=()=>{let{data:e}=a(),{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-CY6f2DmI.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{P as n,bt as r,i}from"./cn-CL1YHRrS.js";import{u as a}from"./auth-YVfK3SxF.js";import{s as o}from"./schema-B7L9OJrX.js";import{t as s}from"./modelPermissions-DZ1lWfQZ.js";import{t as c}from"./contentCounts-DzIvdeXR.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=i(l),d=e(t(),1),f=e=>{let t=r(),{data:i,isFetching:o}=a(),s=(0,d.useRef)(new Set);(0,d.useEffect)(()=>{if(!i||!e||o)return;let r=e.map(({definition:e})=>e.id).filter(e=>!(e in i.modelPermissions)&&!s.current.has(e));if(r.length>0){for(let e of r)s.current.add(e);t.invalidateQueries({queryKey:n.me})}},[e,i,o,t])},p={collection:0,singleton:1},m=()=>{let{data:e}=a(),{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-6iTN15Xy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePlaces-CY6f2DmI.js","names":["useRef","useMemo","__toESM","queryKeys","useQueryClient","useMe","useDefinitions","canOnModel","useContentCounts","__iconData","FilePlusCorner","createLucideIcon","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":"wTASA,IAAMS,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,EAAiBC,EAAiBF,CAAU,aCjBrCK,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,GAAgBZ,EAAe,OAAO,EAC9CmB,EAASjB,EAAiB,EAEhC,OADAM,EAA2BI,CAAW,GACtC,EAAOjB,EAAAA,QAAAA,KAEHiB,GACI,SAAS,CAAE,aAAY,WACvBG,EAAW,OAAS,aAAed,EAAWS,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,UAAWd,EAAWS,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
+ {"version":3,"file":"usePlaces-6iTN15Xy.js","names":["useRef","useMemo","__toESM","queryKeys","useQueryClient","useMe","useDefinitions","canOnModel","useContentCounts","__iconData","FilePlusCorner","createLucideIcon","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":"wTASA,IAAMS,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,EAAiBC,EAAiBF,CAAU,aCjBrCK,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,GAAgBZ,EAAe,OAAO,EAC9CmB,EAASjB,EAAiB,EAEhC,OADAM,EAA2BI,CAAW,GACtC,EAAOjB,EAAAA,QAAAA,KAEHiB,GACI,SAAS,CAAE,aAAY,WACvBG,EAAW,OAAS,aAAed,EAAWS,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,UAAWd,EAAWS,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 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{$ as n,G as r,J as i,K as a,W as o,X as s,Y as c,Z as l,_t as u,bt as d,ht as f,it as p,ot as m,pt as h,q as g}from"./cn-BQ3voEft.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-BuKJBA0M.js.map
1
+ import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{$ as n,G as r,J as i,K as a,W as o,X as s,Y as c,Z as l,_t as u,bt as d,ht as f,it as p,ot as m,pt as h,q as g}from"./cn-CL1YHRrS.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-CYfcxI0Q.js.map