@shapio/cms 0.5.6 → 0.5.8
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-_qRYsivK.js → AssetTile-BrMzsUZD.js} +2 -2
- package/dist/admin/assets/{AssetTile-_qRYsivK.js.map → AssetTile-BrMzsUZD.js.map} +1 -1
- package/dist/admin/assets/AssistError-Cs-r9Ssc.js +2 -0
- package/dist/admin/assets/{AssistError-CMXQWiQo.js.map → AssistError-Cs-r9Ssc.js.map} +1 -1
- package/dist/admin/assets/{BlockMenuItems-WIrbyv1a.js → BlockMenuItems-DsccXMc_.js} +2 -2
- package/dist/admin/assets/{BlockMenuItems-WIrbyv1a.js.map → BlockMenuItems-DsccXMc_.js.map} +1 -1
- package/dist/admin/assets/Body-BzZD-TZT.js +2 -0
- package/dist/admin/assets/{Body-BYc1IVsQ.js.map → Body-BzZD-TZT.js.map} +1 -1
- package/dist/admin/assets/Builder-DW-GJA_q.js +2 -0
- package/dist/admin/assets/Builder-DW-GJA_q.js.map +1 -0
- package/dist/admin/assets/{CodeEditor-NMvrWgxT.js → CodeEditor-CBCR73Wd.js} +2 -2
- package/dist/admin/assets/{CodeEditor-NMvrWgxT.js.map → CodeEditor-CBCR73Wd.js.map} +1 -1
- package/dist/admin/assets/{CopyButton-B0RuxynJ.js → CopyButton-CxFsBHfF.js} +2 -2
- package/dist/admin/assets/{CopyButton-B0RuxynJ.js.map → CopyButton-CxFsBHfF.js.map} +1 -1
- package/dist/admin/assets/{CursorPager-CQZsKNxR.js → CursorPager-BW2U3v6l.js} +2 -2
- package/dist/admin/assets/{CursorPager-CQZsKNxR.js.map → CursorPager-BW2U3v6l.js.map} +1 -1
- package/dist/admin/assets/{ExternalLink-BNq7nAYL.js → ExternalLink-BITMgS1K.js} +2 -2
- package/dist/admin/assets/{ExternalLink-BNq7nAYL.js.map → ExternalLink-BITMgS1K.js.map} +1 -1
- package/dist/admin/assets/{FocalPoint-BYu2fOTb.js → FocalPoint-CpZTve1E.js} +2 -2
- package/dist/admin/assets/{FocalPoint-BYu2fOTb.js.map → FocalPoint-CpZTve1E.js.map} +1 -1
- package/dist/admin/assets/Form-lNrRHc0I.js +2 -0
- package/dist/admin/assets/Form-lNrRHc0I.js.map +1 -0
- package/dist/admin/assets/{FormCheckboxGroup-Bz8KERs1.js → FormCheckboxGroup-DeeaYnzB.js} +2 -2
- package/dist/admin/assets/FormCheckboxGroup-DeeaYnzB.js.map +1 -0
- package/dist/admin/assets/{FormRadioGroup-c-wyx7dq.js → FormRadioGroup-Cfx5pvzU.js} +2 -2
- package/dist/admin/assets/{FormRadioGroup-c-wyx7dq.js.map → FormRadioGroup-Cfx5pvzU.js.map} +1 -1
- package/dist/admin/assets/{FormSelectField-ijG9qPpb.js → FormSelectField-BzE9Lq9i.js} +2 -2
- package/dist/admin/assets/{FormSelectField-ijG9qPpb.js.map → FormSelectField-BzE9Lq9i.js.map} +1 -1
- package/dist/admin/assets/{FormSwitchField-Bp3hNpeP.js → FormSwitchField-BLOh7qei.js} +2 -2
- package/dist/admin/assets/{FormSwitchField-Bp3hNpeP.js.map → FormSwitchField-BLOh7qei.js.map} +1 -1
- package/dist/admin/assets/{FormTextareaField-BSKMqHcW.js → FormTextareaField-CO115n_u.js} +2 -2
- package/dist/admin/assets/{FormTextareaField-BSKMqHcW.js.map → FormTextareaField-CO115n_u.js.map} +1 -1
- package/dist/admin/assets/{HintedLabel-BrLH4NQW.js → HintedLabel-DzHnEdIK.js} +2 -2
- package/dist/admin/assets/{HintedLabel-BrLH4NQW.js.map → HintedLabel-DzHnEdIK.js.map} +1 -1
- package/dist/admin/assets/{InfoHint-Dyzyf59c.js → InfoHint-CSEtcHjL.js} +2 -2
- package/dist/admin/assets/{InfoHint-Dyzyf59c.js.map → InfoHint-CSEtcHjL.js.map} +1 -1
- package/dist/admin/assets/InlineConfirm-yW-iUKFC.js +2 -0
- package/dist/admin/assets/InlineConfirm-yW-iUKFC.js.map +1 -0
- package/dist/admin/assets/InsertMenuItem-CCr9e0qY.js +2 -0
- package/dist/admin/assets/InsertMenuItem-CCr9e0qY.js.map +1 -0
- package/dist/admin/assets/{LinkTabs-ByB2eCIr.js → LinkTabs-8SmS1vCd.js} +2 -2
- package/dist/admin/assets/{LinkTabs-ByB2eCIr.js.map → LinkTabs-8SmS1vCd.js.map} +1 -1
- package/dist/admin/assets/{Match-Bixf1ygj.js → Match-CcD9KxHH.js} +2 -2
- package/dist/admin/assets/{Match-Bixf1ygj.js.map → Match-CcD9KxHH.js.map} +1 -1
- package/dist/admin/assets/NoAccess-C8RLPN0I.js +2 -0
- package/dist/admin/assets/NoAccess-C8RLPN0I.js.map +1 -0
- package/dist/admin/assets/Panel-Bcl09TtM.js +2 -0
- package/dist/admin/assets/Panel-Bcl09TtM.js.map +1 -0
- package/dist/admin/assets/{QueryView--_vvV7dC.js → QueryView-xMP_uJ_t.js} +2 -2
- package/dist/admin/assets/{QueryView--_vvV7dC.js.map → QueryView-xMP_uJ_t.js.map} +1 -1
- package/dist/admin/assets/{RadioTile-BCp6auUz.js → RadioTile-DQFmni5A.js} +2 -2
- package/dist/admin/assets/{RadioTile-BCp6auUz.js.map → RadioTile-DQFmni5A.js.map} +1 -1
- package/dist/admin/assets/{RichTextField-fWNjndUc.js → RichTextField-CVHRIbnu.js} +5 -5
- package/dist/admin/assets/{RichTextField-fWNjndUc.js.map → RichTextField-CVHRIbnu.js.map} +1 -1
- package/dist/admin/assets/{RowTitle-B4CE8tt7.js → RowTitle-Bqt6evG9.js} +2 -2
- package/dist/admin/assets/{RowTitle-B4CE8tt7.js.map → RowTitle-Bqt6evG9.js.map} +1 -1
- package/dist/admin/assets/SecretReveal-Bm6nYg5J.js +2 -0
- package/dist/admin/assets/SecretReveal-Bm6nYg5J.js.map +1 -0
- package/dist/admin/assets/{SharedGlyph-71FTypoi.js → SharedGlyph-cUmTh0_C.js} +2 -2
- package/dist/admin/assets/{SharedGlyph-71FTypoi.js.map → SharedGlyph-cUmTh0_C.js.map} +1 -1
- package/dist/admin/assets/StepList-BXGYD9eJ.js +2 -0
- package/dist/admin/assets/StepList-BXGYD9eJ.js.map +1 -0
- package/dist/admin/assets/Structure-D8csgrIt.js +2 -0
- package/dist/admin/assets/{Structure-Dk87778W.js.map → Structure-D8csgrIt.js.map} +1 -1
- package/dist/admin/assets/{SubNavLink-CPJFIt1j.js → SubNavLink-CiCaVV8U.js} +2 -2
- package/dist/admin/assets/{SubNavLink-CPJFIt1j.js.map → SubNavLink-CiCaVV8U.js.map} +1 -1
- package/dist/admin/assets/{SuggestAltButton-CxS8IR6m.js → SuggestAltButton-CvIoirnz.js} +2 -2
- package/dist/admin/assets/{SuggestAltButton-CxS8IR6m.js.map → SuggestAltButton-CvIoirnz.js.map} +1 -1
- package/dist/admin/assets/{TextLink-DnrMaF2F.js → TextLink-HRn66VL1.js} +2 -2
- package/dist/admin/assets/{TextLink-DnrMaF2F.js.map → TextLink-HRn66VL1.js.map} +1 -1
- package/dist/admin/assets/Thumbnail-DNj5TRBI.js +2 -0
- package/dist/admin/assets/Thumbnail-DNj5TRBI.js.map +1 -0
- package/dist/admin/assets/UnsavedChangesGuard-CUiuMklN.js +2 -0
- package/dist/admin/assets/UnsavedChangesGuard-CUiuMklN.js.map +1 -0
- package/dist/admin/assets/{UserAvatar-D7IbSpsP.js → UserAvatar-p-jV-LoD.js} +2 -2
- package/dist/admin/assets/{UserAvatar-D7IbSpsP.js.map → UserAvatar-p-jV-LoD.js.map} +1 -1
- package/dist/admin/assets/auth-CQO4MBUj.js +2 -0
- package/dist/admin/assets/auth-CQO4MBUj.js.map +1 -0
- package/dist/admin/assets/badge-CqKF1pwz.js +2 -0
- package/dist/admin/assets/{badge-vLiQczOd.js.map → badge-CqKF1pwz.js.map} +1 -1
- package/dist/admin/assets/{boxes-D6Y4Cenx.js → boxes-CAygw8zF.js} +2 -2
- package/dist/admin/assets/{boxes-D6Y4Cenx.js.map → boxes-CAygw8zF.js.map} +1 -1
- package/dist/admin/assets/{calendar-clock-DFUgXWXg.js → calendar-clock-BZGtAvWR.js} +2 -2
- package/dist/admin/assets/{calendar-clock-DFUgXWXg.js.map → calendar-clock-BZGtAvWR.js.map} +1 -1
- package/dist/admin/assets/changeSets-8EburmT0.js +2 -0
- package/dist/admin/assets/changeSets-8EburmT0.js.map +1 -0
- package/dist/admin/assets/chevron-left-DGU3HGYG.js +2 -0
- package/dist/admin/assets/{chevron-left-CZXrLV99.js.map → chevron-left-DGU3HGYG.js.map} +1 -1
- package/dist/admin/assets/{circle-check-De27poaB.js → circle-check-C37MSJqX.js} +2 -2
- package/dist/admin/assets/{circle-check-De27poaB.js.map → circle-check-C37MSJqX.js.map} +1 -1
- package/dist/admin/assets/{clock-BGAXsuo4.js → clock-2arjsgZ4.js} +2 -2
- package/dist/admin/assets/{clock-BGAXsuo4.js.map → clock-2arjsgZ4.js.map} +1 -1
- package/dist/admin/assets/{constants-CKGh8uwT.js → constants-a_15vqOh.js} +2 -2
- package/dist/admin/assets/{constants-CKGh8uwT.js.map → constants-a_15vqOh.js.map} +1 -1
- package/dist/admin/assets/content-CAjkbZEY.js +3 -0
- package/dist/admin/assets/content-CAjkbZEY.js.map +1 -0
- package/dist/admin/assets/contentCounts-DP7YYeZZ.js +2 -0
- package/dist/admin/assets/{contentCounts-DknqJ4kh.js.map → contentCounts-DP7YYeZZ.js.map} +1 -1
- package/dist/admin/assets/{contentTypes-DzQ_0v36.js → contentTypes-84uc0bjR.js} +2 -2
- package/dist/admin/assets/{contentTypes-DzQ_0v36.js.map → contentTypes-84uc0bjR.js.map} +1 -1
- package/dist/admin/assets/context-IKYdzQJ-.js +2 -0
- package/dist/admin/assets/{context-fImO9k99.js.map → context-IKYdzQJ-.js.map} +1 -1
- package/dist/admin/assets/{copy-B5owk67M.js → copy-CsSRHgKZ.js} +2 -2
- package/dist/admin/assets/{copy-B5owk67M.js.map → copy-CsSRHgKZ.js.map} +1 -1
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js +2 -0
- package/dist/admin/assets/createLucideIcon-CLmh7Go-.js.map +1 -0
- package/dist/admin/assets/develop-BOqvnlgt.js +11 -0
- package/dist/admin/assets/develop-BOqvnlgt.js.map +1 -0
- package/dist/admin/assets/{dropdown-menu-CVAnm22s.js → dropdown-menu-_xfaEp5C.js} +2 -2
- package/dist/admin/assets/{dropdown-menu-CVAnm22s.js.map → dropdown-menu-_xfaEp5C.js.map} +1 -1
- package/dist/admin/assets/{ellipsis-BHtU4ov6.js → ellipsis-F91991on.js} +2 -2
- package/dist/admin/assets/{ellipsis-BHtU4ov6.js.map → ellipsis-F91991on.js.map} +1 -1
- package/dist/admin/assets/entryLink-CVB-TdIn.js +2 -0
- package/dist/admin/assets/entryLink-CVB-TdIn.js.map +1 -0
- package/dist/admin/assets/es2015-BHmI7wjK.js +42 -0
- package/dist/admin/assets/es2015-BHmI7wjK.js.map +1 -0
- package/dist/admin/assets/{external-link-nZp2VpKw.js → external-link-CdG6kHfA.js} +2 -2
- package/dist/admin/assets/{external-link-nZp2VpKw.js.map → external-link-CdG6kHfA.js.map} +1 -1
- package/dist/admin/assets/{field-Bg-JRgsB.js → field-COOzRptX.js} +2 -2
- package/dist/admin/assets/{field-Bg-JRgsB.js.map → field-COOzRptX.js.map} +1 -1
- package/dist/admin/assets/{file-stack-8rRouTJj.js → file-stack-28ZtO1xW.js} +2 -2
- package/dist/admin/assets/{file-stack-8rRouTJj.js.map → file-stack-28ZtO1xW.js.map} +1 -1
- package/dist/admin/assets/{fileRoute-DQCI1nMN.js → fileRoute-s7mCMYUJ.js} +2 -2
- package/dist/admin/assets/{fileRoute-DQCI1nMN.js.map → fileRoute-s7mCMYUJ.js.map} +1 -1
- package/dist/admin/assets/{folder-plus-B3L3b389.js → folder-plus-DIk0pWkP.js} +2 -2
- package/dist/admin/assets/{folder-plus-B3L3b389.js.map → folder-plus-DIk0pWkP.js.map} +1 -1
- package/dist/admin/assets/followPlural-Cm7v_Udv.js +2 -0
- package/dist/admin/assets/followPlural-Cm7v_Udv.js.map +1 -0
- package/dist/admin/assets/{globe-DKkjr9MZ.js → globe-DFr3Gd2w.js} +2 -2
- package/dist/admin/assets/{globe-DKkjr9MZ.js.map → globe-DFr3Gd2w.js.map} +1 -1
- package/dist/admin/assets/{image-B6aL7hP8.js → image-DT79QFa_.js} +2 -2
- package/dist/admin/assets/{image-B6aL7hP8.js.map → image-DT79QFa_.js.map} +1 -1
- package/dist/admin/assets/{image-off-TVxEyb74.js → image-off-DFs5upyX.js} +2 -2
- package/dist/admin/assets/{image-off-TVxEyb74.js.map → image-off-DFs5upyX.js.map} +1 -1
- package/dist/admin/assets/{inbox-BKqu1EfP.js → inbox-CySnQydm.js} +2 -2
- package/dist/admin/assets/{inbox-BKqu1EfP.js.map → inbox-CySnQydm.js.map} +1 -1
- package/dist/admin/assets/inbox-DGO2D8fa.js +2 -0
- package/dist/admin/assets/inbox-DGO2D8fa.js.map +1 -0
- package/dist/admin/assets/index-BIIU9ZI6.js +4 -0
- package/dist/admin/assets/index-BIIU9ZI6.js.map +1 -0
- package/dist/admin/assets/index-lxe7WimO.css +2 -0
- package/dist/admin/assets/{key-round-Dmdr1vP5.js → key-round-D36CePnN.js} +2 -2
- package/dist/admin/assets/{key-round-Dmdr1vP5.js.map → key-round-D36CePnN.js.map} +1 -1
- package/dist/admin/assets/{labels-BrwwGWnv.js → labels-DQckbLGW.js} +2 -2
- package/dist/admin/assets/{labels-BrwwGWnv.js.map → labels-DQckbLGW.js.map} +1 -1
- package/dist/admin/assets/{languages-BbfFIygP.js → languages-CzbTaQv9.js} +2 -2
- package/dist/admin/assets/{languages-BbfFIygP.js.map → languages-CzbTaQv9.js.map} +1 -1
- package/dist/admin/assets/{layers-B0jT4rc4.js → layers-BmcodiaH.js} +2 -2
- package/dist/admin/assets/{layers-B0jT4rc4.js.map → layers-BmcodiaH.js.map} +1 -1
- package/dist/admin/assets/{link-2-off-DC06jLDj.js → link-2-off-CoJNwrxm.js} +2 -2
- package/dist/admin/assets/{link-2-off-DC06jLDj.js.map → link-2-off-CoJNwrxm.js.map} +1 -1
- package/dist/admin/assets/{link-B3O0VUVT.js → link-Pyr2Y35S.js} +2 -2
- package/dist/admin/assets/{link-B3O0VUVT.js.map → link-Pyr2Y35S.js.map} +1 -1
- package/dist/admin/assets/locales-Bg3htKo8.js +2 -0
- package/dist/admin/assets/{locales-e7B5t6id.js.map → locales-Bg3htKo8.js.map} +1 -1
- package/dist/admin/assets/media-BCnVhaDH.js +2 -0
- package/dist/admin/assets/{media-VCJUbYzJ.js.map → media-BCnVhaDH.js.map} +1 -1
- package/dist/admin/assets/media-CURizGns.js +2 -0
- package/dist/admin/assets/media-CURizGns.js.map +1 -0
- package/dist/admin/assets/network-BixABr0o.js +2 -0
- package/dist/admin/assets/network-BixABr0o.js.map +1 -0
- package/dist/admin/assets/{plus-WfYKHW7G.js → plus-BoDtdLCo.js} +2 -2
- package/dist/admin/assets/{plus-WfYKHW7G.js.map → plus-BoDtdLCo.js.map} +1 -1
- package/dist/admin/assets/publishing-Dke9bSKp.js +2 -0
- package/dist/admin/assets/{publishing-CpSDO3M7.js.map → publishing-Dke9bSKp.js.map} +1 -1
- package/dist/admin/assets/{radio-group-DQ3sC1ol.js → radio-group-4ok5evXq.js} +2 -2
- package/dist/admin/assets/{radio-group-DQ3sC1ol.js.map → radio-group-4ok5evXq.js.map} +1 -1
- package/dist/admin/assets/{rotate-ccw-Cvc_uA58.js → rotate-ccw-DL6TzcZh.js} +2 -2
- package/dist/admin/assets/{rotate-ccw-Cvc_uA58.js.map → rotate-ccw-DL6TzcZh.js.map} +1 -1
- package/dist/admin/assets/schedules-BmB9Y73z.js +2 -0
- package/dist/admin/assets/{schedules-CBGpjEg7.js.map → schedules-BmB9Y73z.js.map} +1 -1
- package/dist/admin/assets/schema-D-qo7XSF.js +2 -0
- package/dist/admin/assets/schema-D-qo7XSF.js.map +1 -0
- package/dist/admin/assets/{scroll-text-gKYBbibb.js → scroll-text-PqeZm472.js} +2 -2
- package/dist/admin/assets/{scroll-text-gKYBbibb.js.map → scroll-text-PqeZm472.js.map} +1 -1
- package/dist/admin/assets/{search-CW3iBC4k.js → search-BdwIwOzC.js} +2 -2
- package/dist/admin/assets/{search-CW3iBC4k.js.map → search-BdwIwOzC.js.map} +1 -1
- package/dist/admin/assets/searchSchemas-CSScloG8.js +2 -0
- package/dist/admin/assets/{searchSchemas-D4S2ceA0.js.map → searchSchemas-CSScloG8.js.map} +1 -1
- package/dist/admin/assets/{sections-CN5fIoAr.js → sections-BTS683ur.js} +2 -2
- package/dist/admin/assets/{sections-CN5fIoAr.js.map → sections-BTS683ur.js.map} +1 -1
- package/dist/admin/assets/sections-DqBzSKMP.js +2 -0
- package/dist/admin/assets/{sections-Cl1LrzqH.js.map → sections-DqBzSKMP.js.map} +1 -1
- package/dist/admin/assets/{select-DjCAH45V.js → select-C0USI-Ox.js} +2 -2
- package/dist/admin/assets/{select-DjCAH45V.js.map → select-C0USI-Ox.js.map} +1 -1
- package/dist/admin/assets/{send-DRA-Pe46.js → send-XPWo3m4u.js} +2 -2
- package/dist/admin/assets/{send-DRA-Pe46.js.map → send-XPWo3m4u.js.map} +1 -1
- package/dist/admin/assets/seo-CceGYTIX.js +2 -0
- package/dist/admin/assets/{seo-DJ4k3LtY.js.map → seo-CceGYTIX.js.map} +1 -1
- package/dist/admin/assets/settings-B60vHpZd.js +2 -0
- package/dist/admin/assets/settings-B60vHpZd.js.map +1 -0
- package/dist/admin/assets/settle-CFU6YpQ0.js +2 -0
- package/dist/admin/assets/settle-CFU6YpQ0.js.map +1 -0
- package/dist/admin/assets/shapes-B5twqZcp.js +6 -0
- package/dist/admin/assets/shapes-B5twqZcp.js.map +1 -0
- package/dist/admin/assets/{skeleton-D4eOLKLY.js → skeleton-B5MP72Kw.js} +2 -2
- package/dist/admin/assets/{skeleton-D4eOLKLY.js.map → skeleton-B5MP72Kw.js.map} +1 -1
- package/dist/admin/assets/slugify-rYFum3Sc.js +2 -0
- package/dist/admin/assets/slugify-rYFum3Sc.js.map +1 -0
- package/dist/admin/assets/snapshots-DUI2t-qF.js +2 -0
- package/dist/admin/assets/snapshots-DUI2t-qF.js.map +1 -0
- package/dist/admin/assets/{sparkles-DCRAqbqD.js → sparkles-CvT-jxrW.js} +2 -2
- package/dist/admin/assets/{sparkles-DCRAqbqD.js.map → sparkles-CvT-jxrW.js.map} +1 -1
- package/dist/admin/assets/src-ndgTSYLX.js +7 -0
- package/dist/admin/assets/src-ndgTSYLX.js.map +1 -0
- package/dist/admin/assets/{stableId-iRkUbVIP.js → stableId-BrtQedPy.js} +2 -2
- package/dist/admin/assets/{stableId-iRkUbVIP.js.map → stableId-BrtQedPy.js.map} +1 -1
- package/dist/admin/assets/store-CdIFG90N.js +2 -0
- package/dist/admin/assets/{store-DknnssoQ.js.map → store-CdIFG90N.js.map} +1 -1
- package/dist/admin/assets/{switch-B2R13aVU.js → switch-Dp6WYNam.js} +2 -2
- package/dist/admin/assets/{switch-B2R13aVU.js.map → switch-Dp6WYNam.js.map} +1 -1
- package/dist/admin/assets/theme-65PB8uAu.js +2 -0
- package/dist/admin/assets/{theme-X-qeg74W.js.map → theme-65PB8uAu.js.map} +1 -1
- package/dist/admin/assets/titles-CQiqqDw-.js +2 -0
- package/dist/admin/assets/titles-CQiqqDw-.js.map +1 -0
- package/dist/admin/assets/tokens-ixHjAkDK.js +2 -0
- package/dist/admin/assets/{tokens-BlIDIMY9.js.map → tokens-ixHjAkDK.js.map} +1 -1
- package/dist/admin/assets/{tooltip-u2epXfJF.js → tooltip-BGP1DVBt.js} +2 -2
- package/dist/admin/assets/{tooltip-u2epXfJF.js.map → tooltip-BGP1DVBt.js.map} +1 -1
- package/dist/admin/assets/{undo-2-Zd1OT6qk.js → undo-2-BiTANHFz.js} +2 -2
- package/dist/admin/assets/{undo-2-Zd1OT6qk.js.map → undo-2-BiTANHFz.js.map} +1 -1
- package/dist/admin/assets/useContentSchema-DtYfhsd2.js +2 -0
- package/dist/admin/assets/{useContentSchema-DaQHlL19.js.map → useContentSchema-DtYfhsd2.js.map} +1 -1
- package/dist/admin/assets/useCursorPager-0zHjlm-7.js +2 -0
- package/dist/admin/assets/{useCursorPager-Dc-9B67j.js.map → useCursorPager-0zHjlm-7.js.map} +1 -1
- package/dist/admin/assets/useDiscardGuard-BskWSlbT.js +2 -0
- package/dist/admin/assets/useDiscardGuard-BskWSlbT.js.map +1 -0
- package/dist/admin/assets/useMediaPickerDialog-CU-ekPqX.js +2 -0
- package/dist/admin/assets/{useMediaPickerDialog-C23eOHQR.js.map → useMediaPickerDialog-CU-ekPqX.js.map} +1 -1
- package/dist/admin/assets/useMediaUploader-CBcq1ICg.js +2 -0
- package/dist/admin/assets/{useMediaUploader-CTViR0LX.js.map → useMediaUploader-CBcq1ICg.js.map} +1 -1
- package/dist/admin/assets/useNetworkPermission-Cts98h9d.js +2 -0
- package/dist/admin/assets/{useNetworkPermission-CegwqQXR.js.map → useNetworkPermission-Cts98h9d.js.map} +1 -1
- package/dist/admin/assets/usePaletteItems-DtReWmkd.js +2 -0
- package/dist/admin/assets/{usePaletteItems-B3y2t7Ly.js.map → usePaletteItems-DtReWmkd.js.map} +1 -1
- package/dist/admin/assets/usePlaces-DC47wVeU.js +2 -0
- package/dist/admin/assets/{usePlaces-CAXr-IO9.js.map → usePlaces-DC47wVeU.js.map} +1 -1
- package/dist/admin/assets/useQueries-CirW3Mvp.js +2 -0
- package/dist/admin/assets/{useQueries-CX6eFr24.js.map → useQueries-CirW3Mvp.js.map} +1 -1
- package/dist/admin/assets/{useResolvedScheme-Cg8TdO85.js → useResolvedScheme-C8vcQVko.js} +2 -2
- package/dist/admin/assets/{useResolvedScheme-Cg8TdO85.js.map → useResolvedScheme-C8vcQVko.js.map} +1 -1
- package/dist/admin/assets/{useSchemaScopeAccess-DyfiZnzs.js → useSchemaScopeAccess-ByrxIdKM.js} +2 -2
- package/dist/admin/assets/{useSchemaScopeAccess-DyfiZnzs.js.map → useSchemaScopeAccess-ByrxIdKM.js.map} +1 -1
- package/dist/admin/assets/users-2iJYwlJb.js +2 -0
- package/dist/admin/assets/users-2iJYwlJb.js.map +1 -0
- package/dist/admin/assets/{users-ohHZnBJW.js → users-DM7CXUBJ.js} +2 -2
- package/dist/admin/assets/{users-ohHZnBJW.js.map → users-DM7CXUBJ.js.map} +1 -1
- package/dist/admin/assets/{zod-D5i60ErJ.js → zod-Cry7YvLY.js} +2 -2
- package/dist/admin/assets/{zod-D5i60ErJ.js.map → zod-Cry7YvLY.js.map} +1 -1
- package/dist/admin/index.html +59 -60
- package/dist/cli.js +10 -5696
- package/dist/cli.js.map +1 -1
- package/dist/cliMain-papyXJDd.js +5771 -0
- package/dist/cliMain-papyXJDd.js.map +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -38
- package/dist/contentDisposition-DOL2Xt0l.js +90 -0
- package/dist/contentDisposition-DOL2Xt0l.js.map +1 -0
- package/dist/index.d.ts +23 -6
- package/dist/index.js +2 -2
- package/dist/public-B57h4F7Y.js +39 -0
- package/dist/public-B57h4F7Y.js.map +1 -0
- package/dist/{public-BO_wneBL.d.ts → public-COKbHR-N.d.ts} +47 -3
- package/dist/{s3Adapter-CtPzkzf0.js → s3Adapter-U01iEAcK.js} +2 -2
- package/dist/{s3Adapter-CtPzkzf0.js.map → s3Adapter-U01iEAcK.js.map} +1 -1
- package/dist/{worker-DRCCGGjl.js → worker-B-sC-eY2.js} +5735 -3982
- package/dist/worker-B-sC-eY2.js.map +1 -0
- package/package.json +5 -5
- package/dist/admin/assets/AssistError-CMXQWiQo.js +0 -2
- package/dist/admin/assets/Body-BYc1IVsQ.js +0 -2
- package/dist/admin/assets/Builder-CwHpRhZN.js +0 -2
- package/dist/admin/assets/Builder-CwHpRhZN.js.map +0 -1
- package/dist/admin/assets/ConfirmDialog-Rd6WDt6q.js +0 -2
- package/dist/admin/assets/ConfirmDialog-Rd6WDt6q.js.map +0 -1
- package/dist/admin/assets/Form-CiZUsLPp.js +0 -2
- package/dist/admin/assets/Form-CiZUsLPp.js.map +0 -1
- package/dist/admin/assets/FormCheckboxGroup-Bz8KERs1.js.map +0 -1
- package/dist/admin/assets/InsertMenuItem-BvRDuXtd.js +0 -2
- package/dist/admin/assets/InsertMenuItem-BvRDuXtd.js.map +0 -1
- package/dist/admin/assets/Panel-B1TkcP8V.js +0 -2
- package/dist/admin/assets/Panel-B1TkcP8V.js.map +0 -1
- package/dist/admin/assets/SecretReveal-BhSqdWqh.js +0 -2
- package/dist/admin/assets/SecretReveal-BhSqdWqh.js.map +0 -1
- package/dist/admin/assets/StepList-CZJmwy9e.js +0 -2
- package/dist/admin/assets/StepList-CZJmwy9e.js.map +0 -1
- package/dist/admin/assets/Structure-Dk87778W.js +0 -2
- package/dist/admin/assets/Thumbnail-BwbCNpgQ.js +0 -2
- package/dist/admin/assets/Thumbnail-BwbCNpgQ.js.map +0 -1
- package/dist/admin/assets/UnsavedChangesGuard-C6nD55Fn.js +0 -2
- package/dist/admin/assets/UnsavedChangesGuard-C6nD55Fn.js.map +0 -1
- package/dist/admin/assets/auth-C4fHG9Iu.js +0 -2
- package/dist/admin/assets/auth-C4fHG9Iu.js.map +0 -1
- package/dist/admin/assets/badge-vLiQczOd.js +0 -2
- package/dist/admin/assets/changeSets-D5VevASj.js +0 -2
- package/dist/admin/assets/changeSets-D5VevASj.js.map +0 -1
- package/dist/admin/assets/chevron-left-CZXrLV99.js +0 -2
- package/dist/admin/assets/content-Cbavyq0x.js +0 -3
- package/dist/admin/assets/content-Cbavyq0x.js.map +0 -1
- package/dist/admin/assets/contentCounts-DknqJ4kh.js +0 -2
- package/dist/admin/assets/context-fImO9k99.js +0 -2
- package/dist/admin/assets/createLucideIcon-CqygG5K6.js +0 -2
- package/dist/admin/assets/createLucideIcon-CqygG5K6.js.map +0 -1
- package/dist/admin/assets/develop-BDqMOEql.js +0 -11
- package/dist/admin/assets/develop-BDqMOEql.js.map +0 -1
- package/dist/admin/assets/es2015-BKfbx3rz.js +0 -42
- package/dist/admin/assets/es2015-BKfbx3rz.js.map +0 -1
- package/dist/admin/assets/followPlural-D0bENI5E.js +0 -2
- package/dist/admin/assets/followPlural-D0bENI5E.js.map +0 -1
- package/dist/admin/assets/inbox-Dfy4YBZ2.js +0 -2
- package/dist/admin/assets/inbox-Dfy4YBZ2.js.map +0 -1
- package/dist/admin/assets/index-BEM45u2w.css +0 -2
- package/dist/admin/assets/index-M4TUI1dl.js +0 -4
- package/dist/admin/assets/index-M4TUI1dl.js.map +0 -1
- package/dist/admin/assets/loader-circle-C-9trZPI.js +0 -2
- package/dist/admin/assets/loader-circle-C-9trZPI.js.map +0 -1
- package/dist/admin/assets/locales-e7B5t6id.js +0 -2
- package/dist/admin/assets/media-DBdx-UmR.js +0 -2
- package/dist/admin/assets/media-DBdx-UmR.js.map +0 -1
- package/dist/admin/assets/media-VCJUbYzJ.js +0 -2
- package/dist/admin/assets/network-BpbMYp6D.js +0 -2
- package/dist/admin/assets/network-BpbMYp6D.js.map +0 -1
- package/dist/admin/assets/pencil-BVSFlU14.js +0 -2
- package/dist/admin/assets/pencil-BVSFlU14.js.map +0 -1
- package/dist/admin/assets/publishing-CpSDO3M7.js +0 -2
- package/dist/admin/assets/schedules-CBGpjEg7.js +0 -2
- package/dist/admin/assets/schema-D9BgCVzZ.js +0 -2
- package/dist/admin/assets/schema-D9BgCVzZ.js.map +0 -1
- package/dist/admin/assets/searchSchemas-D4S2ceA0.js +0 -2
- package/dist/admin/assets/sections-Cl1LrzqH.js +0 -2
- package/dist/admin/assets/seo-DJ4k3LtY.js +0 -2
- package/dist/admin/assets/settings-DRZ33PTg.js +0 -2
- package/dist/admin/assets/settings-DRZ33PTg.js.map +0 -1
- package/dist/admin/assets/settle-LRKtTN_e.js +0 -2
- package/dist/admin/assets/settle-LRKtTN_e.js.map +0 -1
- package/dist/admin/assets/shapes-BJe3IMuj.js +0 -6
- package/dist/admin/assets/shapes-BJe3IMuj.js.map +0 -1
- package/dist/admin/assets/snapshots-CT-zs6Up.js +0 -2
- package/dist/admin/assets/snapshots-CT-zs6Up.js.map +0 -1
- package/dist/admin/assets/src-DUpL-qwG.js +0 -7
- package/dist/admin/assets/src-DUpL-qwG.js.map +0 -1
- package/dist/admin/assets/store-DknnssoQ.js +0 -2
- package/dist/admin/assets/theme-X-qeg74W.js +0 -2
- package/dist/admin/assets/titles-CLh5ftA2.js +0 -2
- package/dist/admin/assets/titles-CLh5ftA2.js.map +0 -1
- package/dist/admin/assets/tokens-BlIDIMY9.js +0 -2
- package/dist/admin/assets/useAuditLabels-DWBpLOTB.js +0 -2
- package/dist/admin/assets/useAuditLabels-DWBpLOTB.js.map +0 -1
- package/dist/admin/assets/useContentSchema-DaQHlL19.js +0 -2
- package/dist/admin/assets/useCursorPager-Dc-9B67j.js +0 -2
- package/dist/admin/assets/useDiscardGuard-BVJGUCiH.js +0 -2
- package/dist/admin/assets/useDiscardGuard-BVJGUCiH.js.map +0 -1
- package/dist/admin/assets/useMediaPickerDialog-C23eOHQR.js +0 -2
- package/dist/admin/assets/useMediaUploader-CTViR0LX.js +0 -2
- package/dist/admin/assets/useNetworkPermission-CegwqQXR.js +0 -2
- package/dist/admin/assets/usePaletteItems-B3y2t7Ly.js +0 -2
- package/dist/admin/assets/usePlaces-CAXr-IO9.js +0 -2
- package/dist/admin/assets/useQueries-CX6eFr24.js +0 -2
- package/dist/admin/assets/users-CDoJRL24.js +0 -2
- package/dist/admin/assets/users-CDoJRL24.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/worker-DRCCGGjl.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StepList-CZJmwy9e.js","names":["__iconData","i18next","en","i18next","AlertTriangle","__toESM","TriangleAlert","StatusChip","useTranslation","createLucideIcon","isDataType","STORAGE_FAMILY","instance","translation_default","PLAN_BUCKET_LABEL_KEYS","Clock","cn","propertyLabel","__iconData$1","CircleDashed","__iconData","GitPullRequest","result","extra","findField","definition","field","fieldId","hasIndex","API_SCALAR","PLAIN_TEXT_TYPES","TEXT_TARGETS","SCALAR_FAMILIES","hasTextConstraints","settings","convertsAcrossFamilies","fromFamily","from","toFamily","to","numericPair","toText","textToRichtext","richtextToText","typeChangeDropsValues","requiredStep","classifyTypeChange","breaking","after","compareValues","a","b","diff","numeric","isTightened","order","bound","asStrings","value","entry","removesAny","kept","validation","tightened","classifySettingsChange","change","property","classifyFieldChange","previous","before","prerequisites","classification","classifyChange","context","classifyChanges","changes","PREREQUISITE_ORDER","summarizeChanges","kind","PLAN_BUCKETS","METADATA_CATEGORIES","bucketOfChange","bucketOfPlan","summary","groupByBucket","bucket","group","import_jsx_runtime","require_jsx_runtime","BUCKET_TONES","BucketChip","t","CHANGE_KEYS","TOGGLES","TYPE_CHANGE_KINDS","scalarText","dataTypeName","type","fieldLabelOf","candidate","describeChange","addedType","values","key","isKnownStep","droppedTypeChange","step","stepsToShow","dropped","steps","impacts","index","typeName","describeStep","impact","describeStepImpact","checked","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/classify.ts","../../src/features/Models/helpers/planBuckets.ts","../../src/features/Models/Builder/BucketChip/index.tsx","../../src/features/Models/helpers/describeChange.ts","../../src/features/Models/helpers/describeStep.ts","../../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 { STORAGE_FAMILY, type DataType } from '../types/dataTypes.js';\nimport type { FieldDefinition, SchemaDefinition } from '../types/definitions.js';\nimport type { SchemaChange } from './types.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) 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.\n */\nconst convertsAcrossFamilies = (from: DataType, to: DataType): boolean => {\n const fromFamily = STORAGE_FAMILY[from];\n const toFamily = STORAGE_FAMILY[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);\n const textToRichtext = fromFamily === 'jsonString' && from !== 'code' && to === 'richtext';\n const richtextToText = from === 'richtext' && PLAIN_TEXT_TYPES.has(to);\n return numericPair || toText || textToRichtext || richtextToText;\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`) and the content conversion share this one rule.\n */\nexport const typeChangeDropsValues = (from: DataType, to: DataType): boolean =>\n STORAGE_FAMILY[from] !== STORAGE_FAMILY[to] && !convertsAcrossFamilies(from, to);\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 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 fromFamily = STORAGE_FAMILY[from];\n if (fromFamily === STORAGE_FAMILY[to]) {\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(from, to)) {\n return result('conversion', {\n breaking,\n destructive: true,\n dropsValues: true,\n prerequisites: ['convert', 'validateValues', ...requiredStep(after)],\n });\n }\n return result('conversion', {\n breaking,\n destructive: from === 'richtext' && PLAIN_TEXT_TYPES.has(to),\n prerequisites: ['convert', 'validateValues'],\n });\n};\n\ntype Comparable = number | string;\nconst compareValues = (a: Comparable, b: Comparable): number => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n try {\n const diff = BigInt(String(a)) - BigInt(String(b));\n return diff === 0n ? 0 : diff > 0n ? 1 : -1;\n } catch {\n const numeric = Number(a) - Number(b);\n return Number.isNaN(numeric) ? String(a).localeCompare(String(b)) : numeric;\n }\n};\n\n/** A lower bound (min, minLength) that appears or rises, or an upper bound that appears or falls. */\nconst isTightened = (bound: 'lower' | 'upper', from: unknown, to: unknown): boolean => {\n if (to === undefined || to === null) {\n return false;\n }\n if (from === undefined || from === null) {\n return true;\n }\n const order = compareValues(from as Comparable, to as Comparable);\n return bound === 'lower' ? order < 0 : order > 0;\n};\n\nconst asStrings = (value: unknown): string[] =>\n Array.isArray(value)\n ? value.map((entry) =>\n typeof entry === 'object' && entry !== null\n ? String((entry as { value?: unknown }).value)\n : String(entry),\n )\n : [];\n\nconst removesAny = (from: unknown, to: unknown): boolean => {\n const kept = new Set(asStrings(to));\n return asStrings(from).some((entry) => !kept.has(entry));\n};\n\nconst validation = (tightened: boolean) =>\n tightened ? result('validation', { prerequisites: ['validateValues'] }) : result('additive');\n\nconst classifySettingsChange = (change: SchemaChange): Classification => {\n const { property, from, to } = change;\n switch (property) {\n case 'minLength':\n case 'min':\n return validation(isTightened('lower', from, to));\n case 'maxLength':\n case 'max':\n case 'precision':\n case 'scale':\n return validation(isTightened('upper', from, to));\n case 'pattern':\n return validation(to !== undefined);\n case 'values':\n // Removing an enum value invalidates entries using it; adding values or relabelling does not.\n return validation(removesAny(from, to));\n case 'components':\n case 'allowedKinds':\n case 'protocols':\n // Narrowing the allowed set re-validates; an absent allowedKinds/protocols list means \"any\".\n return validation(to !== undefined && (from === undefined || removesAny(from, to)));\n case 'sourceFieldId':\n case 'language':\n // A code field's language is a label for readers; the stored string is the same.\n return result('metadata');\n case 'validate':\n return validation(to === true);\n case 'multiple':\n case 'repeatable':\n case 'cardinality': {\n const becomesSingle = to === false || to === 'one';\n return result('conversion', {\n breaking: true,\n destructive: becomesSingle,\n prerequisites: ['convert', 'validateValues'],\n });\n }\n case 'formatVersion':\n return result('conversion', { prerequisites: ['convert', 'validateValues'] });\n case 'target':\n case 'component':\n // Existing values point at entries of the old target; they are cleared by the conversion.\n return result('conversion', { breaking: true, destructive: true, prerequisites: ['convert'] });\n default:\n // An unknown setting: be safe and re-validate existing values.\n return result('validation', { prerequisites: ['validateValues'] });\n }\n};\n\nconst classifyFieldChange = (change: SchemaChange, { before, after }: ClassifyContext): Classification => {\n const previous = findField(before, change.fieldId);\n const field = findField(after, change.fieldId);\n switch (change.kind) {\n case 'field.added': {\n const prerequisites: Classification['prerequisites'] = [];\n if (field?.required) {\n prerequisites.push(field.defaultValue !== undefined ? 'backfill' : 'validateRequired');\n }\n if (field?.unique) {\n prerequisites.push('checkUnique');\n }\n if (hasIndex(field)) {\n prerequisites.push('buildIndex');\n }\n return result(field?.required ? 'requiredField' : 'additive', { prerequisites });\n }\n case 'field.removed':\n // Values stay in stored revisions; removing them is a separate, explicit cleanup.\n return result('removal', {\n breaking: true,\n cleanup: [\n ...(hasIndex(previous) ? (['dropIndex'] as const) : []),\n ...(previous?.unique ? (['releaseUnique'] as const) : []),\n ],\n });\n case 'field.order':\n case 'field.metadata':\n return result('metadata');\n case 'field.editor':\n return result('editorSwap');\n case 'field.apiKey':\n return result('contract', { breaking: true });\n case 'field.type': {\n const classification = classifyTypeChange(change.from as DataType, change.to as DataType, field);\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 // 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')\n : result('conversion', { destructive: true, prerequisites: ['convert'] });\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 classification =\n change.to === true\n ? result('additive')\n : result('conversion', { destructive: true, prerequisites: ['convert'] });\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 { 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 { ChangeKind, ClassifiedChange, DataType, SchemaDefinition } from '@shapio/schema';\nimport { i18next } from '@/app/i18n';\nimport { propertyLabel } from './labels';\n\n/** Translation key per change kind; toggles add the `on`/`off` context (`…_on`, `…_off`). */\nconst CHANGE_KEYS = {\n 'definition.added': 'models.changes.definitionAdded',\n 'definition.removed': 'models.changes.definitionRemoved',\n 'definition.apiKey': 'models.changes.definitionApiKey',\n 'definition.pluralApiKey': 'models.changes.definitionPluralApiKey',\n 'definition.metadata': 'models.changes.definitionMetadata',\n 'model.kind': 'models.changes.modelKind',\n 'model.localized': 'models.changes.modelLocalized',\n 'model.draftAndPublish': 'models.changes.modelDraftAndPublish',\n 'field.added': 'models.changes.fieldAdded',\n 'field.removed': 'models.changes.fieldRemoved',\n 'field.order': 'models.changes.fieldOrder',\n 'field.apiKey': 'models.changes.fieldApiKey',\n 'field.metadata': 'models.changes.fieldMetadata',\n 'field.editor': 'models.changes.fieldEditor',\n 'field.type': 'models.changes.fieldType',\n 'field.required': 'models.changes.fieldRequired',\n 'field.localized': 'models.changes.fieldLocalized',\n 'field.public': 'models.changes.fieldPublic',\n 'field.deprecated': 'models.changes.fieldDeprecated',\n 'field.unique': 'models.changes.fieldUnique',\n 'field.filterable': 'models.changes.fieldFilterable',\n 'field.sortable': 'models.changes.fieldSortable',\n 'field.settings': 'models.changes.fieldSettings',\n} as const satisfies Record<ChangeKind, string>;\n\nconst TOGGLES: ReadonlySet<ChangeKind> = new Set([\n 'model.localized',\n 'model.draftAndPublish',\n 'field.required',\n 'field.localized',\n 'field.public',\n 'field.deprecated',\n 'field.unique',\n 'field.filterable',\n 'field.sortable',\n]);\n\nconst TYPE_CHANGE_KINDS: ReadonlySet<ChangeKind> = new Set(['field.type', 'field.added']);\n\n/** Old and new values are shown only when they are short scalars (labels, keys), never as JSON. */\nconst scalarText = (value: unknown): string =>\n typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' ? String(value) : '';\n\nconst dataTypeName = (type: unknown) =>\n typeof type === 'string' ? i18next.t(`models.dataTypes.${type as DataType}.name`) : '';\n\n/** Field label by ID, from the proposed definition or (for removed fields) the current one. */\nexport const fieldLabelOf = (\n fieldId: string | undefined,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n): string => {\n const field =\n after?.fields.find((candidate) => candidate.id === fieldId) ??\n before?.fields.find((candidate) => candidate.id === fieldId);\n return field?.label ?? fieldId ?? '';\n};\n\n/** One sentence describing a planned change, e.g. \"Rename the API key of Title from title to headline\". */\nexport const describeChange = (\n change: ClassifiedChange,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n): string => {\n const field = fieldLabelOf(change.fieldId, before, after);\n const addedType =\n change.kind === 'field.added' && typeof change.to === 'object' && change.to !== null\n ? (change.to as { type?: unknown }).type\n : undefined;\n const values = TYPE_CHANGE_KINDS.has(change.kind)\n ? { from: dataTypeName(change.from), to: dataTypeName(change.to), type: dataTypeName(addedType) }\n : { from: scalarText(change.from), to: scalarText(change.to) };\n // A type change Shapio can't convert says that the field's stored values are dropped.\n const key = change.dropsValues ? 'models.changes.fieldTypeDropped' : CHANGE_KEYS[change.kind];\n return i18next.t(key, {\n field,\n name: after?.label ?? before?.label ?? '',\n property: change.property ? propertyLabel(change.property) : '',\n ...values,\n ...(TOGGLES.has(change.kind) ? { context: change.to === true ? 'on' : 'off' } : {}),\n });\n};\n","import type { PlanStep, PlanStepImpact } from '@shapio/client';\nimport { isDataType, typeChangeDropsValues, type DataType, type SchemaDefinition } from '@shapio/schema';\nimport { i18next } from '@/app/i18n';\nimport en from '@/locales/en/translation.json';\nimport { fieldLabelOf } from './describeChange';\n\ntype StepKind = keyof typeof en.models.steps;\n\nconst isKnownStep = (kind: string): kind is StepKind => Object.hasOwn(en.models.steps, kind);\n\ntype DroppedTypeChange = { fieldId: string | undefined; from: DataType; to: DataType };\n\n/** The type change a `convert` step carries when Shapio can't convert it and drops the field's values. */\nconst droppedTypeChange = (step: PlanStep): DroppedTypeChange | undefined => {\n if (step.kind !== 'convert' || typeof step.change !== 'object' || step.change === null) {\n return undefined;\n }\n const { kind, fieldId, from, to } = step.change as Record<string, unknown>;\n if (kind !== 'field.type' || !isDataType(from) || !isDataType(to) || !typeChangeDropsValues(from, to)) {\n return undefined;\n }\n return { fieldId: typeof fieldId === 'string' ? fieldId : undefined, from, to };\n};\n\n/**\n * The steps the review lists: a `validateValues` step on a field whose values a `convert` step of the same plan\n * drops is left out (nothing is left for the person to check; the server still runs it). Each step keeps its\n * impact, which the plan gives by position.\n */\nexport const stepsToShow = (\n steps: readonly PlanStep[],\n impacts?: readonly PlanStepImpact[],\n): { step: PlanStep; impact: PlanStepImpact | undefined }[] => {\n const dropped = new Set(\n steps.flatMap((step) => {\n const change = droppedTypeChange(step);\n return change?.fieldId ? [`${String(step.ownerId)}:${change.fieldId}`] : [];\n }),\n );\n return steps\n .map((step, index) => ({ step, impact: impacts?.[index] }))\n .filter(\n ({ step }) =>\n step.kind !== 'validateValues' ||\n !step.fieldId ||\n !dropped.has(`${String(step.ownerId)}:${step.fieldId}`),\n );\n};\n\nconst typeName = (type: DataType) => i18next.t(`models.dataTypes.${type}.name`);\n\n/**\n * A sentence for a prerequisite or follow-up step, e.g. \"Check that every entry has a Title\". A conversion\n * that drops values names the field, both types and how many entries lose their value (the dry run's\n * `droppedEntries`, else the step's entry count).\n */\nexport const describeStep = (\n step: PlanStep,\n before: SchemaDefinition | null,\n after: SchemaDefinition | null,\n impact?: PlanStepImpact,\n): string => {\n const dropped = droppedTypeChange(step);\n if (dropped) {\n return i18next.t('models.plan.stepDropped', {\n field: fieldLabelOf(dropped.fieldId, before, after),\n from: typeName(dropped.from),\n to: typeName(dropped.to),\n count: impact?.droppedEntries ?? impact?.affectedHeads ?? 0,\n });\n }\n const field = fieldLabelOf(step.fieldId, before, after);\n return isKnownStep(step.kind) ? i18next.t(`models.steps.${step.kind}`, { field }) : step.kind;\n};\n\n/**\n * What a prerequisite would touch: entries checked and, where known, how many would fail. A conversion that\n * drops values says its count in the step itself, so it has no detail.\n */\nexport const describeStepImpact = (\n step: PlanStep,\n impact: PlanStepImpact | undefined,\n): string | undefined => {\n if (!impact || droppedTypeChange(step)) {\n return undefined;\n }\n const checked = i18next.t('models.plan.stepEntries', { count: impact.affectedHeads });\n if (!impact.invalidHeads) {\n return checked;\n }\n const failing =\n step.kind === 'validateRequired'\n ? i18next.t('models.plan.stepMissingRequired', { count: impact.invalidHeads })\n : i18next.t('models.plan.stepInvalid', { count: impact.invalidHeads });\n return `${checked} · ${failing}`;\n};\n","import type { PlanStep, PlanStepImpact } from '@shapio/client';\nimport type { SchemaDefinition } from '@shapio/schema';\nimport { AlertTriangle, CircleDashed, Clock } from 'lucide-react';\nimport { cn } from '@/helpers/cn';\nimport { describeStep, describeStepImpact, stepsToShow } from '../../../helpers/describeStep';\n\ntype StepListProps = {\n steps: readonly PlanStep[];\n /** Impact per step, in the same order (prerequisites only). */\n impacts?: readonly PlanStepImpact[];\n before: SchemaDefinition | null;\n after: SchemaDefinition | null;\n /** Prerequisites run before activation (clock, or a warning when entries would fail); follow-ups after. */\n phase: 'before' | 'after';\n};\n\nconst STATUS_CLASSES = {\n waiting: 'text-muted-foreground',\n failing: 'border-warning/40 bg-warning-muted text-warning',\n later: 'text-muted-foreground',\n} as const;\n\nconst STATUS_ICONS = { waiting: Clock, failing: AlertTriangle, later: CircleDashed } as const;\n\n/**\n * Steps as a vertical timeline: a status icon per step, joined by a line. A value check on a field whose\n * values are dropped is not listed (see `stepsToShow`).\n */\nexport const StepList = ({ steps, impacts, before, after, phase }: StepListProps) => {\n const shown = stepsToShow(steps, impacts);\n return (\n <ol className=\"space-y-0\">\n {shown.map(({ step, impact }, index) => {\n const status = phase === 'after' ? 'later' : impact?.invalidHeads ? 'failing' : 'waiting';\n const Icon = STATUS_ICONS[status];\n const detail = describeStepImpact(step, impact);\n return (\n <li key={`${step.kind}-${index}`} className=\"flex gap-3\">\n <span className=\"flex flex-col items-center\">\n <span\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-full border bg-card',\n STATUS_CLASSES[status],\n )}\n >\n <Icon aria-hidden=\"true\" className=\"size-3.5\" />\n </span>\n {index < shown.length - 1 ? (\n <span aria-hidden=\"true\" className=\"my-1 w-px flex-1 bg-border\" />\n ) : null}\n </span>\n <div className=\"min-w-0 pt-0.5 pb-4 text-sm\">\n {describeStep(step, before, after, impact)}\n {detail ? <span className=\"block text-meta text-muted-foreground\">{detail}</span> : null}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n"],"ignoreList":[0,1],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./jsx-runtime-DREnUpxT.js";import{u as n}from"./auth-C4fHG9Iu.js";import{n as r}from"./badge-vLiQczOd.js";import{n as i,t as a}from"./createLucideIcon-CqygG5K6.js";import{T as o}from"./es2015-BKfbx3rz.js";import{n as s}from"./search-CW3iBC4k.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=()=>{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}},b=[`byte`,`kilobyte`,`megabyte`,`gigabyte`],x=e=>{let t=e,n=0;for(;t>=1e3&&n<b.length-1;)t/=1e3,n+=1;return new Intl.NumberFormat(o.language,{style:`unit`,unit:b[n],unitDisplay:`short`,maximumFractionDigits:n===0?0:1}).format(t)},S={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`}},C=e(t(),1),w=({asset:e})=>{let{t}=i();return e.variants.length===0?(0,C.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e.status===`processing`?t(`media.variants.processing`):t(`media.variants.none`)}):(0,C.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=S[e.status];return(0,C.jsxs)(`li`,{className:`flex min-w-0 items-center gap-3 px-3 py-2`,children:[(0,C.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[e.url?(0,C.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,C.jsx)(`span`,{className:`text-sm font-medium`,children:n}),(0,C.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?` · ${x(e.sizeBytes)}`:null]})]}),(0,C.jsx)(r,{tone:i.tone,label:t(i.labelKey),size:`sm`})]},e.name)})})},T=({mimeType:e,className:t})=>e.startsWith(`image/`)?(0,C.jsx)(m,{"aria-hidden":`true`,className:t}):e.startsWith(`video/`)?(0,C.jsx)(g,{"aria-hidden":`true`,className:t}):e.startsWith(`audio/`)?(0,C.jsx)(f,{"aria-hidden":`true`,className:t}):e===`application/pdf`||e.startsWith(`text/`)?(0,C.jsx)(s,{"aria-hidden":`true`,className:t}):(0,C.jsx)(v,{"aria-hidden":`true`,className:t}),E=e=>e.startsWith(`image/`),D=5,O=(e,t)=>{let n=/\.([a-z0-9]+)$/i.exec(e)?.[1];return n&&n.length<=D?n.toUpperCase():(t.split(`/`)[1]?.split(/[.+;-]/)[0]??``).toUpperCase()},k=e=>{let t=e.variants.find(e=>e.name===`thumbnail`&&e.url);return t?.url?t.url:E(e.mimeType)?e.url:void 0},A=({asset:e,className:t})=>{let n=k(e);return(0,C.jsx)(`div`,{className:c(`flex items-center justify-center overflow-hidden bg-muted`,t),children:n?(0,C.jsx)(`img`,{src:n,alt:``,loading:`lazy`,decoding:`async`,className:`size-full object-cover`}):(0,C.jsx)(T,{mimeType:e.mimeType,className:`size-8 text-muted-foreground`})})};export{w as a,y as c,T as i,O as n,S as o,E as r,x as s,A as t};
|
|
2
|
-
//# sourceMappingURL=Thumbnail-BwbCNpgQ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Thumbnail-BwbCNpgQ.js","names":["__iconData","__iconData","__iconData","i18next","FileVideo","FileAudio","__toESM","useMe","StatusChip","useTranslation","createLucideIcon","instance","FileText","cn","VARIANT_LABEL_KEYS","isKnownVariant","__iconData$3","FileHeadphone","__iconData$2","FileImage","__iconData$1","FilePlay","__iconData","File","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","../../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","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/** `1536` → `1.5 kB`, in the admin's language. */\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: '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],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{D as r}from"./auth-C4fHG9Iu.js";import{n as i}from"./createLucideIcon-CqygG5K6.js";import{t as a}from"./ConfirmDialog-Rd6WDt6q.js";var o=e(t(),1);function s(e,t){if(e===void 0)return{shouldBlockFn:()=>!0,withResolver:!1};if(`shouldBlockFn`in e)return e;if(typeof e==`function`){let n=!!(t??!0);return{shouldBlockFn:async()=>n?await e():!1,enableBeforeUnload:n,withResolver:!1}}let n=!!(e.condition??!0),r=e.blockerFn;return{shouldBlockFn:async()=>n&&r!==void 0?await r():n,enableBeforeUnload:n,withResolver:r===void 0}}function c(e,t){let{shouldBlockFn:n,enableBeforeUnload:i=!0,disabled:a=!1,withResolver:c=!1}=s(e,t),l=r(),{history:u}=l,[d,f]=o.useState({status:`idle`,current:void 0,next:void 0,action:void 0,proceed:void 0,reset:void 0});return o.useEffect(()=>a?void 0:u.block({blockerFn:async e=>{function t(e){let t=l.parseLocation(e),[,n,r]=l.getMatchedRoutes(t.pathname);return r===void 0?{routeId:`__notFound__`,fullPath:t.pathname,pathname:t.pathname,params:n,search:l.options.parseSearch(e.search)}:{routeId:r.id,fullPath:r.fullPath,pathname:t.pathname,params:n,search:l.options.parseSearch(e.search)}}let r=t(e.currentLocation),i=t(e.nextLocation);if(r.routeId===`__notFound__`&&i.routeId!==`__notFound__`)return!1;let a=await n({action:e.action,current:r,next:i});if(!c)return a;if(!a)return!1;let o=await new Promise(t=>{f({status:`blocked`,current:r,next:i,action:e.action,proceed:()=>t(!1),reset:()=>t(!0)})});return f({status:`idle`,current:void 0,next:void 0,action:void 0,proceed:void 0,reset:void 0}),o},enableBeforeUnload:i}),[n,i,a,c,u,l]),d}var l=e(n(),1),u=({when:e,shouldBlock:t,title:n,description:r,stayLabel:o,leaveLabel:s})=>{let{t:u}=i(),d=c({shouldBlockFn:({current:n,next:r})=>e&&(t?.({currentPath:n.pathname,nextPath:r.pathname})??!0),enableBeforeUnload:()=>e,withResolver:!0});return(0,l.jsx)(a,{open:d.status===`blocked`,onOpenChange:e=>{!e&&d.status===`blocked`&&d.reset()},title:n??u(`unsaved.title`),description:r??u(`unsaved.description`),cancelLabel:o??u(`unsaved.stay`),confirmLabel:s??u(`unsaved.leave`),destructive:!0,onConfirm:()=>d.proceed?.()})};export{u as t};
|
|
2
|
-
//# sourceMappingURL=UnsavedChangesGuard-C6nD55Fn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UnsavedChangesGuard-C6nD55Fn.js","names":["__toESM","require_jsx_runtime","useRouter","useTranslation","ConfirmDialog","import_react","require_react","_resolveBlockerOpts","opts","shouldBlock","condition","fn","useBlocker","router","resolver","setResolver","disabled","history","getLocation","parsedLocation","location","rawParams","foundRoute","current","blockerFnArgs","next","shouldBlockFn","withResolver","canNavigateAsync","resolve","enableBeforeUnload","import_jsx_runtime","UnsavedChangesGuard","blocker","when","open","title","t","description","stayLabel","leaveLabel"],"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/useBlocker.js","../../src/components/UnsavedChangesGuard/index.tsx"],"sourcesContent":["\"use client\";\nimport { useRouter } from \"./useRouter.js\";\nimport * as React$1 from \"react\";\n//#region src/useBlocker.tsx\nfunction _resolveBlockerOpts(opts, condition) {\n\tif (opts === void 0) return {\n\t\tshouldBlockFn: () => true,\n\t\twithResolver: false\n\t};\n\tif (\"shouldBlockFn\" in opts) return opts;\n\tif (typeof opts === \"function\") {\n\t\tconst shouldBlock = Boolean(condition ?? true);\n\t\tconst _customBlockerFn = async () => {\n\t\t\tif (shouldBlock) return await opts();\n\t\t\treturn false;\n\t\t};\n\t\treturn {\n\t\t\tshouldBlockFn: _customBlockerFn,\n\t\t\tenableBeforeUnload: shouldBlock,\n\t\t\twithResolver: false\n\t\t};\n\t}\n\tconst shouldBlock = Boolean(opts.condition ?? true);\n\tconst fn = opts.blockerFn;\n\tconst _customBlockerFn = async () => {\n\t\tif (shouldBlock && fn !== void 0) return await fn();\n\t\treturn shouldBlock;\n\t};\n\treturn {\n\t\tshouldBlockFn: _customBlockerFn,\n\t\tenableBeforeUnload: shouldBlock,\n\t\twithResolver: fn === void 0\n\t};\n}\nfunction useBlocker(opts, condition) {\n\tconst { shouldBlockFn, enableBeforeUnload = true, disabled = false, withResolver = false } = _resolveBlockerOpts(opts, condition);\n\tconst router = useRouter();\n\tconst { history } = router;\n\tconst [resolver, setResolver] = React$1.useState({\n\t\tstatus: \"idle\",\n\t\tcurrent: void 0,\n\t\tnext: void 0,\n\t\taction: void 0,\n\t\tproceed: void 0,\n\t\treset: void 0\n\t});\n\tReact$1.useEffect(() => {\n\t\tconst blockerFnComposed = async (blockerFnArgs) => {\n\t\t\tfunction getLocation(location) {\n\t\t\t\tconst parsedLocation = router.parseLocation(location);\n\t\t\t\tconst [, rawParams, foundRoute] = router.getMatchedRoutes(parsedLocation.pathname);\n\t\t\t\tif (foundRoute === void 0) return {\n\t\t\t\t\trouteId: \"__notFound__\",\n\t\t\t\t\tfullPath: parsedLocation.pathname,\n\t\t\t\t\tpathname: parsedLocation.pathname,\n\t\t\t\t\tparams: rawParams,\n\t\t\t\t\tsearch: router.options.parseSearch(location.search)\n\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\trouteId: foundRoute.id,\n\t\t\t\t\tfullPath: foundRoute.fullPath,\n\t\t\t\t\tpathname: parsedLocation.pathname,\n\t\t\t\t\tparams: rawParams,\n\t\t\t\t\tsearch: router.options.parseSearch(location.search)\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst current = getLocation(blockerFnArgs.currentLocation);\n\t\t\tconst next = getLocation(blockerFnArgs.nextLocation);\n\t\t\tif (current.routeId === \"__notFound__\" && next.routeId !== \"__notFound__\") return false;\n\t\t\tconst shouldBlock = await shouldBlockFn({\n\t\t\t\taction: blockerFnArgs.action,\n\t\t\t\tcurrent,\n\t\t\t\tnext\n\t\t\t});\n\t\t\tif (!withResolver) return shouldBlock;\n\t\t\tif (!shouldBlock) return false;\n\t\t\tconst canNavigateAsync = await new Promise((resolve) => {\n\t\t\t\tsetResolver({\n\t\t\t\t\tstatus: \"blocked\",\n\t\t\t\t\tcurrent,\n\t\t\t\t\tnext,\n\t\t\t\t\taction: blockerFnArgs.action,\n\t\t\t\t\tproceed: () => resolve(false),\n\t\t\t\t\treset: () => resolve(true)\n\t\t\t\t});\n\t\t\t});\n\t\t\tsetResolver({\n\t\t\t\tstatus: \"idle\",\n\t\t\t\tcurrent: void 0,\n\t\t\t\tnext: void 0,\n\t\t\t\taction: void 0,\n\t\t\t\tproceed: void 0,\n\t\t\t\treset: void 0\n\t\t\t});\n\t\t\treturn canNavigateAsync;\n\t\t};\n\t\treturn disabled ? void 0 : history.block({\n\t\t\tblockerFn: blockerFnComposed,\n\t\t\tenableBeforeUnload\n\t\t});\n\t}, [\n\t\tshouldBlockFn,\n\t\tenableBeforeUnload,\n\t\tdisabled,\n\t\twithResolver,\n\t\thistory,\n\t\trouter\n\t]);\n\treturn resolver;\n}\nvar _resolvePromptBlockerArgs = (props) => {\n\tif (\"shouldBlockFn\" in props) return { ...props };\n\tconst shouldBlock = Boolean(props.condition ?? true);\n\tconst fn = props.blockerFn;\n\tconst _customBlockerFn = async () => {\n\t\tif (shouldBlock && fn !== void 0) return await fn();\n\t\treturn shouldBlock;\n\t};\n\treturn {\n\t\tshouldBlockFn: _customBlockerFn,\n\t\tenableBeforeUnload: shouldBlock,\n\t\twithResolver: fn === void 0\n\t};\n};\nfunction Block(opts) {\n\tconst { children, ...rest } = opts;\n\tconst resolver = useBlocker(_resolvePromptBlockerArgs(rest));\n\treturn children ? typeof children === \"function\" ? children(resolver) : children : null;\n}\n//#endregion\nexport { Block, useBlocker };\n\n//# sourceMappingURL=useBlocker.js.map","import { useBlocker } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { ConfirmDialog } from '../ConfirmDialog';\n\n/** A navigation the guard may let through: the pathnames it goes from and to. */\nexport type GuardedNavigation = { currentPath: string; nextPath: string };\n\ntype UnsavedChangesGuardProps = {\n when: boolean;\n /**\n * While `when`, which navigations ask (default: all). E.g. a screen whose edits survive a search-param\n * change asks only when the path changes. Reloading or closing the page always warns.\n */\n shouldBlock?: (navigation: GuardedNavigation) => boolean;\n /** The question; defaults to \"Discard unsaved changes?\" (and its description and buttons). */\n title?: string;\n description?: string;\n /** The button that stays on the page. */\n stayLabel?: string;\n /** The button that leaves. */\n leaveLabel?: string;\n};\n\n/**\n * Dirty-state protection: while `when` is true, in-app navigation asks before discarding edits and the\n * browser warns on reload/close.\n */\nexport const UnsavedChangesGuard = ({\n when,\n shouldBlock,\n title,\n description,\n stayLabel,\n leaveLabel,\n}: UnsavedChangesGuardProps) => {\n const { t } = useTranslation();\n const blocker = useBlocker({\n shouldBlockFn: ({ current, next }) =>\n when && (shouldBlock?.({ currentPath: current.pathname, nextPath: next.pathname }) ?? true),\n enableBeforeUnload: () => when,\n withResolver: true,\n });\n return (\n <ConfirmDialog\n open={blocker.status === 'blocked'}\n onOpenChange={(open) => {\n if (!open && blocker.status === 'blocked') {\n blocker.reset();\n }\n }}\n title={title ?? t('unsaved.title')}\n description={description ?? t('unsaved.description')}\n cancelLabel={stayLabel ?? t('unsaved.stay')}\n confirmLabel={leaveLabel ?? t('unsaved.leave')}\n destructive\n onConfirm={() => blocker.proceed?.()}\n />\n );\n};\n"],"ignoreList":[0],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{A as r,O as i,_ as a,i as o,j as s,k as c,lt as l,m as u,n as d,o as f,r as p}from"./loader-circle-C-9trZPI.js";import{m}from"./createLucideIcon-CqygG5K6.js";function h(e){return e}var g=e(t(),1),_=g.useLayoutEffect;function v(e){return e[e.length-1]}function y(e,t){return typeof e==`function`?e(t):e}var b=Object.prototype.hasOwnProperty;function x(e){for(let t in e)if(b.call(e,t))return!0;return!1}var S=()=>Object.create(null),C=(e,t)=>w(e,t,!0);function w(e,t,n,r=0){if(e===t)return e;if(r++>500)return t;let i=Array.isArray(e)&&Array.isArray(t);if(!i&&!(T(e)&&T(t)))return t;let a=Object.keys(e),o=a.length,s=Object.keys(t),c=s.length;if(i?o!==e.length||c!==t.length||o&&v(a)!==`${o-1}`||c&&v(s)!==`${c-1}`:o!==Object.getOwnPropertyNames(e).length||c!==Object.getOwnPropertyNames(t).length||Object.getOwnPropertySymbols(t).length)return t;let l=0,u,d,f;if(i){for(;l<c&&(f=l,d=e[f],u=t[f],u=d===u?d:typeof d==`object`?w(d,u,n,r):u,u===d);l++);if(l===c&&o===c)return e}else{let i=o===c,p=!0;for(;l<c;l++){f=s[l],d=e[f];let o=t[f];u=d===o?d:typeof d==`object`?w(d,o,n,r):o,i&&=u===d&&(a[l]===f||b.call(e,f)),p&&=Object.is(u,o),a[l]=u}if(i)return Object.getOwnPropertySymbols(e).length?t:e;if(p)return t}let p=i?s.fill(0):n?S():{};for(let o=0;o<c;o++)f=i?o:s[o],i?(d=e[f],o>l&&(u=t[f],u=d===u?d:typeof d==`object`?w(d,u,n,r):u),p[f]=o<l?d:u):p[f]=a[o];return p}function T(e){return!e||typeof e!=`object`?!1:(Object.getPrototypeOf(e)?.constructor??Object)===Object}function E(e,t,n,r){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let i=0,a=e.length;i<a;i++){let a=e[i],o=t[i];if(a!==o&&!E(a,o,n,r))return!1}return!0}if(T(e)&&T(t)){if(n){for(let i in t)if((r||t[i]!==void 0)&&!E(e[i],t[i],n,r))return!1;return!0}let i=0;if(r)i=Object.keys(e).length;else for(let t in e)e[t]!==void 0&&i++;for(let a in t)if((r||t[a]!==void 0)&&(i--===0||!E(e[a],t[a],n,r)))return!1;return i===0}return!1}var ee=/[\x00-\x1f\x7f"<>`{}]/g;function D(e){return e.replace(ee,e=>`%`+e.charCodeAt(0).toString(16).toUpperCase().padStart(2,`0`))}function O(e){let t;try{t=decodeURI(e)}catch{t=e.replaceAll(/%[0-9A-F]{2}/gi,e=>{try{return decodeURI(e)}catch{return e}})}return D(t)}var k=[`http:`,`https:`,`mailto:`,`tel:`];function A(e){if(e[0]!==`/`&&e.includes(`:`))return/^[\x00-\x20]*([a-z][a-z\d+.\t\n\r-]*:)/i.exec(e)?.[1]?.replace(/[\t\n\r]/g,``).toLowerCase()}var j=/^[\x00-\x20]*[\\/][\t\n\r]*[\\/]/;function M(e,t){if(!e)return!1;if(j.test(e))return!0;let n=A(e);return n?!t.has(n):!1}var N={"&":`\\u0026`,">":`\\u003e`,"<":`\\u003c`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},P=/[&><\u2028\u2029]/g;function F(e){return e.replace(P,e=>N[e])}function I(e){if(!e)return e;let t=e;if(/[%\\\x00-\x1f\x7f]/.test(e)){let n=/%25|%5C/gi,r=0,i;for(t=``;(i=n.exec(e))!==null;)t+=O(e.slice(r,i.index))+i[0],r=n.lastIndex;t+=O(r?e.slice(r):e)}return t}function L(e){return/[\s\u0080-\uFFFF]/.test(e)?e.replace(/\s|[^\u0000-\u007F]/gu,encodeURIComponent):e}function R(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function z(e){return e.replace(/\/{2,}/g,`/`)}function B(e){return e===`/`?e:e.replace(/^\/+/,``)}function V(e){let t=e.length;return t>1&&e[t-1]===`/`?e.replace(/\/+$/,``):e}function te(e){return V(B(e))}function H(e,t){return e?.endsWith(`/`)&&e!==`/`&&e!==`${t}/`?e.slice(0,-1):e}function ne(e,t,n=`never`,r){if(t.includes(`//`)&&(t=z(t)),t.startsWith(`/`))return t.length===1||n===`preserve`?t:n===`always`?t.endsWith(`/`)?t:`${t}/`:t.endsWith(`/`)?t.slice(0,-1):t;let i=t===`.`,a;if(r){a=i?e:e+`\0`+t;let n=r.get(a);if(n)return n}let o;if(i)o=e.split(`/`);else{for(e.includes(`//`)&&(e=z(e)),o=e.split(`/`);o.length>1&&v(o)===``;)o.pop();let n=t.split(`/`);for(let e=0,t=n.length;e<t;e++){let r=n[e];r===``?e?e===t-1&&o.push(r):o=[r]:r===`..`?o.length>1?o.pop():o=[``]:r===`.`||o.push(r)}}o.length>1&&(v(o)===``?n===`never`&&o.pop():n===`always`&&o.push(``));let s=o.join(`/`),c=(i?z(s):s)||`/`;return a&&r&&r.set(a,c),c}function re(e){let t=new Map(e.map(e=>[encodeURIComponent(e),e])),n=new RegExp([...t.keys()].join(`|`).replace(/[.*()]/g,`\\$&`),`g`);return e=>e.replace(n,e=>t.get(e)??e)}function ie(e){return e==null||e===``}function ae(e,t,n){if(typeof t!=`string`)return``+(t??void 0);let r=e===`_splat`;if(r&&(!t||/^[a-zA-Z0-9\-._~!/]*$/.test(t)))return t;let i=encodeURIComponent(t);return r&&(i=i.replaceAll(`%2F`,`/`)),n?n(i):i}function oe(e,t,n,r,i){let a=e.endsWith(`/`)?`/`:``,o=``;for(let e of t){if(typeof e==`string`){o+=e;continue}let[t,s,c,l]=e,u=t===2,d=u&&l!==void 0?l+a:l,f=n[s];if(t!==3||f!=null){if(i&&(i[s]=f,u&&(i[`*`]=f)),u&&ie(f)){if(c===`/`&&!d)continue;f=``}o+=c+ae(s,f,r)+(d||``)}}return o+a||`/`}var se=`Error preloading route! ☝️`,U=e(n(),1),ce=()=>!0,le=()=>!1;function ue({children:e,fallback:t=null}){return(0,U.jsx)(g.Fragment,{children:de()?e:t})}function de(e=!0){return g.useSyncExternalStore(fe,ce,e?le:ce)}function fe(){return()=>{}}var pe=g.createContext(null);function W(e){return g.useContext(pe)}var me=c();function he(e,t){return e===t}function ge(e,t=e=>e,n){let r=n?.compare??he,i=(0,g.useCallback)(t=>{let{unsubscribe:n}=e.subscribe(t);return n},[e]),a=(0,g.useCallback)(()=>e.get(),[e]);return(0,me.useSyncExternalStoreWithSelector)(i,a,a,t,r)}function _e(e){let t=W();return g.useCallback(n=>t.navigate({...n,from:n.from??e?.from}),[e?.from,t])}function ve(e){let t=W(),n=_e(),r=g.useRef(null);return _(()=>{r.current!==e&&(n(e),r.current=e)},[t,e,n]),null}function ye(...e){let t=g.useRef(e),n=t.current;return e.forEach((e,t)=>{E(n[t],e,!1,!0)||(n[t]=e)}),t.current}function G(e,t){e.preloadRoute(t).catch(e=>{console.warn(e),console.warn(se)})}var be={compare:(e,t)=>e[0]===t[0]&&e[1]===t[1]};function xe(e,t){let n=typeof e==`string`&&A(e);if(n)return t.has(n)?e:null}function Se(e,t,n,r,i){let a=H(e.pathname,r),o=H(t.pathname,r);return(n?.exact?a!==o:!a.startsWith(o)||a.length!==o.length&&a[o.length]!==`/`)||(n?.includeSearch??!0)&&!E(e.search,t.search,!n?.exact,n?.explicitUndefined)?!1:!n?.includeHash||i&&e.hash===t.hash}function Ce(e,t,n){let r=W(),i=g.useRef(null),a=g.useCallback(e=>{if(i.current=e,typeof t==`function`)return t(e);t&&(t.current=e)},[t]),{activeOptions:o,to:s,preload:c,preloadDelay:l,hashScrollIntoView:u,replace:d,startTransition:f,resetScroll:p,viewTransition:m,ignoreBlocker:h,disabled:_,target:v,onClick:y,onBlur:b,onFocus:x,onMouseEnter:S,onMouseLeave:C,onTouchStart:w}=e,T=de(!!o?.includeHash),[E,ee,D]=ye(e.search,e.params,o),[O,k]=g.useMemo(()=>[e,{...e}],[r,e.from,e._fromLocation,e.hash,e.to,E,ee,e.state,e.mask,e.unsafeRelative]),j=g.useMemo(()=>{let e=xe(s,r.protocolAllowlist);if(e!==void 0){let t=[e??void 0];return()=>t}let t,n;return e=>{O._fromLocation||(k._fromLocation=e);let i=r.buildLocation(k),a=Oe(i,r,_);return(!t||t[0]!==a)&&(t=[a,!(_||a&&!A(a))&&void 0],n=[a,!0]),t[1]!==void 0&&Se(e,i,D,r.basepath,T)?n:t}},[D,_,T,O,k,r,s]),[M,N]=ge(r.stores.location,j,be),P=N===void 0&&M,F=_||M===void 0,I=g.useRef(!1),L=e.reloadDocument||P||F?!1:c??r.options.defaultPreload,R=l??r.options.defaultPreloadDelay??0,z=g.useCallback(e=>{let t=e?.isIntersecting;if(!(t??L===`intent`)){t===!1&&J(i);return}if(!R){G(r,O);return}q.has(i)||q.set(i,setTimeout(()=>{q.delete(i),G(r,O)},R))},[r,O,i,L,R]);g.useEffect(()=>{if(!L)return;L===`render`&&!I.current&&(I.current=!0,G(r,O));let e=!0,t;return L===`viewport`&&i.current&&typeof IntersectionObserver==`function`&&(t=new IntersectionObserver(t=>{e&&z(t.pop())},{rootMargin:`100px`}),t.observe(i.current)),()=>{e=!1,t?.disconnect(),J(i)}},[r,O,L,z,i]);let B=Ee(e,n);if(B.ref=t?a:i,P)return B.href=P,B;let V=e=>{let t=v??e.currentTarget.getAttribute(`target`);!F&&!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&(!t||t===`_self`)&&e.button===0&&(e.preventDefault(),r.navigate({...O,replace:d,resetScroll:p,hashScrollIntoView:u,startTransition:f,viewTransition:m,ignoreBlocker:h}))},te=()=>{L===`intent`&&G(r,O)},H=()=>{L===`intent`&&J(i)};return B.onClick=Y(y,V),B.onBlur=Y(b,H),B.onFocus=Y(x,z),B.onMouseEnter=Y(S,z),B.onMouseLeave=Y(C,H),B.onTouchStart=Y(w,te),De(B,e,N,M,F,n)}var we={},Te={className:`active`},K=new Set([`to`,`params`,`search`,`hash`,`state`,`mask`,`from`,`unsafeRelative`,`_fromLocation`,`reloadDocument`,`preload`,`preloadDelay`,`preloadIntentProximity`,`hashScrollIntoView`,`replace`,`startTransition`,`resetScroll`,`viewTransition`,`ignoreBlocker`,`activeProps`,`inactiveProps`,`activeOptions`,`_asChild`]);function Ee(e,t){let n={};for(let r in e)K.has(r)||r===`type`&&t!==void 0||r===`disabled`&&t===`a`||(n[r]=e[r]);return n}function De(e,t,n,r,i,a){let{activeProps:o,inactiveProps:s,className:c,style:l,target:u}=t,d=y(n?o:s,{})??(n?Te:we);Object.assign(e,d),e.href=r,a!==`a`&&(e.disabled=i),e.target=u;let f=d.style;(l||f)&&(e.style=l&&f?{...l,...f}:l||f);let p=d.className;return(c||p)&&(e.className=c?p?`${c} ${p}`:c:p),i&&(e.role=`link`,e[`aria-disabled`]=!0),n&&(e[`data-status`]=`active`,e[`aria-current`]=`page`),e}var q=new WeakMap,J=e=>{clearTimeout(q.get(e)),q.delete(e)},Y=(e,t)=>e?n=>n.defaultPrevented||(e(n),n.defaultPrevented||t(n)):t;function Oe(e,t,n){if(n)return;let r=e.maskedLocation??e,i=r.external?r.publicHref:t.history.createHref(r.publicHref)||`/`;if(!r.external&&i===r.publicHref||!M(i,t.protocolAllowlist))return i}function ke(e){return g.forwardRef(function(t,n){return(0,U.jsx)(Ae,{...t,_asChild:e,ref:n})})}var Ae=g.memo(g.forwardRef((e,t)=>{let n=e._asChild||`a`,r=Ce(e,t,n),i=typeof e.children==`function`?e.children({isActive:r[`data-status`]===`active`}):e.children;return g.createElement(n,r,i)}),je);function je(e,t){let n=0;for(let r in t)if(n++,e[r]!==t[r]&&(!K.has(r)||!E(e[r],t[r],!1,!0)))return!1;for(let t in e)n--;return n===0}var Me=e=>e,Ne=e=>e instanceof m&&e.status===401,Pe=e=>e instanceof m&&e.status===403,Fe=e=>e instanceof m&&e.status===404,Ie=e=>e instanceof m&&e.status===409,X=(e,t)=>e instanceof m&&e.code===t,Le=e=>{if(!X(e,`SCHEMA_INVALID`))return[];let t=e.details?.issues;return Array.isArray(t)?t:[]},Z=h({queryKey:i.me,queryFn:async()=>{try{let e=await f.auth.me();return p(e.csrfToken),e}catch(e){if(Ne(e))return null;if(X(e,`SITE_NOT_FOUND`)&&!u().explicit)return a(),new Promise(()=>void 0);throw e}},staleTime:6e4}),Re=h({queryKey:i.setupStatus,queryFn:()=>f.setup.status(),staleTime:1/0}),ze=()=>s(Z),Be=()=>s(Re),Q=async(e,t)=>{p(t.csrfToken),e.removeQueries({predicate:e=>e.queryKey[0]!==i.me[0]}),e.setQueryData(i.setupStatus,e=>({requiresToken:!1,...e,required:!1})),await e.fetchQuery({...Z,staleTime:0})},$={silent:!0},Ve=()=>{let e=l();return r({mutationKey:[`auth`,`login`],meta:$,mutationFn:e=>o(()=>f.auth.login(e)),onSuccess:t=>Q(e,t)})},He=()=>{let e=l();return r({mutationKey:[`setup`],meta:$,mutationFn:e=>o(()=>f.setup.complete(e)),onSuccess:t=>Q(e,t)})},Ue=()=>{let e=l();return r({mutationKey:[`auth`,`acceptInvitation`],meta:$,mutationFn:e=>o(()=>f.invitations.accept(e)),onSuccess:t=>Q(e,t)})},We=()=>{let e=l();return r({mutationKey:[`auth`,`logout`],mutationFn:()=>o(()=>f.auth.logout()),onSettled:()=>{d(),e.setQueryData(i.me,null),e.removeQueries({predicate:e=>e.queryKey[0]!==i.me[0]})}})},Ge=()=>r({mutationKey:[`auth`,`requestPasswordReset`],meta:$,mutationFn:e=>o(()=>f.auth.requestPasswordReset(e))}),Ke=e=>s({queryKey:i.invitationInspect(e??``),queryFn:()=>f.invitations.inspect(e??``),enabled:!!e,retry:!1,staleTime:1/0,meta:{silent:!0}}),qe=()=>r({mutationKey:[`auth`,`confirmPasswordReset`],meta:$,mutationFn:e=>o(()=>f.auth.confirmPasswordReset(e))}),Je=()=>{let e=l();return r({mutationKey:[`auth`,`updateProfile`],meta:$,mutationFn:e=>o(()=>f.auth.updateProfile(e)),onSuccess:t=>e.setQueryData(i.me,e=>e&&{...e,user:t})})},Ye=()=>r({mutationKey:[`auth`,`changePassword`],meta:$,mutationFn:e=>o(()=>f.auth.changePassword(e)),onSuccess:({csrfToken:e})=>p(e)}),Xe=e=>{let{data:t}=ze();return t?.globalPermissions.includes(e)??!1};export{_ as $,z as A,I as B,Me as C,W as D,ge as E,B as F,A as G,L as H,V as I,M as J,x as K,k as L,oe as M,ne as N,pe as O,te as P,w as Q,R,ke as S,_e as T,F as U,E as V,y as W,C as X,v as Y,j as Z,Pe as _,qe as a,Le as b,Ve as c,Ge as d,h as et,He as f,Ie as g,X as h,Ye as i,re as j,ue as k,We as l,Je as m,Re as n,Xe as o,Be as p,b as q,Ue as r,Ke as s,Z as t,ze as u,Fe as v,ve as w,Ae as x,Ne as y,S as z};
|
|
2
|
-
//# sourceMappingURL=auth-C4fHG9Iu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-C4fHG9Iu.js","names":["useCallback","useSyncExternalStoreWithSelector","__toESM","require_jsx_runtime","useMutation","queryKeys","leaveUnknownSite","withCsrf","useQuery","require_with_selector","useQueryClient","currentSite","resetCsrfToken","adminApi","setCsrfToken","queryOptions","options","import_react","require_react","useLayoutEffect","last","arr","functionalUpdate","updater","previous","hasOwn","hasKeys","key","obj","createNull","nullReplaceEqualDeep","replaceEqualDeep","prev","next","array","isPlainObject","prevKeys","previousCount","nextKeys","length","i","child","_nullProto","_depth","equal","unchanged","incoming","copy","j","o","deepEqual","a","b","l","av","bv","partial","explicitUndefined","k","aCount","PATH_UNSAFE_RE","sanitizePathSegment","segment","ch","decodeSegment","decoded","match","DEFAULT_PROTOCOL_ALLOWLIST","getUrlScheme","url","protocolRelativePrefixRegex","isDangerousProtocol","scheme","allowlist","HTML_ESCAPE_LOOKUP","HTML_ESCAPE_REGEX","escapeHtml","str","decodePath","path","result","re","cursor","encodePathLikeUrl","arraysEqual","cleanPath","trimPathLeft","trimPathRight","len","trimPath","removeTrailingSlash","value","basepath","resolvePath","to","trailingSlash","isBase","cache","base","cached","baseSegments","toSegments","index","joined","compileDecodeCharMap","charMap","pathParamsAllowedCharacters","char","regex","encoded","isMissingSplat","encodeParam","splat","decoder","interpolatePath","part","segments","kind","prefix","rawSuffix","suffix","paramValue","params","usedParams","preloadWarning","import_jsx_runtime","getSnapshot","getServerSnapshot","ClientOnly","useHydrated","children","fallback","subscribe","enabled","routerContext","useRouter","import_with_selector","defaultCompare","useSelector","s","compare","source","handleStoreChange","unsubscribe","selector","useNavigate","router","_defaultOpts","Navigate","navigate","previousPropsRef","props","useStableValues","values","ref","stable","preloadLink","err","LINK_SELECTOR_OPTIONS","resolveExternalLink","protocolAllowlist","resolveIsActive","currentPath","location","nextPath","activeOptions","isHydrated","useLinkProps","innerRef","mergedRef","element","forwardedRef","userPreload","userPreloadDelay","stableSearch","stableParams","stableActiveOptions","_options","dest","selectLinkState","directExternalLink","state","inactive","active","href","getHrefOption","disabled","isActive","externalLink","linkDisabled","hasRenderFetched","preload","preloadDelay","enqueuePreload","isIntersecting","cancelPreload","timeoutMap","observer","entries","collectElementProps","host","handleClick","effectiveTarget","target","handleTouchStart","handleLeave","composeHandlers","onClick","onBlur","onFocus","onMouseEnter","onMouseLeave","onTouchStart","applyLinkState","STATIC_EMPTY_OBJECT","STATIC_ACTIVE_OBJECT","ROUTER_OPTION_KEYS","stateProps","activeProps","inactiveProps","stateStyle","style","stateClassName","className","eventTarget","first","event","second","createLink","Link","Comp","linkProps","areLinkPropsEqual","extraKeys","_key","linkOptions","isUnauthorized","error","ShapioApiError","isForbidden","isNotFound","isConflict","hasErrorCode","code","schemaIssuesOf","issues","meQueryOptions","me","setupStatusQueryOptions","useMe","useSetupStatus","startSession","started","queryClient","query","silent","useLogin","input","useSetup","useAcceptInvitation","useLogout","useRequestPasswordReset","useInspectInvitation","token","useConfirmPasswordReset","useUpdateProfile","current","useChangePassword","csrfToken","useHasGlobalPermission","action"],"sources":["../../../../node_modules/.pnpm/@tanstack+react-query@5.104.0_react@19.3.0/node_modules/@tanstack/react-query/build/modern/queryOptions.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/utils.js","../../../../node_modules/.pnpm/@tanstack+router-core@1.171.34/node_modules/@tanstack/router-core/dist/esm/utils.js","../../../../node_modules/.pnpm/@tanstack+router-core@1.171.34/node_modules/@tanstack/router-core/dist/esm/path.js","../../../../node_modules/.pnpm/@tanstack+router-core@1.171.34/node_modules/@tanstack/router-core/dist/esm/link.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/ClientOnly.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/routerContext.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/useRouter.js","../../../../node_modules/.pnpm/@tanstack+react-store@0.11.2_react-dom@19.3.0_react@19.3.0__react@19.3.0/node_modules/@tanstack/react-store/dist/useSelector.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/useNavigate.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/link.js","../../src/api/errors.ts","../../src/api/auth.ts"],"sourcesContent":["//#region src/queryOptions.ts\nfunction queryOptions(options) {\n\treturn options;\n}\n//#endregion\nexport { queryOptions };\n\n//# sourceMappingURL=queryOptions.js.map","\"use client\";\nimport * as React$1 from \"react\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\n/**\n* React.use if available (React 19+), undefined otherwise.\n* Use dynamic lookup to avoid Webpack compilation errors with React 18.\n*/\nvar reactUse = React$1[\"use\"];\nvar useLayoutEffect = isServer ?? typeof window === \"undefined\" ? React$1.useEffect : React$1.useLayoutEffect;\n//#endregion\nexport { reactUse, useLayoutEffect };\n\n//# sourceMappingURL=utils.js.map","import { isServer } from \"@tanstack/router-core/isServer\";\n//#region src/utils.ts\n/**\n* Return the last element of an array.\n* Intended for non-empty arrays used within router internals.\n*/\nfunction last(arr) {\n\treturn arr[arr.length - 1];\n}\n/**\n* Apply a value-or-updater to a previous value.\n* Accepts either a literal value or a function of the previous value.\n*/\nfunction functionalUpdate(updater, previous) {\n\tif (typeof updater === \"function\") return updater(previous);\n\treturn updater;\n}\nconst hasOwn = Object.prototype.hasOwnProperty;\nfunction hasKeys(obj) {\n\tfor (const key in obj) if (hasOwn.call(obj, key)) return true;\n\treturn false;\n}\nconst createNull = () => Object.create(null);\nconst nullReplaceEqualDeep = (prev, next) => replaceEqualDeep(prev, next, true);\nfunction replaceEqualDeep(prev, next, _nullProto, _depth = 0) {\n\tif (isServer) return next;\n\tif (prev === next) return prev;\n\tif (_depth++ > 500) return next;\n\tconst array = Array.isArray(prev) && Array.isArray(next);\n\tif (!array && !(isPlainObject(prev) && isPlainObject(next))) return next;\n\tconst prevKeys = Object.keys(prev);\n\tconst previousCount = prevKeys.length;\n\tconst nextKeys = Object.keys(next);\n\tconst length = nextKeys.length;\n\tif (array ? previousCount !== prev.length || length !== next.length || previousCount && last(prevKeys) !== `${previousCount - 1}` || length && last(nextKeys) !== `${length - 1}` : previousCount !== Object.getOwnPropertyNames(prev).length || length !== Object.getOwnPropertyNames(next).length || Object.getOwnPropertySymbols(next).length) return next;\n\tlet i = 0;\n\tlet child;\n\tlet previous;\n\tlet key;\n\tif (array) {\n\t\tfor (; i < length; i++) {\n\t\t\tkey = i;\n\t\t\tprevious = prev[key];\n\t\t\tchild = next[key];\n\t\t\tchild = previous === child ? previous : typeof previous === \"object\" ? replaceEqualDeep(previous, child, _nullProto, _depth) : child;\n\t\t\tif (child !== previous) break;\n\t\t}\n\t\tif (i === length && previousCount === length) return prev;\n\t} else {\n\t\tlet equal = previousCount === length;\n\t\tlet unchanged = true;\n\t\tfor (; i < length; i++) {\n\t\t\tkey = nextKeys[i];\n\t\t\tprevious = prev[key];\n\t\t\tconst incoming = next[key];\n\t\t\tchild = previous === incoming ? previous : typeof previous === \"object\" ? replaceEqualDeep(previous, incoming, _nullProto, _depth) : incoming;\n\t\t\tequal &&= child === previous && (prevKeys[i] === key || hasOwn.call(prev, key));\n\t\t\tunchanged &&= Object.is(child, incoming);\n\t\t\tprevKeys[i] = child;\n\t\t}\n\t\tif (equal) return Object.getOwnPropertySymbols(prev).length ? next : prev;\n\t\tif (unchanged) return next;\n\t}\n\tconst copy = array ? nextKeys.fill(0) : _nullProto ? createNull() : {};\n\tfor (let j = 0; j < length; j++) {\n\t\tkey = array ? j : nextKeys[j];\n\t\tif (array) {\n\t\t\tprevious = prev[key];\n\t\t\tif (j > i) {\n\t\t\t\tchild = next[key];\n\t\t\t\tchild = previous === child ? previous : typeof previous === \"object\" ? replaceEqualDeep(previous, child, _nullProto, _depth) : child;\n\t\t\t}\n\t\t\tcopy[key] = j < i ? previous : child;\n\t\t} else copy[key] = prevKeys[j];\n\t}\n\treturn copy;\n}\nfunction isPlainObject(o) {\n\tif (!o || typeof o !== \"object\") return false;\n\treturn (Object.getPrototypeOf(o)?.constructor ?? Object) === Object;\n}\n/**\n* Perform a deep equality check optimized for router state comparisons.\n*\n* - `partial`: `b` may omit keys that `a` has (arrays stay length-exact).\n* - `explicitUndefined`: keys holding `undefined` take part in the comparison\n* instead of being ignored.\n*\n* Internal: the flags are positional so hot callers pass no options object.\n*/\nfunction deepEqual(a, b, partial, explicitUndefined) {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) {\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0, l = a.length; i < l; i++) {\n\t\t\tconst av = a[i];\n\t\t\tconst bv = b[i];\n\t\t\tif (av !== bv && !deepEqual(av, bv, partial, explicitUndefined)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tif (isPlainObject(a) && isPlainObject(b)) {\n\t\tif (partial) {\n\t\t\tfor (const k in b) if (explicitUndefined || b[k] !== void 0) {\n\t\t\t\tif (!deepEqual(a[k], b[k], partial, explicitUndefined)) return false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tlet aCount = 0;\n\t\tif (explicitUndefined) aCount = Object.keys(a).length;\n\t\telse for (const k in a) if (a[k] !== void 0) aCount++;\n\t\tfor (const k in b) if (explicitUndefined || b[k] !== void 0) {\n\t\t\tif (aCount-- === 0 || !deepEqual(a[k], b[k], partial, explicitUndefined)) return false;\n\t\t}\n\t\treturn aCount === 0;\n\t}\n\treturn false;\n}\n/**\n* Create a promise with exposed resolve/reject and status fields.\n* Useful for coordinating async router lifecycle operations.\n*/\nfunction createControlledPromise(onResolve) {\n\tlet resolveLoadPromise;\n\tlet rejectLoadPromise;\n\tconst controlledPromise = new Promise((resolve, reject) => {\n\t\tresolveLoadPromise = resolve;\n\t\trejectLoadPromise = reject;\n\t});\n\tcontrolledPromise.status = \"pending\";\n\tcontrolledPromise.resolve = (value) => {\n\t\tcontrolledPromise.status = \"resolved\";\n\t\tcontrolledPromise.value = value;\n\t\tresolveLoadPromise(value);\n\t\tonResolve?.(value);\n\t};\n\tcontrolledPromise.reject = (e) => {\n\t\tcontrolledPromise.status = \"rejected\";\n\t\trejectLoadPromise(e);\n\t};\n\treturn controlledPromise;\n}\n/**\n* Heuristically detect dynamic import \"module not found\" errors\n* across major browsers for lazy route component handling.\n*/\nfunction isModuleNotFoundError(error) {\n\tif (typeof error?.message !== \"string\") return false;\n\treturn error.message.startsWith(\"Failed to fetch dynamically imported module\") || error.message.startsWith(\"error loading dynamically imported module\") || error.message.startsWith(\"Importing a module script failed\");\n}\nfunction isPromise(value) {\n\treturn Boolean(value && typeof value === \"object\" && typeof value.then === \"function\");\n}\nfunction findLast(array, predicate) {\n\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\tconst item = array[i];\n\t\tif (predicate(item)) return item;\n\t}\n}\n/**\n* Re-encode characters that are unsafe in URL paths.\n* Includes ASCII control characters (0x00-0x1F, 0x7F) and a subset of the\n* WHATWG URL \"path percent-encode set\" (\", <, >, `, {, }).\n*\n* Space (0x20) is intentionally excluded — decodeURI decodes %20 to space\n* and the router stores decoded spaces in location.pathname. The existing\n* encodePathLikeUrl already handles re-encoding spaces for outgoing URLs.\n*\n* These characters are decoded by decodeURI but must remain percent-encoded\n* in paths to match how upstream layers (CDNs, edge middleware, browsers)\n* interpret the URL, preventing infinite redirect loops and path mismatches.\n*/\nconst PATH_UNSAFE_RE = /[\\x00-\\x1f\\x7f\"<>`{}]/g;\nfunction sanitizePathSegment(segment) {\n\treturn segment.replace(PATH_UNSAFE_RE, (ch) => \"%\" + ch.charCodeAt(0).toString(16).toUpperCase().padStart(2, \"0\"));\n}\nfunction decodeSegment(segment) {\n\tlet decoded;\n\ttry {\n\t\tdecoded = decodeURI(segment);\n\t} catch {\n\t\tdecoded = segment.replaceAll(/%[0-9A-F]{2}/gi, (match) => {\n\t\t\ttry {\n\t\t\t\treturn decodeURI(match);\n\t\t\t} catch {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t});\n\t}\n\treturn sanitizePathSegment(decoded);\n}\n/**\n* Default list of URL protocols to allow in links, redirects, and navigation.\n* Any absolute URL protocol not in this list is treated as dangerous by default.\n*/\nconst DEFAULT_PROTOCOL_ALLOWLIST = [\n\t\"http:\",\n\t\"https:\",\n\t\"mailto:\",\n\t\"tel:\"\n];\n/**\n* Extract the explicit URL scheme, including its colon, using WHATWG\n* normalization rules. This does not validate the rest of the URL.\n*\n* Returning `undefined` means \"no explicit scheme\", not \"safe URL\";\n* protocol-relative URLs such as \"//evil.example\" require a separate check.\n*/\nfunction getUrlScheme(url) {\n\tif (url[0] === \"/\") return;\n\tif (!url.includes(\":\")) return;\n\treturn /^[\\x00-\\x20]*([a-z][a-z\\d+.\\t\\n\\r-]*:)/i.exec(url)?.[1]?.replace(/[\\t\\n\\r]/g, \"\").toLowerCase();\n}\nconst protocolRelativePrefixRegex = /^[\\x00-\\x20]*[\\\\/][\\t\\n\\r]*[\\\\/]/;\n/**\n* Check if a URL string uses a protocol that is not in the allowlist or is\n* protocol-relative (e.g. \"//evil.example\"), which can navigate to another host.\n* Returns true for blocked protocols like javascript:, blob:, and data:, as\n* well as slash/backslash variants of protocol-relative URLs.\n*\n* Scheme parsing normalizes:\n* - Mixed case (JavaScript: → javascript:)\n* - Whitespace/control characters (java\\nscript: → javascript:)\n* - Leading whitespace\n*\n* For relative URLs without a protocol-relative prefix, returns false.\n*\n* @param url - The URL string to check\n* @param allowlist - Set of protocols to allow\n* @returns true if the URL uses a protocol that is not allowed or can escape\n* the current origin through a protocol-relative URL\n*/\nfunction isDangerousProtocol(url, allowlist) {\n\tif (!url) return false;\n\tif (protocolRelativePrefixRegex.test(url)) return true;\n\tconst scheme = getUrlScheme(url);\n\treturn scheme ? !allowlist.has(scheme) : false;\n}\nconst HTML_ESCAPE_LOOKUP = {\n\t\"&\": \"\\\\u0026\",\n\t\">\": \"\\\\u003e\",\n\t\"<\": \"\\\\u003c\",\n\t\"\\u2028\": \"\\\\u2028\",\n\t\"\\u2029\": \"\\\\u2029\"\n};\nconst HTML_ESCAPE_REGEX = /[&><\\u2028\\u2029]/g;\n/**\n* Escape HTML special characters in a string to prevent XSS attacks\n* when embedding strings in script tags during SSR.\n*\n* This is essential for preventing XSS vulnerabilities when user-controlled\n* content is embedded in inline scripts.\n*/\nfunction escapeHtml(str) {\n\treturn str.replace(HTML_ESCAPE_REGEX, (match) => HTML_ESCAPE_LOOKUP[match]);\n}\nfunction decodePath(path) {\n\tif (!path) return path;\n\tlet result = path;\n\tif (/[%\\\\\\x00-\\x1f\\x7f]/.test(path)) {\n\t\tconst re = /%25|%5C/gi;\n\t\tlet cursor = 0;\n\t\tlet match;\n\t\tresult = \"\";\n\t\twhile (null !== (match = re.exec(path))) {\n\t\t\tresult += decodeSegment(path.slice(cursor, match.index)) + match[0];\n\t\t\tcursor = re.lastIndex;\n\t\t}\n\t\tresult += decodeSegment(cursor ? path.slice(cursor) : path);\n\t}\n\treturn result;\n}\n/**\n* Encodes a path the same way `new URL()` would, but without the overhead of full URL parsing.\n*\n* This function encodes:\n* - Whitespace characters (spaces → %20, tabs → %09, etc.)\n* - Non-ASCII/Unicode characters (emojis, accented characters, etc.)\n*\n* It preserves:\n* - Already percent-encoded sequences (won't double-encode %2F, %25, etc.)\n* - ASCII special characters valid in URL paths (@, $, &, +, etc.)\n* - Forward slashes as path separators\n*\n* Used to generate proper href values for SSR without constructing URL objects.\n*\n* @example\n* encodePathLikeUrl('/path/file name.pdf') // '/path/file%20name.pdf'\n* encodePathLikeUrl('/path/日本語') // '/path/%E6%97%A5%E6%9C%AC%E8%AA%9E'\n* encodePathLikeUrl('/path/already%20encoded') // '/path/already%20encoded' (preserved)\n*/\nfunction encodePathLikeUrl(path) {\n\tif (!/[\\s\\u0080-\\uFFFF]/.test(path)) return path;\n\treturn path.replace(/\\s|[^\\u0000-\\u007F]/gu, encodeURIComponent);\n}\n/**\n* Builds the dev-mode CSS styles URL for route-scoped CSS collection.\n* Used by HeadContent components in all framework implementations to construct\n* the URL for the `/@tanstack-start/styles.css` endpoint.\n*\n* @param basepath - The router's basepath (may or may not have leading slash)\n* @param routeIds - Array of matched route IDs to include in the CSS collection\n* @returns The full URL path for the dev styles CSS endpoint\n*/\nfunction buildDevStylesUrl(basepath, routeIds) {\n\tconst trimmedBasepath = basepath.replace(/^\\/+|\\/+$/g, \"\");\n\treturn `${trimmedBasepath === \"\" ? \"\" : `/${trimmedBasepath}`}/@tanstack-start/styles.css?routes=${encodeURIComponent(routeIds.join(\",\"))}`;\n}\nfunction arraysEqual(a, b) {\n\tif (a === b) return true;\n\tif (a.length !== b.length) return false;\n\tfor (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n\treturn true;\n}\n//#endregion\nexport { DEFAULT_PROTOCOL_ALLOWLIST, arraysEqual, buildDevStylesUrl, createControlledPromise, createNull, decodePath, deepEqual, encodePathLikeUrl, escapeHtml, findLast, functionalUpdate, getUrlScheme, hasKeys, hasOwn, isDangerousProtocol, isModuleNotFoundError, isPromise, last, nullReplaceEqualDeep, protocolRelativePrefixRegex, replaceEqualDeep };\n\n//# sourceMappingURL=utils.js.map","import { last } from \"./utils.js\";\n//#region src/path.ts\n/** Join path segments, cleaning duplicate slashes between parts. */\nfunction joinPaths(paths) {\n\treturn cleanPath(paths.filter((val) => {\n\t\treturn val !== void 0;\n\t}).join(\"/\"));\n}\n/** Remove repeated slashes from a path string. */\nfunction cleanPath(path) {\n\treturn path.replace(/\\/{2,}/g, \"/\");\n}\n/** Trim leading slashes (except preserving root '/'). */\nfunction trimPathLeft(path) {\n\treturn path === \"/\" ? path : path.replace(/^\\/+/, \"\");\n}\n/** Trim trailing slashes (except preserving root '/'). */\nfunction trimPathRight(path) {\n\tconst len = path.length;\n\treturn len > 1 && path[len - 1] === \"/\" ? path.replace(/\\/+$/, \"\") : path;\n}\n/** Trim both leading and trailing slashes. */\nfunction trimPath(path) {\n\treturn trimPathRight(trimPathLeft(path));\n}\n/** Remove a trailing slash from value when appropriate for comparisons. */\nfunction removeTrailingSlash(value, basepath) {\n\tif (value?.endsWith(\"/\") && value !== \"/\" && value !== `${basepath}/`) return value.slice(0, -1);\n\treturn value;\n}\n/**\n* Compare two pathnames for exact equality after normalizing trailing slashes\n* relative to the provided `basepath`.\n*/\nfunction exactPathTest(pathName1, pathName2, basepath) {\n\treturn removeTrailingSlash(pathName1, basepath) === removeTrailingSlash(pathName2, basepath);\n}\n/**\n* Resolve a destination path against a base, honoring trailing-slash policy\n* and supporting relative segments (`.`/`..`) and absolute `to` values.\n*\n* Internal: parameters are positional so the router's hot callers pass no\n* options object.\n*/\nfunction resolvePath(base, to, trailingSlash = \"never\", cache) {\n\tif (to.includes(\"//\")) to = cleanPath(to);\n\tif (to.startsWith(\"/\")) {\n\t\tif (to.length === 1 || trailingSlash === \"preserve\") return to;\n\t\tif (trailingSlash === \"always\") return to.endsWith(\"/\") ? to : `${to}/`;\n\t\treturn to.endsWith(\"/\") ? to.slice(0, -1) : to;\n\t}\n\tconst isBase = to === \".\";\n\tlet key;\n\tif (cache) {\n\t\tkey = isBase ? base : base + \"\\0\" + to;\n\t\tconst cached = cache.get(key);\n\t\tif (cached) return cached;\n\t}\n\tlet baseSegments;\n\tif (isBase) baseSegments = base.split(\"/\");\n\telse {\n\t\tif (base.includes(\"//\")) base = cleanPath(base);\n\t\tbaseSegments = base.split(\"/\");\n\t\twhile (baseSegments.length > 1 && last(baseSegments) === \"\") baseSegments.pop();\n\t\tconst toSegments = to.split(\"/\");\n\t\tfor (let index = 0, length = toSegments.length; index < length; index++) {\n\t\t\tconst value = toSegments[index];\n\t\t\tif (value === \"\") {\n\t\t\t\tif (!index) baseSegments = [value];\n\t\t\t\telse if (index === length - 1) baseSegments.push(value);\n\t\t\t} else if (value === \"..\") if (baseSegments.length > 1) baseSegments.pop();\n\t\t\telse baseSegments = [\"\"];\n\t\t\telse if (value === \".\") {} else baseSegments.push(value);\n\t\t}\n\t}\n\tif (baseSegments.length > 1) {\n\t\tif (last(baseSegments) === \"\") {\n\t\t\tif (trailingSlash === \"never\") baseSegments.pop();\n\t\t} else if (trailingSlash === \"always\") baseSegments.push(\"\");\n\t}\n\tconst joined = baseSegments.join(\"/\");\n\tconst result = (isBase ? cleanPath(joined) : joined) || \"/\";\n\tif (key && cache) cache.set(key, result);\n\treturn result;\n}\n/**\n* Create a pre-compiled decode config from allowed characters.\n* Created once for the router's fixed encoding configuration.\n*/\nfunction compileDecodeCharMap(pathParamsAllowedCharacters) {\n\tconst charMap = new Map(pathParamsAllowedCharacters.map((char) => [encodeURIComponent(char), char]));\n\tconst regex = new RegExp([...charMap.keys()].join(\"|\").replace(/[.*()]/g, \"\\\\$&\"), \"g\");\n\treturn (encoded) => encoded.replace(regex, (match) => charMap.get(match) ?? match);\n}\nfunction getRouteSegments(route) {\n\treturn route._interpolation;\n}\n/** A splat is missing when it has no value; `0` and `false` are stringified like any other param. */\nfunction isMissingSplat(value) {\n\treturn value == null || value === \"\";\n}\n/** Devtools checks navigation availability separately from the hot formatter. */\nfunction hasMissingPathParams(segments, params) {\n\treturn segments.some((part) => {\n\t\tif (typeof part === \"string\") return false;\n\t\tconst [kind, key] = part;\n\t\treturn kind === 2 ? isMissingSplat(params[key]) : kind === 1 && !(key in params);\n\t});\n}\nfunction encodeParam(key, value, decoder) {\n\tif (typeof value !== \"string\") return \"\" + (value ?? void 0);\n\tconst splat = key === \"_splat\";\n\tif (splat && (!value || /^[a-zA-Z0-9\\-._~!/]*$/.test(value))) return value;\n\tlet encoded = encodeURIComponent(value);\n\tif (splat) encoded = encoded.replaceAll(\"%2F\", \"/\");\n\treturn decoder ? decoder(encoded) : encoded;\n}\n/** Substitute current values into parsed segments, optionally collecting raw params. */\nfunction interpolatePath(path, segments, params, decoder, usedParams) {\n\tconst trailingSlash = path.endsWith(\"/\") ? \"/\" : \"\";\n\tlet joined = \"\";\n\tfor (const part of segments) {\n\t\tif (typeof part === \"string\") {\n\t\t\tjoined += part;\n\t\t\tcontinue;\n\t\t}\n\t\tconst [kind, key, prefix, rawSuffix] = part;\n\t\tconst splat = kind === 2;\n\t\tconst suffix = splat && rawSuffix !== void 0 ? rawSuffix + trailingSlash : rawSuffix;\n\t\tlet paramValue = params[key];\n\t\tif (kind === 3 && paramValue == null) continue;\n\t\tif (usedParams) {\n\t\t\tusedParams[key] = paramValue;\n\t\t\tif (splat) usedParams[\"*\"] = paramValue;\n\t\t}\n\t\tif (splat && isMissingSplat(paramValue)) {\n\t\t\tif (prefix === \"/\" && !suffix) continue;\n\t\t\tparamValue = \"\";\n\t\t}\n\t\tjoined += prefix + encodeParam(key, paramValue, decoder) + (suffix || \"\");\n\t}\n\treturn joined + trailingSlash || \"/\";\n}\n//#endregion\nexport { cleanPath, compileDecodeCharMap, exactPathTest, getRouteSegments, hasMissingPathParams, interpolatePath, joinPaths, removeTrailingSlash, resolvePath, trimPath, trimPathLeft, trimPathRight };\n\n//# sourceMappingURL=path.js.map","//#region src/link.ts\nconst preloadWarning = \"Error preloading route! ☝️\";\n//#endregion\nexport { preloadWarning };\n\n//# sourceMappingURL=link.js.map","\"use client\";\nimport React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/ClientOnly.tsx\nvar getSnapshot = () => true;\nvar getServerSnapshot = () => false;\n/**\n* Render the children only after the JS has loaded client-side. Use an optional\n* fallback component if the JS is not yet loaded.\n*\n* @example\n* Render a Chart component if JS loads, renders a simple FakeChart\n* component server-side or if there is no JS. The FakeChart can have only the\n* UI without the behavior or be a loading spinner or skeleton.\n*\n* ```tsx\n* return (\n* <ClientOnly fallback={<FakeChart />}>\n* <Chart />\n* </ClientOnly>\n* )\n* ```\n*/\nfunction ClientOnly({ children, fallback = null }) {\n\treturn /* @__PURE__ */ jsx(React.Fragment, { children: useHydrated() ? children : fallback });\n}\n/** @internal */\nfunction useHydrated(enabled = true) {\n\treturn React.useSyncExternalStore(subscribe, getSnapshot, enabled ? getServerSnapshot : getSnapshot);\n}\nfunction subscribe() {\n\treturn () => {};\n}\n//#endregion\nexport { ClientOnly, useHydrated };\n\n//# sourceMappingURL=ClientOnly.js.map","\"use client\";\nimport * as React$1 from \"react\";\n//#region src/routerContext.tsx\nvar routerContext = React$1.createContext(null);\n//#endregion\nexport { routerContext };\n\n//# sourceMappingURL=routerContext.js.map","\"use client\";\nimport { routerContext } from \"./routerContext.js\";\nimport * as React$1 from \"react\";\n//#region src/useRouter.tsx\n/**\n* Access the current TanStack Router instance from React context.\n* Must be used within a `RouterProvider`.\n*\n* Options:\n* - `warn`: Log a warning if no router context is found (default: true).\n*\n* @returns The registered router instance.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useRouterHook\n*/\nfunction useRouter(opts) {\n\tconst value = React$1.useContext(routerContext);\n\tif (!value) warnMissingRouter(opts);\n\treturn value;\n}\nfunction warnMissingRouter(opts) {\n\tif (process.env.NODE_ENV !== \"production\" && (opts?.warn ?? true)) console.warn(\"Warning: useRouter must be used inside a <RouterProvider> component!\");\n}\n//#endregion\nexport { useRouter };\n\n//# sourceMappingURL=useRouter.js.map","import { useCallback } from \"react\";\nimport { useSyncExternalStoreWithSelector } from \"use-sync-external-store/shim/with-selector\";\n\n//#region src/useSelector.ts\nfunction defaultCompare(a, b) {\n\treturn a === b;\n}\n/**\n* Selects a slice of state from an atom or store and subscribes the component\n* to that selection.\n*\n* This is the primary React read hook for TanStack Store. It works with any\n* source that exposes `get()` and `subscribe()`, including atoms, readonly\n* atoms, stores, and readonly stores.\n*\n* Omit the selector to subscribe to the whole value.\n*\n* @example\n* ```tsx\n* const count = useSelector(counterStore, (state) => state.count)\n* ```\n*\n* @example\n* ```tsx\n* const value = useSelector(countAtom)\n* ```\n*/\nfunction useSelector(source, selector = (s) => s, options) {\n\tconst compare = options?.compare ?? defaultCompare;\n\tconst subscribe = useCallback((handleStoreChange) => {\n\t\tconst { unsubscribe } = source.subscribe(handleStoreChange);\n\t\treturn unsubscribe;\n\t}, [source]);\n\tconst getSnapshot = useCallback(() => source.get(), [source]);\n\treturn useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, selector, compare);\n}\n\n//#endregion\nexport { useSelector };\n//# sourceMappingURL=useSelector.js.map","\"use client\";\nimport { useLayoutEffect } from \"./utils.js\";\nimport { useRouter } from \"./useRouter.js\";\nimport * as React$1 from \"react\";\n//#region src/useNavigate.tsx\n/**\n* Imperative navigation hook.\n*\n* Returns a stable `navigate(options)` function to change the current location\n* programmatically. Prefer the `Link` component for user-initiated navigation,\n* and use this hook from effects, callbacks, or handlers where imperative\n* navigation is required.\n*\n* Options:\n* - `from`: Optional route base used to resolve relative `to` paths.\n*\n* @returns A function that accepts `NavigateOptions`.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/useNavigateHook\n*/\nfunction useNavigate(_defaultOpts) {\n\tconst router = useRouter();\n\treturn React$1.useCallback((options) => {\n\t\treturn router.navigate({\n\t\t\t...options,\n\t\t\tfrom: options.from ?? _defaultOpts?.from\n\t\t});\n\t}, [_defaultOpts?.from, router]);\n}\n/**\n* Component that triggers a navigation when rendered. Navigation executes\n* in an effect after mount/update.\n*\n* Props are the same as `NavigateOptions` used by `navigate()`.\n*\n* @returns null\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/navigateComponent\n*/\nfunction Navigate(props) {\n\tconst router = useRouter();\n\tconst navigate = useNavigate();\n\tconst previousPropsRef = React$1.useRef(null);\n\tuseLayoutEffect(() => {\n\t\tif (previousPropsRef.current !== props) {\n\t\t\tnavigate(props);\n\t\t\tpreviousPropsRef.current = props;\n\t\t}\n\t}, [\n\t\trouter,\n\t\tprops,\n\t\tnavigate\n\t]);\n\treturn null;\n}\n//#endregion\nexport { Navigate, useNavigate };\n\n//# sourceMappingURL=useNavigate.js.map","\"use client\";\nimport { useHydrated } from \"./ClientOnly.js\";\nimport { useRouter } from \"./useRouter.js\";\nimport { deepEqual, functionalUpdate, getUrlScheme, isDangerousProtocol, preloadWarning, removeTrailingSlash } from \"@tanstack/router-core\";\nimport * as React$1 from \"react\";\nimport { isServer } from \"@tanstack/router-core/isServer\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { useSelector } from \"@tanstack/react-store\";\n//#region src/link.tsx\nfunction useStableValues(...values) {\n\tconst ref = React$1.useRef(values);\n\tconst stable = ref.current;\n\tvalues.forEach((value, index) => {\n\t\tif (!deepEqual(stable[index], value, false, true)) stable[index] = value;\n\t});\n\treturn ref.current;\n}\nfunction preloadLink(router, options) {\n\trouter.preloadRoute(options).catch((err) => {\n\t\tconsole.warn(err);\n\t\tconsole.warn(preloadWarning);\n\t});\n}\nvar LINK_SELECTOR_OPTIONS = { compare: (a, b) => a[0] === b[0] && a[1] === b[1] };\nfunction resolveExternalLink(to, protocolAllowlist) {\n\tconst scheme = typeof to === \"string\" && getUrlScheme(to);\n\tif (!scheme) return;\n\tif (!protocolAllowlist.has(scheme)) {\n\t\tif (process.env.NODE_ENV !== \"production\") console.warn(`Blocked Link with dangerous protocol: ${to}`);\n\t\treturn null;\n\t}\n\treturn to;\n}\nfunction resolveIsActive(location, next, activeOptions, basepath, isHydrated) {\n\tconst currentPath = removeTrailingSlash(location.pathname, basepath);\n\tconst nextPath = removeTrailingSlash(next.pathname, basepath);\n\tif (activeOptions?.exact ? currentPath !== nextPath : !(currentPath.startsWith(nextPath) && (currentPath.length === nextPath.length || currentPath[nextPath.length] === \"/\"))) return false;\n\tif (activeOptions?.includeSearch ?? true) {\n\t\tif (!deepEqual(location.search, next.search, !activeOptions?.exact, activeOptions?.explicitUndefined)) return false;\n\t}\n\tif (activeOptions?.includeHash) return isHydrated && location.hash === next.hash;\n\treturn true;\n}\nfunction useLinkProps(options, forwardedRef, host) {\n\tconst router = useRouter();\n\tif (isServer ?? router.isServer) return getServerLinkProps(router, options, forwardedRef, host);\n\tconst innerRef = React$1.useRef(null);\n\tconst mergedRef = React$1.useCallback((element) => {\n\t\tinnerRef.current = element;\n\t\tif (typeof forwardedRef === \"function\") return forwardedRef(element);\n\t\tif (forwardedRef) forwardedRef.current = element;\n\t}, [forwardedRef]);\n\tconst { activeOptions, to, preload: userPreload, preloadDelay: userPreloadDelay, hashScrollIntoView, replace, startTransition, resetScroll, viewTransition, ignoreBlocker, disabled, target, onClick, onBlur, onFocus, onMouseEnter, onMouseLeave, onTouchStart } = options;\n\tconst isHydrated = useHydrated(!!activeOptions?.includeHash);\n\tconst [stableSearch, stableParams, stableActiveOptions] = useStableValues(options.search, options.params, activeOptions);\n\tconst [_options, dest] = React$1.useMemo(() => [options, { ...options }], [\n\t\trouter,\n\t\toptions.from,\n\t\toptions._fromLocation,\n\t\toptions.hash,\n\t\toptions.to,\n\t\tstableSearch,\n\t\tstableParams,\n\t\toptions.state,\n\t\toptions.mask,\n\t\toptions.unsafeRelative\n\t]);\n\tconst selectLinkState = React$1.useMemo(() => {\n\t\tconst directExternalLink = resolveExternalLink(to, router.protocolAllowlist);\n\t\tif (directExternalLink !== void 0) {\n\t\t\tconst state = [directExternalLink ?? void 0];\n\t\t\treturn () => state;\n\t\t}\n\t\tlet inactive;\n\t\tlet active;\n\t\treturn (location) => {\n\t\t\tif (!_options._fromLocation) dest._fromLocation = location;\n\t\t\tconst next = router.buildLocation(dest);\n\t\t\tconst href = getHrefOption(next, router, disabled);\n\t\t\tif (!inactive || inactive[0] !== href) {\n\t\t\t\tinactive = [href, !(disabled || href && !getUrlScheme(href)) && void 0];\n\t\t\t\tactive = [href, true];\n\t\t\t}\n\t\t\treturn inactive[1] !== void 0 && resolveIsActive(location, next, stableActiveOptions, router.basepath, isHydrated) ? active : inactive;\n\t\t};\n\t}, [\n\t\tstableActiveOptions,\n\t\tdisabled,\n\t\tisHydrated,\n\t\t_options,\n\t\tdest,\n\t\trouter,\n\t\tto\n\t]);\n\tconst [href, isActive] = useSelector(router.stores.location, selectLinkState, LINK_SELECTOR_OPTIONS);\n\tconst externalLink = isActive === void 0 && href;\n\tconst linkDisabled = disabled || href === void 0;\n\tconst hasRenderFetched = React$1.useRef(false);\n\tconst preload = options.reloadDocument || externalLink || linkDisabled ? false : userPreload ?? router.options.defaultPreload;\n\tconst preloadDelay = userPreloadDelay ?? router.options.defaultPreloadDelay ?? 0;\n\tconst enqueuePreload = React$1.useCallback((e) => {\n\t\tconst isIntersecting = e?.isIntersecting;\n\t\tif (!(isIntersecting ?? preload === \"intent\")) {\n\t\t\tif (isIntersecting === false) cancelPreload(innerRef);\n\t\t\treturn;\n\t\t}\n\t\tif (!preloadDelay) {\n\t\t\tpreloadLink(router, _options);\n\t\t\treturn;\n\t\t}\n\t\tif (timeoutMap.has(innerRef)) return;\n\t\ttimeoutMap.set(innerRef, setTimeout(() => {\n\t\t\ttimeoutMap.delete(innerRef);\n\t\t\tpreloadLink(router, _options);\n\t\t}, preloadDelay));\n\t}, [\n\t\trouter,\n\t\t_options,\n\t\tinnerRef,\n\t\tpreload,\n\t\tpreloadDelay\n\t]);\n\tReact$1.useEffect(() => {\n\t\tif (!preload) return;\n\t\tif (preload === \"render\" && !hasRenderFetched.current) {\n\t\t\thasRenderFetched.current = true;\n\t\t\tpreloadLink(router, _options);\n\t\t}\n\t\tlet active = true;\n\t\tlet observer;\n\t\tif (preload === \"viewport\" && innerRef.current && typeof IntersectionObserver === \"function\") {\n\t\t\tobserver = new IntersectionObserver((entries) => {\n\t\t\t\tif (active) enqueuePreload(entries.pop());\n\t\t\t}, { rootMargin: \"100px\" });\n\t\t\tobserver.observe(innerRef.current);\n\t\t}\n\t\treturn () => {\n\t\t\tactive = false;\n\t\t\tobserver?.disconnect();\n\t\t\tcancelPreload(innerRef);\n\t\t};\n\t}, [\n\t\trouter,\n\t\t_options,\n\t\tpreload,\n\t\tenqueuePreload,\n\t\tinnerRef\n\t]);\n\tconst props = collectElementProps(options, host);\n\tprops.ref = forwardedRef ? mergedRef : innerRef;\n\tif (externalLink) {\n\t\tprops.href = externalLink;\n\t\treturn props;\n\t}\n\tconst handleClick = (e) => {\n\t\tconst effectiveTarget = target ?? e.currentTarget.getAttribute(\"target\");\n\t\tif (!linkDisabled && !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) && !e.defaultPrevented && (!effectiveTarget || effectiveTarget === \"_self\") && e.button === 0) {\n\t\t\te.preventDefault();\n\t\t\trouter.navigate({\n\t\t\t\t..._options,\n\t\t\t\treplace,\n\t\t\t\tresetScroll,\n\t\t\t\thashScrollIntoView,\n\t\t\t\tstartTransition,\n\t\t\t\tviewTransition,\n\t\t\t\tignoreBlocker\n\t\t\t});\n\t\t}\n\t};\n\tconst handleTouchStart = () => {\n\t\tif (preload === \"intent\") preloadLink(router, _options);\n\t};\n\tconst handleLeave = () => {\n\t\tif (preload === \"intent\") cancelPreload(innerRef);\n\t};\n\tprops.onClick = composeHandlers(onClick, handleClick);\n\tprops.onBlur = composeHandlers(onBlur, handleLeave);\n\tprops.onFocus = composeHandlers(onFocus, enqueuePreload);\n\tprops.onMouseEnter = composeHandlers(onMouseEnter, enqueuePreload);\n\tprops.onMouseLeave = composeHandlers(onMouseLeave, handleLeave);\n\tprops.onTouchStart = composeHandlers(onTouchStart, handleTouchStart);\n\treturn applyLinkState(props, options, isActive, href, linkDisabled, host);\n}\nvar STATIC_EMPTY_OBJECT = {};\nvar STATIC_ACTIVE_OBJECT = { className: \"active\" };\nvar ROUTER_OPTION_KEYS = /* @__PURE__ */ new Set([\n\t\"to\",\n\t\"params\",\n\t\"search\",\n\t\"hash\",\n\t\"state\",\n\t\"mask\",\n\t\"from\",\n\t\"unsafeRelative\",\n\t\"_fromLocation\",\n\t\"reloadDocument\",\n\t\"preload\",\n\t\"preloadDelay\",\n\t\"preloadIntentProximity\",\n\t\"hashScrollIntoView\",\n\t\"replace\",\n\t\"startTransition\",\n\t\"resetScroll\",\n\t\"viewTransition\",\n\t\"ignoreBlocker\",\n\t\"activeProps\",\n\t\"inactiveProps\",\n\t\"activeOptions\",\n\t\"_asChild\"\n]);\nfunction collectElementProps(options, host) {\n\tconst props = {};\n\tfor (const key in options) {\n\t\tif (ROUTER_OPTION_KEYS.has(key) || key === \"type\" && host !== void 0 || key === \"disabled\" && host === \"a\") continue;\n\t\tprops[key] = options[key];\n\t}\n\treturn props;\n}\nfunction applyLinkState(props, options, isActive, href, linkDisabled, host) {\n\tconst { activeProps, inactiveProps, className, style, target } = options;\n\tconst stateProps = functionalUpdate(isActive ? activeProps : inactiveProps, {}) ?? (isActive ? STATIC_ACTIVE_OBJECT : STATIC_EMPTY_OBJECT);\n\tObject.assign(props, stateProps);\n\tprops.href = href;\n\tif (host !== \"a\") props.disabled = linkDisabled;\n\tprops.target = target;\n\tconst stateStyle = stateProps.style;\n\tif (style || stateStyle) props.style = style && stateStyle ? {\n\t\t...style,\n\t\t...stateStyle\n\t} : style || stateStyle;\n\tconst stateClassName = stateProps.className;\n\tif (className || stateClassName) props.className = className ? stateClassName ? `${className} ${stateClassName}` : className : stateClassName;\n\tif (linkDisabled) {\n\t\tprops.role = \"link\";\n\t\tprops[\"aria-disabled\"] = true;\n\t}\n\tif (isActive) {\n\t\tprops[\"data-status\"] = \"active\";\n\t\tprops[\"aria-current\"] = \"page\";\n\t}\n\treturn props;\n}\nfunction getServerLinkProps(router, options, forwardedRef, host) {\n\tconst { to, disabled, activeOptions } = options;\n\tconst directExternalLink = resolveExternalLink(to, router.protocolAllowlist);\n\tconst next = directExternalLink === void 0 ? router.buildLocation(options) : void 0;\n\tconst hrefOption = next ? getHrefOption(next, router, disabled) : directExternalLink ?? void 0;\n\tconst linkDisabled = disabled || !hrefOption;\n\tconst externalLink = directExternalLink ?? (hrefOption && getUrlScheme(hrefOption) ? hrefOption : void 0);\n\tconst props = collectElementProps(options, host);\n\tprops.ref = forwardedRef;\n\tif (externalLink) {\n\t\tprops.href = externalLink;\n\t\treturn props;\n\t}\n\treturn applyLinkState(props, options, !!next && !(!disabled && !hrefOption) && resolveIsActive(router.stores.location.get(), next, activeOptions, router.basepath, false), hrefOption, linkDisabled, host);\n}\nvar timeoutMap = /* @__PURE__ */ new WeakMap();\nvar cancelPreload = (eventTarget) => {\n\tclearTimeout(timeoutMap.get(eventTarget));\n\ttimeoutMap.delete(eventTarget);\n};\nvar composeHandlers = (first, second) => {\n\tif (!first) return second;\n\treturn (event) => event.defaultPrevented || (first(event), event.defaultPrevented || second(event));\n};\nfunction getHrefOption(next, router, disabled) {\n\tif (disabled) return;\n\tconst location = next.maskedLocation ?? next;\n\tconst href = location.external ? location.publicHref : router.history.createHref(location.publicHref) || \"/\";\n\tif ((location.external || href !== location.publicHref) && isDangerousProtocol(href, router.protocolAllowlist)) {\n\t\tif (process.env.NODE_ENV !== \"production\") console.warn(`Blocked Link with dangerous protocol: ${href}`);\n\t\treturn;\n\t}\n\treturn href;\n}\n/**\n* Creates a typed Link-like component that preserves TanStack Router's\n* navigation semantics and type-safety while delegating rendering to the\n* provided host component.\n*\n* Useful for integrating design system anchors/buttons while keeping\n* router-aware props (eg. `to`, `params`, `search`, `preload`).\n*\n* @param Comp The host component to render (eg. a design-system Link/Button)\n* @returns A router-aware component with the same API as `Link`.\n* @link https://tanstack.com/router/latest/docs/framework/react/guide/custom-link\n*/\nfunction createLink(Comp) {\n\treturn React$1.forwardRef(function CreatedLink(props, ref) {\n\t\treturn /* @__PURE__ */ jsx(Link, {\n\t\t\t...props,\n\t\t\t_asChild: Comp,\n\t\t\tref\n\t\t});\n\t});\n}\n/**\n* A strongly-typed anchor component for declarative navigation.\n* Handles path, search, hash and state updates with optional route preloading\n* and active-state styling.\n*\n* Props:\n* - `preload`: Controls route preloading (eg. 'intent', 'render', 'viewport', true/false)\n* - `preloadDelay`: Delay in ms before preloading on focus, hover, or viewport entry\n* - `activeProps`/`inactiveProps`: Additional props merged when link is active/inactive\n* - `resetScroll`/`hashScrollIntoView`: Control scroll behavior on navigation\n* - `viewTransition`/`startTransition`: Use View Transitions/React transitions for navigation\n* - `ignoreBlocker`: Bypass registered blockers\n*\n* @returns An anchor-like element that navigates without full page reloads.\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/linkComponent\n*/\nvar Link = React$1.memo(React$1.forwardRef((props, ref) => {\n\tconst host = props._asChild || \"a\";\n\tconst linkProps = useLinkProps(props, ref, host);\n\tconst children = typeof props.children === \"function\" ? props.children({ isActive: linkProps[\"data-status\"] === \"active\" }) : props.children;\n\treturn React$1.createElement(host, linkProps, children);\n}), areLinkPropsEqual);\nfunction areLinkPropsEqual(prev, next) {\n\tlet extraKeys = 0;\n\tfor (const key in next) {\n\t\textraKeys++;\n\t\tif (prev[key] === next[key]) continue;\n\t\tif (!ROUTER_OPTION_KEYS.has(key) || !deepEqual(prev[key], next[key], false, true)) return false;\n\t}\n\tfor (const _key in prev) extraKeys--;\n\treturn extraKeys === 0;\n}\n/**\n* Validate and reuse navigation options for `Link`, `navigate` or `redirect`.\n* Accepts a literal options object and returns it typed for later spreading.\n* @example\n* const opts = linkOptions({ to: '/dashboard', search: { tab: 'home' } })\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/linkOptions\n*/\nvar linkOptions = (options) => {\n\treturn options;\n};\n/**\n* Type-check a literal object for use with `Link`, `navigate` or `redirect`.\n* Use to validate and reuse navigation options across your app.\n* @example\n* const opts = linkOptions({ to: '/dashboard', search: { tab: 'home' } })\n* @link https://tanstack.com/router/latest/docs/framework/react/api/router/linkOptions\n*/\n//#endregion\nexport { Link, createLink, linkOptions, useLinkProps };\n\n//# sourceMappingURL=link.js.map","import { ShapioApiError } from '@shapio/client';\n\nexport const isUnauthorized = (error: unknown) => error instanceof ShapioApiError && error.status === 401;\n\nexport const isForbidden = (error: unknown) => error instanceof ShapioApiError && error.status === 403;\n\nexport const isNotFound = (error: unknown) => error instanceof ShapioApiError && error.status === 404;\n\nexport const isConflict = (error: unknown) => error instanceof ShapioApiError && error.status === 409;\n\nexport const hasErrorCode = (error: unknown, code: string) =>\n error instanceof ShapioApiError && error.code === code;\n\n/** A schema validation issue; `siteKey` names the site whose view it was found in (every-site admins only). */\nexport type SchemaIssue = { path: string; code: string; message: string; siteKey?: string };\n\n/** Validation issues (JSON-pointer paths) the schema routes return with 422 SCHEMA_INVALID. */\nexport const schemaIssuesOf = (error: unknown): SchemaIssue[] => {\n if (!hasErrorCode(error, 'SCHEMA_INVALID')) {\n return [];\n }\n const issues = (error as ShapioApiError & { details: { issues?: unknown } }).details?.issues;\n return Array.isArray(issues) ? (issues as SchemaIssue[]) : [];\n};\n","import type {\n AcceptInvitationInput,\n ChangePasswordInput,\n GlobalAction,\n LoginInput,\n MeResponse,\n PasswordResetConfirmInput,\n PasswordResetRequestInput,\n SessionStarted,\n SetupInput,\n SetupStatusResponse,\n UpdateProfileInput,\n} from '@shapio/client';\nimport { queryOptions, useMutation, useQuery, useQueryClient, type QueryClient } from '@tanstack/react-query';\nimport { currentSite, leaveUnknownSite } from '@/app/currentSite';\nimport { adminApi } from './client';\nimport { resetCsrfToken, setCsrfToken, withCsrf } from './csrf';\nimport { hasErrorCode, isUnauthorized } from './errors';\nimport { queryKeys } from './queryKeys';\n\n/** The signed-in admin, or `null` when there is no valid session (401 is an answer, not an error). */\nexport const meQueryOptions = queryOptions({\n queryKey: queryKeys.me,\n queryFn: async (): Promise<MeResponse | null> => {\n try {\n const me = await adminApi.auth.me();\n setCsrfToken(me.csrfToken);\n return me;\n } catch (error) {\n if (isUnauthorized(error)) {\n return null;\n }\n // A remembered site that no longer exists: start again without it. A site named in the URL is the\n // visitor's own request, so the route shows that it doesn't exist instead.\n if (hasErrorCode(error, 'SITE_NOT_FOUND') && !currentSite().explicit) {\n leaveUnknownSite();\n return new Promise<never>(() => undefined);\n }\n throw error;\n }\n },\n staleTime: 60_000,\n});\n\nexport const setupStatusQueryOptions = queryOptions({\n queryKey: queryKeys.setupStatus,\n queryFn: () => adminApi.setup.status(),\n staleTime: Infinity,\n});\n\nexport const useMe = () => useQuery(meQueryOptions);\n\n/** First-run status: whether setup is pending and whether it needs the logged setup token. */\nexport const useSetupStatus = () => useQuery(setupStatusQueryOptions);\n\n/**\n * A new session replaces whatever was cached for the previous one. The profile (roles, permissions) is\n * loaded before the caller navigates, so the shell renders with it.\n */\nconst startSession = async (queryClient: QueryClient, started: SessionStarted) => {\n setCsrfToken(started.csrfToken);\n queryClient.removeQueries({ predicate: (query) => query.queryKey[0] !== queryKeys.me[0] });\n queryClient.setQueryData(queryKeys.setupStatus, (previous: SetupStatusResponse | undefined) => ({\n requiresToken: false,\n ...previous,\n required: false,\n }));\n await queryClient.fetchQuery({ ...meQueryOptions, staleTime: 0 });\n};\n\nconst silent = { silent: true } as const;\n\nexport const useLogin = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['auth', 'login'],\n meta: silent,\n mutationFn: (input: LoginInput) => withCsrf(() => adminApi.auth.login(input)),\n onSuccess: (started) => startSession(queryClient, started),\n });\n};\n\nexport const useSetup = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['setup'],\n meta: silent,\n mutationFn: (input: SetupInput) => withCsrf(() => adminApi.setup.complete(input)),\n onSuccess: (started) => startSession(queryClient, started),\n });\n};\n\nexport const useAcceptInvitation = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['auth', 'acceptInvitation'],\n meta: silent,\n mutationFn: (input: AcceptInvitationInput) => withCsrf(() => adminApi.invitations.accept(input)),\n onSuccess: (started) => startSession(queryClient, started),\n });\n};\n\nexport const useLogout = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['auth', 'logout'],\n mutationFn: () => withCsrf(() => adminApi.auth.logout()),\n // Signed out either way: forget the user (the shell then leaves for sign-in) and every cached answer.\n // `me` is set rather than removed so mounted observers see the change.\n onSettled: () => {\n resetCsrfToken();\n queryClient.setQueryData(queryKeys.me, null);\n queryClient.removeQueries({ predicate: (query) => query.queryKey[0] !== queryKeys.me[0] });\n },\n });\n};\n\nexport const useRequestPasswordReset = () =>\n useMutation({\n mutationKey: ['auth', 'requestPasswordReset'],\n meta: silent,\n mutationFn: (input: PasswordResetRequestInput) =>\n withCsrf(() => adminApi.auth.requestPasswordReset(input)),\n });\n\n/** Who an invitation is for, so the form can show it. Public, read-only; the token travels in the body. */\nexport const useInspectInvitation = (token: string | undefined) =>\n useQuery({\n queryKey: queryKeys.invitationInspect(token ?? ''),\n queryFn: () => adminApi.invitations.inspect(token ?? ''),\n enabled: Boolean(token),\n retry: false,\n staleTime: Infinity,\n meta: { silent: true },\n });\n\nexport const useConfirmPasswordReset = () =>\n useMutation({\n mutationKey: ['auth', 'confirmPasswordReset'],\n meta: silent,\n mutationFn: (input: PasswordResetConfirmInput) =>\n withCsrf(() => adminApi.auth.confirmPasswordReset(input)),\n });\n\nexport const useUpdateProfile = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['auth', 'updateProfile'],\n meta: silent,\n mutationFn: (input: UpdateProfileInput) => withCsrf(() => adminApi.auth.updateProfile(input)),\n onSuccess: (user) =>\n queryClient.setQueryData(queryKeys.me, (current: MeResponse | null | undefined) =>\n current ? { ...current, user } : current,\n ),\n });\n};\n\nexport const useChangePassword = () =>\n useMutation({\n mutationKey: ['auth', 'changePassword'],\n meta: silent,\n mutationFn: (input: ChangePasswordInput) => withCsrf(() => adminApi.auth.changePassword(input)),\n // The server rotates the session (and its CSRF secret) after a password change.\n onSuccess: ({ csrfToken }) => setCsrfToken(csrfToken),\n });\n\n/** Whether the signed-in admin holds an instance-level permission (users, roles, tokens, audit). */\nexport const useHasGlobalPermission = (action: GlobalAction) => {\n const { data: me } = useMe();\n return me?.globalPermissions.includes(action) ?? false;\n};\n"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10],"mappings":"ySACA,SAASe,EAAa,EAAS,CAC9B,OAAOC,CACR,gBCKIG,EAAsEF,EAAoB,gBCF9F,SAASG,EAAK,EAAK,CAClB,OAAOC,EAAIA,EAAI,OAAS,EACzB,CAKA,SAASC,EAAiB,EAAS,EAAU,CAE5C,OADI,OAAOC,GAAY,WAAmBA,EAAQC,CAAQ,EACnDD,CACR,CACA,IAAME,EAAS,OAAO,UAAU,eAChC,SAASC,EAAQ,EAAK,CACrB,IAAK,IAAMC,KAAOC,EAAK,GAAIH,EAAO,KAAKG,EAAKD,CAAG,EAAG,MAAO,GACzD,MAAO,EACR,CACA,IAAME,MAAmB,OAAO,OAAO,IAAI,EACrCC,GAAwB,EAAM,IAASC,EAAiBC,EAAMC,EAAM,EAAI,EAC9E,SAASF,EAAiB,EAAM,EAAM,EAAY,EAAS,EAAG,CAE7D,GAAIC,IAASC,EAAM,OAAOD,EAC1B,GAAI,IAAW,IAAK,OAAOC,EAC3B,IAAMC,EAAQ,MAAM,QAAQF,CAAI,GAAK,MAAM,QAAQC,CAAI,EACvD,GAAI,CAACC,GAAS,EAAEC,EAAcH,CAAI,GAAKG,EAAcF,CAAI,GAAI,OAAOA,EACpE,IAAMG,EAAW,OAAO,KAAKJ,CAAI,EAC3BK,EAAgBD,EAAS,OACzBE,EAAW,OAAO,KAAKL,CAAI,EAC3BM,EAASD,EAAS,OACxB,GAAIJ,EAAQG,IAAkBL,EAAK,QAAUO,IAAWN,EAAK,QAAUI,GAAiBjB,EAAKgB,CAAQ,IAAM,GAAGC,EAAgB,KAAOE,GAAUnB,EAAKkB,CAAQ,IAAM,GAAGC,EAAS,IAAMF,IAAkB,OAAO,oBAAoBL,CAAI,CAAC,CAAC,QAAUO,IAAW,OAAO,oBAAoBN,CAAI,CAAC,CAAC,QAAU,OAAO,sBAAsBA,CAAI,CAAC,CAAC,OAAQ,OAAOA,EACzV,IAAIO,EAAI,EACJC,EACAjB,EACAG,EACJ,GAAIO,EAAO,CACV,KAAOM,EAAID,IACV,EAAMC,EACN,EAAWR,EAAKL,GAChB,EAAQM,EAAKN,GACb,EAAQH,IAAaiB,EAAQjB,EAAW,OAAOA,GAAa,SAAWO,EAAiBP,EAAUiB,EAAOC,EAAYC,CAAM,EAAIF,EAC3HA,IAAUjB,GALI,KAOnB,GAAIgB,IAAMD,GAAUF,IAAkBE,EAAQ,OAAOP,CACtD,KAAO,CACN,IAAIY,EAAQP,IAAkBE,EAC1BM,EAAY,GAChB,KAAOL,EAAID,EAAQ,IAAK,CACvB,EAAMD,EAASE,GACf,EAAWR,EAAKL,GAChB,IAAMmB,EAAWb,EAAKN,GACtB,EAAQH,IAAasB,EAAWtB,EAAW,OAAOA,GAAa,SAAWO,EAAiBP,EAAUsB,EAAUJ,EAAYC,CAAM,EAAIG,EACrI,IAAUL,IAAUjB,IAAaY,EAASI,KAAOb,GAAOF,EAAO,KAAKO,EAAML,CAAG,GAC7E,IAAc,OAAO,GAAGc,EAAOK,CAAQ,EACvC,EAASN,GAAKC,CACf,CACA,GAAIG,EAAO,OAAO,OAAO,sBAAsBZ,CAAI,CAAC,CAAC,OAASC,EAAOD,EACrE,GAAIa,EAAW,OAAOZ,CACvB,CACA,IAAMc,EAAOb,EAAQI,EAAS,KAAK,CAAC,EAAII,EAAab,EAAW,EAAI,CAAC,EACrE,IAAK,IAAImB,EAAI,EAAGA,EAAIT,EAAQ,IAC3B,EAAML,EAAQc,EAAIV,EAASU,GACvBd,GACH,EAAWF,EAAKL,GACZqB,EAAIR,IACP,EAAQP,EAAKN,GACb,EAAQH,IAAaiB,EAAQjB,EAAW,OAAOA,GAAa,SAAWO,EAAiBP,EAAUiB,EAAOC,EAAYC,CAAM,EAAIF,GAEhI,EAAKd,GAAOqB,EAAIR,EAAIhB,EAAWiB,GACzB,EAAKd,GAAOS,EAASY,GAE7B,OAAOD,CACR,CACA,SAASZ,EAAc,EAAG,CAEzB,MADI,CAACc,GAAK,OAAOA,GAAM,SAAiB,IAChC,OAAO,eAAeA,CAAC,CAAC,EAAE,aAAe,UAAY,MAC9D,CAUA,SAASC,EAAU,EAAG,EAAG,EAAS,EAAmB,CACpD,GAAIC,IAAMC,EAAG,MAAO,GACpB,GAAI,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EAAG,CACzC,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,IAAK,IAAI,EAAI,EAAGC,EAAIF,EAAE,OAAQ,EAAIE,EAAG,IAAK,CACzC,IAAMC,EAAKH,EAAE,GACPI,EAAKH,EAAE,GACb,GAAIE,IAAOC,GAAM,CAACL,EAAUI,EAAIC,EAAIC,EAASC,CAAiB,EAAG,MAAO,EACzE,CACA,MAAO,EACR,CACA,GAAItB,EAAcgB,CAAC,GAAKhB,EAAciB,CAAC,EAAG,CACzC,GAAII,EAAS,CACZ,IAAK,IAAME,KAAKN,EAAG,IAAIK,GAAqBL,EAAEM,KAAO,IAAK,KACrD,CAACR,EAAUC,EAAEO,GAAIN,EAAEM,GAAIF,EAASC,CAAiB,EAAG,MAAO,GAEhE,MAAO,EACR,CACA,IAAIE,EAAS,EACb,GAAIF,EAAmB,EAAS,OAAO,KAAKN,CAAC,CAAC,CAAC,YAC1C,IAAK,IAAMO,KAAKP,EAAOA,EAAEO,KAAO,IAAK,IAAG,IAC7C,IAAK,IAAMA,KAAKN,EAAG,IAAIK,GAAqBL,EAAEM,KAAO,IAAK,MACrD,MAAa,GAAK,CAACR,EAAUC,EAAEO,GAAIN,EAAEM,GAAIF,EAASC,CAAiB,GAAG,MAAO,GAElF,OAAOE,IAAW,CACnB,CACA,MAAO,EACR,CAuDA,IAAMC,GAAiB,yBACvB,SAASC,EAAoB,EAAS,CACrC,OAAOC,EAAQ,QAAQF,GAAiB,GAAO,IAAMG,EAAG,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,EAAG,GAAG,CAAC,CAClH,CACA,SAASC,EAAc,EAAS,CAC/B,IAAIC,EACJ,GAAI,CACH,EAAU,UAAUH,CAAO,CAC5B,MAAQ,CACP,EAAUA,EAAQ,WAAW,iBAAmB,GAAU,CACzD,GAAI,CACH,OAAO,UAAUI,CAAK,CACvB,MAAQ,CACP,OAAOA,CACR,CACD,CAAC,CACF,CACA,OAAOL,EAAoBI,CAAO,CACnC,CAKA,IAAME,EAA6B,CAClC,QACA,SACA,UACA,MACD,EAQA,SAASC,EAAa,EAAK,CAC1B,GAAIC,EAAI,KAAO,KACVA,EAAI,SAAS,GAAG,EACrB,MAAO,0CAA0C,KAAKA,CAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,YAAa,EAAE,CAAC,CAAC,YAAY,CACvG,CACA,IAAMC,EAA8B,mCAmBpC,SAASC,EAAoB,EAAK,EAAW,CAC5C,GAAI,CAACF,EAAK,MAAO,GACjB,GAAIC,EAA4B,KAAKD,CAAG,EAAG,MAAO,GAClD,IAAMG,EAASJ,EAAaC,CAAG,EAC/B,OAAOG,EAAS,CAACC,EAAU,IAAID,CAAM,EAAI,EAC1C,CACA,IAAME,EAAqB,CAC1B,IAAK,UACL,IAAK,UACL,IAAK,UACL,SAAU,UACV,SAAU,SACX,EACMC,EAAoB,qBAQ1B,SAASC,EAAW,EAAK,CACxB,OAAOC,EAAI,QAAQF,EAAoB,GAAUD,EAAmBR,EAAM,CAC3E,CACA,SAASY,EAAW,EAAM,CACzB,GAAI,CAACC,EAAM,OAAOA,EAClB,IAAIC,EAASD,EACb,GAAI,qBAAqB,KAAKA,CAAI,EAAG,CACpC,IAAME,EAAK,YACPC,EAAS,EACThB,EAEJ,IADA,EAAS,IACQ,EAAQe,EAAG,KAAKF,CAAI,KAA9B,MACN,GAAUf,EAAce,EAAK,MAAMG,EAAQhB,EAAM,KAAK,CAAC,EAAIA,EAAM,GACjE,EAASe,EAAG,UAEb,GAAUjB,EAAckB,EAASH,EAAK,MAAMG,CAAM,EAAIH,CAAI,CAC3D,CACA,OAAOC,CACR,CAoBA,SAASG,EAAkB,EAAM,CAEhC,MADK,oBAAoB,KAAKJ,CAAI,EAC3BA,EAAK,QAAQ,wBAAyB,kBAAkB,EADnBA,CAE7C,CAcA,SAASK,EAAY,EAAG,EAAG,CAC1B,GAAIjC,IAAMC,EAAG,MAAO,GACpB,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,IAAK,IAAIZ,EAAI,EAAGA,EAAIW,EAAE,OAAQ,IAAK,GAAIA,EAAEX,KAAOY,EAAEZ,GAAI,MAAO,GAC7D,MAAO,EACR,CChTA,SAAS6C,EAAU,EAAM,CACxB,OAAON,EAAK,QAAQ,UAAW,GAAG,CACnC,CAEA,SAASO,EAAa,EAAM,CAC3B,OAAOP,IAAS,IAAMA,EAAOA,EAAK,QAAQ,OAAQ,EAAE,CACrD,CAEA,SAASQ,EAAc,EAAM,CAC5B,IAAMC,EAAMT,EAAK,OACjB,OAAOS,EAAM,GAAKT,EAAKS,EAAM,KAAO,IAAMT,EAAK,QAAQ,OAAQ,EAAE,EAAIA,CACtE,CAEA,SAASU,GAAS,EAAM,CACvB,OAAOF,EAAcD,EAAaP,CAAI,CAAC,CACxC,CAEA,SAASW,EAAoB,EAAO,EAAU,CAE7C,OADIC,GAAO,SAAS,GAAG,GAAKA,IAAU,KAAOA,IAAU,GAAGC,EAAS,GAAWD,EAAM,MAAM,EAAG,EAAE,EACxFA,CACR,CAeA,SAASE,GAAY,EAAM,EAAI,EAAgB,QAAS,EAAO,CAE9D,GADIC,EAAG,SAAS,IAAI,IAAG,EAAKT,EAAUS,CAAE,GACpCA,EAAG,WAAW,GAAG,EAGpB,OAFIA,EAAG,SAAW,GAAKC,IAAkB,WAAmBD,EACxDC,IAAkB,SAAiBD,EAAG,SAAS,GAAG,EAAIA,EAAK,GAAGA,EAAG,GAC9DA,EAAG,SAAS,GAAG,EAAIA,EAAG,MAAM,EAAG,EAAE,EAAIA,EAE7C,IAAME,EAASF,IAAO,IAClBnE,EACJ,GAAIsE,EAAO,CACV,EAAMD,EAASE,EAAOA,EAAO,KAAOJ,EACpC,IAAMK,EAASF,EAAM,IAAItE,CAAG,EAC5B,GAAIwE,EAAQ,OAAOA,CACpB,CACA,IAAIC,EACJ,GAAIJ,EAAQ,EAAeE,EAAK,MAAM,GAAG,MACpC,CAGJ,IAFIA,EAAK,SAAS,IAAI,IAAG,EAAOb,EAAUa,CAAI,GAC9C,EAAeA,EAAK,MAAM,GAAG,EACtBE,EAAa,OAAS,GAAKhF,EAAKgF,CAAY,IAAM,IAAIA,EAAa,IAAI,EAC9E,IAAMC,EAAaP,EAAG,MAAM,GAAG,EAC/B,IAAK,IAAIQ,EAAQ,EAAG/D,EAAS8D,EAAW,OAAQC,EAAQ/D,EAAQ,IAAS,CACxE,IAAMoD,EAAQU,EAAWC,GACrBX,IAAU,GACRW,EACIA,IAAU/D,EAAS,GAAG6D,EAAa,KAAKT,CAAK,EAD1C,EAAe,CAACA,CAAK,EAEvBA,IAAU,KAAUS,EAAa,OAAS,EAAGA,EAAa,IAAI,EACpE,EAAe,CAAC,EAAE,EACdT,IAAU,KAAaS,EAAa,KAAKT,CAAK,CACxD,CACD,CACIS,EAAa,OAAS,IACrBhF,EAAKgF,CAAY,IAAM,GACtBL,IAAkB,SAASK,EAAa,IAAI,EACtCL,IAAkB,UAAUK,EAAa,KAAK,EAAE,GAE5D,IAAMG,EAASH,EAAa,KAAK,GAAG,EAC9BpB,GAAUgB,EAASX,EAAUkB,CAAM,EAAIA,IAAW,IAExD,OADI5E,GAAOsE,GAAOA,EAAM,IAAItE,EAAKqD,CAAM,EAChCA,CACR,CAKA,SAASwB,GAAqB,EAA6B,CAC1D,IAAMC,EAAU,IAAI,IAAIC,EAA4B,IAAK,GAAS,CAAC,mBAAmBC,CAAI,EAAGA,CAAI,CAAC,CAAC,EAC7FC,EAAQ,IAAI,OAAO,CAAC,GAAGH,EAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,UAAW,MAAM,EAAG,GAAG,EACtF,MAAQ,IAAYI,EAAQ,QAAQD,EAAQ,GAAUH,EAAQ,IAAIvC,CAAK,GAAKA,CAAK,CAClF,CAKA,SAAS4C,GAAe,EAAO,CAC9B,OAAOnB,GAAS,MAAQA,IAAU,EACnC,CASA,SAASoB,GAAY,EAAK,EAAO,EAAS,CACzC,GAAI,OAAOpB,GAAU,SAAU,MAAO,IAAMA,GAAS,IAAK,IAC1D,IAAMqB,EAAQrF,IAAQ,SACtB,GAAIqF,IAAU,CAACrB,GAAS,wBAAwB,KAAKA,CAAK,GAAI,OAAOA,EACrE,IAAIkB,EAAU,mBAAmBlB,CAAK,EAEtC,OADIqB,IAAO,EAAUH,EAAQ,WAAW,MAAO,GAAG,GAC3CI,EAAUA,EAAQJ,CAAO,EAAIA,CACrC,CAEA,SAASK,GAAgB,EAAM,EAAU,EAAQ,EAAS,EAAY,CACrE,IAAMnB,EAAgBhB,EAAK,SAAS,GAAG,EAAI,IAAM,GAC7CwB,EAAS,GACb,IAAK,IAAMY,KAAQC,EAAU,CAC5B,GAAI,OAAOD,GAAS,SAAU,CAC7B,GAAUA,EACV,QACD,CACA,GAAM,CAACE,EAAM1F,EAAK2F,EAAQC,GAAaJ,EACjCH,EAAQK,IAAS,EACjBG,EAASR,GAASO,IAAc,IAAK,GAAIA,EAAYxB,EAAgBwB,EACvEE,EAAaC,EAAO/F,GACxB,GAAI0F,IAAS,GAAKI,GAAc,KAKhC,IAJIE,IACH,EAAWhG,GAAO8F,EACdT,IAAO,EAAW,KAAOS,IAE1BT,GAASF,GAAeW,CAAU,EAAG,CACxC,GAAIH,IAAW,KAAO,CAACE,EAAQ,SAC/B,EAAa,EACd,CACA,GAAUF,EAASP,GAAYpF,EAAK8F,EAAYR,CAAO,GAAKO,GAAU,GADtE,CAED,CACA,OAAOjB,EAASR,GAAiB,GAClC,CC7IA,IAAM6B,GAAiB,wCCGnBE,OAAoB,GACpBC,OAA0B,GAkB9B,SAASC,GAAW,CAAE,WAAU,WAAW,MAAQ,CAClD,OAAuB,EAAAH,EAAA,IAAA,CAAA5G,EAAU,SAAU,CAAE,SAAUgH,GAAY,EAAIC,EAAWC,CAAS,CAAC,CAC7F,CAEA,SAASF,GAAY,EAAU,GAAM,CACpC,OAAAhH,EAAa,qBAAqBmH,GAAWN,GAAaO,EAAUN,GAAoBD,EAAW,CACpG,CACA,SAASM,IAAY,CACpB,UAAa,CAAC,CACf,CC7BA,IAAIE,GAAArH,EAAwB,cAAc,IAAI,ECW9C,SAASsH,EAAU,EAAM,CAGxB,OAFMtH,EAAgB,WAAWqH,EAE1B,CACR,YCdA,SAASG,GAAe,EAAG,EAAG,CAC7B,OAAOtF,IAAMC,CACd,CAqBA,SAASsF,GAAY,EAAQ,EAAY,GAAMC,EAAG,EAAS,CAC1D,IAAMC,EAAU5H,GAAS,SAAWyH,GAC9BL,GAAA,EAAYpI,EAAAA,YAAAA,CAAa,GAAsB,CACpD,GAAM,CAAE,eAAgB6I,EAAO,UAAUC,CAAiB,EAC1D,OAAOC,CACR,EAAG,CAACF,CAAM,CAAC,EACLf,GAAA,EAAc9H,EAAAA,YAAAA,KAAkB6I,EAAO,IAAI,EAAG,CAACA,CAAM,CAAC,EAC5D,OAAA,EAAO5I,GAAAA,iCAAAA,CAAiCmI,EAAWN,EAAaA,EAAakB,EAAUJ,CAAO,CAC/F,CChBA,SAASK,GAAY,EAAc,CAClC,IAAMC,EAASX,EAAU,EACzB,OAAAtH,EAAe,YAAa,GACpBiI,EAAO,SAAS,CACtB,GAAGlI,EACH,KAAMA,EAAQ,MAAQmI,GAAc,IACrC,CAAC,EACC,CAACA,GAAc,KAAMD,CAAM,CAAC,CAChC,CAUA,SAASE,GAAS,EAAO,CACxB,IAAMF,EAASX,EAAU,EACnBc,EAAWJ,GAAY,EACvBK,EAAArI,EAA2B,OAAO,IAAI,EAW5C,OAVAE,MAAsB,CACjBmI,EAAiB,UAAYC,IAChCF,EAASE,CAAK,EACd,EAAiB,QAAUA,EAE7B,EAAG,CACFL,EACAK,EACAF,CACD,CAAC,EACM,IACR,CC3CA,SAASG,GAAgB,GAAGC,EAAQ,CACnC,IAAMC,EAAAzI,EAAc,OAAOwI,CAAM,EAC3BE,EAASD,EAAI,QAInB,OAHAD,EAAO,SAAS,EAAO,IAAU,CAC3BvG,EAAUyG,EAAOrD,GAAQX,EAAO,GAAO,EAAI,IAAG,EAAOW,GAASX,EACpE,CAAC,EACM+D,EAAI,OACZ,CACA,SAASE,EAAY,EAAQ,EAAS,CACrCV,EAAO,aAAalI,CAAO,CAAC,CAAC,MAAO,GAAQ,CAC3C,QAAQ,KAAK6I,CAAG,EAChB,QAAQ,KAAKjC,EAAc,CAC5B,CAAC,CACF,CACA,IAAIkC,GAAwB,CAAE,SAAU,EAAG,IAAM3G,EAAE,KAAOC,EAAE,IAAMD,EAAE,KAAOC,EAAE,EAAG,EAChF,SAAS2G,GAAoB,EAAI,EAAmB,CACnD,IAAMvF,EAAS,OAAOsB,GAAO,UAAY1B,EAAa0B,CAAE,EACxD,GAAKtB,EAKL,OAJKwF,EAAkB,IAAIxF,CAAM,EAI1BsB,EAFC,IAGT,CACA,SAASmE,GAAgB,EAAU,EAAM,EAAe,EAAU,EAAY,CAC7E,IAAMC,EAAcxE,EAAoByE,EAAS,SAAUvE,CAAQ,EAC7DwE,EAAW1E,EAAoBzD,EAAK,SAAU2D,CAAQ,EAM5D,OALIyE,GAAe,MAAQH,IAAgBE,EAAa,GAAY,WAAWA,CAAQ,GAAMF,EAAY,SAAWE,EAAS,QAAUF,EAAYE,EAAS,UAAY,OACpKC,GAAe,eAAiB,KAC/B,CAACnH,EAAUiH,EAAS,OAAQlI,EAAK,OAAQ,CAACoI,GAAe,MAAOA,GAAe,iBAAiB,EAAU,GAE/G,CAAIA,GAAe,aAAoBC,GAAcH,EAAS,OAASlI,EAAK,IAE7E,CACA,SAASsI,GAAa,EAAS,EAAc,EAAM,CAClD,IAAMrB,EAASX,EAAU,EAEnBiC,EAAAvJ,EAAmB,OAAO,IAAI,EAC9BwJ,EAAAxJ,EAAoB,YAAa,GAAY,CAElD,GADA,EAAS,QAAUyJ,EACf,OAAOC,GAAiB,WAAY,OAAOA,EAAaD,CAAO,EAC/DC,IAAc,EAAa,QAAUD,EAC1C,EAAG,CAACC,CAAY,CAAC,EACX,CAAE,gBAAe,KAAI,QAASC,EAAa,aAAcC,EAAkB,qBAAoB,UAAS,kBAAiB,cAAa,iBAAgB,gBAAe,WAAU,SAAQ,UAAS,SAAQ,UAAS,eAAc,eAAc,gBAAiB7J,EAC9PsJ,EAAarC,GAAY,CAAC,CAACoC,GAAe,WAAW,EACrD,CAACS,EAAcC,GAAcC,GAAuBxB,GAAgBxI,EAAQ,OAAQA,EAAQ,OAAQqJ,CAAa,EACjH,CAACY,EAAUC,GAAAjK,EAAgB,YAAc,CAACD,EAAS,CAAE,GAAGA,CAAQ,CAAC,EAAG,CACzEkI,EACAlI,EAAQ,KACRA,EAAQ,cACRA,EAAQ,KACRA,EAAQ,GACR8J,EACAC,GACA/J,EAAQ,MACRA,EAAQ,KACRA,EAAQ,cACT,CAAC,EACKmK,EAAAlK,EAA0B,YAAc,CAC7C,IAAMmK,EAAqBrB,GAAoBjE,EAAIoD,EAAO,iBAAiB,EAC3E,GAAIkC,IAAuB,IAAK,GAAG,CAClC,IAAMC,EAAQ,CAACD,GAAsB,IAAK,EAAC,EAC3C,UAAaC,CACd,CACA,IAAIC,EACAC,EACJ,MAAQ,IAAa,CACfN,EAAS,gBAAe,EAAK,cAAgBd,GAClD,IAAMlI,EAAOiH,EAAO,cAAcgC,CAAI,EAChCM,EAAOC,GAAcxJ,EAAMiH,EAAQwC,CAAQ,EAKjD,OAJI,CAACJ,GAAYA,EAAS,KAAOE,KAChC,EAAW,CAACA,EAAM,EAAEE,GAAYF,GAAQ,CAACpH,EAAaoH,CAAI,IAAM,IAAK,EAAC,EACtE,EAAS,CAACA,EAAM,EAAI,GAEdF,EAAS,KAAO,IAAK,IAAKrB,GAAgBE,EAAUlI,EAAM+I,EAAqB9B,EAAO,SAAUoB,CAAU,EAAIiB,EAASD,CAC/H,CACD,EAAG,CACFN,EACAU,EACApB,EACAW,EACAC,EACAhC,EACApD,CACD,CAAC,EACK,CAAC0F,EAAMG,GAAYjD,GAAYQ,EAAO,OAAO,SAAUiC,EAAiBrB,EAAqB,EAC7F8B,EAAeD,IAAa,IAAK,IAAKH,EACtCK,EAAeH,GAAYF,IAAS,IAAK,GACzCM,EAAA7K,EAA2B,OAAO,EAAK,EACvC8K,EAAU/K,EAAQ,gBAAkB4K,GAAgBC,EAAe,GAAQjB,GAAe1B,EAAO,QAAQ,eACzG8C,EAAenB,GAAoB3B,EAAO,QAAQ,qBAAuB,EACzE+C,EAAAhL,EAAyB,YAAa,GAAM,CACjD,IAAMiL,EAAiB,GAAG,eAC1B,GAAI,EAAEA,GAAkBH,IAAY,UAAW,CAC1CG,IAAmB,IAAOC,EAAc3B,CAAQ,EACpD,MACD,CACA,GAAI,CAACwB,EAAc,CAClBpC,EAAYV,EAAQ+B,CAAQ,EAC5B,MACD,CACImB,EAAW,IAAI5B,CAAQ,GAC3B4B,EAAW,IAAI5B,EAAU,eAAiB,CACzC4B,EAAW,OAAO5B,CAAQ,EAC1BZ,EAAYV,EAAQ+B,CAAQ,CAC7B,EAAGe,CAAY,CAAC,CACjB,EAAG,CACF9C,EACA+B,EACAT,EACAuB,EACAC,CACD,CAAC,EACD/K,EAAQ,cAAgB,CACvB,GAAI,CAAC8K,EAAS,OACVA,IAAY,UAAY,CAACD,EAAiB,UAC7C,EAAiB,QAAU,GAC3BlC,EAAYV,EAAQ+B,CAAQ,GAE7B,IAAIM,EAAS,GACTc,EAOJ,OANIN,IAAY,YAAcvB,EAAS,SAAW,OAAO,sBAAyB,aACjF,EAAW,IAAI,qBAAsB,GAAY,CAC5Ce,GAAQU,EAAeK,EAAQ,IAAI,CAAC,CACzC,EAAG,CAAE,WAAY,OAAQ,CAAC,EAC1BD,EAAS,QAAQ7B,EAAS,OAAO,OAErB,CACZ,EAAS,GACT6B,GAAU,WAAW,EACrBF,EAAc3B,CAAQ,CACvB,CACD,EAAG,CACFtB,EACA+B,EACAc,EACAE,EACAzB,CACD,CAAC,EACD,IAAMjB,EAAQgD,GAAoBvL,EAASwL,CAAI,EAE/C,GADA,EAAM,IAAM7B,EAAeF,EAAYD,EACnCoB,EAEH,MADA,GAAM,KAAOA,EACNrC,EAER,IAAMkD,EAAe,GAAM,CAC1B,IAAMC,EAAkBC,GAAU,EAAE,cAAc,aAAa,QAAQ,EACnE,CAACd,GAAgB,EAAE,EAAE,SAAW,EAAE,QAAU,EAAE,SAAW,EAAE,WAAa,CAAC,EAAE,mBAAqB,CAACa,GAAmBA,IAAoB,UAAY,EAAE,SAAW,IACpK,EAAE,eAAe,EACjBxD,EAAO,SAAS,CACf,GAAG+B,EACH,UACA,cACA,qBACA,kBACA,iBACA,eACD,CAAC,EAEH,EACM2B,OAAyB,CAC1Bb,IAAY,UAAUnC,EAAYV,EAAQ+B,CAAQ,CACvD,EACM4B,MAAoB,CACrBd,IAAY,UAAUI,EAAc3B,CAAQ,CACjD,EAOA,MANA,GAAM,QAAUsC,EAAgBC,EAASN,CAAW,EACpD,EAAM,OAASK,EAAgBE,EAAQH,CAAW,EAClD,EAAM,QAAUC,EAAgBG,EAAShB,CAAc,EACvD,EAAM,aAAea,EAAgBI,EAAcjB,CAAc,EACjE,EAAM,aAAea,EAAgBK,EAAcN,CAAW,EAC9D,EAAM,aAAeC,EAAgBM,EAAcR,EAAgB,EAC5DS,GAAe9D,EAAOvI,EAAS2K,EAAUH,EAAMK,EAAcW,CAAI,CACzE,CACA,IAAIc,GAAsB,CAAC,EACvBC,GAAuB,CAAE,UAAW,QAAS,EAC7CC,EAAqC,IAAI,IAAI,CAChD,KACA,SACA,SACA,OACA,QACA,OACA,OACA,iBACA,gBACA,iBACA,UACA,eACA,yBACA,qBACA,UACA,kBACA,cACA,iBACA,gBACA,cACA,gBACA,gBACA,UACD,CAAC,EACD,SAASjB,GAAoB,EAAS,EAAM,CAC3C,IAAMhD,EAAQ,CAAC,EACf,IAAK,IAAM5H,KAAOX,EACbwM,EAAmB,IAAI7L,CAAG,GAAKA,IAAQ,QAAU6K,IAAS,IAAK,IAAK7K,IAAQ,YAAc6K,IAAS,MACvG,EAAM7K,GAAOX,EAAQW,IAEtB,OAAO4H,CACR,CACA,SAAS8D,GAAe,EAAO,EAAS,EAAU,EAAM,EAAc,EAAM,CAC3E,GAAM,CAAE,cAAa,gBAAe,YAAW,QAAO,UAAWrM,EAC3DyM,EAAanM,EAAiBqK,EAAW+B,EAAcC,EAAe,CAAC,CAAC,IAAMhC,EAAW4B,GAAuBD,IACtH,OAAO,OAAO/D,EAAOkE,CAAU,EAC/B,EAAM,KAAOjC,EACTgB,IAAS,MAAK,EAAM,SAAWX,GACnC,EAAM,OAASc,EACf,IAAMiB,EAAaH,EAAW,OAC1BI,GAASD,KAAY,EAAM,MAAQC,GAASD,EAAa,CAC5D,GAAGC,EACH,GAAGD,CACJ,EAAIC,GAASD,GACb,IAAME,EAAiBL,EAAW,UAUlC,OATIM,GAAaD,KAAgB,EAAM,UAAYC,EAAYD,EAAiB,GAAGC,EAAU,GAAGD,IAAmBC,EAAYD,GAC3HjC,IACH,EAAM,KAAO,OACb,EAAM,iBAAmB,IAEtBF,IACH,EAAM,eAAiB,SACvB,EAAM,gBAAkB,QAElBpC,CACR,CAgBA,IAAI6C,EAA6B,IAAI,QACjCD,EAAiB,GAAgB,CACpC,aAAaC,EAAW,IAAI4B,CAAW,CAAC,EACxC5B,EAAW,OAAO4B,CAAW,CAC9B,EACIlB,GAAmB,EAAO,IACxBmB,EACG,GAAUC,EAAM,mBAAqBD,EAAMC,CAAK,EAAGA,EAAM,kBAAoBC,EAAOD,CAAK,GAD9EC,EAGpB,SAAS1C,GAAc,EAAM,EAAQ,EAAU,CAC9C,GAAIC,EAAU,OACd,IAAMvB,EAAWlI,EAAK,gBAAkBA,EAClCuJ,EAAOrB,EAAS,SAAWA,EAAS,WAAajB,EAAO,QAAQ,WAAWiB,EAAS,UAAU,GAAK,IACzG,GAAK,GAAS,UAAYqB,IAASrB,EAAS,YAAe,GAAoBqB,EAAMtC,EAAO,iBAAiB,EAI7G,OAAOsC,CACR,CAaA,SAAS4C,GAAW,EAAM,CACzB,OAAAnN,EAAe,WAAW,SAAqB,EAAO,EAAK,CAC1D,OAAuB,EAAA4G,EAAA,IAAA,CAAIwG,GAAM,CAChC,GAAG9E,EACH,SAAU+E,EACV,KACD,CAAC,CACF,CAAC,CACF,CAiBA,IAAID,GAAApN,EAAe,KAAAA,EAAa,YAAY,EAAO,IAAQ,CAC1D,IAAMuL,EAAOjD,EAAM,UAAY,IACzBgF,EAAYhE,GAAahB,EAAOG,EAAK8C,CAAI,EACzCtE,EAAW,OAAOqB,EAAM,UAAa,WAAaA,EAAM,SAAS,CAAE,SAAUgF,EAAU,iBAAmB,QAAS,CAAC,EAAIhF,EAAM,SACpI,OAAAtI,EAAe,cAAcuL,EAAM+B,EAAWrG,CAAQ,CACvD,CAAC,EAAGsG,EAAiB,EACrB,SAASA,GAAkB,EAAM,EAAM,CACtC,IAAIC,EAAY,EAChB,IAAK,IAAM9M,KAAOM,EAEjB,GADA,IACID,EAAKL,KAASM,EAAKN,KACnB,CAAC6L,EAAmB,IAAI7L,CAAG,GAAK,CAACuB,EAAUlB,EAAKL,GAAMM,EAAKN,GAAM,GAAO,EAAI,GAAG,MAAO,GAE3F,IAAK,IAAM+M,KAAQ1M,EAAM,IACzB,OAAOyM,IAAc,CACtB,CAQA,IAAIE,GAAe,GACX3N,EC/UK4N,GAAkB,GAAmBC,aAAiBC,GAAkBD,EAAM,SAAW,IAEzFE,GAAe,GAAmBF,aAAiBC,GAAkBD,EAAM,SAAW,IAEtFG,GAAc,GAAmBH,aAAiBC,GAAkBD,EAAM,SAAW,IAErFI,GAAc,GAAmBJ,aAAiBC,GAAkBD,EAAM,SAAW,IAErFK,GAAgB,EAAgB,IAC3CL,aAAiBC,GAAkBD,EAAM,OAASM,EAMvCC,GAAkB,GAAkC,CAC/D,GAAI,CAACF,EAAaL,EAAO,gBAAgB,EACvC,MAAO,CAAC,EAEV,IAAMQ,EAAUR,EAA6D,SAAS,OACtF,OAAO,MAAM,QAAQQ,CAAM,EAAKA,EAA2B,CAAC,CAC9D,ECFaC,EAAiBvO,EAAa,CACzC,SAAUV,EAAU,GACpB,QAAS,SAAwC,CAC/C,GAAI,CACF,IAAMkP,EAAK,MAAM1O,EAAS,KAAK,GAAG,EAElC,OADAC,EAAayO,EAAG,SAAS,EAClBA,CACT,OAASV,EAAO,CACd,GAAID,GAAeC,CAAK,EACtB,OAAO,KAIT,GAAIK,EAAaL,EAAO,gBAAgB,GAAK,CAAClO,EAAY,CAAC,CAAC,SAE1D,OADAL,EAAiB,EACV,IAAI,YAAqB,IAAA,EAAS,EAE3C,MAAMuO,CACR,CACF,EACA,UAAW,GACb,CAAC,EAEYW,GAA0BzO,EAAa,CAClD,SAAUV,EAAU,YACpB,YAAeQ,EAAS,MAAM,OAAO,EACrC,UAAW,GACb,CAAC,EAEY4O,OAAcjP,EAAS8O,CAAc,EAGrCI,OAAuBlP,EAASgP,EAAuB,EAM9DG,EAAe,MAAO,EAA0B,IAA4B,CAChF7O,EAAa8O,EAAQ,SAAS,EAC9BC,EAAY,cAAc,CAAE,UAAY,GAAUC,EAAM,SAAS,KAAOzP,EAAU,GAAG,EAAG,CAAC,EACzFwP,EAAY,aAAaxP,EAAU,YAAc,IAA+C,CAC9F,cAAe,GACf,GAAGmB,EACH,SAAU,EACZ,EAAE,EACF,MAAMqO,EAAY,WAAW,CAAE,GAAGP,EAAgB,UAAW,CAAE,CAAC,CAClE,EAEMS,EAAS,CAAE,OAAQ,EAAK,EAEjBC,OAAiB,CAC5B,IAAMH,EAAcnP,EAAe,EACnC,OAAON,EAAY,CACjB,YAAa,CAAC,OAAQ,OAAO,EAC7B,KAAM2P,EACN,WAAa,GAAsBxP,MAAeM,EAAS,KAAK,MAAMoP,CAAK,CAAC,EAC5E,UAAY,GAAYN,EAAaE,EAAaD,CAAO,CAC3D,CAAC,CACH,EAEaM,OAAiB,CAC5B,IAAML,EAAcnP,EAAe,EACnC,OAAON,EAAY,CACjB,YAAa,CAAC,OAAO,EACrB,KAAM2P,EACN,WAAa,GAAsBxP,MAAeM,EAAS,MAAM,SAASoP,CAAK,CAAC,EAChF,UAAY,GAAYN,EAAaE,EAAaD,CAAO,CAC3D,CAAC,CACH,EAEaO,OAA4B,CACvC,IAAMN,EAAcnP,EAAe,EACnC,OAAON,EAAY,CACjB,YAAa,CAAC,OAAQ,kBAAkB,EACxC,KAAM2P,EACN,WAAa,GAAiCxP,MAAeM,EAAS,YAAY,OAAOoP,CAAK,CAAC,EAC/F,UAAY,GAAYN,EAAaE,EAAaD,CAAO,CAC3D,CAAC,CACH,EAEaQ,OAAkB,CAC7B,IAAMP,EAAcnP,EAAe,EACnC,OAAON,EAAY,CACjB,YAAa,CAAC,OAAQ,QAAQ,EAC9B,eAAkBG,MAAeM,EAAS,KAAK,OAAO,CAAC,EAGvD,cAAiB,CACfD,EAAe,EACfiP,EAAY,aAAaxP,EAAU,GAAI,IAAI,EAC3CwP,EAAY,cAAc,CAAE,UAAY,GAAUC,EAAM,SAAS,KAAOzP,EAAU,GAAG,EAAG,CAAC,CAC3F,CACF,CAAC,CACH,EAEagQ,OACXjQ,EAAY,CACV,YAAa,CAAC,OAAQ,sBAAsB,EAC5C,KAAM2P,EACN,WAAa,GACXxP,MAAeM,EAAS,KAAK,qBAAqBoP,CAAK,CAAC,CAC5D,CAAC,EAGUK,GAAwB,GACnC9P,EAAS,CACP,SAAUH,EAAU,kBAAkBkQ,GAAS,EAAE,EACjD,YAAe1P,EAAS,YAAY,QAAQ0P,GAAS,EAAE,EACvD,QAAS,EAAQA,EACjB,MAAO,GACP,UAAW,IACX,KAAM,CAAE,OAAQ,EAAK,CACvB,CAAC,EAEUC,OACXpQ,EAAY,CACV,YAAa,CAAC,OAAQ,sBAAsB,EAC5C,KAAM2P,EACN,WAAa,GACXxP,MAAeM,EAAS,KAAK,qBAAqBoP,CAAK,CAAC,CAC5D,CAAC,EAEUQ,OAAyB,CACpC,IAAMZ,EAAcnP,EAAe,EACnC,OAAON,EAAY,CACjB,YAAa,CAAC,OAAQ,eAAe,EACrC,KAAM2P,EACN,WAAa,GAA8BxP,MAAeM,EAAS,KAAK,cAAcoP,CAAK,CAAC,EAC5F,UAAY,GACVJ,EAAY,aAAaxP,EAAU,GAAK,GACtCqQ,GAAU,CAAE,GAAGA,EAAS,MAAK,CAC/B,CACJ,CAAC,CACH,EAEaC,OACXvQ,EAAY,CACV,YAAa,CAAC,OAAQ,gBAAgB,EACtC,KAAM2P,EACN,WAAa,GAA+BxP,MAAeM,EAAS,KAAK,eAAeoP,CAAK,CAAC,EAE9F,WAAY,CAAE,eAAgBnP,EAAa8P,CAAS,CACtD,CAAC,EAGUC,GAA0B,GAAyB,CAC9D,GAAM,CAAE,KAAMtB,GAAOE,GAAM,EAC3B,OAAOF,GAAI,kBAAkB,SAASuB,CAAM,GAAK,EACnD"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./react-CQOZoUwg.js";import{t as n}from"./jsx-runtime-DREnUpxT.js";import{t as r}from"./loader-circle-C-9trZPI.js";import{D as i,E as a,Q as o,_ as s,x as c}from"./auth-C4fHG9Iu.js";import{n as l,t as u}from"./createLucideIcon-CqygG5K6.js";import{_ as d,a as f,b as p,d as ee,f as m,h,i as te,l as g,m as ne,n as re,o as ie,p as _,r as ae,s as oe,t as se,u as v,v as ce,x as le}from"./es2015-BKfbx3rz.js";import{i as y,o as b,t as ue}from"./skeleton-D4eOLKLY.js";import{t as x}from"./cn-DVhJ55Mo.js";function S(){throw Error(`Invariant failed`)}var C=e(t(),1),w=C.createContext(void 0),de=C.createContext(void 0),T={};function E(e,t){let n=C.useRef();return r=>{let i=e?.select?e.select(r):r;return e?.structuralSharing??t.options.defaultStructuralSharing?n.current=o(n.current,i):i}}function D(e){let t=i(),n=C.useContext(e.from?de:w),r=e.from??n,o=t.stores.getMatchStore(r),s=E(e,t),c=a(o,e=>e?s(e):T);if(c!==T)return c;(e.shouldThrow??!0)&&S()}function fe(e){return D({from:e.from,shouldThrow:e.shouldThrow,structuralSharing:e.structuralSharing,strict:e.strict,select:t=>{let n=e.strict===!1?t.params:t._strictParams;return e.select?e.select(n):n}})}var O={name:`lock`,size:24,node:[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]};O.node;var k=u(O),A={name:`triangle-alert`,size:24,node:[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`alert-triangle`]};A.node;var j=u(A),pe={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};pe.node;var me=u(pe),M=e(n(),1),he=Object.defineProperty,N=(e,t)=>he(e,`name`,{value:t,configurable:!0}),P=`Dialog`,[F,ge]=ne(P),[_e,I]=F(P),L=N(e=>{let{__scopeDialog:t,children:n,open:r,defaultOpen:i,onOpenChange:a,modal:o=!0}=e,s=C.useRef(null),c=C.useRef(null),[l,u]=ee({prop:r,defaultProp:i??!1,onChange:a,caller:P}),[d,f]=C.useState(0),[p,m]=C.useState(0);return(0,M.jsx)(_e,{scope:t,triggerRef:s,contentRef:c,contentId:g(),titleId:g(),descriptionId:g(),titlePresent:d>0,descriptionPresent:p>0,setTitleCount:f,setDescriptionCount:m,open:l,onOpenChange:u,onOpenToggle:C.useCallback(()=>u(e=>!e),[u]),modal:o,children:n})},`Dialog`),ve=`DialogTrigger`,R=C.forwardRef(N(function(e,t){let{__scopeDialog:n,...r}=e,i=I(ve,n),a=p(t,i.triggerRef);return(0,M.jsx)(h.button,{type:`button`,"aria-haspopup":`dialog`,"aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":X(i.open),...r,ref:a,onClick:_(e.onClick,i.onOpenToggle)})},`DialogTrigger`)),z=`DialogPortal`,[ye,B]=F(z,{forceMount:void 0}),V=N(e=>{let{__scopeDialog:t,forceMount:n,children:r,container:i}=e,a=I(z,t);return(0,M.jsx)(ye,{scope:t,forceMount:n,children:C.Children.map(r,e=>(0,M.jsx)(v,{present:n||a.open,children:(0,M.jsx)(te,{asChild:!0,container:i,children:e})}))})},`DialogPortal`),H=`DialogOverlay`,U=C.forwardRef(N(function(e,t){let n=B(H,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=I(H,e.__scopeDialog);return a.modal?(0,M.jsx)(v,{present:r||a.open,children:(0,M.jsx)(xe,{...i,ref:t})}):null},`DialogOverlay`)),be=ce(`DialogOverlay.RemoveScroll`),xe=C.forwardRef(N(function(e,t){let{__scopeDialog:n,...r}=e,i=I(H,n),a=oe(),o=p(t,a);return(0,M.jsx)(re,{as:be,allowPinchZoom:!0,shards:[i.contentRef],children:(0,M.jsx)(h.div,{"data-state":X(i.open),...r,ref:o,style:{pointerEvents:`auto`,...r.style}})})},`DialogOverlayImpl`)),W=`DialogContent`,G=C.forwardRef(N(function(e,t){let n=B(W,e.__scopeDialog),{forceMount:r=n.forceMount,...i}=e,a=I(W,e.__scopeDialog);return(0,M.jsx)(v,{present:r||a.open,children:a.modal?(0,M.jsx)(Se,{...i,ref:t}):(0,M.jsx)(Ce,{...i,ref:t})})},`DialogContent`)),Se=C.forwardRef(N(function(e,t){let n=I(W,e.__scopeDialog),r=C.useRef(null),i=p(t,n.contentRef,r);return C.useEffect(()=>{let e=r.current;if(e)return se(e)},[]),(0,M.jsx)(K,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,onCloseAutoFocus:_(e.onCloseAutoFocus,e=>{e.preventDefault(),n.triggerRef.current?.focus()}),onPointerDownOutside:_(e.onPointerDownOutside,e=>{let t=e.detail.originalEvent,n=t.button===0&&t.ctrlKey===!0;(t.button===2||n)&&e.preventDefault()}),onFocusOutside:_(e.onFocusOutside,e=>e.preventDefault())})},`DialogContentModal`)),Ce=C.forwardRef(N(function(e,t){let n=I(W,e.__scopeDialog),r=C.useRef(!1),i=C.useRef(!1);return(0,M.jsx)(K,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:t=>{e.onCloseAutoFocus?.(t),t.defaultPrevented||(r.current||n.triggerRef.current?.focus(),t.preventDefault()),r.current=!1,i.current=!1},onInteractOutside:t=>{e.onInteractOutside?.(t),t.defaultPrevented||(r.current=!0,t.detail.originalEvent.type===`pointerdown`&&(i.current=!0));let a=t.target;n.triggerRef.current?.contains(a)&&t.preventDefault(),t.detail.originalEvent.type===`focusin`&&i.current&&t.preventDefault()}})},`DialogContentNonModal`)),K=C.forwardRef(N(function(e,t){let{__scopeDialog:n,trapFocus:r,onOpenAutoFocus:i,onCloseAutoFocus:a,...o}=e,s=I(W,n);return ae(),(0,M.jsx)(M.Fragment,{children:(0,M.jsx)(f,{asChild:!0,loop:!0,trapped:r,onMountAutoFocus:i,onUnmountAutoFocus:a,children:(0,M.jsx)(ie,{role:`dialog`,id:s.contentId,"aria-describedby":s.descriptionPresent?s.descriptionId:void 0,"aria-labelledby":s.titlePresent?s.titleId:void 0,"data-state":X(s.open),...o,ref:t,deferPointerDownOutside:!0,onDismiss:()=>s.onOpenChange(!1)})})})},`DialogContentImpl`)),we=`DialogTitle`,q=C.forwardRef(N(function(e,t){let{__scopeDialog:n,...r}=e,i=I(we,n),{setTitleCount:a}=i;return m(()=>(a(e=>e+1),()=>a(e=>e-1)),[a]),(0,M.jsx)(h.h2,{id:i.titleId,...r,ref:t})},`DialogTitle`)),Te=`DialogDescription`,J=C.forwardRef(N(function(e,t){let{__scopeDialog:n,...r}=e,i=I(Te,n),{setDescriptionCount:a}=i;return m(()=>(a(e=>e+1),()=>a(e=>e-1)),[a]),(0,M.jsx)(h.p,{id:i.descriptionId,...r,ref:t})},`DialogDescription`)),Ee=`DialogClose`,Y=C.forwardRef(N(function(e,t){let{__scopeDialog:n,...r}=e,i=I(Ee,n);return(0,M.jsx)(h.button,{type:`button`,...r,ref:t,onClick:_(e.onClick,()=>i.onOpenChange(!1))})},`DialogClose`));function X(e){return e?`open`:`closed`}N(X,`getState`);var De=4,Oe=({rows:e=De,className:t})=>{let{t:n}=l();return(0,M.jsxs)(`div`,{role:`status`,"aria-live":`polite`,className:x(`space-y-3`,t),children:[(0,M.jsx)(`span`,{className:`sr-only`,children:n(`common.loading`)}),Array.from({length:e},(e,t)=>(0,M.jsx)(ue,{className:`h-10 w-full`},t))]})},ke=({pending:e,pendingLabel:t,children:n,disabled:i,...a})=>(0,M.jsx)(y,{type:`submit`,disabled:e||i,"aria-busy":e||void 0,...a,children:e?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(r,{className:`animate-spin`,"aria-hidden":`true`}),t]}):n}),Ae=e=>{if(!(e instanceof HTMLElement)||e===document.body)return null;let t=e.closest(`[role="menu"]`),n=t?.id?document.querySelector(`[aria-controls="${CSS.escape(t.id)}"]`):null;return n instanceof HTMLElement?n:e},Z=(e,t)=>{let n=(0,C.useRef)(null);return{onOpenAutoFocus:(0,C.useCallback)(t=>{n.current=Ae(document.activeElement),e?.(t)},[e]),onCloseAutoFocus:(0,C.useCallback)(e=>{t?.(e);let r=n.current;n.current=null,!e.defaultPrevented&&r?.isConnected&&(r.focus({preventScroll:!0}),document.activeElement===r&&e.preventDefault())},[t])}};function je({...e}){return(0,M.jsx)(L,{"data-slot":`sheet`,...e})}function Me({...e}){return(0,M.jsx)(R,{"data-slot":`sheet-trigger`,...e})}function Ne({...e}){return(0,M.jsx)(V,{"data-slot":`sheet-portal`,...e})}function Pe({className:e,...t}){return(0,M.jsx)(U,{"data-slot":`sheet-overlay`,className:x(`fixed inset-0 z-50 bg-overlay/40 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}var Fe=b(`fixed z-50 flex flex-col gap-0 bg-card shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:animate-in data-[state=open]:duration-500`,{variants:{side:{right:`inset-y-0 right-0 h-full w-full border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right`,left:`inset-y-0 left-0 h-full w-full border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left`,top:`inset-x-0 top-0 h-auto border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top`,bottom:`inset-x-0 bottom-0 h-auto max-h-[85dvh] rounded-t-xl border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom`},size:{xs:``,sm:``,md:``,lg:``}},compoundVariants:[{side:[`left`,`right`],size:`xs`,className:`sm:max-w-90`},{side:[`left`,`right`],size:`sm`,className:`sm:max-w-100`},{side:[`left`,`right`],size:`md`,className:`sm:max-w-140`},{side:[`left`,`right`],size:`lg`,className:`sm:max-w-180`}],defaultVariants:{side:`right`,size:`sm`}});function Ie({className:e,children:t,side:n=`right`,size:r=`sm`,showCloseButton:i=!0,nonModal:a=!1,onOpenAutoFocus:o,onCloseAutoFocus:s,onInteractOutside:c,...u}){let d=Z(o,s),{t:f}=l();return(0,M.jsxs)(Ne,{children:[a?null:(0,M.jsx)(Pe,{}),(0,M.jsxs)(G,{"data-slot":`sheet-content`,"data-size":r,"data-non-modal":a||void 0,className:x(Fe({side:n,size:r}),a&&`z-30 shadow-none`,e),onInteractOutside:e=>{a&&e.preventDefault(),c?.(e)},...u,...d,children:[t,i&&(0,M.jsx)(Y,{asChild:!0,children:(0,M.jsxs)(y,{variant:`ghost`,size:`icon-sm`,className:`absolute top-4 right-4 text-muted-foreground`,children:[(0,M.jsx)(me,{"aria-hidden":`true`}),(0,M.jsx)(`span`,{className:`sr-only`,children:f(`common.close`)})]})})]})]})}function Le({className:e,...t}){return(0,M.jsx)(`div`,{"data-slot":`sheet-header`,className:x(`flex flex-col gap-1.5 px-6 pt-6 pb-4`,e),...t})}function Re({className:e,...t}){return(0,M.jsx)(`div`,{"data-slot":`sheet-body`,className:x(`min-h-0 flex-1 overflow-y-auto px-6 pb-6`,e),...t})}function ze({className:e,...t}){return(0,M.jsx)(`div`,{"data-slot":`sheet-footer`,className:x(`mt-auto flex flex-wrap items-center justify-end gap-2 border-t bg-muted/40 px-6 py-4`,e),...t})}function Be({className:e,...t}){return(0,M.jsx)(q,{"data-slot":`sheet-title`,className:x(`text-lg leading-tight font-semibold tracking-tight text-foreground`,e),...t})}function Ve({className:e,...t}){return(0,M.jsx)(J,{"data-slot":`sheet-description`,className:x(`text-sm text-muted-foreground`,e),...t})}var He=b(`flex shrink-0 items-center justify-center rounded-lg`,{variants:{size:{sm:`size-8 [&_svg]:size-4`,md:`size-9 [&_svg]:size-[18px]`,lg:`size-10 [&_svg]:size-5`},tone:{accent:`bg-muted text-primary dark:text-accent-foreground`,muted:`bg-muted text-muted-foreground`,success:`bg-success-muted text-success`,warning:`bg-warning-muted text-warning`,danger:`bg-destructive-muted text-destructive`}},defaultVariants:{size:`md`,tone:`accent`}}),Q=({icon:e,size:t,tone:n,className:r})=>(0,M.jsx)(`span`,{"aria-hidden":`true`,className:x(He({size:t,tone:n}),r),children:(0,M.jsx)(e,{})}),Ue=b(`flex flex-col items-center justify-center gap-3 px-6 text-center`,{variants:{size:{panel:`py-10`,page:`rounded-xl border bg-card py-16`}},defaultVariants:{size:`page`}}),$=({title:e,description:t,icon:n,action:r,size:i,compact:a,className:o})=>a?(0,M.jsxs)(`div`,{className:x(`flex items-center gap-3 px-5 py-3 text-left`,o),children:[n?(0,M.jsx)(Q,{icon:n,size:`sm`}):null,(0,M.jsxs)(`p`,{className:`min-w-0 flex-1 text-sm`,children:[(0,M.jsx)(`span`,{className:`font-semibold`,children:e}),t?(0,M.jsxs)(`span`,{className:`text-muted-foreground`,children:[` `,t]}):null]}),r]}):(0,M.jsxs)(`div`,{className:x(Ue({size:i}),o),children:[n?(0,M.jsx)(Q,{icon:n,size:`lg`}):null,(0,M.jsxs)(`div`,{className:`space-y-1`,children:[(0,M.jsx)(`p`,{className:`text-base font-semibold`,children:e}),t?(0,M.jsx)(`p`,{className:`max-w-md text-sm text-muted-foreground`,children:t}):null]}),r]}),We=b(`mx-auto w-full min-w-0 space-y-6`,{variants:{width:{full:``,default:`max-w-6xl`,narrow:`max-w-3xl`}},defaultVariants:{width:`default`}}),Ge=({width:e,className:t,children:n})=>(0,M.jsx)(`div`,{"data-slot":`page`,className:x(We({width:e}),t),children:n}),Ke=({title:e,breadcrumb:t,badge:n,meta:r,actions:i,tabs:a,sticky:o=!1,className:s})=>{let{t:u}=l();return(0,M.jsxs)(`header`,{"data-slot":`page-header`,className:x(`space-y-4`,o&&`sticky top-12 z-20 -mx-4 border-b bg-background/95 px-4 py-3 backdrop-blur supports-[backdrop-filter]:bg-background/80 sm:-mx-8 sm:px-8 lg:top-0`,s),children:[(0,M.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-x-4 gap-y-3`,children:[(0,M.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[t&&t.length>0?(0,M.jsx)(`nav`,{"aria-label":u(`common.breadcrumb`),children:(0,M.jsx)(`ol`,{className:`flex flex-wrap items-center gap-1.5 text-meta font-medium text-muted-foreground`,children:t.map((e,t)=>(0,M.jsxs)(C.Fragment,{children:[t>0?(0,M.jsx)(`li`,{"aria-hidden":`true`,className:`text-muted-foreground/70`,children:`/`}):null,(0,M.jsx)(`li`,{className:`min-w-0 truncate`,children:e.link?(0,M.jsx)(c,{...e.link,className:`rounded-sm outline-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50`,children:e.label}):e.label})]},`${e.label}-${t}`))})}):null,(0,M.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,M.jsx)(`h1`,{className:`min-w-0 text-title break-words`,children:e}),n]}),r?(0,M.jsx)(`div`,{className:`text-meta text-muted-foreground`,children:r}):null]}),i?(0,M.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:i}):null]}),a]})},qe=({error:e,onRetry:t,size:n=`page`,className:r})=>{let{t:i}=l();return s(e)?(0,M.jsx)($,{icon:k,title:i(`errors.forbidden`),description:i(`errors.forbiddenDescription`),size:n,className:r}):(0,M.jsx)(`div`,{role:`alert`,children:(0,M.jsx)($,{icon:j,title:i(`errors.loadFailed`),description:le(e),action:t?(0,M.jsx)(y,{variant:`outline`,onClick:t,children:i(`common.retry`)}):void 0,size:n,className:r})})},Je=b(`inline-flex w-fit shrink-0 items-center gap-1.5 rounded-full font-semibold whitespace-nowrap`,{variants:{tone:{neutral:`bg-muted text-foreground`,progress:`bg-muted text-muted-foreground`,scheduled:`bg-info-muted text-info`,success:`bg-success-muted text-success`,warning:`bg-warning-muted text-warning`,danger:`bg-destructive-muted text-destructive`,muted:`border text-muted-foreground`},size:{default:`h-6 px-2.5 text-xs`,sm:`h-5 px-2 text-2xs`}},defaultVariants:{tone:`neutral`,size:`default`}}),Ye={neutral:`bg-muted-foreground`,progress:`bg-muted-foreground`,scheduled:`bg-info`,success:`bg-success`,warning:`bg-warning`,danger:`bg-destructive`,muted:`border border-muted-foreground`},Xe=({tone:e,label:t,live:n=!0,size:i,className:a})=>(0,M.jsxs)(`span`,{"data-slot":`status-chip`,"data-tone":e,className:x(Je({tone:e,size:i}),a),children:[e===`progress`&&n?(0,M.jsx)(r,{"aria-hidden":`true`,className:`size-3 animate-spin motion-reduce:animate-none`}):(0,M.jsx)(`span`,{"aria-hidden":`true`,className:x(`size-1.5 shrink-0 rounded-full`,Ye[e])}),t]}),Ze=b(`inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-semibold whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3`,{variants:{variant:{secondary:`bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90`,outline:`border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground`}},defaultVariants:{variant:`secondary`}});function Qe({className:e,variant:t=`secondary`,asChild:n=!1,...r}){let i=n?d:`span`;return(0,M.jsx)(i,{"data-slot":`badge`,"data-variant":t,className:x(Ze({variant:t}),e),...r})}export{k as A,U as C,ge as D,R as E,S as F,D as M,E as N,me as O,w as P,J as S,q as T,ke as _,Ge as a,Y as b,je as c,Ve as d,ze as f,Z as g,Me as h,Ke as i,fe as j,j as k,Re as l,Be as m,Xe as n,$ as o,Le as p,qe as r,Q as s,Qe as t,Ie as u,Oe as v,V as w,G as x,L as y};
|
|
2
|
-
//# sourceMappingURL=badge-vLiQczOd.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{A as e,O as t,i as n,j as r,lt as i,o as a}from"./loader-circle-C-9trZPI.js";import{m as o,t as s}from"./createLucideIcon-CqygG5K6.js";import{C as c}from"./InfoHint-Dyzyf59c.js";import{a as l}from"./publishing-B7zv1e7j.js";var u={name:`refresh-cw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]};u.node;var d=s(u),f=a.changeSets,p={silent:!0},m=`open,scheduled,shipping,failed`,h=(e=m)=>r({queryKey:t.develop.changeSets.list(e),queryFn:()=>f.list({status:e,limit:100}),meta:p}),g=e=>e?.status===`shipping`&&l,_=e=>r({queryKey:t.develop.changeSets.set(e),queryFn:()=>f.get(e),refetchInterval:e=>g(e.state.data),meta:p}),v=e=>r({queryKey:t.develop.changeSets.review(e),queryFn:()=>f.review(e),refetchOnWindowFocus:!1,meta:p}),y=e=>r({queryKey:t.develop.changeSets.timeline(e),queryFn:()=>f.timeline(e),meta:p}),b=()=>r({queryKey:t.develop.changeSets.unassigned,queryFn:()=>f.unassigned({limit:100}),meta:p}),x=(r,a)=>{let o=i();return e({mutationKey:[`changeSets`,r],meta:p,mutationFn:e=>n(()=>a(e)),onSuccess:e=>(o.setQueryData(t.develop.changeSets.set(e.id),e),o.invalidateQueries({queryKey:t.develop.changeSets.all}))})},S=()=>x(`create`,e=>f.create(e)),C=()=>x(`update`,({id:e,input:t})=>f.update(e,t)),w=()=>x(`discard`,e=>f.discard(e)),T=()=>x(`addEntry`,({id:e,input:t})=>f.addEntry(e,t)),E=()=>x(`removeItem`,({id:e,itemId:t})=>f.removeItem(e,t)),D=()=>x(`ship`,({id:e,input:t})=>f.ship(e,t)),O=()=>x(`schedule`,({id:e,input:t})=>f.schedule(e,t)),k=()=>x(`unschedule`,e=>f.unschedule(e)),A=async e=>{let t=(await f.list({status:`open`,limit:1})).items[0]??await f.create({title:e,source:`builder`});return f.get(t.id)},j=()=>{let r=i();return e({mutationKey:[`changeSets`,`saveDraft`],meta:p,mutationFn:({definitionId:e,input:t,newSetTitle:r})=>n(async()=>{let n=await A(r),i=n.items.find(t=>t.kind===`schema`&&t.definitionId===e);return await f.putSchemaDraft(n.id,e,{...t,...i?.kind===`schema`?{expectedDraftVersion:i.draftVersion}:{}}),n.id}),onSuccess:()=>r.invalidateQueries({queryKey:t.develop.changeSets.all})})},M=()=>{let r=i();return e({mutationKey:[`changeSets`,`saveNewDefinitions`],meta:p,mutationFn:({definitions:e,newSetTitle:t})=>n(async()=>{let n=await A(t);for(let t of e)await f.putSchemaDraft(n.id,t.id,{category:t.kind===`component`?`component`:`model`,definition:t,baseVersion:null});return n.id}),onSuccess:()=>r.invalidateQueries({queryKey:t.develop.changeSets.all})})},N=(e,n)=>r({queryKey:t.develop.changeSets.draft(e,n),queryFn:()=>f.getSchemaDraft(e,n),meta:p}),P=e=>new o(422,{error:{code:e.error?.code??`CHANGE_SET_FAILED`,message:e.error?.message??e.title}}),F=()=>{let r=i();return e({mutationKey:[`changeSets`,`shipDraftNow`],meta:p,mutationFn:({definitionId:e,input:t,acknowledgement:r,title:i})=>n(async()=>{let n=await f.create({title:i,source:`builder`}),a;try{await f.putSchemaDraft(n.id,e,t);let i=await f.get(n.id);a=await f.ship(i.id,{expectedVersion:i.version,...r})}catch(e){throw await f.discard(n.id).catch(e=>c(e,`discarding a change set the builder could not ship`)),e}if(a.status===`failed`)throw P(a);return a}),onSettled:()=>Promise.all([r.invalidateQueries({queryKey:t.develop.changeSets.all}),r.invalidateQueries({queryKey:t.schema.all})])})};export{C as _,h as a,E as c,O as d,N as f,k as g,b as h,y as i,j as l,F as m,_ as n,S as o,D as p,v as r,w as s,T as t,M as u,d as v};
|
|
2
|
-
//# sourceMappingURL=changeSets-D5VevASj.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"changeSets-D5VevASj.js","names":["useMutation","queryKeys","withCsrf","useQuery","useQueryClient","adminApi","ShapioApiError","createLucideIcon","logError","PUBLISHING_POLL_INTERVAL_MS","__iconData","RefreshCw","changeSetsApi","silent","ACTIVE_CHANGE_SET_STATUSES","useChangeSets","status","pollWhileShipping","set","useChangeSet","id","query","useChangeSetReview","useChangeSetTimeline","useUnassignedEntries","useChangeSetWrite","queryClient","action","call","variables","useCreateChangeSet","input","useUpdateChangeSet","useDiscardChangeSet","useAddChangeSetEntry","useRemoveChangeSetItem","itemId","useShipChangeSet","useScheduleChangeSet","useUnscheduleChangeSet","openOrCreateChangeSet","target","useSaveDraftToChangeSet","newSetTitle","existing","item","definitionId","useSaveNewDefinitionsToChangeSet","definition","definitions","useSchemaDraft","failureOf","useShipDraftNow","created","shipped","acknowledgement","error","cause"],"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/refresh-cw.mjs","../../src/api/changeSets.ts"],"sourcesContent":["/**\n * @license lucide-react v1.49.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"refresh-cw\",\n size: 24,\n node: [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n ]\n};\n__iconData.node;\nconst RefreshCw = createLucideIcon(__iconData);\n\nexport { __iconData, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\n","import type {\n AddChangeSetEntryInput,\n ChangeSet,\n CreateChangeSetInput,\n PutSchemaDraftInput,\n ScheduleChangeSetInput,\n ShipChangeSetInput,\n UpdateChangeSetInput,\n} from '@shapio/client';\nimport { ShapioApiError } from '@shapio/client';\nimport type { SchemaDefinition } from '@shapio/schema';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { PUBLISHING_POLL_INTERVAL_MS } from '@/constants/publishing';\nimport { logError } from '@/helpers/reportError';\nimport { adminApi } from './client';\nimport { withCsrf } from './csrf';\nimport { queryKeys } from './queryKeys';\n\nconst changeSetsApi = adminApi.changeSets;\n\nconst silent = { silent: true } as const;\n\n/** Every set that still matters on the Changes page (shipped and discarded ones live in the ledger). */\nexport const ACTIVE_CHANGE_SET_STATUSES = 'open,scheduled,shipping,failed';\n\nexport const useChangeSets = (status: string = ACTIVE_CHANGE_SET_STATUSES) =>\n useQuery({\n queryKey: queryKeys.develop.changeSets.list(status),\n queryFn: () => changeSetsApi.list({ status, limit: 100 }),\n meta: silent,\n });\n\nconst pollWhileShipping = (set: ChangeSet | undefined) =>\n set?.status === 'shipping' ? PUBLISHING_POLL_INTERVAL_MS : false;\n\n/** One set, polled while it ships in the background (prerequisites running). */\nexport const useChangeSet = (id: string) =>\n useQuery({\n queryKey: queryKeys.develop.changeSets.set(id),\n queryFn: () => changeSetsApi.get(id),\n refetchInterval: (query) => pollWhileShipping(query.state.data),\n meta: silent,\n });\n\n/** The review (diffs, planner results, consumers, checks). Not refetched on focus: a strict ship needs a stable view. */\nexport const useChangeSetReview = (id: string) =>\n useQuery({\n queryKey: queryKeys.develop.changeSets.review(id),\n queryFn: () => changeSetsApi.review(id),\n refetchOnWindowFocus: false,\n meta: silent,\n });\n\nexport const useChangeSetTimeline = (id: string) =>\n useQuery({\n queryKey: queryKeys.develop.changeSets.timeline(id),\n queryFn: () => changeSetsApi.timeline(id),\n meta: silent,\n });\n\n/** Entry drafts not in any open set. */\nexport const useUnassignedEntries = () =>\n useQuery({\n queryKey: queryKeys.develop.changeSets.unassigned,\n queryFn: () => changeSetsApi.unassigned({ limit: 100 }),\n meta: silent,\n });\n\n/**\n * Every write answers with the whole set: it replaces the cached set, and the lists, the review and the\n * timeline are refreshed (the review is what a strict ship is checked against).\n */\nconst useChangeSetWrite = <TVariables>(\n action: string,\n call: (variables: TVariables) => Promise<ChangeSet>,\n) => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['changeSets', action],\n meta: silent,\n mutationFn: (variables: TVariables) => withCsrf(() => call(variables)),\n onSuccess: (set) => {\n queryClient.setQueryData(queryKeys.develop.changeSets.set(set.id), set);\n return queryClient.invalidateQueries({ queryKey: queryKeys.develop.changeSets.all });\n },\n });\n};\n\nexport const useCreateChangeSet = () =>\n useChangeSetWrite('create', (input: CreateChangeSetInput) => changeSetsApi.create(input));\n\n/** 409 when `expectedVersion` is stale. */\nexport const useUpdateChangeSet = () =>\n useChangeSetWrite('update', ({ id, input }: { id: string; input: UpdateChangeSetInput }) =>\n changeSetsApi.update(id, input),\n );\n\nexport const useDiscardChangeSet = () =>\n useChangeSetWrite('discard', (id: string) => changeSetsApi.discard(id));\n\nexport const useAddChangeSetEntry = () =>\n useChangeSetWrite('addEntry', ({ id, input }: { id: string; input: AddChangeSetEntryInput }) =>\n changeSetsApi.addEntry(id, input),\n );\n\nexport const useRemoveChangeSetItem = () =>\n useChangeSetWrite('removeItem', ({ id, itemId }: { id: string; itemId: string }) =>\n changeSetsApi.removeItem(id, itemId),\n );\n\n/** Resolves with the set: `shipped`/`failed` inline, or `shipping` (prerequisites run; the set is polled). */\nexport const useShipChangeSet = () =>\n useChangeSetWrite('ship', ({ id, input }: { id: string; input: ShipChangeSetInput }) =>\n changeSetsApi.ship(id, input),\n );\n\nexport const useScheduleChangeSet = () =>\n useChangeSetWrite('schedule', ({ id, input }: { id: string; input: ScheduleChangeSetInput }) =>\n changeSetsApi.schedule(id, input),\n );\n\nexport const useUnscheduleChangeSet = () =>\n useChangeSetWrite('unschedule', (id: string) => changeSetsApi.unschedule(id));\n\n/** The newest open change set (with its items), or a new one named `title` when none is open. */\nconst openOrCreateChangeSet = async (title: string) => {\n const open = await changeSetsApi.list({ status: 'open', limit: 1 });\n const target = open.items[0] ?? (await changeSetsApi.create({ title, source: 'builder' }));\n return changeSetsApi.get(target.id);\n};\n\n/**\n * The builder's \"Review in a change set\": saves the schema draft into the newest open set (or a new one\n * named `newSetTitle`), replacing that set's earlier draft of the same definition, and resolves with the\n * set's ID so the caller can open its review.\n */\nexport const useSaveDraftToChangeSet = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['changeSets', 'saveDraft'],\n meta: silent,\n mutationFn: ({\n definitionId,\n input,\n newSetTitle,\n }: {\n definitionId: string;\n input: Omit<PutSchemaDraftInput, 'expectedDraftVersion'>;\n newSetTitle: string;\n }) =>\n withCsrf(async () => {\n const set = await openOrCreateChangeSet(newSetTitle);\n const existing = set.items.find(\n (item) => item.kind === 'schema' && item.definitionId === definitionId,\n );\n await changeSetsApi.putSchemaDraft(set.id, definitionId, {\n ...input,\n ...(existing?.kind === 'schema' ? { expectedDraftVersion: existing.draftVersion } : {}),\n });\n return set.id;\n }),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.develop.changeSets.all }),\n });\n};\n\n/**\n * New definitions proposed together (\"Describe it\"): each saved as a schema draft into the newest open set\n * (or a new one named `newSetTitle`), in the order given (references first). Resolves with the set's ID.\n */\nexport const useSaveNewDefinitionsToChangeSet = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['changeSets', 'saveNewDefinitions'],\n meta: silent,\n mutationFn: ({\n definitions,\n newSetTitle,\n }: {\n definitions: readonly SchemaDefinition[];\n newSetTitle: string;\n }) =>\n withCsrf(async () => {\n const set = await openOrCreateChangeSet(newSetTitle);\n for (const definition of definitions) {\n // One at a time: a later definition may reference an earlier one.\n await changeSetsApi.putSchemaDraft(set.id, definition.id, {\n category: definition.kind === 'component' ? 'component' : 'model',\n definition,\n baseVersion: null,\n });\n }\n return set.id;\n }),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: queryKeys.develop.changeSets.all }),\n });\n};\n\n/** The schema draft of one item, for the before/after of a schema diff card. */\nexport const useSchemaDraft = (id: string, definitionId: string) =>\n useQuery({\n queryKey: queryKeys.develop.changeSets.draft(id, definitionId),\n queryFn: () => changeSetsApi.getSchemaDraft(id, definitionId),\n meta: silent,\n });\n\ntype ShipDraftNowInput = {\n definitionId: string;\n input: Omit<PutSchemaDraftInput, 'expectedDraftVersion'>;\n acknowledgement: Pick<ShipChangeSetInput, 'acknowledgeBreaking' | 'acknowledgeDestructive'>;\n title: string;\n};\n\n/** A set that ended `failed` as the request's error, so the caller shows the reason like any other. */\nconst failureOf = (set: ChangeSet) =>\n new ShapioApiError(422, {\n error: { code: set.error?.code ?? 'CHANGE_SET_FAILED', message: set.error?.message ?? set.title },\n });\n\n/**\n * The builder's \"Ship now\" (plan developer-face §5): a one-item change set holding the schema draft,\n * shipped at once. Resolves with the set: `shipped`, or `shipping` while prerequisites run in the\n * background (its schema change shows in the builder as a pending change). A refused ship discards the\n * set it just created, so nothing is left behind; a ship that ran and failed keeps the set as history.\n */\nexport const useShipDraftNow = () => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationKey: ['changeSets', 'shipDraftNow'],\n meta: silent,\n mutationFn: ({ definitionId, input, acknowledgement, title }: ShipDraftNowInput) =>\n withCsrf(async () => {\n const created = await changeSetsApi.create({ title, source: 'builder' });\n let shipped: ChangeSet;\n try {\n await changeSetsApi.putSchemaDraft(created.id, definitionId, input);\n const set = await changeSetsApi.get(created.id);\n shipped = await changeSetsApi.ship(set.id, { expectedVersion: set.version, ...acknowledgement });\n } catch (error) {\n await changeSetsApi\n .discard(created.id)\n .catch((cause: unknown) => logError(cause, 'discarding a change set the builder could not ship'));\n throw error;\n }\n if (shipped.status === 'failed') {\n throw failureOf(shipped);\n }\n return shipped;\n }),\n onSettled: () =>\n Promise.all([\n queryClient.invalidateQueries({ queryKey: queryKeys.develop.changeSets.all }),\n queryClient.invalidateQueries({ queryKey: queryKeys.schema.all }),\n ]),\n });\n};\n"],"ignoreList":[0],"mappings":"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"}
|