@dcl/landing-site 0.5.1-24667963662.commit-e7db321 → 0.5.1-24671743849.commit-e464803
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/assets/{AnimatedBackground-DBObVbM7.js → AnimatedBackground-B-L76Zza.js} +2 -2
- package/assets/{AnimatedBackground-DBObVbM7.js.map → AnimatedBackground-B-L76Zza.js.map} +1 -1
- package/assets/{AnimatedSection-Dy2CqHWv.js → AnimatedSection-C7y4e9MO.js} +1 -1
- package/assets/{AnimatedSection-Dy2CqHWv.js.map → AnimatedSection-C7y4e9MO.js.map} +1 -1
- package/assets/{ArrowBackIosNew-ClpqCBiA.js → ArrowBackIosNew-m07XLZJ3.js} +1 -1
- package/assets/{ArrowBackIosNew-ClpqCBiA.js.map → ArrowBackIosNew-m07XLZJ3.js.map} +1 -1
- package/assets/{AuthorPage-pJ7qR6DU.js → AuthorPage-HEjEdZnQ.js} +1 -1
- package/assets/{AuthorPage-pJ7qR6DU.js.map → AuthorPage-HEjEdZnQ.js.map} +1 -1
- package/assets/{Badges-DLM7WLac.js → Badges-C3LP2L14.js} +1 -1
- package/assets/{Badges-DLM7WLac.js.map → Badges-C3LP2L14.js.map} +1 -1
- package/assets/{BlogLayout-DdVPRVwT.js → BlogLayout-DOXQWe4b.js} +1 -1
- package/assets/{BlogLayout-DdVPRVwT.js.map → BlogLayout-DOXQWe4b.js.map} +1 -1
- package/assets/{BlogPage-DJ5seXTi.js → BlogPage-BYou2PX1.js} +1 -1
- package/assets/{BlogPage-DJ5seXTi.js.map → BlogPage-BYou2PX1.js.map} +1 -1
- package/assets/{CTAButton-G_F6A2kc.js → CTAButton-DIvER7jP.js} +1 -1
- package/assets/{CTAButton-G_F6A2kc.js.map → CTAButton-DIvER7jP.js.map} +1 -1
- package/assets/{CardContent--XD8e3JI.js → CardContent-CTD4H4a5.js} +1 -1
- package/assets/{CardContent--XD8e3JI.js.map → CardContent-CTD4H4a5.js.map} +1 -1
- package/assets/{CardMedia-DlGw2npC.js → CardMedia-DkSJQ0Yc.js} +1 -1
- package/assets/{CardMedia-DlGw2npC.js.map → CardMedia-DkSJQ0Yc.js.map} +1 -1
- package/assets/{Carousel-GdhNbXzm.js → Carousel-Bz36sWAV.js} +1 -1
- package/assets/{Carousel-GdhNbXzm.js.map → Carousel-Bz36sWAV.js.map} +1 -1
- package/assets/{CategoryPage-DahoLfHy.js → CategoryPage-5N-S_EtG.js} +1 -1
- package/assets/{CategoryPage-DahoLfHy.js.map → CategoryPage-5N-S_EtG.js.map} +1 -1
- package/assets/{CircleAndArrow-C6RrImNk.js → CircleAndArrow-DDOq4aRv.js} +1 -1
- package/assets/{CircleAndArrow-C6RrImNk.js.map → CircleAndArrow-DDOq4aRv.js.map} +1 -1
- package/assets/{CircularProgress-DcmGIHDk.js → CircularProgress-DMJbftwB.js} +1 -1
- package/assets/{CircularProgress-DcmGIHDk.js.map → CircularProgress-DMJbftwB.js.map} +1 -1
- package/assets/{ContentCopy-DZXGXqqg.js → ContentCopy-Die7TKLF.js} +1 -1
- package/assets/{ContentCopy-DZXGXqqg.js.map → ContentCopy-Die7TKLF.js.map} +1 -1
- package/assets/{CreateEventPage-CLt56AWQ.js → CreateEventPage-DB5tddNm.js} +1 -1
- package/assets/{CreateEventPage-CLt56AWQ.js.map → CreateEventPage-DB5tddNm.js.map} +1 -1
- package/assets/{CreatorHubDownload-C7cTzZ_n.js → CreatorHubDownload-DVIZjVQI.js} +1 -1
- package/assets/{CreatorHubDownload-C7cTzZ_n.js.map → CreatorHubDownload-DVIZjVQI.js.map} +1 -1
- package/assets/{CreatorHubDownloadSuccess-DipAyW_h.js → CreatorHubDownloadSuccess-D0krvgHC.js} +1 -1
- package/assets/{CreatorHubDownloadSuccess-DipAyW_h.js.map → CreatorHubDownloadSuccess-D0krvgHC.js.map} +1 -1
- package/assets/DappsShell-DXZfdOqe.js +1 -0
- package/assets/DappsShell-DXZfdOqe.js.map +1 -0
- package/assets/{DownloadSuccessLayout-Di5Qa-ZM.js → DownloadSuccessLayout-B5KxILAh.js} +1 -1
- package/assets/{DownloadSuccessLayout-Di5Qa-ZM.js.map → DownloadSuccessLayout-B5KxILAh.js.map} +1 -1
- package/assets/{Grow-BmtKtm1i.js → Grow-BbhVo4-Q.js} +1 -1
- package/assets/{Grow-BmtKtm1i.js.map → Grow-BbhVo4-Q.js.map} +1 -1
- package/assets/HomePage-CSW35au2.js +3 -0
- package/assets/HomePage-CSW35au2.js.map +1 -0
- package/assets/{InviteFaqs-4RRixgP-.js → InviteFaqs-BZEDqRWz.js} +1 -1
- package/assets/{InviteFaqs-4RRixgP-.js.map → InviteFaqs-BZEDqRWz.js.map} +1 -1
- package/assets/{InvitePage-CtNmz2y6.js → InvitePage-CNSVnM5F.js} +2 -2
- package/assets/{InvitePage-CtNmz2y6.js.map → InvitePage-CNSVnM5F.js.map} +1 -1
- package/assets/{JumpInIcon-DGqWIU4o.js → JumpInIcon-DsVzhXWI.js} +1 -1
- package/assets/{JumpInIcon-DGqWIU4o.js.map → JumpInIcon-DsVzhXWI.js.map} +1 -1
- package/assets/{LegalPageLayout-l-OS4ZYa.js → LegalPageLayout-BGd6IPpz.js} +1 -1
- package/assets/{LegalPageLayout-l-OS4ZYa.js.map → LegalPageLayout-BGd6IPpz.js.map} +1 -1
- package/assets/{Link-B-065zLP.js → Link-C-K90yR0.js} +1 -1
- package/assets/{Link-B-065zLP.js.map → Link-C-K90yR0.js.map} +1 -1
- package/assets/{MenuItem-ChXNXZTb.js → MenuItem-DJBLDqfL.js} +1 -1
- package/assets/{MenuItem-ChXNXZTb.js.map → MenuItem-DJBLDqfL.js.map} +1 -1
- package/assets/{Paper-BJ-Nl60w.js → Paper-BcsxEQWA.js} +1 -1
- package/assets/{Paper-BJ-Nl60w.js.map → Paper-BcsxEQWA.js.map} +1 -1
- package/assets/{PostCard-DajPpr0c.js → PostCard-CalYnkvr.js} +1 -1
- package/assets/{PostCard-DajPpr0c.js.map → PostCard-CalYnkvr.js.map} +1 -1
- package/assets/{PostPage-DIcWHUae.js → PostPage-DYDVBmyR.js} +1 -1
- package/assets/{PostPage-DIcWHUae.js.map → PostPage-DYDVBmyR.js.map} +1 -1
- package/assets/{PostPage.styled-COnewpe7.js → PostPage.styled-B-fdiFDU.js} +3 -3
- package/assets/{PostPage.styled-COnewpe7.js.map → PostPage.styled-B-fdiFDU.js.map} +1 -1
- package/assets/{PreviewPage-Cn2WEC12.js → PreviewPage-BE7HyZTt.js} +1 -1
- package/assets/{PreviewPage-Cn2WEC12.js.map → PreviewPage-BE7HyZTt.js.map} +1 -1
- package/assets/{SEO-DlSMNiIG.js → SEO-P8y8JbS9.js} +1 -1
- package/assets/{SEO-DlSMNiIG.js.map → SEO-P8y8JbS9.js.map} +1 -1
- package/assets/{SearchPage-BsXG81Nf.js → SearchPage-BraoruXd.js} +1 -1
- package/assets/{SearchPage-BsXG81Nf.js.map → SearchPage-BraoruXd.js.map} +1 -1
- package/assets/{SignInRedirect-D3cos3JN.js → SignInRedirect-COcA7WhX.js} +1 -1
- package/assets/{SignInRedirect-D3cos3JN.js.map → SignInRedirect-COcA7WhX.js.map} +1 -1
- package/assets/{SignInRedirect-Q4rx62U6.js → SignInRedirect-CS5Xkoa_.js} +1 -1
- package/assets/{SignInRedirect-Q4rx62U6.js.map → SignInRedirect-CS5Xkoa_.js.map} +1 -1
- package/assets/{Skeleton-D8JfGaaX.js → Skeleton-o93N4ZZz.js} +1 -1
- package/assets/{Skeleton-D8JfGaaX.js.map → Skeleton-o93N4ZZz.js.map} +1 -1
- package/assets/{TwitterEmbed-DeMZkX3S.js → TwitterEmbed-C3w4WnFA.js} +1 -1
- package/assets/{TwitterEmbed-DeMZkX3S.js.map → TwitterEmbed-C3w4WnFA.js.map} +1 -1
- package/assets/{Video-CiAQnrOo.js → Video-DF4ljNzn.js} +1 -1
- package/assets/{Video-CiAQnrOo.js.map → Video-DF4ljNzn.js.map} +1 -1
- package/assets/WearablePreview-5JNPj6PX.js +4 -0
- package/assets/{WearablePreview-CFkTJn9i.js.map → WearablePreview-5JNPj6PX.js.map} +1 -1
- package/assets/{auto-track-_HUtnguT.js → auto-track-UkqTRxye.js} +1 -1
- package/assets/{auto-track-_HUtnguT.js.map → auto-track-UkqTRxye.js.map} +1 -1
- package/assets/{ccip-DNbAsZz-.js → ccip-cqtPy8Xz.js} +1 -1
- package/assets/{ccip-DNbAsZz-.js.map → ccip-cqtPy8Xz.js.map} +1 -1
- package/assets/{createSvgIcon-BLdKozgH.js → createSvgIcon-DH_tCoWL.js} +1 -1
- package/assets/{createSvgIcon-BLdKozgH.js.map → createSvgIcon-DH_tCoWL.js.map} +1 -1
- package/assets/{download-oFyIG5OP.js → download-DQLaB97z.js} +2 -2
- package/assets/{download-oFyIG5OP.js.map → download-DQLaB97z.js.map} +1 -1
- package/assets/{downloadWithIdentity-BYnQvFTU.js → downloadWithIdentity-dAd_6Xjv.js} +1 -1
- package/assets/{downloadWithIdentity-BYnQvFTU.js.map → downloadWithIdentity-dAd_6Xjv.js.map} +1 -1
- package/assets/{events.client-LWw5jd-t.js → events.client-DDwZtrCh.js} +1 -1
- package/assets/{events.client-LWw5jd-t.js.map → events.client-DDwZtrCh.js.map} +1 -1
- package/assets/{index-BCgaMgYt.js → index-71royYUE.js} +1 -1
- package/assets/{index-BCgaMgYt.js.map → index-71royYUE.js.map} +1 -1
- package/assets/{index-CM5Uohwh.js → index-B4ReIH01.js} +1 -1
- package/assets/{index-CM5Uohwh.js.map → index-B4ReIH01.js.map} +1 -1
- package/assets/{index-BLczpcuT.js → index-BQaEVpup.js} +1 -1
- package/assets/{index-BLczpcuT.js.map → index-BQaEVpup.js.map} +1 -1
- package/assets/{index-8P9wWk_Z.js → index-Bi1_667A.js} +1 -1
- package/assets/{index-8P9wWk_Z.js.map → index-Bi1_667A.js.map} +1 -1
- package/assets/{index-DVTinPKV.js → index-Bo0hqmw3.js} +1 -1
- package/assets/{index-DVTinPKV.js.map → index-Bo0hqmw3.js.map} +1 -1
- package/assets/{index-Czi9R2pR.js → index-BpUUMJJL.js} +2 -2
- package/assets/{index-Czi9R2pR.js.map → index-BpUUMJJL.js.map} +1 -1
- package/assets/{index-HZ_h_54S.js → index-BqghIvCc.js} +3 -3
- package/assets/{index-HZ_h_54S.js.map → index-BqghIvCc.js.map} +1 -1
- package/assets/{index-58xN71Vu.js → index-BsykSOSe.js} +1 -1
- package/assets/{index-58xN71Vu.js.map → index-BsykSOSe.js.map} +1 -1
- package/assets/{index-TaLrFo1W.js → index-BxxIREHz.js} +4 -4
- package/assets/{index-TaLrFo1W.js.map → index-BxxIREHz.js.map} +1 -1
- package/assets/{index-u4hJejM4.js → index-C2gGmY4r.js} +1 -1
- package/assets/{index-u4hJejM4.js.map → index-C2gGmY4r.js.map} +1 -1
- package/assets/{index-C1oFIVjZ.js → index-CM-Dg90Z.js} +1 -1
- package/assets/{index-C1oFIVjZ.js.map → index-CM-Dg90Z.js.map} +1 -1
- package/assets/{index-B5OoPTnM.js → index-CYTF85t8.js} +1 -1
- package/assets/{index-B5OoPTnM.js.map → index-CYTF85t8.js.map} +1 -1
- package/assets/{index-DbaTk9pY.js → index-CZS6DsWa.js} +1 -1
- package/assets/{index-DbaTk9pY.js.map → index-CZS6DsWa.js.map} +1 -1
- package/assets/{index-BrJrrR0-.js → index-C_C2-CZT.js} +1 -1
- package/assets/{index-BrJrrR0-.js.map → index-C_C2-CZT.js.map} +1 -1
- package/assets/{index-BqLCay_i.js → index-D1lz72ps.js} +1 -1
- package/assets/{index-BqLCay_i.js.map → index-D1lz72ps.js.map} +1 -1
- package/assets/{index-Bs8_TMuc.js → index-D7GZzk0M.js} +1 -1
- package/assets/{index-Bs8_TMuc.js.map → index-D7GZzk0M.js.map} +1 -1
- package/assets/{index-B9J5C5eN.js → index-DNCSZ9Ly.js} +1 -1
- package/assets/{index-B9J5C5eN.js.map → index-DNCSZ9Ly.js.map} +1 -1
- package/assets/{index-CREsCA81.js → index-DRcrw7Py.js} +1 -1
- package/assets/{index-CREsCA81.js.map → index-DRcrw7Py.js.map} +1 -1
- package/assets/{index-BQ4lI5xX.js → index-DaRevScO.js} +3 -3
- package/assets/{index-BQ4lI5xX.js.map → index-DaRevScO.js.map} +1 -1
- package/assets/{index-DfT-Sjnk.js → index-Dfjt7DKD.js} +1 -1
- package/assets/{index-DfT-Sjnk.js.map → index-Dfjt7DKD.js.map} +1 -1
- package/assets/{index-BqTu8LQP.js → index-DqPgEQko.js} +1 -1
- package/assets/{index-BqTu8LQP.js.map → index-DqPgEQko.js.map} +1 -1
- package/assets/{index-B7Bs_7eg.js → index-DsiqoitH.js} +1 -1
- package/assets/{index-B7Bs_7eg.js.map → index-DsiqoitH.js.map} +1 -1
- package/assets/{index-C5I7_h2M.js → index-LYkhcWuH.js} +1 -1
- package/assets/{index-C5I7_h2M.js.map → index-LYkhcWuH.js.map} +1 -1
- package/assets/{index-C8kkckun.js → index-Oqf5zL8M.js} +1 -1
- package/assets/{index-C8kkckun.js.map → index-Oqf5zL8M.js.map} +1 -1
- package/assets/{index-BeEdEvw9.js → index-bKbknVRg.js} +1 -1
- package/assets/{index-BeEdEvw9.js.map → index-bKbknVRg.js.map} +1 -1
- package/assets/{index-CXRPJhvA.js → index-ezM_J58e.js} +1 -1
- package/assets/{index-CXRPJhvA.js.map → index-ezM_J58e.js.map} +1 -1
- package/assets/{index-g0lykA2w.js → index-mXhpN3cS.js} +1 -1
- package/assets/{index-g0lykA2w.js.map → index-mXhpN3cS.js.map} +1 -1
- package/assets/{index-lCIXH0YF.js → index-n-p43kD4.js} +1 -1
- package/assets/{index-lCIXH0YF.js.map → index-n-p43kD4.js.map} +1 -1
- package/assets/{index-C6h0Y6Bf.js → index-ppzLK-bi.js} +1 -1
- package/assets/{index-C6h0Y6Bf.js.map → index-ppzLK-bi.js.map} +1 -1
- package/assets/{index-Ct6j5i60.js → index-pvI36Hvg.js} +1 -1
- package/assets/{index-Ct6j5i60.js.map → index-pvI36Hvg.js.map} +1 -1
- package/assets/{index-Dpp1tkiC.js → index-qFakdhOO.js} +1 -1
- package/assets/{index-Dpp1tkiC.js.map → index-qFakdhOO.js.map} +1 -1
- package/assets/{index-ZDIYW364.js → index-wq0aztJv.js} +1 -1
- package/assets/{index-ZDIYW364.js.map → index-wq0aztJv.js.map} +1 -1
- package/assets/{profile.client-Dv7yHizc.js → profile.client-CCf--pbP.js} +1 -1
- package/assets/{profile.client-Dv7yHizc.js.map → profile.client-CCf--pbP.js.map} +1 -1
- package/assets/{shared.styled-DZDSiscg.js → shared.styled-Csb0ydX4.js} +1 -1
- package/assets/{shared.styled-DZDSiscg.js.map → shared.styled-Csb0ydX4.js.map} +1 -1
- package/assets/{store-DytzPwIW.js → store-CbX2mp3S.js} +1 -1
- package/assets/{store-DytzPwIW.js.map → store-CbX2mp3S.js.map} +1 -1
- package/assets/{url-CwO7t7Da.js → url-DMbF6Zco.js} +1 -1
- package/assets/{url-CwO7t7Da.js.map → url-DMbF6Zco.js.map} +1 -1
- package/assets/{useAuthIdentity-BJka2D_h.js → useAuthIdentity-CIDWXFI8.js} +1 -1
- package/assets/{useAuthIdentity-BJka2D_h.js.map → useAuthIdentity-CIDWXFI8.js.map} +1 -1
- package/assets/{useCreatorHubDownload-htSWq2gm.js → useCreatorHubDownload-CQ5sircD.js} +1 -1
- package/assets/{useCreatorHubDownload-htSWq2gm.js.map → useCreatorHubDownload-CQ5sircD.js.map} +1 -1
- package/assets/{useInfiniteBlogPosts-b1i6T88U.js → useInfiniteBlogPosts-DspRbflz.js} +1 -1
- package/assets/{useInfiniteBlogPosts-b1i6T88U.js.map → useInfiniteBlogPosts-DspRbflz.js.map} +1 -1
- package/assets/{useSlot-DcCKMoK9.js → useSlot-BerGUD87.js} +1 -1
- package/assets/{useSlot-DcCKMoK9.js.map → useSlot-BerGUD87.js.map} +1 -1
- package/assets/{utils-DyplVMyL.js → utils-CYqFUJMv.js} +1 -1
- package/assets/{utils-DyplVMyL.js.map → utils-CYqFUJMv.js.map} +1 -1
- package/index.html +17 -17
- package/package.json +3 -3
- package/assets/DappsShell-Bq4UFy3b.js +0 -1
- package/assets/DappsShell-Bq4UFy3b.js.map +0 -1
- package/assets/HomePage-BWbNRRBq.js +0 -3
- package/assets/HomePage-BWbNRRBq.js.map +0 -1
- package/assets/WearablePreview-CFkTJn9i.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as a,a as c,v as g,z as m,w as y,M as T,N as A,j as o,P as E,Q as x,R as N,U as V,V as $}from"./index-
|
|
1
|
+
import{s as a,a as c,v as g,z as m,w as y,M as T,N as A,j as o,P as E,Q as x,R as N,U as V,V as $}from"./index-DaRevScO.js";import{r}from"./vendor-router-D_36sTKu.js";import{u as _}from"./profile.client-CCf--pbP.js";import{C as D}from"./Carousel-Bz36sWAV.js";import{J as H,A as P}from"./JumpInIcon-DsVzhXWI.js";import"./vendor-crypto-uuuQA3i5.js";import"./vendor-schemas-DJzTSxpO.js";import"./vendor-sentry-BSvWNK4f.js";import"./vendor-ua-D7qqAxdq.js";import"./vendor-intl-D2lXWsDp.js";import"./createSvgIcon-DH_tCoWL.js";import"./useSlot-BerGUD87.js";const U=a(c)(({theme:e})=>({position:"relative",display:"flex",flexDirection:"column",alignItems:"center",gap:e.spacing(6),padding:`${e.spacing(10)} ${e.spacing(2.5)}`,width:"100%",backgroundColor:"#570F88",overflow:"hidden","& .desktop-only-ellipse":{[e.breakpoints.down("sm")]:{display:"none"}},[e.breakpoints.down("sm")]:{padding:`${e.spacing(6)} 0`,gap:e.spacing(4)}})),R=a(g)(({theme:e})=>({color:m.white,fontWeight:600,textAlign:"center",position:"relative",zIndex:1,[e.breakpoints.down("sm")]:{fontSize:32,padding:`0 ${e.spacing(3)}`}})),W=a(c)(({theme:e})=>({display:"flex",gap:e.spacing(3),width:"100%",justifyContent:"center",padding:`0 ${e.spacing(2.5)}`,zIndex:1,[e.breakpoints.down("sm")]:{display:"none"}})),L=a(c)(({theme:e})=>({position:"relative",flex:"1 1 0",minWidth:0,maxWidth:680,height:450,borderRadius:e.spacing(3),overflow:"hidden",backgroundColor:"rgba(0, 0, 0, 0.6)",boxShadow:"0px 2px 4px 0px rgba(0, 0, 0, 0.04)",cursor:"pointer",display:"flex",flexDirection:"column","&:hover .catch-vibe-video, &.playing .catch-vibe-video":{opacity:1},"&:hover .catch-vibe-image, &.playing .catch-vibe-image":{opacity:0},[e.breakpoints.down("lg")]:{height:380},[e.breakpoints.down("md")]:{height:320},[e.breakpoints.down("sm")]:{margin:"0 auto"}})),B=a(c)({position:"relative",flex:1,minHeight:0,borderRadius:"24px",overflow:"hidden"}),O=a("img")({position:"absolute",top:0,left:0,width:"100%",height:"100%",objectFit:"cover",transition:"opacity 0.4s ease",zIndex:1}),G=a("video")({position:"absolute",top:0,left:0,width:"100%",height:"100%",objectFit:"cover",opacity:0,transition:"opacity 0.4s ease"}),J=a(c)(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between",padding:`${e.spacing(2)} ${e.spacing(1.5)} ${e.spacing(2)} ${e.spacing(2)}`,flexShrink:0})),Q=a(c)(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1)})),q=a(g)({color:m.white,fontWeight:600,fontSize:14,lineHeight:1.57});a(g)({color:m.white,fontWeight:600,fontSize:14,lineHeight:1.57});const K=a(c)(({theme:e})=>({position:"absolute",top:0,left:0,right:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0, 0, 0, 0.3)",zIndex:2,cursor:"pointer",transition:"opacity 0.3s ease",[e.breakpoints.up("sm")]:{top:"auto",right:"auto",bottom:13,left:13,width:"auto",height:26,padding:"5.5px 6px",borderRadius:8,backgroundColor:"#161518"}})),X=a("button")({position:"absolute",top:12,right:12,width:32,height:32,borderRadius:8,border:"none",backgroundColor:"rgba(0, 0, 0, 0.6)",color:"#FCFCFC",fontSize:16,cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",zIndex:3,transition:"background-color 0.2s ease","&:hover":{backgroundColor:"rgba(0, 0, 0, 0.8)"}}),Y=a(c)(({theme:e})=>({width:0,height:0,borderStyle:"solid",borderColor:"transparent transparent transparent #FCFCFC",flexShrink:0,borderWidth:"20px 0 20px 34px",[e.breakpoints.up("sm")]:{borderWidth:"5px 0 5px 8px"}})),Z=a(g)(({theme:e})=>({color:"#FCFCFC",fontWeight:600,fontSize:14,lineHeight:"normal",whiteSpace:"nowrap",[e.breakpoints.down("sm")]:{display:"none"}}));a("img")(({theme:e})=>({position:"absolute",right:-20,bottom:-40,height:"110%",maxHeight:650,pointerEvents:"none",zIndex:0,[e.breakpoints.down("lg")]:{right:-60,opacity:.5},[e.breakpoints.down("md")]:{display:"none"}}));const ee=a(c)(({theme:e})=>({display:"none",width:"100%",zIndex:1,[e.breakpoints.down("sm")]:{display:"block"}}));function te(e){const p=Math.floor(e/60),i=Math.floor(e%60);return`${p}:${i.toString().padStart(2,"0")}`}const v=({item:e})=>{const p=y(),i=r.useRef(null),[d,l]=r.useState(!1),[h,n]=r.useState(!0),[b,C]=r.useState(null),{data:w}=_(e.userAddress,{skip:!e.userAddress}),f=w?.avatars?.[0],k=e.userAvatarUrl.startsWith("http")?e.userAvatarUrl:`${window.location.origin}${e.userAvatarUrl}`.replace(/^http:\/\//,"https://"),j=!!f?.avatar?.snapshots?.face256?f:{name:f?.name??e.userName,ethAddress:e.userAddress??"",avatar:{snapshots:{face256:k,body:""}}};r.useEffect(()=>{const t=i.current;if(!t)return;const s=()=>{t.duration&&isFinite(t.duration)&&C(te(t.duration))};return t.addEventListener("loadedmetadata",s),()=>t.removeEventListener("loadedmetadata",s)},[]);const u=typeof window<"u"&&!window.matchMedia("(hover: hover)").matches,I=r.useCallback(()=>{const t=i.current;t&&(d?(t.pause(),l(!1)):(t.muted=!1,n(!1),t.play().catch(()=>{t.muted=!0,n(!0),t.play().catch(s=>console.warn("Video playback failed:",s))}),l(!0)))},[d]);r.useEffect(()=>{const t=i.current;if(!t||!u)return;const s=new IntersectionObserver(([S])=>{!S.isIntersecting&&!t.paused&&(t.pause(),t.currentTime=0,l(!1),n(!0))},{threshold:.3});return s.observe(t),()=>s.disconnect()},[u]);const F=r.useCallback(()=>{const t=i.current;t&&t.play(),l(!0)},[]),M=r.useCallback(()=>{const t=i.current;t&&(t.pause(),t.currentTime=0,t.muted=!0),l(!1),n(!0)},[]),z=r.useCallback(t=>{t.stopPropagation();const s=i.current;s&&(s.muted=!s.muted,n(s.muted))},[]);return o.jsxs(L,{className:d?"playing":"",onMouseEnter:u?void 0:F,onMouseLeave:u?void 0:M,onClick:u?I:void 0,children:[o.jsxs(B,{children:[o.jsx(O,{className:"catch-vibe-image",src:e.imageUrl,alt:e.userName,loading:"lazy",width:680,height:382}),o.jsx(G,{className:"catch-vibe-video",ref:i,loop:!0,muted:!0,playsInline:!0,preload:"metadata",poster:e.imageUrl,src:e.videoUrl}),!d&&o.jsxs(K,{children:[o.jsx(Y,{}),o.jsx(Z,{children:b??"0:00"})]}),d&&o.jsx(X,{onClick:z,"aria-label":p(h?"page.home.catch_the_vibe.unmute":"page.home.catch_the_vibe.mute"),children:h?"🔇":"🔊"})]}),o.jsx(J,{children:o.jsxs(Q,{children:[o.jsx(P,{size:"small",avatar:j}),o.jsx(q,{children:e.userName})]})})]})},oe=r.memo(()=>{const e=y(),p=T(),{handleClick:i,isDownloadModalOpen:d,closeDownloadModal:l,downloadModalProps:h}=A();return o.jsxs(U,{children:[o.jsx("img",{src:E("/ellipse_gradient.webp"),alt:"",style:{position:"absolute",top:0,left:0,width:"60%",height:"100%",objectFit:"cover",objectPosition:"center left",pointerEvents:"none",zIndex:0},className:"desktop-only-ellipse"}),o.jsx(R,{variant:"h3",children:e("page.home.catch_the_vibe.title")}),o.jsx(W,{children:x.cards.map((n,b)=>o.jsx(v,{item:n},b))}),o.jsx(ee,{children:o.jsx(D,{items:x.cards,renderItem:n=>o.jsx(v,{item:n}),keyExtractor:n=>n.userName,autoplayDelay:0})}),o.jsx(N,{variant:"contained",onClick:n=>{p(n),i(n)},"data-place":V.LANDING_CATCH_THE_VIBE,"data-event":"click",endIcon:o.jsx(H,{}),children:e("page.home.hang_out_now")}),o.jsx($,{open:d,onClose:l,...h})]})});oe.displayName="CatchTheVibe";export{oe as CatchTheVibe};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-ZDIYW364.js","sources":["../../src/components/Home/CatchTheVibe/CatchTheVibe.styled.ts","../../src/components/Home/CatchTheVibe/CatchTheVibe.tsx"],"sourcesContent":["import { Box, Typography, dclColors, styled } from 'decentraland-ui2'\n\nconst CatchTheVibeContainer = styled(Box)(({ theme }) => ({\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(6),\n padding: `${theme.spacing(10)} ${theme.spacing(2.5)}`,\n width: '100%',\n backgroundColor: '#570F88',\n overflow: 'hidden',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '& .desktop-only-ellipse': {\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n },\n [theme.breakpoints.down('sm')]: {\n padding: `${theme.spacing(6)} 0`,\n gap: theme.spacing(4)\n }\n}))\n\nconst CatchTheVibeTitle = styled(Typography)(({ theme }) => ({\n color: dclColors.neutral.white,\n fontWeight: 600,\n textAlign: 'center',\n position: 'relative',\n zIndex: 1,\n [theme.breakpoints.down('sm')]: {\n fontSize: 32,\n padding: `0 ${theme.spacing(3)}`\n }\n}))\n\nconst CardsRow = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(3),\n width: '100%',\n justifyContent: 'center',\n padding: `0 ${theme.spacing(2.5)}`,\n zIndex: 1,\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n}))\n\nconst VideoCard = styled(Box)(({ theme }) => ({\n position: 'relative',\n flex: '1 1 0',\n minWidth: 0,\n maxWidth: 680,\n height: 450,\n borderRadius: theme.spacing(3),\n overflow: 'hidden',\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n boxShadow: '0px 2px 4px 0px rgba(0, 0, 0, 0.04)',\n cursor: 'pointer',\n display: 'flex',\n flexDirection: 'column',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '&:hover .catch-vibe-video, &.playing .catch-vibe-video': {\n opacity: 1\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '&:hover .catch-vibe-image, &.playing .catch-vibe-image': {\n opacity: 0\n },\n [theme.breakpoints.down('lg')]: {\n height: 380\n },\n [theme.breakpoints.down('md')]: {\n height: 320\n },\n [theme.breakpoints.down('sm')]: {\n margin: '0 auto'\n }\n}))\n\nconst MediaContainer = styled(Box)({\n position: 'relative',\n flex: 1,\n minHeight: 0,\n borderRadius: '24px',\n overflow: 'hidden'\n})\n\nconst CardImage = styled('img')({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n transition: 'opacity 0.4s ease',\n zIndex: 1\n})\n\nconst VideoElement = styled('video')({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n opacity: 0,\n transition: 'opacity 0.4s ease'\n})\n\nconst VideoCardFooter = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing(2)} ${theme.spacing(1.5)} ${theme.spacing(2)} ${theme.spacing(2)}`,\n flexShrink: 0\n}))\n\nconst UserInfo = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1)\n}))\n\nconst UserName = styled(Typography)({\n color: dclColors.neutral.white,\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.57\n})\n\nconst CommunityLabel = styled(Typography)({\n color: dclColors.neutral.white,\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.57\n})\n\nconst PlayBadge = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n zIndex: 2,\n cursor: 'pointer',\n transition: 'opacity 0.3s ease',\n // Desktop: small badge at bottom-left\n [theme.breakpoints.up('sm')]: {\n top: 'auto',\n right: 'auto',\n bottom: 13,\n left: 13,\n width: 'auto',\n height: 26,\n padding: '5.5px 6px',\n borderRadius: 8,\n backgroundColor: '#161518'\n }\n}))\n\nconst MuteButton = styled('button')({\n position: 'absolute',\n top: 12,\n right: 12,\n width: 32,\n height: 32,\n borderRadius: 8,\n border: 'none',\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n color: '#FCFCFC',\n fontSize: 16,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 3,\n transition: 'background-color 0.2s ease',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.8)'\n }\n})\n\nconst PlayIcon = styled(Box)(({ theme }) => ({\n width: 0,\n height: 0,\n borderStyle: 'solid',\n borderColor: 'transparent transparent transparent #FCFCFC',\n flexShrink: 0,\n // Mobile: large centered play triangle\n borderWidth: '20px 0 20px 34px',\n // Desktop: small badge play triangle\n [theme.breakpoints.up('sm')]: {\n borderWidth: '5px 0 5px 8px'\n }\n}))\n\nconst DurationText = styled(Typography)(({ theme }) => ({\n color: '#FCFCFC',\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 'normal',\n whiteSpace: 'nowrap',\n // Hide duration in mobile overlay — only show on desktop badge\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n}))\n\nconst PersonaImage = styled('img')(({ theme }) => ({\n position: 'absolute',\n right: -20,\n bottom: -40,\n height: '110%',\n maxHeight: 650,\n pointerEvents: 'none',\n zIndex: 0,\n [theme.breakpoints.down('lg')]: {\n right: -60,\n opacity: 0.5\n },\n [theme.breakpoints.down('md')]: {\n display: 'none'\n }\n}))\n\nconst MobileCarouselContainer = styled(Box)(({ theme }) => ({\n display: 'none',\n width: '100%',\n zIndex: 1,\n [theme.breakpoints.down('sm')]: {\n display: 'block'\n }\n}))\n\nexport {\n CardImage,\n CardsRow,\n MediaContainer,\n CatchTheVibeContainer,\n CatchTheVibeTitle,\n CommunityLabel,\n DurationText,\n MobileCarouselContainer,\n MuteButton,\n PersonaImage,\n PlayBadge,\n PlayIcon,\n UserInfo,\n UserName,\n VideoCard,\n VideoCardFooter,\n VideoElement\n}\n","import { memo, useCallback, useEffect, useRef, useState } from 'react'\nimport type { Avatar } from '@dcl/schemas'\nimport { AvatarFace, DownloadModal, JumpInIcon } from 'decentraland-ui2'\nimport { catchTheVibeContent } from '../../../data/static-content'\nimport { useGetProfileQuery } from '../../../features/profile/profile.client'\nimport { useFormatMessage } from '../../../hooks/adapters/useFormatMessage'\nimport { useTrackClick } from '../../../hooks/adapters/useTrackLinkContext'\nimport { useHangOutAction } from '../../../hooks/useHangOutAction'\nimport { SectionViewedTrack } from '../../../modules/segment'\nimport { assetUrl } from '../../../utils/assetUrl'\nimport { Carousel } from '../../Carousel/Carousel'\nimport { HangOutButton } from '../shared/HangOutButton.styled'\nimport {\n CardImage,\n CardsRow,\n CatchTheVibeContainer,\n CatchTheVibeTitle,\n DurationText,\n MediaContainer,\n MobileCarouselContainer,\n MuteButton,\n PlayBadge,\n PlayIcon,\n UserInfo,\n UserName,\n VideoCard,\n VideoCardFooter,\n VideoElement\n} from './CatchTheVibe.styled'\n\ninterface CardItem {\n imageUrl: string\n videoUrl: string\n userName: string\n userAddress?: string\n userAvatarUrl: string\n}\n\nfunction formatDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60)\n const secs = Math.floor(seconds % 60)\n return `${mins}:${secs.toString().padStart(2, '0')}`\n}\n\nconst VideoCardContent = ({ item }: { item: CardItem }) => {\n const l = useFormatMessage()\n const videoRef = useRef<HTMLVideoElement>(null)\n const [isPlaying, setIsPlaying] = useState(false)\n const [isMuted, setIsMuted] = useState(true)\n const [duration, setDuration] = useState<string | null>(null)\n const { data: profile } = useGetProfileQuery(item.userAddress, { skip: !item.userAddress })\n const fetchedAvatar = profile?.avatars?.[0] as Avatar | undefined\n // AvatarFace only passes through URLs starting with https://.\n const fallbackFace = item.userAvatarUrl.startsWith('http')\n ? item.userAvatarUrl\n : `${window.location.origin}${item.userAvatarUrl}`.replace(/^http:\\/\\//, 'https://')\n\n // Use fetched profile if it has a face256 snapshot, otherwise fall back to static image\n const hasFace = !!fetchedAvatar?.avatar?.snapshots?.face256\n const avatar: Avatar = hasFace\n ? fetchedAvatar\n : ({\n name: fetchedAvatar?.name ?? item.userName,\n ethAddress: item.userAddress ?? '',\n avatar: { snapshots: { face256: fallbackFace, body: '' } }\n } as Avatar)\n\n useEffect(() => {\n const video = videoRef.current\n if (!video) return\n const handleLoaded = () => {\n if (video.duration && isFinite(video.duration)) {\n setDuration(formatDuration(video.duration))\n }\n }\n video.addEventListener('loadedmetadata', handleLoaded)\n return () => video.removeEventListener('loadedmetadata', handleLoaded)\n }, [])\n\n const isTouchDevice = typeof window !== 'undefined' && !window.matchMedia('(hover: hover)').matches\n\n const handleMobilePlay = useCallback(() => {\n const video = videoRef.current\n if (!video) return\n if (isPlaying) {\n video.pause()\n setIsPlaying(false)\n } else {\n video.muted = false\n setIsMuted(false)\n video.play().catch(() => {\n // iOS fallback: if unmuted play fails, retry muted\n video.muted = true\n setIsMuted(true)\n video.play().catch(e => console.warn('Video playback failed:', e))\n })\n setIsPlaying(true)\n }\n }, [isPlaying])\n\n // Pause video when it scrolls out of view (e.g. swiper slide change)\n useEffect(() => {\n const video = videoRef.current\n if (!video || !isTouchDevice) return\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry.isIntersecting && !video.paused) {\n video.pause()\n video.currentTime = 0\n setIsPlaying(false)\n setIsMuted(true)\n }\n },\n { threshold: 0.3 }\n )\n observer.observe(video)\n return () => observer.disconnect()\n }, [isTouchDevice])\n\n const handleMouseEnter = useCallback(() => {\n const video = videoRef.current\n if (video) {\n video.play()\n }\n setIsPlaying(true)\n }, [])\n\n const handleMouseLeave = useCallback(() => {\n const video = videoRef.current\n if (video) {\n video.pause()\n video.currentTime = 0\n video.muted = true\n }\n setIsPlaying(false)\n setIsMuted(true)\n }, [])\n\n const toggleMute = useCallback((e: React.MouseEvent) => {\n e.stopPropagation()\n const video = videoRef.current\n if (video) {\n video.muted = !video.muted\n setIsMuted(video.muted)\n }\n }, [])\n\n return (\n <VideoCard\n className={isPlaying ? 'playing' : ''}\n onMouseEnter={isTouchDevice ? undefined : handleMouseEnter}\n onMouseLeave={isTouchDevice ? undefined : handleMouseLeave}\n onClick={isTouchDevice ? handleMobilePlay : undefined}\n >\n <MediaContainer>\n <CardImage className=\"catch-vibe-image\" src={item.imageUrl} alt={item.userName} loading=\"lazy\" width={680} height={382} />\n <VideoElement\n className=\"catch-vibe-video\"\n ref={videoRef}\n loop\n muted\n playsInline\n preload=\"metadata\"\n poster={item.imageUrl}\n src={item.videoUrl}\n />\n {!isPlaying && (\n <PlayBadge>\n <PlayIcon />\n <DurationText>{duration ?? '0:00'}</DurationText>\n </PlayBadge>\n )}\n {isPlaying && (\n <MuteButton onClick={toggleMute} aria-label={isMuted ? l('page.home.catch_the_vibe.unmute') : l('page.home.catch_the_vibe.mute')}>\n {isMuted ? '🔇' : '🔊'}\n </MuteButton>\n )}\n </MediaContainer>\n <VideoCardFooter>\n <UserInfo>\n <AvatarFace size=\"small\" avatar={avatar} />\n <UserName>{item.userName}</UserName>\n </UserInfo>\n </VideoCardFooter>\n </VideoCard>\n )\n}\n\nconst CatchTheVibe = memo(() => {\n const l = useFormatMessage()\n const onClickHandle = useTrackClick()\n const { handleClick, isDownloadModalOpen, closeDownloadModal, downloadModalProps } = useHangOutAction()\n\n return (\n <CatchTheVibeContainer>\n <img\n src={assetUrl('/ellipse_gradient.webp')}\n alt=\"\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '60%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: 'center left',\n pointerEvents: 'none',\n zIndex: 0\n }}\n className=\"desktop-only-ellipse\"\n />\n <CatchTheVibeTitle variant=\"h3\">{l('page.home.catch_the_vibe.title')}</CatchTheVibeTitle>\n <CardsRow>\n {catchTheVibeContent.cards.map((item, index) => (\n <VideoCardContent key={index} item={item} />\n ))}\n </CardsRow>\n <MobileCarouselContainer>\n <Carousel\n items={catchTheVibeContent.cards}\n renderItem={item => <VideoCardContent item={item} />}\n keyExtractor={item => item.userName}\n autoplayDelay={0}\n />\n </MobileCarouselContainer>\n <HangOutButton\n variant=\"contained\"\n onClick={e => {\n onClickHandle(e)\n handleClick(e)\n }}\n data-place={SectionViewedTrack.LANDING_CATCH_THE_VIBE}\n data-event=\"click\"\n endIcon={<JumpInIcon />}\n >\n {l('page.home.hang_out_now')}\n </HangOutButton>\n <DownloadModal open={isDownloadModalOpen} onClose={closeDownloadModal} {...downloadModalProps} />\n </CatchTheVibeContainer>\n )\n})\n\nCatchTheVibe.displayName = 'CatchTheVibe'\n\nexport { CatchTheVibe }\n"],"names":["CatchTheVibeContainer","styled","Box","theme","CatchTheVibeTitle","Typography","dclColors.neutral","CardsRow","VideoCard","MediaContainer","CardImage","VideoElement","VideoCardFooter","UserInfo","UserName","PlayBadge","MuteButton","PlayIcon","DurationText","MobileCarouselContainer","formatDuration","seconds","mins","secs","VideoCardContent","item","l","useFormatMessage","videoRef","useRef","isPlaying","setIsPlaying","useState","isMuted","setIsMuted","duration","setDuration","profile","useGetProfileQuery","fetchedAvatar","fallbackFace","avatar","useEffect","video","handleLoaded","isTouchDevice","handleMobilePlay","useCallback","e","observer","entry","handleMouseEnter","handleMouseLeave","toggleMute","jsxs","jsx","AvatarFace","CatchTheVibe","memo","onClickHandle","useTrackClick","handleClick","isDownloadModalOpen","closeDownloadModal","downloadModalProps","useHangOutAction","assetUrl","catchTheVibeContent","index","Carousel","HangOutButton","SectionViewedTrack","JumpInIcon","DownloadModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-wq0aztJv.js","sources":["../../src/components/Home/CatchTheVibe/CatchTheVibe.styled.ts","../../src/components/Home/CatchTheVibe/CatchTheVibe.tsx"],"sourcesContent":["import { Box, Typography, dclColors, styled } from 'decentraland-ui2'\n\nconst CatchTheVibeContainer = styled(Box)(({ theme }) => ({\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(6),\n padding: `${theme.spacing(10)} ${theme.spacing(2.5)}`,\n width: '100%',\n backgroundColor: '#570F88',\n overflow: 'hidden',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '& .desktop-only-ellipse': {\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n },\n [theme.breakpoints.down('sm')]: {\n padding: `${theme.spacing(6)} 0`,\n gap: theme.spacing(4)\n }\n}))\n\nconst CatchTheVibeTitle = styled(Typography)(({ theme }) => ({\n color: dclColors.neutral.white,\n fontWeight: 600,\n textAlign: 'center',\n position: 'relative',\n zIndex: 1,\n [theme.breakpoints.down('sm')]: {\n fontSize: 32,\n padding: `0 ${theme.spacing(3)}`\n }\n}))\n\nconst CardsRow = styled(Box)(({ theme }) => ({\n display: 'flex',\n gap: theme.spacing(3),\n width: '100%',\n justifyContent: 'center',\n padding: `0 ${theme.spacing(2.5)}`,\n zIndex: 1,\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n}))\n\nconst VideoCard = styled(Box)(({ theme }) => ({\n position: 'relative',\n flex: '1 1 0',\n minWidth: 0,\n maxWidth: 680,\n height: 450,\n borderRadius: theme.spacing(3),\n overflow: 'hidden',\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n boxShadow: '0px 2px 4px 0px rgba(0, 0, 0, 0.04)',\n cursor: 'pointer',\n display: 'flex',\n flexDirection: 'column',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '&:hover .catch-vibe-video, &.playing .catch-vibe-video': {\n opacity: 1\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '&:hover .catch-vibe-image, &.playing .catch-vibe-image': {\n opacity: 0\n },\n [theme.breakpoints.down('lg')]: {\n height: 380\n },\n [theme.breakpoints.down('md')]: {\n height: 320\n },\n [theme.breakpoints.down('sm')]: {\n margin: '0 auto'\n }\n}))\n\nconst MediaContainer = styled(Box)({\n position: 'relative',\n flex: 1,\n minHeight: 0,\n borderRadius: '24px',\n overflow: 'hidden'\n})\n\nconst CardImage = styled('img')({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n transition: 'opacity 0.4s ease',\n zIndex: 1\n})\n\nconst VideoElement = styled('video')({\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n opacity: 0,\n transition: 'opacity 0.4s ease'\n})\n\nconst VideoCardFooter = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing(2)} ${theme.spacing(1.5)} ${theme.spacing(2)} ${theme.spacing(2)}`,\n flexShrink: 0\n}))\n\nconst UserInfo = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1)\n}))\n\nconst UserName = styled(Typography)({\n color: dclColors.neutral.white,\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.57\n})\n\nconst CommunityLabel = styled(Typography)({\n color: dclColors.neutral.white,\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 1.57\n})\n\nconst PlayBadge = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.3)',\n zIndex: 2,\n cursor: 'pointer',\n transition: 'opacity 0.3s ease',\n // Desktop: small badge at bottom-left\n [theme.breakpoints.up('sm')]: {\n top: 'auto',\n right: 'auto',\n bottom: 13,\n left: 13,\n width: 'auto',\n height: 26,\n padding: '5.5px 6px',\n borderRadius: 8,\n backgroundColor: '#161518'\n }\n}))\n\nconst MuteButton = styled('button')({\n position: 'absolute',\n top: 12,\n right: 12,\n width: 32,\n height: 32,\n borderRadius: 8,\n border: 'none',\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n color: '#FCFCFC',\n fontSize: 16,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 3,\n transition: 'background-color 0.2s ease',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '&:hover': {\n backgroundColor: 'rgba(0, 0, 0, 0.8)'\n }\n})\n\nconst PlayIcon = styled(Box)(({ theme }) => ({\n width: 0,\n height: 0,\n borderStyle: 'solid',\n borderColor: 'transparent transparent transparent #FCFCFC',\n flexShrink: 0,\n // Mobile: large centered play triangle\n borderWidth: '20px 0 20px 34px',\n // Desktop: small badge play triangle\n [theme.breakpoints.up('sm')]: {\n borderWidth: '5px 0 5px 8px'\n }\n}))\n\nconst DurationText = styled(Typography)(({ theme }) => ({\n color: '#FCFCFC',\n fontWeight: 600,\n fontSize: 14,\n lineHeight: 'normal',\n whiteSpace: 'nowrap',\n // Hide duration in mobile overlay — only show on desktop badge\n [theme.breakpoints.down('sm')]: {\n display: 'none'\n }\n}))\n\nconst PersonaImage = styled('img')(({ theme }) => ({\n position: 'absolute',\n right: -20,\n bottom: -40,\n height: '110%',\n maxHeight: 650,\n pointerEvents: 'none',\n zIndex: 0,\n [theme.breakpoints.down('lg')]: {\n right: -60,\n opacity: 0.5\n },\n [theme.breakpoints.down('md')]: {\n display: 'none'\n }\n}))\n\nconst MobileCarouselContainer = styled(Box)(({ theme }) => ({\n display: 'none',\n width: '100%',\n zIndex: 1,\n [theme.breakpoints.down('sm')]: {\n display: 'block'\n }\n}))\n\nexport {\n CardImage,\n CardsRow,\n MediaContainer,\n CatchTheVibeContainer,\n CatchTheVibeTitle,\n CommunityLabel,\n DurationText,\n MobileCarouselContainer,\n MuteButton,\n PersonaImage,\n PlayBadge,\n PlayIcon,\n UserInfo,\n UserName,\n VideoCard,\n VideoCardFooter,\n VideoElement\n}\n","import { memo, useCallback, useEffect, useRef, useState } from 'react'\nimport type { Avatar } from '@dcl/schemas'\nimport { AvatarFace, DownloadModal, JumpInIcon } from 'decentraland-ui2'\nimport { catchTheVibeContent } from '../../../data/static-content'\nimport { useGetProfileQuery } from '../../../features/profile/profile.client'\nimport { useFormatMessage } from '../../../hooks/adapters/useFormatMessage'\nimport { useTrackClick } from '../../../hooks/adapters/useTrackLinkContext'\nimport { useHangOutAction } from '../../../hooks/useHangOutAction'\nimport { SectionViewedTrack } from '../../../modules/segment'\nimport { assetUrl } from '../../../utils/assetUrl'\nimport { Carousel } from '../../Carousel/Carousel'\nimport { HangOutButton } from '../shared/HangOutButton.styled'\nimport {\n CardImage,\n CardsRow,\n CatchTheVibeContainer,\n CatchTheVibeTitle,\n DurationText,\n MediaContainer,\n MobileCarouselContainer,\n MuteButton,\n PlayBadge,\n PlayIcon,\n UserInfo,\n UserName,\n VideoCard,\n VideoCardFooter,\n VideoElement\n} from './CatchTheVibe.styled'\n\ninterface CardItem {\n imageUrl: string\n videoUrl: string\n userName: string\n userAddress?: string\n userAvatarUrl: string\n}\n\nfunction formatDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60)\n const secs = Math.floor(seconds % 60)\n return `${mins}:${secs.toString().padStart(2, '0')}`\n}\n\nconst VideoCardContent = ({ item }: { item: CardItem }) => {\n const l = useFormatMessage()\n const videoRef = useRef<HTMLVideoElement>(null)\n const [isPlaying, setIsPlaying] = useState(false)\n const [isMuted, setIsMuted] = useState(true)\n const [duration, setDuration] = useState<string | null>(null)\n const { data: profile } = useGetProfileQuery(item.userAddress, { skip: !item.userAddress })\n const fetchedAvatar = profile?.avatars?.[0] as Avatar | undefined\n // AvatarFace only passes through URLs starting with https://.\n const fallbackFace = item.userAvatarUrl.startsWith('http')\n ? item.userAvatarUrl\n : `${window.location.origin}${item.userAvatarUrl}`.replace(/^http:\\/\\//, 'https://')\n\n // Use fetched profile if it has a face256 snapshot, otherwise fall back to static image\n const hasFace = !!fetchedAvatar?.avatar?.snapshots?.face256\n const avatar: Avatar = hasFace\n ? fetchedAvatar\n : ({\n name: fetchedAvatar?.name ?? item.userName,\n ethAddress: item.userAddress ?? '',\n avatar: { snapshots: { face256: fallbackFace, body: '' } }\n } as Avatar)\n\n useEffect(() => {\n const video = videoRef.current\n if (!video) return\n const handleLoaded = () => {\n if (video.duration && isFinite(video.duration)) {\n setDuration(formatDuration(video.duration))\n }\n }\n video.addEventListener('loadedmetadata', handleLoaded)\n return () => video.removeEventListener('loadedmetadata', handleLoaded)\n }, [])\n\n const isTouchDevice = typeof window !== 'undefined' && !window.matchMedia('(hover: hover)').matches\n\n const handleMobilePlay = useCallback(() => {\n const video = videoRef.current\n if (!video) return\n if (isPlaying) {\n video.pause()\n setIsPlaying(false)\n } else {\n video.muted = false\n setIsMuted(false)\n video.play().catch(() => {\n // iOS fallback: if unmuted play fails, retry muted\n video.muted = true\n setIsMuted(true)\n video.play().catch(e => console.warn('Video playback failed:', e))\n })\n setIsPlaying(true)\n }\n }, [isPlaying])\n\n // Pause video when it scrolls out of view (e.g. swiper slide change)\n useEffect(() => {\n const video = videoRef.current\n if (!video || !isTouchDevice) return\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry.isIntersecting && !video.paused) {\n video.pause()\n video.currentTime = 0\n setIsPlaying(false)\n setIsMuted(true)\n }\n },\n { threshold: 0.3 }\n )\n observer.observe(video)\n return () => observer.disconnect()\n }, [isTouchDevice])\n\n const handleMouseEnter = useCallback(() => {\n const video = videoRef.current\n if (video) {\n video.play()\n }\n setIsPlaying(true)\n }, [])\n\n const handleMouseLeave = useCallback(() => {\n const video = videoRef.current\n if (video) {\n video.pause()\n video.currentTime = 0\n video.muted = true\n }\n setIsPlaying(false)\n setIsMuted(true)\n }, [])\n\n const toggleMute = useCallback((e: React.MouseEvent) => {\n e.stopPropagation()\n const video = videoRef.current\n if (video) {\n video.muted = !video.muted\n setIsMuted(video.muted)\n }\n }, [])\n\n return (\n <VideoCard\n className={isPlaying ? 'playing' : ''}\n onMouseEnter={isTouchDevice ? undefined : handleMouseEnter}\n onMouseLeave={isTouchDevice ? undefined : handleMouseLeave}\n onClick={isTouchDevice ? handleMobilePlay : undefined}\n >\n <MediaContainer>\n <CardImage className=\"catch-vibe-image\" src={item.imageUrl} alt={item.userName} loading=\"lazy\" width={680} height={382} />\n <VideoElement\n className=\"catch-vibe-video\"\n ref={videoRef}\n loop\n muted\n playsInline\n preload=\"metadata\"\n poster={item.imageUrl}\n src={item.videoUrl}\n />\n {!isPlaying && (\n <PlayBadge>\n <PlayIcon />\n <DurationText>{duration ?? '0:00'}</DurationText>\n </PlayBadge>\n )}\n {isPlaying && (\n <MuteButton onClick={toggleMute} aria-label={isMuted ? l('page.home.catch_the_vibe.unmute') : l('page.home.catch_the_vibe.mute')}>\n {isMuted ? '🔇' : '🔊'}\n </MuteButton>\n )}\n </MediaContainer>\n <VideoCardFooter>\n <UserInfo>\n <AvatarFace size=\"small\" avatar={avatar} />\n <UserName>{item.userName}</UserName>\n </UserInfo>\n </VideoCardFooter>\n </VideoCard>\n )\n}\n\nconst CatchTheVibe = memo(() => {\n const l = useFormatMessage()\n const onClickHandle = useTrackClick()\n const { handleClick, isDownloadModalOpen, closeDownloadModal, downloadModalProps } = useHangOutAction()\n\n return (\n <CatchTheVibeContainer>\n <img\n src={assetUrl('/ellipse_gradient.webp')}\n alt=\"\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '60%',\n height: '100%',\n objectFit: 'cover',\n objectPosition: 'center left',\n pointerEvents: 'none',\n zIndex: 0\n }}\n className=\"desktop-only-ellipse\"\n />\n <CatchTheVibeTitle variant=\"h3\">{l('page.home.catch_the_vibe.title')}</CatchTheVibeTitle>\n <CardsRow>\n {catchTheVibeContent.cards.map((item, index) => (\n <VideoCardContent key={index} item={item} />\n ))}\n </CardsRow>\n <MobileCarouselContainer>\n <Carousel\n items={catchTheVibeContent.cards}\n renderItem={item => <VideoCardContent item={item} />}\n keyExtractor={item => item.userName}\n autoplayDelay={0}\n />\n </MobileCarouselContainer>\n <HangOutButton\n variant=\"contained\"\n onClick={e => {\n onClickHandle(e)\n handleClick(e)\n }}\n data-place={SectionViewedTrack.LANDING_CATCH_THE_VIBE}\n data-event=\"click\"\n endIcon={<JumpInIcon />}\n >\n {l('page.home.hang_out_now')}\n </HangOutButton>\n <DownloadModal open={isDownloadModalOpen} onClose={closeDownloadModal} {...downloadModalProps} />\n </CatchTheVibeContainer>\n )\n})\n\nCatchTheVibe.displayName = 'CatchTheVibe'\n\nexport { CatchTheVibe }\n"],"names":["CatchTheVibeContainer","styled","Box","theme","CatchTheVibeTitle","Typography","dclColors.neutral","CardsRow","VideoCard","MediaContainer","CardImage","VideoElement","VideoCardFooter","UserInfo","UserName","PlayBadge","MuteButton","PlayIcon","DurationText","MobileCarouselContainer","formatDuration","seconds","mins","secs","VideoCardContent","item","l","useFormatMessage","videoRef","useRef","isPlaying","setIsPlaying","useState","isMuted","setIsMuted","duration","setDuration","profile","useGetProfileQuery","fetchedAvatar","fallbackFace","avatar","useEffect","video","handleLoaded","isTouchDevice","handleMobilePlay","useCallback","e","observer","entry","handleMouseEnter","handleMouseLeave","toggleMute","jsxs","jsx","AvatarFace","CatchTheVibe","memo","onClickHandle","useTrackClick","handleClick","isDownloadModalOpen","closeDownloadModal","downloadModalProps","useHangOutAction","assetUrl","catchTheVibeContent","index","Carousel","HangOutButton","SectionViewedTrack","JumpInIcon","DownloadModal"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as a}from"./vendor-router-D_36sTKu.js";import{g as f}from"./index-
|
|
1
|
+
import{r as a}from"./vendor-router-D_36sTKu.js";import{g as f}from"./index-DaRevScO.js";const d={data:null,loaded:!1,fetching:null},g={data:null,isLoading:!1},u=new Map,i=new Map,o=new Map;function p(t){return{data:t.data,isLoading:!t.loaded}}function h(t){o.get(t)?.forEach(e=>e())}function r(t,e){u.set(t,e),i.set(t,p(e)),h(t)}async function E(t){try{const e=f("PEER_URL");return await(await fetch(`${e}/lambdas/profiles/${t.toLowerCase()}`)).json()??null}catch{return null}}function w(t){const e=u.get(t)??d;if(e.loaded||e.fetching)return e.fetching??Promise.resolve();const n=(async()=>{try{const s=await E(t);r(t,{data:s,loaded:!0,fetching:null})}catch{r(t,{data:null,loaded:!0,fetching:null})}})();return r(t,{...e,fetching:n}),n}function b(t,e){let n=o.get(t);return n||(n=new Set,o.set(t,n)),n.add(e),w(t),()=>{n.delete(e),n.size===0&&o.delete(t)}}function m(t){const e=i.get(t);if(e)return e;const n={data:null,isLoading:!0};return i.set(t,n),n}function L(t,e={}){const n=e.skip||!t?"":t.toLowerCase(),s=a.useCallback(l=>n?b(n,l):()=>{},[n]),c=a.useCallback(()=>n?m(n):g,[n]);return a.useSyncExternalStore(s,c,c)}export{L as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.client-
|
|
1
|
+
{"version":3,"file":"profile.client-CCf--pbP.js","sources":["../../src/features/profile/profile.client.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore } from 'react'\nimport type { Profile } from 'dcl-catalyst-client/dist/client/specs/lambdas-client'\nimport { getEnv } from '../../config/env'\n\ntype Entry = {\n data: Profile | null\n loaded: boolean\n fetching: Promise<void> | null\n}\n\ntype Snapshot = { data: Profile | null; isLoading: boolean }\n\nconst EMPTY_ENTRY: Entry = { data: null, loaded: false, fetching: null }\nconst EMPTY_SNAPSHOT: Snapshot = { data: null, isLoading: false }\n\nconst entries = new Map<string, Entry>()\nconst snapshots = new Map<string, Snapshot>()\nconst listenersByKey = new Map<string, Set<() => void>>()\n\nfunction snapshotOf(entry: Entry): Snapshot {\n return { data: entry.data, isLoading: !entry.loaded }\n}\n\nfunction notify(key: string) {\n listenersByKey.get(key)?.forEach(fn => fn())\n}\n\nfunction setEntry(key: string, next: Entry) {\n entries.set(key, next)\n snapshots.set(key, snapshotOf(next))\n notify(key)\n}\n\nasync function fetchProfile(address: string): Promise<Profile | null> {\n try {\n const peerUrl = getEnv('PEER_URL')\n const response = await fetch(`${peerUrl}/lambdas/profiles/${address.toLowerCase()}`)\n const data = await response.json()\n return data ?? null\n } catch {\n return null\n }\n}\n\nfunction ensureFetch(key: string): Promise<void> {\n const existing = entries.get(key) ?? EMPTY_ENTRY\n if (existing.loaded || existing.fetching) return existing.fetching ?? Promise.resolve()\n\n const promise = (async () => {\n try {\n const data = await fetchProfile(key)\n setEntry(key, { data, loaded: true, fetching: null })\n } catch {\n setEntry(key, { data: null, loaded: true, fetching: null })\n }\n })()\n\n setEntry(key, { ...existing, fetching: promise })\n return promise\n}\n\nfunction subscribeTo(key: string, listener: () => void): () => void {\n let set = listenersByKey.get(key)\n if (!set) {\n set = new Set()\n listenersByKey.set(key, set)\n }\n set.add(listener)\n void ensureFetch(key)\n return () => {\n set.delete(listener)\n if (set.size === 0) listenersByKey.delete(key)\n }\n}\n\nfunction getSnapshotFor(key: string): Snapshot {\n const snap = snapshots.get(key)\n if (snap) return snap\n // Seed a stable pending snapshot so useSyncExternalStore doesn't loop.\n const pending: Snapshot = { data: null, isLoading: true }\n snapshots.set(key, pending)\n return pending\n}\n\ntype QueryOptions = { skip?: boolean }\n\nfunction useGetProfileQuery(address: string | undefined, options: QueryOptions = {}): Snapshot {\n const key = options.skip || !address ? '' : address.toLowerCase()\n\n const subscribe = useCallback(\n (listener: () => void) => {\n if (!key) return () => undefined\n return subscribeTo(key, listener)\n },\n [key]\n )\n\n const getSnapshot = useCallback(() => {\n if (!key) return EMPTY_SNAPSHOT\n return getSnapshotFor(key)\n }, [key])\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n}\n\nexport { useGetProfileQuery, type Profile }\n"],"names":["EMPTY_ENTRY","EMPTY_SNAPSHOT","entries","snapshots","listenersByKey","snapshotOf","entry","notify","key","fn","setEntry","next","fetchProfile","address","peerUrl","getEnv","ensureFetch","existing","promise","data","subscribeTo","listener","set","getSnapshotFor","snap","pending","useGetProfileQuery","options","subscribe","useCallback","getSnapshot","useSyncExternalStore"],"mappings":"wFAYA,MAAMA,EAAqB,CAAE,KAAM,KAAM,OAAQ,GAAO,SAAU,IAAA,EAC5DC,EAA2B,CAAE,KAAM,KAAM,UAAW,EAAA,EAEpDC,MAAc,IACdC,MAAgB,IAChBC,MAAqB,IAE3B,SAASC,EAAWC,EAAwB,CAC1C,MAAO,CAAE,KAAMA,EAAM,KAAM,UAAW,CAACA,EAAM,MAAA,CAC/C,CAEA,SAASC,EAAOC,EAAa,CAC3BJ,EAAe,IAAII,CAAG,GAAG,QAAQC,GAAMA,GAAI,CAC7C,CAEA,SAASC,EAASF,EAAaG,EAAa,CAC1CT,EAAQ,IAAIM,EAAKG,CAAI,EACrBR,EAAU,IAAIK,EAAKH,EAAWM,CAAI,CAAC,EACnCJ,EAAOC,CAAG,CACZ,CAEA,eAAeI,EAAaC,EAA0C,CACpE,GAAI,CACF,MAAMC,EAAUC,EAAO,UAAU,EAGjC,OADa,MADI,MAAM,MAAM,GAAGD,CAAO,qBAAqBD,EAAQ,YAAA,CAAa,EAAE,GACvD,KAAA,GACb,IACjB,MAAQ,CACN,OAAO,IACT,CACF,CAEA,SAASG,EAAYR,EAA4B,CAC/C,MAAMS,EAAWf,EAAQ,IAAIM,CAAG,GAAKR,EACrC,GAAIiB,EAAS,QAAUA,EAAS,gBAAiBA,EAAS,UAAY,QAAQ,QAAA,EAE9E,MAAMC,GAAW,SAAY,CAC3B,GAAI,CACF,MAAMC,EAAO,MAAMP,EAAaJ,CAAG,EACnCE,EAASF,EAAK,CAAE,KAAAW,EAAM,OAAQ,GAAM,SAAU,KAAM,CACtD,MAAQ,CACNT,EAASF,EAAK,CAAE,KAAM,KAAM,OAAQ,GAAM,SAAU,KAAM,CAC5D,CACF,GAAA,EAEA,OAAAE,EAASF,EAAK,CAAE,GAAGS,EAAU,SAAUC,EAAS,EACzCA,CACT,CAEA,SAASE,EAAYZ,EAAaa,EAAkC,CAClE,IAAIC,EAAMlB,EAAe,IAAII,CAAG,EAChC,OAAKc,IACHA,MAAU,IACVlB,EAAe,IAAII,EAAKc,CAAG,GAE7BA,EAAI,IAAID,CAAQ,EACXL,EAAYR,CAAG,EACb,IAAM,CACXc,EAAI,OAAOD,CAAQ,EACfC,EAAI,OAAS,GAAGlB,EAAe,OAAOI,CAAG,CAC/C,CACF,CAEA,SAASe,EAAef,EAAuB,CAC7C,MAAMgB,EAAOrB,EAAU,IAAIK,CAAG,EAC9B,GAAIgB,EAAM,OAAOA,EAEjB,MAAMC,EAAoB,CAAE,KAAM,KAAM,UAAW,EAAA,EACnD,OAAAtB,EAAU,IAAIK,EAAKiB,CAAO,EACnBA,CACT,CAIA,SAASC,EAAmBb,EAA6Bc,EAAwB,GAAc,CAC7F,MAAMnB,EAAMmB,EAAQ,MAAQ,CAACd,EAAU,GAAKA,EAAQ,YAAA,EAE9Ce,EAAYC,EAAAA,YACfR,GACMb,EACEY,EAAYZ,EAAKa,CAAQ,EADf,OAGnB,CAACb,CAAG,CAAA,EAGAsB,EAAcD,EAAAA,YAAY,IACzBrB,EACEe,EAAef,CAAG,EADRP,EAEhB,CAACO,CAAG,CAAC,EAER,OAAOuB,uBAAqBH,EAAWE,EAAaA,CAAW,CACjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as t,a}from"./index-
|
|
1
|
+
import{s as t,a}from"./index-DaRevScO.js";const s=t(a)(({theme:o})=>({textAlign:"center",paddingTop:o.spacing(8),paddingBottom:o.spacing(8)}));export{s as C};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.styled-
|
|
1
|
+
{"version":3,"file":"shared.styled-Csb0ydX4.js","sources":["../../src/pages/blog/shared.styled.ts"],"sourcesContent":["import { Box, styled } from 'decentraland-ui2'\n\nconst CenteredBox = styled(Box)(({ theme }) => ({\n textAlign: 'center',\n paddingTop: theme.spacing(8),\n paddingBottom: theme.spacing(8)\n}))\n\nexport { CenteredBox }\n"],"names":["CenteredBox","styled","Box","theme"],"mappings":"0CAEA,MAAMA,EAAcC,EAAOC,CAAG,EAAE,CAAC,CAAE,MAAAC,MAAa,CAC9C,UAAW,SACX,WAAYA,EAAM,QAAQ,CAAC,EAC3B,cAAeA,EAAM,QAAQ,CAAC,CAChC,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c,f as d,a as u,b as i,d as p,u as g,e as f,g as m,h as r}from"./events.client-
|
|
1
|
+
import{c,f as d,a as u,b as i,d as p,u as g,e as f,g as m,h as r}from"./events.client-DDwZtrCh.js";import{g as n}from"./index-DaRevScO.js";const A=()=>{const e=n("CMS_BASE_URL");if(!e)throw new Error("CMS_BASE_URL environment variable is not set");return e},B=n("CMS_BASE_URL")??"",a=c({reducerPath:"cmsClient",baseQuery:d({baseUrl:""}),tagTypes:["BlogPosts","BlogPost","Categories","Authors"],keepUnusedDataFor:300,refetchOnFocus:!1,refetchOnReconnect:!1,endpoints:()=>({})}),o=c({reducerPath:"algoliaClient",baseQuery:u(),tagTypes:["SearchResults"],keepUnusedDataFor:300,refetchOnFocus:!1,refetchOnReconnect:!1,endpoints:()=>({})}),s=i(),S=s.getInitialState(),l=p({name:"blog",initialState:S,reducers:{postUpserted:(e,t)=>s.upsertOne(e,t),postsUpserted:(e,t)=>s.upsertMany(e,t),postsClear:e=>s.removeAll(e)}}),{postUpserted:R,postsUpserted:y,postsClear:P}=l.actions,h=l.reducer,v=s.getSelectors(),C=m({[r.reducerPath]:r.reducer,blog:h,[a.reducerPath]:a.reducer,[o.reducerPath]:o.reducer}),w=f({reducer:C,middleware:e=>e().concat(r.middleware,a.middleware,o.middleware),devTools:!1}),E=g;export{a,y as b,B as c,o as d,A as g,v as p,w as s,E as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-
|
|
1
|
+
{"version":3,"file":"store-CbX2mp3S.js","sources":["../../src/services/blogClient.ts","../../src/features/blog/blog.slice.ts","../../src/shells/store.ts"],"sourcesContent":["import { createApi, fakeBaseQuery, fetchBaseQuery } from '@reduxjs/toolkit/query/react'\nimport { getEnv } from '../config/env'\n\n// Lazy getter — throws only when a query actually runs, not at import time.\n// A module-level throw crashes DappsShell at import even when no blog query is made.\nconst getCmsBaseUrl = (): string => {\n const url = getEnv('CMS_BASE_URL')\n if (!url) throw new Error('CMS_BASE_URL environment variable is not set')\n // In development, use the Vite proxy to avoid CORS issues; in production, use the direct CMS URL\n return import.meta.env.DEV ? '/api/cms' : url\n}\n\n// Exposed for blog.helpers.ts (fetchFromCMS uses it to resolve references)\nconst cmsBaseUrl = import.meta.env.DEV ? '/api/cms' : getEnv('CMS_BASE_URL') ?? ''\n\n/**\n * CMS Client - For blog posts, categories, and authors from Contentful\n * Uses fetchBaseQuery with Vite proxy in development to avoid CORS\n */\nconst cmsClient = createApi({\n reducerPath: 'cmsClient',\n // baseUrl is resolved lazily per-request so the module can be imported without CMS_BASE_URL set\n baseQuery: fetchBaseQuery({ baseUrl: '' }),\n tagTypes: ['BlogPosts', 'BlogPost', 'Categories', 'Authors'],\n keepUnusedDataFor: 300, // Cache for 5 minutes\n refetchOnFocus: false,\n refetchOnReconnect: false,\n endpoints: () => ({})\n})\n\n/**\n * Algolia Client - For search functionality\n * Uses fakeBaseQuery since we use Algolia SDK directly\n */\nconst algoliaClient = createApi({\n reducerPath: 'algoliaClient',\n baseQuery: fakeBaseQuery(),\n tagTypes: ['SearchResults'],\n keepUnusedDataFor: 300, // Cache for 5 minutes\n refetchOnFocus: false,\n refetchOnReconnect: false,\n endpoints: () => ({})\n})\n\nexport { algoliaClient, cmsBaseUrl, cmsClient, getCmsBaseUrl }\n","import { createEntityAdapter, createSlice } from '@reduxjs/toolkit'\nimport type { BlogPost } from '../../shared/blog/types/blog.domain'\n\n// Entity adapter for normalized posts storage\nconst postsAdapter = createEntityAdapter<BlogPost>()\n\n// Initial state using the adapter\nconst initialState = postsAdapter.getInitialState()\n\nconst blogSlice = createSlice({\n name: 'blog',\n initialState,\n reducers: {\n postUpserted: (state, action) => postsAdapter.upsertOne(state, action),\n postsUpserted: (state, action) => postsAdapter.upsertMany(state, action),\n postsClear: state => postsAdapter.removeAll(state)\n }\n})\n\nconst { postUpserted, postsUpserted, postsClear } = blogSlice.actions\n\nconst blogReducer = blogSlice.reducer\n\n// Export adapter selectors (will be used with RootState in selectors file)\nconst postsSelectors = postsAdapter.getSelectors()\n\nexport { blogReducer, blogSlice, postsClear, postUpserted, postsSelectors, postsUpserted }\n","import { useDispatch, useSelector } from 'react-redux'\nimport type { TypedUseSelectorHook } from 'react-redux'\nimport { combineReducers, configureStore } from '@reduxjs/toolkit'\nimport { blogReducer } from '../features/blog/blog.slice'\nimport { eventsClient } from '../features/explore-events/events.client'\nimport { algoliaClient, cmsClient } from '../services/blogClient'\n\nconst rootReducer = combineReducers({\n [eventsClient.reducerPath]: eventsClient.reducer,\n blog: blogReducer,\n [cmsClient.reducerPath]: cmsClient.reducer,\n [algoliaClient.reducerPath]: algoliaClient.reducer\n})\n\nconst store = configureStore({\n reducer: rootReducer,\n middleware: getDefaultMiddleware =>\n getDefaultMiddleware().concat(eventsClient.middleware, cmsClient.middleware, algoliaClient.middleware),\n devTools: import.meta.env.DEV\n})\n\ntype RootState = ReturnType<typeof store.getState>\ntype AppDispatch = typeof store.dispatch\n\nconst useAppDispatch = () => useDispatch<AppDispatch>()\nconst useAppSelector: TypedUseSelectorHook<RootState> = useSelector\n\nexport { store, useAppDispatch, useAppSelector }\nexport type { RootState, AppDispatch }\n"],"names":["getCmsBaseUrl","url","getEnv","cmsBaseUrl","cmsClient","createApi","fetchBaseQuery","algoliaClient","fakeBaseQuery","postsAdapter","createEntityAdapter","initialState","blogSlice","createSlice","state","action","postUpserted","postsUpserted","postsClear","blogReducer","postsSelectors","rootReducer","combineReducers","eventsClient","store","configureStore","getDefaultMiddleware","useAppSelector","useSelector"],"mappings":"2IAKA,MAAMA,EAAgB,IAAc,CAClC,MAAMC,EAAMC,EAAO,cAAc,EACjC,GAAI,CAACD,EAAK,MAAM,IAAI,MAAM,8CAA8C,EAExE,OAA0CA,CAC5C,EAGME,EAAgDD,EAAO,cAAc,GAAK,GAM1EE,EAAYC,EAAU,CAC1B,YAAa,YAEb,UAAWC,EAAe,CAAE,QAAS,GAAI,EACzC,SAAU,CAAC,YAAa,WAAY,aAAc,SAAS,EAC3D,kBAAmB,IACnB,eAAgB,GAChB,mBAAoB,GACpB,UAAW,KAAO,CAAA,EACpB,CAAC,EAMKC,EAAgBF,EAAU,CAC9B,YAAa,gBACb,UAAWG,EAAA,EACX,SAAU,CAAC,eAAe,EAC1B,kBAAmB,IACnB,eAAgB,GAChB,mBAAoB,GACpB,UAAW,KAAO,CAAA,EACpB,CAAC,ECtCKC,EAAeC,EAAA,EAGfC,EAAeF,EAAa,gBAAA,EAE5BG,EAAYC,EAAY,CAC5B,KAAM,OACN,aAAAF,EACA,SAAU,CACR,aAAc,CAACG,EAAOC,IAAWN,EAAa,UAAUK,EAAOC,CAAM,EACrE,cAAe,CAACD,EAAOC,IAAWN,EAAa,WAAWK,EAAOC,CAAM,EACvE,WAAYD,GAASL,EAAa,UAAUK,CAAK,CAAA,CAErD,CAAC,EAEK,CAAE,aAAAE,EAAc,cAAAC,EAAe,WAAAC,CAAA,EAAeN,EAAU,QAExDO,EAAcP,EAAU,QAGxBQ,EAAiBX,EAAa,aAAA,ECjB9BY,EAAcC,EAAgB,CAClC,CAACC,EAAa,WAAW,EAAGA,EAAa,QACzC,KAAMJ,EACN,CAACf,EAAU,WAAW,EAAGA,EAAU,QACnC,CAACG,EAAc,WAAW,EAAGA,EAAc,OAC7C,CAAC,EAEKiB,EAAQC,EAAe,CAC3B,QAASJ,EACT,WAAYK,GACVA,EAAA,EAAuB,OAAOH,EAAa,WAAYnB,EAAU,WAAYG,EAAc,UAAU,EACvG,SAAU,EACZ,CAAC,EAMKoB,EAAkDC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as A}from"./index-
|
|
1
|
+
import{c as A}from"./index-mXhpN3cS.js";var c;(function(e){e.WINDOWS="Windows",e.MACOS="macOS"})(c||(c={}));var s;(function(e){e.LAUNCHER="launcher",e.AUTO_SIGNING="auto-signing"})(s||(s={}));const u="https://explorer-artifacts.decentraland.org/launcher-rust",N="https://explorer-artifacts.decentraland.org/launcher/dcl",O=A.get("AUTO_SIGNING_BASE_URL"),L={[s.LAUNCHER]:{urls:{[c.WINDOWS]:{amd64:`${u}/Decentraland_installer.exe`},[c.MACOS]:{amd64:`${N}/Decentraland%20Outdated-mac-x64.dmg`,arm64:`${u}/Decentraland_installer.dmg`}}},[s.AUTO_SIGNING]:{urls:{[c.WINDOWS]:{amd64:`${O}/:identityId/decentraland.exe`},[c.MACOS]:{amd64:`${N}/Decentraland%20Outdated-mac-x64.dmg`,arm64:`${O}/:identityId/decentraland.dmg`}}}},i=(e=s.LAUNCHER,t)=>{const n=L[e];if(!n)return null;const r=a=>a&&(e===s.AUTO_SIGNING&&t?a.replace(":identityId",t):a);return{[c.WINDOWS]:{amd64:r(n.urls.Windows.amd64)},[c.MACOS]:{amd64:r(n.urls.macOS.amd64),arm64:r(n.urls.macOS.arm64)}}},m=(e,t)=>{if(!t||Object.keys(t).length===0)return e;const n=new URL(e);return Object.entries(t).forEach(([r,a])=>{a!=null&&n.searchParams.append(r,a)}),n.toString()},C=(e,t,n)=>{const r=new URL(e);return r.searchParams.delete(t),r.searchParams.append(t,n),r.toString()},d=e=>{if(!e)return null;const t={};for(const[n,r]of Object.entries(e)){const a={};for(const[l,o]of Object.entries(r))o&&(a[l]=o);Object.keys(a).length>0&&(t[n]=a)}return Object.keys(t).length>0?t:null},I=async(e,t)=>{if(!e){const n=i(s.LAUNCHER);return t||d(n)}try{const n=await e(),r=n?i(s.AUTO_SIGNING,n):i(s.LAUNCHER);return d(r)||t||null}catch(n){console.error("Failed to generate identityId:",n);const r=i(s.LAUNCHER);return d(r)||t||null}},f=(e,t,n,r)=>{if(!r?.[e])return n;const a=r[e];return t&&a[t]?a[t]:Object.values(a)[0]||n},U=d(i(s.LAUNCHER))||{};export{s as C,U as F,m as a,I as c,f as e,i as g,d as s,C as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-
|
|
1
|
+
{"version":3,"file":"url-DMbF6Zco.js","sources":["../../node_modules/decentraland-ui2/dist/components/DownloadButton/DownloadButton.types.js","../../node_modules/decentraland-ui2/dist/modules/cdnReleases.js","../../src/modules/url.ts"],"sourcesContent":["var OperativeSystem;\n(function (OperativeSystem) {\n OperativeSystem[\"WINDOWS\"] = \"Windows\";\n OperativeSystem[\"MACOS\"] = \"macOS\";\n})(OperativeSystem || (OperativeSystem = {}));\nexport { OperativeSystem };\n//# sourceMappingURL=DownloadButton.types.js.map","import { OperativeSystem } from '../components/DownloadButton';\nimport { config } from '../config';\nvar CDNSource;\n(function (CDNSource) {\n CDNSource[\"LAUNCHER\"] = \"launcher\";\n CDNSource[\"AUTO_SIGNING\"] = \"auto-signing\";\n // Add future CDN sources here\n})(CDNSource || (CDNSource = {}));\nconst LAUNCHER_BASE_URL = 'https://explorer-artifacts.decentraland.org/launcher-rust';\nconst LAUNCHER_LEGACY_BASE_URL = 'https://explorer-artifacts.decentraland.org/launcher/dcl';\nconst AUTO_SIGNING_BASE_URL = config.get('AUTO_SIGNING_BASE_URL');\nconst CDN_CONFIGS = {\n [CDNSource.LAUNCHER]: {\n urls: {\n [OperativeSystem.WINDOWS]: {\n amd64: `${LAUNCHER_BASE_URL}/Decentraland_installer.exe`\n },\n [OperativeSystem.MACOS]: {\n amd64: `${LAUNCHER_LEGACY_BASE_URL}/Decentraland%20Outdated-mac-x64.dmg`,\n arm64: `${LAUNCHER_BASE_URL}/Decentraland_installer.dmg`\n }\n }\n },\n [CDNSource.AUTO_SIGNING]: {\n urls: {\n [OperativeSystem.WINDOWS]: {\n amd64: `${AUTO_SIGNING_BASE_URL}/:identityId/decentraland.exe`\n },\n [OperativeSystem.MACOS]: {\n amd64: `${LAUNCHER_LEGACY_BASE_URL}/Decentraland%20Outdated-mac-x64.dmg`,\n arm64: `${AUTO_SIGNING_BASE_URL}/:identityId/decentraland.dmg`\n }\n }\n }\n // Add more CDN configurations here as needed\n};\nconst getCDNRelease = (source = CDNSource.LAUNCHER, identityId) => {\n const cdnConfig = CDN_CONFIGS[source];\n if (!cdnConfig) {\n return null;\n }\n const replaceIdentityId = (url) => {\n if (!url)\n return url;\n // Replace :identityId placeholder in the path for AUTO_SIGNING source\n if (source === CDNSource.AUTO_SIGNING && identityId) {\n return url.replace(':identityId', identityId);\n }\n return url;\n };\n return {\n [OperativeSystem.WINDOWS]: {\n amd64: replaceIdentityId(cdnConfig.urls.Windows.amd64)\n },\n [OperativeSystem.MACOS]: {\n amd64: replaceIdentityId(cdnConfig.urls.macOS.amd64),\n arm64: replaceIdentityId(cdnConfig.urls.macOS.arm64)\n }\n };\n};\nexport { getCDNRelease, CDNSource };\n//# sourceMappingURL=cdnReleases.js.map","import { CDNSource, getCDNRelease } from 'decentraland-ui2/dist/modules/cdnReleases'\nimport { Architecture } from '../types/download.types'\n\nconst addQueryParamsToUrlString = (url: string, params: Record<string, string | undefined | null>): string => {\n if (!params || Object.keys(params).length === 0) {\n return url\n }\n\n const urlObj = new URL(url)\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n urlObj.searchParams.append(key, value)\n }\n })\n\n return urlObj.toString()\n}\n\nconst updateUrlWithLastValue = (url: string, paramKey: string, paramValue: string) => {\n const urlObj = new URL(url)\n\n urlObj.searchParams.delete(paramKey)\n urlObj.searchParams.append(paramKey, paramValue)\n\n return urlObj.toString()\n}\n\nconst sanitizeCDNReleaseLinks = (\n cdnLinks: Record<string, Record<string, string | undefined>> | null\n): Record<string, Record<string, string>> | null => {\n if (!cdnLinks) return null\n\n const sanitizedLinks: Record<string, Record<string, string>> = {}\n for (const [os, archLinks] of Object.entries(cdnLinks)) {\n const sanitizedArchLinks: Record<string, string> = {}\n for (const [arch, link] of Object.entries(archLinks)) {\n if (link) {\n sanitizedArchLinks[arch] = link\n }\n }\n if (Object.keys(sanitizedArchLinks).length > 0) {\n sanitizedLinks[os] = sanitizedArchLinks\n }\n }\n return Object.keys(sanitizedLinks).length > 0 ? sanitizedLinks : null\n}\n\nconst calculateCDNReleaseLinksWithIdentity = async (\n getIdentityId?: () => Promise<string | undefined>,\n fallbackLinks?: Record<string, Record<string, string>> | null\n): Promise<Record<string, Record<string, string>> | null> => {\n if (!getIdentityId) {\n const launcherLinks = getCDNRelease(CDNSource.LAUNCHER)\n return fallbackLinks || sanitizeCDNReleaseLinks(launcherLinks)\n }\n\n try {\n const currentIdentityId = await getIdentityId()\n const cdnLinks = currentIdentityId ? getCDNRelease(CDNSource.AUTO_SIGNING, currentIdentityId) : getCDNRelease(CDNSource.LAUNCHER)\n\n return sanitizeCDNReleaseLinks(cdnLinks) || fallbackLinks || null\n } catch (error) {\n console.error('Failed to generate identityId:', error)\n const launcherLinks = getCDNRelease(CDNSource.LAUNCHER)\n return sanitizeCDNReleaseLinks(launcherLinks) || fallbackLinks || null\n }\n}\n\nconst extractDownloadLinkFromCDNReleaseOption = (\n optionText: string,\n optionArch: Architecture | undefined,\n optionFallbackLink: string | undefined,\n cdnReleaseLinks: Record<string, Record<string, string>> | null\n): string | undefined => {\n if (!cdnReleaseLinks?.[optionText]) return optionFallbackLink\n\n const osLinks = cdnReleaseLinks[optionText]\n if (optionArch && osLinks[optionArch]) {\n return osLinks[optionArch]\n }\n\n const firstAvailableLink = Object.values(osLinks)[0]\n return firstAvailableLink || optionFallbackLink\n}\n\nconst FALLBACK_CDN_RELEASE_LINKS = sanitizeCDNReleaseLinks(getCDNRelease(CDNSource.LAUNCHER)) || {}\n\nexport {\n FALLBACK_CDN_RELEASE_LINKS,\n addQueryParamsToUrlString,\n calculateCDNReleaseLinksWithIdentity,\n extractDownloadLinkFromCDNReleaseOption,\n sanitizeCDNReleaseLinks,\n updateUrlWithLastValue\n}\n"],"names":["OperativeSystem","CDNSource","LAUNCHER_BASE_URL","LAUNCHER_LEGACY_BASE_URL","AUTO_SIGNING_BASE_URL","config","CDN_CONFIGS","getCDNRelease","source","identityId","cdnConfig","replaceIdentityId","url","addQueryParamsToUrlString","params","urlObj","key","value","updateUrlWithLastValue","paramKey","paramValue","sanitizeCDNReleaseLinks","cdnLinks","sanitizedLinks","os","archLinks","sanitizedArchLinks","arch","link","calculateCDNReleaseLinksWithIdentity","getIdentityId","fallbackLinks","launcherLinks","currentIdentityId","error","extractDownloadLinkFromCDNReleaseOption","optionText","optionArch","optionFallbackLink","cdnReleaseLinks","osLinks","FALLBACK_CDN_RELEASE_LINKS"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as s}from"./vendor-router-D_36sTKu.js";import{u as d,d as i}from"./index-
|
|
1
|
+
import{r as s}from"./vendor-router-D_36sTKu.js";import{u as d,d as i}from"./index-DaRevScO.js";function u(){const{address:e}=d(),t=e||void 0,r=s.useMemo(()=>{if(t)try{return i.localStorageGetIdentity(t.toLowerCase())??void 0}catch(o){console.error("[useAuthIdentity] Failed to get identity:",o);return}},[t]);return{identity:r,hasValidIdentity:!!r,address:t}}export{u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthIdentity-
|
|
1
|
+
{"version":3,"file":"useAuthIdentity-CIDWXFI8.js","sources":["../../src/hooks/useAuthIdentity.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport type { AuthIdentity } from '@dcl/crypto'\nimport { localStorageGetIdentity } from '@dcl/single-sign-on-client'\nimport { useWalletAddress } from './useWalletAddress'\n\ntype UseAuthIdentityResult = {\n identity: AuthIdentity | undefined\n hasValidIdentity: boolean\n address: `0x${string}` | undefined\n}\n\nfunction useAuthIdentity(): UseAuthIdentityResult {\n const { address } = useWalletAddress()\n const walletAddress = address ? (address as `0x${string}`) : undefined\n\n const identity = useMemo<AuthIdentity | undefined>(() => {\n if (!walletAddress) return undefined\n try {\n return localStorageGetIdentity(walletAddress.toLowerCase()) ?? undefined\n } catch (error) {\n console.error('[useAuthIdentity] Failed to get identity:', error)\n return undefined\n }\n }, [walletAddress])\n\n return {\n identity,\n hasValidIdentity: Boolean(identity),\n address: walletAddress\n }\n}\n\nexport { useAuthIdentity }\nexport type { UseAuthIdentityResult }\n"],"names":["useAuthIdentity","address","useWalletAddress","walletAddress","identity","useMemo","localStorageGetIdentity","error"],"mappings":"+FAWA,SAASA,GAAyC,CAChD,KAAM,CAAE,QAAAC,CAAA,EAAYC,EAAA,EACdC,EAAgBF,GAAuC,OAEvDG,EAAWC,EAAAA,QAAkC,IAAM,CACvD,GAAKF,EACL,GAAI,CACF,OAAOG,EAAAA,wBAAwBH,EAAc,YAAA,CAAa,GAAK,MACjE,OAASI,EAAO,CACd,QAAQ,MAAM,4CAA6CA,CAAK,EAChE,MACF,CACF,EAAG,CAACJ,CAAa,CAAC,EAElB,MAAO,CACL,SAAAC,EACA,iBAAkB,EAAQA,EAC1B,QAASD,CAAA,CAEb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s,a as h,p as A,O as r,q as x,t as b}from"./index-
|
|
1
|
+
import{s,a as h,p as A,O as r,q as x,t as b}from"./index-DaRevScO.js";import{r as o}from"./vendor-router-D_36sTKu.js";import{t as O}from"./file-Cr_gl9BS.js";import{u as y,a as C}from"./url-DMbF6Zco.js";import{u as R,R as k}from"./useLatestGithubRelease-lPlpQBOj.js";const E=s("img")({width:"20px",height:"20px",filter:"brightness(0) invert(1)"}),I=s(h)({display:"flex",alignItems:"center",gap:"8px",marginTop:"8px",justifyContent:"center"}),U=s("span")({fontSize:"14px",color:"rgba(255, 255, 255, 0.7)"}),B=s("button")(({theme:l})=>({background:"none",border:"none",cursor:"pointer",padding:"4px",display:"flex",alignItems:"center",outline:"none","&:focus-visible":{outline:`2px solid ${l.palette.primary.main}`,outlineOffset:2}})),_=s("img")({width:"20px",height:"20px",filter:"brightness(0) invert(1)"}),w="/download/creator-hub-success",D=3e3,u={[r.WINDOWS]:b,[r.MACOS]:x};function j(){const[l,e]=A(),{links:t,loading:m}=R(k.CREATOR_HUB),a=o.useRef(null);o.useEffect(()=>()=>{a.current!==null&&clearTimeout(a.current)},[]);const p=!m&&!!t&&!l,d=o.useMemo(()=>!t||!e?null:e.os.name===r.MACOS?{text:r.MACOS,image:u[r.MACOS],link:t[r.MACOS]?.arm64||t[r.MACOS]?.amd64,arch:e.cpu.architecture}:t[e.os.name]?{text:e.os.name,image:u[e.os.name],link:t[e.os.name]?.[e.cpu.architecture],arch:e.cpu.architecture}:null,[e,t]),g=o.useMemo(()=>!t||!e?[]:Object.keys(t).filter(n=>n!==e.os.name).map(n=>{const i=t[n],c=Object.keys(i)[0];return{text:n,image:u[n],link:i?.[c],arch:c}}),[e,t]),f=o.useCallback(n=>{if(!n.link)return;a.current!==null&&(clearTimeout(a.current),a.current=null),O(n.link);const i=y(new URL(w,window.location.origin).toString(),"os",n.text),c=C(i,{arch:n.arch});a.current=setTimeout(()=>{window.location.href=c},D)},[]);return{isReady:p,primaryOption:d,secondaryOptions:g,handleDownload:f}}export{I as A,E as D,U as a,B as b,_ as c,j as u};
|
package/assets/{useCreatorHubDownload-htSWq2gm.js.map → useCreatorHubDownload-CQ5sircD.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCreatorHubDownload-
|
|
1
|
+
{"version":3,"file":"useCreatorHubDownload-CQ5sircD.js","sources":["../../src/components/Create/DownloadButtons.styled.ts","../../src/hooks/useCreatorHubDownload.ts"],"sourcesContent":["import { Box, styled } from 'decentraland-ui2'\n\nconst DownloadButtonImage = styled('img')({\n width: '20px',\n height: '20px',\n filter: 'brightness(0) invert(1)'\n})\n\nconst AlsoAvailableContainer = styled(Box)({\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginTop: '8px',\n justifyContent: 'center'\n})\n\nconst AlsoAvailableText = styled('span')({\n fontSize: '14px',\n color: 'rgba(255, 255, 255, 0.7)'\n})\n\nconst AlternativeIconButton = styled('button')(({ theme }) => ({\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n display: 'flex',\n alignItems: 'center',\n outline: 'none',\n ['&:focus-visible']: {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2\n }\n}))\n\nconst AlternativeButtonImage = styled('img')({\n width: '20px',\n height: '20px',\n filter: 'brightness(0) invert(1)'\n})\n\nexport { AlsoAvailableContainer, AlsoAvailableText, AlternativeButtonImage, AlternativeIconButton, DownloadButtonImage }\n","import { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useAdvancedUserAgentData } from '@dcl/hooks'\nimport appleLogo from '../images/apple-logo.svg'\nimport microsoftLogo from '../images/microsoft-logo.svg'\nimport { triggerFileDownload } from '../modules/file'\nimport { addQueryParamsToUrlString, updateUrlWithLastValue } from '../modules/url'\nimport { OperativeSystem } from '../types/download.types'\nimport type { Architecture } from '../types/download.types'\nimport { Repo, useLatestGithubRelease } from './useLatestGithubRelease'\n\nconst REDIRECT_PATH = '/download/creator-hub-success'\nconst REDIRECT_DELAY_MS = 3000\n\ntype DownloadOption = {\n text: string\n image: string\n link?: string\n arch?: Architecture\n}\n\nconst imageByOs: Record<string, string> = {\n [OperativeSystem.WINDOWS]: microsoftLogo,\n [OperativeSystem.MACOS]: appleLogo\n}\n\nfunction useCreatorHubDownload() {\n const [isLoadingUserAgentData, userAgentData] = useAdvancedUserAgentData()\n const { links, loading: isLoadingLinks } = useLatestGithubRelease(Repo.CREATOR_HUB)\n const redirectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useEffect(() => {\n return () => {\n if (redirectTimerRef.current !== null) {\n clearTimeout(redirectTimerRef.current)\n }\n }\n }, [])\n\n const isReady = !isLoadingLinks && !!links && !isLoadingUserAgentData\n\n const primaryOption: DownloadOption | null = useMemo(() => {\n if (!links || !userAgentData) return null\n\n if (userAgentData.os.name === OperativeSystem.MACOS) {\n return {\n text: OperativeSystem.MACOS,\n image: imageByOs[OperativeSystem.MACOS],\n link: links[OperativeSystem.MACOS]?.arm64 || links[OperativeSystem.MACOS]?.amd64,\n arch: userAgentData.cpu.architecture as Architecture\n }\n }\n\n if (links[userAgentData.os.name]) {\n return {\n text: userAgentData.os.name,\n image: imageByOs[userAgentData.os.name],\n link: links[userAgentData.os.name]?.[userAgentData.cpu.architecture],\n arch: userAgentData.cpu.architecture as Architecture\n }\n }\n\n return null\n }, [userAgentData, links])\n\n const secondaryOptions: DownloadOption[] = useMemo(() => {\n if (!links || !userAgentData) return []\n\n return Object.keys(links)\n .filter(os => os !== userAgentData.os.name)\n .map(os => {\n const osLinks = links[os]\n const firstArch = Object.keys(osLinks)[0]\n return {\n text: os,\n image: imageByOs[os],\n link: osLinks?.[firstArch],\n arch: firstArch as Architecture\n }\n })\n }, [userAgentData, links])\n\n const handleDownload = useCallback((option: DownloadOption) => {\n if (!option.link) return\n\n if (redirectTimerRef.current !== null) {\n clearTimeout(redirectTimerRef.current)\n redirectTimerRef.current = null\n }\n\n triggerFileDownload(option.link)\n\n const redirectUrl = updateUrlWithLastValue(new URL(REDIRECT_PATH, window.location.origin).toString(), 'os', option.text)\n const finalUrl = addQueryParamsToUrlString(redirectUrl, { arch: option.arch })\n redirectTimerRef.current = setTimeout(() => {\n window.location.href = finalUrl\n }, REDIRECT_DELAY_MS)\n }, [])\n\n return { isReady, primaryOption, secondaryOptions, handleDownload }\n}\n\nexport { useCreatorHubDownload }\nexport type { DownloadOption }\n"],"names":["DownloadButtonImage","styled","AlsoAvailableContainer","Box","AlsoAvailableText","AlternativeIconButton","theme","AlternativeButtonImage","REDIRECT_PATH","REDIRECT_DELAY_MS","imageByOs","OperativeSystem","microsoftLogo","appleLogo","useCreatorHubDownload","isLoadingUserAgentData","userAgentData","useAdvancedUserAgentData","links","isLoadingLinks","useLatestGithubRelease","Repo","redirectTimerRef","useRef","useEffect","isReady","primaryOption","useMemo","secondaryOptions","os","osLinks","firstArch","handleDownload","useCallback","option","triggerFileDownload","redirectUrl","updateUrlWithLastValue","finalUrl","addQueryParamsToUrlString"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as r,a as g,j as t,v as E,X as I}from"./index-
|
|
1
|
+
import{s as r,a as g,j as t,v as E,X as I}from"./index-DaRevScO.js";import{r as a,L as B}from"./vendor-router-D_36sTKu.js";import{C as D,M,D as H,a as A,P as j}from"./PostCard-CalYnkvr.js";import{S as u}from"./Skeleton-o93N4ZZz.js";import"./vendor-ua-D7qqAxdq.js";import{g as _}from"./BlogLayout-DOXQWe4b.js";const F=({onLoadMore:e,hasMore:n,isLoading:o,threshold:s=500,debounceMs:p=500})=>{const d=a.useRef(e),i=a.useRef(0);a.useEffect(()=>{d.current=e},[e]),a.useEffect(()=>{const c=()=>{const f=Date.now();if(f-i.current<p)return;const l=document.documentElement.scrollHeight,m=document.documentElement.scrollTop,h=document.documentElement.clientHeight;l-(m+h)<s&&n&&!o&&(i.current=f,d.current())};window.addEventListener("scroll",c,{passive:!0});const x=setTimeout(c,500);return()=>{window.removeEventListener("scroll",c),clearTimeout(x)}},[n,o,s,p])},S=r(g)(()=>({width:"100%",margin:"0 40px 40px 0",position:"relative",display:"flex",justifyContent:"space-between","@media (max-width: 1096px)":{display:"none"}})),O=r("img")(()=>({objectFit:"cover",boxShadow:"0 2px 4px 0 rgba(0, 0, 0, 0.16)",borderRadius:"5px",width:"697px",height:"349px",marginRight:"31px",transition:"transform 250ms ease, box-shadow 250ms ease"})),P=r(g)({width:"335px"}),W=r(B)(({theme:e})=>({textDecoration:"none",display:"block",color:e.palette.text.primary,"& h2, & h3":{fontSize:"34px",lineHeight:"42px",color:e.palette.text.primary,fontWeight:500},"&:visited, &:link, &:active":{color:e.palette.text.primary},"& *":{color:e.palette.text.primary}})),$=r("p")(({theme:e})=>({display:"block",fontSize:"17px",lineHeight:"26px",letterSpacing:"-0.4px",margin:0,paddingTop:"8px",fontWeight:400,color:e.palette.text.primary})),z=r(g)(()=>({display:"flex",justifyContent:"space-between"})),Q=r(u)(()=>({width:"697px",height:"348px"})),G=r(u)(()=>({width:"100%",height:"40px"})),N=r(u)(()=>({width:"90%",height:"40px"})),k=r(u)(()=>({width:"100px"})),y=r(u)(()=>({width:"100%"})),X=r(u)(()=>({width:"80%"})),q=r(g)(({theme:e})=>({marginTop:e.spacing(2)})),C=e=>{const{post:n,loading:o}=e;return o?t.jsxs(S,{children:[t.jsx(Q,{variant:"rectangular"}),t.jsxs(P,{children:[t.jsxs(z,{children:[t.jsx(k,{variant:"text"}),t.jsx(k,{variant:"text"})]}),t.jsx(G,{variant:"text"}),t.jsx(N,{variant:"text"}),t.jsxs(q,{children:[t.jsx(y,{variant:"text"}),t.jsx(y,{variant:"text"}),t.jsx(y,{variant:"text"}),t.jsx(X,{variant:"text"})]})]})]}):n?t.jsxs(S,{children:[t.jsx(D,{to:n.url,children:t.jsx(O,{src:n.image.url,alt:n.title,width:697,height:349,fetchPriority:"high",decoding:"async"})}),t.jsxs(P,{children:[t.jsxs(M,{children:[t.jsx(H,{children:n.publishedDate}),t.jsx("span",{children:t.jsx(A,{to:n.category.url,children:n.category.title})})]}),t.jsx(W,{to:n.url,children:t.jsx(E,{variant:"h3",component:"h2",children:n.title})}),t.jsx($,{children:n.description})]})]}):null},T=r(g,{shouldForwardProp:e=>e!=="hasMainPost"})(({theme:e,hasMainPost:n})=>({display:"flex",flexWrap:"wrap",justifyContent:"flex-start",paddingBottom:e.spacing(2.5),"& > div:nth-of-type(3n)":{marginRight:e.spacing(4)},...n&&{"& > div:nth-of-type(3n + 1)":{marginRight:0}},...!n&&{"& > div:nth-of-type(3n + 3)":{marginRight:0}},"@media (max-width: 1096px)":{justifyContent:"space-between","& > div, & > div:nth-of-type(3n)":{marginRight:0}}})),w=e=>"isPlaceholder"in e&&e.isPlaceholder===!0,nt=a.memo(e=>{const{posts:n,loading:o,hasMainPost:s=!1}=e,p=I("(min-width: 1096px)");if(o&&n.length===0){const i=s?7:6;return t.jsxs(T,{hasMainPost:s,children:[s&&t.jsx(C,{loading:!0}),Array.from(Array(i),(c,x)=>s&&x===0?null:t.jsx(j,{loading:!0},`skeleton-${x}`))]})}if(!n||n.length===0)return null;const d=n.find(i=>!w(i));return t.jsxs(T,{hasMainPost:s,children:[s&&p&&d&&t.jsx(C,{post:d}),n.map(i=>s&&p&&!w(i)&&i===d?null:w(i)?t.jsx(j,{loading:!0},i.id):t.jsx(j,{post:i},i.id))]})}),J=7,R=6,K=(e,n)=>Array.from({length:e},(o,s)=>({id:`placeholder-${n}-${s}`,isPlaceholder:!0}));function it({category:e,author:n}={}){const[o,s]=a.useState(0),[p,d]=a.useState(!1),i=a.useRef(0),{data:c,isLoading:x,error:f,isFetching:l}=_({category:e,author:n,limit:o===0?J:R,skip:o}),m=a.useMemo(()=>{const L=c?.posts??[];return p&&l?[...L,...K(R,i.current)]:L},[c?.posts,p,l]),h=c?.hasMore??!0,v=x&&o===0;a.useEffect(()=>{s(0),d(!1),i.current=0},[e,n]),a.useEffect(()=>{l&&o>0?(i.current+=1,d(!0)):l||d(!1)},[l,o]);const b=a.useCallback(()=>{l||!h||!c||s(c.nextCmsSkip)},[l,h,c]);return F({onLoadMore:b,hasMore:h,isLoading:l}),{posts:m,isLoading:x,isLoadingInitial:v,isFetching:l,hasMore:h,error:f}}export{nt as P,it as u};
|
package/assets/{useInfiniteBlogPosts-b1i6T88U.js.map → useInfiniteBlogPosts-DspRbflz.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInfiniteBlogPosts-b1i6T88U.js","sources":["../../node_modules/@dcl/hooks/esm/hooks/useInfiniteScroll.js","../../src/components/blog/MainPostCard/MainPostCard.styled.ts","../../src/components/blog/MainPostCard/MainPostCard.tsx","../../src/components/blog/PostList/PostList.styled.ts","../../src/components/blog/PostList/PostList.tsx","../../src/features/blog/useInfiniteBlogPosts.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n/**\n * Hook to implement infinite scroll functionality\n * Triggers onLoadMore callback when user scrolls near the bottom of the page\n * @param options - Configuration options for infinite scroll\n * @param options.onLoadMore - Callback to trigger when user scrolls near the end\n * @param options.hasMore - Whether more data is available to load\n * @param options.isLoading - Whether data is currently loading\n * @param options.threshold - Distance from bottom (in pixels) to trigger load. Default: 500\n * @param options.debounceMs - Minimum time (in milliseconds) between triggers to prevent multiple calls. Default: 500\n */\nconst useInfiniteScroll = ({ onLoadMore, hasMore, isLoading, threshold = 500, debounceMs = 500, }) => {\n const onLoadMoreRef = useRef(onLoadMore);\n const lastTriggerRef = useRef(0);\n useEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n }, [onLoadMore]);\n useEffect(() => {\n const handleScroll = () => {\n const now = Date.now();\n if (now - lastTriggerRef.current < debounceMs) {\n return;\n }\n const scrollHeight = document.documentElement.scrollHeight;\n const scrollTop = document.documentElement.scrollTop;\n const clientHeight = document.documentElement.clientHeight;\n const distanceFromBottom = scrollHeight - (scrollTop + clientHeight);\n if (distanceFromBottom < threshold && hasMore && !isLoading) {\n lastTriggerRef.current = now;\n onLoadMoreRef.current();\n }\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n const timeoutId = setTimeout(handleScroll, 500);\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n clearTimeout(timeoutId);\n };\n }, [hasMore, isLoading, threshold, debounceMs]);\n};\nexport { useInfiniteScroll };\n//# sourceMappingURL=useInfiniteScroll.js.map","/* eslint-disable @typescript-eslint/naming-convention */\nimport { Link } from 'react-router-dom'\nimport { Box, Skeleton, styled } from 'decentraland-ui2'\nimport { CardImageLink, CategoryLink, DateText, MetaBox } from '../shared/PostCard.styled'\n\nconst CardContainer = styled(Box)(() => ({\n width: '100%',\n margin: '0 40px 40px 0',\n position: 'relative',\n display: 'flex',\n justifyContent: 'space-between',\n '@media (max-width: 1096px)': {\n display: 'none'\n }\n}))\n\nconst CardImage = styled('img')(() => ({\n objectFit: 'cover',\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.16)',\n borderRadius: '5px',\n width: '697px',\n height: '349px',\n marginRight: '31px',\n transition: 'transform 250ms ease, box-shadow 250ms ease'\n}))\n\nconst CardInfo = styled(Box)({\n width: '335px'\n})\n\nconst TitleLink = styled(Link)(({ theme }) => ({\n textDecoration: 'none',\n display: 'block',\n color: theme.palette.text.primary,\n '& h2, & h3': {\n fontSize: '34px',\n lineHeight: '42px',\n color: theme.palette.text.primary,\n fontWeight: 500\n },\n '&:visited, &:link, &:active': {\n color: theme.palette.text.primary\n },\n '& *': {\n color: theme.palette.text.primary\n }\n}))\n\nconst Description = styled('p')(({ theme }) => ({\n display: 'block',\n fontSize: '17px',\n lineHeight: '26px',\n letterSpacing: '-0.4px',\n margin: 0,\n paddingTop: '8px',\n fontWeight: 400,\n color: theme.palette.text.primary\n}))\n\nconst LoadingHeader = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'space-between'\n}))\n\nconst LoadingImage = styled(Skeleton)(() => ({\n width: '697px',\n height: '348px'\n}))\n\nconst LoadingTitleLine = styled(Skeleton)(() => ({\n width: '100%',\n height: '40px'\n}))\n\nconst LoadingTitleLineShort = styled(Skeleton)(() => ({\n width: '90%',\n height: '40px'\n}))\n\nconst LoadingMetaSkeleton = styled(Skeleton)(() => ({\n width: '100px'\n}))\n\nconst LoadingTextSkeleton = styled(Skeleton)(() => ({\n width: '100%'\n}))\n\nconst LoadingTextSkeletonShort = styled(Skeleton)(() => ({\n width: '80%'\n}))\n\nconst LoadingContentBox = styled(Box)(({ theme }) => ({\n marginTop: theme.spacing(2)\n}))\n\nexport {\n CardContainer,\n CardImage,\n CardImageLink,\n CardInfo,\n CategoryLink,\n DateText,\n Description,\n LoadingContentBox,\n LoadingHeader,\n LoadingImage,\n LoadingMetaSkeleton,\n LoadingTextSkeleton,\n LoadingTextSkeletonShort,\n LoadingTitleLine,\n LoadingTitleLineShort,\n MetaBox,\n TitleLink\n}\n","import { Typography } from 'decentraland-ui2'\nimport type { MainPostCardProps } from './MainPostCard.types'\nimport {\n CardContainer,\n CardImage,\n CardImageLink,\n CardInfo,\n CategoryLink,\n DateText,\n Description,\n LoadingContentBox,\n LoadingHeader,\n LoadingImage,\n LoadingMetaSkeleton,\n LoadingTextSkeleton,\n LoadingTextSkeletonShort,\n LoadingTitleLine,\n LoadingTitleLineShort,\n MetaBox,\n TitleLink\n} from './MainPostCard.styled'\n\nconst MainPostCard = (props: MainPostCardProps) => {\n const { post, loading } = props\n\n if (loading) {\n return (\n <CardContainer>\n <LoadingImage variant=\"rectangular\" />\n <CardInfo>\n <LoadingHeader>\n <LoadingMetaSkeleton variant=\"text\" />\n <LoadingMetaSkeleton variant=\"text\" />\n </LoadingHeader>\n <LoadingTitleLine variant=\"text\" />\n <LoadingTitleLineShort variant=\"text\" />\n <LoadingContentBox>\n <LoadingTextSkeleton variant=\"text\" />\n <LoadingTextSkeleton variant=\"text\" />\n <LoadingTextSkeleton variant=\"text\" />\n <LoadingTextSkeletonShort variant=\"text\" />\n </LoadingContentBox>\n </CardInfo>\n </CardContainer>\n )\n }\n\n if (!post) return null\n\n return (\n <CardContainer>\n <CardImageLink to={post.url}>\n <CardImage src={post.image.url} alt={post.title} width={697} height={349} fetchPriority=\"high\" decoding=\"async\" />\n </CardImageLink>\n <CardInfo>\n <MetaBox>\n <DateText>{post.publishedDate}</DateText>\n <span>\n <CategoryLink to={post.category.url}>{post.category.title}</CategoryLink>\n </span>\n </MetaBox>\n <TitleLink to={post.url}>\n <Typography variant=\"h3\" component=\"h2\">\n {post.title}\n </Typography>\n </TitleLink>\n <Description>{post.description}</Description>\n </CardInfo>\n </CardContainer>\n )\n}\n\nexport { MainPostCard }\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { Box, styled } from 'decentraland-ui2'\n\nconst PostListWrapper = styled(Box, { shouldForwardProp: prop => prop !== 'hasMainPost' })<{ hasMainPost: boolean }>(\n ({ theme, hasMainPost }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-start',\n paddingBottom: theme.spacing(2.5),\n '& > div:nth-of-type(3n)': {\n marginRight: theme.spacing(4)\n },\n ...(hasMainPost && {\n '& > div:nth-of-type(3n + 1)': {\n marginRight: 0\n }\n }),\n ...(!hasMainPost && {\n '& > div:nth-of-type(3n + 3)': {\n marginRight: 0\n }\n }),\n '@media (max-width: 1096px)': {\n justifyContent: 'space-between',\n '& > div, & > div:nth-of-type(3n)': {\n marginRight: 0\n }\n }\n })\n)\n\nexport { PostListWrapper }\n","import { memo } from 'react'\nimport { useMediaQuery } from 'decentraland-ui2'\nimport type { BlogPost } from '../../../shared/blog/types/blog.domain'\nimport { MainPostCard } from '../MainPostCard'\nimport { PostCard } from '../PostCard'\nimport type { PostListProps } from './PostList.types'\nimport { PostListWrapper } from './PostList.styled'\n\n// Type guard to check if a post is a placeholder\nconst isPlaceholder = (post: { id: string; isPlaceholder?: boolean }): post is { id: string; isPlaceholder: true } => {\n return 'isPlaceholder' in post && post.isPlaceholder === true\n}\n\nconst PostList = memo((props: PostListProps) => {\n const { posts, loading, hasMainPost = false } = props\n const isBigScreen = useMediaQuery('(min-width: 1096px)')\n\n // Initial loading with no posts at all\n if (loading && posts.length === 0) {\n const count = hasMainPost ? 7 : 6\n\n return (\n <PostListWrapper hasMainPost={hasMainPost}>\n {hasMainPost && <MainPostCard loading />}\n {Array.from(Array(count), (_, index) => {\n if (hasMainPost && index === 0) {\n return null // MainPostCard already rendered\n }\n return <PostCard key={`skeleton-${index}`} loading />\n })}\n </PostListWrapper>\n )\n }\n\n if (!posts || posts.length === 0) {\n return null\n }\n\n // Get first real post for MainPostCard (if applicable)\n const firstRealPost = posts.find(p => !isPlaceholder(p)) as BlogPost | undefined\n\n return (\n <PostListWrapper hasMainPost={hasMainPost}>\n {hasMainPost && isBigScreen && firstRealPost && <MainPostCard post={firstRealPost} />}\n {posts.map(post => {\n // Skip the first real post if we're showing it as MainPostCard\n if (hasMainPost && isBigScreen && !isPlaceholder(post) && post === firstRealPost) {\n return null\n }\n\n // Render placeholder as loading skeleton\n if (isPlaceholder(post)) {\n return <PostCard key={post.id} loading />\n }\n\n return <PostCard key={post.id} post={post} />\n })}\n </PostListWrapper>\n )\n})\n\nexport { PostList }\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useInfiniteScroll } from '@dcl/hooks'\nimport type { PostOrPlaceholder } from '../../shared/blog/types/blog.domain'\nimport { useGetBlogPostsQuery } from './blog.client'\n\nconst POSTS_INITIAL_LOAD = 7\nconst POSTS_PER_LOAD = 6\n\ninterface UseInfiniteBlogPostsParams {\n category?: string\n author?: string\n}\n\ninterface UseInfiniteBlogPostsResult {\n posts: PostOrPlaceholder[]\n isLoading: boolean\n isLoadingInitial: boolean\n isFetching: boolean\n hasMore: boolean\n error: unknown\n}\n\n// Helper to create placeholder posts\nconst createPlaceholders = (count: number, batchId: number): PostOrPlaceholder[] => {\n return Array.from({ length: count }, (_, i) => ({\n id: `placeholder-${batchId}-${i}`,\n isPlaceholder: true as const\n }))\n}\n\nfunction useInfiniteBlogPosts({ category, author }: UseInfiniteBlogPostsParams = {}): UseInfiniteBlogPostsResult {\n const [currentSkip, setCurrentSkip] = useState(0)\n const [showPlaceholders, setShowPlaceholders] = useState(false)\n const batchIdRef = useRef(0)\n\n // Use RTK Query with pagination - cache handles accumulation via merge\n // Backend handles category/author filtering, so we request real page sizes\n const { data, isLoading, error, isFetching } = useGetBlogPostsQuery({\n category,\n author,\n limit: currentSkip === 0 ? POSTS_INITIAL_LOAD : POSTS_PER_LOAD,\n skip: currentSkip\n })\n\n // Build display posts: cached posts + placeholders when loading more\n const displayPosts = useMemo<PostOrPlaceholder[]>(() => {\n const posts = data?.posts ?? []\n if (showPlaceholders && isFetching) {\n return [...posts, ...createPlaceholders(POSTS_PER_LOAD, batchIdRef.current)]\n }\n return posts\n }, [data?.posts, showPlaceholders, isFetching])\n\n const hasMore = data?.hasMore ?? true\n const isLoadingInitial = isLoading && currentSkip === 0\n\n // Reset skip when filters change\n useEffect(() => {\n setCurrentSkip(0)\n setShowPlaceholders(false)\n batchIdRef.current = 0\n }, [category, author])\n\n // Show placeholders when fetching more (not initial)\n useEffect(() => {\n if (isFetching && currentSkip > 0) {\n batchIdRef.current += 1\n setShowPlaceholders(true)\n } else if (!isFetching) {\n setShowPlaceholders(false)\n }\n }, [isFetching, currentSkip])\n\n // Load more function - use nextCmsSkip to properly paginate\n const loadMore = useCallback(() => {\n if (isFetching || !hasMore || !data) {\n return\n }\n // Use the CMS-level skip for proper pagination\n setCurrentSkip(data.nextCmsSkip)\n }, [isFetching, hasMore, data])\n\n // Use @dcl/hooks infinite scroll\n useInfiniteScroll({\n onLoadMore: loadMore,\n hasMore,\n isLoading: isFetching\n })\n\n return {\n posts: displayPosts,\n isLoading,\n isLoadingInitial,\n isFetching,\n hasMore,\n error\n }\n}\n\nexport { useInfiniteBlogPosts, type UseInfiniteBlogPostsParams, type UseInfiniteBlogPostsResult }\n"],"names":["useInfiniteScroll","onLoadMore","hasMore","isLoading","threshold","debounceMs","onLoadMoreRef","useRef","lastTriggerRef","useEffect","handleScroll","now","scrollHeight","scrollTop","clientHeight","timeoutId","CardContainer","styled","Box","CardImage","CardInfo","TitleLink","Link","theme","Description","LoadingHeader","LoadingImage","Skeleton","LoadingTitleLine","LoadingTitleLineShort","LoadingMetaSkeleton","LoadingTextSkeleton","LoadingTextSkeletonShort","LoadingContentBox","MainPostCard","props","post","loading","jsx","jsxs","CardImageLink","MetaBox","DateText","CategoryLink","Typography","PostListWrapper","prop","hasMainPost","isPlaceholder","PostList","memo","posts","isBigScreen","useMediaQuery","count","_","index","PostCard","firstRealPost","p","POSTS_INITIAL_LOAD","POSTS_PER_LOAD","createPlaceholders","batchId","i","useInfiniteBlogPosts","category","author","currentSkip","setCurrentSkip","useState","showPlaceholders","setShowPlaceholders","batchIdRef","data","error","isFetching","useGetBlogPostsQuery","displayPosts","useMemo","isLoadingInitial","loadMore","useCallback"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"useInfiniteBlogPosts-DspRbflz.js","sources":["../../node_modules/@dcl/hooks/esm/hooks/useInfiniteScroll.js","../../src/components/blog/MainPostCard/MainPostCard.styled.ts","../../src/components/blog/MainPostCard/MainPostCard.tsx","../../src/components/blog/PostList/PostList.styled.ts","../../src/components/blog/PostList/PostList.tsx","../../src/features/blog/useInfiniteBlogPosts.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n/**\n * Hook to implement infinite scroll functionality\n * Triggers onLoadMore callback when user scrolls near the bottom of the page\n * @param options - Configuration options for infinite scroll\n * @param options.onLoadMore - Callback to trigger when user scrolls near the end\n * @param options.hasMore - Whether more data is available to load\n * @param options.isLoading - Whether data is currently loading\n * @param options.threshold - Distance from bottom (in pixels) to trigger load. Default: 500\n * @param options.debounceMs - Minimum time (in milliseconds) between triggers to prevent multiple calls. Default: 500\n */\nconst useInfiniteScroll = ({ onLoadMore, hasMore, isLoading, threshold = 500, debounceMs = 500, }) => {\n const onLoadMoreRef = useRef(onLoadMore);\n const lastTriggerRef = useRef(0);\n useEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n }, [onLoadMore]);\n useEffect(() => {\n const handleScroll = () => {\n const now = Date.now();\n if (now - lastTriggerRef.current < debounceMs) {\n return;\n }\n const scrollHeight = document.documentElement.scrollHeight;\n const scrollTop = document.documentElement.scrollTop;\n const clientHeight = document.documentElement.clientHeight;\n const distanceFromBottom = scrollHeight - (scrollTop + clientHeight);\n if (distanceFromBottom < threshold && hasMore && !isLoading) {\n lastTriggerRef.current = now;\n onLoadMoreRef.current();\n }\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n const timeoutId = setTimeout(handleScroll, 500);\n return () => {\n window.removeEventListener(\"scroll\", handleScroll);\n clearTimeout(timeoutId);\n };\n }, [hasMore, isLoading, threshold, debounceMs]);\n};\nexport { useInfiniteScroll };\n//# sourceMappingURL=useInfiniteScroll.js.map","/* eslint-disable @typescript-eslint/naming-convention */\nimport { Link } from 'react-router-dom'\nimport { Box, Skeleton, styled } from 'decentraland-ui2'\nimport { CardImageLink, CategoryLink, DateText, MetaBox } from '../shared/PostCard.styled'\n\nconst CardContainer = styled(Box)(() => ({\n width: '100%',\n margin: '0 40px 40px 0',\n position: 'relative',\n display: 'flex',\n justifyContent: 'space-between',\n '@media (max-width: 1096px)': {\n display: 'none'\n }\n}))\n\nconst CardImage = styled('img')(() => ({\n objectFit: 'cover',\n boxShadow: '0 2px 4px 0 rgba(0, 0, 0, 0.16)',\n borderRadius: '5px',\n width: '697px',\n height: '349px',\n marginRight: '31px',\n transition: 'transform 250ms ease, box-shadow 250ms ease'\n}))\n\nconst CardInfo = styled(Box)({\n width: '335px'\n})\n\nconst TitleLink = styled(Link)(({ theme }) => ({\n textDecoration: 'none',\n display: 'block',\n color: theme.palette.text.primary,\n '& h2, & h3': {\n fontSize: '34px',\n lineHeight: '42px',\n color: theme.palette.text.primary,\n fontWeight: 500\n },\n '&:visited, &:link, &:active': {\n color: theme.palette.text.primary\n },\n '& *': {\n color: theme.palette.text.primary\n }\n}))\n\nconst Description = styled('p')(({ theme }) => ({\n display: 'block',\n fontSize: '17px',\n lineHeight: '26px',\n letterSpacing: '-0.4px',\n margin: 0,\n paddingTop: '8px',\n fontWeight: 400,\n color: theme.palette.text.primary\n}))\n\nconst LoadingHeader = styled(Box)(() => ({\n display: 'flex',\n justifyContent: 'space-between'\n}))\n\nconst LoadingImage = styled(Skeleton)(() => ({\n width: '697px',\n height: '348px'\n}))\n\nconst LoadingTitleLine = styled(Skeleton)(() => ({\n width: '100%',\n height: '40px'\n}))\n\nconst LoadingTitleLineShort = styled(Skeleton)(() => ({\n width: '90%',\n height: '40px'\n}))\n\nconst LoadingMetaSkeleton = styled(Skeleton)(() => ({\n width: '100px'\n}))\n\nconst LoadingTextSkeleton = styled(Skeleton)(() => ({\n width: '100%'\n}))\n\nconst LoadingTextSkeletonShort = styled(Skeleton)(() => ({\n width: '80%'\n}))\n\nconst LoadingContentBox = styled(Box)(({ theme }) => ({\n marginTop: theme.spacing(2)\n}))\n\nexport {\n CardContainer,\n CardImage,\n CardImageLink,\n CardInfo,\n CategoryLink,\n DateText,\n Description,\n LoadingContentBox,\n LoadingHeader,\n LoadingImage,\n LoadingMetaSkeleton,\n LoadingTextSkeleton,\n LoadingTextSkeletonShort,\n LoadingTitleLine,\n LoadingTitleLineShort,\n MetaBox,\n TitleLink\n}\n","import { Typography } from 'decentraland-ui2'\nimport type { MainPostCardProps } from './MainPostCard.types'\nimport {\n CardContainer,\n CardImage,\n CardImageLink,\n CardInfo,\n CategoryLink,\n DateText,\n Description,\n LoadingContentBox,\n LoadingHeader,\n LoadingImage,\n LoadingMetaSkeleton,\n LoadingTextSkeleton,\n LoadingTextSkeletonShort,\n LoadingTitleLine,\n LoadingTitleLineShort,\n MetaBox,\n TitleLink\n} from './MainPostCard.styled'\n\nconst MainPostCard = (props: MainPostCardProps) => {\n const { post, loading } = props\n\n if (loading) {\n return (\n <CardContainer>\n <LoadingImage variant=\"rectangular\" />\n <CardInfo>\n <LoadingHeader>\n <LoadingMetaSkeleton variant=\"text\" />\n <LoadingMetaSkeleton variant=\"text\" />\n </LoadingHeader>\n <LoadingTitleLine variant=\"text\" />\n <LoadingTitleLineShort variant=\"text\" />\n <LoadingContentBox>\n <LoadingTextSkeleton variant=\"text\" />\n <LoadingTextSkeleton variant=\"text\" />\n <LoadingTextSkeleton variant=\"text\" />\n <LoadingTextSkeletonShort variant=\"text\" />\n </LoadingContentBox>\n </CardInfo>\n </CardContainer>\n )\n }\n\n if (!post) return null\n\n return (\n <CardContainer>\n <CardImageLink to={post.url}>\n <CardImage src={post.image.url} alt={post.title} width={697} height={349} fetchPriority=\"high\" decoding=\"async\" />\n </CardImageLink>\n <CardInfo>\n <MetaBox>\n <DateText>{post.publishedDate}</DateText>\n <span>\n <CategoryLink to={post.category.url}>{post.category.title}</CategoryLink>\n </span>\n </MetaBox>\n <TitleLink to={post.url}>\n <Typography variant=\"h3\" component=\"h2\">\n {post.title}\n </Typography>\n </TitleLink>\n <Description>{post.description}</Description>\n </CardInfo>\n </CardContainer>\n )\n}\n\nexport { MainPostCard }\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { Box, styled } from 'decentraland-ui2'\n\nconst PostListWrapper = styled(Box, { shouldForwardProp: prop => prop !== 'hasMainPost' })<{ hasMainPost: boolean }>(\n ({ theme, hasMainPost }) => ({\n display: 'flex',\n flexWrap: 'wrap',\n justifyContent: 'flex-start',\n paddingBottom: theme.spacing(2.5),\n '& > div:nth-of-type(3n)': {\n marginRight: theme.spacing(4)\n },\n ...(hasMainPost && {\n '& > div:nth-of-type(3n + 1)': {\n marginRight: 0\n }\n }),\n ...(!hasMainPost && {\n '& > div:nth-of-type(3n + 3)': {\n marginRight: 0\n }\n }),\n '@media (max-width: 1096px)': {\n justifyContent: 'space-between',\n '& > div, & > div:nth-of-type(3n)': {\n marginRight: 0\n }\n }\n })\n)\n\nexport { PostListWrapper }\n","import { memo } from 'react'\nimport { useMediaQuery } from 'decentraland-ui2'\nimport type { BlogPost } from '../../../shared/blog/types/blog.domain'\nimport { MainPostCard } from '../MainPostCard'\nimport { PostCard } from '../PostCard'\nimport type { PostListProps } from './PostList.types'\nimport { PostListWrapper } from './PostList.styled'\n\n// Type guard to check if a post is a placeholder\nconst isPlaceholder = (post: { id: string; isPlaceholder?: boolean }): post is { id: string; isPlaceholder: true } => {\n return 'isPlaceholder' in post && post.isPlaceholder === true\n}\n\nconst PostList = memo((props: PostListProps) => {\n const { posts, loading, hasMainPost = false } = props\n const isBigScreen = useMediaQuery('(min-width: 1096px)')\n\n // Initial loading with no posts at all\n if (loading && posts.length === 0) {\n const count = hasMainPost ? 7 : 6\n\n return (\n <PostListWrapper hasMainPost={hasMainPost}>\n {hasMainPost && <MainPostCard loading />}\n {Array.from(Array(count), (_, index) => {\n if (hasMainPost && index === 0) {\n return null // MainPostCard already rendered\n }\n return <PostCard key={`skeleton-${index}`} loading />\n })}\n </PostListWrapper>\n )\n }\n\n if (!posts || posts.length === 0) {\n return null\n }\n\n // Get first real post for MainPostCard (if applicable)\n const firstRealPost = posts.find(p => !isPlaceholder(p)) as BlogPost | undefined\n\n return (\n <PostListWrapper hasMainPost={hasMainPost}>\n {hasMainPost && isBigScreen && firstRealPost && <MainPostCard post={firstRealPost} />}\n {posts.map(post => {\n // Skip the first real post if we're showing it as MainPostCard\n if (hasMainPost && isBigScreen && !isPlaceholder(post) && post === firstRealPost) {\n return null\n }\n\n // Render placeholder as loading skeleton\n if (isPlaceholder(post)) {\n return <PostCard key={post.id} loading />\n }\n\n return <PostCard key={post.id} post={post} />\n })}\n </PostListWrapper>\n )\n})\n\nexport { PostList }\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useInfiniteScroll } from '@dcl/hooks'\nimport type { PostOrPlaceholder } from '../../shared/blog/types/blog.domain'\nimport { useGetBlogPostsQuery } from './blog.client'\n\nconst POSTS_INITIAL_LOAD = 7\nconst POSTS_PER_LOAD = 6\n\ninterface UseInfiniteBlogPostsParams {\n category?: string\n author?: string\n}\n\ninterface UseInfiniteBlogPostsResult {\n posts: PostOrPlaceholder[]\n isLoading: boolean\n isLoadingInitial: boolean\n isFetching: boolean\n hasMore: boolean\n error: unknown\n}\n\n// Helper to create placeholder posts\nconst createPlaceholders = (count: number, batchId: number): PostOrPlaceholder[] => {\n return Array.from({ length: count }, (_, i) => ({\n id: `placeholder-${batchId}-${i}`,\n isPlaceholder: true as const\n }))\n}\n\nfunction useInfiniteBlogPosts({ category, author }: UseInfiniteBlogPostsParams = {}): UseInfiniteBlogPostsResult {\n const [currentSkip, setCurrentSkip] = useState(0)\n const [showPlaceholders, setShowPlaceholders] = useState(false)\n const batchIdRef = useRef(0)\n\n // Use RTK Query with pagination - cache handles accumulation via merge\n // Backend handles category/author filtering, so we request real page sizes\n const { data, isLoading, error, isFetching } = useGetBlogPostsQuery({\n category,\n author,\n limit: currentSkip === 0 ? POSTS_INITIAL_LOAD : POSTS_PER_LOAD,\n skip: currentSkip\n })\n\n // Build display posts: cached posts + placeholders when loading more\n const displayPosts = useMemo<PostOrPlaceholder[]>(() => {\n const posts = data?.posts ?? []\n if (showPlaceholders && isFetching) {\n return [...posts, ...createPlaceholders(POSTS_PER_LOAD, batchIdRef.current)]\n }\n return posts\n }, [data?.posts, showPlaceholders, isFetching])\n\n const hasMore = data?.hasMore ?? true\n const isLoadingInitial = isLoading && currentSkip === 0\n\n // Reset skip when filters change\n useEffect(() => {\n setCurrentSkip(0)\n setShowPlaceholders(false)\n batchIdRef.current = 0\n }, [category, author])\n\n // Show placeholders when fetching more (not initial)\n useEffect(() => {\n if (isFetching && currentSkip > 0) {\n batchIdRef.current += 1\n setShowPlaceholders(true)\n } else if (!isFetching) {\n setShowPlaceholders(false)\n }\n }, [isFetching, currentSkip])\n\n // Load more function - use nextCmsSkip to properly paginate\n const loadMore = useCallback(() => {\n if (isFetching || !hasMore || !data) {\n return\n }\n // Use the CMS-level skip for proper pagination\n setCurrentSkip(data.nextCmsSkip)\n }, [isFetching, hasMore, data])\n\n // Use @dcl/hooks infinite scroll\n useInfiniteScroll({\n onLoadMore: loadMore,\n hasMore,\n isLoading: isFetching\n })\n\n return {\n posts: displayPosts,\n isLoading,\n isLoadingInitial,\n isFetching,\n hasMore,\n error\n }\n}\n\nexport { useInfiniteBlogPosts, type UseInfiniteBlogPostsParams, type UseInfiniteBlogPostsResult }\n"],"names":["useInfiniteScroll","onLoadMore","hasMore","isLoading","threshold","debounceMs","onLoadMoreRef","useRef","lastTriggerRef","useEffect","handleScroll","now","scrollHeight","scrollTop","clientHeight","timeoutId","CardContainer","styled","Box","CardImage","CardInfo","TitleLink","Link","theme","Description","LoadingHeader","LoadingImage","Skeleton","LoadingTitleLine","LoadingTitleLineShort","LoadingMetaSkeleton","LoadingTextSkeleton","LoadingTextSkeletonShort","LoadingContentBox","MainPostCard","props","post","loading","jsx","jsxs","CardImageLink","MetaBox","DateText","CategoryLink","Typography","PostListWrapper","prop","hasMainPost","isPlaceholder","PostList","memo","posts","isBigScreen","useMediaQuery","count","_","index","PostCard","firstRealPost","p","POSTS_INITIAL_LOAD","POSTS_PER_LOAD","createPlaceholders","batchId","i","useInfiniteBlogPosts","category","author","currentSkip","setCurrentSkip","useState","showPlaceholders","setShowPlaceholders","batchIdRef","data","error","isFetching","useGetBlogPostsQuery","displayPosts","useMemo","isLoadingInitial","loadMore","useCallback"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as s,b as h,m as v,c as n,e as j,f as k}from"./index-
|
|
1
|
+
import{_ as s,b as h,m as v,c as n,e as j,f as k}from"./index-DaRevScO.js";const E=["className","elementType","ownerState","externalForwardedProps","getSlotOwnerState","internalForwardedProps"],L=["component","slots","slotProps"],N=["component"];function W(e,o){const{className:x,elementType:_,ownerState:l,externalForwardedProps:p,getSlotOwnerState:d,internalForwardedProps:a}=o,F=s(o,E),{component:c,slots:t={[e]:void 0},slotProps:O={[e]:void 0}}=p,g=s(p,L),P=t[e]||_,r=h(O[e],l),i=v(n({className:x},F,{externalForwardedProps:e==="root"?g:void 0,externalSlotProps:r})),{props:{component:f},internalRef:y}=i,u=s(i.props,N),C=j(y,r?.ref,o.ref),S=d?d(u):{},T=n({},l,S),w=e==="root"?f||c:f,m=k(P,n({},e==="root"&&!c&&!t[e]&&a,e!=="root"&&!t[e]&&a,u,w&&{as:w},{ref:C}),T);return Object.keys(S).forEach(b=>{delete m[b]}),[P,m]}export{W as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSlot-
|
|
1
|
+
{"version":3,"file":"useSlot-BerGUD87.js","sources":["../../node_modules/decentraland-ui2/node_modules/@mui/material/utils/useSlot.js"],"sourcesContent":["'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nconst _excluded = [\"className\", \"elementType\", \"ownerState\", \"externalForwardedProps\", \"getSlotOwnerState\", \"internalForwardedProps\"],\n _excluded2 = [\"component\", \"slots\", \"slotProps\"],\n _excluded3 = [\"component\"];\nimport useForkRef from '@mui/utils/useForkRef';\nimport { appendOwnerState, resolveComponentProps, mergeSlotProps } from '@mui/base/utils';\n/**\n * An internal function to create a Material UI slot.\n *\n * This is an advanced version of Base UI `useSlotProps` because Material UI allows leaf component to be customized via `component` prop\n * while Base UI does not need to support leaf component customization.\n *\n * @param {string} name: name of the slot\n * @param {object} parameters\n * @returns {[Slot, slotProps]} The slot's React component and the slot's props\n *\n * Note: the returned slot's props\n * - will never contain `component` prop.\n * - might contain `as` prop.\n */\nexport default function useSlot(\n/**\n * The slot's name. All Material UI components should have `root` slot.\n *\n * If the name is `root`, the logic behaves differently from other slots,\n * e.g. the `externalForwardedProps` are spread to `root` slot but not other slots.\n */\nname, parameters) {\n const {\n className,\n elementType: initialElementType,\n ownerState,\n externalForwardedProps,\n getSlotOwnerState,\n internalForwardedProps\n } = parameters,\n useSlotPropsParams = _objectWithoutPropertiesLoose(parameters, _excluded);\n const {\n component: rootComponent,\n slots = {\n [name]: undefined\n },\n slotProps = {\n [name]: undefined\n }\n } = externalForwardedProps,\n other = _objectWithoutPropertiesLoose(externalForwardedProps, _excluded2);\n const elementType = slots[name] || initialElementType;\n\n // `slotProps[name]` can be a callback that receives the component's ownerState.\n // `resolvedComponentsProps` is always a plain object.\n const resolvedComponentsProps = resolveComponentProps(slotProps[name], ownerState);\n const _mergeSlotProps = mergeSlotProps(_extends({\n className\n }, useSlotPropsParams, {\n externalForwardedProps: name === 'root' ? other : undefined,\n externalSlotProps: resolvedComponentsProps\n })),\n {\n props: {\n component: slotComponent\n },\n internalRef\n } = _mergeSlotProps,\n mergedProps = _objectWithoutPropertiesLoose(_mergeSlotProps.props, _excluded3);\n const ref = useForkRef(internalRef, resolvedComponentsProps == null ? void 0 : resolvedComponentsProps.ref, parameters.ref);\n const slotOwnerState = getSlotOwnerState ? getSlotOwnerState(mergedProps) : {};\n const finalOwnerState = _extends({}, ownerState, slotOwnerState);\n const LeafComponent = name === 'root' ? slotComponent || rootComponent : slotComponent;\n const props = appendOwnerState(elementType, _extends({}, name === 'root' && !rootComponent && !slots[name] && internalForwardedProps, name !== 'root' && !slots[name] && internalForwardedProps, mergedProps, LeafComponent && {\n as: LeafComponent\n }, {\n ref\n }), finalOwnerState);\n Object.keys(slotOwnerState).forEach(propName => {\n delete props[propName];\n });\n return [elementType, props];\n}"],"names":["_excluded","_excluded2","_excluded3","useSlot","name","parameters","className","initialElementType","ownerState","externalForwardedProps","getSlotOwnerState","internalForwardedProps","useSlotPropsParams","_objectWithoutPropertiesLoose","rootComponent","slots","slotProps","other","elementType","resolvedComponentsProps","resolveComponentProps","_mergeSlotProps","mergeSlotProps","_extends","slotComponent","internalRef","mergedProps","ref","useForkRef","slotOwnerState","finalOwnerState","LeafComponent","props","appendOwnerState","propName"],"mappings":"2EAIA,MAAMA,EAAY,CAAC,YAAa,cAAe,aAAc,yBAA0B,oBAAqB,wBAAwB,EAClIC,EAAa,CAAC,YAAa,QAAS,WAAW,EAC/CC,EAAa,CAAC,WAAW,EAiBZ,SAASC,EAOxBC,EAAMC,EAAY,CAChB,KAAM,CACF,UAAAC,EACA,YAAaC,EACb,WAAAC,EACA,uBAAAC,EACA,kBAAAC,EACA,uBAAAC,CACN,EAAQN,EACJO,EAAqBC,EAA8BR,EAAYL,CAAS,EACpE,CACF,UAAWc,EACX,MAAAC,EAAQ,CACN,CAACX,CAAI,EAAG,MAChB,EACM,UAAAY,EAAY,CACV,CAACZ,CAAI,EAAG,MAChB,CACA,EAAQK,EACJQ,EAAQJ,EAA8BJ,EAAwBR,CAAU,EACpEiB,EAAcH,EAAMX,CAAI,GAAKG,EAI7BY,EAA0BC,EAAsBJ,EAAUZ,CAAI,EAAGI,CAAU,EAC3Ea,EAAkBC,EAAeC,EAAS,CAC5C,UAAAjB,CACN,EAAOM,EAAoB,CACrB,uBAAwBR,IAAS,OAASa,EAAQ,OAClD,kBAAmBE,CACzB,CAAK,CAAC,EACF,CACE,MAAO,CACL,UAAWK,CACnB,EACM,YAAAC,CACN,EAAQJ,EACJK,EAAcb,EAA8BQ,EAAgB,MAAOnB,CAAU,EACzEyB,EAAMC,EAAWH,EAAwDN,GAAwB,IAAKd,EAAW,GAAG,EACpHwB,EAAiBnB,EAAoBA,EAAkBgB,CAAW,EAAI,CAAA,EACtEI,EAAkBP,EAAS,GAAIf,EAAYqB,CAAc,EACzDE,EAAgB3B,IAAS,OAASoB,GAAiBV,EAAgBU,EACnEQ,EAAQC,EAAiBf,EAAaK,EAAS,CAAA,EAAInB,IAAS,QAAU,CAACU,GAAiB,CAACC,EAAMX,CAAI,GAAKO,EAAwBP,IAAS,QAAU,CAACW,EAAMX,CAAI,GAAKO,EAAwBe,EAAaK,GAAiB,CAC7N,GAAIA,CACR,EAAK,CACD,IAAAJ,CACJ,CAAG,EAAGG,CAAe,EACnB,cAAO,KAAKD,CAAc,EAAE,QAAQK,GAAY,CAC9C,OAAOF,EAAME,CAAQ,CACvB,CAAC,EACM,CAAChB,EAAac,CAAK,CAC5B","x_google_ignoreList":[0]}
|