@shapio/cms 0.5.8 → 0.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/assets/{AssetTile-BrMzsUZD.js → AssetTile-DecaDqjj.js} +2 -2
- package/dist/admin/assets/{AssetTile-BrMzsUZD.js.map → AssetTile-DecaDqjj.js.map} +1 -1
- package/dist/admin/assets/AssistError-rslPtgWB.js +2 -0
- package/dist/admin/assets/{AssistError-Cs-r9Ssc.js.map → AssistError-rslPtgWB.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js → BlockMenuItems-JHFue7Qt.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js.map → BlockMenuItems-JHFue7Qt.js.map} +1 -1
- package/dist/admin/assets/Body-7NgJl9Pi.js +2 -0
- package/dist/admin/assets/Body-7NgJl9Pi.js.map +1 -0
- package/dist/admin/assets/Builder-DmlYcgiP.js +2 -0
- package/dist/admin/assets/Builder-DmlYcgiP.js.map +1 -0
- package/dist/admin/assets/{CodeEditor-CBCR73Wd.js → CodeEditor-Dv1FtkvI.js} +2 -2
- package/dist/admin/assets/{CodeEditor-CBCR73Wd.js.map → CodeEditor-Dv1FtkvI.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-CxFsBHfF.js → CopyButton-Brnpfqe0.js} +2 -2
- package/dist/admin/assets/{CopyButton-CxFsBHfF.js.map → CopyButton-Brnpfqe0.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-BW2U3v6l.js → CursorPager-C7cAK5Qe.js} +2 -2
- package/dist/admin/assets/{CursorPager-BW2U3v6l.js.map → CursorPager-C7cAK5Qe.js.map} +1 -1
- package/dist/admin/assets/{ExternalLink-BITMgS1K.js → ExternalLink-D80sb5Jj.js} +2 -2
- package/dist/admin/assets/{ExternalLink-BITMgS1K.js.map → ExternalLink-D80sb5Jj.js.map} +1 -1
- package/dist/admin/assets/{FocalPoint-CpZTve1E.js → FocalPoint-Bhtb1gUa.js} +2 -2
- package/dist/admin/assets/{FocalPoint-CpZTve1E.js.map → FocalPoint-Bhtb1gUa.js.map} +1 -1
- package/dist/admin/assets/Form-Cf1ephPH.js +2 -0
- package/dist/admin/assets/Form-Cf1ephPH.js.map +1 -0
- package/dist/admin/assets/FormCheckboxGroup-BzVZFR3W.js +2 -0
- package/dist/admin/assets/FormCheckboxGroup-BzVZFR3W.js.map +1 -0
- package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js → FormRadioGroup-BzmLzRnI.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js.map → FormRadioGroup-BzmLzRnI.js.map} +1 -1
- package/dist/admin/assets/FormSelectField-Cl7EjXc3.js +2 -0
- package/dist/admin/assets/FormSelectField-Cl7EjXc3.js.map +1 -0
- package/dist/admin/assets/FormSheet-CLZpd_7B.js +2 -0
- package/dist/admin/assets/FormSheet-CLZpd_7B.js.map +1 -0
- package/dist/admin/assets/{FormSwitchField-BLOh7qei.js → FormSwitchField-BbqQ3tx_.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-BLOh7qei.js.map → FormSwitchField-BbqQ3tx_.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-CO115n_u.js → FormTextareaField-9RN5Pt3B.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-CO115n_u.js.map → FormTextareaField-9RN5Pt3B.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-DzHnEdIK.js → HintedLabel-D9IVF0EE.js} +2 -2
- package/dist/admin/assets/{HintedLabel-DzHnEdIK.js.map → HintedLabel-D9IVF0EE.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-CSEtcHjL.js → InfoHint-tlSeZB9U.js} +2 -2
- package/dist/admin/assets/{InfoHint-CSEtcHjL.js.map → InfoHint-tlSeZB9U.js.map} +1 -1
- package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js → InlineConfirm-Kj9AOIFO.js} +2 -2
- package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js.map → InlineConfirm-Kj9AOIFO.js.map} +1 -1
- package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js → InsertMenuItem-CHAp2tH7.js} +2 -2
- package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js.map → InsertMenuItem-CHAp2tH7.js.map} +1 -1
- package/dist/admin/assets/{LinkTabs-8SmS1vCd.js → LinkTabs-oQXsy1I3.js} +2 -2
- package/dist/admin/assets/{LinkTabs-8SmS1vCd.js.map → LinkTabs-oQXsy1I3.js.map} +1 -1
- package/dist/admin/assets/{Match-CcD9KxHH.js → Match-BfNRwPfR.js} +2 -2
- package/dist/admin/assets/{Match-CcD9KxHH.js.map → Match-BfNRwPfR.js.map} +1 -1
- package/dist/admin/assets/{NoAccess-C8RLPN0I.js → NoAccess-DnEpYj9l.js} +2 -2
- package/dist/admin/assets/{NoAccess-C8RLPN0I.js.map → NoAccess-DnEpYj9l.js.map} +1 -1
- package/dist/admin/assets/Panel-Bcl09TtM.js.map +1 -1
- package/dist/admin/assets/{QueryView-xMP_uJ_t.js → QueryView-B86NcRt5.js} +2 -2
- package/dist/admin/assets/{QueryView-xMP_uJ_t.js.map → QueryView-B86NcRt5.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-DQFmni5A.js → RadioTile-Bwd2Pmlk.js} +2 -2
- package/dist/admin/assets/RadioTile-Bwd2Pmlk.js.map +1 -0
- package/dist/admin/assets/{RichTextField-CVHRIbnu.js → RichTextField-Dou79MHF.js} +4 -4
- package/dist/admin/assets/RichTextField-Dou79MHF.js.map +1 -0
- package/dist/admin/assets/{RowTitle-Bqt6evG9.js → RowTitle-DH9OZs3g.js} +2 -2
- package/dist/admin/assets/{RowTitle-Bqt6evG9.js.map → RowTitle-DH9OZs3g.js.map} +1 -1
- package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js → SecretReveal-D95oACLj.js} +2 -2
- package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js.map → SecretReveal-D95oACLj.js.map} +1 -1
- package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js → SharedGlyph-Chwb1EIS.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js.map → SharedGlyph-Chwb1EIS.js.map} +1 -1
- package/dist/admin/assets/StepList-D9iHsUZJ.js +2 -0
- package/dist/admin/assets/StepList-D9iHsUZJ.js.map +1 -0
- package/dist/admin/assets/Structure-CewJL1b3.js +2 -0
- package/dist/admin/assets/{Structure-D8csgrIt.js.map → Structure-CewJL1b3.js.map} +1 -1
- package/dist/admin/assets/{SubNavLink-CiCaVV8U.js → SubNavLink-7Cs1LqMv.js} +2 -2
- package/dist/admin/assets/SubNavLink-7Cs1LqMv.js.map +1 -0
- package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js → SuggestAltButton-BK1uo4yC.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js.map → SuggestAltButton-BK1uo4yC.js.map} +1 -1
- package/dist/admin/assets/{TextLink-HRn66VL1.js → TextLink-Dfs5wsc5.js} +2 -2
- package/dist/admin/assets/{TextLink-HRn66VL1.js.map → TextLink-Dfs5wsc5.js.map} +1 -1
- package/dist/admin/assets/{Thumbnail-DNj5TRBI.js → Thumbnail-C2A_Ub77.js} +2 -2
- package/dist/admin/assets/{Thumbnail-DNj5TRBI.js.map → Thumbnail-C2A_Ub77.js.map} +1 -1
- package/dist/admin/assets/Trans-CPoNNUK1.js +2 -0
- package/dist/admin/assets/Trans-CPoNNUK1.js.map +1 -0
- package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js → UnsavedChangesGuard-BsEyn9oH.js} +2 -2
- package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js.map → UnsavedChangesGuard-BsEyn9oH.js.map} +1 -1
- package/dist/admin/assets/{UserAvatar-p-jV-LoD.js → UserAvatar-CgGKOFfP.js} +2 -2
- package/dist/admin/assets/{UserAvatar-p-jV-LoD.js.map → UserAvatar-CgGKOFfP.js.map} +1 -1
- package/dist/admin/assets/auth-BFSvtV59.js +2 -0
- package/dist/admin/assets/{auth-CQO4MBUj.js.map → auth-BFSvtV59.js.map} +1 -1
- package/dist/admin/assets/{badge-CqKF1pwz.js → badge-DGqA_yr_.js} +2 -2
- package/dist/admin/assets/{badge-CqKF1pwz.js.map → badge-DGqA_yr_.js.map} +1 -1
- package/dist/admin/assets/baseExtensions-TVKN1UwW.js.map +1 -1
- package/dist/admin/assets/{boxes-CAygw8zF.js → boxes-_5klpWNM.js} +2 -2
- package/dist/admin/assets/{boxes-CAygw8zF.js.map → boxes-_5klpWNM.js.map} +1 -1
- package/dist/admin/assets/{calendar-clock-BZGtAvWR.js → calendar-clock-VXok22Xj.js} +2 -2
- package/dist/admin/assets/{calendar-clock-BZGtAvWR.js.map → calendar-clock-VXok22Xj.js.map} +1 -1
- package/dist/admin/assets/changeSets-B6HxCJ4A.js +2 -0
- package/dist/admin/assets/{changeSets-8EburmT0.js.map → changeSets-B6HxCJ4A.js.map} +1 -1
- package/dist/admin/assets/chevron-left-CkRxDtvO.js +2 -0
- package/dist/admin/assets/{chevron-left-DGU3HGYG.js.map → chevron-left-CkRxDtvO.js.map} +1 -1
- package/dist/admin/assets/{circle-check-C37MSJqX.js → circle-check-DtDq7QMo.js} +2 -2
- package/dist/admin/assets/{circle-check-C37MSJqX.js.map → circle-check-DtDq7QMo.js.map} +1 -1
- package/dist/admin/assets/{clock-2arjsgZ4.js → clock-BtvZR9KD.js} +2 -2
- package/dist/admin/assets/{clock-2arjsgZ4.js.map → clock-BtvZR9KD.js.map} +1 -1
- package/dist/admin/assets/cn-DVhJ55Mo.js.map +1 -1
- package/dist/admin/assets/{constants-a_15vqOh.js → constants-DY3YJAKH.js} +2 -2
- package/dist/admin/assets/{constants-a_15vqOh.js.map → constants-DY3YJAKH.js.map} +1 -1
- package/dist/admin/assets/content-BNZF26Ve.js +3 -0
- package/dist/admin/assets/content-BNZF26Ve.js.map +1 -0
- package/dist/admin/assets/{contentCounts-DP7YYeZZ.js → contentCounts-BzC7IQqP.js} +2 -2
- package/dist/admin/assets/{contentCounts-DP7YYeZZ.js.map → contentCounts-BzC7IQqP.js.map} +1 -1
- package/dist/admin/assets/{contentTypes-84uc0bjR.js → contentTypes-Bz2xpqGf.js} +2 -2
- package/dist/admin/assets/{contentTypes-84uc0bjR.js.map → contentTypes-Bz2xpqGf.js.map} +1 -1
- package/dist/admin/assets/{context-IKYdzQJ-.js → context-CEVKblBl.js} +2 -2
- package/dist/admin/assets/{context-IKYdzQJ-.js.map → context-CEVKblBl.js.map} +1 -1
- package/dist/admin/assets/{copy-CsSRHgKZ.js → copy-B7vIq8DS.js} +2 -2
- package/dist/admin/assets/{copy-CsSRHgKZ.js.map → copy-B7vIq8DS.js.map} +1 -1
- package/dist/admin/assets/createLucideIcon-BOsNKleB.js +2 -0
- package/dist/admin/assets/createLucideIcon-BOsNKleB.js.map +1 -0
- package/dist/admin/assets/develop-D6CtwuYj.js +11 -0
- package/dist/admin/assets/develop-D6CtwuYj.js.map +1 -0
- package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js → dropdown-menu-Bz7CLcRK.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js.map → dropdown-menu-Bz7CLcRK.js.map} +1 -1
- package/dist/admin/assets/{ellipsis-F91991on.js → ellipsis-Ci0rsbCJ.js} +2 -2
- package/dist/admin/assets/{ellipsis-F91991on.js.map → ellipsis-Ci0rsbCJ.js.map} +1 -1
- package/dist/admin/assets/{entryLink-CVB-TdIn.js → entryLink-B0hSb_dN.js} +2 -2
- package/dist/admin/assets/{entryLink-CVB-TdIn.js.map → entryLink-B0hSb_dN.js.map} +1 -1
- package/dist/admin/assets/es2015-Cv57ynE1.js +42 -0
- package/dist/admin/assets/es2015-Cv57ynE1.js.map +1 -0
- package/dist/admin/assets/{external-link-CdG6kHfA.js → external-link-Bs9YRzvY.js} +2 -2
- package/dist/admin/assets/{external-link-CdG6kHfA.js.map → external-link-Bs9YRzvY.js.map} +1 -1
- package/dist/admin/assets/{field-COOzRptX.js → field-D-xWW2E7.js} +2 -2
- package/dist/admin/assets/{field-COOzRptX.js.map → field-D-xWW2E7.js.map} +1 -1
- package/dist/admin/assets/{file-stack-28ZtO1xW.js → file-stack-X4OGmkLA.js} +2 -2
- package/dist/admin/assets/{file-stack-28ZtO1xW.js.map → file-stack-X4OGmkLA.js.map} +1 -1
- package/dist/admin/assets/{fileRoute-s7mCMYUJ.js → fileRoute-DMal-zYL.js} +2 -2
- package/dist/admin/assets/{fileRoute-s7mCMYUJ.js.map → fileRoute-DMal-zYL.js.map} +1 -1
- package/dist/admin/assets/{folder-plus-DIk0pWkP.js → folder-plus-De2GNvry.js} +2 -2
- package/dist/admin/assets/{folder-plus-DIk0pWkP.js.map → folder-plus-De2GNvry.js.map} +1 -1
- package/dist/admin/assets/followPlural-CsgeALTW.js +2 -0
- package/dist/admin/assets/followPlural-CsgeALTW.js.map +1 -0
- package/dist/admin/assets/{globe-DFr3Gd2w.js → globe-DBw84s8Z.js} +2 -2
- package/dist/admin/assets/{globe-DFr3Gd2w.js.map → globe-DBw84s8Z.js.map} +1 -1
- package/dist/admin/assets/{image-DT79QFa_.js → image-CX4mT-_R.js} +2 -2
- package/dist/admin/assets/{image-DT79QFa_.js.map → image-CX4mT-_R.js.map} +1 -1
- package/dist/admin/assets/{image-off-DFs5upyX.js → image-off-CVaH_qKf.js} +2 -2
- package/dist/admin/assets/{image-off-DFs5upyX.js.map → image-off-CVaH_qKf.js.map} +1 -1
- package/dist/admin/assets/inbox-C0PVc6UI.js +2 -0
- package/dist/admin/assets/inbox-C0PVc6UI.js.map +1 -0
- package/dist/admin/assets/{inbox-CySnQydm.js → inbox-D9SmWt5L.js} +2 -2
- package/dist/admin/assets/{inbox-CySnQydm.js.map → inbox-D9SmWt5L.js.map} +1 -1
- package/dist/admin/assets/index-BqtCXB0u.js +4 -0
- package/dist/admin/assets/index-BqtCXB0u.js.map +1 -0
- package/dist/admin/assets/index-DZsQq6fY.css +2 -0
- package/dist/admin/assets/{key-round-D36CePnN.js → key-round-C8sd9CLN.js} +2 -2
- package/dist/admin/assets/{key-round-D36CePnN.js.map → key-round-C8sd9CLN.js.map} +1 -1
- package/dist/admin/assets/{labels-DQckbLGW.js → labels-BtktCNGw.js} +2 -2
- package/dist/admin/assets/{labels-DQckbLGW.js.map → labels-BtktCNGw.js.map} +1 -1
- package/dist/admin/assets/{languages-CzbTaQv9.js → languages-DLjdz6gb.js} +2 -2
- package/dist/admin/assets/{languages-CzbTaQv9.js.map → languages-DLjdz6gb.js.map} +1 -1
- package/dist/admin/assets/{layers-BmcodiaH.js → layers-swLuw-3a.js} +2 -2
- package/dist/admin/assets/{layers-BmcodiaH.js.map → layers-swLuw-3a.js.map} +1 -1
- package/dist/admin/assets/{link-2-off-CoJNwrxm.js → link-2-off-CEsI5T8h.js} +2 -2
- package/dist/admin/assets/{link-2-off-CoJNwrxm.js.map → link-2-off-CEsI5T8h.js.map} +1 -1
- package/dist/admin/assets/{link-Pyr2Y35S.js → link-C98FG_p5.js} +2 -2
- package/dist/admin/assets/{link-Pyr2Y35S.js.map → link-C98FG_p5.js.map} +1 -1
- package/dist/admin/assets/locales-CkuC7TJ1.js +2 -0
- package/dist/admin/assets/{locales-Bg3htKo8.js.map → locales-CkuC7TJ1.js.map} +1 -1
- package/dist/admin/assets/media-CbGSd_Mw.js +2 -0
- package/dist/admin/assets/{media-BCnVhaDH.js.map → media-CbGSd_Mw.js.map} +1 -1
- package/dist/admin/assets/{media-CURizGns.js → media-CeZGDGh7.js} +2 -2
- package/dist/admin/assets/{media-CURizGns.js.map → media-CeZGDGh7.js.map} +1 -1
- package/dist/admin/assets/network-BflLSKFO.js +2 -0
- package/dist/admin/assets/network-BflLSKFO.js.map +1 -0
- package/dist/admin/assets/{plus-BoDtdLCo.js → plus-cr9ZfO6j.js} +2 -2
- package/dist/admin/assets/{plus-BoDtdLCo.js.map → plus-cr9ZfO6j.js.map} +1 -1
- package/dist/admin/assets/publishing-BkxBplUZ.js +2 -0
- package/dist/admin/assets/publishing-BkxBplUZ.js.map +1 -0
- package/dist/admin/assets/{radio-group-4ok5evXq.js → radio-group-CRuWQnuV.js} +2 -2
- package/dist/admin/assets/{radio-group-4ok5evXq.js.map → radio-group-CRuWQnuV.js.map} +1 -1
- package/dist/admin/assets/{rotate-ccw-DL6TzcZh.js → rotate-ccw-BP8Ba-mY.js} +2 -2
- package/dist/admin/assets/{rotate-ccw-DL6TzcZh.js.map → rotate-ccw-BP8Ba-mY.js.map} +1 -1
- package/dist/admin/assets/schedules-BIyBlsYZ.js +2 -0
- package/dist/admin/assets/{schedules-BmB9Y73z.js.map → schedules-BIyBlsYZ.js.map} +1 -1
- package/dist/admin/assets/schema-6eUoC8fJ.js +2 -0
- package/dist/admin/assets/schema-6eUoC8fJ.js.map +1 -0
- package/dist/admin/assets/{scroll-text-PqeZm472.js → scroll-text-B5vfi9fD.js} +2 -2
- package/dist/admin/assets/{scroll-text-PqeZm472.js.map → scroll-text-B5vfi9fD.js.map} +1 -1
- package/dist/admin/assets/{search-BdwIwOzC.js → search-wj7zbkx1.js} +2 -2
- package/dist/admin/assets/{search-BdwIwOzC.js.map → search-wj7zbkx1.js.map} +1 -1
- package/dist/admin/assets/{searchSchemas-CSScloG8.js → searchSchemas-DAnwh3I3.js} +2 -2
- package/dist/admin/assets/{searchSchemas-CSScloG8.js.map → searchSchemas-DAnwh3I3.js.map} +1 -1
- package/dist/admin/assets/{sections-DqBzSKMP.js → sections-CWL-XD6m.js} +2 -2
- package/dist/admin/assets/sections-CWL-XD6m.js.map +1 -0
- package/dist/admin/assets/{sections-BTS683ur.js → sections-DBQpB0uv.js} +2 -2
- package/dist/admin/assets/{sections-BTS683ur.js.map → sections-DBQpB0uv.js.map} +1 -1
- package/dist/admin/assets/{select-C0USI-Ox.js → select-DVrPV1b3.js} +2 -2
- package/dist/admin/assets/{select-C0USI-Ox.js.map → select-DVrPV1b3.js.map} +1 -1
- package/dist/admin/assets/{send-XPWo3m4u.js → send-CzFdgUc_.js} +2 -2
- package/dist/admin/assets/{send-XPWo3m4u.js.map → send-CzFdgUc_.js.map} +1 -1
- package/dist/admin/assets/seo-Bd0sWQMo.js +2 -0
- package/dist/admin/assets/{seo-CceGYTIX.js.map → seo-Bd0sWQMo.js.map} +1 -1
- package/dist/admin/assets/settings-CqnrPmzR.js +2 -0
- package/dist/admin/assets/{settings-B60vHpZd.js.map → settings-CqnrPmzR.js.map} +1 -1
- package/dist/admin/assets/shapes-ZAkMBB-Z.js +6 -0
- package/dist/admin/assets/shapes-ZAkMBB-Z.js.map +1 -0
- package/dist/admin/assets/{skeleton-B5MP72Kw.js → skeleton-CiX26LnL.js} +2 -2
- package/dist/admin/assets/{skeleton-B5MP72Kw.js.map → skeleton-CiX26LnL.js.map} +1 -1
- package/dist/admin/assets/{snapshots-DUI2t-qF.js → snapshots-DbFQNJgN.js} +2 -2
- package/dist/admin/assets/{snapshots-DUI2t-qF.js.map → snapshots-DbFQNJgN.js.map} +1 -1
- package/dist/admin/assets/{sparkles-CvT-jxrW.js → sparkles-D_kmZJVd.js} +2 -2
- package/dist/admin/assets/{sparkles-CvT-jxrW.js.map → sparkles-D_kmZJVd.js.map} +1 -1
- package/dist/admin/assets/src-CMor9izq.js +7 -0
- package/dist/admin/assets/src-CMor9izq.js.map +1 -0
- package/dist/admin/assets/{stableId-BrtQedPy.js → stableId-g1uxJGSz.js} +2 -2
- package/dist/admin/assets/{stableId-BrtQedPy.js.map → stableId-g1uxJGSz.js.map} +1 -1
- package/dist/admin/assets/{store-CdIFG90N.js → store-CznhNKEi.js} +2 -2
- package/dist/admin/assets/{store-CdIFG90N.js.map → store-CznhNKEi.js.map} +1 -1
- package/dist/admin/assets/{switch-Dp6WYNam.js → switch-CiVf05NF.js} +2 -2
- package/dist/admin/assets/{switch-Dp6WYNam.js.map → switch-CiVf05NF.js.map} +1 -1
- package/dist/admin/assets/{theme-65PB8uAu.js → theme-Cv-MfOv8.js} +2 -2
- package/dist/admin/assets/theme-Cv-MfOv8.js.map +1 -0
- package/dist/admin/assets/titles-DrQhW8z3.js +2 -0
- package/dist/admin/assets/titles-DrQhW8z3.js.map +1 -0
- package/dist/admin/assets/tokens-B1S81Epe.js +2 -0
- package/dist/admin/assets/{tokens-ixHjAkDK.js.map → tokens-B1S81Epe.js.map} +1 -1
- package/dist/admin/assets/{tooltip-BGP1DVBt.js → tooltip-Bqf3oyqC.js} +2 -2
- package/dist/admin/assets/{tooltip-BGP1DVBt.js.map → tooltip-Bqf3oyqC.js.map} +1 -1
- package/dist/admin/assets/{undo-2-BiTANHFz.js → undo-2-DpwwRQTf.js} +2 -2
- package/dist/admin/assets/{undo-2-BiTANHFz.js.map → undo-2-DpwwRQTf.js.map} +1 -1
- package/dist/admin/assets/useContentSchema-B_q1rMrG.js +2 -0
- package/dist/admin/assets/useContentSchema-B_q1rMrG.js.map +1 -0
- package/dist/admin/assets/useCursorPager-BHYqHb3M.js +2 -0
- package/dist/admin/assets/{useCursorPager-0zHjlm-7.js.map → useCursorPager-BHYqHb3M.js.map} +1 -1
- package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js → useDiscardGuard-C4QTfiU4.js} +2 -2
- package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js.map → useDiscardGuard-C4QTfiU4.js.map} +1 -1
- package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js → useMediaPickerDialog-BLrVV1Kn.js} +2 -2
- package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js.map → useMediaPickerDialog-BLrVV1Kn.js.map} +1 -1
- package/dist/admin/assets/{useMediaUploader-CBcq1ICg.js → useMediaUploader-CFy6lasO.js} +2 -2
- package/dist/admin/assets/useMediaUploader-CFy6lasO.js.map +1 -0
- package/dist/admin/assets/useModelIndex-NU-WlHQY.js +2 -0
- package/dist/admin/assets/useModelIndex-NU-WlHQY.js.map +1 -0
- package/dist/admin/assets/useNetworkPermission-DehDln-U.js +2 -0
- package/dist/admin/assets/{useNetworkPermission-Cts98h9d.js.map → useNetworkPermission-DehDln-U.js.map} +1 -1
- package/dist/admin/assets/{usePaletteItems-DtReWmkd.js → usePaletteItems-CFpNlSOs.js} +2 -2
- package/dist/admin/assets/{usePaletteItems-DtReWmkd.js.map → usePaletteItems-CFpNlSOs.js.map} +1 -1
- package/dist/admin/assets/usePlaces-BA4x6503.js +2 -0
- package/dist/admin/assets/usePlaces-BA4x6503.js.map +1 -0
- package/dist/admin/assets/useResolvedDefinitions-30lnwFQ1.js +2 -0
- package/dist/admin/assets/useResolvedDefinitions-30lnwFQ1.js.map +1 -0
- package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js → useResolvedScheme-BVM4qLct.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js.map → useResolvedScheme-BVM4qLct.js.map} +1 -1
- package/dist/admin/assets/useSaveShortcut-DQuNL1uJ.js +2 -0
- package/dist/admin/assets/useSaveShortcut-DQuNL1uJ.js.map +1 -0
- package/dist/admin/assets/{useSchemaScopeAccess-ByrxIdKM.js → useSchemaScopeAccess-JXOMx51q.js} +2 -2
- package/dist/admin/assets/{useSchemaScopeAccess-ByrxIdKM.js.map → useSchemaScopeAccess-JXOMx51q.js.map} +1 -1
- package/dist/admin/assets/users-38jLQ7zr.js +2 -0
- package/dist/admin/assets/users-38jLQ7zr.js.map +1 -0
- package/dist/admin/assets/{users-DM7CXUBJ.js → users-DYwcVDqp.js} +2 -2
- package/dist/admin/assets/{users-DM7CXUBJ.js.map → users-DYwcVDqp.js.map} +1 -1
- package/dist/admin/assets/{zod-Cry7YvLY.js → zod-ZaQjjiAq.js} +2 -2
- package/dist/admin/assets/{zod-Cry7YvLY.js.map → zod-ZaQjjiAq.js.map} +1 -1
- package/dist/admin/index.html +60 -58
- package/dist/cli.js +1 -1
- package/dist/{cliMain-papyXJDd.js → cliMain-CTntiVc2.js} +107 -30
- package/dist/cliMain-CTntiVc2.js.map +1 -0
- package/dist/config.d.ts +2 -2
- package/dist/config.js +1 -1
- package/dist/{contentDisposition-DOL2Xt0l.js → contentDisposition-DzhPhncr.js} +2 -2
- package/dist/{contentDisposition-DOL2Xt0l.js.map → contentDisposition-DzhPhncr.js.map} +1 -1
- package/dist/index.d.ts +43 -6
- package/dist/index.js +2 -2
- package/dist/{public-COKbHR-N.d.ts → public-CMFaGDyf.d.ts} +50 -8
- package/dist/{public-B57h4F7Y.js → public-sJCQaNaP.js} +2 -2
- package/dist/public-sJCQaNaP.js.map +1 -0
- package/dist/{s3Adapter-U01iEAcK.js → s3Adapter-CZcCl0sy.js} +2 -2
- package/dist/{s3Adapter-U01iEAcK.js.map → s3Adapter-CZcCl0sy.js.map} +1 -1
- package/dist/{worker-B-sC-eY2.js → worker-DHm2JwMZ.js} +3140 -1292
- package/dist/worker-DHm2JwMZ.js.map +1 -0
- package/package.json +5 -5
- package/dist/admin/assets/AssistError-Cs-r9Ssc.js +0 -2
- package/dist/admin/assets/Body-BzZD-TZT.js +0 -2
- package/dist/admin/assets/Body-BzZD-TZT.js.map +0 -1
- package/dist/admin/assets/Builder-DW-GJA_q.js +0 -2
- package/dist/admin/assets/Builder-DW-GJA_q.js.map +0 -1
- package/dist/admin/assets/Form-lNrRHc0I.js +0 -2
- package/dist/admin/assets/Form-lNrRHc0I.js.map +0 -1
- package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js +0 -2
- package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js.map +0 -1
- package/dist/admin/assets/FormSelectField-BzE9Lq9i.js +0 -2
- package/dist/admin/assets/FormSelectField-BzE9Lq9i.js.map +0 -1
- package/dist/admin/assets/RadioTile-DQFmni5A.js.map +0 -1
- package/dist/admin/assets/RichTextField-CVHRIbnu.js.map +0 -1
- package/dist/admin/assets/StepList-BXGYD9eJ.js +0 -2
- package/dist/admin/assets/StepList-BXGYD9eJ.js.map +0 -1
- package/dist/admin/assets/Structure-D8csgrIt.js +0 -2
- package/dist/admin/assets/SubNavLink-CiCaVV8U.js.map +0 -1
- package/dist/admin/assets/auth-CQO4MBUj.js +0 -2
- package/dist/admin/assets/changeSets-8EburmT0.js +0 -2
- package/dist/admin/assets/chevron-left-DGU3HGYG.js +0 -2
- package/dist/admin/assets/content-CAjkbZEY.js +0 -3
- package/dist/admin/assets/content-CAjkbZEY.js.map +0 -1
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js +0 -2
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js.map +0 -1
- package/dist/admin/assets/develop-BOqvnlgt.js +0 -11
- package/dist/admin/assets/develop-BOqvnlgt.js.map +0 -1
- package/dist/admin/assets/es2015-BHmI7wjK.js +0 -42
- package/dist/admin/assets/es2015-BHmI7wjK.js.map +0 -1
- package/dist/admin/assets/followPlural-Cm7v_Udv.js +0 -2
- package/dist/admin/assets/followPlural-Cm7v_Udv.js.map +0 -1
- package/dist/admin/assets/inbox-DGO2D8fa.js +0 -2
- package/dist/admin/assets/inbox-DGO2D8fa.js.map +0 -1
- package/dist/admin/assets/index-BIIU9ZI6.js +0 -4
- package/dist/admin/assets/index-BIIU9ZI6.js.map +0 -1
- package/dist/admin/assets/index-lxe7WimO.css +0 -2
- package/dist/admin/assets/locales-Bg3htKo8.js +0 -2
- package/dist/admin/assets/media-BCnVhaDH.js +0 -2
- package/dist/admin/assets/network-BixABr0o.js +0 -2
- package/dist/admin/assets/network-BixABr0o.js.map +0 -1
- package/dist/admin/assets/publishing-Dke9bSKp.js +0 -2
- package/dist/admin/assets/publishing-Dke9bSKp.js.map +0 -1
- package/dist/admin/assets/schedules-BmB9Y73z.js +0 -2
- package/dist/admin/assets/schema-D-qo7XSF.js +0 -2
- package/dist/admin/assets/schema-D-qo7XSF.js.map +0 -1
- package/dist/admin/assets/sections-DqBzSKMP.js.map +0 -1
- package/dist/admin/assets/seo-CceGYTIX.js +0 -2
- package/dist/admin/assets/settings-B60vHpZd.js +0 -2
- package/dist/admin/assets/shapes-B5twqZcp.js +0 -6
- package/dist/admin/assets/shapes-B5twqZcp.js.map +0 -1
- package/dist/admin/assets/src-ndgTSYLX.js +0 -7
- package/dist/admin/assets/src-ndgTSYLX.js.map +0 -1
- package/dist/admin/assets/theme-65PB8uAu.js.map +0 -1
- package/dist/admin/assets/titles-CQiqqDw-.js +0 -2
- package/dist/admin/assets/titles-CQiqqDw-.js.map +0 -1
- package/dist/admin/assets/tokens-ixHjAkDK.js +0 -2
- package/dist/admin/assets/useContentSchema-DtYfhsd2.js +0 -2
- package/dist/admin/assets/useContentSchema-DtYfhsd2.js.map +0 -1
- package/dist/admin/assets/useCursorPager-0zHjlm-7.js +0 -2
- package/dist/admin/assets/useMediaUploader-CBcq1ICg.js.map +0 -1
- package/dist/admin/assets/useNetworkPermission-Cts98h9d.js +0 -2
- package/dist/admin/assets/usePlaces-DC47wVeU.js +0 -2
- package/dist/admin/assets/usePlaces-DC47wVeU.js.map +0 -1
- package/dist/admin/assets/useQueries-CirW3Mvp.js +0 -2
- package/dist/admin/assets/useQueries-CirW3Mvp.js.map +0 -1
- package/dist/admin/assets/useSaveShortcut-rKtp1qK7.js +0 -2
- package/dist/admin/assets/useSaveShortcut-rKtp1qK7.js.map +0 -1
- package/dist/admin/assets/users-2iJYwlJb.js +0 -2
- package/dist/admin/assets/users-2iJYwlJb.js.map +0 -1
- package/dist/cliMain-papyXJDd.js.map +0 -1
- package/dist/public-B57h4F7Y.js.map +0 -1
- package/dist/worker-B-sC-eY2.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishing-BkxBplUZ.js","names":["__iconData","__iconData","useState","useEffectEvent","z.url","z.string","z.object","z.enum","z.array","z.boolean","useMemo","useState","_Fragment","_Fragment","zodResolver","CreateSheet","TableRoot","_Fragment","useState","CreateSheet","useState","zodResolver","EditForm","CheckCircle2","XCircle","View","_Fragment","Trash2","Loader2","EditForm","View","View","AlertCircle","View","z.string","z.enum","_Fragment","z.object","useMemo","zodResolver","CreateSheet","Table","TableRoot","useState","Table","CreateSheet","z.object","z.string","z.url","z.array","z.boolean","z.enum","_Fragment","zodResolver","TableRoot","useState","WebhookIcon","useState","_Fragment","_Fragment","useState","_Fragment","Table","zodResolver","_Fragment","Trash2","WebhookDetail","__toESM","require_jsx_runtime","queryKeys","useQueryClient","LoaderCircle","useNavigate","Link","isConflict","useMe","linkOptions","SubmitButton","Page","PageHeader","useParams","StatusChip","EmptyState","ErrorState","Badge","LoadingState","Outlet","useTranslation","createLucideIcon","formatRelativeTime","formatDateTime","useSearch","RowTitle","createLazyRoute","UnsavedChangesGuard","SCHEDULE_STATUSES","PUBLICATION_ACTIONS","DEPLOYMENT_PROVIDERS","DEPLOYMENT_TRIGGERS","FormCheckboxGroup","toast","Info","InfoHint","CalendarClock","Button","Input","ChevronRight","SelectValue","SelectTrigger","SelectContent","SelectItem","ChevronDown","Select","CursorPager","FormError","AlertTitle","Checkbox","CircleAlert","Alert","AlertDescription","InlineConfirm","CircleCheck","CircleX","Trash","FieldGroup","FieldSet","FieldLabel","FieldDescription","FieldLegend","Field","Inbox","KeyRound","Plus","useRetryDeploymentRun","useResetOnOpen","useUpdateDeploymentConnection","useDeploymentRuns","useTriggerDeployment","useCreateDeploymentConnection","useRotateWebhookSecret","useDeploymentConnections","useWebhook","useWebhooks","PROVIDER_LABELS","TRIGGER_POLICY_LABELS","TIMELINE_SOURCE_LABELS","useRedeliverWebhook","useWebhookDeliveries","RUN_TRIGGER_LABELS","useCreateWebhook","useTestWebhook","PUBLICATION_ACTION_LABELS","useDeleteWebhook","useUpdateWebhook","useCursorPager","useWebhookEvents","useDeleteDeploymentConnection","useTestDeploymentConnection","useDeploymentRun","useDeploymentConnection","RotateCcw","Send","permittedSections","Webhook","cn","useController","useWatch","FormTextField","requiredText","FormFieldError","u","useForm","describedBy","settle","TableHeader","url","boolean","object","TableHead","_enum","TableBody","TableRow","TableCell","TableCard","Table$2","array","string","HintedLabel","TextLink","canSeeNetwork","useDefinitions","QueryView","FormRadioGroup","useLocales","Panel","ACTIVE_RUN_STATUSES","useCreateSchedule","useSchedules","useCancelSchedule","dateTimeLocalToIso","defaultScheduleValue","dateTimeLocalField","ExternalLink","CopyButton","FormSwitchField","FormSelectField","FormSheet","useRoles","SecretReveal","LinkTabs","__iconData$2","CalendarPlus","__iconData$1","PlugZap","__iconData","Power","import_jsx_runtime","Publishing","import_react","require_react","usePublishingPermissions","permissions","Header","section","useSecretReveal","revealed","setRevealed","dismissedId","setDismissedId","afterDismiss","onDismissed","id","event","DetailList","className","items","item","EnabledChip","enabled","canDeployConnection","secretsUnreadable","useConnectionActions","navigate","test","trigger","remove","connection","run","SCHEDULE_STATUS_DISPLAY","DELIVERY_STATUS_DISPLAY","RUN_DISPLAY","runDisplay","RunStatus","display","t","SecretsUnreadableChip","unreadable","ConnectionCard","actions","canTriggerDeployments","Rocket","GITHUB_MODES","NO_DELIVERY_ROLE","SETTING_NAMES","SECRET_NAMES","OPTIONAL_SETTINGS","PROVIDER_FIELDS","providerSettingNames","provider","triggerOptionsFor","isWholeNumber","value","isHttpUrl","settingsShape","name","secretsShape","connectionSchema","fields","values","context","mode","secret","emptyRecord","names","EMPTY_CONNECTION","toConnectionValues","commonInput","secrets","toCreateConnectionInput","regenerableSecrets","requiredOnCreate","toUpdateConnectionInput","typed","rest","regenerable","useDeliveryRoleOptions","roles","role","SETTING_LABELS","SETTING_HINTS","SECRET_LABELS","SECRET_HINTS","PROVIDER_SECRET_HINTS","secretHintFor","GITHUB_MODE_LABELS","SecretField","replacing","setReplacing","hintId","errorId","fieldState","helperId","helper","fullHint","hint","stored","envVar","field","ProviderFields","storedSecrets","ConnectionForm","deliveryRoleOptions","createSchema","useCreateConnectionForm","createConnection","form","open","created","onCreated","CreateSheet$2","onSubmit","GeneratedSecretReveal","Runs","showConnection","runs","RunsList","cursor","onCursorChange","data","connectionId","pagerProps","Deployments","connections","creating","setCreating","openConnection","canManageDeployments","next","generated","generatedSecrets","useConflictReload","queryClient","conflicted","setConflicted","error","JsonBlock","label","SIGNATURE_HEADERS","SignatureHelp","description","header","CALLBACK_EXAMPLE","CallbackHelp","callbackUrl","editSchema","useEditConnectionForm","update","saved","onConflict","onSaved","EditForm$1","TestResult","result","check","stayOnPage","View$2","conflict","busy","snapshot","meta","Connection","safeExternalUrl","Timeline","index","View$1","retry","none","logUrl","siteUrl","active","details","Run","runId","ALL","StatusFilter","labelId","onChange","options","option","allLabel","DEFAULT_LOCALE","entryTargetShape","EMPTY_ENTRY_TARGET","toEntryTarget","entryId","locale","useEntryTargetOptions","models","locales","definition","action","EntryTargetFields","path","modelOptions","localeOptions","actionOptions","createScheduleSchema","useCreateScheduleForm","createSchedule","defaults","target","iso","runAt","CreateSheet$1","useScheduledSearch","search","go","previous","changes","resetPager","Table$1","schedules","status","schedule","onCancel","Scheduled","cancel","cancelSchedule","statusOptions","filters","setStatus","groupPattern","group","groupEvents","groups","events","type","types","toggleGroup","pattern","others","selected","checked","toggleEvent","EventsField","catalog","groupSelected","groupId","MAX_ATTEMPTS_RANGE","DEFAULT_MAX_ATTEMPTS","webhookSchema","EMPTY_WEBHOOK","toWebhookValues","webhook","toWebhookInput","Fields","useCreateWebhookForm","createWebhook","CreateSheet","me","scopeOptions","SigningSecretReveal","SiteBadge","Table","webhooks","last","Webhooks","signingSecret","useWebhookActions","rotate","setSecret","rotated","HeaderList","headers","SUCCESS_MIN","REDIRECT_MIN","CLIENT_ERROR_MIN","toneOf","ResponseCode","Attempt","attempt","request","response","DELIVERY_COLUMNS","Delivery","delivery","detailsId","expanded","onToggle","redelivering","onRedeliver","Deliveries","deliveries","webhookId","redeliver","setExpanded","toggle","current","useEditWebhookForm","EditForm","View","publishingLazyRoutes"],"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/calendar-plus.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/plug-zap.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/power.mjs","../../src/features/Publishing/index.tsx","../../src/features/Publishing/hooks/usePublishingPermissions.ts","../../src/features/Publishing/Header/index.tsx","../../src/features/Publishing/hooks/useSecretReveal.ts","../../src/features/Publishing/DetailList/index.tsx","../../src/features/Publishing/EnabledChip/index.tsx","../../src/features/Publishing/Deployments/helpers/connectionState.ts","../../src/features/Publishing/Deployments/hooks/useConnectionActions.ts","../../src/features/Publishing/helpers/statusDisplay.ts","../../src/features/Publishing/Deployments/RunStatus/index.tsx","../../src/features/Publishing/Deployments/SecretsUnreadableChip/index.tsx","../../src/features/Publishing/Deployments/ConnectionCard/index.tsx","../../src/features/Publishing/Deployments/helpers/connectionForm.ts","../../src/features/Publishing/Deployments/hooks/useDeliveryRoleOptions.ts","../../src/features/Publishing/Deployments/helpers/labels.ts","../../src/features/Publishing/Deployments/SecretField/index.tsx","../../src/features/Publishing/Deployments/ProviderFields/index.tsx","../../src/features/Publishing/Deployments/ConnectionForm/index.tsx","../../src/features/Publishing/Deployments/hooks/useCreateConnectionForm.ts","../../src/features/Publishing/Deployments/CreateSheet/index.tsx","../../src/features/Publishing/Deployments/GeneratedSecretReveal/index.tsx","../../src/features/Publishing/Deployments/Runs/index.tsx","../../src/features/Publishing/Deployments/RunsList/index.tsx","../../src/features/Publishing/Deployments/index.tsx","../../src/features/Publishing/hooks/useConflictReload.ts","../../src/features/Publishing/JsonBlock/index.tsx","../../src/features/Publishing/SignatureHelp/index.tsx","../../src/features/Publishing/Deployments/CallbackHelp/index.tsx","../../src/features/Publishing/Deployments/hooks/useEditConnectionForm.ts","../../src/features/Publishing/Deployments/Connection/EditForm/index.tsx","../../src/features/Publishing/Deployments/Connection/TestResult/index.tsx","../../src/features/Publishing/Deployments/Connection/View/index.tsx","../../src/features/Publishing/Deployments/Connection/index.tsx","../../src/features/Publishing/helpers/safeExternalUrl.ts","../../src/features/Publishing/Deployments/Run/Timeline/index.tsx","../../src/features/Publishing/Deployments/Run/View/index.tsx","../../src/features/Publishing/Deployments/Run/index.tsx","../../src/features/Publishing/StatusFilter/index.tsx","../../src/features/Publishing/helpers/entryTarget.ts","../../src/features/Publishing/hooks/useEntryTargetOptions.ts","../../src/features/Publishing/EntryTargetFields/index.tsx","../../src/features/Publishing/Scheduled/hooks/useCreateScheduleForm.ts","../../src/features/Publishing/Scheduled/CreateSheet/index.tsx","../../src/features/Publishing/Scheduled/hooks/useScheduledSearch.ts","../../src/features/Publishing/Scheduled/Table/index.tsx","../../src/features/Publishing/Scheduled/index.tsx","../../src/features/Publishing/helpers/webhookEvents.ts","../../src/features/Publishing/Webhooks/EventsField/index.tsx","../../src/features/Publishing/Webhooks/helpers.ts","../../src/features/Publishing/Webhooks/Fields/index.tsx","../../src/features/Publishing/Webhooks/hooks/useCreateWebhookForm.ts","../../src/features/Publishing/Webhooks/CreateSheet/index.tsx","../../src/features/Publishing/Webhooks/SigningSecretReveal/index.tsx","../../src/features/Publishing/Webhooks/SiteBadge/index.tsx","../../src/features/Publishing/Webhooks/Table/index.tsx","../../src/features/Publishing/Webhooks/index.tsx","../../src/features/Publishing/Webhooks/hooks/useWebhookActions.ts","../../src/features/Publishing/Webhooks/Detail/HeaderList/index.tsx","../../src/features/Publishing/Webhooks/Detail/ResponseCode/index.tsx","../../src/features/Publishing/Webhooks/Detail/Attempt/index.tsx","../../src/features/Publishing/Webhooks/Detail/Delivery/index.tsx","../../src/features/Publishing/Webhooks/Detail/Deliveries/index.tsx","../../src/features/Publishing/Webhooks/hooks/useEditWebhookForm.ts","../../src/features/Publishing/Webhooks/Detail/EditForm/index.tsx","../../src/features/Publishing/Webhooks/Detail/View/index.tsx","../../src/features/Publishing/Webhooks/Detail/index.tsx","../../src/app/lazyRoutes/publishing.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"calendar-plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M16 18h6\", key: \"987eiv\" }],\n [\"path\", { d: \"M16 2v3\", key: \"otl347\" }],\n [\"path\", { d: \"M19 15v6\", key: \"10aioa\" }],\n [\"path\", { d: \"M21 11.5V5a2 2 0 00-2-2H5a2 2 0 00-2 2v14a2 2 0 002 2h8.3\", key: \"jgwkxf\" }],\n [\"path\", { d: \"M3 9h18\", key: \"1pudct\" }],\n [\"path\", { d: \"M8 2v3\", key: \"1ioesn\" }]\n ]\n};\n__iconData.node;\nconst CalendarPlus = createLucideIcon(__iconData);\n\nexport { __iconData, CalendarPlus as default };\n//# sourceMappingURL=calendar-plus.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: \"plug-zap\",\n size: 24,\n node: [\n [\n \"path\",\n { d: \"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z\", key: \"goz73y\" }\n ],\n [\"path\", { d: \"m2 22 3-3\", key: \"19mgm9\" }],\n [\"path\", { d: \"M7.5 13.5 10 11\", key: \"7xgeeb\" }],\n [\"path\", { d: \"M10.5 16.5 13 14\", key: \"10btkg\" }],\n [\"path\", { d: \"m18 3-4 4h6l-4 4\", key: \"16psg9\" }]\n ],\n aliases: [\"plug-zap-2\"]\n};\n__iconData.node;\nconst PlugZap = createLucideIcon(__iconData);\n\nexport { __iconData, PlugZap as default };\n//# sourceMappingURL=plug-zap.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: \"power\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 2v10\", key: \"mnfbl\" }],\n [\"path\", { d: \"M18.4 6.6a9 9 0 1 1-12.77.04\", key: \"obofu9\" }]\n ]\n};\n__iconData.node;\nconst Power = createLucideIcon(__iconData);\n\nexport { __iconData, Power as default };\n//# sourceMappingURL=power.mjs.map\n","import { Outlet } from '@tanstack/react-router';\n\n/**\n * Scheduled publications, webhooks and deployments. Each tab renders its own\n * `Page` and header (the tabs live in the header, with the tab's actions).\n */\nexport const Publishing = () => <Outlet />;\n","import { useMe } from '@/api/auth';\n\n/** What the signed-in admin may change here. The UI hides what they can't; the server enforces it. */\nexport const usePublishingPermissions = () => {\n const permissions = useMe().data?.globalPermissions ?? [];\n return {\n permissions,\n canManageWebhooks: permissions.includes('webhooks.manage'),\n canManageDeployments: permissions.includes('deployments.manage'),\n canTriggerDeployments: permissions.includes('deployments.trigger'),\n canManagePublishing: permissions.includes('publishing.manage'),\n };\n};\n","import type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { LinkTabs } from '@/components/LinkTabs';\nimport { PageHeader } from '@/components/PageHeader';\nimport { usePublishingPermissions } from '../hooks/usePublishingPermissions';\nimport { permittedSections } from '../sections';\n\ntype HeaderProps = {\n /** The current tab's actions (its \"New …\" button), primary last. */\n actions?: ReactNode;\n};\n\n/** The header of every Publishing list: \"Publishing\", the section tabs the admin may open, and actions. */\nexport const Header = ({ actions }: HeaderProps) => {\n const { t } = useTranslation();\n const { permissions } = usePublishingPermissions();\n return (\n <PageHeader\n title={t('nav.publishing')}\n actions={actions}\n tabs={\n <LinkTabs\n label={t('publishing.sections')}\n tabs={permittedSections(permissions).map((section) => ({\n to: section.to,\n label: t(section.labelKey),\n }))}\n />\n }\n />\n );\n};\n","import { useEffect, useEffectEvent, useState } from 'react';\n\ntype Revealed = { id: string; secret: string };\n\n/**\n * A secret created on this page (a webhook's or a connection's signing secret), shown once in a\n * `SecretReveal` at the top of the page, never through a URL. Dismissing it runs `onDismissed` with the\n * record's ID (to open it) only after the reveal, and its \"leave without saving the secret?\" guard, has\n * unmounted, so that navigation isn't stopped by the guard.\n */\nexport const useSecretReveal = (onDismissed: (id: string) => void) => {\n const [revealed, setRevealed] = useState<Revealed | undefined>(undefined);\n const [dismissedId, setDismissedId] = useState<string | undefined>(undefined);\n const afterDismiss = useEffectEvent((id: string) => onDismissed(id));\n useEffect(() => {\n if (dismissedId) {\n afterDismiss(dismissedId);\n }\n }, [dismissedId]);\n return {\n revealed,\n reveal: setRevealed,\n dismiss: () => {\n setDismissedId(revealed?.id);\n setRevealed(undefined);\n },\n /** For the create sheet's `onCloseAutoFocus`: focus stays on the reveal's copy button. */\n keepFocusOnReveal: (event: Event) => {\n if (revealed) {\n event.preventDefault();\n }\n },\n };\n};\n","import type { ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\n\nexport type DetailItem = { label: string; value: ReactNode };\n\ntype DetailListProps = { items: readonly DetailItem[]; className?: string };\n\n/** Label / value pairs (a description list), two columns on wide screens. */\nexport const DetailList = ({ items, className }: DetailListProps) => (\n <dl className={cn('grid gap-x-6 gap-y-3 text-sm sm:grid-cols-2', className)}>\n {items.map((item) => (\n <div key={item.label} className=\"min-w-0 space-y-0.5\">\n <dt className=\"text-xs font-medium text-muted-foreground\">{item.label}</dt>\n <dd className=\"break-words\">{item.value}</dd>\n </div>\n ))}\n </dl>\n);\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\n\ntype EnabledChipProps = { enabled: boolean };\n\n/** \"Enabled\" / \"Disabled\" for webhooks and deployment connections. */\nexport const EnabledChip = ({ enabled }: EnabledChipProps) => {\n const { t } = useTranslation();\n return enabled ? (\n <StatusChip tone=\"success\" label={t('publishing.enabled')} />\n ) : (\n <StatusChip tone=\"muted\" label={t('publishing.disabled')} />\n );\n};\n","import type { DeploymentConnection } from '@shapio/client';\n\n/** Deploy now needs an enabled connection whose stored secrets can be read (a run would fail otherwise). */\nexport const canDeployConnection = ({\n enabled,\n secretsUnreadable,\n}: Pick<DeploymentConnection, 'enabled' | 'secretsUnreadable'>) => enabled && !secretsUnreadable;\n","import type { DeploymentConnection } from '@shapio/client';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport {\n useDeleteDeploymentConnection,\n useTestDeploymentConnection,\n useTriggerDeployment,\n} from '@/api/deployments';\n\n/** Test the connection (result shown inline), trigger a manual run (opens it) and delete (a promise, for its confirmation). */\nexport const useConnectionActions = (connection: DeploymentConnection) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const test = useTestDeploymentConnection();\n const trigger = useTriggerDeployment();\n const remove = useDeleteDeploymentConnection();\n return {\n testResult: test.data,\n testing: test.isPending,\n triggering: trigger.isPending,\n deleting: remove.isPending,\n runTest: () => test.mutate(connection.id),\n triggerRun: () =>\n trigger.mutate(connection.id, {\n onSuccess: (run) => {\n toast.success(t('publishing.deployments.triggered'));\n void navigate({ to: '/publishing/deployments/runs/$runId', params: { runId: run.id } });\n },\n }),\n remove: () =>\n remove.mutateAsync(connection.id, {\n onSuccess: () => {\n toast.success(t('publishing.deployments.deleted', { name: connection.name }));\n void navigate({ to: '/publishing/deployments' });\n },\n }),\n };\n};\n","import type { DeploymentRun, ScheduleStatus, WebhookDeliveryStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\ntype Display = { labelKey: string; tone: StatusTone };\n\nexport const SCHEDULE_STATUS_DISPLAY = {\n scheduled: { labelKey: 'publishing.scheduled.statuses.scheduled', tone: 'scheduled' },\n done: { labelKey: 'publishing.scheduled.statuses.done', tone: 'success' },\n failed: { labelKey: 'publishing.scheduled.statuses.failed', tone: 'danger' },\n canceled: { labelKey: 'publishing.scheduled.statuses.canceled', tone: 'muted' },\n} as const satisfies Record<ScheduleStatus, Display>;\n\nexport const DELIVERY_STATUS_DISPLAY = {\n pending: { labelKey: 'publishing.webhooks.deliveryStatuses.pending', tone: 'progress' },\n retrying: { labelKey: 'publishing.webhooks.deliveryStatuses.retrying', tone: 'progress' },\n succeeded: { labelKey: 'publishing.webhooks.deliveryStatuses.succeeded', tone: 'success' },\n dead: { labelKey: 'publishing.webhooks.deliveryStatuses.dead', tone: 'danger' },\n} as const satisfies Record<WebhookDeliveryStatus, Display>;\n\nconst RUN_DISPLAY = {\n queued: { labelKey: 'publishing.deployments.statuses.queued', tone: 'neutral' },\n triggered: { labelKey: 'publishing.deployments.statuses.triggered', tone: 'progress' },\n triggeredUnknown: { labelKey: 'publishing.deployments.statuses.triggeredUnknown', tone: 'muted' },\n building: { labelKey: 'publishing.deployments.statuses.building', tone: 'progress' },\n deployed: { labelKey: 'publishing.deployments.statuses.deployed', tone: 'success' },\n committed: { labelKey: 'publishing.deployments.statuses.committed', tone: 'success' },\n failed: { labelKey: 'publishing.deployments.statuses.failed', tone: 'danger' },\n unknown: { labelKey: 'publishing.deployments.statuses.unknown', tone: 'muted' },\n} as const satisfies Record<string, Display>;\n\nexport type RunDisplay = (typeof RUN_DISPLAY)[keyof typeof RUN_DISPLAY];\n\n/**\n * A run's label, honest about what Shapio actually knows (brief §7: never show a success that didn't\n * happen). A trigger without a completion report reads \"Trigger sent · completion unknown\", not \"Deployed\";\n * GitHub \"deploys\" by committing, so its success reads \"Committed\".\n */\nexport const runDisplay = (\n run: Pick<DeploymentRun, 'status' | 'provider' | 'completionReported'>,\n): RunDisplay => {\n switch (run.status) {\n case 'triggered':\n return run.completionReported ? RUN_DISPLAY.triggered : RUN_DISPLAY.triggeredUnknown;\n case 'deployed':\n return run.provider === 'github' ? RUN_DISPLAY.committed : RUN_DISPLAY.deployed;\n default:\n return RUN_DISPLAY[run.status];\n }\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { runDisplay } from '../../helpers/statusDisplay';\n\ntype RunStatusProps = {\n run: Pick<DeploymentRun, 'status' | 'provider' | 'completionReported'>;\n /** False for a past state on the timeline. */\n live?: boolean;\n};\n\n/** A run's status, labeled honestly (see `runDisplay`). */\nexport const RunStatus = ({ run, live = true }: RunStatusProps) => {\n const { t } = useTranslation();\n const display = runDisplay(run);\n return <StatusChip tone={display.tone} label={t(display.labelKey)} live={live} />;\n};\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\n\ntype SecretsUnreadableChipProps = { unreadable: boolean };\n\n/** Warns that a connection's stored secret can't be decrypted (the server's key changed) until it is entered again. */\nexport const SecretsUnreadableChip = ({ unreadable }: SecretsUnreadableChipProps) => {\n const { t } = useTranslation();\n return unreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.deployments.secretsUnreadable')} />\n ) : null;\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { Rocket } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Panel } from '@/components/Panel';\nimport { Button } from '@/components/ui/button';\nimport { PROVIDER_LABELS } from '../../constants';\nimport { DetailList } from '../../DetailList';\nimport { EnabledChip } from '../../EnabledChip';\nimport { usePublishingPermissions } from '../../hooks/usePublishingPermissions';\nimport { canDeployConnection } from '../helpers/connectionState';\nimport { useConnectionActions } from '../hooks/useConnectionActions';\nimport { RunStatus } from '../RunStatus';\nimport { SecretsUnreadableChip } from '../SecretsUnreadableChip';\n\ntype ConnectionCardProps = { connection: DeploymentConnection };\n\n/**\n * One deployment connection: provider, state, latest run and live snapshot, with Open and Deploy now. A\n * connection whose secret can't be read says so and can't deploy until the secret is entered again.\n */\nexport const ConnectionCard = ({ connection }: ConnectionCardProps) => {\n const { t } = useTranslation();\n const { canTriggerDeployments } = usePublishingPermissions();\n const actions = useConnectionActions(connection);\n return (\n <Panel\n title={connection.name}\n titleAs=\"h3\"\n description={t(PROVIDER_LABELS[connection.provider])}\n actions={<EnabledChip enabled={connection.enabled} />}\n bodyClassName=\"space-y-4\"\n >\n <SecretsUnreadableChip unreadable={connection.secretsUnreadable} />\n <DetailList\n items={[\n {\n label: t('publishing.deployments.latestRun'),\n value: connection.latestRun ? <RunStatus run={connection.latestRun} /> : t('common.never'),\n },\n {\n label: t('publishing.deployments.currentSnapshot'),\n value:\n connection.currentRun?.snapshot != null\n ? t('publishing.snapshotNumber', { snapshot: connection.currentRun.snapshot })\n : t('common.none'),\n },\n ]}\n className=\"grid-cols-2\"\n />\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link to=\"/publishing/deployments/$connectionId\" params={{ connectionId: connection.id }}>\n {t('publishing.deployments.open')}\n </Link>\n </Button>\n {canTriggerDeployments ? (\n <Button\n size=\"sm\"\n disabled={actions.triggering || !canDeployConnection(connection)}\n onClick={actions.triggerRun}\n >\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </div>\n </Panel>\n );\n};\n","import {\n DEPLOYMENT_PROVIDERS,\n DEPLOYMENT_TRIGGERS,\n type CreateDeploymentConnectionInput,\n type DeploymentConnection,\n type DeploymentProvider,\n type UpdateDeploymentConnectionInput,\n} from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\nexport const GITHUB_MODES = ['commit', 'pull_request'] as const;\n\n/** Select value for \"previews show the public fields\" (Radix selects cannot use an empty value). */\nexport const NO_DELIVERY_ROLE = 'none';\n\nconst SETTING_NAMES = [\n 'url',\n 'accountId',\n 'projectName',\n 'projectId',\n 'teamId',\n 'siteId',\n 'owner',\n 'repo',\n 'branch',\n 'mode',\n 'directory',\n] as const;\nconst SECRET_NAMES = ['signingSecret', 'deployHookUrl', 'apiToken', 'token'] as const;\n\nexport type SettingName = (typeof SETTING_NAMES)[number];\nexport type SecretName = (typeof SECRET_NAMES)[number];\n\ntype SecretSpec = { name: SecretName; requiredOnCreate: boolean };\n\n/** Settings a provider shows but does not require (everything else listed in `settings` is required). */\nexport const OPTIONAL_SETTINGS: ReadonlySet<SettingName> = new Set(['teamId']);\n\n/** The settings (text inputs; GitHub's `mode` is a select) and write-only secrets of each provider. */\nexport const PROVIDER_FIELDS = {\n generic_webhook: {\n settings: ['url'],\n secrets: [{ name: 'signingSecret', requiredOnCreate: false }],\n },\n cloudflare_pages: {\n settings: ['accountId', 'projectName'],\n secrets: [\n { name: 'deployHookUrl', requiredOnCreate: true },\n { name: 'apiToken', requiredOnCreate: true },\n ],\n },\n vercel: {\n settings: ['projectId', 'teamId'],\n secrets: [\n { name: 'deployHookUrl', requiredOnCreate: true },\n { name: 'apiToken', requiredOnCreate: true },\n ],\n },\n netlify: {\n settings: ['siteId'],\n secrets: [{ name: 'apiToken', requiredOnCreate: true }],\n },\n github: {\n settings: ['owner', 'repo', 'branch', 'directory'],\n secrets: [{ name: 'token', requiredOnCreate: true }],\n },\n} as const satisfies Record<\n DeploymentProvider,\n { settings: readonly SettingName[]; secrets: readonly SecretSpec[] }\n>;\n\n/** Settings sent per provider (GitHub's `mode` included). */\nconst providerSettingNames = (provider: DeploymentProvider): readonly SettingName[] =>\n provider === 'github' ? [...PROVIDER_FIELDS.github.settings, 'mode'] : PROVIDER_FIELDS[provider].settings;\n\n/** \"Schema changes\" only applies to GitHub, which commits the schema files. */\nexport const triggerOptionsFor = (provider: DeploymentProvider) =>\n DEPLOYMENT_TRIGGERS.filter((trigger) => trigger !== 'schema' || provider === 'github');\n\nconst isWholeNumber = (value: string) => /^\\d+$/.test(value) && Number(value) <= 86_400;\n\nconst isHttpUrl = (value: string) => z.url({ protocol: /^https?$/ }).safeParse(value).success;\n\nexport type ConnectionFormMode = 'create' | 'edit';\n\nconst settingsShape = Object.fromEntries(SETTING_NAMES.map((name) => [name, z.string()])) as Record<\n SettingName,\n z.ZodString\n>;\nconst secretsShape = Object.fromEntries(SECRET_NAMES.map((name) => [name, z.string()])) as Record<\n SecretName,\n z.ZodString\n>;\n\n/** Required settings and secrets depend on the provider; secrets are only required when creating. */\nexport const connectionSchema = (mode: ConnectionFormMode) =>\n z\n .object({\n name: requiredText().max(200, 'validation.tooLong'),\n provider: z.enum(DEPLOYMENT_PROVIDERS),\n settings: z.object(settingsShape),\n secrets: z.object(secretsShape),\n previewUrlTemplate: z.string().trim().max(2000, 'validation.tooLong'),\n triggerPolicy: z.array(z.enum(DEPLOYMENT_TRIGGERS)),\n debounceSeconds: z.string().trim().refine(isWholeNumber, 'validation.debounceSeconds'),\n allowPrivateNetwork: z.boolean(),\n enabled: z.boolean(),\n /** A delivery role ID, or NO_DELIVERY_ROLE. */\n deliveryRoleId: z.string(),\n })\n .superRefine((values, context) => {\n const fields = PROVIDER_FIELDS[values.provider];\n for (const name of fields.settings) {\n if (!OPTIONAL_SETTINGS.has(name) && values.settings[name].trim() === '') {\n context.addIssue({ code: 'custom', path: ['settings', name], message: 'validation.required' });\n }\n }\n if (\n values.provider === 'generic_webhook' &&\n values.settings.url.trim() &&\n !isHttpUrl(values.settings.url.trim())\n ) {\n context.addIssue({ code: 'custom', path: ['settings', 'url'], message: 'validation.url' });\n }\n if (mode === 'create') {\n for (const secret of fields.secrets) {\n if (secret.requiredOnCreate && values.secrets[secret.name].trim() === '') {\n context.addIssue({\n code: 'custom',\n path: ['secrets', secret.name],\n message: 'validation.required',\n });\n }\n }\n }\n if (values.previewUrlTemplate && !isHttpUrl(values.previewUrlTemplate)) {\n context.addIssue({ code: 'custom', path: ['previewUrlTemplate'], message: 'validation.url' });\n }\n });\n\nexport type ConnectionFormValues = z.infer<ReturnType<typeof connectionSchema>>;\n\nconst emptyRecord = <TName extends string>(names: readonly TName[]) =>\n Object.fromEntries(names.map((name) => [name, ''])) as Record<TName, string>;\n\nexport const EMPTY_CONNECTION: ConnectionFormValues = {\n name: '',\n provider: 'generic_webhook',\n settings: { ...emptyRecord(SETTING_NAMES), branch: 'main', mode: 'commit', directory: 'schema' },\n secrets: emptyRecord(SECRET_NAMES),\n previewUrlTemplate: '',\n triggerPolicy: ['publish', 'change_set', 'manual'],\n debounceSeconds: '30',\n allowPrivateNetwork: false,\n enabled: true,\n deliveryRoleId: NO_DELIVERY_ROLE,\n};\n\nexport const toConnectionValues = (connection: DeploymentConnection): ConnectionFormValues => ({\n name: connection.name,\n provider: connection.provider,\n settings: {\n ...EMPTY_CONNECTION.settings,\n ...Object.fromEntries(\n SETTING_NAMES.flatMap((name) => (connection.settings[name] ? [[name, connection.settings[name]]] : [])),\n ),\n },\n // Secrets are write-only: never prefilled.\n secrets: emptyRecord(SECRET_NAMES),\n previewUrlTemplate: connection.previewUrlTemplate ?? '',\n triggerPolicy: connection.triggerPolicy,\n debounceSeconds: String(connection.debounceSeconds),\n allowPrivateNetwork: connection.allowPrivateNetwork,\n enabled: connection.enabled,\n deliveryRoleId: connection.deliveryRoleId ?? NO_DELIVERY_ROLE,\n});\n\nconst commonInput = (values: ConnectionFormValues) => {\n const secrets = Object.fromEntries(\n PROVIDER_FIELDS[values.provider].secrets.flatMap(({ name }) =>\n values.secrets[name].trim() ? [[name, values.secrets[name].trim()]] : [],\n ),\n );\n return {\n name: values.name.trim(),\n settings: Object.fromEntries(\n providerSettingNames(values.provider).map((name) => [name, values.settings[name].trim()]),\n ),\n secrets,\n previewUrlTemplate: values.previewUrlTemplate.trim() || null,\n triggerPolicy: values.triggerPolicy.filter((trigger) =>\n triggerOptionsFor(values.provider).includes(trigger),\n ),\n debounceSeconds: Number(values.debounceSeconds),\n allowPrivateNetwork: values.allowPrivateNetwork,\n enabled: values.enabled,\n deliveryRoleId: values.deliveryRoleId === NO_DELIVERY_ROLE ? null : values.deliveryRoleId,\n };\n};\n\nexport const toCreateConnectionInput = (values: ConnectionFormValues): CreateDeploymentConnectionInput => ({\n ...commonInput(values),\n provider: values.provider,\n});\n\n/**\n * Secrets Shapio generates when left empty (the generic signing secret) that the server can no longer read\n * and that don't come from the environment: saving one empty asks for a new one.\n */\nexport const regenerableSecrets = (\n connection: Pick<DeploymentConnection, 'provider' | 'secrets' | 'secretsUnreadable'>,\n): SecretName[] =>\n connection.secretsUnreadable\n ? PROVIDER_FIELDS[connection.provider].secrets\n .filter(({ name, requiredOnCreate }) => !requiredOnCreate && !connection.secrets[name]?.set)\n .map(({ name }) => name)\n : [];\n\n/**\n * Only secrets typed in are sent: an omitted secret keeps its stored value. A `regenerable` secret left\n * empty is sent as '' so the server generates a new one (and returns it once).\n */\nexport const toUpdateConnectionInput = (\n values: ConnectionFormValues,\n expectedVersion: number,\n regenerable: readonly SecretName[] = [],\n): UpdateDeploymentConnectionInput => {\n const { secrets: typed, ...rest } = commonInput(values);\n const secrets = {\n ...Object.fromEntries(regenerable.filter((name) => !(name in typed)).map((name) => [name, ''])),\n ...typed,\n };\n return { ...rest, ...(Object.keys(secrets).length > 0 ? { secrets } : {}), expectedVersion };\n};\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useRoles } from '@/api/roles';\nimport type { SelectOption } from '@/components/FormSelectField';\nimport { NO_DELIVERY_ROLE } from '../helpers/connectionForm';\n\n/** \"Public fields\" plus every delivery role: what a connection's previews read with. */\nexport const useDeliveryRoleOptions = (): SelectOption[] => {\n const { t } = useTranslation();\n const roles = useRoles().data;\n return useMemo(\n () => [\n { value: NO_DELIVERY_ROLE, label: t('publishing.deployments.deliveryRoleNone') },\n ...(roles ?? [])\n .filter((role) => role.kind === 'delivery')\n .map((role) => ({ value: role.id, label: role.name })),\n ],\n [roles, t],\n );\n};\n","import type { DeploymentProvider } from '@shapio/client';\nimport type { SecretName, SettingName } from './connectionForm';\n\nexport const SETTING_LABELS = {\n url: 'publishing.deployments.settingLabels.url',\n accountId: 'publishing.deployments.settingLabels.accountId',\n projectName: 'publishing.deployments.settingLabels.projectName',\n projectId: 'publishing.deployments.settingLabels.projectId',\n teamId: 'publishing.deployments.settingLabels.teamId',\n siteId: 'publishing.deployments.settingLabels.siteId',\n owner: 'publishing.deployments.settingLabels.owner',\n repo: 'publishing.deployments.settingLabels.repo',\n branch: 'publishing.deployments.settingLabels.branch',\n mode: 'publishing.deployments.settingLabels.mode',\n directory: 'publishing.deployments.settingLabels.directory',\n} as const satisfies Record<SettingName, string>;\n\nexport const SETTING_HINTS = {\n url: 'publishing.deployments.settingHints.url',\n directory: 'publishing.deployments.settingHints.directory',\n teamId: 'publishing.deployments.settingHints.teamId',\n} as const satisfies Partial<Record<SettingName, string>>;\n\nexport const SECRET_LABELS = {\n signingSecret: 'publishing.deployments.secretLabels.signingSecret',\n deployHookUrl: 'publishing.deployments.secretLabels.deployHookUrl',\n apiToken: 'publishing.deployments.secretLabels.apiToken',\n token: 'publishing.deployments.secretLabels.token',\n} as const satisfies Record<SecretName, string>;\n\nexport const SECRET_HINTS = {\n signingSecret: 'publishing.deployments.secretHints.signingSecret',\n deployHookUrl: 'publishing.deployments.secretHints.deployHookUrl',\n apiToken: 'publishing.deployments.secretHints.apiToken',\n token: 'publishing.deployments.secretHints.token',\n} as const satisfies Record<SecretName, string>;\n\ntype SecretHintKey =\n (typeof SECRET_HINTS)[SecretName] | 'publishing.deployments.providerSecretHints.netlify.apiToken';\n\n/** Where a secret means something different for one provider (Netlify's token also starts builds). */\nconst PROVIDER_SECRET_HINTS: Partial<Record<DeploymentProvider, Partial<Record<SecretName, SecretHintKey>>>> =\n {\n netlify: { apiToken: 'publishing.deployments.providerSecretHints.netlify.apiToken' },\n };\n\n/** The hint for a provider's secret: its provider-specific override, or the shared one. */\nexport const secretHintFor = (provider: DeploymentProvider, name: SecretName): SecretHintKey =>\n PROVIDER_SECRET_HINTS[provider]?.[name] ?? SECRET_HINTS[name];\n\nexport const GITHUB_MODE_LABELS = {\n commit: 'publishing.deployments.githubModes.commit',\n pull_request: 'publishing.deployments.githubModes.pull_request',\n} as const;\n","import { useState } from 'react';\nimport { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { HintedLabel } from '@/components/HintedLabel';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Button } from '@/components/ui/button';\nimport { Field, FieldDescription } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { describedBy } from '@/helpers/describedBy';\nimport type { ConnectionFormValues, SecretName } from '../helpers/connectionForm';\n\ntype SecretFieldProps = {\n control: Control<ConnectionFormValues>;\n name: SecretName;\n label: string;\n /** What the secret is; shown behind the label's info icon with how to keep it in the environment. */\n hint: string;\n /** A value is stored on the server: show \"Stored\" with a Replace action instead of an empty input. */\n stored: boolean;\n /** The secret is read from this server environment variable (`${ENV:NAME}`). */\n envVar: string | null;\n /** One visible line under the input when it changes what the person does (an unreadable secret). */\n helper?: string | undefined;\n};\n\n/** A write-only secret: never prefilled; an empty value keeps the stored one. */\nexport const SecretField = ({ control, name, label, hint, stored, envVar, helper }: SecretFieldProps) => {\n const { t } = useTranslation();\n const { field, fieldState } = useController({ control, name: `secrets.${name}` });\n const [replacing, setReplacing] = useState(false);\n const id = `field-secrets-${name}`;\n const hintId = `${id}-hint`;\n const errorId = fieldState.error ? `${id}-error` : undefined;\n const helperId = helper ? `${id}-helper` : undefined;\n const fullHint = `${hint} ${t('publishing.deployments.secretEnvHint')}`;\n if (stored && !replacing) {\n return (\n <Field>\n <HintedLabel htmlFor={`${id}-replace`} label={label} hint={fullHint} hintId={hintId} />\n <div className=\"flex flex-wrap items-center gap-2\">\n <StatusChip\n tone=\"success\"\n label={\n envVar\n ? t('publishing.deployments.secretFromEnv', { name: envVar })\n : t('publishing.deployments.secretStored')\n }\n />\n <Button\n id={`${id}-replace`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-describedby={hintId}\n onClick={() => setReplacing(true)}\n >\n {t('publishing.deployments.replaceSecret')}\n </Button>\n </div>\n </Field>\n );\n }\n return (\n <Field data-invalid={fieldState.invalid || undefined}>\n <HintedLabel htmlFor={id} label={label} hint={fullHint} hintId={hintId} />\n <div className=\"flex gap-2\">\n <Input\n {...field}\n id={id}\n type=\"password\"\n autoComplete=\"new-password\"\n spellCheck={false}\n autoFocus={replacing}\n aria-invalid={fieldState.invalid || undefined}\n aria-describedby={describedBy(hintId, helperId, errorId)}\n className=\"font-mono text-sm\"\n />\n {stored ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => {\n field.onChange('');\n setReplacing(false);\n }}\n >\n {t('publishing.deployments.keepSecret')}\n </Button>\n ) : null}\n </div>\n {helper ? <FieldDescription id={helperId}>{helper}</FieldDescription> : null}\n <FormFieldError id={errorId} message={fieldState.error?.message} />\n </Field>\n );\n};\n","import type { DeploymentSecretState } from '@shapio/client';\nimport { useWatch, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { GITHUB_MODES, PROVIDER_FIELDS, type ConnectionFormValues } from '../helpers/connectionForm';\nimport {\n GITHUB_MODE_LABELS,\n secretHintFor,\n SECRET_LABELS,\n SETTING_HINTS,\n SETTING_LABELS,\n} from '../helpers/labels';\nimport { SecretField } from '../SecretField';\n\ntype ProviderFieldsProps = {\n control: Control<ConnectionFormValues>;\n /** Which secrets the server holds (edit); undefined when creating. */\n storedSecrets: DeploymentSecretState | undefined;\n /** The server can't read the stored secrets: a secret Shapio can generate says how to fill it. */\n secretsUnreadable?: boolean;\n};\n\n/** The chosen provider's settings and secrets. */\nexport const ProviderFields = ({\n control,\n storedSecrets,\n secretsUnreadable = false,\n}: ProviderFieldsProps) => {\n const { t } = useTranslation();\n const provider = useWatch({ control, name: 'provider' });\n const fields = PROVIDER_FIELDS[provider];\n return (\n <>\n {fields.settings.map((name) => (\n <FormTextField\n key={name}\n control={control}\n name={`settings.${name}`}\n label={t(SETTING_LABELS[name])}\n hint={name in SETTING_HINTS ? t(SETTING_HINTS[name as keyof typeof SETTING_HINTS]) : undefined}\n type={name === 'url' ? 'url' : 'text'}\n autoComplete=\"off\"\n spellCheck={false}\n />\n ))}\n {provider === 'github' ? (\n <FormSelectField\n control={control}\n name=\"settings.mode\"\n label={t(SETTING_LABELS.mode)}\n options={GITHUB_MODES.map((mode) => ({ value: mode, label: t(GITHUB_MODE_LABELS[mode]) }))}\n />\n ) : null}\n {fields.secrets.map((secret) => (\n <SecretField\n key={`${provider}-${secret.name}`}\n control={control}\n name={secret.name}\n label={t(SECRET_LABELS[secret.name])}\n hint={t(secretHintFor(provider, secret.name))}\n stored={storedSecrets?.[secret.name]?.set ?? false}\n envVar={storedSecrets?.[secret.name]?.envVar ?? null}\n helper={\n secretsUnreadable && !secret.requiredOnCreate\n ? t('publishing.deployments.secretUnreadableHelper')\n : undefined\n }\n />\n ))}\n </>\n );\n};\n","import { DEPLOYMENT_PROVIDERS, type DeploymentSecretState } from '@shapio/client';\nimport { useWatch, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormCheckboxGroup } from '@/components/FormCheckboxGroup';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { PROVIDER_LABELS, TRIGGER_POLICY_LABELS } from '../../constants';\nimport {\n triggerOptionsFor,\n type ConnectionFormMode,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\nimport { useDeliveryRoleOptions } from '../hooks/useDeliveryRoleOptions';\nimport { ProviderFields } from '../ProviderFields';\n\ntype ConnectionFormProps = {\n control: Control<ConnectionFormValues>;\n mode: ConnectionFormMode;\n storedSecrets?: DeploymentSecretState;\n /** The server can't read the stored secrets: they are entered again (or generated). */\n secretsUnreadable?: boolean;\n};\n\n/** A deployment connection's fields: provider (fixed once created), its settings and secrets, and policy. */\nexport const ConnectionForm = ({\n control,\n mode,\n storedSecrets,\n secretsUnreadable = false,\n}: ConnectionFormProps) => {\n const { t } = useTranslation();\n const provider = useWatch({ control, name: 'provider' });\n const deliveryRoleOptions = useDeliveryRoleOptions();\n return (\n <>\n <FormTextField\n control={control}\n name=\"name\"\n label={t('publishing.deployments.name')}\n autoComplete=\"off\"\n />\n {mode === 'create' ? (\n <FormSelectField\n control={control}\n name=\"provider\"\n label={t('publishing.deployments.provider')}\n options={DEPLOYMENT_PROVIDERS.map((value) => ({ value, label: t(PROVIDER_LABELS[value]) }))}\n />\n ) : null}\n <ProviderFields control={control} storedSecrets={storedSecrets} secretsUnreadable={secretsUnreadable} />\n <FormTextField\n control={control}\n name=\"previewUrlTemplate\"\n label={t('publishing.deployments.previewUrlTemplate')}\n hint={t('publishing.deployments.previewUrlTemplateHint')}\n placeholder={t('publishing.deployments.previewUrlTemplatePlaceholder')}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <FormSelectField\n control={control}\n name=\"deliveryRoleId\"\n label={t('publishing.deployments.deliveryRole')}\n hint={t('publishing.deployments.deliveryRoleHint')}\n options={deliveryRoleOptions}\n />\n <FormCheckboxGroup\n control={control}\n name=\"triggerPolicy\"\n legend={t('publishing.deployments.triggerPolicy')}\n options={triggerOptionsFor(provider).map((value) => ({\n value,\n label: t(TRIGGER_POLICY_LABELS[value]),\n }))}\n />\n <FormTextField\n control={control}\n name=\"debounceSeconds\"\n type=\"number\"\n inputMode=\"numeric\"\n min={0}\n label={t('publishing.deployments.debounceSeconds')}\n hint={t('publishing.deployments.debounceSecondsHint')}\n className=\"w-32\"\n />\n <FormSwitchField control={control} name=\"enabled\" label={t('publishing.deployments.enabled')} />\n <FormSwitchField\n control={control}\n name=\"allowPrivateNetwork\"\n label={t('publishing.fields.allowPrivateNetwork')}\n hint={t('publishing.fields.allowPrivateNetworkHint')}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DeploymentConnectionCreated } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useCreateDeploymentConnection } from '@/api/deployments';\nimport { settle } from '@/helpers/settle';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\nimport {\n connectionSchema,\n EMPTY_CONNECTION,\n toCreateConnectionInput,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\n\nconst createSchema = connectionSchema('create');\n\nexport const useCreateConnectionForm = (\n open: boolean,\n onCreated: (created: DeploymentConnectionCreated) => void,\n) => {\n const createConnection = useCreateDeploymentConnection();\n const form = useForm<ConnectionFormValues>({\n resolver: zodResolver(createSchema),\n defaultValues: EMPTY_CONNECTION,\n });\n useResetOnOpen(open, form.reset, EMPTY_CONNECTION, createConnection.reset);\n const onSubmit = form.handleSubmit(async (values) => {\n const created = await settle(createConnection.mutateAsync(toCreateConnectionInput(values)));\n if (created.ok) {\n form.reset(EMPTY_CONNECTION);\n onCreated(created.value);\n }\n });\n return { form, onSubmit, createConnection };\n};\n","import type { DeploymentConnectionCreated } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { FormSheet } from '@/components/FormSheet';\nimport { ConnectionForm } from '../ConnectionForm';\nimport { useCreateConnectionForm } from '../hooks/useCreateConnectionForm';\n\ntype CreateSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Lets the page keep focus on the secret it reveals when the sheet closes. */\n onCloseAutoFocus: (event: Event) => void;\n onCreated: (created: DeploymentConnectionCreated) => void;\n};\n\nexport const CreateSheet = ({ open, onOpenChange, onCloseAutoFocus, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createConnection } = useCreateConnectionForm(open, onCreated);\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n onCloseAutoFocus={onCloseAutoFocus}\n title={t('publishing.deployments.createTitle')}\n dirty={form.formState.isDirty}\n pending={createConnection.isPending}\n submitLabel={t('common.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <ConnectionForm control={form.control} mode=\"create\" />\n <FormError error={createConnection.error} />\n </FormSheet>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { SecretReveal } from '@/components/SecretReveal';\n\ntype GeneratedSecretRevealProps = { secret: string; onDismiss: () => void };\n\n/** A signing secret Shapio generated for a connection (on create, or replacing an unreadable one), shown once. */\nexport const GeneratedSecretReveal = ({ secret, onDismiss }: GeneratedSecretRevealProps) => {\n const { t } = useTranslation();\n return (\n <SecretReveal\n title={t('publishing.deployments.generatedSecretTitle')}\n description={t('publishing.deployments.generatedSecretDescription')}\n label={t('publishing.deployments.secretLabels.signingSecret')}\n secret={secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={onDismiss}\n />\n );\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { RUN_TRIGGER_LABELS } from '../../constants';\nimport { RunStatus } from '../RunStatus';\n\ntype RunsProps = { runs: DeploymentRun[]; showConnection: boolean };\n\n/** Deployment runs, newest first; each opens its detail page. */\nexport const Runs = ({ runs, showConnection }: RunsProps) => {\n const { t } = useTranslation();\n return (\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.deployments.run')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n {showConnection ? <TableHead>{t('publishing.deployments.connection')}</TableHead> : null}\n <TableHead>{t('publishing.deployments.trigger')}</TableHead>\n <TableHead>{t('publishing.fields.snapshot')}</TableHead>\n <TableHead>{t('publishing.deployments.finishedAt')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {runs.map((run) => (\n <TableRow key={run.id}>\n <TableCell className=\"whitespace-nowrap\">\n <RowTitle asChild>\n <Link\n to=\"/publishing/deployments/runs/$runId\"\n params={{ runId: run.id }}\n aria-label={t('publishing.deployments.openRun', {\n connection: run.connectionName,\n at: formatDateTime(run.createdAt),\n })}\n >\n {formatDateTime(run.createdAt)}\n </Link>\n </RowTitle>\n </TableCell>\n <TableCell>\n <RunStatus run={run} />\n </TableCell>\n {showConnection ? (\n <TableCell className=\"max-w-56 truncate\">{run.connectionName}</TableCell>\n ) : null}\n <TableCell>{t(RUN_TRIGGER_LABELS[run.trigger])}</TableCell>\n <TableCell className=\"tabular-nums\">\n {run.snapshot === null\n ? t('common.none')\n : t('publishing.snapshotNumber', { snapshot: run.snapshot })}\n </TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(run.finishedAt)}>\n {run.finishedAt ? formatRelativeTime(run.finishedAt) : t('common.none')}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </TableRoot>\n );\n};\n","import { Rocket } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useDeploymentRuns } from '@/api/deployments';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { QueryView } from '@/components/QueryView';\nimport { PUBLISHING_PAGE_SIZE } from '@/constants/publishing';\nimport { useCursorPager } from '../../hooks/useCursorPager';\nimport { Runs } from '../Runs';\n\ntype RunsListProps = {\n /** Runs of one connection, or of every connection when undefined. */\n connectionId: string | undefined;\n cursor: string | undefined;\n onCursorChange: (cursor: string | undefined) => void;\n};\n\n/** A page of runs (polled while any is in progress) with paging, for the body of a flush `Panel`. */\nexport const RunsList = ({ connectionId, cursor, onCursorChange }: RunsListProps) => {\n const { t } = useTranslation();\n const { pagerProps } = useCursorPager(cursor, onCursorChange);\n const runs = useDeploymentRuns({ connectionId, cursor, limit: PUBLISHING_PAGE_SIZE });\n return (\n <QueryView\n query={runs}\n isEmpty={(data) => data.items.length === 0 && cursor === undefined}\n empty={<EmptyState icon={Rocket} size=\"panel\" title={t('publishing.deployments.noRuns')} />}\n >\n {(data) => (\n <>\n <Runs runs={data.items} showConnection={connectionId === undefined} />\n <CursorPager {...pagerProps(data.nextCursor)} className=\"border-t px-4 py-2.5\" />\n </>\n )}\n </QueryView>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport { Plus, Rocket } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useDeploymentConnections } from '@/api/deployments';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { Panel } from '@/components/Panel';\nimport { QueryView } from '@/components/QueryView';\nimport { Button } from '@/components/ui/button';\nimport { Header } from '../Header';\nimport { usePublishingPermissions } from '../hooks/usePublishingPermissions';\nimport { useSecretReveal } from '../hooks/useSecretReveal';\nimport { ConnectionCard } from './ConnectionCard';\nimport { CreateSheet } from './CreateSheet';\nimport { GeneratedSecretReveal } from './GeneratedSecretReveal';\nimport { RunsList } from './RunsList';\n\n/** Deployment connections as cards (managers) and the latest runs across all of them (everyone). */\nexport const Deployments = () => {\n const { t } = useTranslation();\n const navigate = useNavigate({ from: '/publishing/deployments' });\n const { cursor } = useSearch({ from: '/app/publishing/deployments' });\n const { canManageDeployments } = usePublishingPermissions();\n const connections = useDeploymentConnections();\n const [creating, setCreating] = useState(false);\n const openConnection = (connectionId: string) =>\n void navigate({ to: '/publishing/deployments/$connectionId', params: { connectionId } });\n // A generated signing secret is shown here, then the connection opens.\n const secret = useSecretReveal(openConnection);\n return (\n <Page>\n <Header\n actions={\n canManageDeployments ? (\n <Button onClick={() => setCreating(true)}>\n <Plus aria-hidden=\"true\" />\n {t('publishing.deployments.create')}\n </Button>\n ) : undefined\n }\n />\n {secret.revealed ? (\n <GeneratedSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n {canManageDeployments ? (\n <section aria-labelledby=\"deployment-connections\" className=\"space-y-3\">\n <h2 id=\"deployment-connections\" className=\"text-base font-semibold\">\n {t('publishing.deployments.connections')}\n </h2>\n <QueryView\n query={connections}\n isEmpty={(data) => data.length === 0}\n empty={<EmptyState icon={Rocket} title={t('publishing.deployments.empty')} />}\n >\n {(data) => (\n <ul className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {data.map((connection) => (\n <li key={connection.id} className=\"grid\">\n <ConnectionCard connection={connection} />\n </li>\n ))}\n </ul>\n )}\n </QueryView>\n </section>\n ) : null}\n <Panel title={t('publishing.deployments.recentRuns')} flush>\n <RunsList\n connectionId={undefined}\n cursor={cursor}\n onCursorChange={(next) => void navigate({ search: { cursor: next } })}\n />\n </Panel>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCloseAutoFocus={secret.keepFocusOnReveal}\n onCreated={({ connection, generatedSecrets }) => {\n setCreating(false);\n const generated = generatedSecrets.signingSecret;\n if (generated) {\n secret.reveal({ id: connection.id, secret: generated });\n } else {\n openConnection(connection.id);\n }\n }}\n />\n </Page>\n );\n};\n","import { useQueryClient, type QueryKey } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { isConflict } from '@/api/errors';\n\n/**\n * Optimistic concurrency on an edit page: when a save answers 409 (someone else saved first), the latest\n * version is reloaded and the page says so, instead of overwriting their change.\n */\nexport const useConflictReload = (queryKey: QueryKey) => {\n const queryClient = useQueryClient();\n const [conflicted, setConflicted] = useState(false);\n return {\n conflicted,\n clearConflict: () => setConflicted(false),\n /** Pass as a mutation's `onError`: other errors are left to the form. */\n onSaveError: (error: unknown) => {\n if (isConflict(error)) {\n setConflicted(true);\n void queryClient.invalidateQueries({ queryKey });\n }\n },\n };\n};\n","import { cn } from '@/helpers/cn';\n\ntype JsonBlockProps = { value: unknown; label: string; className?: string };\n\n/** Pretty-printed JSON (payloads, results), scrollable and focusable so keyboard users can scroll it. */\nexport const JsonBlock = ({ value, label, className }: JsonBlockProps) => (\n <pre\n tabIndex={0}\n aria-label={label}\n className={cn(\n 'max-h-72 overflow-auto rounded-md border bg-muted p-3 font-mono text-xs break-all whitespace-pre-wrap text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50',\n className,\n )}\n >\n {typeof value === 'string' ? value : JSON.stringify(value ?? null, null, 2)}\n </pre>\n);\n","import { useTranslation } from 'react-i18next';\n\n/** Header names are protocol, not prose: they are not translated. */\nconst SIGNATURE_HEADERS = [\n { name: 'X-Shapio-Signature', valueKey: 'publishing.webhooks.signatureFormat' },\n { name: 'X-Shapio-Timestamp', valueKey: 'publishing.webhooks.timestampFormat' },\n { name: 'X-Shapio-Event', valueKey: 'publishing.webhooks.eventFormat' },\n { name: 'X-Shapio-Delivery', valueKey: 'publishing.webhooks.deliveryFormat' },\n] as const;\n\ntype SignatureHelpProps = { description: string };\n\n/** How receivers verify a request: what the signature covers, and the headers Shapio sends. */\nexport const SignatureHelp = ({ description }: SignatureHelpProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"space-y-2\">\n <p className=\"text-meta text-muted-foreground\">{description}</p>\n <dl className=\"space-y-1 rounded-lg border bg-muted p-3 font-mono text-xs break-all\">\n {SIGNATURE_HEADERS.map((header) => (\n <div key={header.name}>\n <dt className=\"inline font-semibold\">{header.name}</dt>\n <dd className=\"inline before:content-[':_']\">{t(header.valueKey)}</dd>\n </div>\n ))}\n </dl>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { CopyButton } from '@/components/CopyButton';\nimport { Field, FieldLabel } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { JsonBlock } from '../../JsonBlock';\nimport { SignatureHelp } from '../../SignatureHelp';\n\ntype CallbackHelpProps = { callbackUrl: string };\n\n/** The body a build posts back; code, not prose, so it is not translated. */\nconst CALLBACK_EXAMPLE = {\n runId: '0b8f3c1e-…',\n status: 'deployed',\n logUrl: 'https://ci.example.com/builds/123',\n siteUrl: 'https://www.example.com',\n message: 'Build 123',\n};\n\n/** How a generic-webhook site reports build progress: where to post, what to send, how to sign it. */\nexport const CallbackHelp = ({ callbackUrl }: CallbackHelpProps) => {\n const { t } = useTranslation();\n return (\n <div className=\"space-y-5\">\n <Field>\n <FieldLabel htmlFor=\"deployment-callback-url\">{t('publishing.deployments.callbackUrl')}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id=\"deployment-callback-url\"\n readOnly\n value={callbackUrl}\n className=\"font-mono text-xs\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <CopyButton value={callbackUrl} />\n </div>\n </Field>\n <div className=\"grid gap-5 lg:grid-cols-2\">\n <div className=\"min-w-0 space-y-2\">\n <p className=\"text-sm font-semibold\">{t('publishing.deployments.callbackBody')}</p>\n <JsonBlock value={CALLBACK_EXAMPLE} label={t('publishing.deployments.callbackBody')} />\n <p className=\"text-meta text-muted-foreground\">{t('publishing.deployments.callbackFields')}</p>\n </div>\n <div className=\"min-w-0 space-y-2\">\n <p className=\"text-sm font-semibold\">{t('publishing.webhooks.signatureTitle')}</p>\n <SignatureHelp description={t('publishing.deployments.callbackSignature')} />\n </div>\n </div>\n </div>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DeploymentConnection } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useUpdateDeploymentConnection } from '@/api/deployments';\nimport { isConflict } from '@/api/errors';\nimport { settle } from '@/helpers/settle';\nimport {\n connectionSchema,\n regenerableSecrets,\n toConnectionValues,\n toUpdateConnectionInput,\n type ConnectionFormValues,\n} from '../helpers/connectionForm';\n\nconst editSchema = connectionSchema('edit');\n\n/**\n * Edits one version of a connection (the form is re-created when the version changes). Saves send the\n * version they started from; a 409 goes to `onConflict`. `onSaved` receives any secret the server generated\n * (replacing one it could no longer read), for the page to show once.\n */\nexport const useEditConnectionForm = (\n connection: DeploymentConnection,\n onSaved: (generatedSecrets: Record<string, string> | undefined) => void,\n onConflict: (error: unknown) => void,\n) => {\n const { t } = useTranslation();\n const update = useUpdateDeploymentConnection();\n const form = useForm<ConnectionFormValues>({\n resolver: zodResolver(editSchema),\n defaultValues: toConnectionValues(connection),\n });\n const onSubmit = form.handleSubmit(async (values) => {\n const saved = await settle(\n update.mutateAsync(\n {\n id: connection.id,\n input: toUpdateConnectionInput(values, connection.version, regenerableSecrets(connection)),\n },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.deployments.saved'));\n onSaved(saved.value.generatedSecrets);\n }\n });\n return { form, onSubmit, update, error: isConflict(update.error) ? undefined : update.error };\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { ConnectionForm } from '../../ConnectionForm';\nimport { useEditConnectionForm } from '../../hooks/useEditConnectionForm';\n\ntype EditFormProps = {\n connection: DeploymentConnection;\n /** Receives any secret the server generated on this save, to show once. */\n onSaved: (generatedSecrets: Record<string, string> | undefined) => void;\n onConflict: (error: unknown) => void;\n};\n\nexport const EditForm = ({ connection, onSaved, onConflict }: EditFormProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, update, error } = useEditConnectionForm(connection, onSaved, onConflict);\n return (\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <UnsavedChangesGuard when={form.formState.isDirty && !update.isPending} />\n <FieldGroup>\n <ConnectionForm\n control={form.control}\n mode=\"edit\"\n storedSecrets={connection.secrets}\n secretsUnreadable={connection.secretsUnreadable}\n />\n <FormError error={error} />\n <div>\n <SubmitButton pending={update.isPending} pendingLabel={t('common.saving')}>\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n );\n};\n","import type { ConnectionTestResult } from '@shapio/client';\nimport { CheckCircle2, XCircle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';\n\ntype TestResultProps = { result: ConnectionTestResult };\n\n/** Each check of a connection test, passed or failed, with the provider's message. */\nexport const TestResult = ({ result }: TestResultProps) => {\n const { t } = useTranslation();\n return (\n <Alert variant={result.ok ? 'success' : 'destructive'}>\n {result.ok ? <CheckCircle2 aria-hidden=\"true\" /> : <XCircle aria-hidden=\"true\" />}\n <AlertTitle>\n {result.ok ? t('publishing.deployments.testPassed') : t('publishing.deployments.testFailed')}\n </AlertTitle>\n <AlertDescription>\n <ul className=\"space-y-1\">\n {result.checks.map((check) => (\n <li key={check.name}>\n <span className=\"font-medium\">\n {check.ok\n ? t('publishing.deployments.checkPassed', { name: check.name })\n : t('publishing.deployments.checkFailed', { name: check.name })}\n </span>\n {check.message ? <span className=\"block\">{check.message}</span> : null}\n </li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n );\n};\n","import type { DeploymentConnection } from '@shapio/client';\nimport { linkOptions, useNavigate, useSearch } from '@tanstack/react-router';\nimport { Loader2, PlugZap, Rocket, Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { PROVIDER_LABELS } from '../../../constants';\nimport { EnabledChip } from '../../../EnabledChip';\nimport { useConflictReload } from '../../../hooks/useConflictReload';\nimport { usePublishingPermissions } from '../../../hooks/usePublishingPermissions';\nimport { useSecretReveal } from '../../../hooks/useSecretReveal';\nimport { CallbackHelp } from '../../CallbackHelp';\nimport { GeneratedSecretReveal } from '../../GeneratedSecretReveal';\nimport { canDeployConnection } from '../../helpers/connectionState';\nimport { useConnectionActions } from '../../hooks/useConnectionActions';\nimport { RunsList } from '../../RunsList';\nimport { SecretsUnreadableChip } from '../../SecretsUnreadableChip';\nimport { EditForm } from '../EditForm';\nimport { TestResult } from '../TestResult';\n\ntype ViewProps = { connection: DeploymentConnection };\n\n/** Nothing to open after the reveal: the connection is already on screen. */\nconst stayOnPage = () => undefined;\n\n/**\n * A loaded connection: test, trigger, its runs, the callback contract (generic) and its settings. A secret\n * the server can't read is flagged in the header (its field is empty, ready to fill); a secret the server\n * generated on save is shown once at the top.\n */\nexport const View = ({ connection }: ViewProps) => {\n const { t } = useTranslation();\n const { cursor } = useSearch({ from: '/app/publishing/deployments/$connectionId' });\n const navigate = useNavigate({ from: '/publishing/deployments/$connectionId' });\n const conflict = useConflictReload(queryKeys.publishing.deployments.connection(connection.id));\n const actions = useConnectionActions(connection);\n const { canTriggerDeployments } = usePublishingPermissions();\n const secret = useSecretReveal(stayOnPage);\n const onSaved = (generatedSecrets: Record<string, string> | undefined) => {\n conflict.clearConflict();\n const generated = generatedSecrets?.signingSecret;\n if (generated) {\n secret.reveal({ id: connection.id, secret: generated });\n }\n };\n const busy = actions.testing || actions.triggering || actions.deleting;\n const snapshot = connection.currentRun?.snapshot;\n const meta = [\n t(PROVIDER_LABELS[connection.provider]),\n snapshot != null\n ? t('publishing.deployments.liveSnapshot', { snapshot: t('publishing.snapshotNumber', { snapshot }) })\n : '',\n ]\n .filter(Boolean)\n .join(' · ');\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.deployments'), link: linkOptions({ to: '/publishing/deployments' }) },\n ]}\n title={connection.name}\n badge={\n <>\n <EnabledChip enabled={connection.enabled} />\n <SecretsUnreadableChip unreadable={connection.secretsUnreadable} />\n </>\n }\n meta={meta}\n actions={\n <>\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.deployments.deleteTitle', { name: connection.name })}\n description={t('publishing.deployments.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={actions.remove}\n trigger={\n <Button variant=\"destructive-ghost\" disabled={busy}>\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </Button>\n }\n />\n <Button variant=\"outline\" disabled={busy} onClick={actions.runTest}>\n {actions.testing ? (\n <Loader2 aria-hidden=\"true\" className=\"animate-spin motion-reduce:animate-none\" />\n ) : (\n <PlugZap aria-hidden=\"true\" />\n )}\n {t('publishing.deployments.test')}\n </Button>\n {canTriggerDeployments ? (\n <Button disabled={busy || !canDeployConnection(connection)} onClick={actions.triggerRun}>\n <Rocket aria-hidden=\"true\" />\n {t('publishing.deployments.triggerRun')}\n </Button>\n ) : null}\n </>\n }\n />\n {secret.revealed ? (\n <GeneratedSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n {actions.testResult ? <TestResult result={actions.testResult} /> : null}\n <Panel title={t('publishing.deployments.runs')} flush>\n <RunsList\n connectionId={connection.id}\n cursor={cursor}\n onCursorChange={(next) => void navigate({ search: { cursor: next } })}\n />\n </Panel>\n {connection.provider === 'generic_webhook' ? (\n <Panel\n title={t('publishing.deployments.callbacks')}\n description={t('publishing.deployments.callbacksDescription')}\n >\n <CallbackHelp callbackUrl={connection.callbackUrl} />\n </Panel>\n ) : null}\n <Panel title={t('publishing.deployments.settings')} bodyClassName=\"space-y-4\">\n {conflict.conflicted ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{t('publishing.conflictReloaded')}</AlertDescription>\n </Alert>\n ) : null}\n <EditForm\n key={connection.version}\n connection={connection}\n onSaved={onSaved}\n onConflict={conflict.onSaveError}\n />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useDeploymentConnection } from '@/api/deployments';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One deployment connection. */\nexport const Connection = () => {\n const { connectionId } = useParams({ from: '/app/publishing/deployments/$connectionId' });\n const connection = useDeploymentConnection(connectionId);\n return (\n <QueryView query={connection} loadingRows={6}>\n {(data) => <View connection={data} />}\n </QueryView>\n );\n};\n","/**\n * Only http(s) links are rendered. Log and site URLs come from build callbacks and providers, so a\n * `javascript:` or `data:` URL must never become a clickable link in the admin.\n */\nexport const safeExternalUrl = (value: string | null | undefined): string | undefined => {\n if (!value) {\n return undefined;\n }\n try {\n const url = new URL(value);\n return url.protocol === 'https:' || url.protocol === 'http:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { TIMELINE_SOURCE_LABELS } from '../../../constants';\nimport { RunStatus } from '../../RunStatus';\n\ntype TimelineProps = { run: DeploymentRun };\n\n/** Every status the run went through, oldest first, with who reported it. */\nexport const Timeline = ({ run }: TimelineProps) => {\n const { t } = useTranslation();\n if (run.timeline.length === 0) {\n return <p className=\"text-sm text-muted-foreground\">{t('publishing.deployments.timelineEmpty')}</p>;\n }\n return (\n <ol aria-label={t('publishing.deployments.timeline')} className=\"relative ml-1.5 space-y-4 border-l pl-6\">\n {run.timeline.map((event, index) => (\n <li key={`${event.at}-${index}`} className=\"relative\">\n <span\n aria-hidden=\"true\"\n className=\"absolute top-2 -left-7.5 size-2.5 rounded-full border-2 border-card bg-primary\"\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <RunStatus\n run={{\n status: event.status,\n provider: run.provider,\n completionReported: run.completionReported,\n }}\n live={false}\n />\n <time dateTime={event.at} className=\"text-sm\">\n {formatDateTime(event.at)}\n </time>\n <span className=\"text-meta text-muted-foreground\">\n {t('publishing.deployments.reportedBy', { source: t(TIMELINE_SOURCE_LABELS[event.source]) })}\n </span>\n </div>\n {event.message ? <p className=\"mt-1 text-sm break-words\">{event.message}</p> : null}\n </li>\n ))}\n </ol>\n );\n};\n","import type { DeploymentRun } from '@shapio/client';\nimport { linkOptions, useNavigate } from '@tanstack/react-router';\nimport { AlertCircle, Info, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useRetryDeploymentRun } from '@/api/deployments';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { TextLink } from '@/components/TextLink';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { ACTIVE_RUN_STATUSES } from '@/constants/publishing';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { PROVIDER_LABELS, RUN_TRIGGER_LABELS } from '../../../constants';\nimport { DetailList, type DetailItem } from '../../../DetailList';\nimport { ExternalLink } from '../../../ExternalLink';\nimport { safeExternalUrl } from '../../../helpers/safeExternalUrl';\nimport { usePublishingPermissions } from '../../../hooks/usePublishingPermissions';\nimport { RunStatus } from '../../RunStatus';\nimport { Timeline } from '../Timeline';\n\ntype ViewProps = { run: DeploymentRun };\n\n/** A loaded run: honest status, links, error, timeline and retry. */\nexport const View = ({ run }: ViewProps) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { canTriggerDeployments } = usePublishingPermissions();\n const retry = useRetryDeploymentRun();\n const none = t('common.none');\n const logUrl = safeExternalUrl(run.logUrl);\n const siteUrl = safeExternalUrl(run.siteUrl);\n const active = ACTIVE_RUN_STATUSES.has(run.status);\n const details: DetailItem[] = [\n { label: t('publishing.deployments.connection'), value: run.connectionName },\n { label: t('publishing.deployments.provider'), value: t(PROVIDER_LABELS[run.provider]) },\n { label: t('publishing.deployments.trigger'), value: t(RUN_TRIGGER_LABELS[run.trigger]) },\n {\n label: t('publishing.fields.snapshot'),\n value: run.snapshot === null ? none : t('publishing.snapshotNumber', { snapshot: run.snapshot }),\n },\n { label: t('publishing.deployments.schemaVersion'), value: run.schemaVersion ?? none },\n { label: t('publishing.deployments.providerRef'), value: run.providerRef ?? none },\n { label: t('publishing.deployments.triggeredAt'), value: formatDateTime(run.triggeredAt) || none },\n { label: t('publishing.deployments.finishedAt'), value: formatDateTime(run.finishedAt) || none },\n {\n label: t('publishing.deployments.logUrl'),\n value: logUrl ? <ExternalLink href={logUrl}>{logUrl}</ExternalLink> : none,\n },\n {\n label: t('publishing.deployments.siteUrl'),\n value: siteUrl ? <ExternalLink href={siteUrl}>{siteUrl}</ExternalLink> : none,\n },\n ];\n if (run.retryOf) {\n details.push({\n label: t('publishing.deployments.retryOf'),\n value: (\n <TextLink to=\"/publishing/deployments/runs/$runId\" params={{ runId: run.retryOf }}>\n {t('publishing.deployments.previousRun')}\n </TextLink>\n ),\n });\n }\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.deployments'), link: linkOptions({ to: '/publishing/deployments' }) },\n {\n label: run.connectionName,\n link: linkOptions({\n to: '/publishing/deployments/$connectionId',\n params: { connectionId: run.connectionId },\n }),\n },\n ]}\n title={t('publishing.deployments.runTitle', { connection: run.connectionName })}\n badge={\n <span aria-live=\"polite\">\n <RunStatus run={run} />\n </span>\n }\n meta={\n active\n ? `${formatDateTime(run.createdAt)} · ${t('publishing.deployments.watching')}`\n : formatDateTime(run.createdAt)\n }\n actions={\n canTriggerDeployments && !active ? (\n <Button\n variant=\"outline\"\n disabled={retry.isPending}\n onClick={() =>\n retry.mutate(run.id, {\n onSuccess: (next) => {\n toast.success(t('publishing.deployments.retried'));\n void navigate({ to: '/publishing/deployments/runs/$runId', params: { runId: next.id } });\n },\n })\n }\n >\n <RotateCcw aria-hidden=\"true\" />\n {t('publishing.deployments.retry')}\n </Button>\n ) : undefined\n }\n />\n {run.status === 'triggered' && !run.completionReported ? (\n <Alert variant=\"info\">\n <Info aria-hidden=\"true\" />\n <AlertDescription>{t('publishing.deployments.completionUnknown')}</AlertDescription>\n </Alert>\n ) : null}\n {run.error ? (\n <Alert variant=\"destructive\">\n <AlertCircle aria-hidden=\"true\" />\n <AlertDescription>{run.error}</AlertDescription>\n </Alert>\n ) : null}\n <Panel title={t('publishing.deployments.details')}>\n <DetailList items={details} />\n </Panel>\n <Panel title={t('publishing.deployments.timeline')}>\n <Timeline run={run} />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useDeploymentRun } from '@/api/deployments';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One deployment run, polled until it finishes. */\nexport const Run = () => {\n const { runId } = useParams({ from: '/app/publishing/deployments/runs/$runId' });\n const run = useDeploymentRun(runId);\n return (\n <QueryView query={run} loadingRows={6}>\n {(data) => <View run={data} />}\n </QueryView>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\n\ntype StatusFilterProps<TStatus extends string> = {\n id: string;\n label: string;\n value: TStatus | undefined;\n options: readonly { value: TStatus; label: string }[];\n onChange: (value: TStatus | undefined) => void;\n allLabel?: string;\n};\n\nconst ALL = '__all';\n\n/** A compact \"Status: All\" select for a table's toolbar; the label is part of the control and its name. */\nexport const StatusFilter = <TStatus extends string>({\n id,\n label,\n value,\n options,\n onChange,\n allLabel,\n}: StatusFilterProps<TStatus>) => {\n const { t } = useTranslation();\n const labelId = `${id}-label`;\n return (\n <Select\n value={value ?? ALL}\n onValueChange={(next) => onChange(options.find((option) => option.value === next)?.value)}\n >\n <SelectTrigger id={id} size=\"sm\" aria-labelledby={labelId} className=\"min-w-40\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span id={labelId} className=\"text-muted-foreground\">\n {label}\n </span>\n <SelectValue />\n </span>\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>{allLabel ?? t('publishing.filters.all')}</SelectItem>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n};\n","import { PUBLICATION_ACTIONS, type PublicationAction } from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\n/** The locale select's \"no locale\" choice: non-localized models and the default locale. */\nexport const DEFAULT_LOCALE = '__default';\n\n/** Which entry (and locale) to publish or unpublish: scheduled publications. */\nexport const entryTargetShape = {\n modelKey: z.string().min(1, 'validation.selectModel'),\n entryId: requiredText(),\n locale: z.string(),\n action: z.enum(PUBLICATION_ACTIONS),\n};\n\nexport type EntryTargetValues = {\n modelKey: string;\n entryId: string;\n locale: string;\n action: PublicationAction;\n};\n\nexport const EMPTY_ENTRY_TARGET: EntryTargetValues = {\n modelKey: '',\n entryId: '',\n locale: DEFAULT_LOCALE,\n action: 'publish',\n};\n\nexport const toEntryTarget = ({ modelKey, entryId, locale, action }: EntryTargetValues) => ({\n modelKey,\n entryId: entryId.trim(),\n action,\n ...(locale === DEFAULT_LOCALE ? {} : { locale }),\n});\n","import { PUBLICATION_ACTIONS } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useLocales } from '@/api/locales';\nimport { useDefinitions } from '@/api/schema';\nimport { PUBLICATION_ACTION_LABELS } from '../constants';\nimport { DEFAULT_LOCALE } from '../helpers/entryTarget';\n\n/** Select options for the entry target fields: the models, the locales and the two actions. */\nexport const useEntryTargetOptions = () => {\n const { t } = useTranslation();\n const models = useDefinitions('model');\n const locales = useLocales();\n const modelOptions = (models.data ?? []).map(({ definition }) => ({\n value: definition.apiKey,\n label: `${definition.label} (${definition.apiKey})`,\n }));\n const localeOptions = [\n { value: DEFAULT_LOCALE, label: t('publishing.fields.defaultLocale') },\n ...(locales.data ?? []).map((locale) => ({\n value: locale.code,\n label: `${locale.label} (${locale.code})`,\n })),\n ];\n const actionOptions = PUBLICATION_ACTIONS.map((action) => ({\n value: action,\n label: t(PUBLICATION_ACTION_LABELS[action]),\n }));\n return { modelOptions, localeOptions, actionOptions };\n};\n","import type { Control, FieldPath, FieldValues } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSelectField } from '@/components/FormSelectField';\nimport { FormTextField } from '@/components/FormTextField';\nimport type { EntryTargetValues } from '../helpers/entryTarget';\nimport { useEntryTargetOptions } from '../hooks/useEntryTargetOptions';\n\ntype EntryTargetFieldsProps<TValues extends FieldValues & EntryTargetValues> = {\n control: Control<TValues>;\n};\n\n/** Model, entry ID, locale and action: the entry a scheduled publication acts on. */\nexport const EntryTargetFields = <TValues extends FieldValues & EntryTargetValues>({\n control,\n}: EntryTargetFieldsProps<TValues>) => {\n const { t } = useTranslation();\n const { modelOptions, localeOptions, actionOptions } = useEntryTargetOptions();\n const path = (name: keyof EntryTargetValues) => name as FieldPath<TValues>;\n return (\n <>\n <FormSelectField\n control={control}\n name={path('modelKey')}\n label={t('publishing.fields.model')}\n placeholder={t('publishing.fields.modelPlaceholder')}\n options={modelOptions}\n />\n <FormTextField\n control={control}\n name={path('entryId')}\n label={t('publishing.fields.entryId')}\n hint={t('publishing.fields.entryIdHint')}\n autoComplete=\"off\"\n className=\"font-mono text-sm\"\n />\n <FormSelectField\n control={control}\n name={path('locale')}\n label={t('publishing.fields.locale')}\n hint={t('publishing.fields.localeHint')}\n options={localeOptions}\n />\n <FormSelectField\n control={control}\n name={path('action')}\n label={t('publishing.fields.action')}\n options={actionOptions}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { z } from 'zod';\nimport { useCreateSchedule } from '@/api/schedules';\nimport { settle } from '@/helpers/settle';\nimport { dateTimeLocalField, dateTimeLocalToIso, defaultScheduleValue } from '../../helpers/dateTimeLocal';\nimport { EMPTY_ENTRY_TARGET, entryTargetShape, toEntryTarget } from '../../helpers/entryTarget';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\n\nconst createScheduleSchema = z.object({ ...entryTargetShape, runAt: dateTimeLocalField() });\n\ntype CreateScheduleValues = z.infer<typeof createScheduleSchema>;\n\nexport const useCreateScheduleForm = (open: boolean, onCreated: () => void) => {\n const createSchedule = useCreateSchedule();\n const defaults = useMemo<CreateScheduleValues>(\n () => ({ ...EMPTY_ENTRY_TARGET, runAt: open ? defaultScheduleValue() : '' }),\n [open],\n );\n const form = useForm<CreateScheduleValues>({\n resolver: zodResolver(createScheduleSchema),\n defaultValues: defaults,\n });\n useResetOnOpen(open, form.reset, defaults, createSchedule.reset);\n const onSubmit = form.handleSubmit(async ({ runAt, ...target }) => {\n const iso = dateTimeLocalToIso(runAt);\n if (!iso) {\n return;\n }\n const created = await settle(createSchedule.mutateAsync({ ...toEntryTarget(target), runAt: iso }));\n if (created.ok) {\n onCreated();\n }\n });\n return { form, onSubmit, createSchedule };\n};\n","import { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { FormSheet } from '@/components/FormSheet';\nimport { FormTextField } from '@/components/FormTextField';\nimport { EntryTargetFields } from '../../EntryTargetFields';\nimport { useCreateScheduleForm } from '../hooks/useCreateScheduleForm';\n\ntype CreateSheetProps = { open: boolean; onOpenChange: (open: boolean) => void; onCreated: () => void };\n\nexport const CreateSheet = ({ open, onOpenChange, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createSchedule } = useCreateScheduleForm(open, onCreated);\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n title={t('publishing.scheduled.createTitle')}\n dirty={form.formState.isDirty}\n pending={createSchedule.isPending}\n submitLabel={t('publishing.scheduled.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <EntryTargetFields control={form.control} />\n <FormTextField\n control={form.control}\n name=\"runAt\"\n type=\"datetime-local\"\n label={t('publishing.fields.runAt')}\n description={t('publishing.fields.localTimeHint', {\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n })}\n />\n <FormError error={createSchedule.error} />\n </FormSheet>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport type { SchedulesSearch } from '@/app/searchSchemas';\nimport { useCursorPager } from '../../hooks/useCursorPager';\n\n/** The status filter and page cursor live in the URL (bookmarkable, back-button friendly). */\nexport const useScheduledSearch = () => {\n const search = useSearch({ from: '/app/publishing/scheduled' });\n const navigate = useNavigate({ from: '/publishing/scheduled' });\n const go = (changes: Partial<SchedulesSearch>) =>\n void navigate({ search: (previous) => ({ ...previous, ...changes }) });\n const { pagerProps, resetPager } = useCursorPager(search.cursor, (cursor) => go({ cursor }));\n return {\n search,\n pagerProps,\n setStatus: (status: SchedulesSearch['status']) => {\n resetPager();\n go({ status, cursor: undefined });\n },\n };\n};\n","import type { ScheduledPublication } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Button } from '@/components/ui/button';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { PUBLICATION_ACTION_LABELS } from '../../constants';\nimport { SCHEDULE_STATUS_DISPLAY } from '../../helpers/statusDisplay';\n\ntype TableProps = {\n schedules: ScheduledPublication[];\n /** Cancels after an inline confirmation; the promise keeps it open until the request settles. */\n onCancel: (schedule: ScheduledPublication) => Promise<unknown>;\n};\n\nexport const Table = ({ schedules, onCancel }: TableProps) => {\n const { t } = useTranslation();\n return (\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.fields.entryId')}</TableHead>\n <TableHead>{t('publishing.fields.model')}</TableHead>\n <TableHead>{t('publishing.fields.locale')}</TableHead>\n <TableHead>{t('publishing.fields.action')}</TableHead>\n <TableHead>{t('publishing.fields.runAt')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n <TableHead>{t('publishing.fields.error')}</TableHead>\n <TableHead>\n <span className=\"sr-only\">{t('common.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {schedules.map((schedule) => {\n const status = SCHEDULE_STATUS_DISPLAY[schedule.status];\n return (\n <TableRow key={schedule.id}>\n <TableCell className=\"max-w-44\">\n <RowTitle className=\"block truncate font-mono text-xs\">\n <span title={schedule.entryId}>{schedule.entryId}</span>\n </RowTitle>\n </TableCell>\n <TableCell className=\"font-mono text-xs\">\n {schedule.modelKey ?? t('publishing.fields.deletedModel')}\n </TableCell>\n <TableCell className=\"font-mono text-xs\">{schedule.locale}</TableCell>\n <TableCell>{t(PUBLICATION_ACTION_LABELS[schedule.action])}</TableCell>\n <TableCell className=\"whitespace-nowrap\">{formatDateTime(schedule.runAt)}</TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n </TableCell>\n <TableCell className=\"max-w-64 whitespace-normal\">\n {schedule.error ? (\n <span className=\"text-destructive\">{schedule.error}</span>\n ) : (\n <span className=\"text-muted-foreground\">{t('common.none')}</span>\n )}\n </TableCell>\n <TableCell className=\"text-right\">\n {schedule.status === 'scheduled' ? (\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.scheduled.cancelTitle')}\n description={t('publishing.scheduled.cancelDescription', { entryId: schedule.entryId })}\n confirmLabel={t('publishing.scheduled.cancel')}\n cancelLabel={t('publishing.scheduled.keep')}\n onConfirm={() => onCancel(schedule)}\n trigger={\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={t('publishing.scheduled.cancelLabel', { entryId: schedule.entryId })}\n >\n {t('publishing.scheduled.cancel')}\n </Button>\n }\n />\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </TableRoot>\n );\n};\n","import { SCHEDULE_STATUSES, type ScheduledPublication } from '@shapio/client';\nimport { CalendarClock, CalendarPlus } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useCancelSchedule, useSchedules } from '@/api/schedules';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { QueryView } from '@/components/QueryView';\nimport { TableCard } from '@/components/TableCard';\nimport { Button } from '@/components/ui/button';\nimport { PUBLISHING_PAGE_SIZE } from '@/constants/publishing';\nimport { Header } from '../Header';\nimport { SCHEDULE_STATUS_DISPLAY } from '../helpers/statusDisplay';\nimport { StatusFilter } from '../StatusFilter';\nimport { CreateSheet } from './CreateSheet';\nimport { useScheduledSearch } from './hooks/useScheduledSearch';\nimport { Table } from './Table';\n\n/** Every scheduled publish and unpublish, with its outcome once it has run. */\nexport const Scheduled = () => {\n const { t } = useTranslation();\n const { search, pagerProps, setStatus } = useScheduledSearch();\n const schedules = useSchedules({\n status: search.status,\n cursor: search.cursor,\n limit: PUBLISHING_PAGE_SIZE,\n });\n const cancel = useCancelSchedule();\n const [creating, setCreating] = useState(false);\n const cancelSchedule = (schedule: ScheduledPublication) =>\n cancel.mutateAsync(schedule.id, {\n onSuccess: () => toast.success(t('publishing.scheduled.canceled')),\n });\n const statusOptions = SCHEDULE_STATUSES.map((status) => ({\n value: status,\n label: t(SCHEDULE_STATUS_DISPLAY[status].labelKey),\n }));\n const filters = (\n <div role=\"search\" className=\"flex flex-wrap items-center gap-2\">\n <StatusFilter\n id=\"scheduled-status\"\n label={t('publishing.fields.status')}\n value={search.status}\n options={statusOptions}\n onChange={setStatus}\n />\n </div>\n );\n return (\n <Page>\n <Header\n actions={\n <Button onClick={() => setCreating(true)}>\n <CalendarPlus aria-hidden=\"true\" />\n {t('publishing.scheduled.create')}\n </Button>\n }\n />\n <QueryView\n query={schedules}\n loadingRows={6}\n isEmpty={(data) => data.items.length === 0 && search.cursor === undefined && !search.status}\n empty={<EmptyState icon={CalendarClock} title={t('publishing.scheduled.empty')} />}\n >\n {(data) => (\n <TableCard toolbar={filters} footer={<CursorPager {...pagerProps(data.nextCursor)} />}>\n {data.items.length === 0 ? (\n <EmptyState icon={CalendarClock} size=\"panel\" title={t('publishing.scheduled.noMatches')} />\n ) : (\n <Table schedules={data.items} onCancel={cancelSchedule} />\n )}\n </TableCard>\n )}\n </QueryView>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCreated={() => {\n setCreating(false);\n toast.success(t('publishing.scheduled.created'));\n }}\n />\n </Page>\n );\n};\n","import type { WebhookEventType } from '@shapio/client';\n\nexport type EventGroup = { group: string; types: string[] };\n\n/** `content.*`: every event of a group, including ones added in later Shapio versions. */\nexport const groupPattern = (group: string) => `${group}.*`;\n\n/** The catalog grouped for display, in the server's order. */\nexport const groupEvents = (events: readonly WebhookEventType[]): EventGroup[] => {\n const groups = new Map<string, string[]>();\n for (const { type, group } of events) {\n groups.set(group, [...(groups.get(group) ?? []), type]);\n }\n return [...groups].map(([group, types]) => ({ group, types }));\n};\n\n/** Selecting a whole group replaces its individual types with the pattern (the server would match both). */\nexport const toggleGroup = (selected: readonly string[], { group, types }: EventGroup, checked: boolean) => {\n const pattern = groupPattern(group);\n const others = selected.filter((value) => value !== pattern && !types.includes(value));\n return checked ? [...others, pattern] : others;\n};\n\nexport const toggleEvent = (selected: readonly string[], type: string, checked: boolean) =>\n checked\n ? [...selected.filter((value) => value !== type), type]\n : selected.filter((value) => value !== type);\n","import { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useWebhookEvents } from '@/api/webhooks';\nimport { ErrorState } from '@/components/ErrorState';\nimport { FormFieldError } from '@/components/FormFieldError';\nimport { InfoHint } from '@/components/InfoHint';\nimport { LoadingState } from '@/components/LoadingState';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { Field, FieldLabel, FieldLegend, FieldSet } from '@/components/ui/field';\nimport { groupEvents, groupPattern, toggleEvent, toggleGroup } from '../../helpers/webhookEvents';\nimport type { WebhookFormValues } from '../helpers';\n\ntype EventsFieldProps = { control: Control<WebhookFormValues> };\n\n/** The events a webhook receives, grouped; \"all <group> events\" subscribes to future ones too. */\nexport const EventsField = ({ control }: EventsFieldProps) => {\n const { t } = useTranslation();\n const catalog = useWebhookEvents();\n const { field, fieldState } = useController({ control, name: 'events' });\n const selected = field.value;\n if (catalog.isPending) {\n return <LoadingState rows={2} />;\n }\n if (catalog.isError) {\n return <ErrorState error={catalog.error} onRetry={() => void catalog.refetch()} />;\n }\n return (\n <FieldSet data-invalid={fieldState.invalid || undefined} aria-labelledby=\"webhook-events-title\">\n <FieldLegend variant=\"label\" className=\"flex items-center gap-1\">\n <span id=\"webhook-events-title\">{t('publishing.webhooks.events')}</span>\n <InfoHint about={t('publishing.webhooks.events')}>{t('publishing.webhooks.eventsHint')}</InfoHint>\n </FieldLegend>\n <div className=\"space-y-4\">\n {groupEvents(catalog.data).map((group) => {\n const groupSelected = selected.includes(groupPattern(group.group));\n const groupId = `webhook-events-${group.group}`;\n return (\n <fieldset key={group.group} className=\"space-y-2 rounded-lg border p-3\">\n <legend className=\"px-1 font-mono text-xs font-semibold\">{group.group}</legend>\n <Field orientation=\"horizontal\">\n <Checkbox\n id={groupId}\n checked={groupSelected}\n onCheckedChange={(checked) =>\n field.onChange(toggleGroup(selected, group, checked === true))\n }\n onBlur={field.onBlur}\n />\n <FieldLabel htmlFor={groupId} className=\"font-medium\">\n {t('publishing.webhooks.allGroupEvents', { group: group.group })}\n </FieldLabel>\n </Field>\n <div className=\"grid gap-2 pl-6 sm:grid-cols-2\">\n {group.types.map((type) => {\n const id = `webhook-event-${type}`;\n return (\n <Field key={type} orientation=\"horizontal\">\n <Checkbox\n id={id}\n checked={groupSelected || selected.includes(type)}\n disabled={groupSelected}\n onCheckedChange={(checked) =>\n field.onChange(toggleEvent(selected, type, checked === true))\n }\n onBlur={field.onBlur}\n />\n <FieldLabel htmlFor={id} className=\"font-mono text-xs font-normal\">\n {type}\n </FieldLabel>\n </Field>\n );\n })}\n </div>\n </fieldset>\n );\n })}\n </div>\n <FormFieldError message={fieldState.error?.message} />\n </FieldSet>\n );\n};\n","import type { CreateWebhookInput, Webhook } from '@shapio/client';\nimport { z } from 'zod';\nimport { requiredText } from '@/helpers/validation';\n\nexport const MAX_ATTEMPTS_RANGE = { min: 1, max: 20 } as const;\n\nconst DEFAULT_MAX_ATTEMPTS = 8;\n\nconst inRange = (value: string) =>\n /^\\d+$/.test(value) && Number(value) >= MAX_ATTEMPTS_RANGE.min && Number(value) <= MAX_ATTEMPTS_RANGE.max;\n\nexport const webhookSchema = z.object({\n name: requiredText().max(200, 'validation.tooLong'),\n url: z\n .string()\n .trim()\n .min(1, 'validation.required')\n .pipe(z.url({ protocol: /^https?$/, error: 'validation.url' })),\n events: z.array(z.string()).min(1, 'validation.selectEvents'),\n enabled: z.boolean(),\n allowPrivateNetwork: z.boolean(),\n maxAttempts: z.string().trim().refine(inRange, 'validation.maxAttempts'),\n /** Chosen on create only (fixed afterwards): `site` this site's events, `network` every site's. */\n scope: z.enum(['site', 'network']),\n});\n\nexport type WebhookFormValues = z.infer<typeof webhookSchema>;\n\nexport const EMPTY_WEBHOOK: WebhookFormValues = {\n name: '',\n url: '',\n events: [],\n enabled: true,\n allowPrivateNetwork: false,\n maxAttempts: String(DEFAULT_MAX_ATTEMPTS),\n scope: 'site',\n};\n\nexport const toWebhookValues = (webhook: Webhook): WebhookFormValues => ({\n name: webhook.name,\n url: webhook.url,\n events: webhook.events,\n enabled: webhook.enabled,\n allowPrivateNetwork: webhook.allowPrivateNetwork,\n maxAttempts: String(webhook.maxAttempts),\n scope: webhook.site === null ? 'network' : 'site',\n});\n\nexport const toWebhookInput = (values: WebhookFormValues): CreateWebhookInput => ({\n name: values.name.trim(),\n url: values.url.trim(),\n events: values.events,\n enabled: values.enabled,\n allowPrivateNetwork: values.allowPrivateNetwork,\n maxAttempts: Number(values.maxAttempts),\n});\n","import type { Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { EventsField } from '../EventsField';\nimport { MAX_ATTEMPTS_RANGE, type WebhookFormValues } from '../helpers';\n\ntype FieldsProps = { control: Control<WebhookFormValues> };\n\n/** A webhook's settings, shared by the create sheet and the edit form. */\nexport const Fields = ({ control }: FieldsProps) => {\n const { t } = useTranslation();\n return (\n <>\n <FormTextField control={control} name=\"name\" label={t('publishing.webhooks.name')} autoComplete=\"off\" />\n <FormTextField\n control={control}\n name=\"url\"\n type=\"url\"\n label={t('publishing.webhooks.url')}\n placeholder={t('publishing.webhooks.urlPlaceholder')}\n autoComplete=\"off\"\n />\n <EventsField control={control} />\n <FormTextField\n control={control}\n name=\"maxAttempts\"\n type=\"number\"\n inputMode=\"numeric\"\n min={MAX_ATTEMPTS_RANGE.min}\n max={MAX_ATTEMPTS_RANGE.max}\n label={t('publishing.webhooks.maxAttempts')}\n hint={t('publishing.webhooks.maxAttemptsHint')}\n className=\"w-32\"\n />\n <FormSwitchField control={control} name=\"enabled\" label={t('publishing.webhooks.enabled')} />\n <FormSwitchField\n control={control}\n name=\"allowPrivateNetwork\"\n label={t('publishing.fields.allowPrivateNetwork')}\n hint={t('publishing.fields.allowPrivateNetworkHint')}\n />\n </>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { WebhookWithSecret } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useCreateWebhook } from '@/api/webhooks';\nimport { settle } from '@/helpers/settle';\nimport { useResetOnOpen } from '../../hooks/useResetOnOpen';\nimport { EMPTY_WEBHOOK, toWebhookInput, webhookSchema, type WebhookFormValues } from '../helpers';\n\nexport const useCreateWebhookForm = (open: boolean, onCreated: (created: WebhookWithSecret) => void) => {\n const createWebhook = useCreateWebhook();\n const form = useForm<WebhookFormValues>({\n resolver: zodResolver(webhookSchema),\n defaultValues: EMPTY_WEBHOOK,\n });\n useResetOnOpen(open, form.reset, EMPTY_WEBHOOK, createWebhook.reset);\n const onSubmit = form.handleSubmit(async (values) => {\n const created = await settle(\n createWebhook.mutateAsync({ ...toWebhookInput(values), network: values.scope === 'network' }),\n );\n if (created.ok) {\n form.reset(EMPTY_WEBHOOK);\n onCreated(created.value);\n }\n });\n return { form, onSubmit, createWebhook };\n};\n","import type { WebhookWithSecret } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { useMe } from '@/api/auth';\nimport { FormError } from '@/components/FormError';\nimport { FormRadioGroup } from '@/components/FormRadioGroup';\nimport { FormSheet } from '@/components/FormSheet';\nimport { canSeeNetwork } from '@/helpers/sites';\nimport { Fields } from '../Fields';\nimport { useCreateWebhookForm } from '../hooks/useCreateWebhookForm';\n\ntype CreateSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Lets the page keep focus on the secret it reveals when the sheet closes. */\n onCloseAutoFocus: (event: Event) => void;\n onCreated: (created: WebhookWithSecret) => void;\n};\n\nexport const CreateSheet = ({ open, onOpenChange, onCloseAutoFocus, onCreated }: CreateSheetProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, createWebhook } = useCreateWebhookForm(open, onCreated);\n const { data: me } = useMe();\n // A network webhook needs `webhooks.manage` on every site; `me` can't say that exactly, so it is offered to\n // network admins and the server's answer (403) is shown if it refuses.\n const scopeOptions = [\n { value: 'site', label: t('publishing.webhooks.scopeSite', { name: me?.site.name ?? '' }) },\n { value: 'network', label: t('sites.everySite'), description: t('publishing.webhooks.scopeNetwork') },\n ];\n return (\n <FormSheet\n open={open}\n onOpenChange={onOpenChange}\n size=\"md\"\n onCloseAutoFocus={onCloseAutoFocus}\n title={t('publishing.webhooks.createTitle')}\n dirty={form.formState.isDirty}\n pending={createWebhook.isPending}\n submitLabel={t('common.create')}\n pendingLabel={t('common.saving')}\n onSubmit={(event) => void onSubmit(event)}\n >\n <Fields control={form.control} />\n {canSeeNetwork(me) ? (\n <FormRadioGroup\n control={form.control}\n name=\"scope\"\n legend={t('publishing.webhooks.scope')}\n options={scopeOptions}\n />\n ) : null}\n <FormError error={createWebhook.error} />\n </FormSheet>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { SecretReveal } from '@/components/SecretReveal';\nimport { SignatureHelp } from '../../SignatureHelp';\n\ntype SigningSecretRevealProps = { secret: string; onDismiss: () => void };\n\n/** A webhook's signing secret, shown once at the top of the page after creating it or rotating it. */\nexport const SigningSecretReveal = ({ secret, onDismiss }: SigningSecretRevealProps) => {\n const { t } = useTranslation();\n return (\n <SecretReveal\n title={t('publishing.webhooks.secretTitle')}\n description={t('publishing.webhooks.secretDescription')}\n label={t('publishing.webhooks.secretLabel')}\n secret={secret}\n dismissLabel={t('publishing.secretDone')}\n onDismiss={onDismiss}\n hint={<SignatureHelp description={t('publishing.webhooks.signatureDescription')} />}\n />\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { Badge } from '@/components/ui/badge';\n\ntype SiteBadgeProps = { webhook: Pick<Webhook, 'site'> };\n\n/** \"Every site\" on a network webhook (it receives every site's events); nothing on this site's own. */\nexport const SiteBadge = ({ webhook }: SiteBadgeProps) => {\n const { t } = useTranslation();\n return webhook.site === null ? <Badge variant=\"secondary\">{t('sites.everySite')}</Badge> : null;\n};\n","import type { Webhook } from '@shapio/client';\nimport { Link } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { RowTitle } from '@/components/RowTitle';\nimport { StatusChip } from '@/components/StatusChip';\nimport { TableCard } from '@/components/TableCard';\nimport {\n Table as TableRoot,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { EnabledChip } from '../../EnabledChip';\nimport { DELIVERY_STATUS_DISPLAY } from '../../helpers/statusDisplay';\nimport { SiteBadge } from '../SiteBadge';\n\ntype TableProps = { webhooks: Webhook[] };\n\nexport const Table = ({ webhooks }: TableProps) => {\n const { t } = useTranslation();\n return (\n <TableCard>\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('publishing.webhooks.name')}</TableHead>\n <TableHead>{t('publishing.webhooks.url')}</TableHead>\n <TableHead>{t('publishing.webhooks.state')}</TableHead>\n <TableHead>{t('publishing.webhooks.lastDelivery')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {webhooks.map((webhook) => {\n const last = webhook.lastDelivery\n ? DELIVERY_STATUS_DISPLAY[webhook.lastDelivery.status]\n : undefined;\n return (\n <TableRow key={webhook.id}>\n <TableCell className=\"max-w-64\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <RowTitle asChild className=\"block truncate\">\n <Link to=\"/publishing/webhooks/$webhookId\" params={{ webhookId: webhook.id }}>\n {webhook.name}\n </Link>\n </RowTitle>\n <SiteBadge webhook={webhook} />\n </span>\n </TableCell>\n <TableCell className=\"max-w-72\">\n <span\n className=\"block truncate font-mono text-xs text-muted-foreground\"\n title={webhook.url}\n >\n {webhook.url}\n </span>\n </TableCell>\n <TableCell>\n <span className=\"flex flex-wrap items-center gap-2\">\n <EnabledChip enabled={webhook.enabled} />\n {webhook.secretsUnreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.webhooks.secretUnreadable')} />\n ) : null}\n </span>\n </TableCell>\n <TableCell>\n {webhook.lastDelivery && last ? (\n <span className=\"flex flex-wrap items-center gap-2\">\n <StatusChip tone={last.tone} label={t(last.labelKey)} />\n <span\n className=\"text-meta whitespace-nowrap text-muted-foreground\"\n title={formatDateTime(webhook.lastDelivery.at)}\n >\n {formatRelativeTime(webhook.lastDelivery.at)}\n </span>\n </span>\n ) : (\n <span className=\"text-muted-foreground\">{t('common.never')}</span>\n )}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </TableRoot>\n </TableCard>\n );\n};\n","import { useNavigate } from '@tanstack/react-router';\nimport { Plus, Webhook as WebhookIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useWebhooks } from '@/api/webhooks';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Page } from '@/components/Page';\nimport { QueryView } from '@/components/QueryView';\nimport { Button } from '@/components/ui/button';\nimport { Header } from '../Header';\nimport { useSecretReveal } from '../hooks/useSecretReveal';\nimport { CreateSheet } from './CreateSheet';\nimport { SigningSecretReveal } from './SigningSecretReveal';\nimport { Table } from './Table';\n\n/** Outgoing webhooks: signed HTTP notifications of content, change set and deployment events. */\nexport const Webhooks = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const webhooks = useWebhooks();\n const [creating, setCreating] = useState(false);\n // The new webhook's secret is shown here, then the webhook opens.\n const secret = useSecretReveal(\n (webhookId) => void navigate({ to: '/publishing/webhooks/$webhookId', params: { webhookId } }),\n );\n return (\n <Page>\n <Header\n actions={\n <Button onClick={() => setCreating(true)}>\n <Plus aria-hidden=\"true\" />\n {t('publishing.webhooks.create')}\n </Button>\n }\n />\n {secret.revealed ? (\n <SigningSecretReveal secret={secret.revealed.secret} onDismiss={secret.dismiss} />\n ) : null}\n <QueryView\n query={webhooks}\n isEmpty={(data) => data.length === 0}\n empty={<EmptyState icon={WebhookIcon} title={t('publishing.webhooks.empty')} />}\n >\n {(data) => <Table webhooks={data} />}\n </QueryView>\n <CreateSheet\n open={creating}\n onOpenChange={setCreating}\n onCloseAutoFocus={secret.keepFocusOnReveal}\n onCreated={({ webhook, secret: signingSecret }) => {\n setCreating(false);\n secret.reveal({ id: webhook.id, secret: signingSecret });\n }}\n />\n </Page>\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useDeleteWebhook, useRotateWebhookSecret, useTestWebhook, useUpdateWebhook } from '@/api/webhooks';\n\n/**\n * Send test, enable/disable, rotate the secret (shown once) and delete, each with its notification. Rotate\n * and delete return their promise, so their inline confirmation stays open until the request settles.\n */\nexport const useWebhookActions = (webhook: Webhook, onConflict: (error: unknown) => void) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const test = useTestWebhook();\n const update = useUpdateWebhook();\n const rotate = useRotateWebhookSecret();\n const remove = useDeleteWebhook();\n const [secret, setSecret] = useState<string | undefined>(undefined);\n return {\n secret,\n clearSecret: () => setSecret(undefined),\n testing: test.isPending,\n pending: update.isPending || rotate.isPending || remove.isPending,\n sendTest: () =>\n test.mutate(webhook.id, { onSuccess: () => toast.success(t('publishing.webhooks.testQueued')) }),\n toggleEnabled: () =>\n update.mutate(\n { id: webhook.id, input: { enabled: !webhook.enabled, expectedVersion: webhook.version } },\n {\n onSuccess: (saved) =>\n toast.success(\n saved.enabled ? t('publishing.webhooks.enabledToast') : t('publishing.webhooks.disabledToast'),\n ),\n onError: onConflict,\n },\n ),\n rotateSecret: () => rotate.mutateAsync(webhook.id, { onSuccess: (rotated) => setSecret(rotated.secret) }),\n remove: () =>\n remove.mutateAsync(webhook.id, {\n onSuccess: () => {\n toast.success(t('publishing.webhooks.deleted', { name: webhook.name }));\n void navigate({ to: '/publishing/webhooks' });\n },\n }),\n };\n};\n","type HeaderListProps = { headers: Record<string, string>; label: string };\n\n/** HTTP headers as name: value lines. */\nexport const HeaderList = ({ headers, label }: HeaderListProps) => (\n <dl aria-label={label} className=\"space-y-0.5 rounded-md border bg-muted p-2 font-mono text-xs break-all\">\n {Object.entries(headers).map(([name, value]) => (\n <div key={name}>\n <dt className=\"inline font-semibold\">{name}</dt>\n <dd className=\"inline before:content-[':_']\">{value}</dd>\n </div>\n ))}\n </dl>\n);\n","import { StatusChip, type StatusTone } from '@/components/StatusChip';\n\ntype ResponseCodeProps = { status: number; label?: string };\n\nconst SUCCESS_MIN = 200;\nconst REDIRECT_MIN = 300;\nconst CLIENT_ERROR_MIN = 400;\n\nconst toneOf = (status: number): StatusTone =>\n status >= SUCCESS_MIN && status < REDIRECT_MIN\n ? 'success'\n : status < CLIENT_ERROR_MIN\n ? 'warning'\n : 'danger';\n\n/** An HTTP response code as a chip: 2xx green, 3xx amber, 4xx and 5xx red. */\nexport const ResponseCode = ({ status, label }: ResponseCodeProps) => (\n <StatusChip tone={toneOf(status)} label={label ?? String(status)} size=\"sm\" className=\"font-mono\" />\n);\n","import type { WebhookAttempt } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { formatDateTime } from '@/helpers/formatDate';\nimport { JsonBlock } from '../../../JsonBlock';\nimport { HeaderList } from '../HeaderList';\nimport { ResponseCode } from '../ResponseCode';\n\ntype AttemptProps = { attempt: WebhookAttempt };\n\n/** One delivery attempt: the request sent and the response (or why none arrived). */\nexport const Attempt = ({ attempt }: AttemptProps) => {\n const { t } = useTranslation();\n const { request, response } = attempt;\n return (\n <li className=\"space-y-3 rounded-lg border bg-card p-4\">\n <p className=\"text-sm font-medium\">\n {t('publishing.webhooks.attemptHeading', {\n attempt: attempt.attempt,\n at: formatDateTime(attempt.at),\n duration: attempt.durationMs,\n })}\n </p>\n <div className=\"grid gap-3 lg:grid-cols-2\">\n <section className=\"min-w-0 space-y-1\">\n <h4 className=\"text-xs font-semibold text-muted-foreground\">{t('publishing.webhooks.request')}</h4>\n <p className=\"font-mono text-xs break-all\">{`${request.method} ${request.url}`}</p>\n <HeaderList headers={request.headers} label={t('publishing.webhooks.requestHeaders')} />\n </section>\n <section className=\"min-w-0 space-y-1\">\n <h4 className=\"text-xs font-semibold text-muted-foreground\">{t('publishing.webhooks.response')}</h4>\n {response ? (\n <>\n <ResponseCode\n status={response.status}\n label={t('publishing.webhooks.httpStatus', { status: response.status })}\n />\n <JsonBlock\n value={response.body}\n label={t('publishing.webhooks.responseBody')}\n className=\"max-h-40\"\n />\n {response.truncated ? (\n <p className=\"text-xs text-muted-foreground\">{t('publishing.webhooks.bodyTruncated')}</p>\n ) : null}\n </>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('publishing.webhooks.noResponse')}</p>\n )}\n {attempt.error ? <p className=\"text-sm text-destructive\">{attempt.error}</p> : null}\n </section>\n </div>\n </li>\n );\n};\n","import type { WebhookDelivery } from '@shapio/client';\nimport { ChevronDown, ChevronRight, RotateCcw } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\nimport { TableCell, TableRow } from '@/components/ui/table';\nimport { formatDateTime, formatRelativeTime } from '@/helpers/formatDate';\nimport { DELIVERY_STATUS_DISPLAY } from '../../../helpers/statusDisplay';\nimport { Attempt } from '../Attempt';\nimport { ResponseCode } from '../ResponseCode';\n\ntype DeliveryProps = {\n delivery: WebhookDelivery;\n expanded: boolean;\n onToggle: () => void;\n onRedeliver: () => void;\n redelivering: boolean;\n};\n\nconst DELIVERY_COLUMNS = 7;\n\n/** A delivery row and, when expanded, its attempt log. */\nexport const Delivery = ({ delivery, expanded, onToggle, onRedeliver, redelivering }: DeliveryProps) => {\n const { t } = useTranslation();\n const status = DELIVERY_STATUS_DISPLAY[delivery.status];\n const detailsId = `delivery-${delivery.id}`;\n return (\n <>\n <TableRow>\n <TableCell className=\"w-10\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-expanded={expanded}\n aria-controls={expanded ? detailsId : undefined}\n aria-label={t('publishing.webhooks.toggleAttempts', { event: delivery.eventType })}\n onClick={onToggle}\n >\n {expanded ? <ChevronDown aria-hidden=\"true\" /> : <ChevronRight aria-hidden=\"true\" />}\n </Button>\n </TableCell>\n <TableCell>\n <span className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs font-semibold\">{delivery.eventType}</span>\n {delivery.isTest ? <Badge variant=\"outline\">{t('publishing.webhooks.testBadge')}</Badge> : null}\n </span>\n </TableCell>\n <TableCell>\n <StatusChip tone={status.tone} label={t(status.labelKey)} />\n </TableCell>\n <TableCell>\n {delivery.lastResponseStatus === null ? (\n <span className=\"text-muted-foreground\">{t('common.none')}</span>\n ) : (\n <ResponseCode status={delivery.lastResponseStatus} />\n )}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">{delivery.attempts}</TableCell>\n <TableCell className=\"whitespace-nowrap\" title={formatDateTime(delivery.createdAt)}>\n {formatRelativeTime(delivery.createdAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={redelivering}\n aria-label={t('publishing.webhooks.redeliverLabel', { event: delivery.eventType })}\n onClick={onRedeliver}\n >\n <RotateCcw aria-hidden=\"true\" />\n {t('publishing.webhooks.redeliver')}\n </Button>\n </TableCell>\n </TableRow>\n {expanded ? (\n <TableRow className=\"hover:bg-transparent\">\n <TableCell colSpan={DELIVERY_COLUMNS} className=\"bg-muted/40 whitespace-normal\">\n <div id={detailsId} className=\"space-y-3 py-2\">\n {delivery.lastError ? (\n <p className=\"text-meta text-destructive\">\n {t('publishing.webhooks.lastErrorValue', { error: delivery.lastError })}\n </p>\n ) : null}\n {delivery.attemptLog.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\">{t('publishing.webhooks.noAttempts')}</p>\n ) : (\n <ol className=\"space-y-3\">\n {delivery.attemptLog.map((attempt) => (\n <Attempt key={attempt.attempt} attempt={attempt} />\n ))}\n </ol>\n )}\n </div>\n </TableCell>\n </TableRow>\n ) : null}\n </>\n );\n};\n","import { useNavigate, useSearch } from '@tanstack/react-router';\nimport { Inbox } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { useRedeliverWebhook, useWebhookDeliveries } from '@/api/webhooks';\nimport { CursorPager } from '@/components/CursorPager';\nimport { EmptyState } from '@/components/EmptyState';\nimport { Panel } from '@/components/Panel';\nimport { QueryView } from '@/components/QueryView';\nimport { Table, TableBody, TableHead, TableHeader, TableRow } from '@/components/ui/table';\nimport { useCursorPager } from '../../../hooks/useCursorPager';\nimport { Delivery } from '../Delivery';\n\ntype DeliveriesProps = { webhookId: string };\n\n/** The delivery log, newest first, polled while deliveries are still being attempted. */\nexport const Deliveries = ({ webhookId }: DeliveriesProps) => {\n const { t } = useTranslation();\n const { cursor } = useSearch({ from: '/app/publishing/webhooks/$webhookId' });\n const navigate = useNavigate({ from: '/publishing/webhooks/$webhookId' });\n const { pagerProps } = useCursorPager(cursor, (next) => void navigate({ search: { cursor: next } }));\n const deliveries = useWebhookDeliveries(webhookId, cursor);\n const redeliver = useRedeliverWebhook();\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(new Set());\n const toggle = (id: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (!next.delete(id)) {\n next.add(id);\n }\n return next;\n });\n return (\n <Panel title={t('publishing.webhooks.deliveries')} flush>\n <QueryView\n query={deliveries}\n isEmpty={(data) => data.items.length === 0 && cursor === undefined}\n empty={<EmptyState icon={Inbox} size=\"panel\" title={t('publishing.webhooks.noDeliveries')} />}\n >\n {(data) => (\n <>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-12\">\n <span className=\"sr-only\">{t('publishing.webhooks.attemptLog')}</span>\n </TableHead>\n <TableHead>{t('publishing.webhooks.eventType')}</TableHead>\n <TableHead>{t('publishing.fields.status')}</TableHead>\n <TableHead>{t('publishing.webhooks.lastResponse')}</TableHead>\n <TableHead className=\"text-right\">{t('publishing.webhooks.attempts')}</TableHead>\n <TableHead>{t('publishing.fields.created')}</TableHead>\n <TableHead>\n <span className=\"sr-only\">{t('common.actions')}</span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {data.items.map((delivery) => (\n <Delivery\n key={delivery.id}\n delivery={delivery}\n expanded={expanded.has(delivery.id)}\n onToggle={() => toggle(delivery.id)}\n redelivering={redeliver.isPending}\n onRedeliver={() =>\n redeliver.mutate(\n { id: webhookId, deliveryId: delivery.id },\n { onSuccess: () => toast.success(t('publishing.webhooks.redelivered')) },\n )\n }\n />\n ))}\n </TableBody>\n </Table>\n <CursorPager {...pagerProps(data.nextCursor)} className=\"border-t px-4 py-2.5\" />\n </>\n )}\n </QueryView>\n </Panel>\n );\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { Webhook } from '@shapio/client';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { toast } from 'sonner';\nimport { isConflict } from '@/api/errors';\nimport { useUpdateWebhook } from '@/api/webhooks';\nimport { settle } from '@/helpers/settle';\nimport { toWebhookInput, toWebhookValues, webhookSchema, type WebhookFormValues } from '../helpers';\n\n/**\n * Edits one version of a webhook (the form is re-created when the version changes). Saves send the\n * version they started from; a 409 goes to `onConflict`.\n */\nexport const useEditWebhookForm = (\n webhook: Webhook,\n onSaved: () => void,\n onConflict: (error: unknown) => void,\n) => {\n const { t } = useTranslation();\n const update = useUpdateWebhook();\n const form = useForm<WebhookFormValues>({\n resolver: zodResolver(webhookSchema),\n defaultValues: toWebhookValues(webhook),\n });\n const onSubmit = form.handleSubmit(async (values) => {\n const saved = await settle(\n update.mutateAsync(\n { id: webhook.id, input: { ...toWebhookInput(values), expectedVersion: webhook.version } },\n { onError: onConflict },\n ),\n );\n if (saved.ok) {\n toast.success(t('publishing.webhooks.saved'));\n onSaved();\n }\n });\n return { form, onSubmit, update, error: isConflict(update.error) ? undefined : update.error };\n};\n","import type { Webhook } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { FormError } from '@/components/FormError';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { Fields } from '../../Fields';\nimport { useEditWebhookForm } from '../../hooks/useEditWebhookForm';\n\ntype EditFormProps = { webhook: Webhook; onSaved: () => void; onConflict: (error: unknown) => void };\n\nexport const EditForm = ({ webhook, onSaved, onConflict }: EditFormProps) => {\n const { t } = useTranslation();\n const { form, onSubmit, update, error } = useEditWebhookForm(webhook, onSaved, onConflict);\n return (\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <UnsavedChangesGuard when={form.formState.isDirty && !update.isPending} />\n <FieldGroup>\n <Fields control={form.control} />\n <FormError error={error} />\n <div>\n <SubmitButton pending={update.isPending} pendingLabel={t('common.saving')}>\n {t('common.saveChanges')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n );\n};\n","import type { Webhook } from '@shapio/client';\nimport { linkOptions } from '@tanstack/react-router';\nimport { KeyRound, Power, Send, Trash2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { InlineConfirm } from '@/components/InlineConfirm';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { StatusChip } from '@/components/StatusChip';\nimport { Alert, AlertDescription } from '@/components/ui/alert';\nimport { Button } from '@/components/ui/button';\nimport { EnabledChip } from '../../../EnabledChip';\nimport { useConflictReload } from '../../../hooks/useConflictReload';\nimport { SignatureHelp } from '../../../SignatureHelp';\nimport { useWebhookActions } from '../../hooks/useWebhookActions';\nimport { SigningSecretReveal } from '../../SigningSecretReveal';\nimport { SiteBadge } from '../../SiteBadge';\nimport { Deliveries } from '../Deliveries';\nimport { EditForm } from '../EditForm';\n\ntype ViewProps = { webhook: Webhook };\n\n/** A loaded webhook: actions, the delivery log, its settings and how receivers verify requests. */\nexport const View = ({ webhook }: ViewProps) => {\n const { t } = useTranslation();\n const conflict = useConflictReload(queryKeys.publishing.webhooks.webhook(webhook.id));\n const actions = useWebhookActions(webhook, conflict.onSaveError);\n return (\n <Page>\n <PageHeader\n breadcrumb={[\n { label: t('nav.publishing') },\n { label: t('publishing.nav.webhooks'), link: linkOptions({ to: '/publishing/webhooks' }) },\n ]}\n title={webhook.name}\n badge={\n <span className=\"flex items-center gap-2\">\n <EnabledChip enabled={webhook.enabled} />\n {webhook.secretsUnreadable ? (\n <StatusChip tone=\"warning\" label={t('publishing.webhooks.secretUnreadable')} />\n ) : null}\n <SiteBadge webhook={webhook} />\n </span>\n }\n meta={<span className=\"font-mono text-xs break-all\">{webhook.url}</span>}\n actions={\n <>\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.webhooks.deleteTitle', { name: webhook.name })}\n description={t('publishing.webhooks.deleteDescription')}\n confirmLabel={t('common.delete')}\n onConfirm={actions.remove}\n trigger={\n <Button variant=\"destructive-ghost\" disabled={actions.pending}>\n <Trash2 aria-hidden=\"true\" />\n {t('common.delete')}\n </Button>\n }\n />\n <InlineConfirm\n tone=\"danger\"\n title={t('publishing.webhooks.rotateTitle')}\n description={t('publishing.webhooks.rotateDescription')}\n confirmLabel={t('publishing.webhooks.rotateSecret')}\n onConfirm={actions.rotateSecret}\n // The new secret's reveal takes focus (its Copy button); don't pull it back to this button.\n onCloseAutoFocus={(event) => {\n if (actions.secret) {\n event.preventDefault();\n }\n }}\n trigger={\n // The repair for an unreadable secret, so it becomes the main action until then.\n <Button\n variant={webhook.secretsUnreadable ? 'default' : 'outline'}\n disabled={actions.pending}\n >\n <KeyRound aria-hidden=\"true\" />\n {t('publishing.webhooks.rotateSecret')}\n </Button>\n }\n />\n <Button variant=\"outline\" disabled={actions.pending} onClick={actions.toggleEnabled}>\n <Power aria-hidden=\"true\" />\n {webhook.enabled ? t('publishing.webhooks.disable') : t('publishing.webhooks.enable')}\n </Button>\n <Button\n variant={webhook.secretsUnreadable ? 'outline' : 'default'}\n disabled={actions.testing || !webhook.enabled || webhook.secretsUnreadable}\n onClick={actions.sendTest}\n >\n <Send aria-hidden=\"true\" />\n {t('publishing.webhooks.sendTest')}\n </Button>\n </>\n }\n />\n {actions.secret ? (\n <SigningSecretReveal secret={actions.secret} onDismiss={actions.clearSecret} />\n ) : null}\n {conflict.conflicted ? (\n <Alert variant=\"destructive\">\n <AlertDescription>{t('publishing.conflictReloaded')}</AlertDescription>\n </Alert>\n ) : null}\n <Deliveries webhookId={webhook.id} />\n <Panel title={t('publishing.webhooks.settings')}>\n <EditForm\n key={webhook.version}\n webhook={webhook}\n onSaved={conflict.clearConflict}\n onConflict={conflict.onSaveError}\n />\n </Panel>\n <Panel title={t('publishing.webhooks.signatureTitle')}>\n <SignatureHelp description={t('publishing.webhooks.signatureDescription')} />\n </Panel>\n </Page>\n );\n};\n","import { useParams } from '@tanstack/react-router';\nimport { useWebhook } from '@/api/webhooks';\nimport { QueryView } from '@/components/QueryView';\nimport { View } from './View';\n\n/** One webhook: send a test, its delivery log, settings, secret rotation and deletion. */\nexport const Detail = () => {\n const { webhookId } = useParams({ from: '/app/publishing/webhooks/$webhookId' });\n const webhook = useWebhook(webhookId);\n return (\n <QueryView query={webhook} loadingRows={6}>\n {(data) => <View webhook={data} />}\n </QueryView>\n );\n};\n","import { createLazyRoute } from '@tanstack/react-router';\nimport { Publishing } from '@/features/Publishing';\nimport { Deployments } from '@/features/Publishing/Deployments';\nimport { Connection } from '@/features/Publishing/Deployments/Connection';\nimport { Run } from '@/features/Publishing/Deployments/Run';\nimport { Scheduled } from '@/features/Publishing/Scheduled';\nimport { Webhooks } from '@/features/Publishing/Webhooks';\nimport { Detail as WebhookDetail } from '@/features/Publishing/Webhooks/Detail';\n\n/** Every publishing screen, loaded together on the first visit to Publishing. */\nexport const publishingLazyRoutes = {\n publishing: createLazyRoute('/app/publishing')({ component: Publishing }),\n scheduled: createLazyRoute('/app/publishing/scheduled')({ component: Scheduled }),\n deployments: createLazyRoute('/app/publishing/deployments')({ component: Deployments }),\n connection: createLazyRoute('/app/publishing/deployments/$connectionId')({ component: Connection }),\n run: createLazyRoute('/app/publishing/deployments/runs/$runId')({ component: Run }),\n webhooks: createLazyRoute('/app/publishing/webhooks')({ component: Webhooks }),\n webhook: createLazyRoute('/app/publishing/webhooks/$webhookId')({ component: WebhookDetail }),\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"./jsx-runtime-DREnUpxT.js";import{x as r}from"./InfoHint-
|
|
2
|
-
//# sourceMappingURL=radio-group-
|
|
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{x as r}from"./InfoHint-tlSeZB9U.js";import{b as i,d as a,h as o,m as s,p as c,u as l}from"./es2015-Cv57ynE1.js";import{d as u,f as d,p as f,u as p,y as m}from"./field-D-xWW2E7.js";import{t as h}from"./cn-DVhJ55Mo.js";var g=e(t(),1),_=e(n(),1),v=Object.defineProperty,y=(e,t)=>v(e,`name`,{value:t,configurable:!0}),b=`Radio`,[x,S]=s(b),[C,w]=x(b);function T(e){let{__scopeRadio:t,checked:n=!1,children:r,disabled:i,form:a,name:o,onCheck:s,required:c,value:l=`on`,internal_do_not_use_render:u}=e,[d,f]=g.useState(null),[p,m]=g.useState(null),h=g.useRef(!1),[v,b]=g.useReducer(e=>e+1,0),x={checked:n,disabled:i,required:c,name:o,form:a,value:l,control:d,setControl:f,hasConsumerStoppedPropagationRef:h,userInteractionCount:v,onUserInteraction:b,isFormControl:!d||!!a||!!d.closest(`form`),bubbleInput:p,setBubbleInput:m,onCheck:y(()=>s?.(),`onCheck`)};return(0,_.jsx)(C,{scope:t,...x,children:M(u)?u(x):r})}y(T,`RadioProvider`);var E=`RadioTrigger`,D=g.forwardRef(y(function({__scopeRadio:e,onClick:t,...n},r){let{checked:a,disabled:s,value:l,setControl:u,onCheck:d,hasConsumerStoppedPropagationRef:f,onUserInteraction:p,isFormControl:m,bubbleInput:h}=w(E,e),g=i(r,u);return(0,_.jsx)(o.button,{type:`button`,role:`radio`,"aria-checked":a,"data-state":N(a),"data-disabled":s?``:void 0,disabled:s,value:l,...n,ref:g,onClick:c(t,e=>{a||(p(),d()),h&&m&&(f.current=e.isPropagationStopped(),f.current||e.stopPropagation())})})},`RadioTrigger`)),O=`RadioIndicator`,k=g.forwardRef(y(function(e,t){let{__scopeRadio:n,forceMount:r,...i}=e,a=w(O,n);return(0,_.jsx)(l,{present:r||a.checked,children:(0,_.jsx)(o.span,{"data-state":N(a.checked),"data-disabled":a.disabled?``:void 0,...i,ref:t})})},`RadioIndicator`)),A=`RadioBubbleInput`,j=g.forwardRef(y(function({__scopeRadio:e,onClick:t,...n},a){let{control:s,checked:l,required:u,disabled:d,name:f,value:p,form:m,bubbleInput:h,setBubbleInput:v,hasConsumerStoppedPropagationRef:y,userInteractionCount:b}=w(A,e),x=i(a,v),S=r(s),C=g.useRef(!1),T=g.useRef(l),E=g.useRef(b);g.useEffect(()=>{let e=h;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=b!==E.current;E.current=b;let i=T.current!==l;T.current=l;let a=!(r&&y.current);if(i&&n){C.current=!r;let t=new Event(`click`,{bubbles:a});n.call(e,l),e.dispatchEvent(t),C.current=!1}},[h,l,y,b]);let D=g.useRef(l);return(0,_.jsx)(o.input,{type:`radio`,"aria-hidden":!0,defaultChecked:D.current,required:u,disabled:d,name:f,value:p,form:m,...n,tabIndex:-1,ref:x,onClick:c(t,e=>{C.current&&e.stopPropagation()}),style:{...n.style,...S,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})},`RadioBubbleInput`));function M(e){return typeof e==`function`}y(M,`isFunction`);function N(e){return e?`checked`:`unchecked`}y(N,`getState`);var P=[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`],F=`RadioGroup`,[I,L]=s(F,[d,S]),R=d(),z=S(),[B,V]=I(F),H=g.forwardRef(y(function(e,t){let{__scopeRadioGroup:n,name:r,form:s,defaultValue:c,value:l,required:d=!1,disabled:p=!1,orientation:m,dir:h,loop:v=!0,onValueChange:b,...x}=e,S=R(n),C=f(h),[w,T]=a({prop:l,defaultProp:c??null,onChange:b,caller:F}),[E,D]=g.useState(null),O=i(t,D),k=g.useRef(w);return g.useEffect(()=>{let e=s?E?.ownerDocument.getElementById(s):E?.closest(`form`);if(e instanceof HTMLFormElement){let t=y(()=>T(k.current),`reset`);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[E,s,T]),(0,_.jsx)(B,{scope:n,name:r,form:s,required:d,disabled:p,value:w,onValueChange:T,children:(0,_.jsx)(u,{asChild:!0,...S,orientation:m,dir:C,loop:v,children:(0,_.jsx)(o.div,{role:`radiogroup`,"aria-required":d,"aria-orientation":m,"data-disabled":p?``:void 0,dir:C,...x,ref:O})})})},`RadioGroup`)),U=`RadioGroupItemProvider`,W=`RadioGroupItemTrigger`;function G(e){let{__scopeRadioGroup:t,value:n,disabled:r,children:i,internal_do_not_use_render:a}=e,o=V(U,t),s=z(t),c=o.disabled||r;return(0,_.jsx)(T,{...s,checked:o.value===n,disabled:c,required:o.required,name:o.name,form:o.form,value:n,onCheck:()=>o.onValueChange(n),internal_do_not_use_render:a,children:i})}y(G,`RadioGroupItemProvider`);var K=g.forwardRef(y(function(e,t){let{__scopeRadioGroup:n,...r}=e,a=R(n),o=z(n),{checked:s,disabled:l}=w(W,o.__scopeRadio),u=g.useRef(null),d=i(t,u),f=g.useRef(!1);return g.useEffect(()=>{let e=y(e=>{P.includes(e.key)&&(f.current=!0)},`handleKeyDown`),t=y(()=>f.current=!1,`handleKeyUp`);return document.addEventListener(`keydown`,e),document.addEventListener(`keyup`,t),()=>{document.removeEventListener(`keydown`,e),document.removeEventListener(`keyup`,t)}},[]),(0,_.jsx)(p,{asChild:!0,...a,focusable:!l,active:s,children:(0,_.jsx)(D,{...o,...r,ref:d,onKeyDown:c(r.onKeyDown,e=>{e.key===`Enter`&&e.preventDefault()}),onFocus:c(r.onFocus,()=>{f.current&&u.current?.click()})})})},`RadioGroupItemTrigger`)),q=g.forwardRef(y(function(e,t){let{__scopeRadioGroup:n,value:r,disabled:i,...a}=e;return(0,_.jsx)(G,{__scopeRadioGroup:n,value:r,disabled:i,internal_do_not_use_render:({isFormControl:e})=>(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(K,{...a,ref:t,__scopeRadioGroup:n}),e&&(0,_.jsx)(J,{__scopeRadioGroup:n})]})})},`RadioGroupItem`)),J=g.forwardRef(y(function(e,t){let{__scopeRadioGroup:n,...r}=e,i=z(n);return(0,_.jsx)(j,{...i,...r,ref:t})},`RadioGroupItemBubbleInput`)),Y=g.forwardRef(y(function(e,t){let{__scopeRadioGroup:n,...r}=e,i=z(n);return(0,_.jsx)(k,{...i,...r,ref:t})},`RadioGroupIndicator`));function X({className:e,...t}){return(0,_.jsx)(H,{"data-slot":`radio-group`,className:h(`grid gap-3`,e),...t})}function Z({className:e,...t}){return(0,_.jsx)(q,{"data-slot":`radio-group-item`,className:h(`aspect-square size-4 shrink-0 rounded-full border border-input text-primary shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40`,e),...t,children:(0,_.jsx)(Y,{"data-slot":`radio-group-indicator`,className:`relative flex items-center justify-center`,children:(0,_.jsx)(m,{className:`absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 fill-primary`})})})}export{Z as n,q as r,X as t};
|
|
2
|
+
//# sourceMappingURL=radio-group-CRuWQnuV.js.map
|