@local-logic/sdks-app 1.24.39 → 1.24.40
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-BZJo6XLr.js → Attribution-1Rs_lSaP.js} +2 -2
- package/dist/assets/{Attribution-BZJo6XLr.js.map → Attribution-1Rs_lSaP.js.map} +1 -1
- package/dist/assets/{Attribution-legacy-BfZKp_jr.js → Attribution-legacy-z2BjL7p0.js} +2 -2
- package/dist/assets/{Attribution-legacy-BfZKp_jr.js.map → Attribution-legacy-z2BjL7p0.js.map} +1 -1
- package/dist/assets/{Cluster-BHQcO6iC-legacy-CFFn8bZl.js → Cluster-BHQcO6iC-legacy-Bybijjfk.js} +2 -2
- package/dist/assets/{Cluster-BHQcO6iC-legacy-CFFn8bZl.js.map → Cluster-BHQcO6iC-legacy-Bybijjfk.js.map} +1 -1
- package/dist/assets/{Cluster-BHQcO6iC-iF9qeh5_.js → Cluster-BHQcO6iC-xa0oCXAy.js} +2 -2
- package/dist/assets/{Cluster-BHQcO6iC-iF9qeh5_.js.map → Cluster-BHQcO6iC-xa0oCXAy.js.map} +1 -1
- package/dist/assets/{Google-CH7a2yx--legacy-DFZKWqKn.js → Google-CH7a2yx--legacy-C6u2uwAw.js} +2 -2
- package/dist/assets/{Google-CH7a2yx--legacy-DFZKWqKn.js.map → Google-CH7a2yx--legacy-C6u2uwAw.js.map} +1 -1
- package/dist/assets/{Google-CH7a2yx--3wHRFLqZ.js → Google-CH7a2yx--ovYZ-h3M.js} +2 -2
- package/dist/assets/{Google-CH7a2yx--3wHRFLqZ.js.map → Google-CH7a2yx--ovYZ-h3M.js.map} +1 -1
- package/dist/assets/{Google-CXGCn-oJ-CXnMtwaZ.js → Google-CXGCn-oJ-BXFc5F9y.js} +2 -2
- package/dist/assets/{Google-CXGCn-oJ-CXnMtwaZ.js.map → Google-CXGCn-oJ-BXFc5F9y.js.map} +1 -1
- package/dist/assets/{Google-CXGCn-oJ-legacy-_JD4Pa4T.js → Google-CXGCn-oJ-legacy-Bv9lya5C.js} +2 -2
- package/dist/assets/{Google-CXGCn-oJ-legacy-_JD4Pa4T.js.map → Google-CXGCn-oJ-legacy-Bv9lya5C.js.map} +1 -1
- package/dist/assets/{Google-D1kMMDIv-DWK-9hcq.js → Google-D1kMMDIv-CyqUDjcJ.js} +2 -2
- package/dist/assets/{Google-D1kMMDIv-DWK-9hcq.js.map → Google-D1kMMDIv-CyqUDjcJ.js.map} +1 -1
- package/dist/assets/{Google-D1kMMDIv-legacy-BGKqFZkc.js → Google-D1kMMDIv-legacy-DKdnDC4w.js} +2 -2
- package/dist/assets/{Google-D1kMMDIv-legacy-BGKqFZkc.js.map → Google-D1kMMDIv-legacy-DKdnDC4w.js.map} +1 -1
- package/dist/assets/{Google-DScXSvYv-DaJocK7M.js → Google-DScXSvYv-CMLGBG91.js} +2 -2
- package/dist/assets/{Google-DScXSvYv-DaJocK7M.js.map → Google-DScXSvYv-CMLGBG91.js.map} +1 -1
- package/dist/assets/{Google-DScXSvYv-legacy-BssQjKYU.js → Google-DScXSvYv-legacy-BOwywVA7.js} +2 -2
- package/dist/assets/{Google-DScXSvYv-legacy-BssQjKYU.js.map → Google-DScXSvYv-legacy-BOwywVA7.js.map} +1 -1
- package/dist/assets/{Google-qvGtRAuh-DJPedSaG.js → Google-qvGtRAuh-PwpE9X2p.js} +2 -2
- package/dist/assets/{Google-qvGtRAuh-DJPedSaG.js.map → Google-qvGtRAuh-PwpE9X2p.js.map} +1 -1
- package/dist/assets/{Google-qvGtRAuh-legacy-D5rkGNsq.js → Google-qvGtRAuh-legacy-DzpIwQOn.js} +2 -2
- package/dist/assets/{Google-qvGtRAuh-legacy-D5rkGNsq.js.map → Google-qvGtRAuh-legacy-DzpIwQOn.js.map} +1 -1
- package/dist/assets/{GridGraph-Tb9r5WqU.js → GridGraph-BtocIeP6.js} +2 -2
- package/dist/assets/{GridGraph-Tb9r5WqU.js.map → GridGraph-BtocIeP6.js.map} +1 -1
- package/dist/assets/{GridGraph-legacy-BJdMBSEf.js → GridGraph-legacy-BjpzUUXY.js} +2 -2
- package/dist/assets/{GridGraph-legacy-BJdMBSEf.js.map → GridGraph-legacy-BjpzUUXY.js.map} +1 -1
- package/dist/assets/{LeadCapture-QkyFLnf_.js → LeadCapture-C6J4SFYX.js} +2 -2
- package/dist/assets/{LeadCapture-QkyFLnf_.js.map → LeadCapture-C6J4SFYX.js.map} +1 -1
- package/dist/assets/{LeadCapture-legacy-DUJGndBJ.js → LeadCapture-legacy-CvtD-JLs.js} +2 -2
- package/dist/assets/{LeadCapture-legacy-DUJGndBJ.js.map → LeadCapture-legacy-CvtD-JLs.js.map} +1 -1
- package/dist/assets/{LocalContent-CPmxknE1.js → LocalContent-D_By1RQx.js} +2 -2
- package/dist/assets/{LocalContent-CPmxknE1.js.map → LocalContent-D_By1RQx.js.map} +1 -1
- package/dist/assets/{LocalContent-legacy-BRrAQl-R.js → LocalContent-legacy-ySWyVUnO.js} +2 -2
- package/dist/assets/{LocalContent-legacy-BRrAQl-R.js.map → LocalContent-legacy-ySWyVUnO.js.map} +1 -1
- package/dist/assets/{LocalDemographics-DoYRjheI.js → LocalDemographics-DJ2-OAQf.js} +2 -2
- package/dist/assets/{LocalDemographics-DoYRjheI.js.map → LocalDemographics-DJ2-OAQf.js.map} +1 -1
- package/dist/assets/{LocalDemographics-legacy-DlEk4ZPh.js → LocalDemographics-legacy-BdndzMcL.js} +2 -2
- package/dist/assets/{LocalDemographics-legacy-DlEk4ZPh.js.map → LocalDemographics-legacy-BdndzMcL.js.map} +1 -1
- package/dist/assets/{Mapbox-B7oionsm-legacy-CthokNte.js → Mapbox-B7oionsm-legacy-DbFnvW90.js} +2 -2
- package/dist/assets/{Mapbox-B7oionsm-legacy-CthokNte.js.map → Mapbox-B7oionsm-legacy-DbFnvW90.js.map} +1 -1
- package/dist/assets/{Mapbox-B7oionsm-Bti3i9dQ.js → Mapbox-B7oionsm-uR5IXeyy.js} +2 -2
- package/dist/assets/{Mapbox-B7oionsm-Bti3i9dQ.js.map → Mapbox-B7oionsm-uR5IXeyy.js.map} +1 -1
- package/dist/assets/{Mapbox-CIislOVu-DtzRCIrG.js → Mapbox-CIislOVu-_SCNyNvm.js} +2 -2
- package/dist/assets/{Mapbox-CIislOVu-DtzRCIrG.js.map → Mapbox-CIislOVu-_SCNyNvm.js.map} +1 -1
- package/dist/assets/{Mapbox-CIislOVu-legacy-DIGoj72K.js → Mapbox-CIislOVu-legacy-BFRdB1ZB.js} +2 -2
- package/dist/assets/{Mapbox-CIislOVu-legacy-DIGoj72K.js.map → Mapbox-CIislOVu-legacy-BFRdB1ZB.js.map} +1 -1
- package/dist/assets/{Mapbox-DDJ1gHRb-CuedRSZq.js → Mapbox-DDJ1gHRb-DEMJ-azB.js} +2 -2
- package/dist/assets/{Mapbox-DDJ1gHRb-CuedRSZq.js.map → Mapbox-DDJ1gHRb-DEMJ-azB.js.map} +1 -1
- package/dist/assets/{Mapbox-DDJ1gHRb-legacy-CW_kiJxl.js → Mapbox-DDJ1gHRb-legacy-FX0OT-av.js} +2 -2
- package/dist/assets/{Mapbox-DDJ1gHRb-legacy-CW_kiJxl.js.map → Mapbox-DDJ1gHRb-legacy-FX0OT-av.js.map} +1 -1
- package/dist/assets/{Mapbox-DtZmt1D_-vfqyqnh7.js → Mapbox-DtZmt1D_-CylJOr0s.js} +2 -2
- package/dist/assets/{Mapbox-DtZmt1D_-vfqyqnh7.js.map → Mapbox-DtZmt1D_-CylJOr0s.js.map} +1 -1
- package/dist/assets/{Mapbox-DtZmt1D_-legacy-Dx5bB72j.js → Mapbox-DtZmt1D_-legacy-CEf_t8Ho.js} +2 -2
- package/dist/assets/{Mapbox-DtZmt1D_-legacy-Dx5bB72j.js.map → Mapbox-DtZmt1D_-legacy-CEf_t8Ho.js.map} +1 -1
- package/dist/assets/{Mapbox-vp91lH9I-CAs_0sfe.js → Mapbox-vp91lH9I-2azJqyBH.js} +2 -2
- package/dist/assets/{Mapbox-vp91lH9I-CAs_0sfe.js.map → Mapbox-vp91lH9I-2azJqyBH.js.map} +1 -1
- package/dist/assets/{Mapbox-vp91lH9I-legacy-BgoomLp_.js → Mapbox-vp91lH9I-legacy-DPw2IdjJ.js} +2 -2
- package/dist/assets/{Mapbox-vp91lH9I-legacy-BgoomLp_.js.map → Mapbox-vp91lH9I-legacy-DPw2IdjJ.js.map} +1 -1
- package/dist/assets/{Maptiler-BQliPE7n-B7ARszoA.js → Maptiler-BQliPE7n-fHYr_Sy8.js} +2 -2
- package/dist/assets/{Maptiler-BQliPE7n-B7ARszoA.js.map → Maptiler-BQliPE7n-fHYr_Sy8.js.map} +1 -1
- package/dist/assets/{Maptiler-BQliPE7n-legacy-DcuCwh0v.js → Maptiler-BQliPE7n-legacy-eo7KI-_O.js} +2 -2
- package/dist/assets/{Maptiler-BQliPE7n-legacy-DcuCwh0v.js.map → Maptiler-BQliPE7n-legacy-eo7KI-_O.js.map} +1 -1
- package/dist/assets/{Maptiler-BtYYeJoo-WES9jrq_.js → Maptiler-BtYYeJoo-CTmdD2ZG.js} +2 -2
- package/dist/assets/{Maptiler-BtYYeJoo-WES9jrq_.js.map → Maptiler-BtYYeJoo-CTmdD2ZG.js.map} +1 -1
- package/dist/assets/{Maptiler-BtYYeJoo-legacy-CNWE4X_k.js → Maptiler-BtYYeJoo-legacy-3OoLRcAt.js} +2 -2
- package/dist/assets/{Maptiler-BtYYeJoo-legacy-CNWE4X_k.js.map → Maptiler-BtYYeJoo-legacy-3OoLRcAt.js.map} +1 -1
- package/dist/assets/{Maptiler-Cy2r6w4G-jxWC3gGH.js → Maptiler-Cy2r6w4G-CP-nhmYn.js} +2 -2
- package/dist/assets/{Maptiler-Cy2r6w4G-jxWC3gGH.js.map → Maptiler-Cy2r6w4G-CP-nhmYn.js.map} +1 -1
- package/dist/assets/{Maptiler-Cy2r6w4G-legacy-COhxgGfE.js → Maptiler-Cy2r6w4G-legacy-ZYpf9l6D.js} +2 -2
- package/dist/assets/{Maptiler-Cy2r6w4G-legacy-COhxgGfE.js.map → Maptiler-Cy2r6w4G-legacy-ZYpf9l6D.js.map} +1 -1
- package/dist/assets/{Maptiler-DJScKW8p-ILy8OFKG.js → Maptiler-DJScKW8p-Crd7Z6cV.js} +2 -2
- package/dist/assets/{Maptiler-DJScKW8p-ILy8OFKG.js.map → Maptiler-DJScKW8p-Crd7Z6cV.js.map} +1 -1
- package/dist/assets/{Maptiler-DJScKW8p-legacy-C-co5LEf.js → Maptiler-DJScKW8p-legacy-CtCw_AMy.js} +2 -2
- package/dist/assets/{Maptiler-DJScKW8p-legacy-C-co5LEf.js.map → Maptiler-DJScKW8p-legacy-CtCw_AMy.js.map} +1 -1
- package/dist/assets/{Maptiler-DqeshLom-BOdQvZVO.js → Maptiler-DqeshLom-CrkvMF_T.js} +2 -2
- package/dist/assets/{Maptiler-DqeshLom-BOdQvZVO.js.map → Maptiler-DqeshLom-CrkvMF_T.js.map} +1 -1
- package/dist/assets/{Maptiler-DqeshLom-legacy-CFQFxJw-.js → Maptiler-DqeshLom-legacy-DDfM5Hzg.js} +2 -2
- package/dist/assets/{Maptiler-DqeshLom-legacy-CFQFxJw-.js.map → Maptiler-DqeshLom-legacy-DDfM5Hzg.js.map} +1 -1
- package/dist/assets/{MarkerIcon-Bc3X9WQk-L8yQjJbr.js → MarkerIcon-Bc3X9WQk-MIM92a-D.js} +2 -2
- package/dist/assets/{MarkerIcon-Bc3X9WQk-L8yQjJbr.js.map → MarkerIcon-Bc3X9WQk-MIM92a-D.js.map} +1 -1
- package/dist/assets/{MarkerIcon-Bc3X9WQk-legacy-DUAfU9AS.js → MarkerIcon-Bc3X9WQk-legacy-Df6-FiGi.js} +2 -2
- package/dist/assets/{MarkerIcon-Bc3X9WQk-legacy-DUAfU9AS.js.map → MarkerIcon-Bc3X9WQk-legacy-Df6-FiGi.js.map} +1 -1
- package/dist/assets/{NeighborhoodCard-legacy-WZvnt_0B.js → NeighborhoodCard-legacy-DFcfelXl.js} +2 -2
- package/dist/assets/{NeighborhoodCard-legacy-WZvnt_0B.js.map → NeighborhoodCard-legacy-DFcfelXl.js.map} +1 -1
- package/dist/assets/{NeighborhoodCard-CspcUBzi.js → NeighborhoodCard-vYnzmXHM.js} +2 -2
- package/dist/assets/{NeighborhoodCard-CspcUBzi.js.map → NeighborhoodCard-vYnzmXHM.js.map} +1 -1
- package/dist/assets/{NeighborhoodCharacteristics-HffngCxm.js → NeighborhoodCharacteristics-CKDqcqBD.js} +2 -2
- package/dist/assets/{NeighborhoodCharacteristics-HffngCxm.js.map → NeighborhoodCharacteristics-CKDqcqBD.js.map} +1 -1
- package/dist/assets/{NeighborhoodCharacteristics-legacy-DIVxCNYX.js → NeighborhoodCharacteristics-legacy-CLa_SgDg.js} +2 -2
- package/dist/assets/{NeighborhoodCharacteristics-legacy-DIVxCNYX.js.map → NeighborhoodCharacteristics-legacy-CLa_SgDg.js.map} +1 -1
- package/dist/assets/{NeighborhoodDemographics-CxIpWVnb.js → NeighborhoodDemographics-9bIYm41b.js} +2 -2
- package/dist/assets/{NeighborhoodDemographics-CxIpWVnb.js.map → NeighborhoodDemographics-9bIYm41b.js.map} +1 -1
- package/dist/assets/{NeighborhoodDemographics-legacy-vex0EXld.js → NeighborhoodDemographics-legacy-CS8oTDkw.js} +2 -2
- package/dist/assets/{NeighborhoodDemographics-legacy-vex0EXld.js.map → NeighborhoodDemographics-legacy-CS8oTDkw.js.map} +1 -1
- package/dist/assets/{NeighborhoodFeatured-Bu1DrNnA.js → NeighborhoodFeatured-CqLcXNVj.js} +2 -2
- package/dist/assets/{NeighborhoodFeatured-Bu1DrNnA.js.map → NeighborhoodFeatured-CqLcXNVj.js.map} +1 -1
- package/dist/assets/{NeighborhoodFeatured-legacy-_fb6iGnR.js → NeighborhoodFeatured-legacy-CUYFzaci.js} +2 -2
- package/dist/assets/{NeighborhoodFeatured-legacy-_fb6iGnR.js.map → NeighborhoodFeatured-legacy-CUYFzaci.js.map} +1 -1
- package/dist/assets/{NeighborhoodHero-Cj8UoSlQ.js → NeighborhoodHero-CvvE1ltz.js} +2 -2
- package/dist/assets/{NeighborhoodHero-Cj8UoSlQ.js.map → NeighborhoodHero-CvvE1ltz.js.map} +1 -1
- package/dist/assets/{NeighborhoodHero-legacy-CZa7K7hP.js → NeighborhoodHero-legacy-D1mVa22Q.js} +2 -2
- package/dist/assets/{NeighborhoodHero-legacy-CZa7K7hP.js.map → NeighborhoodHero-legacy-D1mVa22Q.js.map} +1 -1
- package/dist/assets/{NeighborhoodHighlights-BhmiFgqL.js → NeighborhoodHighlights-CZPdH88M.js} +2 -2
- package/dist/assets/{NeighborhoodHighlights-BhmiFgqL.js.map → NeighborhoodHighlights-CZPdH88M.js.map} +1 -1
- package/dist/assets/{NeighborhoodHighlights-legacy-CRAA2b2s.js → NeighborhoodHighlights-legacy-D9U7NrXB.js} +2 -2
- package/dist/assets/{NeighborhoodHighlights-legacy-CRAA2b2s.js.map → NeighborhoodHighlights-legacy-D9U7NrXB.js.map} +1 -1
- package/dist/assets/{NeighborhoodMap-BnSbDjAD.js → NeighborhoodMap-CW5YonYt.js} +2 -2
- package/dist/assets/{NeighborhoodMap-BnSbDjAD.js.map → NeighborhoodMap-CW5YonYt.js.map} +1 -1
- package/dist/assets/{NeighborhoodMap-legacy-DsJR-_Ib.js → NeighborhoodMap-legacy-DJc98Olx.js} +2 -2
- package/dist/assets/{NeighborhoodMap-legacy-DsJR-_Ib.js.map → NeighborhoodMap-legacy-DJc98Olx.js.map} +1 -1
- package/dist/assets/{NeighborhoodMarketTrends-Cb_jS4T-.js → NeighborhoodMarketTrends-C9k7JehA.js} +3 -3
- package/dist/assets/{NeighborhoodMarketTrends-Cb_jS4T-.js.map → NeighborhoodMarketTrends-C9k7JehA.js.map} +1 -1
- package/dist/assets/{NeighborhoodMarketTrends-legacy-CbHN8M1x.js → NeighborhoodMarketTrends-legacy-2bMV1Qzk.js} +2 -2
- package/dist/assets/{NeighborhoodMarketTrends-legacy-CbHN8M1x.js.map → NeighborhoodMarketTrends-legacy-2bMV1Qzk.js.map} +1 -1
- package/dist/assets/{NeighborhoodMatch-CjzFnYBt.js → NeighborhoodMatch-D1Ih_N5y.js} +2 -2
- package/dist/assets/{NeighborhoodMatch-CjzFnYBt.js.map → NeighborhoodMatch-D1Ih_N5y.js.map} +1 -1
- package/dist/assets/{NeighborhoodMatch-legacy-Cki-459P.js → NeighborhoodMatch-legacy-JIbRT5P5.js} +2 -2
- package/dist/assets/{NeighborhoodMatch-legacy-Cki-459P.js.map → NeighborhoodMatch-legacy-JIbRT5P5.js.map} +1 -1
- package/dist/assets/{NeighborhoodPropertyValueDrivers-DE9yCMMy.js → NeighborhoodPropertyValueDrivers-BZqsNnYY.js} +2 -2
- package/dist/assets/{NeighborhoodPropertyValueDrivers-DE9yCMMy.js.map → NeighborhoodPropertyValueDrivers-BZqsNnYY.js.map} +1 -1
- package/dist/assets/{NeighborhoodPropertyValueDrivers-legacy-BDGnpUrH.js → NeighborhoodPropertyValueDrivers-legacy-DFZzKasL.js} +2 -2
- package/dist/assets/{NeighborhoodPropertyValueDrivers-legacy-BDGnpUrH.js.map → NeighborhoodPropertyValueDrivers-legacy-DFZzKasL.js.map} +1 -1
- package/dist/assets/{NeighborhoodSchools-legacy-Bt9eSjXU.js → NeighborhoodSchools-legacy-DZvrq0M0.js} +2 -2
- package/dist/assets/{NeighborhoodSchools-legacy-Bt9eSjXU.js.map → NeighborhoodSchools-legacy-DZvrq0M0.js.map} +1 -1
- package/dist/assets/{NeighborhoodSchools-DftPMblM.js → NeighborhoodSchools-vdqXmI6x.js} +2 -2
- package/dist/assets/{NeighborhoodSchools-DftPMblM.js.map → NeighborhoodSchools-vdqXmI6x.js.map} +1 -1
- package/dist/assets/{NeighborhoodShowcase-D7hHBYLI.js → NeighborhoodShowcase-IMXpKRt7.js} +2 -2
- package/dist/assets/{NeighborhoodShowcase-D7hHBYLI.js.map → NeighborhoodShowcase-IMXpKRt7.js.map} +1 -1
- package/dist/assets/{NeighborhoodShowcase-legacy-Ch3_MLRd.js → NeighborhoodShowcase-legacy-DsybUJu-.js} +2 -2
- package/dist/assets/{NeighborhoodShowcase-legacy-Ch3_MLRd.js.map → NeighborhoodShowcase-legacy-DsybUJu-.js.map} +1 -1
- package/dist/assets/{NoDataContent-BnqODeIj.js → NoDataContent-C0rYoHx-.js} +2 -2
- package/dist/assets/{NoDataContent-BnqODeIj.js.map → NoDataContent-C0rYoHx-.js.map} +1 -1
- package/dist/assets/{NoDataContent-legacy-AbG_5zRB.js → NoDataContent-legacy-KJTrIi_f.js} +2 -2
- package/dist/assets/{NoDataContent-legacy-AbG_5zRB.js.map → NoDataContent-legacy-KJTrIi_f.js.map} +1 -1
- package/dist/assets/{ResizeWrapper-B0ve6-E-.js → ResizeWrapper-C7FI0ut2.js} +2 -2
- package/dist/assets/{ResizeWrapper-B0ve6-E-.js.map → ResizeWrapper-C7FI0ut2.js.map} +1 -1
- package/dist/assets/{ResizeWrapper-legacy-DYQ5wMxT.js → ResizeWrapper-legacy-CxGgsSO0.js} +2 -2
- package/dist/assets/{ResizeWrapper-legacy-DYQ5wMxT.js.map → ResizeWrapper-legacy-CxGgsSO0.js.map} +1 -1
- package/dist/assets/{ScoreCardList-HkJ6lHt-.js → ScoreCardList-Cpdc2cjx.js} +2 -2
- package/dist/assets/{ScoreCardList-HkJ6lHt-.js.map → ScoreCardList-Cpdc2cjx.js.map} +1 -1
- package/dist/assets/{ScoreCardList-legacy-CzPnAXtg.js → ScoreCardList-legacy-CEYUmBc-.js} +2 -2
- package/dist/assets/{ScoreCardList-legacy-CzPnAXtg.js.map → ScoreCardList-legacy-CEYUmBc-.js.map} +1 -1
- package/dist/assets/{ScoreIcon-legacy-CtP7dMZz.js → ScoreIcon-legacy-DkcfBQiQ.js} +2 -2
- package/dist/assets/{ScoreIcon-legacy-CtP7dMZz.js.map → ScoreIcon-legacy-DkcfBQiQ.js.map} +1 -1
- package/dist/assets/{ScoreIcon-CzsXV_UW.js → ScoreIcon-t1E2TT1n.js} +2 -2
- package/dist/assets/{ScoreIcon-CzsXV_UW.js.map → ScoreIcon-t1E2TT1n.js.map} +1 -1
- package/dist/assets/{Testing--n5Ro0Ek-DqcApoud.js → Testing--n5Ro0Ek-BsPetIU5.js} +2 -2
- package/dist/assets/{Testing--n5Ro0Ek-DqcApoud.js.map → Testing--n5Ro0Ek-BsPetIU5.js.map} +1 -1
- package/dist/assets/{Testing--n5Ro0Ek-legacy-icxJIi6L.js → Testing--n5Ro0Ek-legacy-CsbvD4x2.js} +2 -2
- package/dist/assets/{Testing--n5Ro0Ek-legacy-icxJIi6L.js.map → Testing--n5Ro0Ek-legacy-CsbvD4x2.js.map} +1 -1
- package/dist/assets/{Testing-BNJwzbRK-ClqjNB8Z.js → Testing-BNJwzbRK-BEmMvKs-.js} +2 -2
- package/dist/assets/{Testing-BNJwzbRK-ClqjNB8Z.js.map → Testing-BNJwzbRK-BEmMvKs-.js.map} +1 -1
- package/dist/assets/{Testing-BNJwzbRK-legacy-AsNVfvV3.js → Testing-BNJwzbRK-legacy-CyJlRp16.js} +2 -2
- package/dist/assets/{Testing-BNJwzbRK-legacy-AsNVfvV3.js.map → Testing-BNJwzbRK-legacy-CyJlRp16.js.map} +1 -1
- package/dist/assets/{Testing-CoRLhmNT-DJceXLmB.js → Testing-CoRLhmNT-CPD-TUoo.js} +2 -2
- package/dist/assets/{Testing-CoRLhmNT-DJceXLmB.js.map → Testing-CoRLhmNT-CPD-TUoo.js.map} +1 -1
- package/dist/assets/{Testing-CoRLhmNT-legacy-DKUu-vde.js → Testing-CoRLhmNT-legacy-DfgW_o9l.js} +2 -2
- package/dist/assets/{Testing-CoRLhmNT-legacy-DKUu-vde.js.map → Testing-CoRLhmNT-legacy-DfgW_o9l.js.map} +1 -1
- package/dist/assets/{Testing-DGUeGxdc-jAggTLLh.js → Testing-DGUeGxdc-BdjxCDn4.js} +2 -2
- package/dist/assets/{Testing-DGUeGxdc-jAggTLLh.js.map → Testing-DGUeGxdc-BdjxCDn4.js.map} +1 -1
- package/dist/assets/{Testing-DGUeGxdc-legacy-txrl8G8G.js → Testing-DGUeGxdc-legacy-BMmCiaA9.js} +2 -2
- package/dist/assets/{Testing-DGUeGxdc-legacy-txrl8G8G.js.map → Testing-DGUeGxdc-legacy-BMmCiaA9.js.map} +1 -1
- package/dist/assets/{Testing-DzWAcbhL-gBDb3TPR.js → Testing-DzWAcbhL-D9IV0vyX.js} +2 -2
- package/dist/assets/{Testing-DzWAcbhL-gBDb3TPR.js.map → Testing-DzWAcbhL-D9IV0vyX.js.map} +1 -1
- package/dist/assets/{Testing-DzWAcbhL-legacy-Bz1ufOmE.js → Testing-DzWAcbhL-legacy-ByYDbJ2R.js} +2 -2
- package/dist/assets/{Testing-DzWAcbhL-legacy-Bz1ufOmE.js.map → Testing-DzWAcbhL-legacy-ByYDbJ2R.js.map} +1 -1
- package/dist/assets/{TitleHeader-BOwe_Hxw.js → TitleHeader-D5FOkV2k.js} +2 -2
- package/dist/assets/{TitleHeader-BOwe_Hxw.js.map → TitleHeader-D5FOkV2k.js.map} +1 -1
- package/dist/assets/{TitleHeader-legacy-Yq0pKMwQ.js → TitleHeader-legacy-BLb6gLY8.js} +2 -2
- package/dist/assets/{TitleHeader-legacy-Yq0pKMwQ.js.map → TitleHeader-legacy-BLb6gLY8.js.map} +1 -1
- package/dist/assets/{Trans-B3x1rhQP.js → Trans-D7Lw95-5.js} +2 -2
- package/dist/assets/{Trans-B3x1rhQP.js.map → Trans-D7Lw95-5.js.map} +1 -1
- package/dist/assets/{Trans-legacy-BpEZmEBR.js → Trans-legacy-CpzDXXlm.js} +2 -2
- package/dist/assets/{Trans-legacy-BpEZmEBR.js.map → Trans-legacy-CpzDXXlm.js.map} +1 -1
- package/dist/assets/{ValidateOptions-BoIx00p6.js → ValidateOptions-DO60DBsp.js} +2 -2
- package/dist/assets/{ValidateOptions-BoIx00p6.js.map → ValidateOptions-DO60DBsp.js.map} +1 -1
- package/dist/assets/{ValidateOptions-legacy-5tqMuOby.js → ValidateOptions-legacy-3q4kbk3m.js} +2 -2
- package/dist/assets/{ValidateOptions-legacy-5tqMuOby.js.map → ValidateOptions-legacy-3q4kbk3m.js.map} +1 -1
- package/dist/assets/{dist-DFMrEPsn.js → dist-DR7fC17q.js} +2 -2
- package/dist/assets/{dist-DFMrEPsn.js.map → dist-DR7fC17q.js.map} +1 -1
- package/dist/assets/{dist-legacy-bgie6J-I.js → dist-legacy-cfZE5xAd.js} +2 -2
- package/dist/assets/{dist-legacy-bgie6J-I.js.map → dist-legacy-cfZE5xAd.js.map} +1 -1
- package/dist/assets/{getMapProviderConfig-1qf7M196.js → getMapProviderConfig-CioaIqLl.js} +3 -3
- package/dist/assets/{getMapProviderConfig-1qf7M196.js.map → getMapProviderConfig-CioaIqLl.js.map} +1 -1
- package/dist/assets/{getMapProviderConfig-legacy-D8K_GpbB.js → getMapProviderConfig-legacy-Bvhnps7J.js} +2 -2
- package/dist/assets/{getMapProviderConfig-legacy-D8K_GpbB.js.map → getMapProviderConfig-legacy-Bvhnps7J.js.map} +1 -1
- package/dist/assets/index-Bs6_tEDn.js +3 -0
- package/dist/assets/index-Bs6_tEDn.js.map +1 -0
- package/dist/assets/index-legacy-4jEyS75d.js +2 -0
- package/dist/assets/index-legacy-4jEyS75d.js.map +1 -0
- package/dist/assets/{index.es-L77mCMKI.js → index.es-DqsbUu3C.js} +2 -2
- package/dist/assets/{index.es-L77mCMKI.js.map → index.es-DqsbUu3C.js.map} +1 -1
- package/dist/assets/{index.es-legacy-DCXU9yWo.js → index.es-legacy-D0YewKKM.js} +2 -2
- package/dist/assets/{index.es-legacy-DCXU9yWo.js.map → index.es-legacy-D0YewKKM.js.map} +1 -1
- package/dist/assets/{mapbox-jb8Zev6T-BlcXJqNS.js → mapbox-jb8Zev6T-C9a-fLxp.js} +2 -2
- package/dist/assets/{mapbox-jb8Zev6T-BlcXJqNS.js.map → mapbox-jb8Zev6T-C9a-fLxp.js.map} +1 -1
- package/dist/assets/{mapbox-jb8Zev6T-legacy-5YjFAABq.js → mapbox-jb8Zev6T-legacy-C5JRCz3k.js} +2 -2
- package/dist/assets/{mapbox-jb8Zev6T-legacy-5YjFAABq.js.map → mapbox-jb8Zev6T-legacy-C5JRCz3k.js.map} +1 -1
- package/dist/assets/{maplibre-CUYkxr-D-DrCn-oAI.js → maplibre-CUYkxr-D-DB5uPmy7.js} +2 -2
- package/dist/assets/{maplibre-CUYkxr-D-DrCn-oAI.js.map → maplibre-CUYkxr-D-DB5uPmy7.js.map} +1 -1
- package/dist/assets/{maplibre-CUYkxr-D-legacy-CYB3Kihw.js → maplibre-CUYkxr-D-legacy-BrYegJJb.js} +2 -2
- package/dist/assets/{maplibre-CUYkxr-D-legacy-CYB3Kihw.js.map → maplibre-CUYkxr-D-legacy-BrYegJJb.js.map} +1 -1
- package/dist/assets/neighborhood-fallback-CizB5oi9.js.map +1 -1
- package/dist/assets/neighborhood-fallback-legacy-Bu1BwGpC.js.map +1 -1
- package/dist/assets/{sdks-LPZZCGgD.js → sdks-BLrYTJCI.js} +2 -2
- package/dist/assets/{sdks-LPZZCGgD.js.map → sdks-BLrYTJCI.js.map} +1 -1
- package/dist/assets/{sdks-legacy-CedyQdYU.js → sdks-legacy-BKNGokn5.js} +2 -2
- package/dist/assets/{sdks-legacy-CedyQdYU.js.map → sdks-legacy-BKNGokn5.js.map} +1 -1
- package/dist/assets/{useDemographicsData-BVysiSHi.js → useDemographicsData-C0C4upsm.js} +2 -2
- package/dist/assets/{useDemographicsData-BVysiSHi.js.map → useDemographicsData-C0C4upsm.js.map} +1 -1
- package/dist/assets/{useDemographicsData-legacy-CxtMmefE.js → useDemographicsData-legacy-DPnr3Jmh.js} +2 -2
- package/dist/assets/{useDemographicsData-legacy-CxtMmefE.js.map → useDemographicsData-legacy-DPnr3Jmh.js.map} +1 -1
- package/dist/assets/{useGeographies-Dwh65ZNv.js → useGeographies-Dsip5TUe.js} +2 -2
- package/dist/assets/{useGeographies-Dwh65ZNv.js.map → useGeographies-Dsip5TUe.js.map} +1 -1
- package/dist/assets/{useGeographies-legacy-C1KaCkDe.js → useGeographies-legacy-CZm4sQ-W.js} +2 -2
- package/dist/assets/{useGeographies-legacy-C1KaCkDe.js.map → useGeographies-legacy-CZm4sQ-W.js.map} +1 -1
- package/dist/assets/{useIsMobile-D0ute0_2.js → useIsMobile-D1ppstVc.js} +2 -2
- package/dist/assets/{useIsMobile-D0ute0_2.js.map → useIsMobile-D1ppstVc.js.map} +1 -1
- package/dist/assets/{useIsMobile-legacy-BoD5Raet.js → useIsMobile-legacy-BCGf3xRg.js} +2 -2
- package/dist/assets/{useIsMobile-legacy-BoD5Raet.js.map → useIsMobile-legacy-BCGf3xRg.js.map} +1 -1
- package/dist/assets/{useLocation-legacy-UxSoaQ23.js → useLocation-legacy-CrONniQb.js} +2 -2
- package/dist/assets/{useLocation-legacy-UxSoaQ23.js.map → useLocation-legacy-CrONniQb.js.map} +1 -1
- package/dist/assets/{useLocation-BvPxZ2EB.js → useLocation-woeqoUC-.js} +2 -2
- package/dist/assets/{useLocation-BvPxZ2EB.js.map → useLocation-woeqoUC-.js.map} +1 -1
- package/dist/assets/{useProfiles-8Ts7IxaF.js → useProfiles-BD0axzG_.js} +2 -2
- package/dist/assets/{useProfiles-8Ts7IxaF.js.map → useProfiles-BD0axzG_.js.map} +1 -1
- package/dist/assets/{useProfiles-legacy-CXE2gbpF.js → useProfiles-legacy-xMXLwJ8a.js} +2 -2
- package/dist/assets/{useProfiles-legacy-CXE2gbpF.js.map → useProfiles-legacy-xMXLwJ8a.js.map} +1 -1
- package/dist/assets/{useSchools-Du8flig0.js → useSchools-Bp4ifAPV.js} +2 -2
- package/dist/assets/{useSchools-Du8flig0.js.map → useSchools-Bp4ifAPV.js.map} +1 -1
- package/dist/assets/{useSchools-legacy-CqpKyT0D.js → useSchools-legacy-CBF47OQq.js} +2 -2
- package/dist/assets/{useSchools-legacy-CqpKyT0D.js.map → useSchools-legacy-CBF47OQq.js.map} +1 -1
- package/dist/assets/{useScores-sXwU61au.js → useScores-C3u-1G5Q.js} +2 -2
- package/dist/assets/{useScores-sXwU61au.js.map → useScores-C3u-1G5Q.js.map} +1 -1
- package/dist/assets/{useScores-legacy-DD_ol9qX.js → useScores-legacy-DlQbFEJD.js} +2 -2
- package/dist/assets/{useScores-legacy-DD_ol9qX.js.map → useScores-legacy-DlQbFEJD.js.map} +1 -1
- package/dist/index.html +2 -2
- package/dist/types/App.d.ts.map +1 -1
- package/dist/types/App.js +0 -18
- package/dist/types/App.js.map +1 -1
- package/dist/types/utils/errorTracker/index.d.ts.map +1 -1
- package/dist/types/utils/errorTracker/index.js +55 -6
- package/dist/types/utils/errorTracker/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/index-BJuTCMET.js +0 -3
- package/dist/assets/index-BJuTCMET.js.map +0 -1
- package/dist/assets/index-legacy-kyEaSclL.js +0 -2
- package/dist/assets/index-legacy-kyEaSclL.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,d as o,f as a,h as n,i as r,l as s,m as l,n as d,o as h,p as g,r as p,s as c,t as m,u}from"./sdks-LPZZCGgD.js";import{q as b,r as v,t as f}from"./index-BJuTCMET.js";import{n as x,r as y}from"./index.es-L77mCMKI.js";import{t as I}from"./useGeographies-Dwh65ZNv.js";import{t as _}from"./useResponsiveBreakpoints-Dq6mGzIW.js";import{t as j}from"./Attribution-BZJo6XLr.js";/* empty css */import{t as N}from"./ResizeWrapper-B0ve6-E-.js";import{t as A}from"./ValidateOptions-BoIx00p6.js";import{t as C}from"./useIsMobile-D0ute0_2.js";import{t as w}from"./TitleHeader-BOwe_Hxw.js";import{n as D,t as O}from"./ScoreCardList-HkJ6lHt-.js";import{t as E}from"./NoDataContent-BnqODeIj.js";import{t as L}from"./neighborhood-fallback-CizB5oi9.js";var M=e(i(),1);var k={all:()=>["similarNeighborhoods"],list:e=>[...k.all(),e]};var T=e=>{const i=_(),[t,o]=(0,M.useState)(4),{isLoading:a,isFetched:n,data:s}=function({geogID:e,externalId:i,limit:t}){const{client:o}=r(),a={geogId:e,externalId:i,limit:t};return l({queryKey:k.list(a),queryFn:async()=>await o.getSimilarNeighborhoods(a),enabled:!!e})}({...e,limit:8}),d=(0,M.useMemo)(()=>{let e=[];return s&&s.most_similar?(e=s.most_similar.length<t||!i?.lg?[...s.most_similar]:s.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}}(s?.affordability_index||void 0,e))):e},[s,t,i]),h=(s?.most_similar||[]).length>4&&t<8,g=d.some(e=>void 0!==e?.affordabilityComparison);return{isLoading:a,isFetched:n,similarNeighborhoods:d,hasAffordabilityIndex:g,neighborhoodName:s?.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=M.createContext({}),S=()=>(0,M.useContext)(G),P=({children:e})=>{const{sdkState:i}=f(),t=i.globalOptions?.locale||"en",o=c();v(()=>{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,M.useMemo)(()=>{const e=Object.entries(n||{});return{geographyId:e[0]?.[0],geography:e[0]?.[1]}},[a,n]),{isLoading:l,isFetched:d,similarNeighborhoods:h,hasAffordabilityIndex:g,neighborhoodName:p,limit:m,minimumLimit:u,hasMore:b,viewMore:x,viewLess:y}=T({geogID:r,externalId:i.globalOptions?.externalId}),_=(0,M.useMemo)(()=>a||l,[a,l]),j=(0,M.useMemo)(()=>({title:i.options?.title,limit:m,minimumLimit:u,hasMore:b,viewMore:x,viewLess:y,isLoading:_,isFetched:d,neighborhoodName:p,similarNeighborhoods:h,hasAffordabilityIndex:g,hideAffordabilityTags:i.options?.hideAffordabilityTags,hideAttribution:i.options?.hideAttribution,hideThumbnails:i.options?.hideThumbnails,locale:t,level:s?.level||10}),[i.options?.title,i.options?.hideAttribution,m,b,_,d,h,g,p,t,s]);return(0,R.jsx)(G.Provider,{value:j,children:e})},V=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=n("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-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},$=()=>{const{t:e}=n("neighborhoodMatch"),i=c(),{limit:t,minimumLimit:o,hasMore:a,viewLess:r,viewMore:s}=S(),l=_();return!l?.lg||!a&&t===o?null:(0,R.jsx)("div",{className:"w-full flex align-center justify-center",children:(0,R.jsxs)(x,{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"}}),r())},children:[a&&e("pagination.next"),!a&&t>o&&e("pagination.previous")]})})},B=({url:e,imageSrc:i,expanded:t,onClick:o,children:a,...n})=>{const{hideThumbnails:r,hideAffordabilityTags:s}=S(),l=(0,M.useMemo)(()=>r?{}:{backgroundImage:`url(${i||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[r]),d=(0,M.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-has-url":!!e,"data-height-style":d,...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',style:l}),a]})},F=({children:e})=>(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",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-is-loading":e,children:i}),q="px-2.5 pt-4 pb-6 min-h-[266px]";function z(){const{t:e}=n(["neighborhoodMatch","common"]),i=c(),{isFetched:t,isLoading:o,similarNeighborhoods:a,hasAffordabilityIndex:r,hideAffordabilityTags:s}=S();return t&&0===a.length?(0,R.jsx)(E,{text:e("noData")}):o?(0,R.jsx)(W,{isLoading:!0,children:[0,1,2,3].map(e=>(0,R.jsx)(B,{children:(0,R.jsxs)("div",{className:q,children:[(0,R.jsx)(F,{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)(B,{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:r,children:[void 0!==t.affordabilityComparison&&(0,R.jsx)("div",{className:"absolute top-0 right-4",children:(0,R.jsx)(y,{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)(F,{"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}=n(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:a,neighborhoodName:r,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:r,isLoading:o}),(0,R.jsx)(z,{}),(0,R.jsx)($,{}),(0,R.jsx)(j,{sdkName:"neighborhood-match",locale:t,isHidden:s})]})}var U=s({lat:u().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:u().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:o().optional(),title:g().optional(),hideAffordabilityTags:a().optional(),hideAttribution:a().optional(),hideThumbnails:a().optional()}).noUnknown(!0);h(d.neighborhoodMatch.key);var Q=()=>{const{sdkState:e}=f(),i=C(),o=e.globalOptions?.locale||"en",a=(0,M.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)(p,{environment:e.globalOptions?.environment?.api,apiKey:e.apiKey,appearance:e.globalOptions?.appearance,locale:e.globalOptions?.locale,product:m.NEIGHBORHOOD_MATCH,children:(0,R.jsx)(t,{trackingPipelineSettings:{apiKey:e.apiKey||""},analyticsSettings:d.neighborhoodMatch,meta:{clientId:e.clientId,productName:m.NEIGHBORHOOD_MATCH,productVersion:"1.24.39"},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{Q 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,d as o,f as a,h as n,i as r,l as s,m as l,n as d,o as h,p as g,r as p,s as c,t as m,u}from"./sdks-BLrYTJCI.js";import{q as b,r as v,t as f}from"./index-Bs6_tEDn.js";import{n as x,r as y}from"./index.es-DqsbUu3C.js";import{t as I}from"./useGeographies-Dsip5TUe.js";import{t as _}from"./useResponsiveBreakpoints-Dq6mGzIW.js";import{t as j}from"./Attribution-1Rs_lSaP.js";/* empty css */import{t as N}from"./ResizeWrapper-C7FI0ut2.js";import{t as A}from"./ValidateOptions-DO60DBsp.js";import{t as C}from"./useIsMobile-D1ppstVc.js";import{t as w}from"./TitleHeader-D5FOkV2k.js";import{n as D,t as O}from"./ScoreCardList-Cpdc2cjx.js";import{t as E}from"./NoDataContent-C0rYoHx-.js";import{t as L}from"./neighborhood-fallback-CizB5oi9.js";var M=e(i(),1);var k={all:()=>["similarNeighborhoods"],list:e=>[...k.all(),e]};var T=e=>{const i=_(),[t,o]=(0,M.useState)(4),{isLoading:a,isFetched:n,data:s}=function({geogID:e,externalId:i,limit:t}){const{client:o}=r(),a={geogId:e,externalId:i,limit:t};return l({queryKey:k.list(a),queryFn:async()=>await o.getSimilarNeighborhoods(a),enabled:!!e})}({...e,limit:8}),d=(0,M.useMemo)(()=>{let e=[];return s&&s.most_similar?(e=s.most_similar.length<t||!i?.lg?[...s.most_similar]:s.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}}(s?.affordability_index||void 0,e))):e},[s,t,i]),h=(s?.most_similar||[]).length>4&&t<8,g=d.some(e=>void 0!==e?.affordabilityComparison);return{isLoading:a,isFetched:n,similarNeighborhoods:d,hasAffordabilityIndex:g,neighborhoodName:s?.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=M.createContext({}),S=()=>(0,M.useContext)(G),P=({children:e})=>{const{sdkState:i}=f(),t=i.globalOptions?.locale||"en",o=c();v(()=>{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,M.useMemo)(()=>{const e=Object.entries(n||{});return{geographyId:e[0]?.[0],geography:e[0]?.[1]}},[a,n]),{isLoading:l,isFetched:d,similarNeighborhoods:h,hasAffordabilityIndex:g,neighborhoodName:p,limit:m,minimumLimit:u,hasMore:b,viewMore:x,viewLess:y}=T({geogID:r,externalId:i.globalOptions?.externalId}),_=(0,M.useMemo)(()=>a||l,[a,l]),j=(0,M.useMemo)(()=>({title:i.options?.title,limit:m,minimumLimit:u,hasMore:b,viewMore:x,viewLess:y,isLoading:_,isFetched:d,neighborhoodName:p,similarNeighborhoods:h,hasAffordabilityIndex:g,hideAffordabilityTags:i.options?.hideAffordabilityTags,hideAttribution:i.options?.hideAttribution,hideThumbnails:i.options?.hideThumbnails,locale:t,level:s?.level||10}),[i.options?.title,i.options?.hideAttribution,m,b,_,d,h,g,p,t,s]);return(0,R.jsx)(G.Provider,{value:j,children:e})},V=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=n("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-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},$=()=>{const{t:e}=n("neighborhoodMatch"),i=c(),{limit:t,minimumLimit:o,hasMore:a,viewLess:r,viewMore:s}=S(),l=_();return!l?.lg||!a&&t===o?null:(0,R.jsx)("div",{className:"w-full flex align-center justify-center",children:(0,R.jsxs)(x,{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"}}),r())},children:[a&&e("pagination.next"),!a&&t>o&&e("pagination.previous")]})})},B=({url:e,imageSrc:i,expanded:t,onClick:o,children:a,...n})=>{const{hideThumbnails:r,hideAffordabilityTags:s}=S(),l=(0,M.useMemo)(()=>r?{}:{backgroundImage:`url(${i||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[r]),d=(0,M.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-has-url":!!e,"data-height-style":d,...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',style:l}),a]})},F=({children:e})=>(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",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-is-loading":e,children:i}),q="px-2.5 pt-4 pb-6 min-h-[266px]";function z(){const{t:e}=n(["neighborhoodMatch","common"]),i=c(),{isFetched:t,isLoading:o,similarNeighborhoods:a,hasAffordabilityIndex:r,hideAffordabilityTags:s}=S();return t&&0===a.length?(0,R.jsx)(E,{text:e("noData")}):o?(0,R.jsx)(W,{isLoading:!0,children:[0,1,2,3].map(e=>(0,R.jsx)(B,{children:(0,R.jsxs)("div",{className:q,children:[(0,R.jsx)(F,{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)(B,{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:r,children:[void 0!==t.affordabilityComparison&&(0,R.jsx)("div",{className:"absolute top-0 right-4",children:(0,R.jsx)(y,{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)(F,{"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}=n(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:a,neighborhoodName:r,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:r,isLoading:o}),(0,R.jsx)(z,{}),(0,R.jsx)($,{}),(0,R.jsx)(j,{sdkName:"neighborhood-match",locale:t,isHidden:s})]})}var U=s({lat:u().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:u().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:o().optional(),title:g().optional(),hideAffordabilityTags:a().optional(),hideAttribution:a().optional(),hideThumbnails:a().optional()}).noUnknown(!0);h(d.neighborhoodMatch.key);var Q=()=>{const{sdkState:e}=f(),i=C(),o=e.globalOptions?.locale||"en",a=(0,M.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)(p,{environment:e.globalOptions?.environment?.api,apiKey:e.apiKey,appearance:e.globalOptions?.appearance,locale:e.globalOptions?.locale,product:m.NEIGHBORHOOD_MATCH,children:(0,R.jsx)(t,{trackingPipelineSettings:{apiKey:e.apiKey||""},analyticsSettings:d.neighborhoodMatch,meta:{clientId:e.clientId,productName:m.NEIGHBORHOOD_MATCH,productVersion:"1.24.40"},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{Q as default};
|
|
2
|
+
//# sourceMappingURL=NeighborhoodMatch-D1Ih_N5y.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeighborhoodMatch-CjzFnYBt.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 className={styles.text} data-is-loading={isLoading}>\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 className={styles.container}>\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-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div className={styles.imageCover} style={style} />\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 = ({ children }: { children: React.ReactNode }) => (\n <h3 className={styles.title}>{children}</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 className={styles.container} data-is-loading={isLoading}>\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 className={styles.tag}>\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-D1Ih_N5y.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 className={styles.text} data-is-loading={isLoading}>\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 className={styles.container}>\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-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div className={styles.imageCover} style={style} />\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 = ({ children }: { children: React.ReactNode }) => (\n <h3 className={styles.title}>{children}</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 className={styles.container} data-is-loading={isLoading}>\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 className={styles.tag}>\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-Cki-459P.js → NeighborhoodMatch-legacy-JIbRT5P5.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(){const e=["url","imageSrc","expanded","onClick","children"];function i(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 t(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach(function(i){o(e,i,n[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach(function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(n,i))})}return e}function o(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-CedyQdYU.js","./index-legacy-kyEaSclL.js","./index.es-legacy-DCXU9yWo.js","./useGeographies-legacy-C1KaCkDe.js","./useResponsiveBreakpoints-legacy-CHMcuyvR.js","./Attribution-legacy-BfZKp_jr.js","./globals-legacy-BRKdKvl9.js","./ResizeWrapper-legacy-DYQ5wMxT.js","./ValidateOptions-legacy-5tqMuOby.js","./useIsMobile-legacy-BoD5Raet.js","./TitleHeader-legacy-Yq0pKMwQ.js","./ScoreCardList-legacy-CzPnAXtg.js","./NoDataContent-legacy-AbG_5zRB.js","./neighborhood-fallback-legacy-Bu1BwGpC.js"],function(i,o){var n,a,r,l,s,d,c,u,g,h,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,Q,X;function Y(){const{t:e}=d(["neighborhoodMatch","common"]),i=b(),{isFetched:t,isLoading:o,similarNeighborhoods:n,hasAffordabilityIndex:a,hideAffordabilityTags:r}=$();return t&&0===n.length?(0,G.jsx)(T,{text:e("noData")}):o?(0,G.jsx)(J,{isLoading:!0,children:[0,1,2,3].map(e=>(0,G.jsx)(q,{children:(0,G.jsxs)("div",{className:U,children:[(0,G.jsx)(z,{children:" "}),(0,G.jsx)(M,{children:(0,G.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,G.jsx)(J,{isLoading:o,children:n.map((t,o)=>{return(0,G.jsxs)(q,{onClick:(n=o,()=>{i.postEvent({eventType:H.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:n}]}),i.trackAnalyticsEvent({eventName:R.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,G.jsx)("div",{className:Q,children:(0,G.jsx)(_,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!r&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,G.jsxs)("div",{className:U,children:[(0,G.jsx)(z,{"data-alt":t.name,children:t.name}),t.scores&&(0,G.jsx)(M,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,G.jsx)(L,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var n})})}function Z(){const{t:e}=d(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:n,neighborhoodName:a,hideAttribution:r}=$();return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(k,{title:"string"==typeof i||!1===i?i:e("title",{context:n})}),(0,G.jsx)(F,{neighborhoodName:a,isLoading:o}),(0,G.jsx)(Y,{}),(0,G.jsx)(W,{}),(0,G.jsx)(C,{sdkName:"neighborhood-match",locale:t,isHidden:r})]})}return{setters:[function(e){n=e.a},function(e){a=e.l},function(e){r=e.a,l=e.d,s=e.f,d=e.h,c=e.i,u=e.l,g=e.m,h=e.n,p=e.o,v=e.p,m=e.r,b=e.s,f=e.t,y=e.u},function(e){x=e.q,j=e.r,I=e.t},function(e){O=e.n,_=e.r},function(e){w=e.t},function(e){N=e.t},function(e){C=e.t},function(e){},function(e){A=e.t},function(e){D=e.t},function(e){E=e.t},function(e){k=e.t},function(e){L=e.n,M=e.t},function(e){T=e.t},function(e){e.t}],execute:function(){P=n(a(),1),S={all:()=>["similarNeighborhoods"],list:e=>[...S.all(),e]},K=e=>{const i=N(),[o,n]=(0,P.useState)(4),{isLoading:a,isFetched:r,data:l}=function({geogID:e,externalId:i,limit:t}){const{client:o}=c(),n={geogId:e,externalId:i,limit:t};return g({queryKey:S.list(n),queryFn:async()=>await o.getSimilarNeighborhoods(n),enabled:!!e})}(t(t({},e),{},{limit:8})),s=(0,P.useMemo)(()=>{let e=[];return l&&l.most_similar?(e=l.most_similar.length<o||null==i||!i.lg?[...l.most_similar]:l.most_similar.slice(0,o),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let o="";return o=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",t(t({},i),{},{affordabilityComparison:o})}((null==l?void 0:l.affordability_index)||void 0,e))):e},[l,o,i]),d=((null==l?void 0:l.most_similar)||[]).length>4&&o<8,u=s.some(e=>void 0!==(null==e?void 0:e.affordabilityComparison));return{isLoading:a,isFetched:r,similarNeighborhoods:s,hasAffordabilityIndex:u,neighborhoodName:null==l?void 0:l.name,limit:o,minimumLimit:4,hasMore:d,viewMore:()=>{8!==o&&n(o+4)},viewLess:()=>{o<8||n(o-4)}}},H=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}({}),R=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),G=x(),V=P.createContext({}),$=()=>(0,P.useContext)(V),B=({children:e})=>{var i,t,o,n,a,r,l,s,d,c;const{sdkState:u}=I(),g=(null===(i=u.globalOptions)||void 0===i?void 0:i.locale)||"en",h=b();j(()=>{h.postEvent({eventType:H.SDK_VIEWED}),h.trackAnalyticsEvent({eventName:R.SDK_VIEWED})});const{isLoading:p,data:v}=w({location:{lat:void 0===(null===(t=u.options)||void 0===t?void 0:t.geographyId)?null===(o=u.options)||void 0===o?void 0:o.lat:void 0,lng:void 0===(null===(n=u.options)||void 0===n?void 0:n.geographyId)?null===(a=u.options)||void 0===a?void 0:a.lng:void 0},geogID:(null===(r=u.options)||void 0===r?void 0:r.geographyId)||void 0,externalId:null==u||null===(l=u.globalOptions)||void 0===l?void 0:l.externalId}),{geographyId:m,geography:f}=(0,P.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:O,hasAffordabilityIndex:_,neighborhoodName:N,limit:C,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k}=K({geogID:m,externalId:null===(s=u.globalOptions)||void 0===s?void 0:s.externalId}),L=(0,P.useMemo)(()=>p||y,[p,y]),M=(0,P.useMemo)(()=>{var e,i,t,o;return{title:null===(e=u.options)||void 0===e?void 0:e.title,limit:C,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k,isLoading:L,isFetched:x,neighborhoodName:N,similarNeighborhoods:O,hasAffordabilityIndex:_,hideAffordabilityTags:null===(i=u.options)||void 0===i?void 0:i.hideAffordabilityTags,hideAttribution:null===(t=u.options)||void 0===t?void 0:t.hideAttribution,hideThumbnails:null===(o=u.options)||void 0===o?void 0:o.hideThumbnails,locale:g,level:(null==f?void 0:f.level)||10}},[null===(d=u.options)||void 0===d?void 0:d.title,null===(c=u.options)||void 0===c?void 0:c.hideAttribution,C,D,L,x,O,_,N,g,f]);return(0,G.jsx)(V.Provider,{value:M,children:e})},F=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=d("neighborhoodMatch");return(0,G.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-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},W=()=>{const{t:e}=d("neighborhoodMatch"),i=b(),{limit:t,minimumLimit:o,hasMore:n,viewLess:a,viewMore:r}=$(),l=N();return null==l||!l.lg||!n&&t===o?null:(0,G.jsx)("div",{className:"w-full flex align-center justify-center",children:(0,G.jsxs)(O,{variant:"secondary",onClick:()=>{n&&(i.postEvent({eventType:H.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:R.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),r()),!n&&t>o&&(i.postEvent({eventType:H.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:R.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),a())},children:[n&&e("pagination.next"),!n&&t>o&&e("pagination.previous")]})})},q=i=>{let{url:o,imageSrc:n,expanded:a,onClick:r,children:l}=i,s=function(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}(i,e);const{hideThumbnails:d,hideAffordabilityTags:c}=$(),u=(0,P.useMemo)(()=>d?{}:{backgroundImage:`url(${n||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[d]),g=(0,P.useMemo)(()=>d?a?"expanded":"hidden":"normal",[d,a]);return(0,G.jsxs)("a",t(t({onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==r&&r(),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-has-url":!!o,"data-height-style":g},s),{},{children:[(!d||!c)&&(0,G.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',style:u}),l]}))},z=({children:e})=>(0,G.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",children:e}),J=({isLoading:e=!1,children:i})=>(0,G.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-is-loading":e,children:i}),U="px-2.5 pt-4 pb-6 min-h-[266px]",Q="absolute top-0 right-4",X=u({lat:y().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:y().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:l().optional(),title:v().optional(),hideAffordabilityTags:s().optional(),hideAttribution:s().optional(),hideThumbnails:s().optional()}).noUnknown(!0),p(h.neighborhoodMatch.key),i("default",()=>{var e,i,t,o,n,a,l;const{sdkState:s}=I(),d=E(),c=(null===(e=s.globalOptions)||void 0===e?void 0:e.locale)||"en",u=(0,P.useMemo)(()=>{var e,i,t,o;return null!==(e=s.options)&&void 0!==e&&e.geographyId?{geographyId:null===(i=s.options)||void 0===i?void 0:i.geographyId}:{lat:null===(t=s.options)||void 0===t?void 0:t.lat,lng:null===(o=s.options)||void 0===o?void 0:o.lng}},[null===(i=s.options)||void 0===i?void 0:i.lat,null===(t=s.options)||void 0===t?void 0:t.lng,null===(o=s.options)||void 0===o?void 0:o.geographyId]);return(0,G.jsx)(A,{children:(0,G.jsx)(D,{sdk:"Neighborhood Match",schema:X,options:s.options,children:(0,G.jsx)(m,{environment:null===(n=s.globalOptions)||void 0===n||null===(n=n.environment)||void 0===n?void 0:n.api,apiKey:s.apiKey,appearance:null===(a=s.globalOptions)||void 0===a?void 0:a.appearance,locale:null===(l=s.globalOptions)||void 0===l?void 0:l.locale,product:f.NEIGHBORHOOD_MATCH,children:(0,G.jsx)(r,{trackingPipelineSettings:{apiKey:s.apiKey||""},analyticsSettings:h.neighborhoodMatch,meta:{clientId:s.clientId,productName:f.NEIGHBORHOOD_MATCH,productVersion:"1.24.39"},attributes:{location:u,host:s.location,host_url:document.referrer,locale:c,isMobile:d},flags:{isDebugMode:!1},children:(0,G.jsx)(B,{children:(0,G.jsx)(Z,{})})})})})})})}}})}();
|
|
2
|
-
//# sourceMappingURL=NeighborhoodMatch-legacy-
|
|
1
|
+
!function(){const e=["url","imageSrc","expanded","onClick","children"];function i(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 t(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach(function(i){o(e,i,n[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach(function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(n,i))})}return e}function o(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-BKNGokn5.js","./index-legacy-4jEyS75d.js","./index.es-legacy-D0YewKKM.js","./useGeographies-legacy-CZm4sQ-W.js","./useResponsiveBreakpoints-legacy-CHMcuyvR.js","./Attribution-legacy-z2BjL7p0.js","./globals-legacy-BRKdKvl9.js","./ResizeWrapper-legacy-CxGgsSO0.js","./ValidateOptions-legacy-3q4kbk3m.js","./useIsMobile-legacy-BCGf3xRg.js","./TitleHeader-legacy-BLb6gLY8.js","./ScoreCardList-legacy-CEYUmBc-.js","./NoDataContent-legacy-KJTrIi_f.js","./neighborhood-fallback-legacy-Bu1BwGpC.js"],function(i,o){var n,a,r,l,s,d,c,u,g,h,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,Q,X;function Y(){const{t:e}=d(["neighborhoodMatch","common"]),i=b(),{isFetched:t,isLoading:o,similarNeighborhoods:n,hasAffordabilityIndex:a,hideAffordabilityTags:r}=$();return t&&0===n.length?(0,G.jsx)(T,{text:e("noData")}):o?(0,G.jsx)(J,{isLoading:!0,children:[0,1,2,3].map(e=>(0,G.jsx)(q,{children:(0,G.jsxs)("div",{className:U,children:[(0,G.jsx)(z,{children:" "}),(0,G.jsx)(M,{children:(0,G.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,G.jsx)(J,{isLoading:o,children:n.map((t,o)=>{return(0,G.jsxs)(q,{onClick:(n=o,()=>{i.postEvent({eventType:H.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:n}]}),i.trackAnalyticsEvent({eventName:R.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,G.jsx)("div",{className:Q,children:(0,G.jsx)(_,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!r&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,G.jsxs)("div",{className:U,children:[(0,G.jsx)(z,{"data-alt":t.name,children:t.name}),t.scores&&(0,G.jsx)(M,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,G.jsx)(L,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var n})})}function Z(){const{t:e}=d(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:n,neighborhoodName:a,hideAttribution:r}=$();return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(k,{title:"string"==typeof i||!1===i?i:e("title",{context:n})}),(0,G.jsx)(F,{neighborhoodName:a,isLoading:o}),(0,G.jsx)(Y,{}),(0,G.jsx)(W,{}),(0,G.jsx)(C,{sdkName:"neighborhood-match",locale:t,isHidden:r})]})}return{setters:[function(e){n=e.a},function(e){a=e.l},function(e){r=e.a,l=e.d,s=e.f,d=e.h,c=e.i,u=e.l,g=e.m,h=e.n,p=e.o,v=e.p,m=e.r,b=e.s,f=e.t,y=e.u},function(e){x=e.q,j=e.r,I=e.t},function(e){O=e.n,_=e.r},function(e){w=e.t},function(e){N=e.t},function(e){C=e.t},function(e){},function(e){A=e.t},function(e){D=e.t},function(e){E=e.t},function(e){k=e.t},function(e){L=e.n,M=e.t},function(e){T=e.t},function(e){e.t}],execute:function(){P=n(a(),1),S={all:()=>["similarNeighborhoods"],list:e=>[...S.all(),e]},K=e=>{const i=N(),[o,n]=(0,P.useState)(4),{isLoading:a,isFetched:r,data:l}=function({geogID:e,externalId:i,limit:t}){const{client:o}=c(),n={geogId:e,externalId:i,limit:t};return g({queryKey:S.list(n),queryFn:async()=>await o.getSimilarNeighborhoods(n),enabled:!!e})}(t(t({},e),{},{limit:8})),s=(0,P.useMemo)(()=>{let e=[];return l&&l.most_similar?(e=l.most_similar.length<o||null==i||!i.lg?[...l.most_similar]:l.most_similar.slice(0,o),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let o="";return o=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",t(t({},i),{},{affordabilityComparison:o})}((null==l?void 0:l.affordability_index)||void 0,e))):e},[l,o,i]),d=((null==l?void 0:l.most_similar)||[]).length>4&&o<8,u=s.some(e=>void 0!==(null==e?void 0:e.affordabilityComparison));return{isLoading:a,isFetched:r,similarNeighborhoods:s,hasAffordabilityIndex:u,neighborhoodName:null==l?void 0:l.name,limit:o,minimumLimit:4,hasMore:d,viewMore:()=>{8!==o&&n(o+4)},viewLess:()=>{o<8||n(o-4)}}},H=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}({}),R=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),G=x(),V=P.createContext({}),$=()=>(0,P.useContext)(V),B=({children:e})=>{var i,t,o,n,a,r,l,s,d,c;const{sdkState:u}=I(),g=(null===(i=u.globalOptions)||void 0===i?void 0:i.locale)||"en",h=b();j(()=>{h.postEvent({eventType:H.SDK_VIEWED}),h.trackAnalyticsEvent({eventName:R.SDK_VIEWED})});const{isLoading:p,data:v}=w({location:{lat:void 0===(null===(t=u.options)||void 0===t?void 0:t.geographyId)?null===(o=u.options)||void 0===o?void 0:o.lat:void 0,lng:void 0===(null===(n=u.options)||void 0===n?void 0:n.geographyId)?null===(a=u.options)||void 0===a?void 0:a.lng:void 0},geogID:(null===(r=u.options)||void 0===r?void 0:r.geographyId)||void 0,externalId:null==u||null===(l=u.globalOptions)||void 0===l?void 0:l.externalId}),{geographyId:m,geography:f}=(0,P.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:O,hasAffordabilityIndex:_,neighborhoodName:N,limit:C,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k}=K({geogID:m,externalId:null===(s=u.globalOptions)||void 0===s?void 0:s.externalId}),L=(0,P.useMemo)(()=>p||y,[p,y]),M=(0,P.useMemo)(()=>{var e,i,t,o;return{title:null===(e=u.options)||void 0===e?void 0:e.title,limit:C,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k,isLoading:L,isFetched:x,neighborhoodName:N,similarNeighborhoods:O,hasAffordabilityIndex:_,hideAffordabilityTags:null===(i=u.options)||void 0===i?void 0:i.hideAffordabilityTags,hideAttribution:null===(t=u.options)||void 0===t?void 0:t.hideAttribution,hideThumbnails:null===(o=u.options)||void 0===o?void 0:o.hideThumbnails,locale:g,level:(null==f?void 0:f.level)||10}},[null===(d=u.options)||void 0===d?void 0:d.title,null===(c=u.options)||void 0===c?void 0:c.hideAttribution,C,D,L,x,O,_,N,g,f]);return(0,G.jsx)(V.Provider,{value:M,children:e})},F=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=d("neighborhoodMatch");return(0,G.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-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},W=()=>{const{t:e}=d("neighborhoodMatch"),i=b(),{limit:t,minimumLimit:o,hasMore:n,viewLess:a,viewMore:r}=$(),l=N();return null==l||!l.lg||!n&&t===o?null:(0,G.jsx)("div",{className:"w-full flex align-center justify-center",children:(0,G.jsxs)(O,{variant:"secondary",onClick:()=>{n&&(i.postEvent({eventType:H.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:R.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),r()),!n&&t>o&&(i.postEvent({eventType:H.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:R.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),a())},children:[n&&e("pagination.next"),!n&&t>o&&e("pagination.previous")]})})},q=i=>{let{url:o,imageSrc:n,expanded:a,onClick:r,children:l}=i,s=function(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}(i,e);const{hideThumbnails:d,hideAffordabilityTags:c}=$(),u=(0,P.useMemo)(()=>d?{}:{backgroundImage:`url(${n||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[d]),g=(0,P.useMemo)(()=>d?a?"expanded":"hidden":"normal",[d,a]);return(0,G.jsxs)("a",t(t({onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==r&&r(),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-has-url":!!o,"data-height-style":g},s),{},{children:[(!d||!c)&&(0,G.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',style:u}),l]}))},z=({children:e})=>(0,G.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",children:e}),J=({isLoading:e=!1,children:i})=>(0,G.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-is-loading":e,children:i}),U="px-2.5 pt-4 pb-6 min-h-[266px]",Q="absolute top-0 right-4",X=u({lat:y().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:y().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:l().optional(),title:v().optional(),hideAffordabilityTags:s().optional(),hideAttribution:s().optional(),hideThumbnails:s().optional()}).noUnknown(!0),p(h.neighborhoodMatch.key),i("default",()=>{var e,i,t,o,n,a,l;const{sdkState:s}=I(),d=E(),c=(null===(e=s.globalOptions)||void 0===e?void 0:e.locale)||"en",u=(0,P.useMemo)(()=>{var e,i,t,o;return null!==(e=s.options)&&void 0!==e&&e.geographyId?{geographyId:null===(i=s.options)||void 0===i?void 0:i.geographyId}:{lat:null===(t=s.options)||void 0===t?void 0:t.lat,lng:null===(o=s.options)||void 0===o?void 0:o.lng}},[null===(i=s.options)||void 0===i?void 0:i.lat,null===(t=s.options)||void 0===t?void 0:t.lng,null===(o=s.options)||void 0===o?void 0:o.geographyId]);return(0,G.jsx)(A,{children:(0,G.jsx)(D,{sdk:"Neighborhood Match",schema:X,options:s.options,children:(0,G.jsx)(m,{environment:null===(n=s.globalOptions)||void 0===n||null===(n=n.environment)||void 0===n?void 0:n.api,apiKey:s.apiKey,appearance:null===(a=s.globalOptions)||void 0===a?void 0:a.appearance,locale:null===(l=s.globalOptions)||void 0===l?void 0:l.locale,product:f.NEIGHBORHOOD_MATCH,children:(0,G.jsx)(r,{trackingPipelineSettings:{apiKey:s.apiKey||""},analyticsSettings:h.neighborhoodMatch,meta:{clientId:s.clientId,productName:f.NEIGHBORHOOD_MATCH,productVersion:"1.24.40"},attributes:{location:u,host:s.location,host_url:document.referrer,locale:c,isMobile:d},flags:{isDebugMode:!1},children:(0,G.jsx)(B,{children:(0,G.jsx)(Z,{})})})})})})})}}})}();
|
|
2
|
+
//# sourceMappingURL=NeighborhoodMatch-legacy-JIbRT5P5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeighborhoodMatch-legacy-Cki-459P.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 className={styles.text} data-is-loading={isLoading}>\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 className={styles.container}>\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-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div className={styles.imageCover} style={style} />\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 = ({ children }: { children: React.ReactNode }) => (\n <h3 className={styles.title}>{children}</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 className={styles.container} data-is-loading={isLoading}>\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 className={styles.tag}>\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":"6wDiBmBA,SAAgB,IACd,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,CAAK,UAAW,YACd,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,aAjChE,6BAA6B,EAAa,MA7CzB,UCnBhC,SAAgB,IACd,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,EAAD,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,CAAG,UDhBa,4QCgBW,kBAAiB,WACzC,EAAE,EAAmB,8BAAgC,cAAe,CACnE,mBACA,cAAe,CAAE,aAAa,QELzB,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,CAAK,UDrEgB,oDCsEnB,EAAA,EAAA,MAAC,EAAD,CAAQ,QAAQ,YAAY,QAjD1B,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,eAUA,CACG,GAAW,EAAE,oBACZ,GAAW,EAAQ,GAAgB,EAAE,6BGxDlC,EAAA,IAOI,IAPI,IACnB,EAAA,SACA,EAAA,SACA,EAAA,QACA,EAAA,SACA,GACG,EAAA,+WAAA,CAAA,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,iBAAgB,EAChB,oBAAmB,GACf,GAAA,CAAA,EAAA,UANN,GAQK,IAAmB,KACpB,EAAA,EAAA,KAAC,MAAD,CAAK,UD9Da,oQC8DwB,UAG3C,OE1EM,EAAA,EAAW,eACtB,EAAA,EAAA,KAAC,KAAD,CAAI,UDLe,0ICKW,aCDnB,EAAA,EACX,aAAY,EACZ,eAKA,EAAA,EAAA,KAAC,MAAD,CAAK,ULXkB,yIKWW,kBAAiB,EAChD,aCVQ,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,EAAD,CAAA"}
|
|
1
|
+
{"version":3,"file":"NeighborhoodMatch-legacy-JIbRT5P5.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 className={styles.text} data-is-loading={isLoading}>\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 className={styles.container}>\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-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div className={styles.imageCover} style={style} />\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 = ({ children }: { children: React.ReactNode }) => (\n <h3 className={styles.title}>{children}</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 className={styles.container} data-is-loading={isLoading}>\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 className={styles.tag}>\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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"}
|