@local-logic/sdks-app 1.24.55 → 1.24.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{Attribution-kw125yRW.js → Attribution-BOTbUbV6.js} +2 -2
- package/dist/assets/{Attribution-kw125yRW.js.map → Attribution-BOTbUbV6.js.map} +1 -1
- package/dist/assets/{Attribution-legacy-Chi4675H.js → Attribution-legacy-BnsWo3_b.js} +2 -2
- package/dist/assets/{Attribution-legacy-Chi4675H.js.map → Attribution-legacy-BnsWo3_b.js.map} +1 -1
- package/dist/assets/{Cluster-BHQcO6iC-CebPxFZj.js → Cluster-BHQcO6iC-cJd-7JrI.js} +2 -2
- package/dist/assets/{Cluster-BHQcO6iC-CebPxFZj.js.map → Cluster-BHQcO6iC-cJd-7JrI.js.map} +1 -1
- package/dist/assets/{Cluster-BHQcO6iC-legacy-Du0M2J6Q.js → Cluster-BHQcO6iC-legacy-B40gvWyN.js} +2 -2
- package/dist/assets/{Cluster-BHQcO6iC-legacy-Du0M2J6Q.js.map → Cluster-BHQcO6iC-legacy-B40gvWyN.js.map} +1 -1
- package/dist/assets/{Google-BFAJ84CT-BYUDq3Rn.js → Google-BFAJ84CT-VGtAtn96.js} +2 -2
- package/dist/assets/{Google-BFAJ84CT-BYUDq3Rn.js.map → Google-BFAJ84CT-VGtAtn96.js.map} +1 -1
- package/dist/assets/{Google-BFAJ84CT-legacy-C-p2r3Dr.js → Google-BFAJ84CT-legacy-DL0LtChw.js} +2 -2
- package/dist/assets/{Google-BFAJ84CT-legacy-C-p2r3Dr.js.map → Google-BFAJ84CT-legacy-DL0LtChw.js.map} +1 -1
- package/dist/assets/{Google-BS41ufih-D9AZqNEh.js → Google-BS41ufih-BMoGkZPd.js} +2 -2
- package/dist/assets/{Google-BS41ufih-D9AZqNEh.js.map → Google-BS41ufih-BMoGkZPd.js.map} +1 -1
- package/dist/assets/{Google-BS41ufih-legacy-BVmSzd63.js → Google-BS41ufih-legacy-DCato3ot.js} +2 -2
- package/dist/assets/{Google-BS41ufih-legacy-BVmSzd63.js.map → Google-BS41ufih-legacy-DCato3ot.js.map} +1 -1
- package/dist/assets/Google-BXqDFxzx-CUVrFk6n.js +2 -0
- package/dist/assets/Google-BXqDFxzx-CUVrFk6n.js.map +1 -0
- package/dist/assets/Google-BXqDFxzx-legacy-DiOyHfjt.js +2 -0
- package/dist/assets/Google-BXqDFxzx-legacy-DiOyHfjt.js.map +1 -0
- package/dist/assets/Google-CH7a2yx--BkJitjCf.js +2 -0
- package/dist/assets/{Google-CH7a2yx--Cn8Y8O80.js.map → Google-CH7a2yx--BkJitjCf.js.map} +1 -1
- package/dist/assets/Google-CH7a2yx--legacy-DsVpqcxI.js +2 -0
- package/dist/assets/{Google-CH7a2yx--legacy-DM1UNBoi.js.map → Google-CH7a2yx--legacy-DsVpqcxI.js.map} +1 -1
- package/dist/assets/{Google-DbOLrYJn-legacy-BRnfvM8x.js → Google-DbOLrYJn-legacy-Z1yVkgHW.js} +2 -2
- package/dist/assets/{Google-DbOLrYJn-legacy-BRnfvM8x.js.map → Google-DbOLrYJn-legacy-Z1yVkgHW.js.map} +1 -1
- package/dist/assets/{Google-DbOLrYJn-B0DksMt_.js → Google-DbOLrYJn-pbJx5yPo.js} +2 -2
- package/dist/assets/{Google-DbOLrYJn-B0DksMt_.js.map → Google-DbOLrYJn-pbJx5yPo.js.map} +1 -1
- package/dist/assets/{GridGraph-_o1JnUxh.js → GridGraph-BaPU6Jcw.js} +2 -2
- package/dist/assets/{GridGraph-_o1JnUxh.js.map → GridGraph-BaPU6Jcw.js.map} +1 -1
- package/dist/assets/{GridGraph-legacy-Cbh3J_fT.js → GridGraph-legacy-DdRjhzPL.js} +2 -2
- package/dist/assets/{GridGraph-legacy-Cbh3J_fT.js.map → GridGraph-legacy-DdRjhzPL.js.map} +1 -1
- package/dist/assets/{HouseLine.es-Bvs4CLDM.js → HouseLine.es-CQ6gPUgj.js} +2 -2
- package/dist/assets/{HouseLine.es-Bvs4CLDM.js.map → HouseLine.es-CQ6gPUgj.js.map} +1 -1
- package/dist/assets/{HouseLine.es-legacy-Bgym8-AE.js → HouseLine.es-legacy-B2U5VLTm.js} +2 -2
- package/dist/assets/{HouseLine.es-legacy-Bgym8-AE.js.map → HouseLine.es-legacy-B2U5VLTm.js.map} +1 -1
- package/dist/assets/{IconBase.es-CokBORYs.js → IconBase.es-Dzpvkx2C.js} +1 -1
- package/dist/assets/{IconBase.es-CokBORYs.js.map → IconBase.es-Dzpvkx2C.js.map} +1 -1
- package/dist/assets/{IconBase.es-legacy-D9dtjGQP.js → IconBase.es-legacy-PI0KZNJh.js} +1 -1
- package/dist/assets/{IconBase.es-legacy-D9dtjGQP.js.map → IconBase.es-legacy-PI0KZNJh.js.map} +1 -1
- package/dist/assets/{LeadCapture-OHuG-_-X.js → LeadCapture-CxWL_R3z.js} +2 -2
- package/dist/assets/{LeadCapture-OHuG-_-X.js.map → LeadCapture-CxWL_R3z.js.map} +1 -1
- package/dist/assets/{LeadCapture-legacy-D2LNKZFz.js → LeadCapture-legacy-D8AtHKg6.js} +2 -2
- package/dist/assets/{LeadCapture-legacy-D2LNKZFz.js.map → LeadCapture-legacy-D8AtHKg6.js.map} +1 -1
- package/dist/assets/{LocalContent-Th91ikte.js → LocalContent-D-mjOirc.js} +2 -2
- package/dist/assets/{LocalContent-Th91ikte.js.map → LocalContent-D-mjOirc.js.map} +1 -1
- package/dist/assets/LocalContent-legacy-Cdc3bSqg.js +2 -0
- package/dist/assets/{LocalContent-legacy-Dn8xkYe1.js.map → LocalContent-legacy-Cdc3bSqg.js.map} +1 -1
- package/dist/assets/{LocalDemographics-BoFc5tV3.js → LocalDemographics-B7wtZEYf.js} +2 -2
- package/dist/assets/{LocalDemographics-BoFc5tV3.js.map → LocalDemographics-B7wtZEYf.js.map} +1 -1
- package/dist/assets/{LocalDemographics-legacy-CWB9XMw_.js → LocalDemographics-legacy-Bvhiizm_.js} +2 -2
- package/dist/assets/{LocalDemographics-legacy-CWB9XMw_.js.map → LocalDemographics-legacy-Bvhiizm_.js.map} +1 -1
- package/dist/assets/Mapbox-C3JAafJ_-C2kqHx3p.js +2 -0
- package/dist/assets/Mapbox-C3JAafJ_-C2kqHx3p.js.map +1 -0
- package/dist/assets/Mapbox-C3JAafJ_-legacy-CPUIb7pa.js +2 -0
- package/dist/assets/Mapbox-C3JAafJ_-legacy-CPUIb7pa.js.map +1 -0
- package/dist/assets/{Mapbox-CpLnA607-C8WLdGzJ.js → Mapbox-CpLnA607-BpMR2b1P.js} +2 -2
- package/dist/assets/{Mapbox-CpLnA607-C8WLdGzJ.js.map → Mapbox-CpLnA607-BpMR2b1P.js.map} +1 -1
- package/dist/assets/{Mapbox-CpLnA607-legacy-CGRbZKvE.js → Mapbox-CpLnA607-legacy-FYXkK7xG.js} +2 -2
- package/dist/assets/{Mapbox-CpLnA607-legacy-CGRbZKvE.js.map → Mapbox-CpLnA607-legacy-FYXkK7xG.js.map} +1 -1
- package/dist/assets/Mapbox-DtZmt1D_-jMsntWC-.js +2 -0
- package/dist/assets/{Mapbox-DtZmt1D_-Bl4KegHk.js.map → Mapbox-DtZmt1D_-jMsntWC-.js.map} +1 -1
- package/dist/assets/Mapbox-DtZmt1D_-legacy-5c9e-5Lx.js +2 -0
- package/dist/assets/{Mapbox-DtZmt1D_-legacy-CL4jFUY4.js.map → Mapbox-DtZmt1D_-legacy-5c9e-5Lx.js.map} +1 -1
- package/dist/assets/{Mapbox-spw-ix-j-ByvfOXcz.js → Mapbox-spw-ix-j-DI3aq-7z.js} +2 -2
- package/dist/assets/{Mapbox-spw-ix-j-ByvfOXcz.js.map → Mapbox-spw-ix-j-DI3aq-7z.js.map} +1 -1
- package/dist/assets/{Mapbox-spw-ix-j-legacy-BdKN6y0O.js → Mapbox-spw-ix-j-legacy-dLQsNuR5.js} +2 -2
- package/dist/assets/{Mapbox-spw-ix-j-legacy-BdKN6y0O.js.map → Mapbox-spw-ix-j-legacy-dLQsNuR5.js.map} +1 -1
- package/dist/assets/{Mapbox-u11C3LWs-ou3xo84X.js → Mapbox-u11C3LWs-DiIixCCP.js} +2 -2
- package/dist/assets/{Mapbox-u11C3LWs-ou3xo84X.js.map → Mapbox-u11C3LWs-DiIixCCP.js.map} +1 -1
- package/dist/assets/{Mapbox-u11C3LWs-legacy-ChNDofS-.js → Mapbox-u11C3LWs-legacy-fFO2kSCJ.js} +2 -2
- package/dist/assets/{Mapbox-u11C3LWs-legacy-ChNDofS-.js.map → Mapbox-u11C3LWs-legacy-fFO2kSCJ.js.map} +1 -1
- package/dist/assets/Maptiler-DJScKW8p-Dek21atY.js +2 -0
- package/dist/assets/{Maptiler-DJScKW8p-D6EXhR9t.js.map → Maptiler-DJScKW8p-Dek21atY.js.map} +1 -1
- package/dist/assets/Maptiler-DJScKW8p-legacy-4PmhuFjm.js +2 -0
- package/dist/assets/{Maptiler-DJScKW8p-legacy-Bwixwxpw.js.map → Maptiler-DJScKW8p-legacy-4PmhuFjm.js.map} +1 -1
- package/dist/assets/{Maptiler-DdeFS4iM-CGZ09RjZ.js → Maptiler-DdeFS4iM-DX1A_pcS.js} +2 -2
- package/dist/assets/{Maptiler-DdeFS4iM-CGZ09RjZ.js.map → Maptiler-DdeFS4iM-DX1A_pcS.js.map} +1 -1
- package/dist/assets/{Maptiler-DdeFS4iM-legacy-QtRpj8xP.js → Maptiler-DdeFS4iM-legacy-bkCc7JZ5.js} +2 -2
- package/dist/assets/{Maptiler-DdeFS4iM-legacy-QtRpj8xP.js.map → Maptiler-DdeFS4iM-legacy-bkCc7JZ5.js.map} +1 -1
- package/dist/assets/Maptiler-DjXf_65v-DqYynnIU.js +2 -0
- package/dist/assets/Maptiler-DjXf_65v-DqYynnIU.js.map +1 -0
- package/dist/assets/Maptiler-DjXf_65v-legacy-DS5XmRij.js +2 -0
- package/dist/assets/Maptiler-DjXf_65v-legacy-DS5XmRij.js.map +1 -0
- package/dist/assets/{Maptiler-DsqJbPDD-CAQM6_gR.js → Maptiler-DsqJbPDD-Drjwtp_f.js} +2 -2
- package/dist/assets/{Maptiler-DsqJbPDD-CAQM6_gR.js.map → Maptiler-DsqJbPDD-Drjwtp_f.js.map} +1 -1
- package/dist/assets/{Maptiler-DsqJbPDD-legacy-IZOEEMY7.js → Maptiler-DsqJbPDD-legacy-Ca9kVjmM.js} +2 -2
- package/dist/assets/{Maptiler-DsqJbPDD-legacy-IZOEEMY7.js.map → Maptiler-DsqJbPDD-legacy-Ca9kVjmM.js.map} +1 -1
- package/dist/assets/{Maptiler-YjlcPccn-D1uiJCxO.js → Maptiler-YjlcPccn-BudEXQZX.js} +2 -2
- package/dist/assets/{Maptiler-YjlcPccn-D1uiJCxO.js.map → Maptiler-YjlcPccn-BudEXQZX.js.map} +1 -1
- package/dist/assets/{Maptiler-YjlcPccn-legacy-DrnTx-fy.js → Maptiler-YjlcPccn-legacy-B4Lnj3rh.js} +2 -2
- package/dist/assets/{Maptiler-YjlcPccn-legacy-DrnTx-fy.js.map → Maptiler-YjlcPccn-legacy-B4Lnj3rh.js.map} +1 -1
- package/dist/assets/{MarkerIcon-Bc3X9WQk-CAeRswLc.js → MarkerIcon-Bc3X9WQk-B-Tu48U7.js} +2 -2
- package/dist/assets/{MarkerIcon-Bc3X9WQk-CAeRswLc.js.map → MarkerIcon-Bc3X9WQk-B-Tu48U7.js.map} +1 -1
- package/dist/assets/{MarkerIcon-Bc3X9WQk-legacy-hujJwn_h.js → MarkerIcon-Bc3X9WQk-legacy-BL9mH4Fp.js} +2 -2
- package/dist/assets/{MarkerIcon-Bc3X9WQk-legacy-hujJwn_h.js.map → MarkerIcon-Bc3X9WQk-legacy-BL9mH4Fp.js.map} +1 -1
- package/dist/assets/{NeighborhoodCard-BHMcB4dQ.js → NeighborhoodCard-BowoJ4dG.js} +2 -2
- package/dist/assets/{NeighborhoodCard-BHMcB4dQ.js.map → NeighborhoodCard-BowoJ4dG.js.map} +1 -1
- package/dist/assets/{NeighborhoodCard-legacy-BNd6CJpc.js → NeighborhoodCard-legacy-C987Bfru.js} +2 -2
- package/dist/assets/{NeighborhoodCard-legacy-BNd6CJpc.js.map → NeighborhoodCard-legacy-C987Bfru.js.map} +1 -1
- package/dist/assets/{NeighborhoodCharacteristics-x7BCbeSG.js → NeighborhoodCharacteristics-D_NR1YUn.js} +2 -2
- package/dist/assets/{NeighborhoodCharacteristics-x7BCbeSG.js.map → NeighborhoodCharacteristics-D_NR1YUn.js.map} +1 -1
- package/dist/assets/{NeighborhoodCharacteristics-legacy-DV4yD_wP.js → NeighborhoodCharacteristics-legacy-BeDgfsZ5.js} +2 -2
- package/dist/assets/{NeighborhoodCharacteristics-legacy-DV4yD_wP.js.map → NeighborhoodCharacteristics-legacy-BeDgfsZ5.js.map} +1 -1
- package/dist/assets/{NeighborhoodDemographics-B3rv4k_B.js → NeighborhoodDemographics-DvSOnjn4.js} +2 -2
- package/dist/assets/{NeighborhoodDemographics-B3rv4k_B.js.map → NeighborhoodDemographics-DvSOnjn4.js.map} +1 -1
- package/dist/assets/{NeighborhoodDemographics-legacy-itJX5Mgc.js → NeighborhoodDemographics-legacy-BjkcoJVi.js} +2 -2
- package/dist/assets/{NeighborhoodDemographics-legacy-itJX5Mgc.js.map → NeighborhoodDemographics-legacy-BjkcoJVi.js.map} +1 -1
- package/dist/assets/{NeighborhoodFeatured-CW84mNx9.js → NeighborhoodFeatured-DsjFOHMv.js} +2 -2
- package/dist/assets/{NeighborhoodFeatured-CW84mNx9.js.map → NeighborhoodFeatured-DsjFOHMv.js.map} +1 -1
- package/dist/assets/{NeighborhoodFeatured-legacy-DhNugi04.js → NeighborhoodFeatured-legacy-F3RdAelk.js} +2 -2
- package/dist/assets/{NeighborhoodFeatured-legacy-DhNugi04.js.map → NeighborhoodFeatured-legacy-F3RdAelk.js.map} +1 -1
- package/dist/assets/{NeighborhoodHero-DADIHl6H.js → NeighborhoodHero-D4aRwf3B.js} +2 -2
- package/dist/assets/{NeighborhoodHero-DADIHl6H.js.map → NeighborhoodHero-D4aRwf3B.js.map} +1 -1
- package/dist/assets/{NeighborhoodHero-legacy-CkHlzf9Z.js → NeighborhoodHero-legacy-BpoqM_Oa.js} +2 -2
- package/dist/assets/{NeighborhoodHero-legacy-CkHlzf9Z.js.map → NeighborhoodHero-legacy-BpoqM_Oa.js.map} +1 -1
- package/dist/assets/{NeighborhoodHighlights-legacy-C_jXd4U5.js → NeighborhoodHighlights-legacy-Jwm-KEn2.js} +2 -2
- package/dist/assets/{NeighborhoodHighlights-legacy-C_jXd4U5.js.map → NeighborhoodHighlights-legacy-Jwm-KEn2.js.map} +1 -1
- package/dist/assets/{NeighborhoodHighlights-D19WC2mx.js → NeighborhoodHighlights-vQUEwmeZ.js} +2 -2
- package/dist/assets/{NeighborhoodHighlights-D19WC2mx.js.map → NeighborhoodHighlights-vQUEwmeZ.js.map} +1 -1
- package/dist/assets/{NeighborhoodMap-BsNsYKro.js → NeighborhoodMap-CBK-3l8v.js} +2 -2
- package/dist/assets/{NeighborhoodMap-BsNsYKro.js.map → NeighborhoodMap-CBK-3l8v.js.map} +1 -1
- package/dist/assets/{NeighborhoodMap-legacy-DYqn9nZ7.js → NeighborhoodMap-legacy-CT0DxTIn.js} +2 -2
- package/dist/assets/{NeighborhoodMap-legacy-DYqn9nZ7.js.map → NeighborhoodMap-legacy-CT0DxTIn.js.map} +1 -1
- package/dist/assets/{NeighborhoodMarketTrends-BN9hbHm9.js → NeighborhoodMarketTrends-DHjJ1tqv.js} +3 -3
- package/dist/assets/{NeighborhoodMarketTrends-BN9hbHm9.js.map → NeighborhoodMarketTrends-DHjJ1tqv.js.map} +1 -1
- package/dist/assets/{NeighborhoodMarketTrends-legacy-BJkauwYD.js → NeighborhoodMarketTrends-legacy-CFjoy0Wb.js} +2 -2
- package/dist/assets/{NeighborhoodMarketTrends-legacy-BJkauwYD.js.map → NeighborhoodMarketTrends-legacy-CFjoy0Wb.js.map} +1 -1
- package/dist/assets/{NeighborhoodMatch-CoRo5HAb.js → NeighborhoodMatch-BRjNjbp3.js} +2 -2
- package/dist/assets/{NeighborhoodMatch-CoRo5HAb.js.map → NeighborhoodMatch-BRjNjbp3.js.map} +1 -1
- package/dist/assets/{NeighborhoodMatch-legacy-Cdcs7Jtp.js → NeighborhoodMatch-legacy-DgFc0xk6.js} +2 -2
- package/dist/assets/{NeighborhoodMatch-legacy-Cdcs7Jtp.js.map → NeighborhoodMatch-legacy-DgFc0xk6.js.map} +1 -1
- package/dist/assets/{NeighborhoodPropertyValueDrivers-B_lDfBFc.js → NeighborhoodPropertyValueDrivers-CdJ05150.js} +2 -2
- package/dist/assets/{NeighborhoodPropertyValueDrivers-B_lDfBFc.js.map → NeighborhoodPropertyValueDrivers-CdJ05150.js.map} +1 -1
- package/dist/assets/{NeighborhoodPropertyValueDrivers-legacy-TJNQuhau.js → NeighborhoodPropertyValueDrivers-legacy-BLZ8XMAG.js} +2 -2
- package/dist/assets/{NeighborhoodPropertyValueDrivers-legacy-TJNQuhau.js.map → NeighborhoodPropertyValueDrivers-legacy-BLZ8XMAG.js.map} +1 -1
- package/dist/assets/{NeighborhoodSchools-COVdlDmI.js → NeighborhoodSchools-Ndot67p9.js} +2 -2
- package/dist/assets/{NeighborhoodSchools-COVdlDmI.js.map → NeighborhoodSchools-Ndot67p9.js.map} +1 -1
- package/dist/assets/{NeighborhoodSchools-legacy-CC_o4gDE.js → NeighborhoodSchools-legacy-Chh5SMNx.js} +2 -2
- package/dist/assets/{NeighborhoodSchools-legacy-CC_o4gDE.js.map → NeighborhoodSchools-legacy-Chh5SMNx.js.map} +1 -1
- package/dist/assets/{NeighborhoodShowcase-BEYsGLqf.js → NeighborhoodShowcase-CAUm0P5M.js} +2 -2
- package/dist/assets/{NeighborhoodShowcase-BEYsGLqf.js.map → NeighborhoodShowcase-CAUm0P5M.js.map} +1 -1
- package/dist/assets/{NeighborhoodShowcase-legacy-DjbPOhlY.js → NeighborhoodShowcase-legacy-BRlXHlqi.js} +2 -2
- package/dist/assets/{NeighborhoodShowcase-legacy-DjbPOhlY.js.map → NeighborhoodShowcase-legacy-BRlXHlqi.js.map} +1 -1
- package/dist/assets/{NoDataContent-Ct6cseKS.js → NoDataContent-C9ChXKAi.js} +2 -2
- package/dist/assets/{NoDataContent-Ct6cseKS.js.map → NoDataContent-C9ChXKAi.js.map} +1 -1
- package/dist/assets/{NoDataContent-legacy-C6bZD_ML.js → NoDataContent-legacy-CYUS1j-5.js} +2 -2
- package/dist/assets/{NoDataContent-legacy-C6bZD_ML.js.map → NoDataContent-legacy-CYUS1j-5.js.map} +1 -1
- package/dist/assets/{ResizeWrapper-CxzTXRsZ.js → ResizeWrapper-BeFwcKDz.js} +2 -2
- package/dist/assets/{ResizeWrapper-CxzTXRsZ.js.map → ResizeWrapper-BeFwcKDz.js.map} +1 -1
- package/dist/assets/{ResizeWrapper-legacy-Cnj-xOLf.js → ResizeWrapper-legacy-DEHV95wF.js} +2 -2
- package/dist/assets/{ResizeWrapper-legacy-Cnj-xOLf.js.map → ResizeWrapper-legacy-DEHV95wF.js.map} +1 -1
- package/dist/assets/{ScoreCardList-C2UIFw9G.js → ScoreCardList-DQBM2ohm.js} +2 -2
- package/dist/assets/{ScoreCardList-C2UIFw9G.js.map → ScoreCardList-DQBM2ohm.js.map} +1 -1
- package/dist/assets/{ScoreCardList-legacy-D5rhovz4.js → ScoreCardList-legacy-kIYSqUkJ.js} +2 -2
- package/dist/assets/{ScoreCardList-legacy-D5rhovz4.js.map → ScoreCardList-legacy-kIYSqUkJ.js.map} +1 -1
- package/dist/assets/{ScoreIcon-legacy-iLznJMpz.js → ScoreIcon-legacy-DTiGYooC.js} +2 -2
- package/dist/assets/{ScoreIcon-legacy-iLznJMpz.js.map → ScoreIcon-legacy-DTiGYooC.js.map} +1 -1
- package/dist/assets/{ScoreIcon-Bpp4EF8q.js → ScoreIcon-wicFwO1x.js} +2 -2
- package/dist/assets/{ScoreIcon-Bpp4EF8q.js.map → ScoreIcon-wicFwO1x.js.map} +1 -1
- package/dist/assets/{Testing-BNJwzbRK-CNg1O9DZ.js → Testing-BNJwzbRK-D5rbJDTc.js} +2 -2
- package/dist/assets/{Testing-BNJwzbRK-CNg1O9DZ.js.map → Testing-BNJwzbRK-D5rbJDTc.js.map} +1 -1
- package/dist/assets/{Testing-BNJwzbRK-legacy-CHlUAxxR.js → Testing-BNJwzbRK-legacy-kUkUPtwJ.js} +2 -2
- package/dist/assets/{Testing-BNJwzbRK-legacy-CHlUAxxR.js.map → Testing-BNJwzbRK-legacy-kUkUPtwJ.js.map} +1 -1
- package/dist/assets/Testing-CiiWZSBw-DU4dwY9q.js +2 -0
- package/dist/assets/Testing-CiiWZSBw-DU4dwY9q.js.map +1 -0
- package/dist/assets/Testing-CiiWZSBw-legacy-Df4mQmEJ.js +2 -0
- package/dist/assets/Testing-CiiWZSBw-legacy-Df4mQmEJ.js.map +1 -0
- package/dist/assets/{Testing-CoRLhmNT-CZbxquD7.js → Testing-CoRLhmNT-DAoK7NOZ.js} +2 -2
- package/dist/assets/{Testing-CoRLhmNT-CZbxquD7.js.map → Testing-CoRLhmNT-DAoK7NOZ.js.map} +1 -1
- package/dist/assets/{Testing-CoRLhmNT-legacy-B5x3S7nT.js → Testing-CoRLhmNT-legacy-CHB_znXM.js} +2 -2
- package/dist/assets/{Testing-CoRLhmNT-legacy-B5x3S7nT.js.map → Testing-CoRLhmNT-legacy-CHB_znXM.js.map} +1 -1
- package/dist/assets/{Testing-DGUeGxdc-borOpe6x.js → Testing-DGUeGxdc-CPtN0q1E.js} +2 -2
- package/dist/assets/{Testing-DGUeGxdc-borOpe6x.js.map → Testing-DGUeGxdc-CPtN0q1E.js.map} +1 -1
- package/dist/assets/{Testing-DGUeGxdc-legacy-CW1DFsnU.js → Testing-DGUeGxdc-legacy-D0EDpce8.js} +2 -2
- package/dist/assets/{Testing-DGUeGxdc-legacy-CW1DFsnU.js.map → Testing-DGUeGxdc-legacy-D0EDpce8.js.map} +1 -1
- package/dist/assets/{Testing-DzWAcbhL-B4HmQQAb.js → Testing-DzWAcbhL-DEqu1oWp.js} +2 -2
- package/dist/assets/{Testing-DzWAcbhL-B4HmQQAb.js.map → Testing-DzWAcbhL-DEqu1oWp.js.map} +1 -1
- package/dist/assets/{Testing-DzWAcbhL-legacy-Bxr9W4nv.js → Testing-DzWAcbhL-legacy--n6c4amH.js} +2 -2
- package/dist/assets/{Testing-DzWAcbhL-legacy-Bxr9W4nv.js.map → Testing-DzWAcbhL-legacy--n6c4amH.js.map} +1 -1
- package/dist/assets/{TitleHeader-DcqFVLw0.js → TitleHeader-DQ9VuIEH.js} +2 -2
- package/dist/assets/{TitleHeader-DcqFVLw0.js.map → TitleHeader-DQ9VuIEH.js.map} +1 -1
- package/dist/assets/{TitleHeader-legacy-BPZzovWy.js → TitleHeader-legacy-DN1FBcsk.js} +2 -2
- package/dist/assets/{TitleHeader-legacy-BPZzovWy.js.map → TitleHeader-legacy-DN1FBcsk.js.map} +1 -1
- package/dist/assets/{Trans-BiiDiriP.js → Trans-D79pYQlQ.js} +2 -2
- package/dist/assets/{Trans-BiiDiriP.js.map → Trans-D79pYQlQ.js.map} +1 -1
- package/dist/assets/{Trans-legacy-CrR8QHJy.js → Trans-legacy-Bze6cEjx.js} +2 -2
- package/dist/assets/{Trans-legacy-CrR8QHJy.js.map → Trans-legacy-Bze6cEjx.js.map} +1 -1
- package/dist/assets/{ValidateOptions-Bi7oExtq.js → ValidateOptions-DMMKaCkH.js} +2 -2
- package/dist/assets/{ValidateOptions-Bi7oExtq.js.map → ValidateOptions-DMMKaCkH.js.map} +1 -1
- package/dist/assets/{ValidateOptions-legacy-DNVt370k.js → ValidateOptions-legacy-BKn8Z0iI.js} +2 -2
- package/dist/assets/{ValidateOptions-legacy-DNVt370k.js.map → ValidateOptions-legacy-BKn8Z0iI.js.map} +1 -1
- package/dist/assets/{dist-B9e9e0gS.js → dist-DulEP_1K.js} +2 -2
- package/dist/assets/{dist-B9e9e0gS.js.map → dist-DulEP_1K.js.map} +1 -1
- package/dist/assets/{dist-legacy-CHceR0tu.js → dist-legacy-DzfAfk89.js} +2 -2
- package/dist/assets/{dist-legacy-CHceR0tu.js.map → dist-legacy-DzfAfk89.js.map} +1 -1
- package/dist/assets/{getMapProviderConfig-DshfQt_F.js → getMapProviderConfig-B4Q24S5F.js} +3 -3
- package/dist/assets/getMapProviderConfig-B4Q24S5F.js.map +1 -0
- package/dist/assets/getMapProviderConfig-Djjas7OB.css +1 -0
- package/dist/assets/getMapProviderConfig-legacy-BX0LDQVX.js +2 -0
- package/dist/assets/getMapProviderConfig-legacy-BX0LDQVX.js.map +1 -0
- package/dist/assets/index-BAtTWqDt.js +3 -0
- package/dist/assets/index-BAtTWqDt.js.map +1 -0
- package/dist/assets/{index-legacy-DmO1-JVm.js → index-legacy-BLXZlVDd.js} +2 -2
- package/dist/assets/index-legacy-BLXZlVDd.js.map +1 -0
- package/dist/assets/{index.es-CoIP10OR.js → index.es-DtOj94Wj.js} +2 -2
- package/dist/assets/{index.es-CoIP10OR.js.map → index.es-DtOj94Wj.js.map} +1 -1
- package/dist/assets/{index.es-legacy-CwO7r-Dt.js → index.es-legacy-Bu1JLUty.js} +2 -2
- package/dist/assets/{index.es-legacy-CwO7r-Dt.js.map → index.es-legacy-Bu1JLUty.js.map} +1 -1
- package/dist/assets/{mapbox-jb8Zev6T-CRa8nPW8.js → mapbox-jb8Zev6T-BXN7werw.js} +2 -2
- package/dist/assets/{mapbox-jb8Zev6T-CRa8nPW8.js.map → mapbox-jb8Zev6T-BXN7werw.js.map} +1 -1
- package/dist/assets/{mapbox-jb8Zev6T-legacy-BHd691KT.js → mapbox-jb8Zev6T-legacy-C7wM7MiM.js} +2 -2
- package/dist/assets/{mapbox-jb8Zev6T-legacy-BHd691KT.js.map → mapbox-jb8Zev6T-legacy-C7wM7MiM.js.map} +1 -1
- package/dist/assets/{maplibre-CUYkxr-D-Bd2zI-jg.js → maplibre-CUYkxr-D-DGpsTNMt.js} +2 -2
- package/dist/assets/{maplibre-CUYkxr-D-Bd2zI-jg.js.map → maplibre-CUYkxr-D-DGpsTNMt.js.map} +1 -1
- package/dist/assets/{maplibre-CUYkxr-D-legacy-DtZmB5qu.js → maplibre-CUYkxr-D-legacy-FWuvgVxO.js} +2 -2
- package/dist/assets/{maplibre-CUYkxr-D-legacy-DtZmB5qu.js.map → maplibre-CUYkxr-D-legacy-FWuvgVxO.js.map} +1 -1
- package/dist/assets/neighborhood-fallback-CI_Ro8Y3.js.map +1 -1
- package/dist/assets/neighborhood-fallback-legacy-BVguI_1R.js.map +1 -1
- package/dist/assets/{sdks-CuW4Djod.js → sdks-DcRRcCep.js} +2 -2
- package/dist/assets/{sdks-CuW4Djod.js.map → sdks-DcRRcCep.js.map} +1 -1
- package/dist/assets/{sdks-legacy-CWRbdzCl.js → sdks-legacy-D5at0_ei.js} +2 -2
- package/dist/assets/{sdks-legacy-CWRbdzCl.js.map → sdks-legacy-D5at0_ei.js.map} +1 -1
- package/dist/assets/{styles-CJwaJsrY-BlHuktb3.js → styles-CJwaJsrY-Cm-fKzxg.js} +1 -1
- package/dist/assets/{styles-CJwaJsrY-BlHuktb3.js.map → styles-CJwaJsrY-Cm-fKzxg.js.map} +1 -1
- package/dist/assets/{styles-CJwaJsrY-legacy-B9jzJTiB.js → styles-CJwaJsrY-legacy-CGYmVvib.js} +1 -1
- package/dist/assets/{styles-CJwaJsrY-legacy-B9jzJTiB.js.map → styles-CJwaJsrY-legacy-CGYmVvib.js.map} +1 -1
- package/dist/assets/{useDemographicsData-y8UgvH09.js → useDemographicsData-CgIHvbGH.js} +2 -2
- package/dist/assets/{useDemographicsData-y8UgvH09.js.map → useDemographicsData-CgIHvbGH.js.map} +1 -1
- package/dist/assets/{useDemographicsData-legacy-BydgmVxf.js → useDemographicsData-legacy-B51K5za3.js} +2 -2
- package/dist/assets/{useDemographicsData-legacy-BydgmVxf.js.map → useDemographicsData-legacy-B51K5za3.js.map} +1 -1
- package/dist/assets/{useGeographies-CTn6gk-Q.js → useGeographies-Z4JLiIdq.js} +2 -2
- package/dist/assets/{useGeographies-CTn6gk-Q.js.map → useGeographies-Z4JLiIdq.js.map} +1 -1
- package/dist/assets/{useGeographies-legacy-BG5-avO1.js → useGeographies-legacy-DEpCDAXO.js} +2 -2
- package/dist/assets/{useGeographies-legacy-BG5-avO1.js.map → useGeographies-legacy-DEpCDAXO.js.map} +1 -1
- package/dist/assets/{useIsMobile-CFbJXB5u.js → useIsMobile-DJC_oIhB.js} +2 -2
- package/dist/assets/{useIsMobile-CFbJXB5u.js.map → useIsMobile-DJC_oIhB.js.map} +1 -1
- package/dist/assets/{useIsMobile-legacy-DTVBSpF3.js → useIsMobile-legacy-DLBT_3bY.js} +2 -2
- package/dist/assets/{useIsMobile-legacy-DTVBSpF3.js.map → useIsMobile-legacy-DLBT_3bY.js.map} +1 -1
- package/dist/assets/{useLocation-DdJbm9TZ.js → useLocation-BuAdp_NV.js} +2 -2
- package/dist/assets/{useLocation-DdJbm9TZ.js.map → useLocation-BuAdp_NV.js.map} +1 -1
- package/dist/assets/{useLocation-legacy-Bt1WPwut.js → useLocation-legacy-XJXyUBTr.js} +2 -2
- package/dist/assets/{useLocation-legacy-Bt1WPwut.js.map → useLocation-legacy-XJXyUBTr.js.map} +1 -1
- package/dist/assets/{useProfiles-DrK6LfKa.js → useProfiles-C20ly8bQ.js} +2 -2
- package/dist/assets/{useProfiles-DrK6LfKa.js.map → useProfiles-C20ly8bQ.js.map} +1 -1
- package/dist/assets/{useProfiles-legacy-Cg-yR2CE.js → useProfiles-legacy-BssC6Fnx.js} +2 -2
- package/dist/assets/{useProfiles-legacy-Cg-yR2CE.js.map → useProfiles-legacy-BssC6Fnx.js.map} +1 -1
- package/dist/assets/{useSchools-wtdyLGlp.js → useSchools-EfWXGolK.js} +2 -2
- package/dist/assets/{useSchools-wtdyLGlp.js.map → useSchools-EfWXGolK.js.map} +1 -1
- package/dist/assets/{useSchools-legacy-DwyAxe2p.js → useSchools-legacy-C7rOWqjM.js} +2 -2
- package/dist/assets/{useSchools-legacy-DwyAxe2p.js.map → useSchools-legacy-C7rOWqjM.js.map} +1 -1
- package/dist/assets/{useScores-CnapwN0c.js → useScores-HENXqF7M.js} +2 -2
- package/dist/assets/{useScores-CnapwN0c.js.map → useScores-HENXqF7M.js.map} +1 -1
- package/dist/assets/{useScores-legacy-DE5QSjbJ.js → useScores-legacy-DURMcuDU.js} +2 -2
- package/dist/assets/{useScores-legacy-DE5QSjbJ.js.map → useScores-legacy-DURMcuDU.js.map} +1 -1
- package/dist/index.html +2 -2
- package/dist/types/components/DemographicsTextCard/index.js +1 -1
- package/dist/types/components/DemographicsTextCard/index.js.map +1 -1
- package/dist/types/components/DemographicsTextCard/index.test.d.ts +2 -0
- package/dist/types/components/DemographicsTextCard/index.test.d.ts.map +1 -0
- package/dist/types/components/DemographicsTextCard/index.test.js +26 -0
- package/dist/types/components/DemographicsTextCard/index.test.js.map +1 -0
- package/dist/types/components/deprecated/components/Chart/Root/BarChart/index.js +1 -1
- package/dist/types/components/deprecated/components/Chart/Root/BarChart/index.js.map +1 -1
- package/dist/types/components/deprecated/components/Text/index.d.ts +1 -0
- package/dist/types/components/deprecated/components/Text/index.d.ts.map +1 -1
- package/dist/types/components/deprecated/components/Text/index.js +2 -2
- package/dist/types/components/deprecated/components/Text/index.js.map +1 -1
- package/dist/types/components/map/ClusterPopupContent/index.test.js +17 -0
- package/dist/types/components/map/ClusterPopupContent/index.test.js.map +1 -1
- package/dist/types/components/map/POIPopupContent/index.test.d.ts +2 -0
- package/dist/types/components/map/POIPopupContent/index.test.d.ts.map +1 -0
- package/dist/types/components/map/POIPopupContent/index.test.js +45 -0
- package/dist/types/components/map/POIPopupContent/index.test.js.map +1 -0
- package/dist/types/components/map/PopupContent/Header/index.d.ts.map +1 -1
- package/dist/types/components/map/PopupContent/Header/index.js +6 -1
- package/dist/types/components/map/PopupContent/Header/index.js.map +1 -1
- package/dist/types/components/map/PopupContent/Header/index.test.js +14 -0
- package/dist/types/components/map/PopupContent/Header/index.test.js.map +1 -1
- package/dist/types/components/map/PopupContent/index.test.d.ts +2 -0
- package/dist/types/components/map/PopupContent/index.test.d.ts.map +1 -0
- package/dist/types/components/map/PopupContent/index.test.js +23 -0
- package/dist/types/components/map/PopupContent/index.test.js.map +1 -0
- package/dist/types/i18n/en/localContent.d.ts +1 -0
- package/dist/types/i18n/en/localContent.d.ts.map +1 -1
- package/dist/types/i18n/en/localContent.js +1 -0
- package/dist/types/i18n/en/localContent.js.map +1 -1
- package/dist/types/i18n/fr/localContent.d.ts +1 -0
- package/dist/types/i18n/fr/localContent.d.ts.map +1 -1
- package/dist/types/i18n/fr/localContent.js +1 -0
- package/dist/types/i18n/fr/localContent.js.map +1 -1
- package/dist/types/i18n/index.d.ts +1 -0
- package/dist/types/i18n/index.d.ts.map +1 -1
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.d.ts.map +1 -1
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.js +1 -1
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.js.map +1 -1
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.test.d.ts +2 -0
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.test.d.ts.map +1 -0
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.test.js +26 -0
- package/dist/types/sdks/LocalContent/components/CommuteCalculator/Root/Form/Select/index.test.js.map +1 -0
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/Header/index.d.ts.map +1 -1
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/Header/index.js +2 -2
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/Header/index.js.map +1 -1
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/Header/index.test.js +23 -0
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/Header/index.test.js.map +1 -1
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/context.d.ts +1 -0
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/context.d.ts.map +1 -1
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/context.js +4 -2
- package/dist/types/sdks/LocalContent/components/Sidebar/Root/context.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/Google-CH7a2yx--Cn8Y8O80.js +0 -2
- package/dist/assets/Google-CH7a2yx--legacy-DM1UNBoi.js +0 -2
- package/dist/assets/Google-CXGCn-oJ-DVH6KUqZ.js +0 -2
- package/dist/assets/Google-CXGCn-oJ-DVH6KUqZ.js.map +0 -1
- package/dist/assets/Google-CXGCn-oJ-legacy-BahBoExF.js +0 -2
- package/dist/assets/Google-CXGCn-oJ-legacy-BahBoExF.js.map +0 -1
- package/dist/assets/LocalContent-legacy-Dn8xkYe1.js +0 -2
- package/dist/assets/Mapbox-DDJ1gHRb-CoVu4X50.js +0 -2
- package/dist/assets/Mapbox-DDJ1gHRb-CoVu4X50.js.map +0 -1
- package/dist/assets/Mapbox-DDJ1gHRb-legacy-BPzC_BxB.js +0 -2
- package/dist/assets/Mapbox-DDJ1gHRb-legacy-BPzC_BxB.js.map +0 -1
- package/dist/assets/Mapbox-DtZmt1D_-Bl4KegHk.js +0 -2
- package/dist/assets/Mapbox-DtZmt1D_-legacy-CL4jFUY4.js +0 -2
- package/dist/assets/Maptiler-DJScKW8p-D6EXhR9t.js +0 -2
- package/dist/assets/Maptiler-DJScKW8p-legacy-Bwixwxpw.js +0 -2
- package/dist/assets/Maptiler-DqeshLom-CXaXHA2F.js +0 -2
- package/dist/assets/Maptiler-DqeshLom-CXaXHA2F.js.map +0 -1
- package/dist/assets/Maptiler-DqeshLom-legacy-Cpos6yik.js +0 -2
- package/dist/assets/Maptiler-DqeshLom-legacy-Cpos6yik.js.map +0 -1
- package/dist/assets/Testing--n5Ro0Ek-EG8KLikO.js +0 -2
- package/dist/assets/Testing--n5Ro0Ek-EG8KLikO.js.map +0 -1
- package/dist/assets/Testing--n5Ro0Ek-legacy-CLVqeABo.js +0 -2
- package/dist/assets/Testing--n5Ro0Ek-legacy-CLVqeABo.js.map +0 -1
- package/dist/assets/getMapProviderConfig-Dg2c_6rt.css +0 -1
- package/dist/assets/getMapProviderConfig-DshfQt_F.js.map +0 -1
- package/dist/assets/getMapProviderConfig-legacy-BvkFz-sz.js +0 -2
- package/dist/assets/getMapProviderConfig-legacy-BvkFz-sz.js.map +0 -1
- package/dist/assets/index-D95PGgh0.js +0 -3
- package/dist/assets/index-D95PGgh0.js.map +0 -1
- package/dist/assets/index-legacy-DmO1-JVm.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-C_ttsnZz.js";import{l as i}from"./google-maps-vendor-DvfEEdRU.js";import{a as t,c as o,d as a,f as n,g as r,h as s,i as d,m as l,n as h,o as g,p as c,r as m,t as p,u}from"./sdks-CuW4Djod.js";import{Y as b,i as f,n as v}from"./index-D95PGgh0.js";import{a as y,s as x}from"./index.es-CoIP10OR.js";import{t as I}from"./useGeographies-CTn6gk-Q.js";import{t as j}from"./useResponsiveBreakpoints-5c2TLYHH.js";import{t as _}from"./Attribution-kw125yRW.js";/* empty css */import{t as N}from"./ResizeWrapper-CxzTXRsZ.js";import{t as A}from"./ValidateOptions-Bi7oExtq.js";import{t as C}from"./useIsMobile-CFbJXB5u.js";import{t as w}from"./TitleHeader-DcqFVLw0.js";import{n as D,t as O}from"./ScoreCardList-C2UIFw9G.js";import{t as k}from"./NoDataContent-Ct6cseKS.js";import{t as E}from"./neighborhood-fallback-CI_Ro8Y3.js";var L=e(i(),1);var M={all:()=>["similarNeighborhoods"],list:e=>[...M.all(),e]};var T=e=>{const i=j(),[t,o]=(0,L.useState)(4),{isLoading:a,isFetched:n,data:r}=function({geogID:e,externalId:i,limit:t}){const{client:o}=d(),a={geogId:e,externalId:i,limit:t};return s({queryKey:M.list(a),queryFn:async()=>await o.getSimilarNeighborhoods(a),enabled:!!e})}({...e,limit:8}),l=(0,L.useMemo)(()=>{let e=[];return r&&r.most_similar?(e=r.most_similar.length<t||!i?.lg?[...r.most_similar]:r.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",{...i,affordabilityComparison:t}}(r?.affordability_index||void 0,e))):e},[r,t,i]),h=(r?.most_similar||[]).length>4&&t<8,g=l.some(e=>void 0!==e?.affordabilityComparison);return{isLoading:a,isFetched:n,similarNeighborhoods:l,hasAffordabilityIndex:g,neighborhoodName:r?.name,limit:t,minimumLimit:4,hasMore:h,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},K=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),H=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),R=b(),G=L.createContext({}),S=()=>(0,L.useContext)(G),P=({children:e})=>{const{sdkState:i}=v(),t=i.globalOptions?.locale||"en",o=g();f(()=>{o.postEvent({eventType:K.SDK_VIEWED}),o.trackAnalyticsEvent({eventName:H.SDK_VIEWED})});const{isLoading:a,data:n}=I({location:{lat:void 0===i.options?.geographyId?i.options?.lat:void 0,lng:void 0===i.options?.geographyId?i.options?.lng:void 0},geogID:i.options?.geographyId||void 0,externalId:i?.globalOptions?.externalId}),{geographyId:r,geography:s}=(0,L.useMemo)(()=>{const e=Object.entries(n||{});return{geographyId:e[0]?.[0],geography:e[0]?.[1]}},[a,n]),{isLoading:d,isFetched:l,similarNeighborhoods:h,hasAffordabilityIndex:c,neighborhoodName:m,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x}=T({geogID:r,externalId:i.globalOptions?.externalId}),j=(0,L.useMemo)(()=>a||d,[a,d]),_=(0,L.useMemo)(()=>({title:i.options?.title,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x,isLoading:j,isFetched:l,neighborhoodName:m,similarNeighborhoods:h,hasAffordabilityIndex:c,hideAffordabilityTags:i.options?.hideAffordabilityTags,hideAttribution:i.options?.hideAttribution,hideThumbnails:i.options?.hideThumbnails,locale:t,level:s?.level||10}),[i.options?.title,i.options?.hideAttribution,p,b,j,l,h,c,m,t,s]);return(0,R.jsx)(G.Provider,{value:_,children:e})},V=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=r("neighborhoodMatch");return(0,R.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},B=()=>{const{t:e}=r("neighborhoodMatch"),i=g(),{limit:t,minimumLimit:o,hasMore:a,viewLess:n,viewMore:s}=S(),d=j();return!d?.lg||!a&&t===o?null:(0,R.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,R.jsxs)(y,{variant:"secondary",onClick:()=>{a&&(i.postEvent({eventType:K.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:H.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),s()),!a&&t>o&&(i.postEvent({eventType:K.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:H.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),n())},children:[a&&e("pagination.next"),!a&&t>o&&e("pagination.previous")]})})},F=({url:e,imageSrc:i,expanded:t,onClick:o,children:a,...n})=>{const{hideThumbnails:r,hideAffordabilityTags:s}=S(),d=(0,L.useMemo)(()=>r?{}:{backgroundImage:`url(${i||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[r]),l=(0,L.useMemo)(()=>r?t?"expanded":"hidden":"normal",[r,t]);return(0,R.jsxs)("a",{onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==o&&o(),null!==window.top&&(window.top.location.href=e.currentTarget.href))},href:e||void 0,className:'\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type="negative"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type="neutral"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type="positive"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n',"data-testid":"neighborhood-match-card","data-has-url":!!e,"data-height-style":l,...n,children:[(!r||!s)&&(0,R.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:d}),a]})},$=({children:e,...i})=>(0,R.jsx)("h3",{className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title",...i,children:e}),W=({isLoading:e=!1,children:i})=>(0,R.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),q="px-2.5 pt-4 pb-6 min-h-[266px]";function z(){const{t:e}=r(["neighborhoodMatch","common"]),i=g(),{isFetched:t,isLoading:o,similarNeighborhoods:a,hasAffordabilityIndex:n,hideAffordabilityTags:s}=S();return t&&0===a.length?(0,R.jsx)(k,{text:e("noData")}):o?(0,R.jsx)(W,{isLoading:!0,children:[0,1,2,3].map(e=>(0,R.jsx)(F,{children:(0,R.jsxs)("div",{className:q,children:[(0,R.jsx)($,{children:" "}),(0,R.jsx)(O,{children:(0,R.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,R.jsx)(W,{isLoading:o,children:a.map((t,o)=>{return(0,R.jsxs)(F,{onClick:(a=o,()=>{i.postEvent({eventType:K.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:a}]}),i.trackAnalyticsEvent({eventName:H.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:{ll_position_in_set:a}})}),url:t.redirect_url,imageSrc:t.thumbnail_url,expanded:n,children:[void 0!==t.affordabilityComparison&&(0,R.jsx)("div",{className:"absolute top-0 right-4","data-testid":"neighborhood-match-affordability-tag",children:(0,R.jsx)(x,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!s&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,R.jsxs)("div",{className:q,children:[(0,R.jsx)($,{"data-alt":t.name,children:t.name}),t.scores&&(0,R.jsx)(O,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,R.jsx)(D,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var a})})}function J(){const{t:e}=r(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:a,neighborhoodName:n,hideAttribution:s}=S();return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(w,{title:"string"==typeof i||!1===i?i:e("title",{context:a})}),(0,R.jsx)(V,{neighborhoodName:n,isLoading:o}),(0,R.jsx)(z,{}),(0,R.jsx)(B,{}),(0,R.jsx)(_,{sdkName:"neighborhood-match",locale:t,isHidden:s})]})}var U=u({lat:a().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:a().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:n().optional(),title:l().optional(),hideAffordabilityTags:c().optional(),hideAttribution:c().optional(),hideThumbnails:c().optional()}).noUnknown(!0);o(h.neighborhoodMatch.key);var Y=()=>{const{sdkState:e}=v(),i=C(),o=e.globalOptions?.locale||"en",a=(0,L.useMemo)(()=>e.options?.geographyId?{geographyId:e.options?.geographyId}:{lat:e.options?.lat,lng:e.options?.lng},[e.options?.lat,e.options?.lng,e.options?.geographyId]);return(0,R.jsx)(N,{children:(0,R.jsx)(A,{sdk:"Neighborhood Match",schema:U,options:e.options,children:(0,R.jsx)(m,{environment:e.globalOptions?.environment?.api,apiKey:e.apiKey,appearance:e.globalOptions?.appearance,locale:e.globalOptions?.locale,product:p.NEIGHBORHOOD_MATCH,children:(0,R.jsx)(t,{trackingPipelineSettings:{apiKey:e.apiKey||""},analyticsSettings:h.neighborhoodMatch,meta:{clientId:e.clientId,productName:p.NEIGHBORHOOD_MATCH,productVersion:"1.24.55"},attributes:{location:a,host:e.location,host_url:document.referrer,locale:o,isMobile:i},flags:{isDebugMode:!1},children:(0,R.jsx)(P,{children:(0,R.jsx)(J,{})})})})})})};export{Y as default};
|
|
2
|
-
//# sourceMappingURL=NeighborhoodMatch-
|
|
1
|
+
import{a as e}from"./rolldown-runtime-C_ttsnZz.js";import{l as i}from"./google-maps-vendor-DvfEEdRU.js";import{a as t,c as o,d as a,f as n,g as r,h as s,i as d,m as l,n as h,o as g,p as c,r as m,t as p,u}from"./sdks-DcRRcCep.js";import{Y as b,i as f,n as v}from"./index-BAtTWqDt.js";import{a as y,s as x}from"./index.es-DtOj94Wj.js";import{t as I}from"./useGeographies-Z4JLiIdq.js";import{t as j}from"./useResponsiveBreakpoints-5c2TLYHH.js";import{t as _}from"./Attribution-BOTbUbV6.js";/* empty css */import{t as N}from"./ResizeWrapper-BeFwcKDz.js";import{t as A}from"./ValidateOptions-DMMKaCkH.js";import{t as C}from"./useIsMobile-DJC_oIhB.js";import{t as w}from"./TitleHeader-DQ9VuIEH.js";import{n as D,t as O}from"./ScoreCardList-DQBM2ohm.js";import{t as k}from"./NoDataContent-C9ChXKAi.js";import{t as E}from"./neighborhood-fallback-CI_Ro8Y3.js";var L=e(i(),1);var M={all:()=>["similarNeighborhoods"],list:e=>[...M.all(),e]};var T=e=>{const i=j(),[t,o]=(0,L.useState)(4),{isLoading:a,isFetched:n,data:r}=function({geogID:e,externalId:i,limit:t}){const{client:o}=d(),a={geogId:e,externalId:i,limit:t};return s({queryKey:M.list(a),queryFn:async()=>await o.getSimilarNeighborhoods(a),enabled:!!e})}({...e,limit:8}),l=(0,L.useMemo)(()=>{let e=[];return r&&r.most_similar?(e=r.most_similar.length<t||!i?.lg?[...r.most_similar]:r.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",{...i,affordabilityComparison:t}}(r?.affordability_index||void 0,e))):e},[r,t,i]),h=(r?.most_similar||[]).length>4&&t<8,g=l.some(e=>void 0!==e?.affordabilityComparison);return{isLoading:a,isFetched:n,similarNeighborhoods:l,hasAffordabilityIndex:g,neighborhoodName:r?.name,limit:t,minimumLimit:4,hasMore:h,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},K=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),H=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),R=b(),G=L.createContext({}),S=()=>(0,L.useContext)(G),P=({children:e})=>{const{sdkState:i}=v(),t=i.globalOptions?.locale||"en",o=g();f(()=>{o.postEvent({eventType:K.SDK_VIEWED}),o.trackAnalyticsEvent({eventName:H.SDK_VIEWED})});const{isLoading:a,data:n}=I({location:{lat:void 0===i.options?.geographyId?i.options?.lat:void 0,lng:void 0===i.options?.geographyId?i.options?.lng:void 0},geogID:i.options?.geographyId||void 0,externalId:i?.globalOptions?.externalId}),{geographyId:r,geography:s}=(0,L.useMemo)(()=>{const e=Object.entries(n||{});return{geographyId:e[0]?.[0],geography:e[0]?.[1]}},[a,n]),{isLoading:d,isFetched:l,similarNeighborhoods:h,hasAffordabilityIndex:c,neighborhoodName:m,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x}=T({geogID:r,externalId:i.globalOptions?.externalId}),j=(0,L.useMemo)(()=>a||d,[a,d]),_=(0,L.useMemo)(()=>({title:i.options?.title,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x,isLoading:j,isFetched:l,neighborhoodName:m,similarNeighborhoods:h,hasAffordabilityIndex:c,hideAffordabilityTags:i.options?.hideAffordabilityTags,hideAttribution:i.options?.hideAttribution,hideThumbnails:i.options?.hideThumbnails,locale:t,level:s?.level||10}),[i.options?.title,i.options?.hideAttribution,p,b,j,l,h,c,m,t,s]);return(0,R.jsx)(G.Provider,{value:_,children:e})},V=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=r("neighborhoodMatch");return(0,R.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},B=()=>{const{t:e}=r("neighborhoodMatch"),i=g(),{limit:t,minimumLimit:o,hasMore:a,viewLess:n,viewMore:s}=S(),d=j();return!d?.lg||!a&&t===o?null:(0,R.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,R.jsxs)(y,{variant:"secondary",onClick:()=>{a&&(i.postEvent({eventType:K.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:H.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),s()),!a&&t>o&&(i.postEvent({eventType:K.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:H.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),n())},children:[a&&e("pagination.next"),!a&&t>o&&e("pagination.previous")]})})},F=({url:e,imageSrc:i,expanded:t,onClick:o,children:a,...n})=>{const{hideThumbnails:r,hideAffordabilityTags:s}=S(),d=(0,L.useMemo)(()=>r?{}:{backgroundImage:`url(${i||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[r]),l=(0,L.useMemo)(()=>r?t?"expanded":"hidden":"normal",[r,t]);return(0,R.jsxs)("a",{onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==o&&o(),null!==window.top&&(window.top.location.href=e.currentTarget.href))},href:e||void 0,className:'\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type="negative"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type="neutral"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type="positive"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n',"data-testid":"neighborhood-match-card","data-has-url":!!e,"data-height-style":l,...n,children:[(!r||!s)&&(0,R.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:d}),a]})},$=({children:e,...i})=>(0,R.jsx)("h3",{className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title",...i,children:e}),W=({isLoading:e=!1,children:i})=>(0,R.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),q="px-2.5 pt-4 pb-6 min-h-[266px]";function z(){const{t:e}=r(["neighborhoodMatch","common"]),i=g(),{isFetched:t,isLoading:o,similarNeighborhoods:a,hasAffordabilityIndex:n,hideAffordabilityTags:s}=S();return t&&0===a.length?(0,R.jsx)(k,{text:e("noData")}):o?(0,R.jsx)(W,{isLoading:!0,children:[0,1,2,3].map(e=>(0,R.jsx)(F,{children:(0,R.jsxs)("div",{className:q,children:[(0,R.jsx)($,{children:" "}),(0,R.jsx)(O,{children:(0,R.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,R.jsx)(W,{isLoading:o,children:a.map((t,o)=>{return(0,R.jsxs)(F,{onClick:(a=o,()=>{i.postEvent({eventType:K.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:a}]}),i.trackAnalyticsEvent({eventName:H.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:{ll_position_in_set:a}})}),url:t.redirect_url,imageSrc:t.thumbnail_url,expanded:n,children:[void 0!==t.affordabilityComparison&&(0,R.jsx)("div",{className:"absolute top-0 right-4","data-testid":"neighborhood-match-affordability-tag",children:(0,R.jsx)(x,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!s&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,R.jsxs)("div",{className:q,children:[(0,R.jsx)($,{"data-alt":t.name,children:t.name}),t.scores&&(0,R.jsx)(O,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,R.jsx)(D,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var a})})}function J(){const{t:e}=r(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:a,neighborhoodName:n,hideAttribution:s}=S();return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(w,{title:"string"==typeof i||!1===i?i:e("title",{context:a})}),(0,R.jsx)(V,{neighborhoodName:n,isLoading:o}),(0,R.jsx)(z,{}),(0,R.jsx)(B,{}),(0,R.jsx)(_,{sdkName:"neighborhood-match",locale:t,isHidden:s})]})}var U=u({lat:a().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:a().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:n().optional(),title:l().optional(),hideAffordabilityTags:c().optional(),hideAttribution:c().optional(),hideThumbnails:c().optional()}).noUnknown(!0);o(h.neighborhoodMatch.key);var Y=()=>{const{sdkState:e}=v(),i=C(),o=e.globalOptions?.locale||"en",a=(0,L.useMemo)(()=>e.options?.geographyId?{geographyId:e.options?.geographyId}:{lat:e.options?.lat,lng:e.options?.lng},[e.options?.lat,e.options?.lng,e.options?.geographyId]);return(0,R.jsx)(N,{children:(0,R.jsx)(A,{sdk:"Neighborhood Match",schema:U,options:e.options,children:(0,R.jsx)(m,{environment:e.globalOptions?.environment?.api,apiKey:e.apiKey,appearance:e.globalOptions?.appearance,locale:e.globalOptions?.locale,product:p.NEIGHBORHOOD_MATCH,children:(0,R.jsx)(t,{trackingPipelineSettings:{apiKey:e.apiKey||""},analyticsSettings:h.neighborhoodMatch,meta:{clientId:e.clientId,productName:p.NEIGHBORHOOD_MATCH,productVersion:"1.24.57"},attributes:{location:a,host:e.location,host_url:document.referrer,locale:o,isMobile:i},flags:{isDebugMode:!1},children:(0,R.jsx)(P,{children:(0,R.jsx)(J,{})})})})})})};export{Y as default};
|
|
2
|
+
//# sourceMappingURL=NeighborhoodMatch-BRjNjbp3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeighborhoodMatch-CoRo5HAb.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title> </CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NeighborhoodMatch-BRjNjbp3.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title> </CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"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"}
|
package/dist/assets/{NeighborhoodMatch-legacy-Cdcs7Jtp.js → NeighborhoodMatch-legacy-DgFc0xk6.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(){const e=["url","imageSrc","expanded","onClick","children"],i=["children"];function t(e,i){if(null==e)return{};var t,o,n=function(e,i){if(null==e)return{};var t={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(-1!==i.indexOf(o))continue;t[o]=e[o]}return t}(e,i);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],-1===i.indexOf(t)&&{}.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}function o(e,i){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);i&&(o=o.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,o)}return t}function n(e){for(var i=1;i<arguments.length;i++){var t=null!=arguments[i]?arguments[i]:{};i%2?o(Object(t),!0).forEach(function(i){a(e,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach(function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(t,i))})}return e}function a(e,i,t){return(i=function(e){var i=function(e,i){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var o=t.call(e,i||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===i?String:Number)(e)}(e,"string");return"symbol"==typeof i?i:i+""}(i))in e?Object.defineProperty(e,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[i]=t,e}System.register(["./rolldown-runtime-legacy-Djb2rrqm.js","./google-maps-vendor-legacy-CPuMOKGq.js","./sdks-legacy-CWRbdzCl.js","./index-legacy-DmO1-JVm.js","./index.es-legacy-CwO7r-Dt.js","./useGeographies-legacy-BG5-avO1.js","./useResponsiveBreakpoints-legacy-hrJDHKMo.js","./Attribution-legacy-Chi4675H.js","./globals-legacy-DrNe10l0.js","./ResizeWrapper-legacy-Cnj-xOLf.js","./ValidateOptions-legacy-DNVt370k.js","./useIsMobile-legacy-DTVBSpF3.js","./TitleHeader-legacy-BPZzovWy.js","./ScoreCardList-legacy-D5rhovz4.js","./NoDataContent-legacy-C6bZD_ML.js","./neighborhood-fallback-legacy-BVguI_1R.js"],function(o,a){var r,l,d,s,c,g,h,u,p,v,m,b,f,y,x,j,I,O,_,w,N,C,A,D,E,k,L,M,T,P,S,K,H,R,G,V,B,F,$,W,q,z,J,U,Y,Q,X,Z;function ee(){const{t:e}=h(["neighborhoodMatch","common"]),i=b(),{isFetched:t,isLoading:o,similarNeighborhoods:n,hasAffordabilityIndex:a,hideAffordabilityTags:r}=$();return t&&0===n.length?(0,B.jsx)(S,{text:e("noData")}):o?(0,B.jsx)(Y,{isLoading:!0,children:[0,1,2,3].map(e=>(0,B.jsx)(J,{children:(0,B.jsxs)("div",{className:Q,children:[(0,B.jsx)(U,{children:" "}),(0,B.jsx)(P,{children:(0,B.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,B.jsx)(Y,{isLoading:o,children:n.map((t,o)=>{return(0,B.jsxs)(J,{onClick:(n=o,()=>{i.postEvent({eventType:G.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:n}]}),i.trackAnalyticsEvent({eventName:V.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:{ll_position_in_set:n}})}),url:t.redirect_url,imageSrc:t.thumbnail_url,expanded:a,children:[void 0!==t.affordabilityComparison&&(0,B.jsx)("div",{className:X,"data-testid":"neighborhood-match-affordability-tag",children:(0,B.jsx)(N,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!r&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,B.jsxs)("div",{className:Q,children:[(0,B.jsx)(U,{"data-alt":t.name,children:t.name}),t.scores&&(0,B.jsx)(P,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,B.jsx)(T,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var n})})}function ie(){const{t:e}=h(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:n,neighborhoodName:a,hideAttribution:r}=$();return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(M,{title:"string"==typeof i||!1===i?i:e("title",{context:n})}),(0,B.jsx)(q,{neighborhoodName:a,isLoading:o}),(0,B.jsx)(ee,{}),(0,B.jsx)(z,{}),(0,B.jsx)(D,{sdkName:"neighborhood-match",locale:t,isHidden:r})]})}return{setters:[function(e){r=e.a},function(e){l=e.l},function(e){d=e.a,s=e.c,c=e.d,g=e.f,h=e.g,u=e.h,p=e.i,v=e.m,m=e.n,b=e.o,f=e.p,y=e.r,x=e.t,j=e.u},function(e){I=e.Y,O=e.i,_=e.n},function(e){w=e.a,N=e.s},function(e){C=e.t},function(e){A=e.t},function(e){D=e.t},function(e){},function(e){E=e.t},function(e){k=e.t},function(e){L=e.t},function(e){M=e.t},function(e){T=e.n,P=e.t},function(e){S=e.t},function(e){e.t}],execute:function(){K=r(l(),1),H={all:()=>["similarNeighborhoods"],list:e=>[...H.all(),e]},R=e=>{const i=A(),[t,o]=(0,K.useState)(4),{isLoading:a,isFetched:r,data:l}=function({geogID:e,externalId:i,limit:t}){const{client:o}=p(),n={geogId:e,externalId:i,limit:t};return u({queryKey:H.list(n),queryFn:async()=>await o.getSimilarNeighborhoods(n),enabled:!!e})}(n(n({},e),{},{limit:8})),d=(0,K.useMemo)(()=>{let e=[];return l&&l.most_similar?(e=l.most_similar.length<t||null==i||!i.lg?[...l.most_similar]:l.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",n(n({},i),{},{affordabilityComparison:t})}((null==l?void 0:l.affordability_index)||void 0,e))):e},[l,t,i]),s=((null==l?void 0:l.most_similar)||[]).length>4&&t<8,c=d.some(e=>void 0!==(null==e?void 0:e.affordabilityComparison));return{isLoading:a,isFetched:r,similarNeighborhoods:d,hasAffordabilityIndex:c,neighborhoodName:null==l?void 0:l.name,limit:t,minimumLimit:4,hasMore:s,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},G=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),V=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),B=I(),F=K.createContext({}),$=()=>(0,K.useContext)(F),W=({children:e})=>{var i,t,o,n,a,r,l,d,s,c;const{sdkState:g}=_(),h=(null===(i=g.globalOptions)||void 0===i?void 0:i.locale)||"en",u=b();O(()=>{u.postEvent({eventType:G.SDK_VIEWED}),u.trackAnalyticsEvent({eventName:V.SDK_VIEWED})});const{isLoading:p,data:v}=C({location:{lat:void 0===(null===(t=g.options)||void 0===t?void 0:t.geographyId)?null===(o=g.options)||void 0===o?void 0:o.lat:void 0,lng:void 0===(null===(n=g.options)||void 0===n?void 0:n.geographyId)?null===(a=g.options)||void 0===a?void 0:a.lng:void 0},geogID:(null===(r=g.options)||void 0===r?void 0:r.geographyId)||void 0,externalId:null==g||null===(l=g.globalOptions)||void 0===l?void 0:l.externalId}),{geographyId:m,geography:f}=(0,K.useMemo)(()=>{var e,i;const t=Object.entries(v||{});return{geographyId:null===(e=t[0])||void 0===e?void 0:e[0],geography:null===(i=t[0])||void 0===i?void 0:i[1]}},[p,v]),{isLoading:y,isFetched:x,similarNeighborhoods:j,hasAffordabilityIndex:I,neighborhoodName:w,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k}=R({geogID:m,externalId:null===(d=g.globalOptions)||void 0===d?void 0:d.externalId}),L=(0,K.useMemo)(()=>p||y,[p,y]),M=(0,K.useMemo)(()=>{var e,i,t,o;return{title:null===(e=g.options)||void 0===e?void 0:e.title,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k,isLoading:L,isFetched:x,neighborhoodName:w,similarNeighborhoods:j,hasAffordabilityIndex:I,hideAffordabilityTags:null===(i=g.options)||void 0===i?void 0:i.hideAffordabilityTags,hideAttribution:null===(t=g.options)||void 0===t?void 0:t.hideAttribution,hideThumbnails:null===(o=g.options)||void 0===o?void 0:o.hideThumbnails,locale:h,level:(null==f?void 0:f.level)||10}},[null===(s=g.options)||void 0===s?void 0:s.title,null===(c=g.options)||void 0===c?void 0:c.hideAttribution,N,D,L,x,j,I,w,h,f]);return(0,B.jsx)(F.Provider,{value:M,children:e})},q=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=h("neighborhoodMatch");return(0,B.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},z=()=>{const{t:e}=h("neighborhoodMatch"),i=b(),{limit:t,minimumLimit:o,hasMore:n,viewLess:a,viewMore:r}=$(),l=A();return null==l||!l.lg||!n&&t===o?null:(0,B.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,B.jsxs)(w,{variant:"secondary",onClick:()=>{n&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),r()),!n&&t>o&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),a())},children:[n&&e("pagination.next"),!n&&t>o&&e("pagination.previous")]})})},J=i=>{let{url:o,imageSrc:a,expanded:r,onClick:l,children:d}=i,s=t(i,e);const{hideThumbnails:c,hideAffordabilityTags:g}=$(),h=(0,K.useMemo)(()=>c?{}:{backgroundImage:`url(${a||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[c]),u=(0,K.useMemo)(()=>c?r?"expanded":"hidden":"normal",[c,r]);return(0,B.jsxs)("a",n(n({onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==l&&l(),null!==window.top&&(window.top.location.href=e.currentTarget.href))},href:o||void 0,className:'\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type="negative"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type="neutral"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type="positive"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n',"data-testid":"neighborhood-match-card","data-has-url":!!o,"data-height-style":u},s),{},{children:[(!c||!g)&&(0,B.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:h}),d]}))},U=e=>{let{children:o}=e,a=t(e,i);return(0,B.jsx)("h3",n(n({className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title"},a),{},{children:o}))},Y=({isLoading:e=!1,children:i})=>(0,B.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),Q="px-2.5 pt-4 pb-6 min-h-[266px]",X="absolute top-0 right-4",Z=j({lat:c().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:c().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:g().optional(),title:v().optional(),hideAffordabilityTags:f().optional(),hideAttribution:f().optional(),hideThumbnails:f().optional()}).noUnknown(!0),s(m.neighborhoodMatch.key),o("default",()=>{var e,i,t,o,n,a,r;const{sdkState:l}=_(),s=L(),c=(null===(e=l.globalOptions)||void 0===e?void 0:e.locale)||"en",g=(0,K.useMemo)(()=>{var e,i,t,o;return null!==(e=l.options)&&void 0!==e&&e.geographyId?{geographyId:null===(i=l.options)||void 0===i?void 0:i.geographyId}:{lat:null===(t=l.options)||void 0===t?void 0:t.lat,lng:null===(o=l.options)||void 0===o?void 0:o.lng}},[null===(i=l.options)||void 0===i?void 0:i.lat,null===(t=l.options)||void 0===t?void 0:t.lng,null===(o=l.options)||void 0===o?void 0:o.geographyId]);return(0,B.jsx)(E,{children:(0,B.jsx)(k,{sdk:"Neighborhood Match",schema:Z,options:l.options,children:(0,B.jsx)(y,{environment:null===(n=l.globalOptions)||void 0===n||null===(n=n.environment)||void 0===n?void 0:n.api,apiKey:l.apiKey,appearance:null===(a=l.globalOptions)||void 0===a?void 0:a.appearance,locale:null===(r=l.globalOptions)||void 0===r?void 0:r.locale,product:x.NEIGHBORHOOD_MATCH,children:(0,B.jsx)(d,{trackingPipelineSettings:{apiKey:l.apiKey||""},analyticsSettings:m.neighborhoodMatch,meta:{clientId:l.clientId,productName:x.NEIGHBORHOOD_MATCH,productVersion:"1.24.55"},attributes:{location:g,host:l.location,host_url:document.referrer,locale:c,isMobile:s},flags:{isDebugMode:!1},children:(0,B.jsx)(W,{children:(0,B.jsx)(ie,{})})})})})})})}}})}();
|
|
2
|
-
//# sourceMappingURL=NeighborhoodMatch-legacy-
|
|
1
|
+
!function(){const e=["url","imageSrc","expanded","onClick","children"],i=["children"];function t(e,i){if(null==e)return{};var t,o,n=function(e,i){if(null==e)return{};var t={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(-1!==i.indexOf(o))continue;t[o]=e[o]}return t}(e,i);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],-1===i.indexOf(t)&&{}.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}function o(e,i){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);i&&(o=o.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,o)}return t}function n(e){for(var i=1;i<arguments.length;i++){var t=null!=arguments[i]?arguments[i]:{};i%2?o(Object(t),!0).forEach(function(i){a(e,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach(function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(t,i))})}return e}function a(e,i,t){return(i=function(e){var i=function(e,i){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var o=t.call(e,i||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===i?String:Number)(e)}(e,"string");return"symbol"==typeof i?i:i+""}(i))in e?Object.defineProperty(e,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[i]=t,e}System.register(["./rolldown-runtime-legacy-Djb2rrqm.js","./google-maps-vendor-legacy-CPuMOKGq.js","./sdks-legacy-D5at0_ei.js","./index-legacy-BLXZlVDd.js","./index.es-legacy-Bu1JLUty.js","./useGeographies-legacy-DEpCDAXO.js","./useResponsiveBreakpoints-legacy-hrJDHKMo.js","./Attribution-legacy-BnsWo3_b.js","./globals-legacy-DrNe10l0.js","./ResizeWrapper-legacy-DEHV95wF.js","./ValidateOptions-legacy-BKn8Z0iI.js","./useIsMobile-legacy-DLBT_3bY.js","./TitleHeader-legacy-DN1FBcsk.js","./ScoreCardList-legacy-kIYSqUkJ.js","./NoDataContent-legacy-CYUS1j-5.js","./neighborhood-fallback-legacy-BVguI_1R.js"],function(o,a){var r,l,d,s,c,g,h,u,p,v,m,b,f,y,x,j,I,O,_,w,N,C,A,D,E,k,L,M,T,P,S,K,H,R,G,V,B,F,$,W,q,z,J,U,Y,Q,X,Z;function ee(){const{t:e}=h(["neighborhoodMatch","common"]),i=b(),{isFetched:t,isLoading:o,similarNeighborhoods:n,hasAffordabilityIndex:a,hideAffordabilityTags:r}=$();return t&&0===n.length?(0,B.jsx)(S,{text:e("noData")}):o?(0,B.jsx)(Y,{isLoading:!0,children:[0,1,2,3].map(e=>(0,B.jsx)(J,{children:(0,B.jsxs)("div",{className:Q,children:[(0,B.jsx)(U,{children:" "}),(0,B.jsx)(P,{children:(0,B.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,B.jsx)(Y,{isLoading:o,children:n.map((t,o)=>{return(0,B.jsxs)(J,{onClick:(n=o,()=>{i.postEvent({eventType:G.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:n}]}),i.trackAnalyticsEvent({eventName:V.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:{ll_position_in_set:n}})}),url:t.redirect_url,imageSrc:t.thumbnail_url,expanded:a,children:[void 0!==t.affordabilityComparison&&(0,B.jsx)("div",{className:X,"data-testid":"neighborhood-match-affordability-tag",children:(0,B.jsx)(N,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!r&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,B.jsxs)("div",{className:Q,children:[(0,B.jsx)(U,{"data-alt":t.name,children:t.name}),t.scores&&(0,B.jsx)(P,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,B.jsx)(T,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var n})})}function ie(){const{t:e}=h(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:n,neighborhoodName:a,hideAttribution:r}=$();return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(M,{title:"string"==typeof i||!1===i?i:e("title",{context:n})}),(0,B.jsx)(q,{neighborhoodName:a,isLoading:o}),(0,B.jsx)(ee,{}),(0,B.jsx)(z,{}),(0,B.jsx)(D,{sdkName:"neighborhood-match",locale:t,isHidden:r})]})}return{setters:[function(e){r=e.a},function(e){l=e.l},function(e){d=e.a,s=e.c,c=e.d,g=e.f,h=e.g,u=e.h,p=e.i,v=e.m,m=e.n,b=e.o,f=e.p,y=e.r,x=e.t,j=e.u},function(e){I=e.Y,O=e.i,_=e.n},function(e){w=e.a,N=e.s},function(e){C=e.t},function(e){A=e.t},function(e){D=e.t},function(e){},function(e){E=e.t},function(e){k=e.t},function(e){L=e.t},function(e){M=e.t},function(e){T=e.n,P=e.t},function(e){S=e.t},function(e){e.t}],execute:function(){K=r(l(),1),H={all:()=>["similarNeighborhoods"],list:e=>[...H.all(),e]},R=e=>{const i=A(),[t,o]=(0,K.useState)(4),{isLoading:a,isFetched:r,data:l}=function({geogID:e,externalId:i,limit:t}){const{client:o}=p(),n={geogId:e,externalId:i,limit:t};return u({queryKey:H.list(n),queryFn:async()=>await o.getSimilarNeighborhoods(n),enabled:!!e})}(n(n({},e),{},{limit:8})),d=(0,K.useMemo)(()=>{let e=[];return l&&l.most_similar?(e=l.most_similar.length<t||null==i||!i.lg?[...l.most_similar]:l.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",n(n({},i),{},{affordabilityComparison:t})}((null==l?void 0:l.affordability_index)||void 0,e))):e},[l,t,i]),s=((null==l?void 0:l.most_similar)||[]).length>4&&t<8,c=d.some(e=>void 0!==(null==e?void 0:e.affordabilityComparison));return{isLoading:a,isFetched:r,similarNeighborhoods:d,hasAffordabilityIndex:c,neighborhoodName:null==l?void 0:l.name,limit:t,minimumLimit:4,hasMore:s,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},G=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),V=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),B=I(),F=K.createContext({}),$=()=>(0,K.useContext)(F),W=({children:e})=>{var i,t,o,n,a,r,l,d,s,c;const{sdkState:g}=_(),h=(null===(i=g.globalOptions)||void 0===i?void 0:i.locale)||"en",u=b();O(()=>{u.postEvent({eventType:G.SDK_VIEWED}),u.trackAnalyticsEvent({eventName:V.SDK_VIEWED})});const{isLoading:p,data:v}=C({location:{lat:void 0===(null===(t=g.options)||void 0===t?void 0:t.geographyId)?null===(o=g.options)||void 0===o?void 0:o.lat:void 0,lng:void 0===(null===(n=g.options)||void 0===n?void 0:n.geographyId)?null===(a=g.options)||void 0===a?void 0:a.lng:void 0},geogID:(null===(r=g.options)||void 0===r?void 0:r.geographyId)||void 0,externalId:null==g||null===(l=g.globalOptions)||void 0===l?void 0:l.externalId}),{geographyId:m,geography:f}=(0,K.useMemo)(()=>{var e,i;const t=Object.entries(v||{});return{geographyId:null===(e=t[0])||void 0===e?void 0:e[0],geography:null===(i=t[0])||void 0===i?void 0:i[1]}},[p,v]),{isLoading:y,isFetched:x,similarNeighborhoods:j,hasAffordabilityIndex:I,neighborhoodName:w,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k}=R({geogID:m,externalId:null===(d=g.globalOptions)||void 0===d?void 0:d.externalId}),L=(0,K.useMemo)(()=>p||y,[p,y]),M=(0,K.useMemo)(()=>{var e,i,t,o;return{title:null===(e=g.options)||void 0===e?void 0:e.title,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k,isLoading:L,isFetched:x,neighborhoodName:w,similarNeighborhoods:j,hasAffordabilityIndex:I,hideAffordabilityTags:null===(i=g.options)||void 0===i?void 0:i.hideAffordabilityTags,hideAttribution:null===(t=g.options)||void 0===t?void 0:t.hideAttribution,hideThumbnails:null===(o=g.options)||void 0===o?void 0:o.hideThumbnails,locale:h,level:(null==f?void 0:f.level)||10}},[null===(s=g.options)||void 0===s?void 0:s.title,null===(c=g.options)||void 0===c?void 0:c.hideAttribution,N,D,L,x,j,I,w,h,f]);return(0,B.jsx)(F.Provider,{value:M,children:e})},q=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=h("neighborhoodMatch");return(0,B.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},z=()=>{const{t:e}=h("neighborhoodMatch"),i=b(),{limit:t,minimumLimit:o,hasMore:n,viewLess:a,viewMore:r}=$(),l=A();return null==l||!l.lg||!n&&t===o?null:(0,B.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,B.jsxs)(w,{variant:"secondary",onClick:()=>{n&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),r()),!n&&t>o&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),a())},children:[n&&e("pagination.next"),!n&&t>o&&e("pagination.previous")]})})},J=i=>{let{url:o,imageSrc:a,expanded:r,onClick:l,children:d}=i,s=t(i,e);const{hideThumbnails:c,hideAffordabilityTags:g}=$(),h=(0,K.useMemo)(()=>c?{}:{backgroundImage:`url(${a||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[c]),u=(0,K.useMemo)(()=>c?r?"expanded":"hidden":"normal",[c,r]);return(0,B.jsxs)("a",n(n({onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==l&&l(),null!==window.top&&(window.top.location.href=e.currentTarget.href))},href:o||void 0,className:'\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type="negative"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type="neutral"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type="positive"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n',"data-testid":"neighborhood-match-card","data-has-url":!!o,"data-height-style":u},s),{},{children:[(!c||!g)&&(0,B.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:h}),d]}))},U=e=>{let{children:o}=e,a=t(e,i);return(0,B.jsx)("h3",n(n({className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title"},a),{},{children:o}))},Y=({isLoading:e=!1,children:i})=>(0,B.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),Q="px-2.5 pt-4 pb-6 min-h-[266px]",X="absolute top-0 right-4",Z=j({lat:c().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:c().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:g().optional(),title:v().optional(),hideAffordabilityTags:f().optional(),hideAttribution:f().optional(),hideThumbnails:f().optional()}).noUnknown(!0),s(m.neighborhoodMatch.key),o("default",()=>{var e,i,t,o,n,a,r;const{sdkState:l}=_(),s=L(),c=(null===(e=l.globalOptions)||void 0===e?void 0:e.locale)||"en",g=(0,K.useMemo)(()=>{var e,i,t,o;return null!==(e=l.options)&&void 0!==e&&e.geographyId?{geographyId:null===(i=l.options)||void 0===i?void 0:i.geographyId}:{lat:null===(t=l.options)||void 0===t?void 0:t.lat,lng:null===(o=l.options)||void 0===o?void 0:o.lng}},[null===(i=l.options)||void 0===i?void 0:i.lat,null===(t=l.options)||void 0===t?void 0:t.lng,null===(o=l.options)||void 0===o?void 0:o.geographyId]);return(0,B.jsx)(E,{children:(0,B.jsx)(k,{sdk:"Neighborhood Match",schema:Z,options:l.options,children:(0,B.jsx)(y,{environment:null===(n=l.globalOptions)||void 0===n||null===(n=n.environment)||void 0===n?void 0:n.api,apiKey:l.apiKey,appearance:null===(a=l.globalOptions)||void 0===a?void 0:a.appearance,locale:null===(r=l.globalOptions)||void 0===r?void 0:r.locale,product:x.NEIGHBORHOOD_MATCH,children:(0,B.jsx)(d,{trackingPipelineSettings:{apiKey:l.apiKey||""},analyticsSettings:m.neighborhoodMatch,meta:{clientId:l.clientId,productName:x.NEIGHBORHOOD_MATCH,productVersion:"1.24.57"},attributes:{location:g,host:l.location,host_url:document.referrer,locale:c,isMobile:s},flags:{isDebugMode:!1},children:(0,B.jsx)(W,{children:(0,B.jsx)(ie,{})})})})})})})}}})}();
|
|
2
|
+
//# sourceMappingURL=NeighborhoodMatch-legacy-DgFc0xk6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeighborhoodMatch-legacy-Cdcs7Jtp.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title> </CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"2oEiBmBA,SAAgB,KACd,MAAM,EAAE,GAAM,EAAe,CAAC,oBAAqB,WAC7C,EAAW,KACX,UACJ,EAAA,UACA,EAAA,qBACA,EAAA,sBACA,EAAA,sBACA,GACE,IAqBJ,OAAI,GAA6C,IAAhC,EAAqB,QAC7B,EAAA,EAAA,KAAC,EAAD,CAAe,KAAM,EAAE,YAG5B,GAEA,EAAA,EAAA,KAAC,EAAD,CAAe,WAAA,WACZ,CAAC,EAAG,EAAG,EAAG,GAAG,IAAK,IACjB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,WAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAgB,OAEhB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,OAAD,CAAA,SALc,sCAAsC,SAehE,EAAA,EAAA,KAAC,EAAD,CAA0B,qBACvB,EAAqB,IAAA,CAAK,EAAc,KACvC,SAAA,EAAA,MAAC,EAAD,CAEE,SA9CsB,EA8CQ,EA9CR,KAC5B,EAAS,UAAU,CACjB,UAAW,EAAuB,0BAClC,gBAAiB,CACf,CACE,MAAO,kBACP,KAAM,MAKZ,EAAS,oBAAoB,CAC3B,UAAW,EAAgB,0BAC3B,gBAAiB,CACf,mBAAoB,OAiClB,IAAK,EAAa,aAClB,SAAU,EAAa,cACvB,SAAU,WALZ,MAOmD,IAAzC,EAAa,0BACnB,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EACX,cAAY,iDAEZ,EAAA,EAAA,KAAC,EAAD,CACE,kBAAkB,EAClB,mBAAmB,EACnB,WACG,KACC,EAAa,wBAEjB,QAAS,EAAa,iCAErB,EAAE,QAAQ,EAAa,gCAK9B,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,WAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CAAgB,WAAU,EAAa,cACpC,EAAa,OAGf,EAAa,SACZ,EAAA,EAAA,KAAC,EAAD,CAAA,SACG,OAAO,QAAQ,EAAa,QAAQ,IAAA,EACjC,EAAK,KACL,GAAS,IACP,EAAA,EAAA,KAAC,EAAD,CAEE,MAAO,EACL,iBAAiB,WAEnB,SAAU,EACH,SALF,wBAAwB,EAAa,aAAa,aApChE,6BAA6B,EAAa,MA7CzB,UCnBhC,SAAgB,KACd,MAAM,EAAE,GAAM,EAAe,CAAC,oBAAqB,YAC7C,MAAE,EAAA,OAAO,EAAA,UAAQ,EAAA,MAAW,EAAA,iBAAO,EAAA,gBAAkB,GACzD,IAEF,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CACE,MACmB,iBAAV,IAAgC,IAAV,EACzB,EACA,EAAE,QAAS,CACT,QAAS,OAKnB,EAAA,EAAA,KAAC,EAAD,CAA+B,mBAA6B,eAE5D,EAAA,EAAA,KAAC,GAAD,CAAA,IACA,EAAA,EAAA,KAAC,EAAD,CAAA,IAEA,EAAA,EAAA,KAAC,EAAD,CACE,QAAQ,qBACA,SACR,SAAU,qcjBlCL,EAA2B,CACtC,IAAA,IAAW,CAAC,wBACZ,KAAO,GACL,IAAI,EAAyB,MAAO,IEQ3B,EACX,IAEA,MAAM,EAAc,KACb,EAAO,IAAA,EAAA,EAAA,UAPI,IAUhB,UAAW,EACX,UAAW,EAAA,KACX,GDVJ,UAAwC,OACtC,EAAA,WACA,EAAA,MACA,IAEA,MAAM,OAAE,GAAW,IACb,EAAS,CACb,OAAQ,EACR,aACA,SASF,OAAO,EAAS,CACd,SAAU,EAAyB,KAAK,GACxC,QARgC,eACT,EAAO,wBAAwB,GAQtD,UAAW,ICVT,CAAA,EAAA,EAAA,CAAA,EAA0C,GAAA,CAAA,EAAA,CAAQ,MAZtC,KAcV,GAAA,EAAA,EAAA,SAAA,KACJ,IAAI,EAAwC,GAE5C,OAAK,GAAS,EAAK,cAQjB,EAJE,EAAK,aAAa,OAAS,GAAU,UAAA,EAAa,GAIpC,IAAI,EAAK,cAET,EAAK,aAAa,MAAM,EAAG,GAGtC,EAAc,IAAK,GHnC9B,SAAA,EAAA,GAIE,GAAA,MAAA,GAAA,MAAA,EAAA,oBAAA,OAAA,WAuBA,OAdA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,qBAAA,IAAA,wDAcA,EAAA,EAAA,CAAA,qCGSI,EACE,aAAA,EAAA,EAAM,2BAAuB,EAC7B,KAfK,GAkBR,CAAC,EAAM,EAAO,IAEX,IACH,aAAA,EAAA,EAAM,eAAgB,IAAI,OAxCX,GAwCmC,EAvCrC,EAyCV,EAAwB,EAAqB,KAChD,QACkD,KAA1C,aAAA,EAAA,EAAc,0BAazB,MAAO,CACL,UAAW,EACX,UAAW,EACX,uBACA,wBACA,iBAAkB,aAAA,EAAA,EAAM,KACxB,QACA,aAhEgB,EAiEhB,UACA,SAnBI,KA9CU,IA+CV,GACJ,EAAS,EAjDO,IAmEhB,SAfI,KACA,EApDU,GAqDd,EAAS,EAtDO,MCeR,EAAL,SAAA,UACL,EAAA,WAAa,4BACb,EAAA,0BAA4B,kCAC5B,EAAA,mBAAqB,0CAHhB,KAQK,EAAL,SAAA,UACL,EAAA,WAAa,aACb,EAAA,0BAA4B,4BAC5B,EAAA,mBAAqB,uBAHhB,WCQD,EAAA,EAAiC,cACrC,CAAA,GAGI,EAAA,KAAA,EAAA,EAAA,YAAwC,GAExC,EAAA,EACJ,eAGI,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EACJ,MAAM,SAAE,GAAa,IACf,GAAkB,QAAT,EAAA,EAAS,qBAAA,IAAA,OAAA,EAAT,EAAwB,SAAU,KAC3C,EAAW,IAEjB,EAAA,KACE,EAAS,UAAU,CACjB,UAAW,EAAuB,aAGpC,EAAS,oBAAoB,CAAE,UAAW,EAAgB,eAG5D,MAAQ,UAAW,EAAoB,KAAM,GAAkB,EAC7D,CACE,SAAU,CACR,SAC2C,KAAzB,QAAhB,EAAO,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,aACZ,QAD4B,EACrC,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,SAClB,EACN,SAC2C,KAAzB,QAAhB,EAAO,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,aACZ,QAD4B,EACrC,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,SAClB,GAER,QAAiB,QAAT,EAAA,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,mBAAe,EACzC,WAAY,SAAU,QAAV,EAAA,EAAU,qBAAA,IAAA,OAAA,EAAV,EAAyB,cAInC,YAAE,EAAA,UAAa,IAAA,EAAA,EAAA,SAAA,KAA4B,IAAA,EAAA,EAC/C,MAAM,EAAmB,OAAO,QAAQ,GAAiB,CAAA,GAEzD,MAAO,CACL,YAA8B,QAA9B,EAAa,EAAiB,UAAA,IAAA,OAAA,EAAjB,EAAsB,GACnC,UAA4B,QAA5B,EAAW,EAAiB,UAAA,IAAA,OAAA,EAAjB,EAAsB,KAElC,CAAC,EAAoB,KAGtB,UAAW,EACX,UAAW,EAAA,qBACX,EAAA,sBACA,EAAA,iBACA,EAAA,MACA,EAAA,aACA,EAAA,QACA,EAAA,SACA,EAAA,SACA,GACE,EAAwB,CAC1B,OAAQ,EACR,WAAqB,QAArB,EAAY,EAAS,qBAAA,IAAA,OAAA,EAAT,EAAwB,aAGhC,GAAA,EAAA,EAAA,SAAA,IACE,GAAsB,EAC5B,CAAC,EAAoB,IAGjB,GAAA,EAAA,EAAA,SAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAAA,MACG,CACL,MAAgB,QAAhB,EAAO,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,MACzB,QACA,eACA,UACA,WACA,WACA,YACA,UAAW,EACX,mBACA,uBACA,wBACA,sBAAgC,QAAhC,EAAuB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,sBACzC,gBAA0B,QAA1B,EAAiB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,gBACnC,eAAyB,QAAzB,EAAgB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,eAClC,SACA,OAAO,aAAA,EAAA,EAAW,QAAS,KAE7B,CACW,QADX,EACE,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,MACT,QADS,EAClB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,gBAClB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAIJ,OACE,EAAA,EAAA,KAAC,EAAyB,SAA1B,CAAmC,MAAO,EACvC,cE7IM,EAAA,EACX,aAAY,EACZ,uBAKA,MAAM,EAAE,GAAM,EAAe,qBAE7B,OACE,EAAA,EAAA,KAAC,IAAD,CACE,UDjBc,4QCkBd,cAAY,iCACZ,kBAAiB,WAEhB,EAAE,EAAmB,8BAAgC,cAAe,CACnE,mBACA,cAAe,CAAE,aAAa,QETzB,EAAA,KACX,MAAM,EAAE,GAAM,EAAe,qBACvB,EAAW,KACX,MAAE,EAAA,aAAO,EAAA,QAAc,EAAA,SAAS,EAAA,SAAU,GAC9C,IACI,EAAc,IA6CpB,OAAK,UAAA,EAAa,KAAQ,GAAW,IAAU,EACtC,MAIP,EAAA,EAAA,KAAC,MAAD,CACE,UDtEmB,0CCuEnB,cAAY,0CAEZ,EAAA,EAAA,MAAC,EAAD,CAAQ,QAAQ,YAAY,QApD1B,KACA,IACF,EAAS,UAAU,CACjB,UAAW,EAAuB,mBAClC,gBAAiB,CACf,CACE,MAAO,yBACP,KAAM,gBAKZ,EAAS,oBAAoB,CAC3B,UAAW,EAAgB,mBAC3B,gBAAiB,CACf,0BAA2B,eAG/B,MAGG,GAAW,EAAQ,IACtB,EAAS,UAAU,CACjB,UAAW,EAAuB,mBAClC,gBAAiB,CACf,CACE,MAAO,yBACP,KAAM,gBAKZ,EAAS,oBAAoB,CAC3B,UAAW,EAAgB,mBAC3B,gBAAiB,CACf,0BAA2B,eAI/B,eAaA,CACG,GAAW,EAAE,oBACZ,GAAW,EAAQ,GAAgB,EAAE,6BG3DlC,EAAA,IAOI,IAPI,IACnB,EAAA,SACA,EAAA,SACA,EAAA,QACA,EAAA,SACA,GACG,EAAA,EAAA,EAAA,EAAA,GAEH,MAAM,eAAE,EAAA,sBAAgB,GAA0B,IAE5C,GAAA,EAAA,EAAA,SAAA,IAEF,EACI,CAAA,EACA,CACE,gBAAiB,OAAO,GAAA,6DAEhC,CAAC,IAGG,GAAA,EAAA,EAAA,SAAA,IACC,EACD,EAAiB,WAEd,SAHqB,SAI3B,CAAC,EAAgB,IAwBpB,OACE,EAAA,EAAA,MAAC,IAAA,EAAA,EAAA,CACC,QAxBmB,IACrB,EAAM,iBAEN,MAAM,KAAE,GAAS,EAAM,cAGpB,QACmC,IAA7B,EAAM,cAAc,MACX,IAAhB,EAAK,cAKgB,IAAZ,GACT,IAGiB,OAAf,OAAO,MACT,OAAO,IAAI,SAAS,KAAO,EAAM,cAAc,QAO/C,KAAM,QAAO,EACb,UDrEmB,+kBCsEnB,cAAY,0BACZ,iBAAgB,EAChB,oBAAmB,GACf,GAAA,CAAA,EAAA,UAPN,GASK,IAAmB,KACpB,EAAA,EAAA,KAAC,MAAD,CACE,UDhEgB,oQCiEhB,cAAY,gCACL,UAIV,OE/EM,EAAA,IAAA,IAAS,SACpB,GACG,EAAA,EAAA,EAAA,EAAA,GAAA,OAEH,EAAA,EAAA,KAAC,KAAA,EAAA,EAAA,CACC,UDTiB,0ICUjB,cAAY,iCACR,GAAA,CAAA,EAAA,CAEH,eCTQ,EAAA,EACX,aAAY,EACZ,eAKA,EAAA,EAAA,KAAC,MAAD,CACE,ULZqB,yIKarB,cAAY,+BACZ,kBAAiB,EAEhB,aCdQ,EAAkB,iCAClB,EAAM,yBGAN,EAAgC,EAAO,CAClD,IAAK,IACF,KAAI,GAAK,6BACT,IAAI,GAAI,6BACR,KAAK,cAAe,CACnB,GAAK,GAAgD,iBAAhB,EACrC,KAAO,GAAgB,EAAY,WACnC,UAAY,GAAgB,EAAY,aAE5C,IAAK,IACF,KAAI,IAAM,8BACV,IAAI,IAAK,8BACT,KAAK,cAAe,CACnB,GAAK,GAAgD,iBAAhB,EACrC,KAAO,GAAgB,EAAY,WACnC,UAAY,GAAgB,EAAY,aAE5C,YAAa,IAAS,WACtB,MAAO,IAA0B,WACjC,sBAAuB,IAAU,WACjC,gBAAiB,IAAU,WAC3B,eAAgB,IAAU,aACzB,WAAU,GCNb,EAAoB,EAAmB,kBAAkB,KAAI,EAAA,UAEvD,KAA0B,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAC9B,MAAM,SAAE,GAAa,IACf,EAAW,IAEX,GAAkB,QAAT,EAAA,EAAS,qBAAA,IAAA,OAAA,EAAT,EAAwB,SAAU,KAE3C,GAAA,EAAA,EAAA,SAAA,KAAyB,IAAA,EAAA,EAAA,EAAA,EAC7B,OAAa,QAAb,EAAI,EAAS,eAAA,IAAA,GAAT,EAAkB,YACb,CACL,YAAsB,QAAtB,EAAa,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,aAI5B,CACL,IAAc,QAAd,EAAK,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,IACvB,IAAc,QAAd,EAAK,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,MAExB,CACQ,QADR,EACD,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,IACT,QADS,EAClB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,IACT,QADS,EAClB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,cAGpB,OACE,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,EAAD,CACE,IAAI,qBACI,SACR,QAAS,EAAS,kBAElB,EAAA,EAAA,KAAC,EAAD,CACE,YAAsB,QAAtB,EAAa,EAAS,qBAAA,IAAA,GAAe,QAAf,EAAT,EAAwB,mBAAA,IAAA,OAAA,EAAxB,EAAqC,IAClD,OAAQ,EAAS,OACjB,WAAqB,QAArB,EAAY,EAAS,qBAAA,IAAA,OAAA,EAAT,EAAwB,WACpC,OAAiB,QAAjB,EAAQ,EAAS,qBAAA,IAAA,OAAA,EAAT,EAAwB,OAChC,QAAS,EAAa,6BAEtB,EAAA,EAAA,KAAC,EAAD,CACE,yBAA0B,CACxB,OAAQ,EAAS,QAAU,IAE7B,kBAAmB,EAAmB,kBACtC,KAAM,CACJ,SAAU,EAAS,SACnB,YAAa,EAAa,mBAC1B,eAAA,WAEF,WAAY,CACV,WACA,KAAM,EAAS,SACf,SAAU,SAAS,SACnB,SACA,YAEF,MAAO,CACL,aACE,aAGJ,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CAAA"}
|
|
1
|
+
{"version":3,"file":"NeighborhoodMatch-legacy-DgFc0xk6.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title> </CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"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"}
|