@shapio/cms 0.5.8 → 0.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/assets/{AssetTile-BrMzsUZD.js → AssetTile-DecaDqjj.js} +2 -2
- package/dist/admin/assets/{AssetTile-BrMzsUZD.js.map → AssetTile-DecaDqjj.js.map} +1 -1
- package/dist/admin/assets/AssistError-rslPtgWB.js +2 -0
- package/dist/admin/assets/{AssistError-Cs-r9Ssc.js.map → AssistError-rslPtgWB.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js → BlockMenuItems-JHFue7Qt.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-DsccXMc_.js.map → BlockMenuItems-JHFue7Qt.js.map} +1 -1
- package/dist/admin/assets/Body-7NgJl9Pi.js +2 -0
- package/dist/admin/assets/Body-7NgJl9Pi.js.map +1 -0
- package/dist/admin/assets/Builder-DmlYcgiP.js +2 -0
- package/dist/admin/assets/Builder-DmlYcgiP.js.map +1 -0
- package/dist/admin/assets/{CodeEditor-CBCR73Wd.js → CodeEditor-Dv1FtkvI.js} +2 -2
- package/dist/admin/assets/{CodeEditor-CBCR73Wd.js.map → CodeEditor-Dv1FtkvI.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-CxFsBHfF.js → CopyButton-Brnpfqe0.js} +2 -2
- package/dist/admin/assets/{CopyButton-CxFsBHfF.js.map → CopyButton-Brnpfqe0.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-BW2U3v6l.js → CursorPager-C7cAK5Qe.js} +2 -2
- package/dist/admin/assets/{CursorPager-BW2U3v6l.js.map → CursorPager-C7cAK5Qe.js.map} +1 -1
- package/dist/admin/assets/{ExternalLink-BITMgS1K.js → ExternalLink-D80sb5Jj.js} +2 -2
- package/dist/admin/assets/{ExternalLink-BITMgS1K.js.map → ExternalLink-D80sb5Jj.js.map} +1 -1
- package/dist/admin/assets/{FocalPoint-CpZTve1E.js → FocalPoint-Bhtb1gUa.js} +2 -2
- package/dist/admin/assets/{FocalPoint-CpZTve1E.js.map → FocalPoint-Bhtb1gUa.js.map} +1 -1
- package/dist/admin/assets/Form-Cf1ephPH.js +2 -0
- package/dist/admin/assets/Form-Cf1ephPH.js.map +1 -0
- package/dist/admin/assets/FormCheckboxGroup-BzVZFR3W.js +2 -0
- package/dist/admin/assets/FormCheckboxGroup-BzVZFR3W.js.map +1 -0
- package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js → FormRadioGroup-BzmLzRnI.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-Cfx5pvzU.js.map → FormRadioGroup-BzmLzRnI.js.map} +1 -1
- package/dist/admin/assets/FormSelectField-Cl7EjXc3.js +2 -0
- package/dist/admin/assets/FormSelectField-Cl7EjXc3.js.map +1 -0
- package/dist/admin/assets/FormSheet-CLZpd_7B.js +2 -0
- package/dist/admin/assets/FormSheet-CLZpd_7B.js.map +1 -0
- package/dist/admin/assets/{FormSwitchField-BLOh7qei.js → FormSwitchField-BbqQ3tx_.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-BLOh7qei.js.map → FormSwitchField-BbqQ3tx_.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-CO115n_u.js → FormTextareaField-9RN5Pt3B.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-CO115n_u.js.map → FormTextareaField-9RN5Pt3B.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-DzHnEdIK.js → HintedLabel-D9IVF0EE.js} +2 -2
- package/dist/admin/assets/{HintedLabel-DzHnEdIK.js.map → HintedLabel-D9IVF0EE.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-CSEtcHjL.js → InfoHint-tlSeZB9U.js} +2 -2
- package/dist/admin/assets/{InfoHint-CSEtcHjL.js.map → InfoHint-tlSeZB9U.js.map} +1 -1
- package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js → InlineConfirm-Kj9AOIFO.js} +2 -2
- package/dist/admin/assets/{InlineConfirm-yW-iUKFC.js.map → InlineConfirm-Kj9AOIFO.js.map} +1 -1
- package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js → InsertMenuItem-CHAp2tH7.js} +2 -2
- package/dist/admin/assets/{InsertMenuItem-CCr9e0qY.js.map → InsertMenuItem-CHAp2tH7.js.map} +1 -1
- package/dist/admin/assets/{LinkTabs-8SmS1vCd.js → LinkTabs-oQXsy1I3.js} +2 -2
- package/dist/admin/assets/{LinkTabs-8SmS1vCd.js.map → LinkTabs-oQXsy1I3.js.map} +1 -1
- package/dist/admin/assets/{Match-CcD9KxHH.js → Match-BfNRwPfR.js} +2 -2
- package/dist/admin/assets/{Match-CcD9KxHH.js.map → Match-BfNRwPfR.js.map} +1 -1
- package/dist/admin/assets/{NoAccess-C8RLPN0I.js → NoAccess-DnEpYj9l.js} +2 -2
- package/dist/admin/assets/{NoAccess-C8RLPN0I.js.map → NoAccess-DnEpYj9l.js.map} +1 -1
- package/dist/admin/assets/Panel-Bcl09TtM.js.map +1 -1
- package/dist/admin/assets/{QueryView-xMP_uJ_t.js → QueryView-B86NcRt5.js} +2 -2
- package/dist/admin/assets/{QueryView-xMP_uJ_t.js.map → QueryView-B86NcRt5.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-DQFmni5A.js → RadioTile-Bwd2Pmlk.js} +2 -2
- package/dist/admin/assets/RadioTile-Bwd2Pmlk.js.map +1 -0
- package/dist/admin/assets/{RichTextField-CVHRIbnu.js → RichTextField-Dou79MHF.js} +4 -4
- package/dist/admin/assets/RichTextField-Dou79MHF.js.map +1 -0
- package/dist/admin/assets/{RowTitle-Bqt6evG9.js → RowTitle-DH9OZs3g.js} +2 -2
- package/dist/admin/assets/{RowTitle-Bqt6evG9.js.map → RowTitle-DH9OZs3g.js.map} +1 -1
- package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js → SecretReveal-D95oACLj.js} +2 -2
- package/dist/admin/assets/{SecretReveal-Bm6nYg5J.js.map → SecretReveal-D95oACLj.js.map} +1 -1
- package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js → SharedGlyph-Chwb1EIS.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-cUmTh0_C.js.map → SharedGlyph-Chwb1EIS.js.map} +1 -1
- package/dist/admin/assets/StepList-D9iHsUZJ.js +2 -0
- package/dist/admin/assets/StepList-D9iHsUZJ.js.map +1 -0
- package/dist/admin/assets/Structure-CewJL1b3.js +2 -0
- package/dist/admin/assets/{Structure-D8csgrIt.js.map → Structure-CewJL1b3.js.map} +1 -1
- package/dist/admin/assets/{SubNavLink-CiCaVV8U.js → SubNavLink-7Cs1LqMv.js} +2 -2
- package/dist/admin/assets/SubNavLink-7Cs1LqMv.js.map +1 -0
- package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js → SuggestAltButton-BK1uo4yC.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js.map → SuggestAltButton-BK1uo4yC.js.map} +1 -1
- package/dist/admin/assets/{TextLink-HRn66VL1.js → TextLink-Dfs5wsc5.js} +2 -2
- package/dist/admin/assets/{TextLink-HRn66VL1.js.map → TextLink-Dfs5wsc5.js.map} +1 -1
- package/dist/admin/assets/{Thumbnail-DNj5TRBI.js → Thumbnail-C2A_Ub77.js} +2 -2
- package/dist/admin/assets/{Thumbnail-DNj5TRBI.js.map → Thumbnail-C2A_Ub77.js.map} +1 -1
- package/dist/admin/assets/Trans-CPoNNUK1.js +2 -0
- package/dist/admin/assets/Trans-CPoNNUK1.js.map +1 -0
- package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js → UnsavedChangesGuard-BsEyn9oH.js} +2 -2
- package/dist/admin/assets/{UnsavedChangesGuard-CUiuMklN.js.map → UnsavedChangesGuard-BsEyn9oH.js.map} +1 -1
- package/dist/admin/assets/{UserAvatar-p-jV-LoD.js → UserAvatar-CgGKOFfP.js} +2 -2
- package/dist/admin/assets/{UserAvatar-p-jV-LoD.js.map → UserAvatar-CgGKOFfP.js.map} +1 -1
- package/dist/admin/assets/auth-BFSvtV59.js +2 -0
- package/dist/admin/assets/{auth-CQO4MBUj.js.map → auth-BFSvtV59.js.map} +1 -1
- package/dist/admin/assets/{badge-CqKF1pwz.js → badge-DGqA_yr_.js} +2 -2
- package/dist/admin/assets/{badge-CqKF1pwz.js.map → badge-DGqA_yr_.js.map} +1 -1
- package/dist/admin/assets/baseExtensions-TVKN1UwW.js.map +1 -1
- package/dist/admin/assets/{boxes-CAygw8zF.js → boxes-_5klpWNM.js} +2 -2
- package/dist/admin/assets/{boxes-CAygw8zF.js.map → boxes-_5klpWNM.js.map} +1 -1
- package/dist/admin/assets/{calendar-clock-BZGtAvWR.js → calendar-clock-VXok22Xj.js} +2 -2
- package/dist/admin/assets/{calendar-clock-BZGtAvWR.js.map → calendar-clock-VXok22Xj.js.map} +1 -1
- package/dist/admin/assets/changeSets-B6HxCJ4A.js +2 -0
- package/dist/admin/assets/{changeSets-8EburmT0.js.map → changeSets-B6HxCJ4A.js.map} +1 -1
- package/dist/admin/assets/chevron-left-CkRxDtvO.js +2 -0
- package/dist/admin/assets/{chevron-left-DGU3HGYG.js.map → chevron-left-CkRxDtvO.js.map} +1 -1
- package/dist/admin/assets/{circle-check-C37MSJqX.js → circle-check-DtDq7QMo.js} +2 -2
- package/dist/admin/assets/{circle-check-C37MSJqX.js.map → circle-check-DtDq7QMo.js.map} +1 -1
- package/dist/admin/assets/{clock-2arjsgZ4.js → clock-BtvZR9KD.js} +2 -2
- package/dist/admin/assets/{clock-2arjsgZ4.js.map → clock-BtvZR9KD.js.map} +1 -1
- package/dist/admin/assets/cn-DVhJ55Mo.js.map +1 -1
- package/dist/admin/assets/{constants-a_15vqOh.js → constants-DY3YJAKH.js} +2 -2
- package/dist/admin/assets/{constants-a_15vqOh.js.map → constants-DY3YJAKH.js.map} +1 -1
- package/dist/admin/assets/content-BNZF26Ve.js +3 -0
- package/dist/admin/assets/content-BNZF26Ve.js.map +1 -0
- package/dist/admin/assets/{contentCounts-DP7YYeZZ.js → contentCounts-BzC7IQqP.js} +2 -2
- package/dist/admin/assets/{contentCounts-DP7YYeZZ.js.map → contentCounts-BzC7IQqP.js.map} +1 -1
- package/dist/admin/assets/{contentTypes-84uc0bjR.js → contentTypes-Bz2xpqGf.js} +2 -2
- package/dist/admin/assets/{contentTypes-84uc0bjR.js.map → contentTypes-Bz2xpqGf.js.map} +1 -1
- package/dist/admin/assets/{context-IKYdzQJ-.js → context-CEVKblBl.js} +2 -2
- package/dist/admin/assets/{context-IKYdzQJ-.js.map → context-CEVKblBl.js.map} +1 -1
- package/dist/admin/assets/{copy-CsSRHgKZ.js → copy-B7vIq8DS.js} +2 -2
- package/dist/admin/assets/{copy-CsSRHgKZ.js.map → copy-B7vIq8DS.js.map} +1 -1
- package/dist/admin/assets/createLucideIcon-BOsNKleB.js +2 -0
- package/dist/admin/assets/createLucideIcon-BOsNKleB.js.map +1 -0
- package/dist/admin/assets/develop-D6CtwuYj.js +11 -0
- package/dist/admin/assets/develop-D6CtwuYj.js.map +1 -0
- package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js → dropdown-menu-Bz7CLcRK.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-_xfaEp5C.js.map → dropdown-menu-Bz7CLcRK.js.map} +1 -1
- package/dist/admin/assets/{ellipsis-F91991on.js → ellipsis-Ci0rsbCJ.js} +2 -2
- package/dist/admin/assets/{ellipsis-F91991on.js.map → ellipsis-Ci0rsbCJ.js.map} +1 -1
- package/dist/admin/assets/{entryLink-CVB-TdIn.js → entryLink-B0hSb_dN.js} +2 -2
- package/dist/admin/assets/{entryLink-CVB-TdIn.js.map → entryLink-B0hSb_dN.js.map} +1 -1
- package/dist/admin/assets/es2015-Cv57ynE1.js +42 -0
- package/dist/admin/assets/es2015-Cv57ynE1.js.map +1 -0
- package/dist/admin/assets/{external-link-CdG6kHfA.js → external-link-Bs9YRzvY.js} +2 -2
- package/dist/admin/assets/{external-link-CdG6kHfA.js.map → external-link-Bs9YRzvY.js.map} +1 -1
- package/dist/admin/assets/{field-COOzRptX.js → field-D-xWW2E7.js} +2 -2
- package/dist/admin/assets/{field-COOzRptX.js.map → field-D-xWW2E7.js.map} +1 -1
- package/dist/admin/assets/{file-stack-28ZtO1xW.js → file-stack-X4OGmkLA.js} +2 -2
- package/dist/admin/assets/{file-stack-28ZtO1xW.js.map → file-stack-X4OGmkLA.js.map} +1 -1
- package/dist/admin/assets/{fileRoute-s7mCMYUJ.js → fileRoute-DMal-zYL.js} +2 -2
- package/dist/admin/assets/{fileRoute-s7mCMYUJ.js.map → fileRoute-DMal-zYL.js.map} +1 -1
- package/dist/admin/assets/{folder-plus-DIk0pWkP.js → folder-plus-De2GNvry.js} +2 -2
- package/dist/admin/assets/{folder-plus-DIk0pWkP.js.map → folder-plus-De2GNvry.js.map} +1 -1
- package/dist/admin/assets/followPlural-CsgeALTW.js +2 -0
- package/dist/admin/assets/followPlural-CsgeALTW.js.map +1 -0
- package/dist/admin/assets/{globe-DFr3Gd2w.js → globe-DBw84s8Z.js} +2 -2
- package/dist/admin/assets/{globe-DFr3Gd2w.js.map → globe-DBw84s8Z.js.map} +1 -1
- package/dist/admin/assets/{image-DT79QFa_.js → image-CX4mT-_R.js} +2 -2
- package/dist/admin/assets/{image-DT79QFa_.js.map → image-CX4mT-_R.js.map} +1 -1
- package/dist/admin/assets/{image-off-DFs5upyX.js → image-off-CVaH_qKf.js} +2 -2
- package/dist/admin/assets/{image-off-DFs5upyX.js.map → image-off-CVaH_qKf.js.map} +1 -1
- package/dist/admin/assets/inbox-C0PVc6UI.js +2 -0
- package/dist/admin/assets/inbox-C0PVc6UI.js.map +1 -0
- package/dist/admin/assets/{inbox-CySnQydm.js → inbox-D9SmWt5L.js} +2 -2
- package/dist/admin/assets/{inbox-CySnQydm.js.map → inbox-D9SmWt5L.js.map} +1 -1
- package/dist/admin/assets/index-BqtCXB0u.js +4 -0
- package/dist/admin/assets/index-BqtCXB0u.js.map +1 -0
- package/dist/admin/assets/index-DZsQq6fY.css +2 -0
- package/dist/admin/assets/{key-round-D36CePnN.js → key-round-C8sd9CLN.js} +2 -2
- package/dist/admin/assets/{key-round-D36CePnN.js.map → key-round-C8sd9CLN.js.map} +1 -1
- package/dist/admin/assets/{labels-DQckbLGW.js → labels-BtktCNGw.js} +2 -2
- package/dist/admin/assets/{labels-DQckbLGW.js.map → labels-BtktCNGw.js.map} +1 -1
- package/dist/admin/assets/{languages-CzbTaQv9.js → languages-DLjdz6gb.js} +2 -2
- package/dist/admin/assets/{languages-CzbTaQv9.js.map → languages-DLjdz6gb.js.map} +1 -1
- package/dist/admin/assets/{layers-BmcodiaH.js → layers-swLuw-3a.js} +2 -2
- package/dist/admin/assets/{layers-BmcodiaH.js.map → layers-swLuw-3a.js.map} +1 -1
- package/dist/admin/assets/{link-2-off-CoJNwrxm.js → link-2-off-CEsI5T8h.js} +2 -2
- package/dist/admin/assets/{link-2-off-CoJNwrxm.js.map → link-2-off-CEsI5T8h.js.map} +1 -1
- package/dist/admin/assets/{link-Pyr2Y35S.js → link-C98FG_p5.js} +2 -2
- package/dist/admin/assets/{link-Pyr2Y35S.js.map → link-C98FG_p5.js.map} +1 -1
- package/dist/admin/assets/locales-CkuC7TJ1.js +2 -0
- package/dist/admin/assets/{locales-Bg3htKo8.js.map → locales-CkuC7TJ1.js.map} +1 -1
- package/dist/admin/assets/media-CbGSd_Mw.js +2 -0
- package/dist/admin/assets/{media-BCnVhaDH.js.map → media-CbGSd_Mw.js.map} +1 -1
- package/dist/admin/assets/{media-CURizGns.js → media-CeZGDGh7.js} +2 -2
- package/dist/admin/assets/{media-CURizGns.js.map → media-CeZGDGh7.js.map} +1 -1
- package/dist/admin/assets/network-BflLSKFO.js +2 -0
- package/dist/admin/assets/network-BflLSKFO.js.map +1 -0
- package/dist/admin/assets/{plus-BoDtdLCo.js → plus-cr9ZfO6j.js} +2 -2
- package/dist/admin/assets/{plus-BoDtdLCo.js.map → plus-cr9ZfO6j.js.map} +1 -1
- package/dist/admin/assets/publishing-BkxBplUZ.js +2 -0
- package/dist/admin/assets/publishing-BkxBplUZ.js.map +1 -0
- package/dist/admin/assets/{radio-group-4ok5evXq.js → radio-group-CRuWQnuV.js} +2 -2
- package/dist/admin/assets/{radio-group-4ok5evXq.js.map → radio-group-CRuWQnuV.js.map} +1 -1
- package/dist/admin/assets/{rotate-ccw-DL6TzcZh.js → rotate-ccw-BP8Ba-mY.js} +2 -2
- package/dist/admin/assets/{rotate-ccw-DL6TzcZh.js.map → rotate-ccw-BP8Ba-mY.js.map} +1 -1
- package/dist/admin/assets/schedules-BIyBlsYZ.js +2 -0
- package/dist/admin/assets/{schedules-BmB9Y73z.js.map → schedules-BIyBlsYZ.js.map} +1 -1
- package/dist/admin/assets/schema-6eUoC8fJ.js +2 -0
- package/dist/admin/assets/schema-6eUoC8fJ.js.map +1 -0
- package/dist/admin/assets/{scroll-text-PqeZm472.js → scroll-text-B5vfi9fD.js} +2 -2
- package/dist/admin/assets/{scroll-text-PqeZm472.js.map → scroll-text-B5vfi9fD.js.map} +1 -1
- package/dist/admin/assets/{search-BdwIwOzC.js → search-wj7zbkx1.js} +2 -2
- package/dist/admin/assets/{search-BdwIwOzC.js.map → search-wj7zbkx1.js.map} +1 -1
- package/dist/admin/assets/{searchSchemas-CSScloG8.js → searchSchemas-DAnwh3I3.js} +2 -2
- package/dist/admin/assets/{searchSchemas-CSScloG8.js.map → searchSchemas-DAnwh3I3.js.map} +1 -1
- package/dist/admin/assets/{sections-DqBzSKMP.js → sections-CWL-XD6m.js} +2 -2
- package/dist/admin/assets/sections-CWL-XD6m.js.map +1 -0
- package/dist/admin/assets/{sections-BTS683ur.js → sections-DBQpB0uv.js} +2 -2
- package/dist/admin/assets/{sections-BTS683ur.js.map → sections-DBQpB0uv.js.map} +1 -1
- package/dist/admin/assets/{select-C0USI-Ox.js → select-DVrPV1b3.js} +2 -2
- package/dist/admin/assets/{select-C0USI-Ox.js.map → select-DVrPV1b3.js.map} +1 -1
- package/dist/admin/assets/{send-XPWo3m4u.js → send-CzFdgUc_.js} +2 -2
- package/dist/admin/assets/{send-XPWo3m4u.js.map → send-CzFdgUc_.js.map} +1 -1
- package/dist/admin/assets/seo-Bd0sWQMo.js +2 -0
- package/dist/admin/assets/{seo-CceGYTIX.js.map → seo-Bd0sWQMo.js.map} +1 -1
- package/dist/admin/assets/settings-CqnrPmzR.js +2 -0
- package/dist/admin/assets/{settings-B60vHpZd.js.map → settings-CqnrPmzR.js.map} +1 -1
- package/dist/admin/assets/shapes-ZAkMBB-Z.js +6 -0
- package/dist/admin/assets/shapes-ZAkMBB-Z.js.map +1 -0
- package/dist/admin/assets/{skeleton-B5MP72Kw.js → skeleton-CiX26LnL.js} +2 -2
- package/dist/admin/assets/{skeleton-B5MP72Kw.js.map → skeleton-CiX26LnL.js.map} +1 -1
- package/dist/admin/assets/{snapshots-DUI2t-qF.js → snapshots-DbFQNJgN.js} +2 -2
- package/dist/admin/assets/{snapshots-DUI2t-qF.js.map → snapshots-DbFQNJgN.js.map} +1 -1
- package/dist/admin/assets/{sparkles-CvT-jxrW.js → sparkles-D_kmZJVd.js} +2 -2
- package/dist/admin/assets/{sparkles-CvT-jxrW.js.map → sparkles-D_kmZJVd.js.map} +1 -1
- package/dist/admin/assets/src-CMor9izq.js +7 -0
- package/dist/admin/assets/src-CMor9izq.js.map +1 -0
- package/dist/admin/assets/{stableId-BrtQedPy.js → stableId-g1uxJGSz.js} +2 -2
- package/dist/admin/assets/{stableId-BrtQedPy.js.map → stableId-g1uxJGSz.js.map} +1 -1
- package/dist/admin/assets/{store-CdIFG90N.js → store-CznhNKEi.js} +2 -2
- package/dist/admin/assets/{store-CdIFG90N.js.map → store-CznhNKEi.js.map} +1 -1
- package/dist/admin/assets/{switch-Dp6WYNam.js → switch-CiVf05NF.js} +2 -2
- package/dist/admin/assets/{switch-Dp6WYNam.js.map → switch-CiVf05NF.js.map} +1 -1
- package/dist/admin/assets/{theme-65PB8uAu.js → theme-Cv-MfOv8.js} +2 -2
- package/dist/admin/assets/theme-Cv-MfOv8.js.map +1 -0
- package/dist/admin/assets/titles-DrQhW8z3.js +2 -0
- package/dist/admin/assets/titles-DrQhW8z3.js.map +1 -0
- package/dist/admin/assets/tokens-B1S81Epe.js +2 -0
- package/dist/admin/assets/{tokens-ixHjAkDK.js.map → tokens-B1S81Epe.js.map} +1 -1
- package/dist/admin/assets/{tooltip-BGP1DVBt.js → tooltip-Bqf3oyqC.js} +2 -2
- package/dist/admin/assets/{tooltip-BGP1DVBt.js.map → tooltip-Bqf3oyqC.js.map} +1 -1
- package/dist/admin/assets/{undo-2-BiTANHFz.js → undo-2-DpwwRQTf.js} +2 -2
- package/dist/admin/assets/{undo-2-BiTANHFz.js.map → undo-2-DpwwRQTf.js.map} +1 -1
- package/dist/admin/assets/useContentSchema-B_q1rMrG.js +2 -0
- package/dist/admin/assets/useContentSchema-B_q1rMrG.js.map +1 -0
- package/dist/admin/assets/useCursorPager-BHYqHb3M.js +2 -0
- package/dist/admin/assets/{useCursorPager-0zHjlm-7.js.map → useCursorPager-BHYqHb3M.js.map} +1 -1
- package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js → useDiscardGuard-C4QTfiU4.js} +2 -2
- package/dist/admin/assets/{useDiscardGuard-BskWSlbT.js.map → useDiscardGuard-C4QTfiU4.js.map} +1 -1
- package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js → useMediaPickerDialog-BLrVV1Kn.js} +2 -2
- package/dist/admin/assets/{useMediaPickerDialog-CU-ekPqX.js.map → useMediaPickerDialog-BLrVV1Kn.js.map} +1 -1
- package/dist/admin/assets/{useMediaUploader-CBcq1ICg.js → useMediaUploader-CFy6lasO.js} +2 -2
- package/dist/admin/assets/useMediaUploader-CFy6lasO.js.map +1 -0
- package/dist/admin/assets/useModelIndex-NU-WlHQY.js +2 -0
- package/dist/admin/assets/useModelIndex-NU-WlHQY.js.map +1 -0
- package/dist/admin/assets/useNetworkPermission-DehDln-U.js +2 -0
- package/dist/admin/assets/{useNetworkPermission-Cts98h9d.js.map → useNetworkPermission-DehDln-U.js.map} +1 -1
- package/dist/admin/assets/{usePaletteItems-DtReWmkd.js → usePaletteItems-CFpNlSOs.js} +2 -2
- package/dist/admin/assets/{usePaletteItems-DtReWmkd.js.map → usePaletteItems-CFpNlSOs.js.map} +1 -1
- package/dist/admin/assets/usePlaces-BA4x6503.js +2 -0
- package/dist/admin/assets/usePlaces-BA4x6503.js.map +1 -0
- package/dist/admin/assets/useResolvedDefinitions-30lnwFQ1.js +2 -0
- package/dist/admin/assets/useResolvedDefinitions-30lnwFQ1.js.map +1 -0
- package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js → useResolvedScheme-BVM4qLct.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-C8vcQVko.js.map → useResolvedScheme-BVM4qLct.js.map} +1 -1
- package/dist/admin/assets/useSaveShortcut-DQuNL1uJ.js +2 -0
- package/dist/admin/assets/useSaveShortcut-DQuNL1uJ.js.map +1 -0
- package/dist/admin/assets/{useSchemaScopeAccess-ByrxIdKM.js → useSchemaScopeAccess-JXOMx51q.js} +2 -2
- package/dist/admin/assets/{useSchemaScopeAccess-ByrxIdKM.js.map → useSchemaScopeAccess-JXOMx51q.js.map} +1 -1
- package/dist/admin/assets/users-38jLQ7zr.js +2 -0
- package/dist/admin/assets/users-38jLQ7zr.js.map +1 -0
- package/dist/admin/assets/{users-DM7CXUBJ.js → users-DYwcVDqp.js} +2 -2
- package/dist/admin/assets/{users-DM7CXUBJ.js.map → users-DYwcVDqp.js.map} +1 -1
- package/dist/admin/assets/{zod-Cry7YvLY.js → zod-ZaQjjiAq.js} +2 -2
- package/dist/admin/assets/{zod-Cry7YvLY.js.map → zod-ZaQjjiAq.js.map} +1 -1
- package/dist/admin/index.html +60 -58
- package/dist/cli.js +1 -1
- package/dist/{cliMain-papyXJDd.js → cliMain-CTntiVc2.js} +107 -30
- package/dist/cliMain-CTntiVc2.js.map +1 -0
- package/dist/config.d.ts +2 -2
- package/dist/config.js +1 -1
- package/dist/{contentDisposition-DOL2Xt0l.js → contentDisposition-DzhPhncr.js} +2 -2
- package/dist/{contentDisposition-DOL2Xt0l.js.map → contentDisposition-DzhPhncr.js.map} +1 -1
- package/dist/index.d.ts +43 -6
- package/dist/index.js +2 -2
- package/dist/{public-COKbHR-N.d.ts → public-CMFaGDyf.d.ts} +50 -8
- package/dist/{public-B57h4F7Y.js → public-sJCQaNaP.js} +2 -2
- package/dist/public-sJCQaNaP.js.map +1 -0
- package/dist/{s3Adapter-U01iEAcK.js → s3Adapter-CZcCl0sy.js} +2 -2
- package/dist/{s3Adapter-U01iEAcK.js.map → s3Adapter-CZcCl0sy.js.map} +1 -1
- package/dist/{worker-B-sC-eY2.js → worker-DHm2JwMZ.js} +3140 -1292
- package/dist/worker-DHm2JwMZ.js.map +1 -0
- package/package.json +5 -5
- package/dist/admin/assets/AssistError-Cs-r9Ssc.js +0 -2
- package/dist/admin/assets/Body-BzZD-TZT.js +0 -2
- package/dist/admin/assets/Body-BzZD-TZT.js.map +0 -1
- package/dist/admin/assets/Builder-DW-GJA_q.js +0 -2
- package/dist/admin/assets/Builder-DW-GJA_q.js.map +0 -1
- package/dist/admin/assets/Form-lNrRHc0I.js +0 -2
- package/dist/admin/assets/Form-lNrRHc0I.js.map +0 -1
- package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js +0 -2
- package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js.map +0 -1
- package/dist/admin/assets/FormSelectField-BzE9Lq9i.js +0 -2
- package/dist/admin/assets/FormSelectField-BzE9Lq9i.js.map +0 -1
- package/dist/admin/assets/RadioTile-DQFmni5A.js.map +0 -1
- package/dist/admin/assets/RichTextField-CVHRIbnu.js.map +0 -1
- package/dist/admin/assets/StepList-BXGYD9eJ.js +0 -2
- package/dist/admin/assets/StepList-BXGYD9eJ.js.map +0 -1
- package/dist/admin/assets/Structure-D8csgrIt.js +0 -2
- package/dist/admin/assets/SubNavLink-CiCaVV8U.js.map +0 -1
- package/dist/admin/assets/auth-CQO4MBUj.js +0 -2
- package/dist/admin/assets/changeSets-8EburmT0.js +0 -2
- package/dist/admin/assets/chevron-left-DGU3HGYG.js +0 -2
- package/dist/admin/assets/content-CAjkbZEY.js +0 -3
- package/dist/admin/assets/content-CAjkbZEY.js.map +0 -1
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js +0 -2
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js.map +0 -1
- package/dist/admin/assets/develop-BOqvnlgt.js +0 -11
- package/dist/admin/assets/develop-BOqvnlgt.js.map +0 -1
- package/dist/admin/assets/es2015-BHmI7wjK.js +0 -42
- package/dist/admin/assets/es2015-BHmI7wjK.js.map +0 -1
- package/dist/admin/assets/followPlural-Cm7v_Udv.js +0 -2
- package/dist/admin/assets/followPlural-Cm7v_Udv.js.map +0 -1
- package/dist/admin/assets/inbox-DGO2D8fa.js +0 -2
- package/dist/admin/assets/inbox-DGO2D8fa.js.map +0 -1
- package/dist/admin/assets/index-BIIU9ZI6.js +0 -4
- package/dist/admin/assets/index-BIIU9ZI6.js.map +0 -1
- package/dist/admin/assets/index-lxe7WimO.css +0 -2
- package/dist/admin/assets/locales-Bg3htKo8.js +0 -2
- package/dist/admin/assets/media-BCnVhaDH.js +0 -2
- package/dist/admin/assets/network-BixABr0o.js +0 -2
- package/dist/admin/assets/network-BixABr0o.js.map +0 -1
- package/dist/admin/assets/publishing-Dke9bSKp.js +0 -2
- package/dist/admin/assets/publishing-Dke9bSKp.js.map +0 -1
- package/dist/admin/assets/schedules-BmB9Y73z.js +0 -2
- package/dist/admin/assets/schema-D-qo7XSF.js +0 -2
- package/dist/admin/assets/schema-D-qo7XSF.js.map +0 -1
- package/dist/admin/assets/sections-DqBzSKMP.js.map +0 -1
- package/dist/admin/assets/seo-CceGYTIX.js +0 -2
- package/dist/admin/assets/settings-B60vHpZd.js +0 -2
- package/dist/admin/assets/shapes-B5twqZcp.js +0 -6
- package/dist/admin/assets/shapes-B5twqZcp.js.map +0 -1
- package/dist/admin/assets/src-ndgTSYLX.js +0 -7
- package/dist/admin/assets/src-ndgTSYLX.js.map +0 -1
- package/dist/admin/assets/theme-65PB8uAu.js.map +0 -1
- package/dist/admin/assets/titles-CQiqqDw-.js +0 -2
- package/dist/admin/assets/titles-CQiqqDw-.js.map +0 -1
- package/dist/admin/assets/tokens-ixHjAkDK.js +0 -2
- package/dist/admin/assets/useContentSchema-DtYfhsd2.js +0 -2
- package/dist/admin/assets/useContentSchema-DtYfhsd2.js.map +0 -1
- package/dist/admin/assets/useCursorPager-0zHjlm-7.js +0 -2
- package/dist/admin/assets/useMediaUploader-CBcq1ICg.js.map +0 -1
- package/dist/admin/assets/useNetworkPermission-Cts98h9d.js +0 -2
- package/dist/admin/assets/usePlaces-DC47wVeU.js +0 -2
- package/dist/admin/assets/usePlaces-DC47wVeU.js.map +0 -1
- package/dist/admin/assets/useQueries-CirW3Mvp.js +0 -2
- package/dist/admin/assets/useQueries-CirW3Mvp.js.map +0 -1
- package/dist/admin/assets/useSaveShortcut-rKtp1qK7.js +0 -2
- package/dist/admin/assets/useSaveShortcut-rKtp1qK7.js.map +0 -1
- package/dist/admin/assets/users-2iJYwlJb.js +0 -2
- package/dist/admin/assets/users-2iJYwlJb.js.map +0 -1
- package/dist/cliMain-papyXJDd.js.map +0 -1
- package/dist/public-B57h4F7Y.js.map +0 -1
- package/dist/worker-B-sC-eY2.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{M as n}from"./badge-
|
|
2
|
-
//# sourceMappingURL=RowTitle-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{M as n}from"./badge-DGqA_yr_.js";import{T as r,_ as i}from"./es2015-Cv57ynE1.js";import{t as a}from"./cn-DVhJ55Mo.js";function o(e){return n({from:e.from,strict:e.strict,structuralSharing:e.structuralSharing,select:t=>e.select?e.select(t.loaderData):t.loaderData})}function s(e){let{select:t,...r}=e;return n({...r,select:e=>t?t(e.loaderDeps):e.loaderDeps})}function c(e){return n({from:e.from,strict:e.strict,shouldThrow:e.shouldThrow,structuralSharing:e.structuralSharing,select:t=>e.select?e.select(t.search):t.search})}function l(e){return n({...e,select:t=>e.select?e.select(t.context):t.context})}var u=new Map,d=e=>{let t=u.get(e);return t||(t=new Intl.DateTimeFormat(e,{dateStyle:`medium`,timeStyle:`short`}),u.set(e,t)),t},f=e=>{if(!e)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:d(r.language).format(t)},p=new Map,m=e=>{let t=p.get(e);return t||(t=new Intl.RelativeTimeFormat(e,{numeric:`auto`,style:`short`}),p.set(e,t)),t},h=1e3,g=60*h,_=60*g,v=24*_,y=7*v,b=30*v,x=365*v,S=[[g,h,`second`],[_,g,`minute`],[v,_,`hour`],[y,v,`day`],[5*y,y,`week`],[x,b,`month`],[1/0,x,`year`]],C=(e,{now:t=Date.now(),language:n=r.language}={})=>{if(!e)return``;let i=new Date(e).getTime();if(Number.isNaN(i))return``;let a=i-t,[,o,s]=S.find(([e])=>Math.abs(a)<e)??S[0];return m(n).format(Math.round(a/o),s)},w=(e,t=r.language)=>{let n=/^(\d{4})-(\d{2})$/.exec(e);if(!n)return e;let i=new Date(Date.UTC(Number(n[1]),Number(n[2])-1,1));return new Intl.DateTimeFormat(t,{month:`long`,year:`numeric`,timeZone:`UTC`}).format(i)},T=e(t(),1),E=({asChild:e=!1,className:t,children:n})=>{let r=e?i:`span`;return(0,T.jsx)(r,{"data-slot":`row-title`,className:a(`rounded-sm font-semibold text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 [a&]:hover:text-primary dark:[a&]:hover:text-link`,t),children:n})};export{l as a,o as c,C as i,f as n,c as o,w as r,s,E as t};
|
|
2
|
+
//# sourceMappingURL=RowTitle-DH9OZs3g.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RowTitle-Bqt6evG9.js","names":["i18next","Slot.Root","__toESM","useMatch","instance","Slot","cn","useLoaderData","opts","match","useLoaderDeps","rest","select","useSearch","useRouteContext","dateTimeFormats","formatterFor","formatter","language","formatDateTime","value","date","relativeTimeFormats","relativeFormatterFor","SECOND","MINUTE","HOUR","DAY","WEEK","MONTH","YEAR","RELATIVE_UNITS","formatRelativeTime","time","diff","now","size","unit","limit","formatMonth","month","import_jsx_runtime","require_jsx_runtime","RowTitle","Comp","asChild","className"],"sources":["../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useLoaderData.js","../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useLoaderDeps.js","../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useSearch.js","../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useRouteContext.js","../../src/helpers/formatDate.ts","../../src/components/RowTitle/index.tsx"],"sourcesContent":["import { useMatch } from \"./useMatch.js\";\n//#region src/useLoaderData.tsx\n/**\n* Read and select the current route's loader data with type‑safety.\n*\n* Options:\n* - `from`/`strict`: Choose which route's data to read and strictness\n* - `select`: Map the loader data to a derived value\n* - `structuralSharing`: Enable structural sharing for stable references\n*\n* @returns The loader data (or selected value) for the matched route.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDataHook\n*/\nfunction useLoaderData(opts) {\n\treturn useMatch({\n\t\tfrom: opts.from,\n\t\tstrict: opts.strict,\n\t\tstructuralSharing: opts.structuralSharing,\n\t\tselect: (match) => {\n\t\t\treturn opts.select ? opts.select(match.loaderData) : match.loaderData;\n\t\t}\n\t});\n}\n//#endregion\nexport { useLoaderData };\n\n//# sourceMappingURL=useLoaderData.js.map","import { useMatch } from \"./useMatch.js\";\n//#region src/useLoaderDeps.tsx\n/**\n* Read and select the current route's loader dependencies object.\n*\n* Options:\n* - `from`: Choose which route's loader deps to read\n* - `select`: Map the deps to a derived value\n* - `structuralSharing`: Enable structural sharing for stable references\n*\n* @returns The loader deps (or selected value) for the matched route.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook\n*/\nfunction useLoaderDeps(opts) {\n\tconst { select, ...rest } = opts;\n\treturn useMatch({\n\t\t...rest,\n\t\tselect: (match) => {\n\t\t\treturn select ? select(match.loaderDeps) : match.loaderDeps;\n\t\t}\n\t});\n}\n//#endregion\nexport { useLoaderDeps };\n\n//# sourceMappingURL=useLoaderDeps.js.map","import { useMatch } from \"./useMatch.js\";\n//#region src/useSearch.tsx\n/**\n* Read and select the current route's search parameters with type-safety.\n*\n* Options:\n* - `from`/`strict`: Control which route's search is read and how strictly it's typed\n* - `select`: Map the search object to a derived value for render optimization\n* - `structuralSharing`: Enable structural sharing for stable references\n* - `shouldThrow`: Throw when the route is not found (strict contexts)\n*\n* @returns The search object (or selected value) for the matched route.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useSearchHook\n*/\nfunction useSearch(opts) {\n\treturn useMatch({\n\t\tfrom: opts.from,\n\t\tstrict: opts.strict,\n\t\tshouldThrow: opts.shouldThrow,\n\t\tstructuralSharing: opts.structuralSharing,\n\t\tselect: (match) => {\n\t\t\treturn opts.select ? opts.select(match.search) : match.search;\n\t\t}\n\t});\n}\n//#endregion\nexport { useSearch };\n\n//# sourceMappingURL=useSearch.js.map","import { useMatch } from \"./useMatch.js\";\n//#region src/useRouteContext.ts\nfunction useRouteContext(opts) {\n\treturn useMatch({\n\t\t...opts,\n\t\tselect: (match) => opts.select ? opts.select(match.context) : match.context\n\t});\n}\n//#endregion\nexport { useRouteContext };\n\n//# sourceMappingURL=useRouteContext.js.map","import { i18next } from '@/app/i18n';\n\nconst dateTimeFormats = new Map<string, Intl.DateTimeFormat>();\n\nconst formatterFor = (language: string) => {\n let formatter = dateTimeFormats.get(language);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(language, { dateStyle: 'medium', timeStyle: 'short' });\n dateTimeFormats.set(language, formatter);\n }\n return formatter;\n};\n\n/** Locale-aware date and time for tables; `null` and invalid input give an empty string. */\nexport const formatDateTime = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? '' : formatterFor(i18next.language).format(date);\n};\n\nconst relativeTimeFormats = new Map<string, Intl.RelativeTimeFormat>();\n\nconst relativeFormatterFor = (language: string) => {\n let formatter = relativeTimeFormats.get(language);\n if (!formatter) {\n formatter = new Intl.RelativeTimeFormat(language, { numeric: 'auto', style: 'short' });\n relativeTimeFormats.set(language, formatter);\n }\n return formatter;\n};\n\nconst SECOND = 1_000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\n/** The largest unit that keeps the number readable (\"3 hr. ago\", not \"180 min. ago\"). */\nconst RELATIVE_UNITS: ReadonlyArray<[limit: number, size: number, unit: Intl.RelativeTimeFormatUnit]> = [\n [MINUTE, SECOND, 'second'],\n [HOUR, MINUTE, 'minute'],\n [DAY, HOUR, 'hour'],\n [WEEK, DAY, 'day'],\n [5 * WEEK, WEEK, 'week'],\n [YEAR, MONTH, 'month'],\n [Infinity, YEAR, 'year'],\n];\n\ntype RelativeTimeOptions = { now?: number; language?: string };\n\n/**\n * \"2 hr. ago\", \"in 3 days\", \"yesterday\": for list columns. Pair it with the full date (formatDateTime) in\n * a `title` or tooltip. `null` and invalid input give an empty string.\n */\nexport const formatRelativeTime = (\n value: string | null | undefined,\n { now = Date.now(), language = i18next.language }: RelativeTimeOptions = {},\n): string => {\n if (!value) {\n return '';\n }\n const time = new Date(value).getTime();\n if (Number.isNaN(time)) {\n return '';\n }\n const diff = time - now;\n const [, size, unit] = RELATIVE_UNITS.find(([limit]) => Math.abs(diff) < limit) ?? RELATIVE_UNITS[0]!;\n return relativeFormatterFor(language).format(Math.round(diff / size), unit);\n};\n\n/** A calendar month (`2026-10`, as usage periods are named) as \"October 2026\"; other input as it is. */\nexport const formatMonth = (month: string, language: string = i18next.language): string => {\n const match = /^(\\d{4})-(\\d{2})$/.exec(month);\n if (!match) {\n return month;\n }\n const date = new Date(Date.UTC(Number(match[1]), Number(match[2]) - 1, 1));\n return new Intl.DateTimeFormat(language, { month: 'long', year: 'numeric', timeZone: 'UTC' }).format(date);\n};\n","import { Slot } from 'radix-ui';\nimport type { ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\n\ntype RowTitleProps = {\n /** Render the child instead (pass a router `Link` to make the title the row's link). */\n asChild?: boolean;\n className?: string;\n children: ReactNode;\n};\n\n/** The first cell's title in a list row: ink, 600, cobalt on hover when it's a link. */\nexport const RowTitle = ({ asChild = false, className, children }: RowTitleProps) => {\n const Comp = asChild ? Slot.Root : 'span';\n return (\n <Comp\n data-slot=\"row-title\"\n className={cn(\n 'rounded-sm font-semibold text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 [a&]:hover:text-primary dark:[a&]:hover:text-link',\n className,\n )}\n >\n {children}\n </Comp>\n );\n};\n"],"ignoreList":[0,1,2,3],"mappings":"yNAaA,SAASO,EAAc,EAAM,CAC5B,OAAOJ,EAAS,CACf,KAAMK,EAAK,KACX,OAAQA,EAAK,OACb,kBAAmBA,EAAK,kBACxB,OAAS,GACDA,EAAK,OAASA,EAAK,OAAOC,EAAM,UAAU,EAAIA,EAAM,UAE7D,CAAC,CACF,CCTA,SAASC,EAAc,EAAM,CAC5B,GAAM,CAAE,SAAQ,GAAGC,GAASH,EAC5B,OAAOL,EAAS,CACf,GAAGQ,EACH,OAAS,GACDC,EAASA,EAAOH,EAAM,UAAU,EAAIA,EAAM,UAEnD,CAAC,CACF,CCPA,SAASI,EAAU,EAAM,CACxB,OAAOV,EAAS,CACf,KAAMK,EAAK,KACX,OAAQA,EAAK,OACb,YAAaA,EAAK,YAClB,kBAAmBA,EAAK,kBACxB,OAAS,GACDA,EAAK,OAASA,EAAK,OAAOC,EAAM,MAAM,EAAIA,EAAM,MAEzD,CAAC,CACF,CCtBA,SAASK,EAAgB,EAAM,CAC9B,OAAOX,EAAS,CACf,GAAGK,EACH,OAAS,GAAUA,EAAK,OAASA,EAAK,OAAOC,EAAM,OAAO,EAAIA,EAAM,OACrE,CAAC,CACF,CCLA,IAAMM,EAAkB,IAAI,IAEtBC,EAAgB,GAAqB,CACzC,IAAIC,EAAYF,EAAgB,IAAIG,CAAQ,EAK5C,OAJKD,IACH,EAAY,IAAI,KAAK,eAAeC,EAAU,CAAE,UAAW,SAAU,UAAW,OAAQ,CAAC,EACzFH,EAAgB,IAAIG,EAAUD,CAAS,GAElCA,CACT,EAGaE,EAAkB,GAA6C,CAC1E,GAAI,CAACC,EACH,MAAO,GAET,IAAMC,EAAO,IAAI,KAAKD,CAAK,EAC3B,OAAO,OAAO,MAAMC,EAAK,QAAQ,CAAC,EAAI,GAAKL,EAAahB,EAAQ,QAAQ,CAAC,CAAC,OAAOqB,CAAI,CACvF,EAEMC,EAAsB,IAAI,IAE1BC,EAAwB,GAAqB,CACjD,IAAIN,EAAYK,EAAoB,IAAIJ,CAAQ,EAKhD,OAJKD,IACH,EAAY,IAAI,KAAK,mBAAmBC,EAAU,CAAE,QAAS,OAAQ,MAAO,OAAQ,CAAC,EACrFI,EAAoB,IAAIJ,EAAUD,CAAS,GAEtCA,CACT,EAEMO,EAAS,IACTC,EAAS,GAAKD,EACdE,EAAO,GAAKD,EACZE,EAAM,GAAKD,EACXE,EAAO,EAAID,EACXE,EAAQ,GAAKF,EACbG,EAAO,IAAMH,EAGbI,EAAkG,CACtG,CAACN,EAAQD,EAAQ,QAAQ,EACzB,CAACE,EAAMD,EAAQ,QAAQ,EACvB,CAACE,EAAKD,EAAM,MAAM,EAClB,CAACE,EAAMD,EAAK,KAAK,EACjB,CAAC,EAAIC,EAAMA,EAAM,MAAM,EACvB,CAACE,EAAMD,EAAO,OAAO,EACrB,CAAC,IAAUC,EAAM,MAAM,CACzB,EAQaE,GACX,EACA,CAAE,MAAM,KAAK,IAAI,EAAG,WAAWhC,EAAQ,UAAkC,CAAC,IAC/D,CACX,GAAI,CAACoB,EACH,MAAO,GAET,IAAMa,EAAO,IAAI,KAAKb,CAAK,CAAC,CAAC,QAAQ,EACrC,GAAI,OAAO,MAAMa,CAAI,EACnB,MAAO,GAET,IAAMC,EAAOD,EAAOE,EACd,EAAGC,EAAMC,GAAQN,EAAe,MAAM,CAACO,KAAW,KAAK,IAAIJ,CAAI,EAAII,CAAK,GAAKP,EAAe,GAClG,OAAOR,EAAqBL,CAAQ,CAAC,CAAC,OAAO,KAAK,MAAMgB,EAAOE,CAAI,EAAGC,CAAI,CAC5E,EAGaE,GAAe,EAAe,EAAmBvC,EAAQ,WAAqB,CACzF,IAAMS,EAAQ,oBAAoB,KAAK+B,CAAK,EAC5C,GAAI,CAAC/B,EACH,OAAO+B,EAET,IAAMnB,EAAO,IAAI,KAAK,KAAK,IAAI,OAAOZ,EAAM,EAAE,EAAG,OAAOA,EAAM,EAAE,EAAI,EAAG,CAAC,CAAC,EACzE,OAAO,IAAI,KAAK,eAAeS,EAAU,CAAE,MAAO,OAAQ,KAAM,UAAW,SAAU,KAAM,CAAC,CAAC,CAAC,OAAOG,CAAI,CAC3G,aCtEasB,GAAY,CAAE,UAAU,GAAO,YAAW,cAA8B,CACnF,IAAMC,EAAOC,EAAU5C,EAAY,OACnC,OACE,EAAAwC,EAAA,IAAA,CAACG,EAAD,CACE,YAAU,YACV,UAAWtC,EACT,8JACAwC,CACF,EAEC,UACG,CAAA,CAEV"}
|
|
1
|
+
{"version":3,"file":"RowTitle-DH9OZs3g.js","names":["i18next","Slot.Root","__toESM","useMatch","instance","Slot","cn","useLoaderData","opts","match","useLoaderDeps","rest","select","useSearch","useRouteContext","dateTimeFormats","formatterFor","formatter","language","formatDateTime","value","date","relativeTimeFormats","relativeFormatterFor","SECOND","MINUTE","HOUR","DAY","WEEK","MONTH","YEAR","RELATIVE_UNITS","formatRelativeTime","time","diff","now","size","unit","limit","formatMonth","month","import_jsx_runtime","require_jsx_runtime","RowTitle","Comp","asChild","className"],"sources":["../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useLoaderData.js","../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useLoaderDeps.js","../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useSearch.js","../../../../node_modules/.pnpm/@tanstack+react-router@1.170.41_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-router/dist/esm/useRouteContext.js","../../src/helpers/formatDate.ts","../../src/components/RowTitle/index.tsx"],"sourcesContent":["import { useMatch } from \"./useMatch.js\";\n//#region src/useLoaderData.tsx\n/**\n* Read and select the current route's loader data with type‑safety.\n*\n* Options:\n* - `from`/`strict`: Choose which route's data to read and strictness\n* - `select`: Map the loader data to a derived value\n* - `structuralSharing`: Enable structural sharing for stable references\n*\n* @returns The loader data (or selected value) for the matched route.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDataHook\n*/\nfunction useLoaderData(opts) {\n\treturn useMatch({\n\t\tfrom: opts.from,\n\t\tstrict: opts.strict,\n\t\tstructuralSharing: opts.structuralSharing,\n\t\tselect: (match) => {\n\t\t\treturn opts.select ? opts.select(match.loaderData) : match.loaderData;\n\t\t}\n\t});\n}\n//#endregion\nexport { useLoaderData };\n\n//# sourceMappingURL=useLoaderData.js.map","import { useMatch } from \"./useMatch.js\";\n//#region src/useLoaderDeps.tsx\n/**\n* Read and select the current route's loader dependencies object.\n*\n* Options:\n* - `from`: Choose which route's loader deps to read\n* - `select`: Map the deps to a derived value\n* - `structuralSharing`: Enable structural sharing for stable references\n*\n* @returns The loader deps (or selected value) for the matched route.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDepsHook\n*/\nfunction useLoaderDeps(opts) {\n\tconst { select, ...rest } = opts;\n\treturn useMatch({\n\t\t...rest,\n\t\tselect: (match) => {\n\t\t\treturn select ? select(match.loaderDeps) : match.loaderDeps;\n\t\t}\n\t});\n}\n//#endregion\nexport { useLoaderDeps };\n\n//# sourceMappingURL=useLoaderDeps.js.map","import { useMatch } from \"./useMatch.js\";\n//#region src/useSearch.tsx\n/**\n* Read and select the current route's search parameters with type-safety.\n*\n* Options:\n* - `from`/`strict`: Control which route's search is read and how strictly it's typed\n* - `select`: Map the search object to a derived value for render optimization\n* - `structuralSharing`: Enable structural sharing for stable references\n* - `shouldThrow`: Throw when the route is not found (strict contexts)\n*\n* @returns The search object (or selected value) for the matched route.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useSearchHook\n*/\nfunction useSearch(opts) {\n\treturn useMatch({\n\t\tfrom: opts.from,\n\t\tstrict: opts.strict,\n\t\tshouldThrow: opts.shouldThrow,\n\t\tstructuralSharing: opts.structuralSharing,\n\t\tselect: (match) => {\n\t\t\treturn opts.select ? opts.select(match.search) : match.search;\n\t\t}\n\t});\n}\n//#endregion\nexport { useSearch };\n\n//# sourceMappingURL=useSearch.js.map","import { useMatch } from \"./useMatch.js\";\n//#region src/useRouteContext.ts\nfunction useRouteContext(opts) {\n\treturn useMatch({\n\t\t...opts,\n\t\tselect: (match) => opts.select ? opts.select(match.context) : match.context\n\t});\n}\n//#endregion\nexport { useRouteContext };\n\n//# sourceMappingURL=useRouteContext.js.map","import { i18next } from '@/app/i18n';\n\nconst dateTimeFormats = new Map<string, Intl.DateTimeFormat>();\n\nconst formatterFor = (language: string) => {\n let formatter = dateTimeFormats.get(language);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat(language, { dateStyle: 'medium', timeStyle: 'short' });\n dateTimeFormats.set(language, formatter);\n }\n return formatter;\n};\n\n/** Locale-aware date and time for tables; `null` and invalid input give an empty string. */\nexport const formatDateTime = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? '' : formatterFor(i18next.language).format(date);\n};\n\nconst relativeTimeFormats = new Map<string, Intl.RelativeTimeFormat>();\n\nconst relativeFormatterFor = (language: string) => {\n let formatter = relativeTimeFormats.get(language);\n if (!formatter) {\n formatter = new Intl.RelativeTimeFormat(language, { numeric: 'auto', style: 'short' });\n relativeTimeFormats.set(language, formatter);\n }\n return formatter;\n};\n\nconst SECOND = 1_000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\n/** The largest unit that keeps the number readable (\"3 hr. ago\", not \"180 min. ago\"). */\nconst RELATIVE_UNITS: ReadonlyArray<[limit: number, size: number, unit: Intl.RelativeTimeFormatUnit]> = [\n [MINUTE, SECOND, 'second'],\n [HOUR, MINUTE, 'minute'],\n [DAY, HOUR, 'hour'],\n [WEEK, DAY, 'day'],\n [5 * WEEK, WEEK, 'week'],\n [YEAR, MONTH, 'month'],\n [Infinity, YEAR, 'year'],\n];\n\ntype RelativeTimeOptions = { now?: number; language?: string };\n\n/**\n * \"2 hr. ago\", \"in 3 days\", \"yesterday\": for list columns. Pair it with the full date (formatDateTime) in\n * a `title` or tooltip. `null` and invalid input give an empty string.\n */\nexport const formatRelativeTime = (\n value: string | null | undefined,\n { now = Date.now(), language = i18next.language }: RelativeTimeOptions = {},\n): string => {\n if (!value) {\n return '';\n }\n const time = new Date(value).getTime();\n if (Number.isNaN(time)) {\n return '';\n }\n const diff = time - now;\n const [, size, unit] = RELATIVE_UNITS.find(([limit]) => Math.abs(diff) < limit) ?? RELATIVE_UNITS[0]!;\n return relativeFormatterFor(language).format(Math.round(diff / size), unit);\n};\n\n/** A calendar month (`2026-10`, as usage periods are named) as \"October 2026\"; other input as it is. */\nexport const formatMonth = (month: string, language: string = i18next.language): string => {\n const match = /^(\\d{4})-(\\d{2})$/.exec(month);\n if (!match) {\n return month;\n }\n const date = new Date(Date.UTC(Number(match[1]), Number(match[2]) - 1, 1));\n return new Intl.DateTimeFormat(language, { month: 'long', year: 'numeric', timeZone: 'UTC' }).format(date);\n};\n","import { Slot } from 'radix-ui';\nimport type { ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\n\ntype RowTitleProps = {\n /** Render the child instead (pass a router `Link` to make the title the row's link). */\n asChild?: boolean;\n className?: string;\n children: ReactNode;\n};\n\n/** The first cell's title in a list row: ink, 600, cobalt on hover when it's a link. */\nexport const RowTitle = ({ asChild = false, className, children }: RowTitleProps) => {\n const Comp = asChild ? Slot.Root : 'span';\n return (\n <Comp\n data-slot=\"row-title\"\n className={cn(\n 'rounded-sm font-semibold text-foreground outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 [a&]:hover:text-primary dark:[a&]:hover:text-link',\n className,\n )}\n >\n {children}\n </Comp>\n );\n};\n"],"ignoreList":[0,1,2,3],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{
|
|
2
|
-
//# sourceMappingURL=SecretReveal-
|
|
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{Bt as r,En as i,Jt as a,gt as o,mt as s,qt as c}from"./src-CMor9izq.js";import{n as l}from"./createLucideIcon-BOsNKleB.js";import{t as u}from"./UnsavedChangesGuard-BsEyn9oH.js";import{i as d,n as f}from"./skeleton-CiX26LnL.js";import{o as p,t as m}from"./field-D-xWW2E7.js";import{t as h}from"./cn-DVhJ55Mo.js";import{t as g}from"./Panel-Bcl09TtM.js";import{t as _}from"./CopyButton-Brnpfqe0.js";var v=e(t(),1),y=()=>a({queryKey:r.roles,queryFn:()=>o.roles.list(),meta:{silent:!0}}),b=e=>a({queryKey:r.role(e),queryFn:()=>o.roles.get(e),meta:{silent:!0}}),x=()=>{let e=i();return c({mutationKey:[`roles`,`create`],meta:{silent:!0},mutationFn:e=>s(()=>o.roles.create(e)),onSuccess:()=>e.invalidateQueries({queryKey:r.roles})})},S=()=>{let e=i();return c({mutationKey:[`roles`,`update`],meta:{silent:!0},mutationFn:({id:e,input:t})=>s(()=>o.roles.update(e,t)),onSettled:()=>e.invalidateQueries({queryKey:r.roles})})},C=()=>{let e=i();return c({mutationKey:[`roles`,`delete`],mutationFn:e=>s(()=>o.roles.remove(e)),onSettled:()=>e.invalidateQueries({queryKey:r.roles})})},w=()=>{let e=y();return{draftRoleIds:(0,v.useMemo)(()=>new Set((e.data??[]).filter(e=>e.permissions.some(e=>e.action===`readDrafts`)).map(e=>e.id)),[e.data])}},T=()=>{let e=y();return{names:(0,v.useMemo)(()=>new Map((e.data??[]).map(e=>[e.id,e.name])),[e.data]),error:e.error}},E=e(n(),1),D=({title:e,description:t,label:n,secret:r,dismissLabel:i,onDismiss:a,hint:o,className:s})=>{let{t:c}=l(),y=(0,v.useId)(),b=(0,v.useRef)(null);return(0,v.useEffect)(()=>{b.current?.focus()},[]),(0,E.jsxs)(g,{title:e,description:t,className:h(`border-success/50`,s),children:[(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsxs)(m,{children:[(0,E.jsx)(p,{htmlFor:y,children:n}),(0,E.jsxs)(`div`,{className:`flex gap-2`,children:[(0,E.jsx)(f,{id:y,readOnly:!0,value:r,inputSize:`sm`,className:`font-mono text-xs`,onFocus:e=>e.currentTarget.select()}),(0,E.jsx)(_,{ref:b,value:r})]})]}),o,(0,E.jsx)(`div`,{className:`flex justify-end`,children:(0,E.jsx)(d,{type:`button`,onClick:a,children:i??c(`secret.saved`)})})]}),(0,E.jsx)(u,{when:!0,title:c(`secret.leaveTitle`),description:c(`secret.leaveDescription`),stayLabel:c(`secret.stay`),leaveLabel:c(`secret.leave`)})]})};export{b as a,S as c,w as i,x as n,T as o,C as r,y as s,D as t};
|
|
2
|
+
//# sourceMappingURL=SecretReveal-D95oACLj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecretReveal-
|
|
1
|
+
{"version":3,"file":"SecretReveal-D95oACLj.js","names":["useMemo","useId","useRef","__toESM","require_jsx_runtime","queryKeys","useQueryClient","useQuery","adminApi","withCsrf","useMutation","useTranslation","UnsavedChangesGuard","Button","Input","FieldLabel","Field","cn","Panel","CopyButton","import_react","require_react","useRoles","useRole","id","useCreateRole","queryClient","input","useUpdateRole","useDeleteRole","useDraftRoleIds","roles","role","permission","useRoleNames","import_jsx_runtime","SecretReveal","copyRef","className","label","secret","event","hint","onDismiss","dismissLabel","t"],"sources":["../../src/api/roles.ts","../../src/components/SecretReveal/index.tsx"],"sourcesContent":["import type { CreateRoleInput, UpdateRoleInput } from '@shapio/client';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nexport const useRoles = () =>\n useQuery({ queryKey: queryKeys.roles, queryFn: () => adminApi.roles.list(), meta: { silent: true } });\n\nexport const useRole = (id: string) =>\n useQuery({ queryKey: queryKeys.role(id), queryFn: () => adminApi.roles.get(id), meta: { silent: true } });\n\nexport const useCreateRole = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['roles', 'create'],\n meta: { silent: true },\n mutationFn: (input: CreateRoleInput) => withCsrf(() => adminApi.roles.create(input)),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.roles }),\n });\n};\n\nexport const useUpdateRole = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['roles', 'update'],\n meta: { silent: true },\n mutationFn: ({ id, input }: { id: string; input: UpdateRoleInput }) =>\n withCsrf(() => adminApi.roles.update(id, input)),\n onSettled: () => queryClient.invalidateQueries({ queryKey: queryKeys.roles }),\n });\n};\n\nexport const useDeleteRole = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['roles', 'delete'],\n mutationFn: (id: string) => withCsrf(() => adminApi.roles.remove(id)),\n onSettled: () => queryClient.invalidateQueries({ queryKey: queryKeys.roles }),\n });\n};\n\n/**\n * IDs of the roles that grant Read drafts (drafts mode): the tokens screen marks their tokens, so a\n * development token is never mistaken for a production one.\n */\nexport const useDraftRoleIds = () => {\n const roles = useRoles();\n const draftRoleIds = useMemo(\n () =>\n new Set(\n (roles.data ?? [])\n .filter((role) => role.permissions.some((permission) => permission.action === 'readDrafts'))\n .map((role) => role.id),\n ),\n [roles.data],\n );\n return { draftRoleIds };\n};\n\n/** Role names by ID, for showing the roles that users, invitations and tokens reference. */\nexport const useRoleNames = () => {\n const roles = useRoles();\n const names = useMemo(() => new Map((roles.data ?? []).map((role) => [role.id, role.name])), [roles.data]);\n return { names, error: roles.error };\n};\n","import { useEffect, useId, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { CopyButton } from '@/components/CopyButton';\nimport { Button } from '@/components/ui/button';\nimport { Field, FieldLabel } from '@/components/ui/field';\nimport { Input } from '@/components/ui/input';\nimport { cn } from '@/helpers/cn';\nimport { Panel } from '../Panel';\nimport { UnsavedChangesGuard } from '../UnsavedChangesGuard';\n\ntype SecretRevealProps = {\n /** \"Copy your new token\". The panel is a region named by it. */\n title: string;\n /** One line: it is shown only once, where to keep it. */\n description: string;\n /** The field label (\"Token\", \"Signing secret\"). */\n label: string;\n secret: string;\n /** \"I've copied it\"; defaults to \"I've saved it\". */\n dismissLabel?: string;\n onDismiss: () => void;\n /** Extra guidance under the secret (e.g. how to verify signatures). */\n hint?: ReactNode;\n className?: string;\n};\n\n/**\n * Shows a new secret exactly once (API tokens, webhook and deployment signing secrets), inline at the top of\n * the page where it was created, never in a URL. It takes focus (its copy button) when it appears, and\n * leaving the page before dismissing it asks first, since the secret can't be shown again.\n */\nexport const SecretReveal = ({\n title,\n description,\n label,\n secret,\n dismissLabel,\n onDismiss,\n hint,\n className,\n}: SecretRevealProps) => {\n const { t } = useTranslation();\n const id = useId();\n const copyRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n copyRef.current?.focus();\n }, []);\n return (\n <Panel title={title} description={description} className={cn('border-success/50', className)}>\n <div className=\"space-y-4\">\n <Field>\n <FieldLabel htmlFor={id}>{label}</FieldLabel>\n <div className=\"flex gap-2\">\n <Input\n id={id}\n readOnly\n value={secret}\n inputSize=\"sm\"\n className=\"font-mono text-xs\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <CopyButton ref={copyRef} value={secret} />\n </div>\n </Field>\n {hint}\n <div className=\"flex justify-end\">\n <Button type=\"button\" onClick={onDismiss}>\n {dismissLabel ?? t('secret.saved')}\n </Button>\n </div>\n </div>\n <UnsavedChangesGuard\n when\n title={t('secret.leaveTitle')}\n description={t('secret.leaveDescription')}\n stayLabel={t('secret.stay')}\n leaveLabel={t('secret.leave')}\n />\n </Panel>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{n}from"./createLucideIcon-
|
|
2
|
-
//# sourceMappingURL=SharedGlyph-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{n}from"./createLucideIcon-BOsNKleB.js";import{u as r}from"./constants-DY3YJAKH.js";import{t as i}from"./cn-DVhJ55Mo.js";import{i as a,n as o,t as s}from"./tooltip-Bqf3oyqC.js";var c=e(t(),1),l=({decorative:e=!1,className:t})=>{let{t:l}=n(),u=l(`contentTypes.sharedWithAllSites`);return(0,c.jsxs)(s,{children:[(0,c.jsx)(a,{asChild:!0,children:(0,c.jsx)(`span`,{...e?{"aria-hidden":!0}:{role:`img`,"aria-label":u},"data-shared":!0,className:i(`inline-flex shrink-0 items-center text-muted-foreground`,t),children:(0,c.jsx)(r,{"aria-hidden":`true`,className:`size-3.5`})})}),(0,c.jsx)(o,{children:u})]})};export{l as t};
|
|
2
|
+
//# sourceMappingURL=SharedGlyph-Chwb1EIS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedGlyph-
|
|
1
|
+
{"version":3,"file":"SharedGlyph-Chwb1EIS.js","names":["Globe2","__toESM","Earth","cn","TooltipTrigger","TooltipContent","Tooltip","import_jsx_runtime","require_jsx_runtime","SharedGlyph","useTranslation","label","t","decorative","className"],"sources":["../../src/components/SharedGlyph/index.tsx"],"sourcesContent":["import { Globe2 } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/helpers/cn';\n\ntype SharedGlyphProps = {\n /**\n * Inside a link or button that names its target: the glyph is hidden from assistive technology and the\n * control carries \"Shared with all sites\" as its description instead (so its name stays the label).\n */\n decorative?: boolean;\n className?: string;\n};\n\n/** A small globe beside a content type or component shared with all sites, explained on hover. */\nexport const SharedGlyph = ({ decorative = false, className }: SharedGlyphProps) => {\n const { t } = useTranslation();\n const label = t('contentTypes.sharedWithAllSites');\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n {...(decorative ? { 'aria-hidden': true } : { role: 'img', 'aria-label': label })}\n data-shared\n className={cn('inline-flex shrink-0 items-center text-muted-foreground', className)}\n >\n <Globe2 aria-hidden=\"true\" className=\"size-3.5\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>{label}</TooltipContent>\n </Tooltip>\n );\n};\n"],"mappings":"kSAeaS,GAAe,CAAE,aAAa,GAAO,eAAkC,CAClF,GAAM,CAAE,KAAMC,EAAe,EACvBC,EAAQC,EAAE,iCAAiC,EACjD,OACE,EAAAL,EAAA,KAAA,CAACD,EAAD,CAAA,SAAA,EACE,EAAAC,EAAA,IAAA,CAACH,EAAD,CAAgB,QAAA,GACd,UAAA,EAAAG,EAAA,IAAA,CAAC,OAAD,CACE,GAAKM,EAAa,CAAE,cAAe,EAAK,EAAI,CAAE,KAAM,MAAO,aAAcF,CAAM,EAC/E,cAAA,GACA,UAAWR,EAAG,0DAA2DW,CAAS,EAElF,UAAA,EAAAP,EAAA,IAAA,CAACP,EAAD,CAAQ,cAAY,OAAO,UAAU,UAAY,CAAA,CAC7C,CAAA,CACQ,CAAA,GAChB,EAAAO,EAAA,IAAA,CAACF,EAAD,CAAA,SAAiBM,CAAsB,CAAA,CAChC,CAAA,CAAA,CAEb"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{lt as n,ut as r}from"./src-CMor9izq.js";import{k as i,n as a}from"./badge-DGqA_yr_.js";import{n as o,t as s}from"./createLucideIcon-BOsNKleB.js";import{T as c,w as l}from"./es2015-Cv57ynE1.js";import{c as u}from"./constants-DY3YJAKH.js";import{t as d}from"./clock-BtvZR9KD.js";import{t as f}from"./cn-DVhJ55Mo.js";import{n as p}from"./labels-BtktCNGw.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},ee=(e,t)=>{let n=r(e),i=r(t),a=n===`jsonNumber`&&i===`numericString`||n===`numericString`&&i===`jsonNumber`,o=E.has(n)&&w.has(t.type),s=n===`jsonString`&&e.type!==`code`&&t.type===`richtext`,c=e.type===`richtext`&&w.has(t.type);return a||o||s||c||n===`jsonString`&&i===`jsonStringArray`},O=(e,t)=>r(e)!==r(t)&&!ee(e,t),te=e=>(e.kind===`field.type`||e.kind===`field.removed`)&&e.dropsValues===!0,ne=e=>e?.required?[e.defaultValue===void 0?`validateRequired`:`backfill`]:[],re=(e,t,n,i)=>{let a=C[e]!==C[t]||t===`code`&&e!==`code`,o={type:e,...n?{settings:n.settings}:{}},s={type:t,...i?{settings:i.settings}:{}},c=r(o);return c===r(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`]}):O(o,s)?b(`conversion`,{breaking:a,destructive:!0,dropsValues:!0,prerequisites:[`convert`,`validateValues`,...ne(i)]}):b(`conversion`,{breaking:a,destructive:e===`richtext`&&w.has(t),prerequisites:[`convert`,`validateValues`]})},k=(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}},A=(e,t,n)=>{if(n==null)return!1;if(t==null)return!0;let r=k(t,n);return e===`lower`?r<0:r>0},j=e=>Array.isArray(e)?e.map(e=>String(typeof e==`object`&&e?e.value:e)):[],M=(e,t)=>{let n=new Set(j(t));return j(e).some(e=>!n.has(e))},N=e=>e?b(`validation`,{prerequisites:[`validateValues`]}):b(`additive`),P=e=>{let{property:t,from:n,to:r}=e;switch(t){case`minLength`:case`min`:return N(A(`lower`,n,r));case`maxLength`:case`max`:case`precision`:case`scale`:return N(A(`upper`,n,r));case`pattern`:return N(r!==void 0);case`values`:return N(M(n,r));case`components`:case`allowedKinds`:case`protocols`:return N(r!==void 0&&(n===void 0||M(n,r)));case`sourceFieldId`:case`language`:return b(`metadata`);case`validate`:return N(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`]})}},F=(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=re(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 P(e);default:return b(`metadata`)}},I=(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.extends`:n=b(`contract`,{breaking:!0});break;case`model.draftAndPublish`:n=e.to===!0?b(`additive`):b(`conversion`,{destructive:!0,prerequisites:[`convert`]});break;default:n=F(e,t)}return{...e,...n}},L=(e,t)=>e.map(e=>I(e,t)),R=[`convert`,`backfill`,`validateRequired`,`validateValues`,`checkUnique`,`buildIndex`],z=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:R.filter(e=>t.has(e)),cleanup:[...new Set(e.flatMap(e=>e.cleanup))],metadataOnly:e.every(e=>e.category===`metadata`||e.category===`editorSwap`)}},B=e(t(),1),V={"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`,"model.extends":`models.changes.modelExtends`,"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`},H=new Set([`model.localized`,`model.draftAndPublish`,`field.required`,`field.localized`,`field.public`,`field.deprecated`,`field.unique`,`field.filterable`,`field.sortable`]),U=new Set([`field.type`,`field.added`]),W=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`?String(e):``,G=e=>typeof e==`string`?c.t(`models.dataTypes.${e}.name`):``,K=(e,t,n)=>(n?.fields.find(t=>t.id===e)??t?.fields.find(t=>t.id===e))?.label??e??``,q=(e,t)=>typeof e==`string`?t.definitionName?.(e):void 0,J=(e,t)=>{let n=q(e.from,t),r=q(e.to,t),i=typeof e.from==`string`,a=typeof e.to==`string`;if(i&&n===void 0||a&&r===void 0)return c.t(`models.changes.modelExtends`);let o=i?a?`moved`:`removed`:`added`;return c.t(`models.changes.modelExtends`,{context:o,from:n,to:r})},Y=(e,t,n,r={})=>{if(e.kind===`model.extends`)return J(e,r);let i=K(e.fieldId,t,n),a=e.kind===`field.added`&&typeof e.to==`object`&&e.to!==null?e.to.type:void 0,o=U.has(e.kind)?{from:G(e.from),to:G(e.to),type:G(a)}:{from:W(e.from),to:W(e.to)},s=e.dropsValues?`models.changes.fieldTypeDropped`:V[e.kind];return c.t(s,{field:i,name:n?.label??t?.label??``,property:e.property?p(e.property):``,...o,...H.has(e.kind)?{context:e.to===!0?`on`:`off`}:{}})},X=e=>Object.hasOwn(l.models.steps,e),Z=e=>{if(e.kind!==`convert`||typeof e.change!=`object`||e.change===null)return;let t=e.change,{fieldId:r,from:i,to:a}=t;if(te(t)&&n(i)&&n(a))return{fieldId:typeof r==`string`?r:void 0,from:i,to:a}},ie=(e,t)=>{let n=new Set(e.flatMap(e=>{let t=Z(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`),ae=(e,t,n,r)=>{let i=e.modelId??e.ownerId,a=n?.id??t?.id;return i===void 0||i===a?void 0:r.definitionName?.(i)},oe=(e,t,n,r,i={})=>{let a=Z(e),o=a?c.t(`models.plan.stepDropped`,{field:K(a.fieldId,t,n),from:Q(a.from),to:Q(a.to),count:r?.droppedEntries??r?.affectedHeads??0}):X(e.kind)?c.t(`models.steps.${e.kind}`,{field:K(e.fieldId,t,n)}):e.kind,s=ae(e,t,n,i);return s===void 0?o:c.t(`models.inheritance.stepOnKind`,{kind:s,sentence:o})},se=(e,t)=>{if(!t||Z(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)}`},$=e=>e.some(e=>(e.invalidHeads??0)>0),ce=[`breaking`,`prerequisites`,`live`,`metadata`],le=new Set([`metadata`,`editorSwap`]),ue=e=>e.breaking||e.destructive?`breaking`:e.prerequisites.length>0?`prerequisites`:le.has(e.category)?`metadata`:`live`,de=e=>e.breaking||e.destructive?`breaking`:e.prerequisites.length>0?`prerequisites`:e.metadataOnly?`metadata`:`live`,fe=e=>ce.map(t=>({bucket:t,changes:e.filter(e=>ue(e)===t)})).filter(e=>e.changes.length>0),pe={breaking:`warning`,prerequisites:`scheduled`,live:`success`,metadata:`neutral`},me=({bucket:e,className:t})=>{let{t:n}=o();return(0,B.jsx)(a,{tone:pe[e],label:n(u[e]),className:t})},he={waiting:`text-muted-foreground`,failing:`border-warning/40 bg-warning-muted text-warning`,later:`text-muted-foreground`},ge={waiting:d,failing:i,later:h},_e=({steps:e,impacts:t,before:n,after:r,phase:i,definitionName:a})=>{let o=ie(e,t);return(0,B.jsx)(`ol`,{className:`space-y-0`,children:o.map(({step:e,impact:t},s)=>{let c=i===`after`?`later`:t?.invalidHeads?`failing`:`waiting`,l=ge[c],u=se(e,t);return(0,B.jsxs)(`li`,{className:`flex gap-3`,children:[(0,B.jsxs)(`span`,{className:`flex flex-col items-center`,children:[(0,B.jsx)(`span`,{className:f(`flex size-6 shrink-0 items-center justify-center rounded-full border bg-card`,he[c]),children:(0,B.jsx)(l,{"aria-hidden":`true`,className:`size-3.5`})}),s<o.length-1?(0,B.jsx)(`span`,{"aria-hidden":`true`,className:`my-1 w-px flex-1 bg-border`}):null]}),(0,B.jsxs)(`div`,{className:`min-w-0 pt-0.5 pb-4 text-sm`,children:[oe(e,n,r,t,{definitionName:a}),u?(0,B.jsx)(`span`,{className:`block text-meta text-muted-foreground`,children:u}):null]})]},`${e.kind}-${s}`)})})};export{$ as a,L as c,fe as i,z as l,me as n,Y as o,de as r,I as s,_e as t,_ as u};
|
|
2
|
+
//# sourceMappingURL=StepList-D9iHsUZJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepList-D9iHsUZJ.js","names":["__iconData","i18next","en","i18next","AlertTriangle","__toESM","isDataType","storageFamilyOf","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","nameOf","id","describeExtends","hasFrom","hasTo","move","describeChange","addedType","values","key","isKnownStep","droppedTypeChange","step","stepsToShow","dropped","steps","impacts","index","typeName","otherKindOf","modelId","subject","describeStep","sentence","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/**\n * Whether a (classified) change drops every stored value of its field; false for plans without the flag. A\n * type change Shapio cannot convert, or an inherited field a model loses when it moves to another parent\n * (`field.removed` marked by the planner, plan polymorphic-types decision 6).\n */\nexport const changeDropsValues = (change: PlannedChange): boolean =>\n (change.kind === 'field.type' || change.kind === 'field.removed') && 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 relabeling 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.extends':\n // A marker: the content work comes from diffing the resolved definitions of the family.\n classification = result('contract', { breaking: true });\n break;\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 'model.extends': 'models.changes.modelExtends',\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/** What a sentence may look up besides the two definitions. */\nexport type DescribeContext = {\n /** A model's name by stable ID (e.g. from the definitions cache); IDs are never shown in its place. */\n definitionName?: (id: string) => string | undefined;\n};\n\nconst nameOf = (id: unknown, context: DescribeContext): string | undefined =>\n typeof id === 'string' ? context.definitionName?.(id) : undefined;\n\n/**\n * \"Make this a kind of Products\", \"Move this from Products to Media\", \"Stop being a kind of Products\", by\n * the parents' names; without them, a sentence that names neither (a stable ID means nothing to a person).\n */\nconst describeExtends = (change: ClassifiedChange, context: DescribeContext): string => {\n const from = nameOf(change.from, context);\n const to = nameOf(change.to, context);\n const hasFrom = typeof change.from === 'string';\n const hasTo = typeof change.to === 'string';\n if ((hasFrom && from === undefined) || (hasTo && to === undefined)) {\n return i18next.t('models.changes.modelExtends');\n }\n const move = hasFrom ? (hasTo ? 'moved' : 'removed') : 'added';\n return i18next.t('models.changes.modelExtends', { context: move, from, to });\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 context: DescribeContext = {},\n): string => {\n if (change.kind === 'model.extends') {\n return describeExtends(change, context);\n }\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, type DescribeContext } 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 * The other kind of the family a step runs on, by name: a parent's change runs on each kind's entries and\n * indexes (`modelId`, or the content step's `ownerId`). Nothing for the definition being described, or\n * without a name for it.\n */\nconst otherKindOf = (\n step: PlanStep,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n context: DescribeContext,\n): string | undefined => {\n const modelId = step.modelId ?? step.ownerId;\n const subject = after?.id ?? before?.id;\n return modelId === undefined || modelId === subject ? undefined : context.definitionName?.(modelId);\n};\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). A step on another kind of the family starts with its\n * name (\"Digital: Build the filter and sort index for Price\").\n */\nexport const describeStep = (\n step: PlanStep,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n impact?: PlanStepImpact,\n context: DescribeContext = {},\n): string => {\n const dropped = droppedTypeChange(step);\n const sentence = dropped\n ? 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 : isKnownStep(step.kind)\n ? i18next.t(`models.steps.${step.kind}`, { field: fieldLabelOf(step.fieldId, before, after) })\n : step.kind;\n const kind = otherKindOf(step, before, after, context);\n return kind === undefined ? sentence : i18next.t('models.inheritance.stepOnKind', { kind, sentence });\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 /** A model's name by ID: a step on another kind of the family names it. */\n definitionName?: (id: string) => string | undefined;\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, definitionName }: 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, { definitionName })}\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Structure-
|
|
1
|
+
{"version":3,"file":"Structure-CewJL1b3.js","names":["__toESM","Builder","import_jsx_runtime","require_jsx_runtime","Structure","model"],"sources":["../../src/features/Content/Place/Structure/index.tsx"],"sourcesContent":["import type { ModelDefinition } from '@shapio/schema';\nimport { Builder } from '@/features/Models/Builder';\n\ntype StructureProps = { model: ModelDefinition };\n\n/** The place's structure: the model builder (fields, settings, display), applied live. */\nexport const Structure = ({ model }: StructureProps) => <Builder category=\"model\" id={model.id} />;\n"],"mappings":"qJAMaI,GAAa,CAAE,YAA4B,EAAAF,EAAA,IAAA,CAACD,EAAD,CAAS,SAAS,QAAQ,GAAII,EAAM,EAAK,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{C as r}from"./auth-
|
|
2
|
-
//# sourceMappingURL=SubNavLink-
|
|
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{C as r}from"./auth-BFSvtV59.js";import{t as i}from"./cn-DVhJ55Mo.js";var a=e(t(),1),o=e(n(),1),s=({label:e,className:t,children:n})=>(0,o.jsx)(`nav`,{"aria-label":e,className:i(`min-w-0 lg:w-56 lg:shrink-0 lg:self-start lg:rounded-xl lg:border lg:bg-card lg:p-2`,t),children:(0,o.jsx)(`div`,{className:`flex gap-4 overflow-x-auto pb-2 lg:flex-col lg:gap-3 lg:overflow-visible lg:pb-0`,children:n})}),c=({label:e,children:t})=>(0,o.jsxs)(`div`,{className:`flex shrink-0 flex-col gap-1`,children:[e?(0,o.jsx)(`h2`,{className:`px-3 pt-1 text-xs font-semibold tracking-wide text-muted-foreground uppercase`,children:e}):null,(0,o.jsx)(`ul`,{className:`flex gap-1 lg:flex-col`,children:a.Children.map(t,e=>e?(0,o.jsx)(`li`,{className:`shrink-0`,children:e}):null)})]}),l=(0,a.forwardRef)(({className:e,...t},n)=>(0,o.jsx)(`a`,{ref:n,className:i(`flex h-9 items-center gap-2.5 rounded-lg px-3 text-sm font-medium whitespace-nowrap text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-[current=page]:bg-accent aria-[current=page]:font-semibold aria-[current=page]:text-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0`,e),...t}));l.displayName=`SubNavAnchor`;var u=r(l),d=e=>(0,o.jsx)(u,{preload:`intent`,...e});export{s as n,c as r,d as t};
|
|
2
|
+
//# sourceMappingURL=SubNavLink-7Cs1LqMv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubNavLink-7Cs1LqMv.js","names":["Children","forwardRef","__toESM","require_jsx_runtime","createLink","cn","import_react","require_react","import_jsx_runtime","SubNav","label","className","SubNavGroup","children","child","SubNavAnchor","props","RouterAnchor","SubNavLink"],"sources":["../../src/components/SubNav/index.tsx","../../src/components/SubNavLink/index.tsx"],"sourcesContent":["import { Children, type ReactNode } from 'react';\nimport { cn } from '@/helpers/cn';\n\ntype SubNavProps = {\n /** The navigation's accessible name, e.g. \"Settings sections\". */\n label: string;\n className?: string;\n /** `SubNavGroup`s. */\n children: ReactNode;\n};\n\n/**\n * A feature's section navigation: a 224px card column on wide screens, a horizontal scroller on narrow\n * ones. Holds `SubNavGroup`s of `SubNavLink`s.\n */\nexport const SubNav = ({ label, className, children }: SubNavProps) => (\n <nav\n aria-label={label}\n className={cn(\n 'min-w-0 lg:w-56 lg:shrink-0 lg:self-start lg:rounded-xl lg:border lg:bg-card lg:p-2',\n className,\n )}\n >\n <div className=\"flex gap-4 overflow-x-auto pb-2 lg:flex-col lg:gap-3 lg:overflow-visible lg:pb-0\">\n {children}\n </div>\n </nav>\n);\n\ntype SubNavGroupProps = {\n /** 12px uppercase group label; omit for a single unlabeled group. */\n label?: string;\n /** `SubNavLink`s (each is wrapped in a list item). */\n children: ReactNode;\n};\n\nexport const SubNavGroup = ({ label, children }: SubNavGroupProps) => (\n <div className=\"flex shrink-0 flex-col gap-1\">\n {label ? (\n <h2 className=\"px-3 pt-1 text-xs font-semibold tracking-wide text-muted-foreground uppercase\">\n {label}\n </h2>\n ) : null}\n <ul className=\"flex gap-1 lg:flex-col\">\n {Children.map(children, (child) => (child ? <li className=\"shrink-0\">{child}</li> : null))}\n </ul>\n </div>\n);\n","import { createLink, type LinkComponent } from '@tanstack/react-router';\nimport { forwardRef, type AnchorHTMLAttributes } from 'react';\nimport { cn } from '@/helpers/cn';\n\ntype AnchorProps = AnchorHTMLAttributes<HTMLAnchorElement>;\n\nconst SubNavAnchor = forwardRef<HTMLAnchorElement, AnchorProps>(({ className, ...props }, ref) => (\n <a\n ref={ref}\n className={cn(\n 'flex h-9 items-center gap-2.5 rounded-lg px-3 text-sm font-medium whitespace-nowrap text-muted-foreground outline-none hover:bg-muted hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-[current=page]:bg-accent aria-[current=page]:font-semibold aria-[current=page]:text-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n));\nSubNavAnchor.displayName = 'SubNavAnchor';\n\nconst RouterAnchor = createLink(SubNavAnchor);\n\n/** A section link in a `SubNav` (36px row); highlighted while its route is active. */\nexport const SubNavLink: LinkComponent<typeof SubNavAnchor> = (props) => (\n <RouterAnchor preload=\"intent\" {...props} />\n);\n"],"mappings":"0OAeaS,GAAU,CAAE,QAAO,YAAW,eACzC,EAAAD,EAAA,IAAA,CAAC,MAAD,CACE,aAAYE,EACZ,UAAWL,EACT,sFACAM,CACF,EAEA,UAAA,EAAAH,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,mFACZ,UACE,CAAA,CACF,CAAA,EAUMI,GAAe,CAAE,QAAO,eACnC,EAAAJ,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,+BAAf,SAAA,CACGE,GACC,EAAAF,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,gFACX,SAAAE,CACC,CAAA,EACF,MACJ,EAAAF,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,yBACX,SAAAR,EAAAA,SAAS,IAAIa,EAAW,GAAWC,GAAQ,EAAAN,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,WAAY,SAAAM,CAAU,CAAA,EAAI,IAAK,CACvF,CAAA,CACD,ICxCDC,GAAA,EAAed,EAAAA,WAAAA,EAA4C,CAAE,YAAW,GAAGe,GAAS,KACxF,EAAAR,EAAA,IAAA,CAAC,IAAD,CACO,MACL,UAAWH,EACT,6VACAM,CACF,EACA,GAAIK,CACL,CAAA,CACF,EACD,EAAa,YAAc,eAE3B,IAAMC,EAAeb,EAAWW,CAAY,EAG/BG,EAAkD,IAC7D,EAAAV,EAAA,IAAA,CAACS,EAAD,CAAc,QAAQ,SAAS,GAAID,CAAQ,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{n}from"./createLucideIcon-
|
|
2
|
-
//# sourceMappingURL=SuggestAltButton-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{n}from"./createLucideIcon-BOsNKleB.js";import{t as r}from"./cn-DVhJ55Mo.js";import{i,r as a,t as o,u as s}from"./AssistError-rslPtgWB.js";var c=e(t(),1),l=({assetId:e,mimeType:t,locale:l,onSuggest:u,disabled:d=!1,className:f})=>{let{t:p}=n(),m=i(),h=s();return!m||!e||!t?.startsWith(`image/`)?null:(0,c.jsxs)(`div`,{className:r(`flex flex-col items-start gap-1`,f),children:[(0,c.jsx)(a,{pending:h.isPending,pendingLabel:p(`assist.altText.pending`),disabled:d,onClick:()=>h.mutate({assetId:e,...l?{locale:l}:{}},{onSuccess:e=>u(e.alt)}),children:p(`assist.altText.suggest`)}),(0,c.jsx)(o,{error:h.error})]})};export{l as t};
|
|
2
|
+
//# sourceMappingURL=SuggestAltButton-BK1uo4yC.js.map
|
package/dist/admin/assets/{SuggestAltButton-CvIoirnz.js.map → SuggestAltButton-BK1uo4yC.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SuggestAltButton-
|
|
1
|
+
{"version":3,"file":"SuggestAltButton-BK1uo4yC.js","names":["__toESM","cn","AssistButton","AssistError","useSuggestAltText","import_jsx_runtime","require_jsx_runtime","SuggestAltButton","useTranslation","enabled","useAssistEnabled","suggest","assetId","mimeType","className","t","locale","onSuggest","result"],"sources":["../../src/components/SuggestAltButton/index.tsx"],"sourcesContent":["import { useTranslation } from 'react-i18next';\nimport { useAssistEnabled, useSuggestAltText } from '@/api/assist';\nimport { AssistButton } from '@/components/AssistButton';\nimport { AssistError } from '@/components/AssistError';\nimport { cn } from '@/helpers/cn';\n\ntype SuggestAltButtonProps = {\n assetId: string | undefined;\n /** The asset's MIME type: only images get a suggestion. */\n mimeType: string | undefined;\n /** The language to write in (the entry's locale); the default locale when omitted. */\n locale?: string | null;\n /** Receives the proposal: the caller puts it in its alt input, and the person saves. */\n onSuggest: (alt: string) => void;\n disabled?: boolean;\n className?: string;\n};\n\n/** \"Suggest alt text\" beside an alt input (rich-text image, media field, cover, library). Hidden when assist is off. */\nexport const SuggestAltButton = ({\n assetId,\n mimeType,\n locale,\n onSuggest,\n disabled = false,\n className,\n}: SuggestAltButtonProps) => {\n const { t } = useTranslation();\n const enabled = useAssistEnabled();\n const suggest = useSuggestAltText();\n if (!enabled || !assetId || !mimeType?.startsWith('image/')) {\n return null;\n }\n return (\n <div className={cn('flex flex-col items-start gap-1', className)}>\n <AssistButton\n pending={suggest.isPending}\n pendingLabel={t('assist.altText.pending')}\n disabled={disabled}\n onClick={() =>\n suggest.mutate(\n { assetId, ...(locale ? { locale } : {}) },\n { onSuccess: (result) => onSuggest(result.alt) },\n )\n }\n >\n {t('assist.altText.suggest')}\n </AssistButton>\n <AssistError error={suggest.error} />\n </div>\n );\n};\n"],"mappings":"4PAmBaO,GAAoB,CAC/B,UACA,WACA,SACA,YACA,WAAW,GACX,eAC2B,CAC3B,GAAM,CAAE,KAAMC,EAAe,EACvBC,EAAUC,EAAiB,EAC3BC,EAAUP,EAAkB,EAIlC,MAHI,CAACK,GAAW,CAACG,GAAW,CAACC,GAAU,WAAW,QAAQ,EACjD,MAGP,EAAAR,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWJ,EAAG,kCAAmCa,CAAS,EAA/D,SAAA,EACE,EAAAT,EAAA,IAAA,CAACH,EAAD,CACE,QAASS,EAAQ,UACjB,aAAcI,EAAE,wBAAwB,EAC9B,WACV,YACEJ,EAAQ,OACN,CAAE,UAAS,GAAIK,EAAS,CAAE,QAAO,EAAI,CAAC,CAAG,EACzC,CAAE,UAAY,GAAWC,EAAUC,EAAO,GAAG,CAAE,CACjD,EAGD,SAAAH,EAAE,wBAAwB,CACf,CAAA,GACd,EAAAV,EAAA,IAAA,CAACF,EAAD,CAAa,MAAOQ,EAAQ,KAAQ,CAAA,CACjC,GAET"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{C as r}from"./auth-
|
|
2
|
-
//# sourceMappingURL=TextLink-
|
|
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{C as r}from"./auth-BFSvtV59.js";import{t as i}from"./cn-DVhJ55Mo.js";var a=e(t(),1),o=e(n(),1),s=(0,a.forwardRef)(({className:e,...t},n)=>(0,o.jsx)(`a`,{ref:n,className:i(`rounded-sm font-medium text-link underline-offset-4 outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50`,e),...t}));s.displayName=`StyledAnchor`;var c=r(s),l=e=>(0,o.jsx)(c,{preload:`intent`,...e});export{l as t};
|
|
2
|
+
//# sourceMappingURL=TextLink-Dfs5wsc5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextLink-
|
|
1
|
+
{"version":3,"file":"TextLink-Dfs5wsc5.js","names":["forwardRef","__toESM","require_jsx_runtime","createLink","cn","import_react","require_react","import_jsx_runtime","StyledAnchor","props","className","RouterAnchor","TextLink"],"sources":["../../src/components/TextLink/index.tsx"],"sourcesContent":["import { createLink, type LinkComponent } from '@tanstack/react-router';\nimport { forwardRef, type AnchorHTMLAttributes } from 'react';\nimport { cn } from '@/helpers/cn';\n\ntype AnchorProps = AnchorHTMLAttributes<HTMLAnchorElement>;\n\nconst StyledAnchor = forwardRef<HTMLAnchorElement, AnchorProps>(({ className, ...props }, ref) => (\n <a\n ref={ref}\n className={cn(\n 'rounded-sm font-medium text-link underline-offset-4 outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50',\n className,\n )}\n {...props}\n />\n));\nStyledAnchor.displayName = 'StyledAnchor';\n\nconst RouterAnchor = createLink(StyledAnchor);\n\n/** An in-app link styled as text (router-aware: typed `to`, preloading, active state). */\nexport const TextLink: LinkComponent<typeof StyledAnchor> = (props) => (\n <RouterAnchor preload=\"intent\" {...props} />\n);\n"],"mappings":"0OAMMQ,GAAA,EAAeR,EAAAA,WAAAA,EAA4C,CAAE,YAAW,GAAGS,GAAS,KACxF,EAAAF,EAAA,IAAA,CAAC,IAAD,CACO,MACL,UAAWH,EACT,uIACAM,CACF,EACA,GAAID,CACL,CAAA,CACF,EACD,EAAa,YAAc,eAE3B,IAAME,EAAeR,EAAWK,CAAY,EAG/BI,EAAgD,IAC3D,EAAAL,EAAA,IAAA,CAACI,EAAD,CAAc,QAAQ,SAAS,GAAIF,CAAQ,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{u as n}from"./auth-
|
|
2
|
-
//# sourceMappingURL=Thumbnail-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{u as n}from"./auth-BFSvtV59.js";import{n as r}from"./badge-DGqA_yr_.js";import{n as i,t as a}from"./createLucideIcon-BOsNKleB.js";import{T as o}from"./es2015-Cv57ynE1.js";import{n as s}from"./search-wj7zbkx1.js";import{t as c}from"./cn-DVhJ55Mo.js";import{a as l,o as u}from"./constants-DCtq_UOe.js";var d={name:`file-headphone`,size:24,node:[[`path`,{d:`M4 6.835V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-.343`,key:`1vfytu`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M2 19a2 2 0 0 1 4 0v1a2 2 0 0 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 0 1-4 0v-1a2 2 0 0 1 4 0`,key:`1etmh7`}]],aliases:[`file-audio`,`file-audio-2`]};d.node;var f=a(d),p={name:`file-image`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`circle`,{cx:`10`,cy:`12`,r:`2`,key:`737tya`}],[`path`,{d:`m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22`,key:`wt3hpn`}]]};p.node;var m=a(p),h={name:`file-play`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z`,key:`1tzo1f`}]],aliases:[`file-video`]};h.node;var g=a(h),_={name:`file`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}]]};_.node;var v=a(_),y={name:`pencil`,size:24,node:[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]};y.node;var b=a(y),x=()=>{let e=n().data,t=e?.globalPermissions??[];return{canWrite:t.includes(`media.write`),canManage:t.includes(`media.manage`),isOwner:e?.roles.some(e=>e.key===`owner`)??!1}},S=[`byte`,`kilobyte`,`megabyte`,`gigabyte`],C=e=>{let t=e,n=0;for(;t>=1e3&&n<S.length-1;)t/=1e3,n+=1;return new Intl.NumberFormat(o.language,{style:`unit`,unit:S[n],unitDisplay:n===0?`long`:`short`,maximumFractionDigits:n===0?0:1}).format(t)},w={pending:{labelKey:`media.status.pending`,tone:`progress`},processing:{labelKey:`media.status.processing`,tone:`progress`},ready:{labelKey:`media.status.ready`,tone:`success`},failed:{labelKey:`media.status.failed`,tone:`danger`}},T=e(t(),1),E=({asset:e})=>{let{t}=i();return e.variants.length===0?(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.status===`processing`?t(`media.variants.processing`):t(`media.variants.none`)}):(0,T.jsx)(`ul`,{className:`divide-y rounded-lg border`,children:e.variants.map(e=>{let n=u(e.name)?t(l[e.name]):e.name,i=w[e.status];return(0,T.jsxs)(`li`,{className:`flex min-w-0 items-center gap-3 px-3 py-2`,children:[(0,T.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[e.url?(0,T.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,className:`rounded-sm text-sm font-medium text-link underline-offset-4 outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50`,children:n}):(0,T.jsx)(`span`,{className:`text-sm font-medium`,children:n}),(0,T.jsxs)(`span`,{className:`block truncate text-meta text-muted-foreground`,children:[e.width&&e.height?t(`media.dimensions`,{width:e.width,height:e.height}):null,e.sizeBytes?` · ${C(e.sizeBytes)}`:null]})]}),(0,T.jsx)(r,{tone:i.tone,label:t(i.labelKey),size:`sm`})]},e.name)})})},D=({mimeType:e,className:t})=>e.startsWith(`image/`)?(0,T.jsx)(m,{"aria-hidden":`true`,className:t}):e.startsWith(`video/`)?(0,T.jsx)(g,{"aria-hidden":`true`,className:t}):e.startsWith(`audio/`)?(0,T.jsx)(f,{"aria-hidden":`true`,className:t}):e===`application/pdf`||e.startsWith(`text/`)?(0,T.jsx)(s,{"aria-hidden":`true`,className:t}):(0,T.jsx)(v,{"aria-hidden":`true`,className:t}),O=e=>e.startsWith(`image/`),k=5,A=(e,t)=>{let n=/\.([a-z0-9]+)$/i.exec(e)?.[1];return n&&n.length<=k?n.toUpperCase():(t.split(`/`)[1]?.split(/[.+;-]/)[0]??``).toUpperCase()},j=e=>{let t=e.variants.find(e=>e.name===`thumbnail`&&e.url);return t?.url?t.url:O(e.mimeType)?e.url:void 0},M=({asset:e,className:t})=>{let n=j(e);return(0,T.jsx)(`div`,{className:c(`flex items-center justify-center overflow-hidden bg-muted`,t),children:n?(0,T.jsx)(`img`,{src:n,alt:``,loading:`lazy`,decoding:`async`,className:`size-full object-cover`}):(0,T.jsx)(D,{mimeType:e.mimeType,className:`size-8 text-muted-foreground`})})};export{E as a,x as c,D as i,b as l,A as n,w as o,O as r,C as s,M as t};
|
|
2
|
+
//# sourceMappingURL=Thumbnail-C2A_Ub77.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Thumbnail-DNj5TRBI.js","names":["__iconData","__iconData","__iconData","__iconData","i18next","FileVideo","FileAudio","__toESM","useMe","StatusChip","useTranslation","createLucideIcon","instance","FileText","cn","VARIANT_LABEL_KEYS","isKnownVariant","__iconData$4","FileHeadphone","__iconData$3","FileImage","__iconData$2","FilePlay","__iconData$1","File","__iconData","Pencil","useMediaPermissions","me","permissions","role","UNITS","formatBytes","value","bytes","unit","MEDIA_STATUS_DISPLAY","import_jsx_runtime","require_jsx_runtime","Variants","asset","label","variant","status","FileIcon","mimeType","isImage","MAX_KIND_LENGTH","fileKindLabel","extension","filename","thumbnailUrl","candidate","Thumbnail","url","className"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/file-headphone.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/file-image.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/file-play.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/file.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/pencil.mjs","../../src/hooks/useMediaPermissions.ts","../../src/features/Media/helpers/formatBytes.ts","../../src/features/Media/helpers/statusDisplay.ts","../../src/features/Media/Details/Variants/index.tsx","../../src/features/Media/FileIcon/index.tsx","../../src/features/Media/helpers/fileKind.ts","../../src/features/Media/Thumbnail/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: \"file-headphone\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M4 6.835V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-.343\",\n key: \"1vfytu\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M2 19a2 2 0 0 1 4 0v1a2 2 0 0 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 0 1-4 0v-1a2 2 0 0 1 4 0\",\n key: \"1etmh7\"\n }\n ]\n ],\n aliases: [\"file-audio\", \"file-audio-2\"]\n};\n__iconData.node;\nconst FileHeadphone = createLucideIcon(__iconData);\n\nexport { __iconData, FileHeadphone as default };\n//# sourceMappingURL=file-headphone.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: \"file-image\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"10\", cy: \"12\", r: \"2\", key: \"737tya\" }],\n [\"path\", { d: \"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22\", key: \"wt3hpn\" }]\n ]\n};\n__iconData.node;\nconst FileImage = createLucideIcon(__iconData);\n\nexport { __iconData, FileImage as default };\n//# sourceMappingURL=file-image.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: \"file-play\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z\",\n key: \"1tzo1f\"\n }\n ]\n ],\n aliases: [\"file-video\"]\n};\n__iconData.node;\nconst FilePlay = createLucideIcon(__iconData);\n\nexport { __iconData, FilePlay as default };\n//# sourceMappingURL=file-play.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: \"file\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n ]\n};\n__iconData.node;\nconst File = createLucideIcon(__iconData);\n\nexport { __iconData, File as default };\n//# sourceMappingURL=file.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: \"pencil\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n ]\n};\n__iconData.node;\nconst Pencil = createLucideIcon(__iconData);\n\nexport { __iconData, Pencil as default };\n//# sourceMappingURL=pencil.mjs.map\n","import { useMe } from '@/api/auth';\n\n/** What the signed-in admin may do in the media library (the server checks again). */\nexport const useMediaPermissions = () => {\n const me = useMe().data;\n const permissions = me?.globalPermissions ?? [];\n return {\n canWrite: permissions.includes('media.write'),\n canManage: permissions.includes('media.manage'),\n /** Only owners may delete media that content still uses. */\n isOwner: me?.roles.some((role) => role.key === 'owner') ?? false,\n };\n};\n","import { i18next } from '@/app/i18n';\n\nconst UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte'] as const;\n\n/**\n * `1536` → `1.5 kB`, in the admin's language. Under a kilobyte the unit is spelled out (`44 bytes`,\n * `1 byte`): the short form of `byte` is not plural in English (\"44 byte\").\n */\nexport const formatBytes = (bytes: number): string => {\n let value = bytes;\n let unit = 0;\n while (value >= 1000 && unit < UNITS.length - 1) {\n value /= 1000;\n unit += 1;\n }\n return new Intl.NumberFormat(i18next.language, {\n style: 'unit',\n unit: UNITS[unit],\n unitDisplay: unit === 0 ? 'long' : 'short',\n maximumFractionDigits: unit === 0 ? 0 : 1,\n }).format(value);\n};\n","import type { MediaAssetStatus, MediaVariantStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\ntype Display = { labelKey: string; tone: StatusTone };\n\n/** How an asset's or variant's processing state reads as a `StatusChip`. */\nexport const MEDIA_STATUS_DISPLAY = {\n pending: { labelKey: 'media.status.pending', tone: 'progress' },\n processing: { labelKey: 'media.status.processing', tone: 'progress' },\n ready: { labelKey: 'media.status.ready', tone: 'success' },\n failed: { labelKey: 'media.status.failed', tone: 'danger' },\n} as const satisfies Record<MediaAssetStatus | MediaVariantStatus, Display>;\n","import type { MediaAsset } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { isKnownVariant, VARIANT_LABEL_KEYS } from '../../constants';\nimport { formatBytes } from '../../helpers/formatBytes';\nimport { MEDIA_STATUS_DISPLAY } from '../../helpers/statusDisplay';\n\ntype VariantsProps = { asset: MediaAsset };\n\n/** Generated sizes and their status (made in the background after upload). */\nexport const Variants = ({ asset }: VariantsProps) => {\n const { t } = useTranslation();\n if (asset.variants.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n {asset.status === 'processing' ? t('media.variants.processing') : t('media.variants.none')}\n </p>\n );\n }\n return (\n <ul className=\"divide-y rounded-lg border\">\n {asset.variants.map((variant) => {\n const label = isKnownVariant(variant.name) ? t(VARIANT_LABEL_KEYS[variant.name]) : variant.name;\n const status = MEDIA_STATUS_DISPLAY[variant.status];\n return (\n <li key={variant.name} className=\"flex min-w-0 items-center gap-3 px-3 py-2\">\n <span className=\"min-w-0 flex-1\">\n {variant.url ? (\n <a\n href={variant.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"rounded-sm text-sm font-medium text-link underline-offset-4 outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50\"\n >\n {label}\n </a>\n ) : (\n <span className=\"text-sm font-medium\">{label}</span>\n )}\n <span className=\"block truncate text-meta text-muted-foreground\">\n {variant.width && variant.height\n ? t('media.dimensions', { width: variant.width, height: variant.height })\n : null}\n {variant.sizeBytes ? ` · ${formatBytes(variant.sizeBytes)}` : null}\n </span>\n </span>\n <StatusChip tone={status.tone} label={t(status.labelKey)} size=\"sm\" />\n </li>\n );\n })}\n </ul>\n );\n};\n","import { File, FileAudio, FileImage, FileText, FileVideo } from 'lucide-react';\n\ntype FileIconProps = { mimeType: string; className?: string };\n\n/** An icon for files without a preview. Decorative: the file's name or type is always shown beside it. */\nexport const FileIcon = ({ mimeType, className }: FileIconProps) => {\n if (mimeType.startsWith('image/')) {\n return <FileImage aria-hidden=\"true\" className={className} />;\n }\n if (mimeType.startsWith('video/')) {\n return <FileVideo aria-hidden=\"true\" className={className} />;\n }\n if (mimeType.startsWith('audio/')) {\n return <FileAudio aria-hidden=\"true\" className={className} />;\n }\n if (mimeType === 'application/pdf' || mimeType.startsWith('text/')) {\n return <FileText aria-hidden=\"true\" className={className} />;\n }\n return <File aria-hidden=\"true\" className={className} />;\n};\n","export const isImage = (mimeType: string) => mimeType.startsWith('image/');\n\nconst MAX_KIND_LENGTH = 5;\n\n/**\n * A short format code for a file (\"PNG\", \"PDF\"): the file name's extension, else the MIME subtype. A code,\n * not prose, so it is not translated.\n */\nexport const fileKindLabel = (filename: string, mimeType: string): string => {\n const extension = /\\.([a-z0-9]+)$/i.exec(filename)?.[1];\n if (extension && extension.length <= MAX_KIND_LENGTH) {\n return extension.toUpperCase();\n }\n const subtype = mimeType.split('/')[1]?.split(/[.+;-]/)[0] ?? '';\n return subtype.toUpperCase();\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { cn } from '@/helpers/cn';\nimport { FileIcon } from '../FileIcon';\nimport { isImage } from '../helpers/fileKind';\n\ntype ThumbnailProps = { asset: MediaAsset; className?: string };\n\n/** The library thumbnail: the `thumbnail` variant once ready, the original for small images and SVGs. */\nconst thumbnailUrl = (asset: MediaAsset): string | undefined => {\n const variant = asset.variants.find((candidate) => candidate.name === 'thumbnail' && candidate.url);\n if (variant?.url) {\n return variant.url;\n }\n return isImage(asset.mimeType) ? asset.url : undefined;\n};\n\n/** Decorative: the asset's name is always shown beside it, so the image has empty alt text. */\nexport const Thumbnail = ({ asset, className }: ThumbnailProps) => {\n const url = thumbnailUrl(asset);\n return (\n <div className={cn('flex items-center justify-center overflow-hidden bg-muted', className)}>\n {url ? (\n <img src={url} alt=\"\" loading=\"lazy\" decoding=\"async\" className=\"size-full object-cover\" />\n ) : (\n <FileIcon mimeType={asset.mimeType} className=\"size-8 text-muted-foreground\" />\n )}\n </div>\n );\n};\n"],"ignoreList":[0,1,2,3,4],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Thumbnail-C2A_Ub77.js","names":["__iconData","__iconData","__iconData","__iconData","i18next","FileVideo","FileAudio","__toESM","useMe","StatusChip","useTranslation","createLucideIcon","instance","FileText","cn","VARIANT_LABEL_KEYS","isKnownVariant","__iconData$4","FileHeadphone","__iconData$3","FileImage","__iconData$2","FilePlay","__iconData$1","File","__iconData","Pencil","useMediaPermissions","me","permissions","role","UNITS","formatBytes","value","bytes","unit","MEDIA_STATUS_DISPLAY","import_jsx_runtime","require_jsx_runtime","Variants","asset","label","variant","status","FileIcon","mimeType","isImage","MAX_KIND_LENGTH","fileKindLabel","extension","filename","thumbnailUrl","candidate","Thumbnail","url","className"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.49.0_@types+react@19.3.0_react@19.3.0/node_modules/lucide-react/dist/esm/icons/file-headphone.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/file-image.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/file-play.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/file.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/pencil.mjs","../../src/hooks/useMediaPermissions.ts","../../src/features/Media/helpers/formatBytes.ts","../../src/features/Media/helpers/statusDisplay.ts","../../src/features/Media/Details/Variants/index.tsx","../../src/features/Media/FileIcon/index.tsx","../../src/features/Media/helpers/fileKind.ts","../../src/features/Media/Thumbnail/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: \"file-headphone\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M4 6.835V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-.343\",\n key: \"1vfytu\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M2 19a2 2 0 0 1 4 0v1a2 2 0 0 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 0 1-4 0v-1a2 2 0 0 1 4 0\",\n key: \"1etmh7\"\n }\n ]\n ],\n aliases: [\"file-audio\", \"file-audio-2\"]\n};\n__iconData.node;\nconst FileHeadphone = createLucideIcon(__iconData);\n\nexport { __iconData, FileHeadphone as default };\n//# sourceMappingURL=file-headphone.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: \"file-image\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\"circle\", { cx: \"10\", cy: \"12\", r: \"2\", key: \"737tya\" }],\n [\"path\", { d: \"m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22\", key: \"wt3hpn\" }]\n ]\n};\n__iconData.node;\nconst FileImage = createLucideIcon(__iconData);\n\nexport { __iconData, FileImage as default };\n//# sourceMappingURL=file-image.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: \"file-play\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }],\n [\n \"path\",\n {\n d: \"M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z\",\n key: \"1tzo1f\"\n }\n ]\n ],\n aliases: [\"file-video\"]\n};\n__iconData.node;\nconst FilePlay = createLucideIcon(__iconData);\n\nexport { __iconData, FilePlay as default };\n//# sourceMappingURL=file-play.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: \"file\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\",\n key: \"1oefj6\"\n }\n ],\n [\"path\", { d: \"M14 2v5a1 1 0 0 0 1 1h5\", key: \"wfsgrz\" }]\n ]\n};\n__iconData.node;\nconst File = createLucideIcon(__iconData);\n\nexport { __iconData, File as default };\n//# sourceMappingURL=file.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: \"pencil\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n ]\n};\n__iconData.node;\nconst Pencil = createLucideIcon(__iconData);\n\nexport { __iconData, Pencil as default };\n//# sourceMappingURL=pencil.mjs.map\n","import { useMe } from '@/api/auth';\n\n/** What the signed-in admin may do in the media library (the server checks again). */\nexport const useMediaPermissions = () => {\n const me = useMe().data;\n const permissions = me?.globalPermissions ?? [];\n return {\n canWrite: permissions.includes('media.write'),\n canManage: permissions.includes('media.manage'),\n /** Only owners may delete media that content still uses. */\n isOwner: me?.roles.some((role) => role.key === 'owner') ?? false,\n };\n};\n","import { i18next } from '@/app/i18n';\n\nconst UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte'] as const;\n\n/**\n * `1536` → `1.5 kB`, in the admin's language. Under a kilobyte the unit is spelled out (`44 bytes`,\n * `1 byte`): the short form of `byte` is not plural in English (\"44 byte\").\n */\nexport const formatBytes = (bytes: number): string => {\n let value = bytes;\n let unit = 0;\n while (value >= 1000 && unit < UNITS.length - 1) {\n value /= 1000;\n unit += 1;\n }\n return new Intl.NumberFormat(i18next.language, {\n style: 'unit',\n unit: UNITS[unit],\n unitDisplay: unit === 0 ? 'long' : 'short',\n maximumFractionDigits: unit === 0 ? 0 : 1,\n }).format(value);\n};\n","import type { MediaAssetStatus, MediaVariantStatus } from '@shapio/client';\nimport type { StatusTone } from '@/components/StatusChip';\n\ntype Display = { labelKey: string; tone: StatusTone };\n\n/** How an asset's or variant's processing state reads as a `StatusChip`. */\nexport const MEDIA_STATUS_DISPLAY = {\n pending: { labelKey: 'media.status.pending', tone: 'progress' },\n processing: { labelKey: 'media.status.processing', tone: 'progress' },\n ready: { labelKey: 'media.status.ready', tone: 'success' },\n failed: { labelKey: 'media.status.failed', tone: 'danger' },\n} as const satisfies Record<MediaAssetStatus | MediaVariantStatus, Display>;\n","import type { MediaAsset } from '@shapio/client';\nimport { useTranslation } from 'react-i18next';\nimport { StatusChip } from '@/components/StatusChip';\nimport { isKnownVariant, VARIANT_LABEL_KEYS } from '../../constants';\nimport { formatBytes } from '../../helpers/formatBytes';\nimport { MEDIA_STATUS_DISPLAY } from '../../helpers/statusDisplay';\n\ntype VariantsProps = { asset: MediaAsset };\n\n/** Generated sizes and their status (made in the background after upload). */\nexport const Variants = ({ asset }: VariantsProps) => {\n const { t } = useTranslation();\n if (asset.variants.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n {asset.status === 'processing' ? t('media.variants.processing') : t('media.variants.none')}\n </p>\n );\n }\n return (\n <ul className=\"divide-y rounded-lg border\">\n {asset.variants.map((variant) => {\n const label = isKnownVariant(variant.name) ? t(VARIANT_LABEL_KEYS[variant.name]) : variant.name;\n const status = MEDIA_STATUS_DISPLAY[variant.status];\n return (\n <li key={variant.name} className=\"flex min-w-0 items-center gap-3 px-3 py-2\">\n <span className=\"min-w-0 flex-1\">\n {variant.url ? (\n <a\n href={variant.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"rounded-sm text-sm font-medium text-link underline-offset-4 outline-none hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50\"\n >\n {label}\n </a>\n ) : (\n <span className=\"text-sm font-medium\">{label}</span>\n )}\n <span className=\"block truncate text-meta text-muted-foreground\">\n {variant.width && variant.height\n ? t('media.dimensions', { width: variant.width, height: variant.height })\n : null}\n {variant.sizeBytes ? ` · ${formatBytes(variant.sizeBytes)}` : null}\n </span>\n </span>\n <StatusChip tone={status.tone} label={t(status.labelKey)} size=\"sm\" />\n </li>\n );\n })}\n </ul>\n );\n};\n","import { File, FileAudio, FileImage, FileText, FileVideo } from 'lucide-react';\n\ntype FileIconProps = { mimeType: string; className?: string };\n\n/** An icon for files without a preview. Decorative: the file's name or type is always shown beside it. */\nexport const FileIcon = ({ mimeType, className }: FileIconProps) => {\n if (mimeType.startsWith('image/')) {\n return <FileImage aria-hidden=\"true\" className={className} />;\n }\n if (mimeType.startsWith('video/')) {\n return <FileVideo aria-hidden=\"true\" className={className} />;\n }\n if (mimeType.startsWith('audio/')) {\n return <FileAudio aria-hidden=\"true\" className={className} />;\n }\n if (mimeType === 'application/pdf' || mimeType.startsWith('text/')) {\n return <FileText aria-hidden=\"true\" className={className} />;\n }\n return <File aria-hidden=\"true\" className={className} />;\n};\n","export const isImage = (mimeType: string) => mimeType.startsWith('image/');\n\nconst MAX_KIND_LENGTH = 5;\n\n/**\n * A short format code for a file (\"PNG\", \"PDF\"): the file name's extension, else the MIME subtype. A code,\n * not prose, so it is not translated.\n */\nexport const fileKindLabel = (filename: string, mimeType: string): string => {\n const extension = /\\.([a-z0-9]+)$/i.exec(filename)?.[1];\n if (extension && extension.length <= MAX_KIND_LENGTH) {\n return extension.toUpperCase();\n }\n const subtype = mimeType.split('/')[1]?.split(/[.+;-]/)[0] ?? '';\n return subtype.toUpperCase();\n};\n","import type { MediaAsset } from '@shapio/client';\nimport { cn } from '@/helpers/cn';\nimport { FileIcon } from '../FileIcon';\nimport { isImage } from '../helpers/fileKind';\n\ntype ThumbnailProps = { asset: MediaAsset; className?: string };\n\n/** The library thumbnail: the `thumbnail` variant once ready, the original for small images and SVGs. */\nconst thumbnailUrl = (asset: MediaAsset): string | undefined => {\n const variant = asset.variants.find((candidate) => candidate.name === 'thumbnail' && candidate.url);\n if (variant?.url) {\n return variant.url;\n }\n return isImage(asset.mimeType) ? asset.url : undefined;\n};\n\n/** Decorative: the asset's name is always shown beside it, so the image has empty alt text. */\nexport const Thumbnail = ({ asset, className }: ThumbnailProps) => {\n const url = thumbnailUrl(asset);\n return (\n <div className={cn('flex items-center justify-center overflow-hidden bg-muted', className)}>\n {url ? (\n <img src={url} alt=\"\" loading=\"lazy\" decoding=\"async\" className=\"size-full object-cover\" />\n ) : (\n <FileIcon mimeType={asset.mimeType} className=\"size-8 text-muted-foreground\" />\n )}\n </div>\n );\n};\n"],"ignoreList":[0,1,2,3,4],"mappings":"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"}
|