@shapio/cms 0.5.8 → 0.5.9
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-Da76KsyX.js} +2 -2
- package/dist/admin/assets/{AssetTile-BrMzsUZD.js.map → AssetTile-Da76KsyX.js.map} +1 -1
- package/dist/admin/assets/AssistError-Wr62cDj3.js +2 -0
- package/dist/admin/assets/{AssistError-Cs-r9Ssc.js.map → AssistError-Wr62cDj3.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js → BlockMenuItems-BMiEVCIT.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js.map → BlockMenuItems-BMiEVCIT.js.map} +1 -1
- package/dist/admin/assets/Body-BEW1sAAB.js +2 -0
- package/dist/admin/assets/Body-BEW1sAAB.js.map +1 -0
- package/dist/admin/assets/Builder-Tk_5Orrl.js +2 -0
- package/dist/admin/assets/Builder-Tk_5Orrl.js.map +1 -0
- package/dist/admin/assets/{CodeEditor-CBCR73Wd.js → CodeEditor-Ck7ggv6w.js} +2 -2
- package/dist/admin/assets/{CodeEditor-CBCR73Wd.js.map → CodeEditor-Ck7ggv6w.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-CxFsBHfF.js → CopyButton-WMWuSVsk.js} +2 -2
- package/dist/admin/assets/{CopyButton-CxFsBHfF.js.map → CopyButton-WMWuSVsk.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-BW2U3v6l.js → CursorPager-CsnzX1P8.js} +2 -2
- package/dist/admin/assets/{CursorPager-BW2U3v6l.js.map → CursorPager-CsnzX1P8.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-CstZuVmt.js} +2 -2
- package/dist/admin/assets/{FocalPoint-CpZTve1E.js.map → FocalPoint-CstZuVmt.js.map} +1 -1
- package/dist/admin/assets/Form-CEOW2OFF.js +2 -0
- package/dist/admin/assets/Form-CEOW2OFF.js.map +1 -0
- package/dist/admin/assets/{FormCheckboxGroup-DeeaYnzB.js → FormCheckboxGroup-VjWVMiF3.js} +2 -2
- package/dist/admin/assets/{FormCheckboxGroup-DeeaYnzB.js.map → FormCheckboxGroup-VjWVMiF3.js.map} +1 -1
- package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js → FormRadioGroup-BQurJa8M.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js.map → FormRadioGroup-BQurJa8M.js.map} +1 -1
- package/dist/admin/assets/FormSelectField-B4sjP-pj.js +2 -0
- package/dist/admin/assets/FormSelectField-B4sjP-pj.js.map +1 -0
- package/dist/admin/assets/FormSheet-V99zdfQe.js +2 -0
- package/dist/admin/assets/FormSheet-V99zdfQe.js.map +1 -0
- package/dist/admin/assets/{FormSwitchField-BLOh7qei.js → FormSwitchField-RZgoP--n.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-BLOh7qei.js.map → FormSwitchField-RZgoP--n.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-CO115n_u.js → FormTextareaField-CzXgoQzf.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-CO115n_u.js.map → FormTextareaField-CzXgoQzf.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-DzHnEdIK.js → HintedLabel-Cd9nuSqV.js} +2 -2
- package/dist/admin/assets/{HintedLabel-DzHnEdIK.js.map → HintedLabel-Cd9nuSqV.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-CSEtcHjL.js → InfoHint-ymRmHKMr.js} +2 -2
- package/dist/admin/assets/{InfoHint-CSEtcHjL.js.map → InfoHint-ymRmHKMr.js.map} +1 -1
- package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js → InlineConfirm-A4IqkrGp.js} +2 -2
- package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js.map → InlineConfirm-A4IqkrGp.js.map} +1 -1
- package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js → InsertMenuItem-Bf7S7qbm.js} +2 -2
- package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js.map → InsertMenuItem-Bf7S7qbm.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-DJq8wn3e.js} +2 -2
- package/dist/admin/assets/{Match-CcD9KxHH.js.map → Match-DJq8wn3e.js.map} +1 -1
- package/dist/admin/assets/{NoAccess-C8RLPN0I.js → NoAccess-CZufdbPI.js} +2 -2
- package/dist/admin/assets/{NoAccess-C8RLPN0I.js.map → NoAccess-CZufdbPI.js.map} +1 -1
- package/dist/admin/assets/{QueryView-xMP_uJ_t.js → QueryView-DO9TFWYE.js} +2 -2
- package/dist/admin/assets/{QueryView-xMP_uJ_t.js.map → QueryView-DO9TFWYE.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-DQFmni5A.js → RadioTile-DmKBFkpy.js} +2 -2
- package/dist/admin/assets/{RadioTile-DQFmni5A.js.map → RadioTile-DmKBFkpy.js.map} +1 -1
- package/dist/admin/assets/{RichTextField-CVHRIbnu.js → RichTextField-BpxyusP4.js} +4 -4
- package/dist/admin/assets/{RichTextField-CVHRIbnu.js.map → RichTextField-BpxyusP4.js.map} +1 -1
- package/dist/admin/assets/{RowTitle-Bqt6evG9.js → RowTitle-DVOfgxOd.js} +2 -2
- package/dist/admin/assets/{RowTitle-Bqt6evG9.js.map → RowTitle-DVOfgxOd.js.map} +1 -1
- package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js → SecretReveal-DRCqVEFF.js} +2 -2
- package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js.map → SecretReveal-DRCqVEFF.js.map} +1 -1
- package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js → SharedGlyph-nsXJPCew.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js.map → SharedGlyph-nsXJPCew.js.map} +1 -1
- package/dist/admin/assets/StepList-CDZPRd3-.js +2 -0
- package/dist/admin/assets/StepList-CDZPRd3-.js.map +1 -0
- package/dist/admin/assets/Structure-CL51Bvbm.js +2 -0
- package/dist/admin/assets/{Structure-D8csgrIt.js.map → Structure-CL51Bvbm.js.map} +1 -1
- package/dist/admin/assets/{SubNavLink-CiCaVV8U.js → SubNavLink-7Cs1LqMv.js} +2 -2
- package/dist/admin/assets/{SubNavLink-CiCaVV8U.js.map → SubNavLink-7Cs1LqMv.js.map} +1 -1
- package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js → SuggestAltButton-4SaZQOJu.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js.map → SuggestAltButton-4SaZQOJu.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-DauHAkh8.js} +2 -2
- package/dist/admin/assets/{Thumbnail-DNj5TRBI.js.map → Thumbnail-DauHAkh8.js.map} +1 -1
- package/dist/admin/assets/Trans-B3UWiZaU.js +2 -0
- package/dist/admin/assets/Trans-B3UWiZaU.js.map +1 -0
- package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js → UnsavedChangesGuard-DPgih7BX.js} +2 -2
- package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js.map → UnsavedChangesGuard-DPgih7BX.js.map} +1 -1
- package/dist/admin/assets/{UserAvatar-p-jV-LoD.js → UserAvatar-If-zlQNY.js} +2 -2
- package/dist/admin/assets/{UserAvatar-p-jV-LoD.js.map → UserAvatar-If-zlQNY.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-DEe9tqLS.js} +2 -2
- package/dist/admin/assets/{badge-CqKF1pwz.js.map → badge-DEe9tqLS.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-D5i2SgFV.js +2 -0
- package/dist/admin/assets/{changeSets-8EburmT0.js.map → changeSets-D5i2SgFV.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/{constants-a_15vqOh.js → constants-FKg_ke3y.js} +2 -2
- package/dist/admin/assets/{constants-a_15vqOh.js.map → constants-FKg_ke3y.js.map} +1 -1
- package/dist/admin/assets/content-DKT2ziPH.js +3 -0
- package/dist/admin/assets/content-DKT2ziPH.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-B5taZv3y.js} +2 -2
- package/dist/admin/assets/{contentTypes-84uc0bjR.js.map → contentTypes-B5taZv3y.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-CFlv7IdP.js +11 -0
- package/dist/admin/assets/develop-CFlv7IdP.js.map +1 -0
- package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js → dropdown-menu-B7dJyA8h.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js.map → dropdown-menu-B7dJyA8h.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-1nJWBurR.js +42 -0
- package/dist/admin/assets/es2015-1nJWBurR.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-BDCHXkZE.js} +2 -2
- package/dist/admin/assets/{field-COOzRptX.js.map → field-BDCHXkZE.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-c9UMUr9b.js} +2 -2
- package/dist/admin/assets/{fileRoute-s7mCMYUJ.js.map → fileRoute-c9UMUr9b.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-CHpz-yo4.js +2 -0
- package/dist/admin/assets/followPlural-CHpz-yo4.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-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/inbox-Daw10v5C.js +2 -0
- package/dist/admin/assets/inbox-Daw10v5C.js.map +1 -0
- package/dist/admin/assets/index-BRx5mel0.js +4 -0
- package/dist/admin/assets/index-BRx5mel0.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-B83cEX9w.js} +2 -2
- package/dist/admin/assets/{labels-DQckbLGW.js.map → labels-B83cEX9w.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-CgxriwNL.js} +2 -2
- package/dist/admin/assets/{media-CURizGns.js.map → media-CgxriwNL.js.map} +1 -1
- package/dist/admin/assets/network-Cc1TAyal.js +2 -0
- package/dist/admin/assets/network-Cc1TAyal.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-RQUj-CyN.js +2 -0
- package/dist/admin/assets/{publishing-Dke9bSKp.js.map → publishing-RQUj-CyN.js.map} +1 -1
- package/dist/admin/assets/{radio-group-4ok5evXq.js → radio-group-Btmx7dlD.js} +2 -2
- package/dist/admin/assets/{radio-group-4ok5evXq.js.map → radio-group-Btmx7dlD.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-BMQEabwO.js +2 -0
- package/dist/admin/assets/{schema-D-qo7XSF.js.map → schema-BMQEabwO.js.map} +1 -1
- 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-fO_49fDI.js} +2 -2
- package/dist/admin/assets/{searchSchemas-CSScloG8.js.map → searchSchemas-fO_49fDI.js.map} +1 -1
- 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/{sections-DqBzSKMP.js → sections-SX-oiQoE.js} +2 -2
- package/dist/admin/assets/{sections-DqBzSKMP.js.map → sections-SX-oiQoE.js.map} +1 -1
- package/dist/admin/assets/{select-C0USI-Ox.js → select-JB2Vv7ep.js} +2 -2
- package/dist/admin/assets/{select-C0USI-Ox.js.map → select-JB2Vv7ep.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-CrRFxhSo.js +2 -0
- package/dist/admin/assets/{settings-B60vHpZd.js.map → settings-CrRFxhSo.js.map} +1 -1
- package/dist/admin/assets/shapes-EMjfYsXV.js +6 -0
- package/dist/admin/assets/shapes-EMjfYsXV.js.map +1 -0
- package/dist/admin/assets/{skeleton-B5MP72Kw.js → skeleton-Dk-qdg0z.js} +2 -2
- package/dist/admin/assets/{skeleton-B5MP72Kw.js.map → skeleton-Dk-qdg0z.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-DyCRGDs7.js} +2 -2
- package/dist/admin/assets/{switch-Dp6WYNam.js.map → switch-DyCRGDs7.js.map} +1 -1
- package/dist/admin/assets/{theme-65PB8uAu.js → theme-Cv-MfOv8.js} +2 -2
- package/dist/admin/assets/{theme-65PB8uAu.js.map → theme-Cv-MfOv8.js.map} +1 -1
- 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-CCOeMqiL.js} +2 -2
- package/dist/admin/assets/{tooltip-BGP1DVBt.js.map → tooltip-CCOeMqiL.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-uXOfT985.js +2 -0
- package/dist/admin/assets/useContentSchema-uXOfT985.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-DvBI3VIz.js} +2 -2
- package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js.map → useDiscardGuard-DvBI3VIz.js.map} +1 -1
- package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js → useMediaPickerDialog-CehOsykG.js} +2 -2
- package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js.map → useMediaPickerDialog-CehOsykG.js.map} +1 -1
- package/dist/admin/assets/{useMediaUploader-CBcq1ICg.js → useMediaUploader-DvtxYXxD.js} +2 -2
- package/dist/admin/assets/{useMediaUploader-CBcq1ICg.js.map → useMediaUploader-DvtxYXxD.js.map} +1 -1
- package/dist/admin/assets/useModelIndex-D8Q0oM4M.js +2 -0
- package/dist/admin/assets/useModelIndex-D8Q0oM4M.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-CySN2Vwz.js +2 -0
- package/dist/admin/assets/usePlaces-CySN2Vwz.js.map +1 -0
- package/dist/admin/assets/useResolvedDefinitions-C279ueCH.js +2 -0
- package/dist/admin/assets/useResolvedDefinitions-C279ueCH.js.map +1 -0
- package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js → useResolvedScheme-DEq7P4R5.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js.map → useResolvedScheme-DEq7P4R5.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-vPzaNsuW.js} +2 -2
- package/dist/admin/assets/{zod-Cry7YvLY.js.map → zod-vPzaNsuW.js.map} +1 -1
- package/dist/admin/index.html +60 -58
- package/dist/cli.js +1 -1
- package/dist/{cliMain-papyXJDd.js → cliMain-DzBXO7Oa.js} +98 -21
- package/dist/cliMain-DzBXO7Oa.js.map +1 -0
- package/dist/config.d.ts +2 -2
- package/dist/index.d.ts +42 -5
- package/dist/index.js +1 -1
- package/dist/public-B57h4F7Y.js.map +1 -1
- package/dist/{public-COKbHR-N.d.ts → public-jttKsns_.d.ts} +47 -5
- package/dist/{worker-B-sC-eY2.js → worker-6ru1tYBs.js} +2790 -1063
- package/dist/worker-6ru1tYBs.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/FormSelectField-BzE9Lq9i.js +0 -2
- package/dist/admin/assets/FormSelectField-BzE9Lq9i.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/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/schedules-BmB9Y73z.js +0 -2
- package/dist/admin/assets/schema-D-qo7XSF.js +0 -2
- 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/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/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/worker-B-sC-eY2.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{$ as r,Pt as i,b as a,bn as o,g as s,x as c,y as l}from"./src-ndgTSYLX.js";import{E as u,S as d,o as ee,u as f,x as p}from"./auth-CQO4MBUj.js";import{_ as te,a as m,i as h,n as g}from"./badge-CqKF1pwz.js";import{n as _,t as v}from"./createLucideIcon-CLmh7Go-.js";import{i as y,n as b,t as x}from"./RowTitle-Bqt6evG9.js";import{t as ne}from"./UnsavedChangesGuard-CUiuMklN.js";import{E as S,t as C}from"./InfoHint-CSEtcHjL.js";import{T as w}from"./es2015-BHmI7wjK.js";import{a as T,i as re,l as E,r as D,u as ie}from"./constants-a_15vqOh.js";import{t as O}from"./useSchemaScopeAccess-ByrxIdKM.js";import{i as ae}from"./skeleton-B5MP72Kw.js";import{a as oe}from"./InlineConfirm-yW-iUKFC.js";import{a as k,c as A,s as j}from"./field-COOzRptX.js";import{t as M}from"./cn-DVhJ55Mo.js";import{t as N}from"./radio-group-4ok5evXq.js";import{c as P,f as F,n as I,o as se,t as ce,u as le}from"./zod-Cry7YvLY.js";import{t as ue}from"./settle-CFU6YpQ0.js";import{a as de,d as fe,g as L,i as R,l as z,n as B,o as V,r as H,s as pe,t as me,v as U}from"./table-zG68ipQc.js";import{t as he}from"./SharedGlyph-cUmTh0_C.js";import{a as ge,p as _e,s as ve,v as ye}from"./schema-D-qo7XSF.js";import{t as be}from"./Panel-Bcl09TtM.js";import{t as W}from"./NoAccess-C8RLPN0I.js";import{a as xe,i as Se,n as Ce,r as G,t as we}from"./followPlural-Cm7v_Udv.js";import{t as K}from"./RadioTile-DQFmni5A.js";import{t as Te}from"./FormSwitchField-BLOh7qei.js";import{t as Ee}from"./FormTextareaField-CO115n_u.js";var q={name:`app-window`,size:24,node:[[`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`,key:`izxlao`}],[`path`,{d:`M10 4v4`,key:`pp8u80`}],[`path`,{d:`M2 8h20`,key:`d11cs7`}],[`path`,{d:`M6 4v4`,key:`1svtjw`}]]};q.node;var De=v(q),J=e(n(),1),Oe=({definition:e})=>(0,J.jsx)(x,{asChild:!0,children:e.kind===`component`?(0,J.jsx)(d,{to:`/models/components/$componentId`,params:{componentId:e.id},children:e.label}):(0,J.jsx)(d,{to:`/models/$modelId`,params:{modelId:e.id},children:e.label})}),Y=e(t(),1),ke=({changeId:e})=>{let{t}=_(),n=_e(e),r=o(),a=n.data?.status,s=a!==void 0&&ye.has(a);return(0,Y.useEffect)(()=>{s&&r.invalidateQueries({queryKey:i.schema.all})},[s,r]),s||n.isError?null:(0,J.jsx)(g,{tone:`progress`,size:`sm`,label:t(`models.pendingChange`)})},Ae=e=>e.kind===`collection`?`${e.apiKey} · ${s(e)}`:e.apiKey,je=({items:e,showKind:t=!1,markShared:n=!0})=>{let{t:r}=_(),{multiSite:i}=O(),a=n&&i;return(0,J.jsx)(pe,{children:(0,J.jsxs)(me,{children:[(0,J.jsx)(de,{children:(0,J.jsxs)(V,{children:[(0,J.jsx)(R,{children:r(`models.columns.label`)}),t?(0,J.jsx)(R,{children:r(`models.columns.kind`)}):null,(0,J.jsx)(R,{children:r(`models.columns.apiKey`)}),(0,J.jsx)(R,{className:`text-right`,children:r(`models.columns.fields`)}),(0,J.jsx)(R,{className:`text-right`,children:r(`models.columns.version`)}),(0,J.jsx)(R,{children:r(`models.columns.activated`)})]})}),(0,J.jsx)(B,{children:e.map(({definition:e,scope:n,version:i,activatedAt:o,pendingChange:s})=>(0,J.jsxs)(V,{children:[(0,J.jsx)(H,{children:(0,J.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(Oe,{definition:e}),a&&n===`network`?(0,J.jsx)(he,{}):null,s?(0,J.jsx)(ke,{changeId:s.id}):null]})}),t?(0,J.jsx)(H,{className:`text-muted-foreground`,children:r(T[e.kind])}):null,(0,J.jsx)(H,{className:`font-mono text-meta text-muted-foreground`,children:Ae(e)}),(0,J.jsx)(H,{className:`text-right tabular-nums`,children:e.fields.length}),(0,J.jsx)(H,{className:`text-right text-muted-foreground tabular-nums`,children:r(`models.versionNumber`,{version:i})}),(0,J.jsx)(H,{className:`text-muted-foreground`,title:b(o),children:y(o)})]},e.id))})]})})},Me={API_KEY_INVALID:`validation.apiKeyInvalid`,API_KEY_TOO_LONG:`validation.apiKeyTooLong`,API_KEY_RESERVED_PREFIX:`validation.apiKeyReservedPrefix`},X=e=>{let t=a(e);return t?Me[t.code]??`validation.apiKeyInvalid`:null},Ne=()=>U().trim().min(1,`validation.required`).superRefine((e,t)=>{let n=X(e);n&&t.addIssue({code:`custom`,message:n})}),Pe=(e,t)=>X(e)?null:t===``?`validation.required`:c(t)===c(e)?`validation.pluralApiKeySameAsSingular`:X(t),Z=(e,t,n,r,i=!0)=>{let a=(0,Y.useRef)(e);(0,Y.useEffect)(()=>{if(!i){a.current=e;return}let o=t();(o===``||o===r(a.current))&&n(r(e)),a.current=e},[e,t,n,r,i])},Fe=(e,t,n)=>Z(e,t,n,Ce),Ie=(e,t,n)=>{let r=(0,Y.useRef)(e);(0,Y.useEffect)(()=>{let i=t(),a=we(r.current,e,i);a!==i&&n(a),r.current=e},[e,t,n])},Le=L({kind:z([`collection`,`singleton`,`component`]),label:se(),apiKey:Ne(),pluralApiKey:U().trim(),description:U().trim(),localized:fe(),scope:z([`site`,`network`])}).superRefine((e,t)=>{let n=e.kind===`collection`?Pe(e.apiKey,e.pluralApiKey):null;n&&t.addIssue({code:`custom`,path:[`pluralApiKey`],message:n})}),Re=(e,t)=>({kind:e,label:``,apiKey:``,pluralApiKey:``,description:``,localized:!1,scope:t}),ze=({kind:e,label:t,apiKey:n,pluralApiKey:r,description:i,localized:a})=>e===`component`?{kind:e,label:t,apiKey:n,description:i,fields:[]}:e===`collection`?{kind:e,label:t,apiKey:n,pluralApiKey:r,description:i,localized:a,fields:[]}:{kind:e,label:t,apiKey:n,description:i,localized:a,fields:[]},Be=e=>new Set((e??[]).flatMap(({definition:e})=>[e.apiKey,...r(e)?[s(e)]:[]].map(c))),Q=[`label`,`apiKey`,`pluralApiKey`],Ve=new Set(Q.map(e=>`/${e}`)),He=e=>{let t=p(e);if(!(t.length===0||t.some(e=>Ve.has(e.path))))return t.map(G).join(` `)},Ue=(e,t=`site`)=>{let n=ve(),{definitions:r}=ge(),i=u(),a=le({resolver:ce(Le),defaultValues:Re(e,t)}),{setValue:o,setError:s,getValues:l}=a;return Fe(F({control:a.control,name:`label`}),(0,Y.useCallback)(()=>l(`apiKey`),[l]),(0,Y.useCallback)(e=>o(`apiKey`,e,{shouldValidate:!1}),[o])),Ie(F({control:a.control,name:`apiKey`}),(0,Y.useCallback)(()=>l(`pluralApiKey`),[l]),(0,Y.useCallback)(e=>o(`pluralApiKey`,e,{shouldValidate:!1}),[o])),{form:a,onSubmit:a.handleSubmit(async e=>{let t=Be(r);if(t.has(c(e.apiKey))){s(`apiKey`,{message:`validation.apiKeyTaken`});return}if(e.kind===`collection`&&t.has(c(e.pluralApiKey))){s(`pluralApiKey`,{message:`validation.apiKeyTaken`});return}let a=E(e.kind),o=await ue(n.mutateAsync({category:a,input:{definition:ze(e),scope:e.scope}}));if(!o.ok){let e=p(o.error);for(let t of Q){let n=e.find(e=>e.path===`/${t}`);n&&s(t,{message:G(n)})}return}S.success(w.t(`models.created`));let l=o.value.definitionId;await i(a===`component`?{to:`/models/components/$componentId`,params:{componentId:l},ignoreBlocker:!0}:{to:`/models/$modelId`,params:{modelId:l},ignoreBlocker:!0})}),pending:n.isPending,error:n.error,errorMessage:He(n.error)}},$=({label:e,names:t})=>(0,J.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-2`,children:[(0,J.jsx)(`dt`,{className:`w-14 shrink-0`,children:e}),(0,J.jsx)(`dd`,{className:`flex min-w-0 flex-wrap gap-1.5`,children:t.map(e=>(0,J.jsx)(`code`,{className:`max-w-full truncate rounded bg-muted px-1.5 py-0.5 font-mono text-foreground/80`,children:e},e))})]}),We=({apiKey:e,pluralApiKey:t,kind:n})=>{let{t:r}=_(),i=e.trim();if(i===``||n===`component`)return null;let a=t.trim()||l(i),o=n===`collection`?a:i,s=n===`collection`?[i,a]:[i];return(0,J.jsxs)(`dl`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[(0,J.jsx)($,{label:r(`models.restLabel`),names:[r(`models.endpointPath`,{routeKey:o})]}),(0,J.jsx)($,{label:r(`models.graphqlLabel`),names:s})]})},Ge=({control:e,kinds:t})=>{let{t:n}=_(),{field:{ref:r,value:i,onChange:a}}=P({control:e,name:`kind`});return(0,J.jsxs)(A,{className:`gap-3`,children:[(0,J.jsx)(j,{variant:`label`,className:`mb-0`,children:n(`models.kind`)}),(0,J.jsx)(N,{ref:r,value:i,onValueChange:a,className:M(`gap-3 sm:grid-cols-2`,t.length>2&&`sm:grid-cols-3`),children:t.map(e=>(0,J.jsx)(K,{value:e,icon:re[e],label:n(T[e]),description:n(D[e])},e))})]})},Ke=({control:e,canShare:t})=>{let{t:n}=_(),r=f().data?.site,{field:{ref:i,value:a,onChange:o}}=P({control:e,name:`scope`});return(0,J.jsxs)(A,{className:`gap-3`,children:[(0,J.jsxs)(j,{variant:`label`,className:`mb-0 flex items-center gap-1`,children:[n(`contentTypes.availableOn`),t?null:(0,J.jsx)(C,{about:n(`contentTypes.allSites`),children:n(`contentTypes.allSitesNeedsNetwork`)})]}),(0,J.jsxs)(N,{ref:i,value:a,onValueChange:o,className:`gap-3 sm:grid-cols-2`,children:[(0,J.jsx)(K,{value:`site`,icon:De,label:n(`contentTypes.thisSite`),description:n(`contentTypes.thisSiteDescription`,{site:r?.name??``})}),(0,J.jsx)(K,{value:`network`,icon:ie,label:n(`contentTypes.allSites`),description:n(`contentTypes.allSitesDescription`),disabled:!t})]})]})},qe=({title:e,kinds:t,back:n,backLabel:r,intro:i,scope:a})=>{let{t:o}=_(),s=ee(`schema.create`),{locked:c,reason:l}=xe(),{multiSite:u,canShare:f}=O(),{form:p,onSubmit:g,pending:v,error:y,errorMessage:b}=Ue(t[0],a),[x,S,C]=F({control:p.control,name:[`kind`,`apiKey`,`pluralApiKey`]}),w=x===`collection`;return s?(0,J.jsxs)(m,{width:`narrow`,children:[(0,J.jsx)(ne,{when:p.formState.isDirty}),(0,J.jsx)(h,{breadcrumb:[{label:r,link:n}],title:e}),c?(0,J.jsx)(Se,{reason:l}):null,i,(0,J.jsx)(be,{children:(0,J.jsx)(`form`,{noValidate:!0,onSubmit:e=>void g(e),children:(0,J.jsxs)(k,{className:`gap-5`,children:[t.length>1?(0,J.jsx)(Ge,{control:p.control,kinds:t}):null,a===void 0&&u?(0,J.jsx)(Ke,{control:p.control,canShare:f}):null,(0,J.jsx)(I,{control:p.control,name:`label`,label:o(`models.label`),autoComplete:`off`}),(0,J.jsxs)(`div`,{className:M(`grid items-start gap-5`,w&&`sm:grid-cols-2`),children:[(0,J.jsx)(I,{control:p.control,name:`apiKey`,label:o(`models.apiKey`),hint:o(`models.apiKeyHint`),autoComplete:`off`,spellCheck:!1,className:`font-mono`}),w?(0,J.jsx)(I,{control:p.control,name:`pluralApiKey`,label:o(`models.pluralApiKey`),hint:o(`models.pluralApiKeyHint`),autoComplete:`off`,spellCheck:!1,className:`font-mono`}):null]}),(0,J.jsx)(We,{apiKey:S,pluralApiKey:C,kind:x}),(0,J.jsx)(Ee,{control:p.control,name:`description`,label:o(`common.optionalLabel`,{label:o(`models.descriptionLabel`)}),rows:2}),x===`component`?null:(0,J.jsx)(Te,{control:p.control,name:`localized`,label:o(`models.localized`),hint:o(`models.localizedHint`),variant:`bordered`}),(0,J.jsx)(oe,{error:y,message:b}),(0,J.jsxs)(`div`,{className:`flex flex-wrap justify-end gap-2`,children:[(0,J.jsx)(ae,{variant:`outline`,asChild:!0,children:(0,J.jsx)(d,{...n,children:o(`common.cancel`)})}),(0,J.jsx)(te,{pending:v,pendingLabel:o(`models.creating`),disabled:c,children:o(`common.create`)})]})]})})})]}):(0,J.jsxs)(m,{width:`narrow`,children:[(0,J.jsx)(h,{breadcrumb:[{label:r,link:n}],title:e}),(0,J.jsx)(W,{})]})};export{Z as n,je as r,qe as t};
|
|
2
|
-
//# sourceMappingURL=Form-lNrRHc0I.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Form-lNrRHc0I.js","names":["TableRoot","z.string","useRef","useRef","z.object","z.enum","z.string","z.boolean","zodResolver","useCallback","i18next","Globe2","__toESM","require_jsx_runtime","isModelDefinition","queryKeys","checkApiKeySyntax","useQueryClient","routeKeyOf","foldApiKey","suggestPlural","useNavigate","Link","useHasGlobalPermission","useMe","schemaIssuesOf","SubmitButton","Page","PageHeader","StatusChip","useTranslation","createLucideIcon","formatRelativeTime","formatDateTime","RowTitle","UnsavedChangesGuard","toast","InfoHint","instance","KIND_LABEL_KEYS","KIND_ICONS","categoryOfKind","KIND_DESCRIPTION_KEYS","Earth","useSchemaScopeAccess","Button","FormError","FieldGroup","FieldSet","FieldLegend","cn","RadioGroup","useController","useWatch","FormTextField","requiredText","u","useForm","settle","TableHeader","boolean","object","TableHead","_enum","TableBody","TableRow","TableCell","TableCard","Table","string","SharedGlyph","useAllDefinitions","useSchemaChange","useCreateDefinition","FINAL_CHANGE_STATUSES","Panel","NoAccess","useSchemaLock","LockNotice","deriveApiKey","describeIssue","followPlural","RadioTile","FormSwitchField","FormTextareaField","__iconData","AppWindow","import_jsx_runtime","DefinitionLink","definition","import_react","require_react","PendingChip","change","changeId","queryClient","status","finished","apiIdsOf","List","showShared","markShared","multiSite","t","showKind","items","scope","pendingChange","activatedAt","API_KEY_MESSAGES","syntaxMessage","problem","value","apiKeyField","message","context","pluralApiKeyMessage","apiKey","plural","useValueFromSource","previousSource","source","enabled","current","getValue","derive","setValue","useApiKeyFromLabel","label","getApiKey","setApiKey","usePluralFromApiKey","previousApiKey","getPlural","next","setPlural","createSchema","values","blank","toDefinition","kind","takenKeys","definitions","ISSUE_FIELDS","ISSUE_PATHS","name","unplacedIssuesMessage","issues","error","issue","useCreateDefinitionForm","createDefinition","navigate","form","initialKind","initialScope","getValues","taken","setError","category","created","found","candidate","id","PreviewRow","names","EndpointPreview","pluralApiKey","routeKey","graphqlNames","KindPicker","onChange","kinds","ScopePicker","site","canShare","Form","canCreate","isCollection","backLabel","back","locked","intro","onSubmit","event","errorMessage"],"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/app-window.mjs","../../src/features/Models/DefinitionLink/index.tsx","../../src/features/Models/PendingChip/index.tsx","../../src/features/Models/List/index.tsx","../../src/features/Models/helpers/apiKeyField.ts","../../src/hooks/useValueFromSource.ts","../../src/features/Models/hooks/useApiKeyFromLabel.ts","../../src/features/Models/hooks/usePluralFromApiKey.ts","../../src/features/Models/hooks/useCreateDefinitionForm.ts","../../src/features/Content/New/EndpointPreview/index.tsx","../../src/features/Content/New/KindPicker/index.tsx","../../src/features/Content/New/ScopePicker/index.tsx","../../src/features/Content/New/Form/index.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: \"app-window\",\n size: 24,\n node: [\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }],\n [\"path\", { d: \"M10 4v4\", key: \"pp8u80\" }],\n [\"path\", { d: \"M2 8h20\", key: \"d11cs7\" }],\n [\"path\", { d: \"M6 4v4\", key: \"1svtjw\" }]\n ]\n};\n__iconData.node;\nconst AppWindow = createLucideIcon(__iconData);\n\nexport { __iconData, AppWindow as default };\n//# sourceMappingURL=app-window.mjs.map\n","import type { SchemaDefinition } from '@shapio/schema';\nimport { Link } from '@tanstack/react-router';\nimport { RowTitle } from '@/components/RowTitle';\n\ntype DefinitionLinkProps = { definition: Pick<SchemaDefinition, 'id' | 'kind' | 'label'> };\n\n/** A definition's name as a list row title, linking to its builder (models and components differ). */\nexport const DefinitionLink = ({ definition }: DefinitionLinkProps) => (\n <RowTitle asChild>\n {definition.kind === 'component' ? (\n <Link to=\"/models/components/$componentId\" params={{ componentId: definition.id }}>\n {definition.label}\n </Link>\n ) : (\n <Link to=\"/models/$modelId\" params={{ modelId: definition.id }}>\n {definition.label}\n </Link>\n )}\n </RowTitle>\n);\n","import { useQueryClient } from '@tanstack/react-query';\nimport { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { queryKeys } from '@/api/queryKeys';\nimport { useSchemaChange } from '@/api/schema';\nimport { StatusChip } from '@/components/StatusChip';\nimport { FINAL_CHANGE_STATUSES } from '@/constants/schema';\n\ntype PendingChipProps = { changeId: string };\n\n/** \"Change in progress\" while a planned change runs; refreshes the schema and disappears when it ends. */\nexport const PendingChip = ({ changeId }: PendingChipProps) => {\n const { t } = useTranslation();\n const change = useSchemaChange(changeId);\n const queryClient = useQueryClient();\n const status = change.data?.status;\n const finished = status !== undefined && FINAL_CHANGE_STATUSES.has(status);\n useEffect(() => {\n if (finished) {\n void queryClient.invalidateQueries({ queryKey: queryKeys.schema.all });\n }\n }, [finished, queryClient]);\n if (finished || change.isError) {\n return null;\n }\n return <StatusChip tone=\"progress\" size=\"sm\" label={t('models.pendingChange')} />;\n};\n","import type { DefinitionListItem } from '@shapio/client';\nimport { routeKeyOf } from '@shapio/schema';\nimport { useTranslation } from 'react-i18next';\nimport { SharedGlyph } from '@/components/SharedGlyph';\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 { useSchemaScopeAccess } from '@/hooks/useSchemaScopeAccess';\nimport { KIND_LABEL_KEYS } from '../constants';\nimport { DefinitionLink } from '../DefinitionLink';\nimport { PendingChip } from '../PendingChip';\n\ntype ListProps = {\n items: DefinitionListItem[];\n /** A Kind column, for lists that mix content types and components. */\n showKind?: boolean;\n /** Mark shared definitions with a globe (where there is more than one site); off where all are shared. */\n markShared?: boolean;\n};\n\n/** \"article · articles\" for a collection (singular and list names), the API ID alone otherwise. */\nconst apiIdsOf = (definition: DefinitionListItem['definition']) =>\n definition.kind === 'collection' ? `${definition.apiKey} · ${routeKeyOf(definition)}` : definition.apiKey;\n\nexport const List = ({ items, showKind = false, markShared = true }: ListProps) => {\n const { t } = useTranslation();\n const { multiSite } = useSchemaScopeAccess();\n const showShared = markShared && multiSite;\n return (\n <TableCard>\n <TableRoot>\n <TableHeader>\n <TableRow>\n <TableHead>{t('models.columns.label')}</TableHead>\n {showKind ? <TableHead>{t('models.columns.kind')}</TableHead> : null}\n <TableHead>{t('models.columns.apiKey')}</TableHead>\n <TableHead className=\"text-right\">{t('models.columns.fields')}</TableHead>\n <TableHead className=\"text-right\">{t('models.columns.version')}</TableHead>\n <TableHead>{t('models.columns.activated')}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map(({ definition, scope, version, activatedAt, pendingChange }) => (\n <TableRow key={definition.id}>\n <TableCell>\n <span className=\"flex items-center gap-2\">\n <DefinitionLink definition={definition} />\n {showShared && scope === 'network' ? <SharedGlyph /> : null}\n {pendingChange ? <PendingChip changeId={pendingChange.id} /> : null}\n </span>\n </TableCell>\n {showKind ? (\n <TableCell className=\"text-muted-foreground\">{t(KIND_LABEL_KEYS[definition.kind])}</TableCell>\n ) : null}\n <TableCell className=\"font-mono text-meta text-muted-foreground\">\n {apiIdsOf(definition)}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">{definition.fields.length}</TableCell>\n <TableCell className=\"text-right text-muted-foreground tabular-nums\">\n {t('models.versionNumber', { version })}\n </TableCell>\n <TableCell className=\"text-muted-foreground\" title={formatDateTime(activatedAt)}>\n {formatRelativeTime(activatedAt)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </TableRoot>\n </TableCard>\n );\n};\n","import { checkApiKeySyntax, foldApiKey } from '@shapio/schema';\nimport { z } from 'zod';\nimport type { ValidationMessageKey } from '@/helpers/validation';\n\nconst API_KEY_MESSAGES: Readonly<Record<string, ValidationMessageKey>> = {\n API_KEY_INVALID: 'validation.apiKeyInvalid',\n API_KEY_TOO_LONG: 'validation.apiKeyTooLong',\n API_KEY_RESERVED_PREFIX: 'validation.apiKeyReservedPrefix',\n};\n\n/** The message for an API key's syntax problem (`checkApiKeySyntax`), or null when it is valid. */\nconst syntaxMessage = (value: string): ValidationMessageKey | null => {\n const problem = checkApiKeySyntax(value);\n return problem ? (API_KEY_MESSAGES[problem.code] ?? 'validation.apiKeyInvalid') : null;\n};\n\n/** An API key: GraphQL-name syntax, checked by @shapio/schema's own `checkApiKeySyntax`. */\nexport const apiKeyField = () =>\n z\n .string()\n .trim()\n .min(1, 'validation.required')\n .superRefine((value, context) => {\n const message = syntaxMessage(value);\n if (message) {\n context.addIssue({ code: 'custom', message });\n }\n });\n\n/**\n * What is wrong with a collection's plural API ID, or null: required, API-key syntax, not the singular.\n * Nothing while the singular itself is invalid (same rule as the server's validator).\n */\nexport const pluralApiKeyMessage = (apiKey: string, plural: string): ValidationMessageKey | null => {\n // A plural derived from an invalid API ID is invalid too; the API ID's own message says it once.\n if (syntaxMessage(apiKey)) {\n return null;\n }\n if (plural === '') {\n return 'validation.required';\n }\n if (foldApiKey(plural) === foldApiKey(apiKey)) {\n return 'validation.pluralApiKeySameAsSingular';\n }\n return syntaxMessage(plural);\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * A value that follows another one (an API ID its label, a key its name) until the user types one of their\n * own: it is replaced only while it is empty or still what `derive` made of the previous source. (React Hook\n * Form's dirty state cannot tell: it marks the derived value dirty as soon as the source changes again, so\n * typing the source key by key stopped the value after its first letter.)\n */\nexport const useValueFromSource = (\n source: string,\n getValue: () => string,\n setValue: (value: string) => void,\n derive: (source: string) => string,\n /** False while the value is fixed (an existing role's key): it never follows then. */\n enabled = true,\n) => {\n const previousSource = useRef(source);\n useEffect(() => {\n if (!enabled) {\n previousSource.current = source;\n return;\n }\n const current = getValue();\n if (current === '' || current === derive(previousSource.current)) {\n setValue(derive(source));\n }\n previousSource.current = source;\n }, [source, getValue, setValue, derive, enabled]);\n};\n","import { useValueFromSource } from '@/hooks/useValueFromSource';\nimport { deriveApiKey } from '../helpers/deriveApiKey';\n\n/** The API key follows the label until the user types a key of their own (see useValueFromSource). */\nexport const useApiKeyFromLabel = (\n label: string,\n getApiKey: () => string,\n setApiKey: (apiKey: string) => void,\n) => useValueFromSource(label, getApiKey, setApiKey, deriveApiKey);\n","import { useEffect, useRef } from 'react';\nimport { followPlural } from '../helpers/followPlural';\n\n/**\n * The plural API ID follows the singular API ID until the user types one of their own (same rule as the\n * API ID following the label, see `useApiKeyFromLabel`).\n */\nexport const usePluralFromApiKey = (\n apiKey: string,\n getPlural: () => string,\n setPlural: (plural: string) => void,\n) => {\n const previousApiKey = useRef(apiKey);\n useEffect(() => {\n const current = getPlural();\n const next = followPlural(previousApiKey.current, apiKey, current);\n if (next !== current) {\n setPlural(next);\n }\n previousApiKey.current = apiKey;\n }, [apiKey, getPlural, setPlural]);\n};\n","import { zodResolver } from '@hookform/resolvers/zod';\nimport type { DefinitionScope } from '@shapio/client';\nimport {\n foldApiKey,\n isModelDefinition,\n routeKeyOf,\n type DefinitionInput,\n type SchemaDefinition,\n} from '@shapio/schema';\nimport { useNavigate } from '@tanstack/react-router';\nimport { useCallback } from 'react';\nimport { useForm, useWatch } from 'react-hook-form';\nimport { toast } from 'sonner';\nimport { z } from 'zod';\nimport { schemaIssuesOf } from '@/api/errors';\nimport { useAllDefinitions, useCreateDefinition } from '@/api/schema';\nimport { i18next } from '@/app/i18n';\nimport { settle } from '@/helpers/settle';\nimport { requiredText } from '@/helpers/validation';\nimport { categoryOfKind } from '../constants';\nimport { apiKeyField, pluralApiKeyMessage } from '../helpers/apiKeyField';\nimport { describeIssue } from '../helpers/describeIssue';\nimport { useApiKeyFromLabel } from './useApiKeyFromLabel';\nimport { usePluralFromApiKey } from './usePluralFromApiKey';\n\nconst createSchema = z\n .object({\n kind: z.enum(['collection', 'singleton', 'component']),\n label: requiredText(),\n apiKey: apiKeyField(),\n /** Collections only (hidden and ignored for the other kinds). */\n pluralApiKey: z.string().trim(),\n description: z.string().trim(),\n localized: z.boolean(),\n /** Where it lives: this site (the default) or shared with all sites. */\n scope: z.enum(['site', 'network']),\n })\n .superRefine((values, context) => {\n const message =\n values.kind === 'collection' ? pluralApiKeyMessage(values.apiKey, values.pluralApiKey) : null;\n if (message) {\n context.addIssue({ code: 'custom', path: ['pluralApiKey'], message });\n }\n });\n\nexport type CreateDefinitionValues = z.infer<typeof createSchema>;\n\nconst blank = (kind: CreateDefinitionValues['kind'], scope: DefinitionScope): CreateDefinitionValues => ({\n kind,\n label: '',\n apiKey: '',\n pluralApiKey: '',\n description: '',\n localized: false,\n scope,\n});\n\nconst toDefinition = ({\n kind,\n label,\n apiKey,\n pluralApiKey,\n description,\n localized,\n}: CreateDefinitionValues): DefinitionInput => {\n if (kind === 'component') {\n return { kind, label, apiKey, description, fields: [] };\n }\n return kind === 'collection'\n ? { kind, label, apiKey, pluralApiKey, description, localized, fields: [] }\n : { kind, label, apiKey, description, localized, fields: [] };\n};\n\n/** API IDs already claimed (case-folded): every definition's API ID and every collection's plural. */\nconst takenKeys = (definitions: ReadonlyArray<{ definition: SchemaDefinition }> | undefined) =>\n new Set(\n (definitions ?? []).flatMap(({ definition }) =>\n [definition.apiKey, ...(isModelDefinition(definition) ? [routeKeyOf(definition)] : [])].map(foldApiKey),\n ),\n );\n\n/** Server issues shown on a form field, by the definition property they point at. */\nconst ISSUE_FIELDS = ['label', 'apiKey', 'pluralApiKey'] as const;\n\nconst ISSUE_PATHS: ReadonlySet<string> = new Set(ISSUE_FIELDS.map((name) => `/${name}`));\n\n/**\n * The message for a refusal whose issues point at no field on this form (the generic \"fix the highlighted\n * settings\" would highlight nothing), or undefined when the form error can describe it itself.\n */\nconst unplacedIssuesMessage = (error: unknown): string | undefined => {\n const issues = schemaIssuesOf(error);\n if (issues.length === 0 || issues.some((issue) => ISSUE_PATHS.has(issue.path))) {\n return undefined;\n }\n return issues.map(describeIssue).join(' ');\n};\n\n/**\n * Creates an empty model or component, live (a new definition has no content, so it activates at once),\n * then opens it in the builder. The API key follows the label, and a collection's plural API ID follows\n * the API key, until the user edits them. It belongs to this site unless `scope` says otherwise (the\n * network view creates shared definitions only).\n */\nexport const useCreateDefinitionForm = (\n initialKind: CreateDefinitionValues['kind'],\n initialScope: DefinitionScope = 'site',\n) => {\n const createDefinition = useCreateDefinition();\n const { definitions } = useAllDefinitions();\n const navigate = useNavigate();\n const form = useForm<CreateDefinitionValues>({\n resolver: zodResolver(createSchema),\n defaultValues: blank(initialKind, initialScope),\n });\n const { setValue, setError, getValues } = form;\n const label = useWatch({ control: form.control, name: 'label' });\n useApiKeyFromLabel(\n label,\n useCallback(() => getValues('apiKey'), [getValues]),\n useCallback((apiKey: string) => setValue('apiKey', apiKey, { shouldValidate: false }), [setValue]),\n );\n const apiKey = useWatch({ control: form.control, name: 'apiKey' });\n usePluralFromApiKey(\n apiKey,\n useCallback(() => getValues('pluralApiKey'), [getValues]),\n useCallback((plural: string) => setValue('pluralApiKey', plural, { shouldValidate: false }), [setValue]),\n );\n\n const onSubmit = form.handleSubmit(async (values) => {\n const taken = takenKeys(definitions);\n if (taken.has(foldApiKey(values.apiKey))) {\n setError('apiKey', { message: 'validation.apiKeyTaken' });\n return;\n }\n if (values.kind === 'collection' && taken.has(foldApiKey(values.pluralApiKey))) {\n setError('pluralApiKey', { message: 'validation.apiKeyTaken' });\n return;\n }\n const category = categoryOfKind(values.kind);\n const created = await settle(\n createDefinition.mutateAsync({\n category,\n input: { definition: toDefinition(values), scope: values.scope },\n }),\n );\n if (!created.ok) {\n const issues = schemaIssuesOf(created.error);\n for (const name of ISSUE_FIELDS) {\n const found = issues.find((candidate) => candidate.path === `/${name}`);\n if (found) {\n setError(name, { message: describeIssue(found) });\n }\n }\n return;\n }\n toast.success(i18next.t('models.created'));\n const id = created.value.definitionId;\n // The form is still dirty: the unsaved-changes guard must not ask about what was just created.\n await (category === 'component'\n ? navigate({ to: '/models/components/$componentId', params: { componentId: id }, ignoreBlocker: true })\n : navigate({ to: '/models/$modelId', params: { modelId: id }, ignoreBlocker: true }));\n });\n return {\n form,\n onSubmit,\n pending: createDefinition.isPending,\n error: createDefinition.error,\n errorMessage: unplacedIssuesMessage(createDefinition.error),\n };\n};\n","import { suggestPlural, type DefinitionKind } from '@shapio/schema';\nimport { useTranslation } from 'react-i18next';\n\ntype EndpointPreviewProps = { apiKey: string; pluralApiKey: string; kind: DefinitionKind };\n\ntype PreviewRowProps = { label: string; names: string[] };\n\nconst PreviewRow = ({ label, names }: PreviewRowProps) => (\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <dt className=\"w-14 shrink-0\">{label}</dt>\n <dd className=\"flex min-w-0 flex-wrap gap-1.5\">\n {names.map((name) => (\n <code\n key={name}\n className=\"max-w-full truncate rounded bg-muted px-1.5 py-0.5 font-mono text-foreground/80\"\n >\n {name}\n </code>\n ))}\n </dd>\n </div>\n);\n\n/**\n * Every API name a model's API IDs produce (REST path, GraphQL queries), updated as they are typed, so it\n * is clear there is nothing else to configure. A collection is listed under its plural API ID\n * (`/api/content/articles`, `articles`) and read one by one under the singular (`article`). Nothing for\n * components or while the ID is empty.\n */\nexport const EndpointPreview = ({ apiKey, pluralApiKey, kind }: EndpointPreviewProps) => {\n const { t } = useTranslation();\n const id = apiKey.trim();\n if (id === '' || kind === 'component') {\n return null;\n }\n const plural = pluralApiKey.trim() || suggestPlural(id);\n const routeKey = kind === 'collection' ? plural : id;\n const graphqlNames = kind === 'collection' ? [id, plural] : [id];\n return (\n <dl className=\"flex flex-col gap-1 text-xs text-muted-foreground\">\n <PreviewRow label={t('models.restLabel')} names={[t('models.endpointPath', { routeKey })]} />\n <PreviewRow label={t('models.graphqlLabel')} names={graphqlNames} />\n </dl>\n );\n};\n","import type { DefinitionKind } from '@shapio/schema';\nimport { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { RadioTile } from '@/components/RadioTile';\nimport { FieldLegend, FieldSet } from '@/components/ui/field';\nimport { RadioGroup } from '@/components/ui/radio-group';\nimport { KIND_DESCRIPTION_KEYS, KIND_ICONS, KIND_LABEL_KEYS } from '@/features/Models/constants';\nimport type { CreateDefinitionValues } from '@/features/Models/hooks/useCreateDefinitionForm';\nimport { cn } from '@/helpers/cn';\n\ntype KindPickerProps = { control: Control<CreateDefinitionValues>; kinds: readonly DefinitionKind[] };\n\n/** The kinds offered here as cards (a radio group: arrow keys move between them). */\nexport const KindPicker = ({ control, kinds }: KindPickerProps) => {\n const { t } = useTranslation();\n const {\n field: { ref, value, onChange },\n } = useController({ control, name: 'kind' });\n return (\n <FieldSet className=\"gap-3\">\n <FieldLegend variant=\"label\" className=\"mb-0\">\n {t('models.kind')}\n </FieldLegend>\n <RadioGroup\n ref={ref}\n value={value}\n onValueChange={onChange}\n className={cn('gap-3 sm:grid-cols-2', kinds.length > 2 && 'sm:grid-cols-3')}\n >\n {kinds.map((kind) => (\n <RadioTile\n key={kind}\n value={kind}\n icon={KIND_ICONS[kind]}\n label={t(KIND_LABEL_KEYS[kind])}\n description={t(KIND_DESCRIPTION_KEYS[kind])}\n />\n ))}\n </RadioGroup>\n </FieldSet>\n );\n};\n","import { AppWindow, Globe2 } from 'lucide-react';\nimport { useController, type Control } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useMe } from '@/api/auth';\nimport { InfoHint } from '@/components/InfoHint';\nimport { RadioTile } from '@/components/RadioTile';\nimport { FieldLegend, FieldSet } from '@/components/ui/field';\nimport { RadioGroup } from '@/components/ui/radio-group';\nimport type { CreateDefinitionValues } from '@/features/Models/hooks/useCreateDefinitionForm';\n\ntype ScopePickerProps = {\n control: Control<CreateDefinitionValues>;\n /** The admin may create shared definitions (`schema.create` on every site); otherwise \"All sites\" is off. */\n canShare: boolean;\n};\n\n/** \"Available on\": this site (the default) or all sites, as cards (a radio group). */\nexport const ScopePicker = ({ control, canShare }: ScopePickerProps) => {\n const { t } = useTranslation();\n const site = useMe().data?.site;\n const {\n field: { ref, value, onChange },\n } = useController({ control, name: 'scope' });\n return (\n <FieldSet className=\"gap-3\">\n <FieldLegend variant=\"label\" className=\"mb-0 flex items-center gap-1\">\n {t('contentTypes.availableOn')}\n {canShare ? null : (\n <InfoHint about={t('contentTypes.allSites')}>{t('contentTypes.allSitesNeedsNetwork')}</InfoHint>\n )}\n </FieldLegend>\n <RadioGroup ref={ref} value={value} onValueChange={onChange} className=\"gap-3 sm:grid-cols-2\">\n <RadioTile\n value=\"site\"\n icon={AppWindow}\n label={t('contentTypes.thisSite')}\n description={t('contentTypes.thisSiteDescription', { site: site?.name ?? '' })}\n />\n <RadioTile\n value=\"network\"\n icon={Globe2}\n label={t('contentTypes.allSites')}\n description={t('contentTypes.allSitesDescription')}\n disabled={!canShare}\n />\n </RadioGroup>\n </FieldSet>\n );\n};\n","import type { DefinitionScope } from '@shapio/client';\nimport type { DefinitionKind } from '@shapio/schema';\nimport { Link, type LinkOptions } from '@tanstack/react-router';\nimport type { ReactNode } from 'react';\nimport { useWatch } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useHasGlobalPermission } from '@/api/auth';\nimport { FormError } from '@/components/FormError';\nimport { FormSwitchField } from '@/components/FormSwitchField';\nimport { FormTextareaField } from '@/components/FormTextareaField';\nimport { FormTextField } from '@/components/FormTextField';\nimport { NoAccess } from '@/components/NoAccess';\nimport { Page } from '@/components/Page';\nimport { PageHeader } from '@/components/PageHeader';\nimport { Panel } from '@/components/Panel';\nimport { SubmitButton } from '@/components/SubmitButton';\nimport { Button } from '@/components/ui/button';\nimport { FieldGroup } from '@/components/ui/field';\nimport { UnsavedChangesGuard } from '@/components/UnsavedChangesGuard';\nimport { useCreateDefinitionForm } from '@/features/Models/hooks/useCreateDefinitionForm';\nimport { useSchemaLock } from '@/features/Models/hooks/useSchemaLock';\nimport { LockNotice } from '@/features/Models/LockNotice';\nimport { cn } from '@/helpers/cn';\nimport { useSchemaScopeAccess } from '@/hooks/useSchemaScopeAccess';\nimport { EndpointPreview } from '../EndpointPreview';\nimport { KindPicker } from '../KindPicker';\nimport { ScopePicker } from '../ScopePicker';\n\ntype FormProps = {\n title: string;\n /** The kinds offered; the picker is hidden when there is only one. */\n kinds: readonly [DefinitionKind, ...DefinitionKind[]];\n /** Where Cancel and the breadcrumb go. */\n back: LinkOptions;\n backLabel: string;\n /** Shown above the form (content types: \"Describe it\", when assist is on). */\n intro?: ReactNode;\n /** A fixed scope hides the \"Available on\" control (the network view creates shared definitions). */\n scope?: DefinitionScope;\n};\n\n/**\n * Creates a content type (collection or single type) or a component, live, then opens it for editing.\n * Shared by `/content/new`, `/develop/components/new` and `/network/content-types/new`. Where there is more\n * than one site, it asks where the definition is available (this site unless \"All sites\" is chosen).\n */\nexport const Form = ({ title, kinds, back, backLabel, intro, scope }: FormProps) => {\n const { t } = useTranslation();\n // Reached by URL or bookmark without the permission: say so before anyone fills in the form.\n const canCreate = useHasGlobalPermission('schema.create');\n const { locked, reason } = useSchemaLock();\n const { multiSite, canShare } = useSchemaScopeAccess();\n const { form, onSubmit, pending, error, errorMessage } = useCreateDefinitionForm(kinds[0], scope);\n const [kind, apiKey, pluralApiKey] = useWatch({\n control: form.control,\n name: ['kind', 'apiKey', 'pluralApiKey'],\n });\n const isCollection = kind === 'collection';\n if (!canCreate) {\n return (\n <Page width=\"narrow\">\n <PageHeader breadcrumb={[{ label: backLabel, link: back }]} title={title} />\n <NoAccess />\n </Page>\n );\n }\n return (\n <Page width=\"narrow\">\n <UnsavedChangesGuard when={form.formState.isDirty} />\n <PageHeader breadcrumb={[{ label: backLabel, link: back }]} title={title} />\n {locked ? <LockNotice reason={reason} /> : null}\n {intro}\n <Panel>\n <form noValidate onSubmit={(event) => void onSubmit(event)}>\n <FieldGroup className=\"gap-5\">\n {kinds.length > 1 ? <KindPicker control={form.control} kinds={kinds} /> : null}\n {scope === undefined && multiSite ? (\n <ScopePicker control={form.control} canShare={canShare} />\n ) : null}\n <FormTextField control={form.control} name=\"label\" label={t('models.label')} autoComplete=\"off\" />\n {/* A collection's two API IDs sit side by side, with the names they produce below both. */}\n <div className={cn('grid items-start gap-5', isCollection && 'sm:grid-cols-2')}>\n <FormTextField\n control={form.control}\n name=\"apiKey\"\n label={t('models.apiKey')}\n hint={t('models.apiKeyHint')}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"font-mono\"\n />\n {isCollection ? (\n <FormTextField\n control={form.control}\n name=\"pluralApiKey\"\n label={t('models.pluralApiKey')}\n hint={t('models.pluralApiKeyHint')}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"font-mono\"\n />\n ) : null}\n </div>\n <EndpointPreview apiKey={apiKey} pluralApiKey={pluralApiKey} kind={kind} />\n <FormTextareaField\n control={form.control}\n name=\"description\"\n label={t('common.optionalLabel', { label: t('models.descriptionLabel') })}\n rows={2}\n />\n {kind === 'component' ? null : (\n <FormSwitchField\n control={form.control}\n name=\"localized\"\n label={t('models.localized')}\n hint={t('models.localizedHint')}\n variant=\"bordered\"\n />\n )}\n <FormError error={error} message={errorMessage} />\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button variant=\"outline\" asChild>\n <Link {...back}>{t('common.cancel')}</Link>\n </Button>\n <SubmitButton pending={pending} pendingLabel={t('models.creating')} disabled={locked}>\n {t('common.create')}\n </SubmitButton>\n </div>\n </FieldGroup>\n </form>\n </Panel>\n </Page>\n );\n};\n"],"ignoreList":[0],"mappings":"olDASA,IAAMqF,EAAa,CACjB,KAAM,aACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,KAAM,OAAQ,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,EAC9E,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,SAAU,IAAK,QAAS,CAAC,CACzC,CACF,EACAA,EAAW,KACX,IAAMC,GAAYvD,EAAiBsD,CAAU,aCbhCG,IAAkB,CAAE,iBAC/B,EAAAD,EAAA,IAAA,CAACrD,EAAD,CAAU,QAAA,GACP,SAAAuD,EAAW,OAAS,aACnB,EAAAF,EAAA,IAAA,CAACjE,EAAD,CAAM,GAAG,kCAAkC,OAAQ,CAAE,YAAamE,EAAW,EAAG,EAC7E,SAAAA,EAAW,KACR,CAAA,GAEN,EAAAF,EAAA,IAAA,CAACjE,EAAD,CAAM,GAAG,mBAAmB,OAAQ,CAAE,QAASmE,EAAW,EAAG,EAC1D,SAAAA,EAAW,KACR,CAAA,CAEA,CAAA,aCPCG,IAAe,CAAE,cAAiC,CAC7D,GAAM,CAAE,GAAM9D,EAAe,EACvB+D,EAASrB,GAAgBsB,CAAQ,EACjCC,EAAc9E,EAAe,EAC7B+E,EAASH,EAAO,MAAM,OACtBI,EAAWD,IAAW,IAAA,IAAatB,GAAsB,IAAIsB,CAAM,EASzE,OARA,EAAAN,EAAA,UAAA,KAAgB,CACVO,GACFF,EAAiB,kBAAkB,CAAE,SAAUhF,EAAU,OAAO,GAAI,CAAC,CAEzE,EAAG,CAACkF,EAAUF,CAAW,CAAC,EACtBE,GAAYJ,EAAO,QACd,MAEF,EAAAN,EAAA,IAAA,CAAC1D,EAAD,CAAY,KAAK,WAAW,KAAK,KAAK,MAAO,EAAE,sBAAsB,CAAI,CAAA,CAClF,ECEMqE,GAAY,GAChBT,EAAW,OAAS,aAAe,GAAGA,EAAW,OAAO,KAAKvE,EAAWuE,CAAU,IAAMA,EAAW,OAExFU,IAAQ,CAAE,QAAO,WAAW,GAAO,aAAa,MAAsB,CACjF,GAAM,CAAE,KAAMrE,EAAe,EACvB,CAAE,aAAcc,EAAqB,EACrCwD,EAAaC,GAAcC,EACjC,OACE,EAAAf,EAAA,IAAA,CAACpB,GAAD,CAAA,UACE,EAAAoB,EAAA,KAAA,CAACvF,GAAD,CAAA,SAAA,EACE,EAAAuF,EAAA,IAAA,CAAC5B,GAAD,CAAA,UACE,EAAA4B,EAAA,KAAA,CAACtB,EAAD,CAAA,SAAA,EACE,EAAAsB,EAAA,IAAA,CAACzB,EAAD,CAAA,SAAYyC,EAAE,sBAAsB,CAAa,CAAA,EAChDC,GAAW,EAAAjB,EAAA,IAAA,CAACzB,EAAD,CAAA,SAAYyC,EAAE,qBAAqB,CAAa,CAAA,EAAI,MAChE,EAAAhB,EAAA,IAAA,CAACzB,EAAD,CAAA,SAAYyC,EAAE,uBAAuB,CAAa,CAAA,GAClD,EAAAhB,EAAA,IAAA,CAACzB,EAAD,CAAW,UAAU,aAAc,SAAAyC,EAAE,uBAAuB,CAAa,CAAA,GACzE,EAAAhB,EAAA,IAAA,CAACzB,EAAD,CAAW,UAAU,aAAc,SAAAyC,EAAE,wBAAwB,CAAa,CAAA,GAC1E,EAAAhB,EAAA,IAAA,CAACzB,EAAD,CAAA,SAAYyC,EAAE,0BAA0B,CAAa,CAAA,CAC7C,CAAA,CAAA,CACC,CAAA,GACb,EAAAhB,EAAA,IAAA,CAACvB,EAAD,CAAA,SACGyC,EAAM,KAAK,CAAE,aAAY,QAAO,UAAS,cAAa,oBACrD,EAAAlB,EAAA,KAAA,CAACtB,EAAD,CAAA,SAAA,EACE,EAAAsB,EAAA,IAAA,CAACrB,EAAD,CAAA,UACE,EAAAqB,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,0BAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAACC,GAAD,CAA4B,YAAa,CAAA,EACxCY,GAAcM,IAAU,WAAY,EAAAnB,EAAA,IAAA,CAACjB,GAAD,CAAc,CAAA,EAAI,KACtDqC,GAAgB,EAAApB,EAAA,IAAA,CAACK,GAAD,CAAa,SAAUe,EAAc,EAAK,CAAA,EAAI,IAC3D,CACG,CAAA,CAAA,CAAA,EACVH,GACC,EAAAjB,EAAA,IAAA,CAACrB,EAAD,CAAW,UAAU,wBAAyB,SAAAqC,EAAEhE,EAAgBkD,EAAW,KAAK,CAAa,CAAA,EAC3F,MACJ,EAAAF,EAAA,IAAA,CAACrB,EAAD,CAAW,UAAU,4CAClB,SAAAgC,GAAST,CAAU,CACX,CAAA,GACX,EAAAF,EAAA,IAAA,CAACrB,EAAD,CAAW,UAAU,0BAA2B,SAAAuB,EAAW,OAAO,MAAkB,CAAA,GACpF,EAAAF,EAAA,IAAA,CAACrB,EAAD,CAAW,UAAU,gDAClB,SAAAqC,EAAE,uBAAwB,CAAE,SAAQ,CAAC,CAC7B,CAAA,GACX,EAAAhB,EAAA,IAAA,CAACrB,EAAD,CAAW,UAAU,wBAAwB,MAAOjC,EAAe2E,CAAW,EAC3E,SAAA5E,EAAmB4E,CAAW,CACtB,CAAA,CACH,CAAA,EArBKnB,EAAW,EAqBhB,CACX,CACQ,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEf,ECzEMoB,GAAmE,CACvE,gBAAiB,2BACjB,iBAAkB,2BAClB,wBAAyB,iCAC3B,EAGMC,EAAiB,GAA+C,CACpE,IAAMC,EAAU/F,EAAkBgG,CAAK,EACvC,OAAOD,EAAWF,GAAiBE,EAAQ,OAAS,2BAA8B,IACpF,EAGaE,OACXhH,EACU,CAAC,CACR,KAAK,CAAC,CACN,IAAI,EAAG,qBAAqB,CAAC,CAC7B,aAAa,EAAO,IAAY,CAC/B,IAAMiH,EAAUJ,EAAcE,CAAK,EAC/BE,GACFC,EAAQ,SAAS,CAAE,KAAM,SAAU,SAAQ,CAAC,CAEhD,CAAC,EAMQC,IAAuB,EAAgB,IAE9CN,EAAcO,CAAM,EACf,KAELC,IAAW,GACN,sBAELnG,EAAWmG,CAAM,IAAMnG,EAAWkG,CAAM,EACnC,wCAEFP,EAAcQ,CAAM,ECpChBC,GACX,EACA,EACA,EACA,EAEA,EAAU,KACP,CACH,IAAMC,GAAA,EAAiBtH,EAAAA,OAAAA,CAAOuH,CAAM,GACpC,EAAA/B,EAAA,UAAA,KAAgB,CACd,GAAI,CAACgC,EAAS,CACZ,EAAe,QAAUD,EACzB,MACF,CACA,IAAME,EAAUC,EAAS,GACrBD,IAAY,IAAMA,IAAYE,EAAOL,EAAe,OAAO,IAC7DM,EAASD,EAAOJ,CAAM,CAAC,EAEzB,EAAe,QAAUA,CAC3B,EAAG,CAACA,EAAQG,EAAUE,EAAUD,EAAQH,CAAO,CAAC,CAClD,ECxBaK,IACX,EACA,EACA,IACGR,EAAmBS,EAAOC,EAAWC,EAAWnD,EAAY,ECDpDoD,IACX,EACA,EACA,IACG,CACH,IAAMC,GAAA,EAAiBjI,EAAAA,OAAAA,CAAOkH,CAAM,GACpC,EAAA3B,EAAA,UAAA,KAAgB,CACd,IAAMiC,EAAUU,EAAU,EACpBC,EAAOrD,GAAamD,EAAe,QAASf,EAAQM,CAAO,EAC7DW,IAASX,GACXY,EAAUD,CAAI,EAEhB,EAAe,QAAUjB,CAC3B,EAAG,CAACA,EAAQgB,EAAWE,CAAS,CAAC,CACnC,ECIMC,GAAepI,EACX,CACN,KAAMC,EAAO,CAAC,aAAc,YAAa,WAAW,CAAC,EACrD,MAAOkD,GAAa,EACpB,OAAQ0D,GAAY,EAEpB,aAAc3G,EAAS,CAAC,CAAC,KAAK,EAC9B,YAAaA,EAAS,CAAC,CAAC,KAAK,EAC7B,UAAWC,GAAU,EAErB,MAAOF,EAAO,CAAC,OAAQ,SAAS,CAAC,CACnC,CAAC,CAAC,CACD,aAAa,EAAQ,IAAY,CAChC,IAAM6G,EACJuB,EAAO,OAAS,aAAerB,GAAoBqB,EAAO,OAAQA,EAAO,YAAY,EAAI,KACvFvB,GACFC,EAAQ,SAAS,CAAE,KAAM,SAAU,KAAM,CAAC,cAAc,EAAG,SAAQ,CAAC,CAExE,CAAC,EAIGuB,IAAS,EAAsC,KAAoD,CACvG,OACA,MAAO,GACP,OAAQ,GACR,aAAc,GACd,YAAa,GACb,UAAW,GACX,OACF,GAEMC,IAAgB,CACpB,OACA,QACA,SACA,eACA,cACA,eAEIC,IAAS,YACJ,CAAE,OAAM,QAAO,SAAQ,cAAa,OAAQ,CAAC,CAAE,EAEjDA,IAAS,aACZ,CAAE,OAAM,QAAO,SAAQ,eAAc,cAAa,YAAW,OAAQ,CAAC,CAAE,EACxE,CAAE,OAAM,QAAO,SAAQ,cAAa,YAAW,OAAQ,CAAC,CAAE,EAI1DC,GAAa,GACjB,IAAI,KACDC,GAAe,CAAC,EAAA,CAAG,SAAS,CAAE,gBAC7B,CAACrD,EAAW,OAAQ,GAAI3E,EAAkB2E,CAAU,EAAI,CAACvE,EAAWuE,CAAU,CAAC,EAAI,CAAC,CAAE,CAAC,CAAC,IAAItE,CAAU,CACxG,CACF,EAGI4H,EAAe,CAAC,QAAS,SAAU,cAAc,EAEjDC,GAAmC,IAAI,IAAID,EAAa,IAAK,GAAS,IAAIE,GAAM,CAAC,EAMjFC,GAAyB,GAAuC,CACpE,IAAMC,EAAS1H,EAAe2H,CAAK,EACnC,GAAI,IAAO,SAAW,GAAKD,EAAO,KAAM,GAAUH,GAAY,IAAIK,EAAM,IAAI,CAAC,GAG7E,OAAOF,EAAO,IAAInE,CAAa,CAAC,CAAC,KAAK,GAAG,CAC3C,EAQasE,IACX,EACA,EAAgC,SAC7B,CACH,IAAMC,EAAmB9E,GAAoB,EACvC,CAAE,eAAgBF,GAAkB,EACpCiF,EAAWnI,EAAY,EACvBoI,EAAOhG,GAAgC,CAC3C,SAAUjD,GAAYgI,EAAY,EAClC,cAAeE,GAAMgB,EAAaC,CAAY,CAChD,CAAC,EACK,CAAE,WAAU,WAAU,aAAcF,EAgD1C,OA9CA1B,GADc1E,EAAS,CAAE,QAASoG,EAAK,QAAS,KAAM,OAAQ,CAE5D,GAAA,EACAhJ,EAAAA,YAAAA,KAAkBmJ,EAAU,QAAQ,EAAG,CAACA,CAAS,CAAC,GAAA,EAClDnJ,EAAAA,YAAAA,CAAa,GAAmBqH,EAAS,SAAUT,EAAQ,CAAE,eAAgB,EAAM,CAAC,EAAG,CAACS,CAAQ,CAAC,CACnG,EAEAK,GADe9E,EAAS,CAAE,QAASoG,EAAK,QAAS,KAAM,QAAS,CAE9D,GAAA,EACAhJ,EAAAA,YAAAA,KAAkBmJ,EAAU,cAAc,EAAG,CAACA,CAAS,CAAC,GAAA,EACxDnJ,EAAAA,YAAAA,CAAa,GAAmBqH,EAAS,eAAgBR,EAAQ,CAAE,eAAgB,EAAM,CAAC,EAAG,CAACQ,CAAQ,CAAC,CACzG,EAoCO,CACL,OACA,SApCe2B,EAAK,aAAa,KAAO,IAAW,CACnD,IAAMI,EAAQhB,GAAUC,CAAW,EACnC,GAAIe,EAAM,IAAI1I,EAAWsH,EAAO,MAAM,CAAC,EAAG,CACxCqB,EAAS,SAAU,CAAE,QAAS,wBAAyB,CAAC,EACxD,MACF,CACA,GAAIrB,EAAO,OAAS,cAAgBoB,EAAM,IAAI1I,EAAWsH,EAAO,YAAY,CAAC,EAAG,CAC9EqB,EAAS,eAAgB,CAAE,QAAS,wBAAyB,CAAC,EAC9D,MACF,CACA,IAAMC,EAAWtH,EAAegG,EAAO,IAAI,EACrCuB,EAAU,MAAMtG,GACpB6F,EAAiB,YAAY,CAC3B,WACA,MAAO,CAAE,WAAYZ,GAAaF,CAAM,EAAG,MAAOA,EAAO,KAAM,CACjE,CAAC,CACH,EACA,GAAI,CAACuB,EAAQ,GAAI,CACf,IAAMb,EAAS1H,EAAeuI,EAAQ,KAAK,EAC3C,IAAK,IAAMf,KAAQF,EAAc,CAC/B,IAAMkB,EAAQd,EAAO,KAAM,GAAce,EAAU,OAAS,IAAIjB,GAAM,EAClEgB,GACFH,EAASb,EAAM,CAAE,QAASjE,EAAciF,CAAK,CAAE,CAAC,CAEpD,CACA,MACF,CACA7H,EAAM,QAAQ1B,EAAQ,EAAE,gBAAgB,CAAC,EACzC,IAAMyJ,EAAKH,EAAQ,MAAM,aAEzB,MACIR,EADGO,IAAa,YACP,CAAE,GAAI,kCAAmC,OAAQ,CAAE,YAAaI,CAAG,EAAG,cAAe,EAAK,EAC1F,CAAE,GAAI,mBAAoB,OAAQ,CAAE,QAASA,CAAG,EAAG,cAAe,EAAK,CAAC,CACvF,CAGE,EACA,QAASZ,EAAiB,UAC1B,MAAOA,EAAiB,MACxB,aAAcL,GAAsBK,EAAiB,KAAK,CAC5D,CACF,ECnKMa,GAAc,CAAE,QAAO,YAC3B,EAAA7E,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oCAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,gBAAiB,SAAAyC,CAAU,CAAA,GACzC,EAAAzC,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,iCACX,SAAA8E,EAAM,IAAK,IACV,EAAA9E,EAAA,IAAA,CAAC,OAAD,CAEE,UAAU,kFAET,SAAA0D,CACG,EAJCA,CAID,CACP,CACC,CAAA,CACD,IASMqB,IAAmB,CAAE,SAAQ,eAAc,UAAiC,CACvF,GAAM,CAAE,KAAMxI,EAAe,EACvBqI,EAAK9C,EAAO,KAAK,EACvB,GAAI8C,IAAO,IAAMvB,IAAS,YACxB,OAAO,KAET,IAAMtB,EAASiD,EAAa,KAAK,GAAKnJ,EAAc+I,CAAE,EAChDK,EAAW5B,IAAS,aAAetB,EAAS6C,EAC5CM,EAAe7B,IAAS,aAAe,CAACuB,EAAI7C,CAAM,EAAI,CAAC6C,CAAE,EAC/D,OACE,EAAA5E,EAAA,KAAA,CAAC,KAAD,CAAI,UAAU,oDAAd,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC6E,EAAD,CAAY,MAAO7D,EAAE,kBAAkB,EAAG,MAAO,CAACA,EAAE,sBAAuB,CAAE,UAAS,CAAC,CAAC,CAAI,CAAA,GAC5F,EAAAhB,EAAA,IAAA,CAAC6E,EAAD,CAAY,MAAO7D,EAAE,qBAAqB,EAAG,MAAOkE,CAAe,CAAA,CACjE,GAER,EC/BaC,IAAc,CAAE,UAAS,WAA6B,CACjE,GAAM,CAAE,KAAM5I,EAAe,EACvB,CACJ,MAAO,CAAE,MAAK,QAAO,aACnBsB,EAAc,CAAE,UAAS,KAAM,MAAO,CAAC,EAC3C,OACE,EAAAmC,EAAA,KAAA,CAACvC,EAAD,CAAU,UAAU,QAApB,SAAA,EACE,EAAAuC,EAAA,IAAA,CAACtC,EAAD,CAAa,QAAQ,QAAQ,UAAU,OACpC,SAAAsD,EAAE,aAAa,CACL,CAAA,GACb,EAAAhB,EAAA,IAAA,CAACpC,EAAD,CACO,MACE,QACP,cAAewH,EACf,UAAWzH,EAAG,uBAAwB0H,EAAM,OAAS,GAAK,gBAAgB,EAEzE,SAAAA,EAAM,IAAK,IACV,EAAArF,EAAA,IAAA,CAACL,EAAD,CAEE,MAAO0D,EACP,KAAMpG,GAAWoG,GACjB,MAAOrC,EAAEhE,EAAgBqG,EAAK,EAC9B,YAAarC,EAAE7D,EAAsBkG,EAAK,CAC3C,EALMA,CAKN,CACF,CACS,CAAA,CACJ,GAEd,ECxBaiC,IAAe,CAAE,UAAS,cAAiC,CACtE,GAAM,CAAE,KAAM/I,EAAe,EACvBgJ,EAAOtJ,EAAM,CAAC,CAAC,MAAM,KACrB,CACJ,MAAO,CAAE,MAAK,QAAO,aACnB4B,EAAc,CAAE,UAAS,KAAM,OAAQ,CAAC,EAC5C,OACE,EAAAmC,EAAA,KAAA,CAACvC,EAAD,CAAU,UAAU,QAApB,SAAA,EACE,EAAAuC,EAAA,KAAA,CAACtC,EAAD,CAAa,QAAQ,QAAQ,UAAU,+BAAvC,SAAA,CACGsD,EAAE,0BAA0B,EAC5BwE,EAAW,MACV,EAAAxF,EAAA,IAAA,CAAClD,EAAD,CAAU,MAAOkE,EAAE,uBAAuB,EAAI,SAAAA,EAAE,mCAAmC,CAAY,CAAA,CAEtF,CACb,CAAA,GAAA,EAAAhB,EAAA,KAAA,CAACpC,EAAD,CAAiB,MAAY,QAAO,cAAewH,EAAU,UAAU,uBAAvE,SAAA,EACE,EAAApF,EAAA,IAAA,CAACL,EAAD,CACE,MAAM,OACN,KAAMI,GACN,MAAOiB,EAAE,uBAAuB,EAChC,YAAaA,EAAE,mCAAoC,CAAE,KAAMuE,GAAM,MAAQ,EAAG,CAAC,CAC9E,CAAA,GACD,EAAAvF,EAAA,IAAA,CAACL,EAAD,CACE,MAAM,UACN,KAAMvE,GACN,MAAO4F,EAAE,uBAAuB,EAChC,YAAaA,EAAE,kCAAkC,EACjD,SAAU,CAACwE,CACZ,CAAA,CACS,CACJ,CAAA,CAAA,GAEd,ECFaC,IAAQ,CAAE,QAAO,QAAO,OAAM,YAAW,QAAO,WAAuB,CAClF,GAAM,CAAE,KAAMlJ,EAAe,EAEvBmJ,EAAY1J,GAAuB,eAAe,EAClD,CAAE,SAAQ,UAAWsD,GAAc,EACnC,CAAE,YAAW,YAAajC,EAAqB,EAC/C,CAAE,OAAM,WAAU,UAAS,QAAO,gBAAiB0G,GAAwBsB,EAAM,GAAIlE,CAAK,EAC1F,CAACkC,EAAMvB,EAAQkD,GAAgBlH,EAAS,CAC5C,QAASoG,EAAK,QACd,KAAM,CAAC,OAAQ,SAAU,cAAc,CACzC,CAAC,EACKyB,EAAetC,IAAS,aAS9B,OARKqC,GASH,EAAA1F,EAAA,KAAA,CAAC5D,EAAD,CAAM,MAAM,SAAZ,SAAA,EACE,EAAA4D,EAAA,IAAA,CAACpD,GAAD,CAAqB,KAAMsH,EAAK,UAAU,OAAU,CAAA,GACpD,EAAAlE,EAAA,IAAA,CAAC3D,EAAD,CAAY,WAAY,CAAC,CAAE,MAAOuJ,EAAW,KAAMC,CAAK,CAAC,EAAU,OAAQ,CAAA,EAC1EC,GAAS,EAAA9F,EAAA,IAAA,CAACT,GAAD,CAAoB,QAAS,CAAA,EAAI,KAC1CwG,GACD,EAAA/F,EAAA,IAAA,CAACZ,GAAD,CAAA,UACE,EAAAY,EAAA,IAAA,CAAC,OAAD,CAAM,WAAA,GAAW,SAAW,GAAU,KAAKgG,EAASC,CAAK,EACvD,UAAA,EAAAjG,EAAA,KAAA,CAACxC,EAAD,CAAY,UAAU,QAAtB,SAAA,CACG6H,EAAM,OAAS,GAAI,EAAArF,EAAA,IAAA,CAACmF,GAAD,CAAY,QAASjB,EAAK,QAAgB,OAAQ,CAAA,EAAI,KACzE/C,IAAU,IAAA,IAAaJ,GACtB,EAAAf,EAAA,IAAA,CAACsF,GAAD,CAAa,QAASpB,EAAK,QAAmB,UAAW,CAAA,EACvD,MACJ,EAAAlE,EAAA,IAAA,CAACjC,EAAD,CAAe,QAASmG,EAAK,QAAS,KAAK,QAAQ,MAAOlD,EAAE,cAAc,EAAG,aAAa,KAAO,CAAA,GAEjG,EAAAhB,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWrC,EAAG,yBAA0BgI,GAAgB,gBAAgB,EAA7E,SAAA,EACE,EAAA3F,EAAA,IAAA,CAACjC,EAAD,CACE,QAASmG,EAAK,QACd,KAAK,SACL,MAAOlD,EAAE,eAAe,EACxB,KAAMA,EAAE,mBAAmB,EAC3B,aAAa,MACb,WAAY,GACZ,UAAU,WACX,CAAA,EACA2E,GACC,EAAA3F,EAAA,IAAA,CAACjC,EAAD,CACE,QAASmG,EAAK,QACd,KAAK,eACL,MAAOlD,EAAE,qBAAqB,EAC9B,KAAMA,EAAE,yBAAyB,EACjC,aAAa,MACb,WAAY,GACZ,UAAU,WACX,CAAA,EACC,IACD,KACL,EAAAhB,EAAA,IAAA,CAAC+E,GAAD,CAAyB,SAAsB,eAAoB,MAAO,CAAA,GAC1E,EAAA/E,EAAA,IAAA,CAACH,GAAD,CACE,QAASqE,EAAK,QACd,KAAK,cACL,MAAOlD,EAAE,uBAAwB,CAAE,MAAOA,EAAE,yBAAyB,CAAE,CAAC,EACxE,KAAM,CACP,CAAA,EACAqC,IAAS,YAAc,MACtB,EAAArD,EAAA,IAAA,CAACJ,GAAD,CACE,QAASsE,EAAK,QACd,KAAK,YACL,MAAOlD,EAAE,kBAAkB,EAC3B,KAAMA,EAAE,sBAAsB,EAC9B,QAAQ,UACT,CAAA,GAEH,EAAAhB,EAAA,IAAA,CAACzC,GAAD,CAAkB,QAAO,QAAS2I,CAAe,CAAA,GACjD,EAAAlG,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mCAAf,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC1C,GAAD,CAAQ,QAAQ,UAAU,QAAA,GACxB,UAAA,EAAA0C,EAAA,IAAA,CAACjE,EAAD,CAAM,GAAI8J,EAAO,SAAA7E,EAAE,eAAe,CAAQ,CAAA,CACpC,CAAA,GACR,EAAAhB,EAAA,IAAA,CAAC7D,GAAD,CAAuB,UAAS,aAAc6E,EAAE,iBAAiB,EAAG,SAAU8E,EAC3E,SAAA9E,EAAE,eAAe,CACN,CAAA,CACX,GACK,GACR,CAAA,CACD,CAAA,CACH,KAvEJ,EAAAhB,EAAA,KAAA,CAAC5D,EAAD,CAAM,MAAM,SAAZ,SAAA,EACE,EAAA4D,EAAA,IAAA,CAAC3D,EAAD,CAAY,WAAY,CAAC,CAAE,MAAOuJ,EAAW,KAAMC,CAAK,CAAC,EAAU,OAAQ,CAAA,GAC3E,EAAA7F,EAAA,IAAA,CAACX,EAAD,CAAW,CAAA,CACP,GAsEZ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{_ as n,c as r,d as i,f as a,m as o,p as s,u as c}from"./badge-CqKF1pwz.js";import{n as l}from"./createLucideIcon-CLmh7Go-.js";import{i as u}from"./skeleton-B5MP72Kw.js";import{a as d,i as f,n as p,r as m,t as h}from"./select-C0USI-Ox.js";import{a as g,r as _,t as v}from"./field-COOzRptX.js";import{t as y}from"./cn-DVhJ55Mo.js";import{c as b,r as x}from"./zod-Cry7YvLY.js";import{n as S}from"./settle-CFU6YpQ0.js";import{t as C}from"./HintedLabel-DzHnEdIK.js";import{t as w}from"./useDiscardGuard-BskWSlbT.js";var T=e(t(),1),E=({open:e,onOpenChange:t,title:d,description:f,dirty:p,pending:m,submitLabel:h,pendingLabel:_,onSubmit:v,size:b,bodyClassName:x,onCloseAutoFocus:S,children:C})=>{let{t:E}=l(),{requestOpenChange:D,discardPrompt:O}=w({dirty:p,pending:m,onOpenChange:t});return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(r,{open:e,onOpenChange:D,children:(0,T.jsxs)(c,{size:b,...f?{}:{"aria-describedby":void 0},...S?{onCloseAutoFocus:S}:{},children:[(0,T.jsxs)(s,{className:`pr-14`,children:[(0,T.jsx)(o,{children:d}),f?(0,T.jsx)(i,{children:f}):null]}),(0,T.jsxs)(`form`,{noValidate:!0,onSubmit:v,className:`flex min-h-0 flex-1 flex-col`,children:[(0,T.jsx)(g,{className:y(`relative min-h-0 flex-1 gap-5 overflow-y-auto px-6 pt-1 pb-6`,x),children:C}),(0,T.jsxs)(a,{children:[(0,T.jsx)(u,{type:`button`,variant:`outline`,onClick:()=>D(!1),children:E(`common.cancel`)}),(0,T.jsx)(n,{pending:m,pendingLabel:_,children:h})]})]})]})}),O]})},D=({control:e,name:t,label:n,hint:r,description:i,placeholder:a,options:o,disabled:s})=>{let{field:{ref:c,onBlur:l,onChange:u,value:g,name:y},fieldState:w}=b({control:e,name:t}),E=`field-${t}`,D=w.error?.message,O=r?`${E}-hint`:void 0;return(0,T.jsxs)(v,{"data-invalid":w.invalid||void 0,children:[(0,T.jsx)(C,{htmlFor:E,label:n,hint:r,hintId:O}),(0,T.jsxs)(h,{name:y,value:typeof g==`string`?g:``,onValueChange:u,disabled:s,children:[(0,T.jsx)(f,{id:E,ref:c,onBlur:l,"aria-invalid":w.invalid||void 0,"aria-describedby":S(O,i&&`${E}-description`,D&&`${E}-error`),className:`w-full`,children:(0,T.jsx)(d,{placeholder:a})}),(0,T.jsx)(p,{children:o.map(e=>(0,T.jsx)(m,{value:e.value,children:e.label},e.value))})]}),i?(0,T.jsx)(_,{id:`${E}-description`,children:i}):null,(0,T.jsx)(x,{id:`${E}-error`,message:D})]})};export{E as n,D as t};
|
|
2
|
-
//# sourceMappingURL=FormSelectField-BzE9Lq9i.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FormSelectField-BzE9Lq9i.js","names":["_Fragment","__toESM","SubmitButton","Sheet","SheetDescription","SheetFooter","SheetTitle","SheetHeader","SheetContent","useTranslation","Button","SelectValue","SelectTrigger","SelectContent","SelectItem","Select","FieldGroup","FieldDescription","Field","cn","useController","FormFieldError","describedBy","HintedLabel","useDiscardGuard","import_jsx_runtime","require_jsx_runtime","FormSheet","requestOpenChange","description","onCloseAutoFocus","title","bodyClassName","t","submitLabel","discardPrompt","FormSelectField","fieldName","id","name","errorMessage","fieldState","hintId","hint","value","onChange","options","option"],"sources":["../../src/components/FormSheet/index.tsx","../../src/components/FormSelectField/index.tsx"],"sourcesContent":["import type { FormEventHandler, ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { FieldGroup } from '@/components/ui/field';\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetTitle,\n} from '@/components/ui/sheet';\nimport { cn } from '@/helpers/cn';\nimport { useDiscardGuard } from '@/hooks/useDiscardGuard';\nimport { SubmitButton } from '../SubmitButton';\n\ntype FormSheetProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n /** Unsaved edits: closing asks before discarding them. */\n dirty: boolean;\n pending: boolean;\n submitLabel: string;\n pendingLabel: string;\n onSubmit: FormEventHandler<HTMLFormElement>;\n /** sm 400px (default), md 560px, lg 720px from the sm breakpoint; full width on phones. */\n size?: 'sm' | 'md' | 'lg';\n /** Layout overrides for the scrolling body (e.g. a split layout whose panes scroll on their own). */\n bodyClassName?: string;\n /**\n * Runs as the sheet finishes closing, before focus returns to the opener. Call `event.preventDefault()` to\n * keep focus where it is (e.g. on a `SecretReveal` that took it).\n */\n onCloseAutoFocus?: (event: Event) => void;\n children: ReactNode;\n};\n\n/**\n * A form in a right-hand sheet: create or edit a record while the list stays in view. Labelled,\n * keyboard-closable and protected against losing unsaved edits; the header and the footer (Cancel, then the\n * primary action) stay put while a long body scrolls.\n */\nexport const FormSheet = ({\n open,\n onOpenChange,\n title,\n description,\n dirty,\n pending,\n submitLabel,\n pendingLabel,\n onSubmit,\n size,\n bodyClassName,\n onCloseAutoFocus,\n children,\n}: FormSheetProps) => {\n const { t } = useTranslation();\n const { requestOpenChange, discardPrompt } = useDiscardGuard({ dirty, pending, onOpenChange });\n return (\n <>\n <Sheet open={open} onOpenChange={requestOpenChange}>\n <SheetContent\n size={size}\n {...(description ? {} : { 'aria-describedby': undefined })}\n {...(onCloseAutoFocus ? { onCloseAutoFocus } : {})}\n >\n <SheetHeader className=\"pr-14\">\n <SheetTitle>{title}</SheetTitle>\n {description ? <SheetDescription>{description}</SheetDescription> : null}\n </SheetHeader>\n <form noValidate onSubmit={onSubmit} className=\"flex min-h-0 flex-1 flex-col\">\n {/* The scrolling body is the field group itself, so `bodyClassName` lays out the fields. */}\n <FieldGroup\n className={cn('relative min-h-0 flex-1 gap-5 overflow-y-auto px-6 pt-1 pb-6', bodyClassName)}\n >\n {children}\n </FieldGroup>\n <SheetFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => requestOpenChange(false)}>\n {t('common.cancel')}\n </Button>\n <SubmitButton pending={pending} pendingLabel={pendingLabel}>\n {submitLabel}\n </SubmitButton>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n {discardPrompt}\n </>\n );\n};\n","import { useController, type Control, type FieldPath, type FieldValues } from 'react-hook-form';\nimport { Field, FieldDescription } from '@/components/ui/field';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { describedBy } from '@/helpers/describedBy';\nimport { FormFieldError } from '../FormFieldError';\nimport { HintedLabel } from '../HintedLabel';\n\nexport type SelectOption = { value: string; label: string };\n\ntype FormSelectFieldProps<TValues extends FieldValues> = {\n control: Control<TValues>;\n name: FieldPath<TValues>;\n label: string;\n /** Explanation behind an info icon next to the label (DESIGN.md, helper-text rule). */\n hint?: string;\n description?: string;\n placeholder?: string;\n options: readonly SelectOption[];\n disabled?: boolean;\n};\n\nexport const FormSelectField = <TValues extends FieldValues>({\n control,\n name,\n label,\n hint,\n description,\n placeholder,\n options,\n disabled,\n}: FormSelectFieldProps<TValues>) => {\n const {\n field: { ref, onBlur, onChange, value, name: fieldName },\n fieldState,\n } = useController({ control, name });\n const id = `field-${name}`;\n const errorMessage = fieldState.error?.message;\n const hintId = hint ? `${id}-hint` : undefined;\n return (\n <Field data-invalid={fieldState.invalid || undefined}>\n <HintedLabel htmlFor={id} label={label} hint={hint} hintId={hintId} />\n <Select\n name={fieldName}\n value={typeof value === 'string' ? value : ''}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n id={id}\n ref={ref}\n onBlur={onBlur}\n aria-invalid={fieldState.invalid || undefined}\n aria-describedby={describedBy(\n hintId,\n description && `${id}-description`,\n errorMessage && `${id}-error`,\n )}\n className=\"w-full\"\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {description ? <FieldDescription id={`${id}-description`}>{description}</FieldDescription> : null}\n <FormFieldError id={`${id}-error`} message={errorMessage} />\n </Field>\n );\n};\n"],"mappings":"inBA4Ca2B,GAAa,CACxB,OACA,eACA,QACA,cACA,QACA,UACA,cACA,eACA,WACA,OACA,gBACA,mBACA,cACoB,CACpB,GAAM,CAAE,KAAMlB,EAAe,EACvB,CAAE,oBAAmB,iBAAkBe,EAAgB,CAAE,QAAO,UAAS,cAAa,CAAC,EAC7F,OACE,EAAAC,EAAA,KAAA,CAAAzB,EAAAA,SAAA,CAAA,SAAA,EACE,EAAAyB,EAAA,IAAA,CAACtB,EAAD,CAAa,OAAM,aAAcyB,EAC/B,UAAA,EAAAH,EAAA,KAAA,CAACjB,EAAD,CACQ,OACN,GAAKqB,EAAc,CAAC,EAAI,CAAE,mBAAoB,IAAA,EAAU,EACxD,GAAKC,EAAmB,CAAE,kBAAiB,EAAI,CAAC,EAHlD,SAAA,EAKE,EAAAL,EAAA,KAAA,CAAClB,EAAD,CAAa,UAAU,QAAvB,SAAA,EACE,EAAAkB,EAAA,IAAA,CAACnB,EAAD,CAAA,SAAayB,CAAkB,CAAA,EAC9BF,GAAc,EAAAJ,EAAA,IAAA,CAACrB,EAAD,CAAA,SAAmByB,CAA8B,CAAA,EAAI,IACzD,CACb,CAAA,GAAA,EAAAJ,EAAA,KAAA,CAAC,OAAD,CAAM,WAAA,GAAqB,WAAU,UAAU,+BAA/C,SAAA,EAEE,EAAAA,EAAA,IAAA,CAACT,EAAD,CACE,UAAWG,EAAG,+DAAgEa,CAAa,EAE1F,UACS,CAAA,GACZ,EAAAP,EAAA,KAAA,CAACpB,EAAD,CAAA,SAAA,EACE,EAAAoB,EAAA,IAAA,CAACf,EAAD,CAAQ,KAAK,SAAS,QAAQ,UAAU,YAAekB,EAAkB,EAAK,EAC3E,SAAAK,EAAE,eAAe,CACZ,CAAA,GACR,EAAAR,EAAA,IAAA,CAACvB,EAAD,CAAuB,UAAuB,eAC3C,SAAAgC,CACW,CAAA,CACH,CAAA,CAAA,CACT,CACM,CAAA,CAAA,GACT,CAAA,EACNC,CACD,CAAA,CAAA,CAEN,ECzEaC,GAAgD,CAC3D,UACA,OACA,QACA,OACA,cACA,cACA,UACA,cACmC,CACnC,GAAM,CACJ,MAAO,CAAE,MAAK,SAAQ,WAAU,QAAO,KAAMC,GAC7C,cACEjB,EAAc,CAAE,UAAS,MAAK,CAAC,EAC7BkB,EAAK,SAASC,IACdC,EAAeC,EAAW,OAAO,QACjCC,EAASC,EAAO,GAAGL,EAAG,OAAS,IAAA,GACrC,OACE,EAAAb,EAAA,KAAA,CAACP,EAAD,CAAO,eAAcuB,EAAW,SAAW,IAAA,GAA3C,SAAA,EACE,EAAAhB,EAAA,IAAA,CAACF,EAAD,CAAa,QAASe,EAAW,QAAa,OAAc,QAAS,CAAA,GACrE,EAAAb,EAAA,KAAA,CAACV,EAAD,CACE,KAAMsB,EACN,MAAO,OAAOO,GAAU,SAAWA,EAAQ,GAC3C,cAAeC,EACL,WAJZ,SAAA,EAME,EAAApB,EAAA,IAAA,CAACb,EAAD,CACM,KACC,MACG,SACR,eAAc6B,EAAW,SAAW,IAAA,GACpC,mBAAkBnB,EAChBoB,EACAb,GAAe,GAAGS,EAAG,cACrBE,GAAgB,GAAGF,EAAG,OACxB,EACA,UAAU,SAEV,UAAA,EAAAb,EAAA,IAAA,CAACd,EAAD,CAA0B,aAAc,CAAA,CAC3B,CAAA,GACf,EAAAc,EAAA,IAAA,CAACZ,EAAD,CAAA,SACGiC,EAAQ,IAAK,IACZ,EAAArB,EAAA,IAAA,CAACX,EAAD,CAA+B,MAAOiC,EAAO,MAC1C,SAAAA,EAAO,KACE,EAFKA,EAAO,KAEZ,CACb,CACY,CAAA,CACT,IACPlB,GAAc,EAAAJ,EAAA,IAAA,CAACR,EAAD,CAAkB,GAAI,GAAGqB,EAAG,cAAgB,SAAAT,CAA8B,CAAA,EAAI,MAC7F,EAAAJ,EAAA,IAAA,CAACJ,EAAD,CAAgB,GAAI,GAAGiB,EAAG,QAAS,QAASE,CAAe,CAAA,CACtD,GAEX"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{it as n,rt as r}from"./src-ndgTSYLX.js";import{k as i,n as a}from"./badge-CqKF1pwz.js";import{n as o,t as s}from"./createLucideIcon-CLmh7Go-.js";import{T as c,w as l}from"./es2015-BHmI7wjK.js";import{c as u}from"./constants-a_15vqOh.js";import{t as d}from"./clock-2arjsgZ4.js";import{t as f}from"./cn-DVhJ55Mo.js";import{n as p}from"./labels-DQckbLGW.js";var m={name:`circle-dashed`,size:24,node:[[`path`,{d:`M10.1 2.182a10 10 0 0 1 3.8 0`,key:`5ilxe3`}],[`path`,{d:`M13.9 21.818a10 10 0 0 1-3.8 0`,key:`11zvb9`}],[`path`,{d:`M17.609 3.721a10 10 0 0 1 2.69 2.7`,key:`1iw5b2`}],[`path`,{d:`M2.182 13.9a10 10 0 0 1 0-3.8`,key:`c0bmvh`}],[`path`,{d:`M20.279 17.609a10 10 0 0 1-2.7 2.69`,key:`1ruxm7`}],[`path`,{d:`M21.818 10.1a10 10 0 0 1 0 3.8`,key:`qkgqxc`}],[`path`,{d:`M3.721 6.391a10 10 0 0 1 2.7-2.69`,key:`1mcia2`}],[`path`,{d:`M6.391 20.279a10 10 0 0 1-2.69-2.7`,key:`1fvljs`}]]};m.node;var h=s(m),g={name:`git-pull-request`,size:24,node:[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M13 6h3a2 2 0 0 1 2 2v7`,key:`1yeb86`}],[`line`,{x1:`6`,x2:`6`,y1:`9`,y2:`21`,key:`rroup`}]]};g.node;var _=s(g),v=(e,t)=>e.kind!==`component`&&e.localized===!0&&t.localized===!0,y=(e,t)=>!e||!t||t.kind===`component`?[]:t.fields.filter(n=>{let r=e.fields.find(e=>e.id===n.id);return r!==void 0&&n.unique===!0&&!n.deprecated&&v(e,r)!==v(t,n)}),b=(e,t={})=>({category:e,breaking:!1,destructive:!1,supported:!0,dropsValues:!1,prerequisites:[],cleanup:[],...t}),x=(e,t)=>e?.fields.find(e=>e.id===t),S=e=>!!(e&&(e.filterable||e.sortable)),C={string:`String`,text:`String`,code:`String`,slug:`String`,email:`String`,url:`String`,uid:`String`,enum:`Enum`,date:`Date`,datetime:`DateTime`,time:`Time`,number:`Float`,integer:`Int`,decimal:`Decimal`,biginteger:`BigInt`,boolean:`Boolean`,json:`JSON`,richtext:`RichText`,media:`Media`,relation:`Relation`,component:`Component`,dynamiczone:`DynamicZone`},w=new Set([`string`,`text`]),T=new Set([`string`,`text`,`code`]),E=new Set([`jsonString`,`jsonNumber`,`numericString`,`boolean`]),D=e=>{let t=e?.settings??{};return t.minLength!==void 0||t.maxLength!==void 0||t.pattern!==void 0||t.validate===!0},O=(e,t)=>{let r=n(e),i=n(t),a=r===`jsonNumber`&&i===`numericString`||r===`numericString`&&i===`jsonNumber`,o=E.has(r)&&w.has(t.type),s=r===`jsonString`&&e.type!==`code`&&t.type===`richtext`,c=e.type===`richtext`&&w.has(t.type);return a||o||s||c||r===`jsonString`&&i===`jsonStringArray`},ee=(e,t)=>n(e)!==n(t)&&!O(e,t),te=e=>e.kind===`field.type`&&e.dropsValues===!0,k=e=>e?.required?[e.defaultValue===void 0?`validateRequired`:`backfill`]:[],A=(e,t,r,i)=>{let a=C[e]!==C[t]||t===`code`&&e!==`code`,o={type:e,...r?{settings:r.settings}:{}},s={type:t,...i?{settings:i.settings}:{}},c=n(o);return c===n(s)?c===`jsonString`&&T.has(t)&&!D(i)||e===`integer`&&t===`number`||e===`biginteger`&&t===`decimal`&&i?.type===`decimal`&&i.settings.precision===void 0?b(`additive`,{breaking:a}):b(`validation`,{breaking:a,prerequisites:[`validateValues`]}):ee(o,s)?b(`conversion`,{breaking:a,destructive:!0,dropsValues:!0,prerequisites:[`convert`,`validateValues`,...k(i)]}):b(`conversion`,{breaking:a,destructive:e===`richtext`&&w.has(t),prerequisites:[`convert`,`validateValues`]})},j=(e,t)=>{if(typeof e==`number`&&typeof t==`number`)return e-t;try{let n=BigInt(String(e))-BigInt(String(t));return n===0n?0:n>0n?1:-1}catch{let n=Number(e)-Number(t);return Number.isNaN(n)?String(e).localeCompare(String(t)):n}},M=(e,t,n)=>{if(n==null)return!1;if(t==null)return!0;let r=j(t,n);return e===`lower`?r<0:r>0},N=e=>Array.isArray(e)?e.map(e=>String(typeof e==`object`&&e?e.value:e)):[],P=(e,t)=>{let n=new Set(N(t));return N(e).some(e=>!n.has(e))},F=e=>e?b(`validation`,{prerequisites:[`validateValues`]}):b(`additive`),I=e=>{let{property:t,from:n,to:r}=e;switch(t){case`minLength`:case`min`:return F(M(`lower`,n,r));case`maxLength`:case`max`:case`precision`:case`scale`:return F(M(`upper`,n,r));case`pattern`:return F(r!==void 0);case`values`:return F(P(n,r));case`components`:case`allowedKinds`:case`protocols`:return F(r!==void 0&&(n===void 0||P(n,r)));case`sourceFieldId`:case`language`:return b(`metadata`);case`validate`:return F(r===!0);case`multiple`:case`repeatable`:case`cardinality`:return b(`conversion`,{breaking:!0,destructive:r===!1||r===`one`,prerequisites:[`convert`,`validateValues`]});case`formatVersion`:return b(`conversion`,{prerequisites:[`convert`,`validateValues`]});case`target`:case`component`:return b(`conversion`,{breaking:!0,destructive:!0,prerequisites:[`convert`]});default:return b(`validation`,{prerequisites:[`validateValues`]})}},L=(e,{before:t,after:n})=>{let r=x(t,e.fieldId),i=x(n,e.fieldId);switch(e.kind){case`field.added`:{let e=[];return i?.required&&e.push(i.defaultValue===void 0?`validateRequired`:`backfill`),i?.unique&&e.push(`checkUnique`),S(i)&&e.push(`buildIndex`),b(i?.required?`requiredField`:`additive`,{prerequisites:e})}case`field.removed`:return b(`removal`,{breaking:!0,cleanup:[...S(r)?[`dropIndex`]:[],...r?.unique?[`releaseUnique`]:[]]});case`field.order`:case`field.metadata`:return b(`metadata`);case`field.editor`:return b(`editorSwap`);case`field.apiKey`:return b(`contract`,{breaking:!0});case`field.type`:{let t=A(e.from,e.to,r,i);return i?.unique&&r?.unique&&!t.prerequisites.includes(`checkUnique`)?{...t,prerequisites:[...t.prerequisites,`checkUnique`]}:t}case`field.required`:return e.to===!0?b(`requiredField`,{prerequisites:[i?.defaultValue===void 0?`validateRequired`:`backfill`]}):b(`additive`);case`field.localized`:{if(n?.kind===`component`||n?.localized!==!0)return b(`metadata`);let r=y(t,n).some(t=>t.id===e.fieldId)?[`checkUnique`]:[];return e.to===!0?b(`additive`,{prerequisites:r}):b(`conversion`,{destructive:!0,prerequisites:[`convert`,...r]})}case`field.public`:case`field.deprecated`:return b(`metadata`,{breaking:e.kind===`field.public`?e.to===!1:e.to===!0});case`field.unique`:return e.to===!0?b(`constraint`,{prerequisites:[`checkUnique`]}):b(`additive`,{cleanup:[`releaseUnique`]});case`field.filterable`:case`field.sortable`:return S(i)&&!S(r)?b(`index`,{prerequisites:[`buildIndex`]}):!S(i)&&S(r)?b(`index`,{cleanup:[`dropIndex`]}):b(`metadata`);case`field.settings`:return I(e);default:return b(`metadata`)}},R=(e,t)=>{let n;switch(e.kind){case`definition.added`:n=b(`additive`);break;case`definition.removed`:n=b(`removal`,{breaking:!0});break;case`definition.apiKey`:case`definition.pluralApiKey`:n=b(`contract`,{breaking:!0});break;case`definition.metadata`:n=b(`metadata`);break;case`model.kind`:n=e.to===`singleton`?b(`validation`,{breaking:!0,prerequisites:[`validateValues`]}):b(`contract`,{breaking:!0});break;case`model.localized`:{let r=y(t.before,t.after).length>0?[`checkUnique`]:[];n=e.to===!0?b(`additive`,{prerequisites:r}):b(`conversion`,{destructive:!0,prerequisites:[`convert`,...r]});break}case`model.draftAndPublish`:n=e.to===!0?b(`additive`):b(`conversion`,{destructive:!0,prerequisites:[`convert`]});break;default:n=L(e,t)}return{...e,...n}},z=(e,t)=>e.map(e=>R(e,t)),B=[`convert`,`backfill`,`validateRequired`,`validateValues`,`checkUnique`,`buildIndex`],V=e=>{let t=new Set(e.flatMap(e=>e.prerequisites));return{breaking:e.some(e=>e.breaking),destructive:e.some(e=>e.destructive),supported:e.every(e=>e.supported),prerequisites:B.filter(e=>t.has(e)),cleanup:[...new Set(e.flatMap(e=>e.cleanup))],metadataOnly:e.every(e=>e.category===`metadata`||e.category===`editorSwap`)}},H=e(t(),1),U={"definition.added":`models.changes.definitionAdded`,"definition.removed":`models.changes.definitionRemoved`,"definition.apiKey":`models.changes.definitionApiKey`,"definition.pluralApiKey":`models.changes.definitionPluralApiKey`,"definition.metadata":`models.changes.definitionMetadata`,"model.kind":`models.changes.modelKind`,"model.localized":`models.changes.modelLocalized`,"model.draftAndPublish":`models.changes.modelDraftAndPublish`,"field.added":`models.changes.fieldAdded`,"field.removed":`models.changes.fieldRemoved`,"field.order":`models.changes.fieldOrder`,"field.apiKey":`models.changes.fieldApiKey`,"field.metadata":`models.changes.fieldMetadata`,"field.editor":`models.changes.fieldEditor`,"field.type":`models.changes.fieldType`,"field.required":`models.changes.fieldRequired`,"field.localized":`models.changes.fieldLocalized`,"field.public":`models.changes.fieldPublic`,"field.deprecated":`models.changes.fieldDeprecated`,"field.unique":`models.changes.fieldUnique`,"field.filterable":`models.changes.fieldFilterable`,"field.sortable":`models.changes.fieldSortable`,"field.settings":`models.changes.fieldSettings`},W=new Set([`model.localized`,`model.draftAndPublish`,`field.required`,`field.localized`,`field.public`,`field.deprecated`,`field.unique`,`field.filterable`,`field.sortable`]),ne=new Set([`field.type`,`field.added`]),G=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`?String(e):``,K=e=>typeof e==`string`?c.t(`models.dataTypes.${e}.name`):``,q=(e,t,n)=>(n?.fields.find(t=>t.id===e)??t?.fields.find(t=>t.id===e))?.label??e??``,J=(e,t,n)=>{let r=q(e.fieldId,t,n),i=e.kind===`field.added`&&typeof e.to==`object`&&e.to!==null?e.to.type:void 0,a=ne.has(e.kind)?{from:K(e.from),to:K(e.to),type:K(i)}:{from:G(e.from),to:G(e.to)},o=e.dropsValues?`models.changes.fieldTypeDropped`:U[e.kind];return c.t(o,{field:r,name:n?.label??t?.label??``,property:e.property?p(e.property):``,...a,...W.has(e.kind)?{context:e.to===!0?`on`:`off`}:{}})},Y=e=>Object.hasOwn(l.models.steps,e),X=e=>{if(e.kind!==`convert`||typeof e.change!=`object`||e.change===null)return;let t=e.change,{fieldId:n,from:i,to:a}=t;if(te(t)&&r(i)&&r(a))return{fieldId:typeof n==`string`?n:void 0,from:i,to:a}},Z=(e,t)=>{let n=new Set(e.flatMap(e=>{let t=X(e);return t?.fieldId?[`${String(e.ownerId)}:${t.fieldId}`]:[]}));return e.map((e,n)=>({step:e,impact:t?.[n]})).filter(({step:e})=>e.kind!==`validateValues`||!e.fieldId||!n.has(`${String(e.ownerId)}:${e.fieldId}`))},Q=e=>c.t(`models.dataTypes.${e}.name`),re=(e,t,n,r)=>{let i=X(e);if(i)return c.t(`models.plan.stepDropped`,{field:q(i.fieldId,t,n),from:Q(i.from),to:Q(i.to),count:r?.droppedEntries??r?.affectedHeads??0});let a=q(e.fieldId,t,n);return Y(e.kind)?c.t(`models.steps.${e.kind}`,{field:a}):e.kind},ie=(e,t)=>{if(!t||X(e))return;let n=c.t(`models.plan.stepEntries`,{count:t.affectedHeads});if(!t.invalidHeads)return n;let r={count:t.invalidEntries??t.invalidHeads,versions:c.t(`models.plan.stepVersions`,{count:t.invalidHeads})};return`${n} · ${e.kind===`validateRequired`?c.t(`models.plan.stepMissingRequired`,r):c.t(`models.plan.stepInvalid`,r)}`},ae=e=>e.some(e=>(e.invalidHeads??0)>0),oe=[`breaking`,`prerequisites`,`live`,`metadata`],$=new Set([`metadata`,`editorSwap`]),se=e=>e.breaking||e.destructive?`breaking`:e.prerequisites.length>0?`prerequisites`:$.has(e.category)?`metadata`:`live`,ce=e=>e.breaking||e.destructive?`breaking`:e.prerequisites.length>0?`prerequisites`:e.metadataOnly?`metadata`:`live`,le=e=>oe.map(t=>({bucket:t,changes:e.filter(e=>se(e)===t)})).filter(e=>e.changes.length>0),ue={breaking:`warning`,prerequisites:`scheduled`,live:`success`,metadata:`neutral`},de=({bucket:e,className:t})=>{let{t:n}=o();return(0,H.jsx)(a,{tone:ue[e],label:n(u[e]),className:t})},fe={waiting:`text-muted-foreground`,failing:`border-warning/40 bg-warning-muted text-warning`,later:`text-muted-foreground`},pe={waiting:d,failing:i,later:h},me=({steps:e,impacts:t,before:n,after:r,phase:i})=>{let a=Z(e,t);return(0,H.jsx)(`ol`,{className:`space-y-0`,children:a.map(({step:e,impact:t},o)=>{let s=i===`after`?`later`:t?.invalidHeads?`failing`:`waiting`,c=pe[s],l=ie(e,t);return(0,H.jsxs)(`li`,{className:`flex gap-3`,children:[(0,H.jsxs)(`span`,{className:`flex flex-col items-center`,children:[(0,H.jsx)(`span`,{className:f(`flex size-6 shrink-0 items-center justify-center rounded-full border bg-card`,fe[s]),children:(0,H.jsx)(c,{"aria-hidden":`true`,className:`size-3.5`})}),o<a.length-1?(0,H.jsx)(`span`,{"aria-hidden":`true`,className:`my-1 w-px flex-1 bg-border`}):null]}),(0,H.jsxs)(`div`,{className:`min-w-0 pt-0.5 pb-4 text-sm`,children:[re(e,n,r,t),l?(0,H.jsx)(`span`,{className:`block text-meta text-muted-foreground`,children:l}):null]})]},`${e.kind}-${o}`)})})};export{ae as a,z as c,le as i,V as l,de as n,J as o,ce as r,R as s,me as t,_ as u};
|
|
2
|
-
//# sourceMappingURL=StepList-BXGYD9eJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StepList-BXGYD9eJ.js","names":["__iconData","i18next","en","i18next","AlertTriangle","__toESM","storageFamilyOf","isDataType","TriangleAlert","StatusChip","useTranslation","createLucideIcon","instance","translation_default","PLAN_BUCKET_LABEL_KEYS","Clock","cn","propertyLabel","__iconData$1","CircleDashed","__iconData","GitPullRequest","storedPerLocale","definition","field","uniqueFieldsChangingLocalization","before","after","previous","candidate","result","extra","findField","fieldId","hasIndex","API_SCALAR","PLAIN_TEXT_TYPES","TEXT_TARGETS","SCALAR_FAMILIES","hasTextConstraints","settings","convertsAcrossFamilies","fromFamily","from","toFamily","to","numericPair","toText","textToRichtext","richtextToText","typeChangeDropsValues","changeDropsValues","change","requiredStep","classifyTypeChange","breaking","fromShape","toShape","compareValues","a","b","diff","numeric","isTightened","order","bound","asStrings","value","entry","removesAny","kept","validation","tightened","classifySettingsChange","property","classifyFieldChange","prerequisites","classification","checks","classifyChange","context","classifyChanges","changes","PREREQUISITE_ORDER","summarizeChanges","kind","import_jsx_runtime","require_jsx_runtime","CHANGE_KEYS","TOGGLES","TYPE_CHANGE_KINDS","scalarText","dataTypeName","type","fieldLabelOf","describeChange","addedType","values","key","isKnownStep","droppedTypeChange","step","stepsToShow","dropped","steps","impacts","index","typeName","describeStep","impact","describeStepImpact","checked","counts","hasFailingCheck","PLAN_BUCKETS","METADATA_CATEGORIES","bucketOfChange","bucketOfPlan","summary","groupByBucket","bucket","group","BUCKET_TONES","BucketChip","t","STATUS_CLASSES","STATUS_ICONS","StepList","shown","status","phase","Icon","detail"],"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/circle-dashed.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/git-pull-request.mjs","../../../../packages/schema/src/diff/uniqueLocalization.ts","../../../../packages/schema/src/diff/classify.ts","../../src/features/Models/helpers/describeChange.ts","../../src/features/Models/helpers/describeStep.ts","../../src/features/Models/helpers/planBuckets.ts","../../src/features/Models/Builder/BucketChip/index.tsx","../../src/features/Models/Builder/ReviewSheet/StepList/index.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: \"circle-dashed\",\n size: 24,\n node: [\n [\"path\", { d: \"M10.1 2.182a10 10 0 0 1 3.8 0\", key: \"5ilxe3\" }],\n [\"path\", { d: \"M13.9 21.818a10 10 0 0 1-3.8 0\", key: \"11zvb9\" }],\n [\"path\", { d: \"M17.609 3.721a10 10 0 0 1 2.69 2.7\", key: \"1iw5b2\" }],\n [\"path\", { d: \"M2.182 13.9a10 10 0 0 1 0-3.8\", key: \"c0bmvh\" }],\n [\"path\", { d: \"M20.279 17.609a10 10 0 0 1-2.7 2.69\", key: \"1ruxm7\" }],\n [\"path\", { d: \"M21.818 10.1a10 10 0 0 1 0 3.8\", key: \"qkgqxc\" }],\n [\"path\", { d: \"M3.721 6.391a10 10 0 0 1 2.7-2.69\", key: \"1mcia2\" }],\n [\"path\", { d: \"M6.391 20.279a10 10 0 0 1-2.69-2.7\", key: \"1fvljs\" }]\n ]\n};\n__iconData.node;\nconst CircleDashed = createLucideIcon(__iconData);\n\nexport { __iconData, CircleDashed as default };\n//# sourceMappingURL=circle-dashed.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: \"git-pull-request\",\n size: 24,\n node: [\n [\"circle\", { cx: \"18\", cy: \"18\", r: \"3\", key: \"1xkwt0\" }],\n [\"circle\", { cx: \"6\", cy: \"6\", r: \"3\", key: \"1lh9wr\" }],\n [\"path\", { d: \"M13 6h3a2 2 0 0 1 2 2v7\", key: \"1yeb86\" }],\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"9\", y2: \"21\", key: \"rroup\" }]\n ]\n};\n__iconData.node;\nconst GitPullRequest = createLucideIcon(__iconData);\n\nexport { __iconData, GitPullRequest as default };\n//# sourceMappingURL=git-pull-request.mjs.map\n","import type { FieldDefinition, SchemaDefinition } from '../types/definitions.js';\n\n/**\n * Whether a field's values are stored per locale: on a localized model only (ADR 0004). The unique registry\n * keys such a field by locale and a shared one by `*`.\n */\nconst storedPerLocale = (definition: SchemaDefinition, field: FieldDefinition): boolean =>\n definition.kind !== 'component' && definition.localized === true && field.localized === true;\n\n/**\n * Unique fields of a model whose values move between per-locale and shared storage in this change (the field's\n * or the model's `localized` flips). Their registry rows change key (locale ↔ `*`), and values that were unique\n * per locale may collide once shared, so each needs a uniqueness check that rebuilds its rows. Deprecated fields\n * are skipped: the registry does not track them.\n */\nexport const uniqueFieldsChangingLocalization = (\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n): FieldDefinition[] => {\n if (!before || !after || after.kind === 'component') {\n return [];\n }\n return after.fields.filter((field) => {\n const previous = before.fields.find((candidate) => candidate.id === field.id);\n return (\n previous !== undefined &&\n field.unique === true &&\n !field.deprecated &&\n storedPerLocale(before, previous) !== storedPerLocale(after, field)\n );\n });\n};\n","import { storageFamilyOf, type DataType, type StoredFieldShape } from '../types/dataTypes.js';\nimport type { FieldDefinition, SchemaDefinition } from '../types/definitions.js';\nimport type { SchemaChange } from './types.js';\nimport { uniqueFieldsChangingLocalization } from './uniqueLocalization.js';\n\n/**\n * Change classification (brief §5, ADR 0002). Each change gets a category, whether it needs prerequisite\n * work before the new revision can be activated, and flags for breaking API contracts and destroying data.\n *\n * | Brief §5 row | category | activation |\n * | ------------------------------------ | -------------------------------- | ----------------------------- |\n * | Label, help text, editor layout | metadata | immediate |\n * | Compatible editor swap | editorSwap | immediate |\n * | Optional field or new model | additive | immediate (live) |\n * | Required field | requiredField | validateRequired / backfill |\n * | Type or rich-text format conversion | conversion | convert (+ validate) |\n * | API key rename | contract (breaking) | immediate, needs ack |\n * | Field removal | removal (breaking, data kept) | immediate, needs ack |\n * | Unique/index constraint | constraint / index | checkUnique / buildIndex |\n * | (plus) type change of a unique field | as its type change | + checkUnique |\n * | (plus) tightened validation rules | validation | validateValues |\n * | (plus) localized true→false | conversion (destructive) | convert |\n * | (plus) localized flip of a unique field | as the flip | + checkUnique |\n * | (plus) type change Shapio can't convert | conversion (destructive, drops) | convert (+ validate/required) |\n */\nexport type ChangeCategory =\n | 'metadata'\n | 'editorSwap'\n | 'additive'\n | 'requiredField'\n | 'validation'\n | 'conversion'\n | 'contract'\n | 'removal'\n | 'constraint'\n | 'index';\n\n/** Work that must succeed before activation. Content-touching kinds run through the content ports. */\nexport type PrerequisiteKind =\n 'validateRequired' | 'backfill' | 'validateValues' | 'checkUnique' | 'buildIndex' | 'convert';\n\n/** Work done after activation, once nothing reads the old structure. */\nexport type CleanupKind = 'dropIndex' | 'releaseUnique';\n\nexport type ClassifiedChange = SchemaChange & {\n category: ChangeCategory;\n /** Changes the public API contract (REST/GraphQL shape or visibility); needs explicit acknowledgement. */\n breaking: boolean;\n /** Loses stored information that a schema rollback cannot restore. */\n destructive: boolean;\n /** False for changes Shapio cannot perform; the planner refuses them. None today; kept for future refusals. */\n supported: boolean;\n /** A type change Shapio cannot convert: every stored value of the field is dropped (destructive). */\n dropsValues: boolean;\n prerequisites: PrerequisiteKind[];\n cleanup: CleanupKind[];\n};\n\nexport type ClassifyContext = { before: SchemaDefinition | null; after: SchemaDefinition | null };\n\ntype Classification = Omit<ClassifiedChange, keyof SchemaChange>;\n\nconst result = (category: ChangeCategory, extra: Partial<Classification> = {}): Classification => ({\n category,\n breaking: false,\n destructive: false,\n supported: true,\n dropsValues: false,\n prerequisites: [],\n cleanup: [],\n ...extra,\n});\n\nconst findField = (\n definition: SchemaDefinition | null,\n fieldId: string | undefined,\n): FieldDefinition | undefined => definition?.fields.find((field) => field.id === fieldId);\n\nconst hasIndex = (field: FieldDefinition | undefined): boolean =>\n Boolean(field && (field.filterable || field.sortable));\n\n/** Names delivery APIs use for a type; a change of name is a contract change. */\nconst API_SCALAR: Readonly<Record<DataType, string>> = {\n string: 'String',\n text: 'String',\n code: 'String',\n slug: 'String',\n email: 'String',\n url: 'String',\n uid: 'String',\n enum: 'Enum',\n date: 'Date',\n datetime: 'DateTime',\n time: 'Time',\n number: 'Float',\n integer: 'Int',\n decimal: 'Decimal',\n biginteger: 'BigInt',\n boolean: 'Boolean',\n json: 'JSON',\n richtext: 'RichText',\n media: 'Media',\n relation: 'Relation',\n component: 'Component',\n dynamiczone: 'DynamicZone',\n};\n\nconst PLAIN_TEXT_TYPES: ReadonlySet<DataType> = new Set(['string', 'text']);\n/** Types any string value is valid for, so a same-family change to one without constraints only widens. */\nconst TEXT_TARGETS: ReadonlySet<DataType> = new Set(['string', 'text', 'code']);\nconst SCALAR_FAMILIES = new Set(['jsonString', 'jsonNumber', 'numericString', 'boolean']);\n\nconst hasTextConstraints = (field: FieldDefinition | undefined) => {\n const settings = (field?.settings ?? {}) as Record<string, unknown>;\n return (\n settings.minLength !== undefined ||\n settings.maxLength !== undefined ||\n settings.pattern !== undefined ||\n settings.validate === true\n );\n};\n\n/**\n * Whether Shapio converts a cross-family type change value by value (the pairs it knows); within one storage\n * family the stored JSON stays as it is. Families come from type and settings, so a multi-value enum's\n * arrays are never taken for text.\n */\nconst convertsAcrossFamilies = (from: StoredFieldShape, to: StoredFieldShape): boolean => {\n const fromFamily = storageFamilyOf(from);\n const toFamily = storageFamilyOf(to);\n const numericPair =\n (fromFamily === 'jsonNumber' && toFamily === 'numericString') ||\n (fromFamily === 'numericString' && toFamily === 'jsonNumber');\n const toText = SCALAR_FAMILIES.has(fromFamily) && PLAIN_TEXT_TYPES.has(to.type);\n const textToRichtext = fromFamily === 'jsonString' && from.type !== 'code' && to.type === 'richtext';\n const richtextToText = from.type === 'richtext' && PLAIN_TEXT_TYPES.has(to.type);\n // Each string becomes a one-value list, then is checked against the enum's values (as enum → multiple).\n const textToList = fromFamily === 'jsonString' && toFamily === 'jsonStringArray';\n return numericPair || toText || textToRichtext || richtextToText || textToList;\n};\n\n/**\n * A type change Shapio cannot convert: the field keeps its stable ID and API ID, and every stored value is\n * dropped. The planner (`classifyChange`) decides it from both sides' type and settings and records it as\n * `dropsValues` on the classified change; everything downstream (conversion job, impact, review, CLI) reads\n * that flag rather than deciding again from the type names.\n */\nexport const typeChangeDropsValues = (from: StoredFieldShape, to: StoredFieldShape): boolean =>\n storageFamilyOf(from) !== storageFamilyOf(to) && !convertsAcrossFamilies(from, to);\n\n/**\n * A change as a stored plan step carries it: classified since 0.5.6, plain before (no drops existed then).\n */\nexport type PlannedChange = SchemaChange & { dropsValues?: boolean };\n\n/** Whether a (classified) change drops every stored value of its field; false for plans without the flag. */\nexport const changeDropsValues = (change: PlannedChange): boolean =>\n change.kind === 'field.type' && change.dropsValues === true;\n\n/** A required field whose values are dropped is backfilled from its default, else checked (no silent nulls). */\nconst requiredStep = (field: FieldDefinition | undefined): PrerequisiteKind[] => {\n if (!field?.required) {\n return [];\n }\n return [field.defaultValue !== undefined ? 'backfill' : 'validateRequired'];\n};\n\n/**\n * A type change. Within one storage family the stored JSON stays as it is: widening is live, anything else\n * re-validates existing values. Across families Shapio converts values with a job, for the pairs it knows;\n * any other pair drops the values (destructive, acknowledged in the review).\n */\nconst classifyTypeChange = (\n from: DataType,\n to: DataType,\n previous: FieldDefinition | undefined,\n after: FieldDefinition | undefined,\n): Classification => {\n // A code field has no filters (REST operators, GraphQL `XFilter` key), so becoming one is breaking.\n const breaking = API_SCALAR[from] !== API_SCALAR[to] || (to === 'code' && from !== 'code');\n const fromShape: StoredFieldShape = { type: from, ...(previous ? { settings: previous.settings } : {}) };\n const toShape: StoredFieldShape = { type: to, ...(after ? { settings: after.settings } : {}) };\n const fromFamily = storageFamilyOf(fromShape);\n if (fromFamily === storageFamilyOf(toShape)) {\n const widening =\n (fromFamily === 'jsonString' && TEXT_TARGETS.has(to) && !hasTextConstraints(after)) ||\n (from === 'integer' && to === 'number') ||\n (from === 'biginteger' &&\n to === 'decimal' &&\n after?.type === 'decimal' &&\n after.settings.precision === undefined);\n return widening\n ? result('additive', { breaking })\n : result('validation', { breaking, prerequisites: ['validateValues'] });\n }\n if (typeChangeDropsValues(fromShape, toShape)) {\n return result('conversion', {\n breaking,\n destructive: true,\n dropsValues: true,\n prerequisites: ['convert', 'validateValues', ...requiredStep(after)],\n });\n }\n return result('conversion', {\n breaking,\n destructive: from === 'richtext' && PLAIN_TEXT_TYPES.has(to),\n prerequisites: ['convert', 'validateValues'],\n });\n};\n\ntype Comparable = number | string;\nconst compareValues = (a: Comparable, b: Comparable): number => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n try {\n const diff = BigInt(String(a)) - BigInt(String(b));\n return diff === 0n ? 0 : diff > 0n ? 1 : -1;\n } catch {\n const numeric = Number(a) - Number(b);\n return Number.isNaN(numeric) ? String(a).localeCompare(String(b)) : numeric;\n }\n};\n\n/** A lower bound (min, minLength) that appears or rises, or an upper bound that appears or falls. */\nconst isTightened = (bound: 'lower' | 'upper', from: unknown, to: unknown): boolean => {\n if (to === undefined || to === null) {\n return false;\n }\n if (from === undefined || from === null) {\n return true;\n }\n const order = compareValues(from as Comparable, to as Comparable);\n return bound === 'lower' ? order < 0 : order > 0;\n};\n\nconst asStrings = (value: unknown): string[] =>\n Array.isArray(value)\n ? value.map((entry) =>\n typeof entry === 'object' && entry !== null\n ? String((entry as { value?: unknown }).value)\n : String(entry),\n )\n : [];\n\nconst removesAny = (from: unknown, to: unknown): boolean => {\n const kept = new Set(asStrings(to));\n return asStrings(from).some((entry) => !kept.has(entry));\n};\n\nconst validation = (tightened: boolean) =>\n tightened ? result('validation', { prerequisites: ['validateValues'] }) : result('additive');\n\nconst classifySettingsChange = (change: SchemaChange): Classification => {\n const { property, from, to } = change;\n switch (property) {\n case 'minLength':\n case 'min':\n return validation(isTightened('lower', from, to));\n case 'maxLength':\n case 'max':\n case 'precision':\n case 'scale':\n return validation(isTightened('upper', from, to));\n case 'pattern':\n return validation(to !== undefined);\n case 'values':\n // Removing an enum value invalidates entries using it; adding values or relabelling does not.\n return validation(removesAny(from, to));\n case 'components':\n case 'allowedKinds':\n case 'protocols':\n // Narrowing the allowed set re-validates; an absent allowedKinds/protocols list means \"any\".\n return validation(to !== undefined && (from === undefined || removesAny(from, to)));\n case 'sourceFieldId':\n case 'language':\n // A code field's language is a label for readers; the stored string is the same.\n return result('metadata');\n case 'validate':\n return validation(to === true);\n case 'multiple':\n case 'repeatable':\n case 'cardinality': {\n const becomesSingle = to === false || to === 'one';\n return result('conversion', {\n breaking: true,\n destructive: becomesSingle,\n prerequisites: ['convert', 'validateValues'],\n });\n }\n case 'formatVersion':\n return result('conversion', { prerequisites: ['convert', 'validateValues'] });\n case 'target':\n case 'component':\n // Existing values point at entries of the old target; they are cleared by the conversion.\n return result('conversion', { breaking: true, destructive: true, prerequisites: ['convert'] });\n default:\n // An unknown setting: be safe and re-validate existing values.\n return result('validation', { prerequisites: ['validateValues'] });\n }\n};\n\nconst classifyFieldChange = (change: SchemaChange, { before, after }: ClassifyContext): Classification => {\n const previous = findField(before, change.fieldId);\n const field = findField(after, change.fieldId);\n switch (change.kind) {\n case 'field.added': {\n const prerequisites: Classification['prerequisites'] = [];\n if (field?.required) {\n prerequisites.push(field.defaultValue !== undefined ? 'backfill' : 'validateRequired');\n }\n if (field?.unique) {\n prerequisites.push('checkUnique');\n }\n if (hasIndex(field)) {\n prerequisites.push('buildIndex');\n }\n return result(field?.required ? 'requiredField' : 'additive', { prerequisites });\n }\n case 'field.removed':\n // Values stay in stored revisions; removing them is a separate, explicit cleanup.\n return result('removal', {\n breaking: true,\n cleanup: [\n ...(hasIndex(previous) ? (['dropIndex'] as const) : []),\n ...(previous?.unique ? (['releaseUnique'] as const) : []),\n ],\n });\n case 'field.order':\n case 'field.metadata':\n return result('metadata');\n case 'field.editor':\n return result('editorSwap');\n case 'field.apiKey':\n return result('contract', { breaking: true });\n case 'field.type': {\n const classification = classifyTypeChange(\n change.from as DataType,\n change.to as DataType,\n previous,\n field,\n );\n // A unique field's values may normalize differently under the new type (e.g. string → email ignores\n // case): check them for duplicates before activation.\n return field?.unique && previous?.unique && !classification.prerequisites.includes('checkUnique')\n ? { ...classification, prerequisites: [...classification.prerequisites, 'checkUnique'] }\n : classification;\n }\n case 'field.required':\n if (change.to !== true) {\n return result('additive');\n }\n return result('requiredField', {\n prerequisites: [field?.defaultValue !== undefined ? 'backfill' : 'validateRequired'],\n });\n case 'field.localized': {\n const modelLocalized = after?.kind !== 'component' && after?.localized === true;\n if (!modelLocalized) {\n return result('metadata');\n }\n // A unique field's registry rows move between locale keys and `*`; once shared, values that were\n // unique per locale may collide.\n const checks: Classification['prerequisites'] = uniqueFieldsChangingLocalization(before, after).some(\n (candidate) => candidate.id === change.fieldId,\n )\n ? ['checkUnique']\n : [];\n // false→true: every locale's head already holds the shared value (ADR 0004), so nothing to copy.\n return change.to === true\n ? result('additive', { prerequisites: checks })\n : result('conversion', { destructive: true, prerequisites: ['convert', ...checks] });\n }\n case 'field.public':\n case 'field.deprecated': {\n const hides = change.kind === 'field.public' ? change.to === false : change.to === true;\n return result('metadata', { breaking: hides });\n }\n case 'field.unique':\n return change.to === true\n ? result('constraint', { prerequisites: ['checkUnique'] })\n : result('additive', { cleanup: ['releaseUnique'] });\n case 'field.filterable':\n case 'field.sortable': {\n // Filtering and sorting share one expression index per field.\n if (hasIndex(field) && !hasIndex(previous)) {\n return result('index', { prerequisites: ['buildIndex'] });\n }\n if (!hasIndex(field) && hasIndex(previous)) {\n return result('index', { cleanup: ['dropIndex'] });\n }\n return result('metadata');\n }\n case 'field.settings':\n return classifySettingsChange(change);\n default:\n return result('metadata');\n }\n};\n\n/** Classifies one change in the context of the definitions it was diffed from. */\nexport const classifyChange = (change: SchemaChange, context: ClassifyContext): ClassifiedChange => {\n let classification: Classification;\n switch (change.kind) {\n case 'definition.added':\n classification = result('additive');\n break;\n case 'definition.removed':\n // Soft delete: entries are kept and reappear if the definition is restored.\n classification = result('removal', { breaking: true });\n break;\n case 'definition.apiKey':\n case 'definition.pluralApiKey':\n classification = result('contract', { breaking: true });\n break;\n case 'definition.metadata':\n classification = result('metadata');\n break;\n case 'model.kind':\n classification =\n change.to === 'singleton'\n ? result('validation', { breaking: true, prerequisites: ['validateValues'] })\n : result('contract', { breaking: true });\n break;\n case 'model.localized': {\n // Every unique field whose values move between per-locale and shared storage is checked and re-keyed.\n const checks: Classification['prerequisites'] =\n uniqueFieldsChangingLocalization(context.before, context.after).length > 0 ? ['checkUnique'] : [];\n classification =\n change.to === true\n ? result('additive', { prerequisites: checks })\n : result('conversion', { destructive: true, prerequisites: ['convert', ...checks] });\n break;\n }\n case 'model.draftAndPublish':\n classification =\n change.to === true\n ? result('additive')\n : result('conversion', { destructive: true, prerequisites: ['convert'] });\n break;\n default:\n classification = classifyFieldChange(change, context);\n }\n return { ...change, ...classification };\n};\n\nexport const classifyChanges = (\n changes: readonly SchemaChange[],\n context: ClassifyContext,\n): ClassifiedChange[] => changes.map((change) => classifyChange(change, context));\n\nexport type ChangeSummary = {\n breaking: boolean;\n destructive: boolean;\n supported: boolean;\n prerequisites: PrerequisiteKind[];\n cleanup: CleanupKind[];\n /** True when nothing but metadata/editor changes are involved. */\n metadataOnly: boolean;\n};\n\nconst PREREQUISITE_ORDER: readonly PrerequisiteKind[] = [\n 'convert',\n 'backfill',\n 'validateRequired',\n 'validateValues',\n 'checkUnique',\n 'buildIndex',\n];\n\nexport const summarizeChanges = (changes: readonly ClassifiedChange[]): ChangeSummary => {\n const prerequisites = new Set(changes.flatMap((change) => change.prerequisites));\n return {\n breaking: changes.some((change) => change.breaking),\n destructive: changes.some((change) => change.destructive),\n supported: changes.every((change) => change.supported),\n prerequisites: PREREQUISITE_ORDER.filter((kind) => prerequisites.has(kind)),\n cleanup: [...new Set(changes.flatMap((change) => change.cleanup))],\n metadataOnly: changes.every(\n (change) => change.category === 'metadata' || change.category === 'editorSwap',\n ),\n };\n};\n\n/** Locale configuration changes (ADR 0002/0004). Locales are global, so they are planned on their own. */\nexport type LocaleChangeKind =\n 'locale.added' | 'locale.removed' | 'locale.defaultChanged' | 'locale.metadata';\n\nexport type ClassifiedLocaleChange = {\n kind: LocaleChangeKind;\n code: string;\n category: ChangeCategory;\n breaking: boolean;\n destructive: boolean;\n};\n\n/**\n * - added: live (entries gain the locale as editors fill it in);\n * - removed: destroys that locale's content (purged by a follow-up job), so it needs explicit consent;\n * - default changed: delivery falls back to a different locale, a contract change for API consumers;\n * - label or fallback chain: metadata.\n */\nexport const classifyLocaleChange = (kind: LocaleChangeKind, code: string): ClassifiedLocaleChange => {\n switch (kind) {\n case 'locale.added':\n return { kind, code, category: 'additive', breaking: false, destructive: false };\n case 'locale.removed':\n return { kind, code, category: 'removal', breaking: true, destructive: true };\n case 'locale.defaultChanged':\n return { kind, code, category: 'contract', breaking: true, destructive: false };\n default:\n return { kind, code, category: 'metadata', breaking: false, destructive: false };\n }\n};\n","import type { ChangeKind, ClassifiedChange, DataType, SchemaDefinition } from '@shapio/schema';\nimport { i18next } from '@/app/i18n';\nimport { propertyLabel } from './labels';\n\n/** Translation key per change kind; toggles add the `on`/`off` context (`…_on`, `…_off`). */\nconst CHANGE_KEYS = {\n 'definition.added': 'models.changes.definitionAdded',\n 'definition.removed': 'models.changes.definitionRemoved',\n 'definition.apiKey': 'models.changes.definitionApiKey',\n 'definition.pluralApiKey': 'models.changes.definitionPluralApiKey',\n 'definition.metadata': 'models.changes.definitionMetadata',\n 'model.kind': 'models.changes.modelKind',\n 'model.localized': 'models.changes.modelLocalized',\n 'model.draftAndPublish': 'models.changes.modelDraftAndPublish',\n 'field.added': 'models.changes.fieldAdded',\n 'field.removed': 'models.changes.fieldRemoved',\n 'field.order': 'models.changes.fieldOrder',\n 'field.apiKey': 'models.changes.fieldApiKey',\n 'field.metadata': 'models.changes.fieldMetadata',\n 'field.editor': 'models.changes.fieldEditor',\n 'field.type': 'models.changes.fieldType',\n 'field.required': 'models.changes.fieldRequired',\n 'field.localized': 'models.changes.fieldLocalized',\n 'field.public': 'models.changes.fieldPublic',\n 'field.deprecated': 'models.changes.fieldDeprecated',\n 'field.unique': 'models.changes.fieldUnique',\n 'field.filterable': 'models.changes.fieldFilterable',\n 'field.sortable': 'models.changes.fieldSortable',\n 'field.settings': 'models.changes.fieldSettings',\n} as const satisfies Record<ChangeKind, string>;\n\nconst TOGGLES: ReadonlySet<ChangeKind> = new Set([\n 'model.localized',\n 'model.draftAndPublish',\n 'field.required',\n 'field.localized',\n 'field.public',\n 'field.deprecated',\n 'field.unique',\n 'field.filterable',\n 'field.sortable',\n]);\n\nconst TYPE_CHANGE_KINDS: ReadonlySet<ChangeKind> = new Set(['field.type', 'field.added']);\n\n/** Old and new values are shown only when they are short scalars (labels, keys), never as JSON. */\nconst scalarText = (value: unknown): string =>\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' ? String(value) : '';\n\nconst dataTypeName = (type: unknown) =>\n typeof type === 'string' ? i18next.t(`models.dataTypes.${type as DataType}.name`) : '';\n\n/** Field label by ID, from the proposed definition or (for removed fields) the current one. */\nexport const fieldLabelOf = (\n fieldId: string | undefined,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n): string => {\n const field =\n after?.fields.find((candidate) => candidate.id === fieldId) ??\n before?.fields.find((candidate) => candidate.id === fieldId);\n return field?.label ?? fieldId ?? '';\n};\n\n/** One sentence describing a planned change, e.g. \"Rename the API key of Title from title to headline\". */\nexport const describeChange = (\n change: ClassifiedChange,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n): string => {\n const field = fieldLabelOf(change.fieldId, before, after);\n const addedType =\n change.kind === 'field.added' && typeof change.to === 'object' && change.to !== null\n ? (change.to as { type?: unknown }).type\n : undefined;\n const values = TYPE_CHANGE_KINDS.has(change.kind)\n ? { from: dataTypeName(change.from), to: dataTypeName(change.to), type: dataTypeName(addedType) }\n : { from: scalarText(change.from), to: scalarText(change.to) };\n // A type change Shapio can't convert says that the field's stored values are dropped.\n const key = change.dropsValues ? 'models.changes.fieldTypeDropped' : CHANGE_KEYS[change.kind];\n return i18next.t(key, {\n field,\n name: after?.label ?? before?.label ?? '',\n property: change.property ? propertyLabel(change.property) : '',\n ...values,\n ...(TOGGLES.has(change.kind) ? { context: change.to === true ? 'on' : 'off' } : {}),\n });\n};\n","import type { PlanStep, PlanStepImpact } from '@shapio/client';\nimport {\n changeDropsValues,\n isDataType,\n type DataType,\n type PlannedChange,\n type SchemaDefinition,\n} from '@shapio/schema';\nimport { i18next } from '@/app/i18n';\nimport en from '@/locales/en/translation.json';\nimport { fieldLabelOf } from './describeChange';\n\ntype StepKind = keyof typeof en.models.steps;\n\nconst isKnownStep = (kind: string): kind is StepKind => Object.hasOwn(en.models.steps, kind);\n\ntype DroppedTypeChange = { fieldId: string | undefined; from: DataType; to: DataType };\n\n/**\n * The type change a `convert` step carries when Shapio can't convert it and drops the field's values, as the\n * planner classified it (`dropsValues`, decided from both sides' type and settings).\n */\nconst droppedTypeChange = (step: PlanStep): DroppedTypeChange | undefined => {\n if (step.kind !== 'convert' || typeof step.change !== 'object' || step.change === null) {\n return undefined;\n }\n const change = step.change as PlannedChange;\n const { fieldId, from, to } = change;\n if (!changeDropsValues(change) || !isDataType(from) || !isDataType(to)) {\n return undefined;\n }\n return { fieldId: typeof fieldId === 'string' ? fieldId : undefined, from, to };\n};\n\n/**\n * The steps the review lists: a `validateValues` step on a field whose values a `convert` step of the same plan\n * drops is left out (nothing is left for the person to check; the server still runs it). Each step keeps its\n * impact, which the plan gives by position.\n */\nexport const stepsToShow = (\n steps: readonly PlanStep[],\n impacts?: readonly PlanStepImpact[],\n): { step: PlanStep; impact: PlanStepImpact | undefined }[] => {\n const dropped = new Set(\n steps.flatMap((step) => {\n const change = droppedTypeChange(step);\n return change?.fieldId ? [`${String(step.ownerId)}:${change.fieldId}`] : [];\n }),\n );\n return steps\n .map((step, index) => ({ step, impact: impacts?.[index] }))\n .filter(\n ({ step }) =>\n step.kind !== 'validateValues' ||\n !step.fieldId ||\n !dropped.has(`${String(step.ownerId)}:${step.fieldId}`),\n );\n};\n\nconst typeName = (type: DataType) => i18next.t(`models.dataTypes.${type}.name`);\n\n/**\n * A sentence for a prerequisite or follow-up step, e.g. \"Check that every entry has a Title\". A conversion\n * that drops values names the field, both types and how many entries lose their value (the dry run's\n * `droppedEntries`, else the step's entry count).\n */\nexport const describeStep = (\n step: PlanStep,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n impact?: PlanStepImpact,\n): string => {\n const dropped = droppedTypeChange(step);\n if (dropped) {\n return i18next.t('models.plan.stepDropped', {\n field: fieldLabelOf(dropped.fieldId, before, after),\n from: typeName(dropped.from),\n to: typeName(dropped.to),\n count: impact?.droppedEntries ?? impact?.affectedHeads ?? 0,\n });\n }\n const field = fieldLabelOf(step.fieldId, before, after);\n return isKnownStep(step.kind) ? i18next.t(`models.steps.${step.kind}`, { field }) : step.kind;\n};\n\n/**\n * What a prerequisite would touch: entries checked and, where known, how many would fail. A conversion that\n * drops values says its count in the step itself, so it has no detail.\n */\nexport const describeStepImpact = (\n step: PlanStep,\n impact: PlanStepImpact | undefined,\n): string | undefined => {\n if (!impact || droppedTypeChange(step)) {\n return undefined;\n }\n const checked = i18next.t('models.plan.stepEntries', { count: impact.affectedHeads });\n if (!impact.invalidHeads) {\n return checked;\n }\n // A person counts entries; the check counts entry versions (draft and published, per locale): say both.\n const counts = {\n count: impact.invalidEntries ?? impact.invalidHeads,\n versions: i18next.t('models.plan.stepVersions', { count: impact.invalidHeads }),\n };\n const failing =\n step.kind === 'validateRequired'\n ? i18next.t('models.plan.stepMissingRequired', counts)\n : i18next.t('models.plan.stepInvalid', counts);\n return `${checked} · ${failing}`;\n};\n\n/** The plan already knows a prerequisite check fails (entries that wouldn't fit), so shipping it can't work. */\nexport const hasFailingCheck = (impacts: readonly PlanStepImpact[]): boolean =>\n impacts.some((impact) => (impact.invalidHeads ?? 0) > 0);\n","import type { ChangeSummary, ClassifiedChange } from '@shapio/schema';\n\n/**\n * How the plan preview groups changes (brief §5): applied instantly with no API impact, live and additive,\n * gated on prerequisite jobs, or breaking/destructive and needing explicit acknowledgement.\n */\nexport const PLAN_BUCKETS = ['breaking', 'prerequisites', 'live', 'metadata'] as const;\nexport type PlanBucket = (typeof PLAN_BUCKETS)[number];\n\nconst METADATA_CATEGORIES: ReadonlySet<string> = new Set(['metadata', 'editorSwap']);\n\nexport const bucketOfChange = (change: ClassifiedChange): PlanBucket => {\n if (change.breaking || change.destructive) {\n return 'breaking';\n }\n if (change.prerequisites.length > 0) {\n return 'prerequisites';\n }\n return METADATA_CATEGORIES.has(change.category) ? 'metadata' : 'live';\n};\n\n/** The plan's overall bucket: its most demanding change. */\nexport const bucketOfPlan = (summary: ChangeSummary): PlanBucket => {\n if (summary.breaking || summary.destructive) {\n return 'breaking';\n }\n if (summary.prerequisites.length > 0) {\n return 'prerequisites';\n }\n return summary.metadataOnly ? 'metadata' : 'live';\n};\n\n/** Changes grouped by bucket, most demanding bucket first, empty buckets left out. */\nexport const groupByBucket = (\n changes: readonly ClassifiedChange[],\n): { bucket: PlanBucket; changes: ClassifiedChange[] }[] =>\n PLAN_BUCKETS.map((bucket) => ({\n bucket,\n changes: changes.filter((change) => bucketOfChange(change) === bucket),\n })).filter((group) => group.changes.length > 0);\n","import { useTranslation } from 'react-i18next';\nimport { StatusChip, type StatusTone } from '@/components/StatusChip';\nimport { PLAN_BUCKET_LABEL_KEYS } from '../../constants';\nimport type { PlanBucket } from '../../helpers/planBuckets';\n\nconst BUCKET_TONES = {\n breaking: 'warning',\n prerequisites: 'scheduled',\n live: 'success',\n metadata: 'neutral',\n} as const satisfies Record<PlanBucket, StatusTone>;\n\ntype BucketChipProps = { bucket: PlanBucket; className?: string };\n\n/** How a change is applied: metadata only, live, after checks, or breaking. */\nexport const BucketChip = ({ bucket, className }: BucketChipProps) => {\n const { t } = useTranslation();\n return (\n <StatusChip tone={BUCKET_TONES[bucket]} label={t(PLAN_BUCKET_LABEL_KEYS[bucket])} className={className} />\n );\n};\n","import type { PlanStep, PlanStepImpact } from '@shapio/client';\nimport type { SchemaDefinition } from '@shapio/schema';\nimport { AlertTriangle, CircleDashed, Clock } from 'lucide-react';\nimport { cn } from '@/helpers/cn';\nimport { describeStep, describeStepImpact, stepsToShow } from '../../../helpers/describeStep';\n\ntype StepListProps = {\n steps: readonly PlanStep[];\n /** Impact per step, in the same order (prerequisites only). */\n impacts?: readonly PlanStepImpact[];\n before: SchemaDefinition | null;\n after: SchemaDefinition | null;\n /** Prerequisites run before activation (clock, or a warning when entries would fail); follow-ups after. */\n phase: 'before' | 'after';\n};\n\nconst STATUS_CLASSES = {\n waiting: 'text-muted-foreground',\n failing: 'border-warning/40 bg-warning-muted text-warning',\n later: 'text-muted-foreground',\n} as const;\n\nconst STATUS_ICONS = { waiting: Clock, failing: AlertTriangle, later: CircleDashed } as const;\n\n/**\n * Steps as a vertical timeline: a status icon per step, joined by a line. A value check on a field whose\n * values are dropped is not listed (see `stepsToShow`).\n */\nexport const StepList = ({ steps, impacts, before, after, phase }: StepListProps) => {\n const shown = stepsToShow(steps, impacts);\n return (\n <ol className=\"space-y-0\">\n {shown.map(({ step, impact }, index) => {\n const status = phase === 'after' ? 'later' : impact?.invalidHeads ? 'failing' : 'waiting';\n const Icon = STATUS_ICONS[status];\n const detail = describeStepImpact(step, impact);\n return (\n <li key={`${step.kind}-${index}`} className=\"flex gap-3\">\n <span className=\"flex flex-col items-center\">\n <span\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-full border bg-card',\n STATUS_CLASSES[status],\n )}\n >\n <Icon aria-hidden=\"true\" className=\"size-3.5\" />\n </span>\n {index < shown.length - 1 ? (\n <span aria-hidden=\"true\" className=\"my-1 w-px flex-1 bg-border\" />\n ) : null}\n </span>\n <div className=\"min-w-0 pt-0.5 pb-4 text-sm\">\n {describeStep(step, before, after, impact)}\n {detail ? <span className=\"block text-meta text-muted-foreground\">{detail}</span> : null}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n"],"ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{At as r,Bt as i,Ht as a,Pt as o,Vt as s,bn as c,ct as l,ht as u,kt as d,ot as f,st as p,ut as m,vt as ee}from"./src-ndgTSYLX.js";import{m as h}from"./createLucideIcon-CLmh7Go-.js";function g(e){return e}var _=e(t(),1),v=_.useLayoutEffect;function y(e){return e[e.length-1]}function b(e,t){return typeof e==`function`?e(t):e}var x=Object.prototype.hasOwnProperty;function te(e){for(let t in e)if(x.call(e,t))return!0;return!1}var S=()=>Object.create(null),C=(e,t)=>w(e,t,!0);function w(e,t,n,r=0){if(e===t)return e;if(r++>500)return t;let i=Array.isArray(e)&&Array.isArray(t);if(!i&&!(T(e)&&T(t)))return t;let a=Object.keys(e),o=a.length,s=Object.keys(t),c=s.length;if(i?o!==e.length||c!==t.length||o&&y(a)!==`${o-1}`||c&&y(s)!==`${c-1}`:o!==Object.getOwnPropertyNames(e).length||c!==Object.getOwnPropertyNames(t).length||Object.getOwnPropertySymbols(t).length)return t;let l=0,u,d,f;if(i){for(;l<c&&(f=l,d=e[f],u=t[f],u=d===u?d:typeof d==`object`?w(d,u,n,r):u,u===d);l++);if(l===c&&o===c)return e}else{let i=o===c,p=!0;for(;l<c;l++){f=s[l],d=e[f];let o=t[f];u=d===o?d:typeof d==`object`?w(d,o,n,r):o,i&&=u===d&&(a[l]===f||x.call(e,f)),p&&=Object.is(u,o),a[l]=u}if(i)return Object.getOwnPropertySymbols(e).length?t:e;if(p)return t}let p=i?s.fill(0):n?S():{};for(let o=0;o<c;o++)f=i?o:s[o],i?(d=e[f],o>l&&(u=t[f],u=d===u?d:typeof d==`object`?w(d,u,n,r):u),p[f]=o<l?d:u):p[f]=a[o];return p}function T(e){return!e||typeof e!=`object`?!1:(Object.getPrototypeOf(e)?.constructor??Object)===Object}function E(e,t,n,r){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let i=0,a=e.length;i<a;i++){let a=e[i],o=t[i];if(a!==o&&!E(a,o,n,r))return!1}return!0}if(T(e)&&T(t)){if(n){for(let i in t)if((r||t[i]!==void 0)&&!E(e[i],t[i],n,r))return!1;return!0}let i=0;if(r)i=Object.keys(e).length;else for(let t in e)e[t]!==void 0&&i++;for(let a in t)if((r||t[a]!==void 0)&&(i--===0||!E(e[a],t[a],n,r)))return!1;return i===0}return!1}var D=/[\x00-\x1f\x7f"<>`{}]/g;function O(e){return e.replace(D,e=>`%`+e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`))}function k(e){let t;try{t=decodeURI(e)}catch{t=e.replaceAll(/%[0-9A-F]{2}/gi,e=>{try{return decodeURI(e)}catch{return e}})}return O(t)}var A=[`http:`,`https:`,`mailto:`,`tel:`];function j(e){if(e[0]!==`/`&&e.includes(`:`))return/^[\x00-\x20]*([a-z][a-z\d+.\t\n\r-]*:)/i.exec(e)?.[1]?.replace(/[\t\n\r]/g,``).toLowerCase()}var M=/^[\x00-\x20]*[\\/][\t\n\r]*[\\/]/;function N(e,t){if(!e)return!1;if(M.test(e))return!0;let n=j(e);return n?!t.has(n):!1}var P={"&":`\\u0026`,">":`\\u003e`,"<":`\\u003c`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},F=/[&><\u2028\u2029]/g;function I(e){return e.replace(F,e=>P[e])}function L(e){if(!e)return e;let t=e;if(/[%\\\x00-\x1f\x7f]/.test(e)){let n=/%25|%5C/gi,r=0,i;for(t=``;(i=n.exec(e))!==null;)t+=k(e.slice(r,i.index))+i[0],r=n.lastIndex;t+=k(r?e.slice(r):e)}return t}function R(e){return/[\s\u0080-\uFFFF]/.test(e)?e.replace(/\s|[^\u0000-\u007F]/gu,encodeURIComponent):e}function z(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function B(e){return e.replace(/\/{2,}/g,`/`)}function V(e){return e===`/`?e:e.replace(/^\/+/,``)}function H(e){let t=e.length;return t>1&&e[t-1]===`/`?e.replace(/\/+$/,``):e}function ne(e){return H(V(e))}function U(e,t){return e?.endsWith(`/`)&&e!==`/`&&e!==`${t}/`?e.slice(0,-1):e}function re(e,t,n=`never`,r){if(t.includes(`//`)&&(t=B(t)),t.startsWith(`/`))return t.length===1||n===`preserve`?t:n===`always`?t.endsWith(`/`)?t:`${t}/`:t.endsWith(`/`)?t.slice(0,-1):t;let i=t===`.`,a;if(r){a=i?e:e+`\0`+t;let n=r.get(a);if(n)return n}let o;if(i)o=e.split(`/`);else{for(e.includes(`//`)&&(e=B(e)),o=e.split(`/`);o.length>1&&y(o)===``;)o.pop();let n=t.split(`/`);for(let e=0,t=n.length;e<t;e++){let r=n[e];r===``?e?e===t-1&&o.push(r):o=[r]:r===`..`?o.length>1?o.pop():o=[``]:r===`.`||o.push(r)}}o.length>1&&(y(o)===``?n===`never`&&o.pop():n===`always`&&o.push(``));let s=o.join(`/`),c=(i?B(s):s)||`/`;return a&&r&&r.set(a,c),c}function ie(e){let t=new Map(e.map(e=>[encodeURIComponent(e),e])),n=new RegExp([...t.keys()].join(`|`).replace(/[.*()]/g,`\\$&`),`g`);return e=>e.replace(n,e=>t.get(e)??e)}function ae(e){return e==null||e===``}function oe(e,t,n){if(typeof t!=`string`)return``+(t??void 0);let r=e===`_splat`;if(r&&(!t||/^[a-zA-Z0-9\-._~!/]*$/.test(t)))return t;let i=encodeURIComponent(t);return r&&(i=i.replaceAll(`%2F`,`/`)),n?n(i):i}function se(e,t,n,r,i){let a=e.endsWith(`/`)?`/`:``,o=``;for(let e of t){if(typeof e==`string`){o+=e;continue}let[t,s,c,l]=e,u=t===2,d=u&&l!==void 0?l+a:l,f=n[s];if(t!==3||f!=null){if(i&&(i[s]=f,u&&(i[`*`]=f)),u&&ae(f)){if(c===`/`&&!d)continue;f=``}o+=c+oe(s,f,r)+(d||``)}}return o+a||`/`}var ce=`Error preloading route! ☝️`,W=e(n(),1),le=()=>!0,ue=()=>!1;function de({children:e,fallback:t=null}){return(0,W.jsx)(_.Fragment,{children:fe()?e:t})}function fe(e=!0){return _.useSyncExternalStore(pe,le,e?ue:le)}function pe(){return()=>{}}var me=_.createContext(null);function G(e){return _.useContext(me)}var he=i();function ge(e,t){return e===t}function _e(e,t=e=>e,n){let r=n?.compare??ge,i=(0,_.useCallback)(t=>{let{unsubscribe:n}=e.subscribe(t);return n},[e]),a=(0,_.useCallback)(()=>e.get(),[e]);return(0,he.useSyncExternalStoreWithSelector)(i,a,a,t,r)}function ve(e){let t=G();return _.useCallback(n=>t.navigate({...n,from:n.from??e?.from}),[e?.from,t])}function ye(e){let t=G(),n=ve(),r=_.useRef(null);return v(()=>{r.current!==e&&(n(e),r.current=e)},[t,e,n]),null}function be(...e){let t=_.useRef(e),n=t.current;return e.forEach((e,t)=>{E(n[t],e,!1,!0)||(n[t]=e)}),t.current}function K(e,t){e.preloadRoute(t).catch(e=>{console.warn(e),console.warn(ce)})}var xe={compare:(e,t)=>e[0]===t[0]&&e[1]===t[1]};function Se(e,t){let n=typeof e==`string`&&j(e);if(n)return t.has(n)?e:null}function Ce(e,t,n,r,i){let a=U(e.pathname,r),o=U(t.pathname,r);return(n?.exact?a!==o:!a.startsWith(o)||a.length!==o.length&&a[o.length]!==`/`)||(n?.includeSearch??!0)&&!E(e.search,t.search,!n?.exact,n?.explicitUndefined)?!1:!n?.includeHash||i&&e.hash===t.hash}function we(e,t,n){let r=G(),i=_.useRef(null),a=_.useCallback(e=>{if(i.current=e,typeof t==`function`)return t(e);t&&(t.current=e)},[t]),{activeOptions:o,to:s,preload:c,preloadDelay:l,hashScrollIntoView:u,replace:d,startTransition:f,resetScroll:p,viewTransition:m,ignoreBlocker:ee,disabled:h,target:g,onClick:v,onBlur:y,onFocus:b,onMouseEnter:x,onMouseLeave:te,onTouchStart:S}=e,C=fe(!!o?.includeHash),[w,T,E]=be(e.search,e.params,o),[D,O]=_.useMemo(()=>[e,{...e}],[r,e.from,e._fromLocation,e.hash,e.to,w,T,e.state,e.mask,e.unsafeRelative]),k=_.useMemo(()=>{let e=Se(s,r.protocolAllowlist);if(e!==void 0){let t=[e??void 0];return()=>t}let t,n;return e=>{D._fromLocation||(O._fromLocation=e);let i=r.buildLocation(O),a=Ae(i,r,h);return(!t||t[0]!==a)&&(t=[a,!(h||a&&!j(a))&&void 0],n=[a,!0]),t[1]!==void 0&&Ce(e,i,E,r.basepath,C)?n:t}},[E,h,C,D,O,r,s]),[A,M]=_e(r.stores.location,k,xe),N=M===void 0&&A,P=h||A===void 0,F=_.useRef(!1),I=e.reloadDocument||N||P?!1:c??r.options.defaultPreload,L=l??r.options.defaultPreloadDelay??0,R=_.useCallback(e=>{let t=e?.isIntersecting;if(!(t??I===`intent`)){t===!1&&J(i);return}if(!L){K(r,D);return}q.has(i)||q.set(i,setTimeout(()=>{q.delete(i),K(r,D)},L))},[r,D,i,I,L]);_.useEffect(()=>{if(!I)return;I===`render`&&!F.current&&(F.current=!0,K(r,D));let e=!0,t;return I===`viewport`&&i.current&&typeof IntersectionObserver==`function`&&(t=new IntersectionObserver(t=>{e&&R(t.pop())},{rootMargin:`100px`}),t.observe(i.current)),()=>{e=!1,t?.disconnect(),J(i)}},[r,D,I,R,i]);let z=Oe(e,n);if(z.ref=t?a:i,N)return z.href=N,z;let B=e=>{let t=g??e.currentTarget.getAttribute(`target`);!P&&!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(!t||t===`_self`)&&e.button===0&&(e.preventDefault(),r.navigate({...D,replace:d,resetScroll:p,hashScrollIntoView:u,startTransition:f,viewTransition:m,ignoreBlocker:ee}))},V=()=>{I===`intent`&&K(r,D)},H=()=>{I===`intent`&&J(i)};return z.onClick=Y(v,B),z.onBlur=Y(y,H),z.onFocus=Y(b,R),z.onMouseEnter=Y(x,R),z.onMouseLeave=Y(te,H),z.onTouchStart=Y(S,V),ke(z,e,M,A,P,n)}var Te={},Ee={className:`active`},De=new Set([`to`,`params`,`search`,`hash`,`state`,`mask`,`from`,`unsafeRelative`,`_fromLocation`,`reloadDocument`,`preload`,`preloadDelay`,`preloadIntentProximity`,`hashScrollIntoView`,`replace`,`startTransition`,`resetScroll`,`viewTransition`,`ignoreBlocker`,`activeProps`,`inactiveProps`,`activeOptions`,`_asChild`]);function Oe(e,t){let n={};for(let r in e)De.has(r)||r===`type`&&t!==void 0||r===`disabled`&&t===`a`||(n[r]=e[r]);return n}function ke(e,t,n,r,i,a){let{activeProps:o,inactiveProps:s,className:c,style:l,target:u}=t,d=b(n?o:s,{})??(n?Ee:Te);Object.assign(e,d),e.href=r,a!==`a`&&(e.disabled=i),e.target=u;let f=d.style;(l||f)&&(e.style=l&&f?{...l,...f}:l||f);let p=d.className;return(c||p)&&(e.className=c?p?`${c} ${p}`:c:p),i&&(e.role=`link`,e[`aria-disabled`]=!0),n&&(e[`data-status`]=`active`,e[`aria-current`]=`page`),e}var q=new WeakMap,J=e=>{clearTimeout(q.get(e)),q.delete(e)},Y=(e,t)=>e?n=>n.defaultPrevented||(e(n),n.defaultPrevented||t(n)):t;function Ae(e,t,n){if(n)return;let r=e.maskedLocation??e,i=r.external?r.publicHref:t.history.createHref(r.publicHref)||`/`;if(!r.external&&i===r.publicHref||!N(i,t.protocolAllowlist))return i}function je(e){return _.forwardRef(function(t,n){return(0,W.jsx)(Me,{...t,_asChild:e,ref:n})})}var Me=_.memo(_.forwardRef((e,t)=>{let n=e._asChild||`a`,r=we(e,t,n),i=typeof e.children==`function`?e.children({isActive:r[`data-status`]===`active`}):e.children;return _.createElement(n,r,i)}),Ne);function Ne(e,t){let n=0;for(let r in t)if(n++,e[r]!==t[r]&&(!De.has(r)||!E(e[r],t[r],!1,!0)))return!1;for(let t in e)n--;return n===0}var Pe=e=>e,Fe=e=>e instanceof h&&e.status===401,Ie=e=>e instanceof h&&e.status===403,Le=e=>e instanceof h&&e.status===404,Re=e=>e instanceof h&&e.status===409,X=(e,t)=>e instanceof h&&e.code===t,ze=e=>{if(!X(e,`SCHEMA_INVALID`))return[];let t=e.details?.issues;return Array.isArray(t)?t:[]},Z=g({queryKey:o.me,queryFn:async()=>{try{let e=await m.auth.me();return p(e.csrfToken),e}catch(e){if(Fe(e)){if(d()||r.getState().signInRequired)throw e;return null}if(X(e,`SITE_NOT_FOUND`)&&!u().explicit)return ee(),new Promise(()=>void 0);throw e}},staleTime:6e4}),Be=g({queryKey:o.setupStatus,queryFn:()=>m.setup.status(),staleTime:1/0}),Ve=()=>a(Z),He=()=>a(Be),Q=async(e,t)=>{p(t.csrfToken),r.getState().clearSignInRequired(),e.removeQueries({predicate:e=>e.queryKey[0]!==o.me[0]}),e.setQueryData(o.setupStatus,e=>({requiresToken:!1,...e,required:!1})),await e.fetchQuery({...Z,staleTime:0})},$={silent:!0},Ue=()=>{let e=c();return s({mutationKey:[`auth`,`login`],meta:$,mutationFn:e=>l(()=>m.auth.login(e)),onSuccess:t=>Q(e,t)})},We=()=>{let e=c();return s({mutationKey:[`auth`,`resume`],meta:$,mutationFn:e=>l(()=>m.auth.login(e)),onSuccess:async t=>{p(t.csrfToken),await e.fetchQuery({...Z,staleTime:0}),r.getState().resume(),e.invalidateQueries({predicate:e=>e.state.status===`error`})}})},Ge=()=>{let e=c();return s({mutationKey:[`setup`],meta:$,mutationFn:e=>l(()=>m.setup.complete(e)),onSuccess:t=>Q(e,t)})},Ke=()=>{let e=c();return s({mutationKey:[`auth`,`acceptInvitation`],meta:$,mutationFn:e=>l(()=>m.invitations.accept(e)),onSuccess:t=>Q(e,t)})},qe=()=>{let e=c();return s({mutationKey:[`auth`,`logout`],mutationFn:()=>l(()=>m.auth.logout()),onSettled:()=>{f(),r.getState().clearSignInRequired(),e.setQueryData(o.me,null),e.removeQueries({predicate:e=>e.queryKey[0]!==o.me[0]})}})},Je=()=>s({mutationKey:[`auth`,`requestPasswordReset`],meta:$,mutationFn:e=>l(()=>m.auth.requestPasswordReset(e))}),Ye=e=>a({queryKey:o.invitationInspect(e??``),queryFn:()=>m.invitations.inspect(e??``),enabled:!!e,retry:!1,staleTime:1/0,meta:{silent:!0}}),Xe=()=>s({mutationKey:[`auth`,`confirmPasswordReset`],meta:$,mutationFn:e=>l(()=>m.auth.confirmPasswordReset(e))}),Ze=()=>{let e=c();return s({mutationKey:[`auth`,`updateProfile`],meta:$,mutationFn:e=>l(()=>m.auth.updateProfile(e)),onSuccess:t=>e.setQueryData(o.me,e=>e&&{...e,user:t})})},Qe=()=>s({mutationKey:[`auth`,`changePassword`],meta:$,mutationFn:e=>l(()=>m.auth.changePassword(e)),onSuccess:({csrfToken:e})=>p(e)}),$e=e=>{let{data:t}=Ve();return t?.globalPermissions.includes(e)??!1};export{w as $,de as A,S as B,je as C,_e as D,ve as E,ne as F,b as G,E as H,V as I,x as J,j as K,H as L,ie as M,se as N,G as O,re as P,M as Q,A as R,Me as S,ye as T,R as U,L as V,I as W,y as X,N as Y,C as Z,Re as _,Xe as a,Fe as b,Ue as c,Je as d,v as et,We as f,X as g,Ze as h,Qe as i,B as j,me as k,qe as l,He as m,Be as n,$e as o,Ge as p,te as q,Ke as r,Ye as s,Z as t,g as tt,Ve as u,Ie as v,Pe as w,ze as x,Le as y,z};
|
|
2
|
-
//# sourceMappingURL=auth-CQO4MBUj.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Ht as e,Pt as t,Vt as n,bn as r,ct as i,ut as a}from"./src-ndgTSYLX.js";import{m as o,t as s}from"./createLucideIcon-CLmh7Go-.js";import{C as c}from"./InfoHint-CSEtcHjL.js";import{a as l}from"./publishing-B7zv1e7j.js";var u={name:`refresh-cw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]};u.node;var d=s(u),f=a.changeSets,p={silent:!0},m=`open,scheduled,shipping,failed`,h=(n=m)=>e({queryKey:t.develop.changeSets.list(n),queryFn:()=>f.list({status:n,limit:100}),meta:p}),g=e=>e?.status===`shipping`&&l,_=n=>e({queryKey:t.develop.changeSets.set(n),queryFn:()=>f.get(n),refetchInterval:e=>g(e.state.data),meta:p}),v=n=>e({queryKey:t.develop.changeSets.review(n.id,n.status),queryFn:()=>f.review(n.id),placeholderData:e=>e?.changeSet.id===n.id?e:void 0,refetchOnWindowFocus:!1,meta:p}),y=n=>e({queryKey:t.develop.changeSets.timeline(n),queryFn:()=>f.timeline(n),meta:p}),b=()=>e({queryKey:t.develop.changeSets.unassigned,queryFn:()=>f.unassigned({limit:100}),meta:p}),x=(e,a)=>{let o=r();return n({mutationKey:[`changeSets`,e],meta:p,mutationFn:e=>i(()=>a(e)),onSuccess:e=>(o.setQueryData(t.develop.changeSets.set(e.id),e),o.invalidateQueries({queryKey:t.develop.changeSets.all}))})},S=()=>x(`create`,e=>f.create(e)),C=()=>x(`update`,({id:e,input:t})=>f.update(e,t)),w=()=>x(`discard`,e=>f.discard(e)),T=()=>x(`addEntry`,({id:e,input:t})=>f.addEntry(e,t)),E=()=>x(`removeItem`,({id:e,itemId:t})=>f.removeItem(e,t)),D=()=>x(`ship`,({id:e,input:t})=>f.ship(e,t)),O=()=>x(`schedule`,({id:e,input:t})=>f.schedule(e,t)),k=()=>x(`unschedule`,e=>f.unschedule(e)),A=async e=>{let t=(await f.list({status:`open`,limit:1})).items[0]??await f.create({title:e,source:`builder`});return f.get(t.id)},j=()=>{let e=r();return n({mutationKey:[`changeSets`,`saveDraft`],meta:p,mutationFn:({definitionId:e,input:t,newSetTitle:n})=>i(async()=>{let r=await A(n),i=r.items.find(t=>t.kind===`schema`&&t.definitionId===e);return await f.putSchemaDraft(r.id,e,{...t,...i?.kind===`schema`?{expectedDraftVersion:i.draftVersion}:{}}),r.id}),onSuccess:()=>e.invalidateQueries({queryKey:t.develop.changeSets.all})})},M=()=>{let e=r();return n({mutationKey:[`changeSets`,`saveNewDefinitions`],meta:p,mutationFn:({definitions:e,newSetTitle:t})=>i(async()=>{let n=await A(t);for(let t of e)await f.putSchemaDraft(n.id,t.id,{category:t.kind===`component`?`component`:`model`,definition:t,baseVersion:null});return n.id}),onSuccess:()=>e.invalidateQueries({queryKey:t.develop.changeSets.all})})},N=(n,r)=>e({queryKey:t.develop.changeSets.draft(n,r),queryFn:()=>f.getSchemaDraft(n,r),meta:p}),P=e=>new o(422,{error:{code:e.error?.code??`CHANGE_SET_FAILED`,message:e.error?.message??e.title}}),F=()=>{let e=r();return n({mutationKey:[`changeSets`,`shipDraftNow`],meta:p,mutationFn:({definitionId:e,input:t,acknowledgement:n,title:r})=>i(async()=>{let i=await f.create({title:r,source:`builder`}),a;try{await f.putSchemaDraft(i.id,e,t);let r=await f.get(i.id);a=await f.ship(r.id,{expectedVersion:r.version,...n})}catch(e){throw await f.discard(i.id).catch(e=>c(e,`discarding a change set the builder could not ship`)),e}if(a.status===`failed`)throw P(a);return a}),onSettled:()=>Promise.all([e.invalidateQueries({queryKey:t.develop.changeSets.all}),e.invalidateQueries({queryKey:t.schema.all})])})};export{C as _,h as a,E as c,O as d,N as f,k as g,b as h,y as i,j as l,F as m,_ as n,S as o,D as p,v as r,w as s,T as t,M as u,d as v};
|
|
2
|
-
//# sourceMappingURL=changeSets-8EburmT0.js.map
|