@local-logic/sdks-app 1.24.63 → 1.24.64

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.
Files changed (265) hide show
  1. package/dist/assets/{Attribution-BsltvGRU.js → Attribution-Duhh7k4x.js} +2 -2
  2. package/dist/assets/{Attribution-BsltvGRU.js.map → Attribution-Duhh7k4x.js.map} +1 -1
  3. package/dist/assets/{Attribution-legacy-BNtn1w7h.js → Attribution-legacy-BbMLLCok.js} +2 -2
  4. package/dist/assets/{Attribution-legacy-BNtn1w7h.js.map → Attribution-legacy-BbMLLCok.js.map} +1 -1
  5. package/dist/assets/{Cluster-DtK-bXwa-B5Pbc1Sc.js → Cluster-DtK-bXwa-DGFFowZA.js} +2 -2
  6. package/dist/assets/{Cluster-DtK-bXwa-B5Pbc1Sc.js.map → Cluster-DtK-bXwa-DGFFowZA.js.map} +1 -1
  7. package/dist/assets/{Cluster-DtK-bXwa-legacy-CR_ltwaU.js → Cluster-DtK-bXwa-legacy-CRwU3yNs.js} +2 -2
  8. package/dist/assets/{Cluster-DtK-bXwa-legacy-CR_ltwaU.js.map → Cluster-DtK-bXwa-legacy-CRwU3yNs.js.map} +1 -1
  9. package/dist/assets/{Google-BWu1zjvH-SmYYPNWr.js → Google-BWu1zjvH-DRlN3_8l.js} +2 -2
  10. package/dist/assets/{Google-BWu1zjvH-SmYYPNWr.js.map → Google-BWu1zjvH-DRlN3_8l.js.map} +1 -1
  11. package/dist/assets/{Google-BWu1zjvH-legacy-DnDbinCb.js → Google-BWu1zjvH-legacy-D6N6CwVh.js} +2 -2
  12. package/dist/assets/{Google-BWu1zjvH-legacy-DnDbinCb.js.map → Google-BWu1zjvH-legacy-D6N6CwVh.js.map} +1 -1
  13. package/dist/assets/{Google-CWJnNepc-legacy-jEyNW8D9.js → Google-CWJnNepc-legacy-Bg1ArvyY.js} +2 -2
  14. package/dist/assets/{Google-CWJnNepc-legacy-jEyNW8D9.js.map → Google-CWJnNepc-legacy-Bg1ArvyY.js.map} +1 -1
  15. package/dist/assets/{Google-CWJnNepc-DN8UcJ1R.js → Google-CWJnNepc-znEMOnat.js} +2 -2
  16. package/dist/assets/{Google-CWJnNepc-DN8UcJ1R.js.map → Google-CWJnNepc-znEMOnat.js.map} +1 -1
  17. package/dist/assets/{Google-CxfcrB_--B_8lT20L.js → Google-CxfcrB_--BmYO6R-e.js} +2 -2
  18. package/dist/assets/{Google-CxfcrB_--B_8lT20L.js.map → Google-CxfcrB_--BmYO6R-e.js.map} +1 -1
  19. package/dist/assets/{Google-CxfcrB_--legacy-BIKEf6Ko.js → Google-CxfcrB_--legacy-C2uFttA5.js} +2 -2
  20. package/dist/assets/{Google-CxfcrB_--legacy-BIKEf6Ko.js.map → Google-CxfcrB_--legacy-C2uFttA5.js.map} +1 -1
  21. package/dist/assets/{Google-DJVjCEDp-BuybjgkL.js → Google-DJVjCEDp-CQJvIWAS.js} +2 -2
  22. package/dist/assets/{Google-DJVjCEDp-BuybjgkL.js.map → Google-DJVjCEDp-CQJvIWAS.js.map} +1 -1
  23. package/dist/assets/{Google-DJVjCEDp-legacy-CmJ3BbnM.js → Google-DJVjCEDp-legacy-DfLEWG8r.js} +2 -2
  24. package/dist/assets/{Google-DJVjCEDp-legacy-CmJ3BbnM.js.map → Google-DJVjCEDp-legacy-DfLEWG8r.js.map} +1 -1
  25. package/dist/assets/{Google-dS9cvzKP-J2VUtgal.js → Google-dS9cvzKP-e9BOsmNl.js} +2 -2
  26. package/dist/assets/{Google-dS9cvzKP-J2VUtgal.js.map → Google-dS9cvzKP-e9BOsmNl.js.map} +1 -1
  27. package/dist/assets/{Google-dS9cvzKP-legacy-DjMgMIio.js → Google-dS9cvzKP-legacy-CLJ4FcN0.js} +2 -2
  28. package/dist/assets/{Google-dS9cvzKP-legacy-DjMgMIio.js.map → Google-dS9cvzKP-legacy-CLJ4FcN0.js.map} +1 -1
  29. package/dist/assets/{GridGraph-CqFuBYej.js → GridGraph-C6-EwOUl.js} +2 -2
  30. package/dist/assets/{GridGraph-CqFuBYej.js.map → GridGraph-C6-EwOUl.js.map} +1 -1
  31. package/dist/assets/{GridGraph-legacy-B-ydwbji.js → GridGraph-legacy-25zMZaP_.js} +2 -2
  32. package/dist/assets/{GridGraph-legacy-B-ydwbji.js.map → GridGraph-legacy-25zMZaP_.js.map} +1 -1
  33. package/dist/assets/{LeadCapture-yB2WdcOs.js → LeadCapture-6q_e_8dX.js} +2 -2
  34. package/dist/assets/{LeadCapture-yB2WdcOs.js.map → LeadCapture-6q_e_8dX.js.map} +1 -1
  35. package/dist/assets/{LeadCapture-legacy-jIlGk8rU.js → LeadCapture-legacy-BHqcP8Iw.js} +2 -2
  36. package/dist/assets/{LeadCapture-legacy-jIlGk8rU.js.map → LeadCapture-legacy-BHqcP8Iw.js.map} +1 -1
  37. package/dist/assets/{LocalContent-BA9XaRx7.js → LocalContent-9HZ41rdH.js} +2 -2
  38. package/dist/assets/{LocalContent-BA9XaRx7.js.map → LocalContent-9HZ41rdH.js.map} +1 -1
  39. package/dist/assets/LocalContent-legacy-1srGSRaL.js +2 -0
  40. package/dist/assets/{LocalContent-legacy-ibTI5FZ4.js.map → LocalContent-legacy-1srGSRaL.js.map} +1 -1
  41. package/dist/assets/{LocalDemographics-BIytidiv.js → LocalDemographics-DWT6vil2.js} +2 -2
  42. package/dist/assets/{LocalDemographics-BIytidiv.js.map → LocalDemographics-DWT6vil2.js.map} +1 -1
  43. package/dist/assets/{LocalDemographics-legacy-C7tIK3XH.js → LocalDemographics-legacy-C645xhSC.js} +2 -2
  44. package/dist/assets/{LocalDemographics-legacy-C7tIK3XH.js.map → LocalDemographics-legacy-C645xhSC.js.map} +1 -1
  45. package/dist/assets/{Mapbox-B9pa-75a-BOtxeWGb.js → Mapbox-B9pa-75a-ClPYY137.js} +2 -2
  46. package/dist/assets/{Mapbox-B9pa-75a-BOtxeWGb.js.map → Mapbox-B9pa-75a-ClPYY137.js.map} +1 -1
  47. package/dist/assets/{Mapbox-B9pa-75a-legacy-CHrYGkGc.js → Mapbox-B9pa-75a-legacy-Dk1YPwyb.js} +2 -2
  48. package/dist/assets/{Mapbox-B9pa-75a-legacy-CHrYGkGc.js.map → Mapbox-B9pa-75a-legacy-Dk1YPwyb.js.map} +1 -1
  49. package/dist/assets/{Mapbox-BpJHQDi--DNuvIXte.js → Mapbox-BpJHQDi--CLyxuwqr.js} +2 -2
  50. package/dist/assets/{Mapbox-BpJHQDi--DNuvIXte.js.map → Mapbox-BpJHQDi--CLyxuwqr.js.map} +1 -1
  51. package/dist/assets/{Mapbox-BpJHQDi--legacy-pw96w162.js → Mapbox-BpJHQDi--legacy-DwGz9cU-.js} +2 -2
  52. package/dist/assets/{Mapbox-BpJHQDi--legacy-pw96w162.js.map → Mapbox-BpJHQDi--legacy-DwGz9cU-.js.map} +1 -1
  53. package/dist/assets/{Mapbox-BtxA3en8-3Z72nNmw.js → Mapbox-BtxA3en8-C82di8Le.js} +2 -2
  54. package/dist/assets/{Mapbox-BtxA3en8-3Z72nNmw.js.map → Mapbox-BtxA3en8-C82di8Le.js.map} +1 -1
  55. package/dist/assets/{Mapbox-BtxA3en8-legacy-CSU7NLBt.js → Mapbox-BtxA3en8-legacy-DQTm7hJ_.js} +2 -2
  56. package/dist/assets/{Mapbox-BtxA3en8-legacy-CSU7NLBt.js.map → Mapbox-BtxA3en8-legacy-DQTm7hJ_.js.map} +1 -1
  57. package/dist/assets/{Mapbox-CDUr5XKG-5ASiBTlv.js → Mapbox-CDUr5XKG-QYnXDVVu.js} +2 -2
  58. package/dist/assets/{Mapbox-CDUr5XKG-5ASiBTlv.js.map → Mapbox-CDUr5XKG-QYnXDVVu.js.map} +1 -1
  59. package/dist/assets/{Mapbox-CDUr5XKG-legacy-3huz0GR_.js → Mapbox-CDUr5XKG-legacy-B6iPzpfO.js} +2 -2
  60. package/dist/assets/{Mapbox-CDUr5XKG-legacy-3huz0GR_.js.map → Mapbox-CDUr5XKG-legacy-B6iPzpfO.js.map} +1 -1
  61. package/dist/assets/{Mapbox-DwSofiet-ILkehD5G.js → Mapbox-DwSofiet-Mmgq5D6-.js} +2 -2
  62. package/dist/assets/{Mapbox-DwSofiet-ILkehD5G.js.map → Mapbox-DwSofiet-Mmgq5D6-.js.map} +1 -1
  63. package/dist/assets/{Mapbox-DwSofiet-legacy-D3BpQm2w.js → Mapbox-DwSofiet-legacy-BoDFeBXZ.js} +2 -2
  64. package/dist/assets/{Mapbox-DwSofiet-legacy-D3BpQm2w.js.map → Mapbox-DwSofiet-legacy-BoDFeBXZ.js.map} +1 -1
  65. package/dist/assets/{Maptiler-CYFdJNvN-g3KKpHdt.js → Maptiler-CYFdJNvN-DYIrBgH6.js} +2 -2
  66. package/dist/assets/{Maptiler-CYFdJNvN-g3KKpHdt.js.map → Maptiler-CYFdJNvN-DYIrBgH6.js.map} +1 -1
  67. package/dist/assets/{Maptiler-CYFdJNvN-legacy-NhbfdVrf.js → Maptiler-CYFdJNvN-legacy-yj9pOpKs.js} +2 -2
  68. package/dist/assets/{Maptiler-CYFdJNvN-legacy-NhbfdVrf.js.map → Maptiler-CYFdJNvN-legacy-yj9pOpKs.js.map} +1 -1
  69. package/dist/assets/{Maptiler-Ce0L0Kac-CzlrjKAh.js → Maptiler-Ce0L0Kac-BTFcxDAa.js} +2 -2
  70. package/dist/assets/{Maptiler-Ce0L0Kac-CzlrjKAh.js.map → Maptiler-Ce0L0Kac-BTFcxDAa.js.map} +1 -1
  71. package/dist/assets/{Maptiler-Ce0L0Kac-legacy-DTnLJDX_.js → Maptiler-Ce0L0Kac-legacy-BmTKKLgL.js} +2 -2
  72. package/dist/assets/{Maptiler-Ce0L0Kac-legacy-DTnLJDX_.js.map → Maptiler-Ce0L0Kac-legacy-BmTKKLgL.js.map} +1 -1
  73. package/dist/assets/{Maptiler-CkoZpE04-CL-oFuER.js → Maptiler-CkoZpE04-CKOkRzwH.js} +2 -2
  74. package/dist/assets/{Maptiler-CkoZpE04-CL-oFuER.js.map → Maptiler-CkoZpE04-CKOkRzwH.js.map} +1 -1
  75. package/dist/assets/{Maptiler-CkoZpE04-legacy-CLKqb0ok.js → Maptiler-CkoZpE04-legacy-BAfeb_fR.js} +2 -2
  76. package/dist/assets/{Maptiler-CkoZpE04-legacy-CLKqb0ok.js.map → Maptiler-CkoZpE04-legacy-BAfeb_fR.js.map} +1 -1
  77. package/dist/assets/{Maptiler-CyB_-uzB-legacy-C3M4Wl83.js → Maptiler-CyB_-uzB-legacy-4okZ1sfA.js} +2 -2
  78. package/dist/assets/{Maptiler-CyB_-uzB-legacy-C3M4Wl83.js.map → Maptiler-CyB_-uzB-legacy-4okZ1sfA.js.map} +1 -1
  79. package/dist/assets/{Maptiler-CyB_-uzB-BsYYQ7sz.js → Maptiler-CyB_-uzB-vC5akwa6.js} +2 -2
  80. package/dist/assets/{Maptiler-CyB_-uzB-BsYYQ7sz.js.map → Maptiler-CyB_-uzB-vC5akwa6.js.map} +1 -1
  81. package/dist/assets/{Maptiler-DsgKmpne-DxIuH2Tl.js → Maptiler-DsgKmpne-6BzLeKc0.js} +2 -2
  82. package/dist/assets/{Maptiler-DsgKmpne-DxIuH2Tl.js.map → Maptiler-DsgKmpne-6BzLeKc0.js.map} +1 -1
  83. package/dist/assets/{Maptiler-DsgKmpne-legacy-BpEYCv0q.js → Maptiler-DsgKmpne-legacy-TqJ_TVEa.js} +2 -2
  84. package/dist/assets/{Maptiler-DsgKmpne-legacy-BpEYCv0q.js.map → Maptiler-DsgKmpne-legacy-TqJ_TVEa.js.map} +1 -1
  85. package/dist/assets/{MarkerIcon-Drkpm3bl-DI0HvpiK.js → MarkerIcon-Drkpm3bl-6CRlQtyO.js} +2 -2
  86. package/dist/assets/{MarkerIcon-Drkpm3bl-DI0HvpiK.js.map → MarkerIcon-Drkpm3bl-6CRlQtyO.js.map} +1 -1
  87. package/dist/assets/{MarkerIcon-Drkpm3bl-legacy-CjOJi2BD.js → MarkerIcon-Drkpm3bl-legacy-BKTQZxwz.js} +2 -2
  88. package/dist/assets/{MarkerIcon-Drkpm3bl-legacy-CjOJi2BD.js.map → MarkerIcon-Drkpm3bl-legacy-BKTQZxwz.js.map} +1 -1
  89. package/dist/assets/{NeighborhoodCard-BdTDM3-D.js → NeighborhoodCard-C_-8FpDl.js} +2 -2
  90. package/dist/assets/{NeighborhoodCard-BdTDM3-D.js.map → NeighborhoodCard-C_-8FpDl.js.map} +1 -1
  91. package/dist/assets/{NeighborhoodCard-legacy-DvpbnJ6S.js → NeighborhoodCard-legacy-DW4x82H7.js} +2 -2
  92. package/dist/assets/{NeighborhoodCard-legacy-DvpbnJ6S.js.map → NeighborhoodCard-legacy-DW4x82H7.js.map} +1 -1
  93. package/dist/assets/{NeighborhoodCharacteristics-Ook5N1T2.js → NeighborhoodCharacteristics-BGdxNjXv.js} +2 -2
  94. package/dist/assets/{NeighborhoodCharacteristics-Ook5N1T2.js.map → NeighborhoodCharacteristics-BGdxNjXv.js.map} +1 -1
  95. package/dist/assets/{NeighborhoodCharacteristics-legacy-D3KCHmoq.js → NeighborhoodCharacteristics-legacy-DVi_mvql.js} +2 -2
  96. package/dist/assets/{NeighborhoodCharacteristics-legacy-D3KCHmoq.js.map → NeighborhoodCharacteristics-legacy-DVi_mvql.js.map} +1 -1
  97. package/dist/assets/{NeighborhoodDemographics-CTpC3jE7.js → NeighborhoodDemographics-Bl2aRgAD.js} +2 -2
  98. package/dist/assets/{NeighborhoodDemographics-CTpC3jE7.js.map → NeighborhoodDemographics-Bl2aRgAD.js.map} +1 -1
  99. package/dist/assets/{NeighborhoodDemographics-legacy-DgcM1GAK.js → NeighborhoodDemographics-legacy-C6PkQmoB.js} +2 -2
  100. package/dist/assets/{NeighborhoodDemographics-legacy-DgcM1GAK.js.map → NeighborhoodDemographics-legacy-C6PkQmoB.js.map} +1 -1
  101. package/dist/assets/{NeighborhoodFeatured-BKynIDFO.js → NeighborhoodFeatured-C0qVWedw.js} +2 -2
  102. package/dist/assets/{NeighborhoodFeatured-BKynIDFO.js.map → NeighborhoodFeatured-C0qVWedw.js.map} +1 -1
  103. package/dist/assets/{NeighborhoodFeatured-legacy-DlwdffhT.js → NeighborhoodFeatured-legacy-BcjeyOc7.js} +2 -2
  104. package/dist/assets/{NeighborhoodFeatured-legacy-DlwdffhT.js.map → NeighborhoodFeatured-legacy-BcjeyOc7.js.map} +1 -1
  105. package/dist/assets/{NeighborhoodHero-BcdgrQtP.js → NeighborhoodHero-BSMivGqs.js} +2 -2
  106. package/dist/assets/{NeighborhoodHero-BcdgrQtP.js.map → NeighborhoodHero-BSMivGqs.js.map} +1 -1
  107. package/dist/assets/{NeighborhoodHero-legacy-CfCrSS6Z.js → NeighborhoodHero-legacy-CVItTB2U.js} +2 -2
  108. package/dist/assets/{NeighborhoodHero-legacy-CfCrSS6Z.js.map → NeighborhoodHero-legacy-CVItTB2U.js.map} +1 -1
  109. package/dist/assets/{NeighborhoodHighlights-C3maAwKP.js → NeighborhoodHighlights-BhVYsA3-.js} +2 -2
  110. package/dist/assets/{NeighborhoodHighlights-C3maAwKP.js.map → NeighborhoodHighlights-BhVYsA3-.js.map} +1 -1
  111. package/dist/assets/{NeighborhoodHighlights-legacy-CALvujpk.js → NeighborhoodHighlights-legacy-Do2PVQvq.js} +2 -2
  112. package/dist/assets/{NeighborhoodHighlights-legacy-CALvujpk.js.map → NeighborhoodHighlights-legacy-Do2PVQvq.js.map} +1 -1
  113. package/dist/assets/{NeighborhoodMap-CT8veCNl.js → NeighborhoodMap-D6OihpAJ.js} +2 -2
  114. package/dist/assets/{NeighborhoodMap-CT8veCNl.js.map → NeighborhoodMap-D6OihpAJ.js.map} +1 -1
  115. package/dist/assets/{NeighborhoodMap-legacy-CSmAZuD2.js → NeighborhoodMap-legacy-Dzr11Edf.js} +2 -2
  116. package/dist/assets/{NeighborhoodMap-legacy-CSmAZuD2.js.map → NeighborhoodMap-legacy-Dzr11Edf.js.map} +1 -1
  117. package/dist/assets/{NeighborhoodMarketTrends-DLlvQnd2.js → NeighborhoodMarketTrends-BYLv7ssD.js} +3 -3
  118. package/dist/assets/{NeighborhoodMarketTrends-DLlvQnd2.js.map → NeighborhoodMarketTrends-BYLv7ssD.js.map} +1 -1
  119. package/dist/assets/{NeighborhoodMarketTrends-legacy-DA5VImYp.js → NeighborhoodMarketTrends-legacy-D4CqgzKy.js} +2 -2
  120. package/dist/assets/{NeighborhoodMarketTrends-legacy-DA5VImYp.js.map → NeighborhoodMarketTrends-legacy-D4CqgzKy.js.map} +1 -1
  121. package/dist/assets/{NeighborhoodMatch-zUWSiNi8.js → NeighborhoodMatch-2dDNoHEC.js} +2 -2
  122. package/dist/assets/{NeighborhoodMatch-zUWSiNi8.js.map → NeighborhoodMatch-2dDNoHEC.js.map} +1 -1
  123. package/dist/assets/{NeighborhoodMatch-legacy-BkhxK-bz.js → NeighborhoodMatch-legacy-DSUP8S00.js} +2 -2
  124. package/dist/assets/{NeighborhoodMatch-legacy-BkhxK-bz.js.map → NeighborhoodMatch-legacy-DSUP8S00.js.map} +1 -1
  125. package/dist/assets/{NeighborhoodPropertyValueDrivers-0Zr-7AQ9.js → NeighborhoodPropertyValueDrivers-BbkPB6Ts.js} +2 -2
  126. package/dist/assets/{NeighborhoodPropertyValueDrivers-0Zr-7AQ9.js.map → NeighborhoodPropertyValueDrivers-BbkPB6Ts.js.map} +1 -1
  127. package/dist/assets/{NeighborhoodPropertyValueDrivers-legacy-yQwTbIN8.js → NeighborhoodPropertyValueDrivers-legacy-D62occGi.js} +2 -2
  128. package/dist/assets/{NeighborhoodPropertyValueDrivers-legacy-yQwTbIN8.js.map → NeighborhoodPropertyValueDrivers-legacy-D62occGi.js.map} +1 -1
  129. package/dist/assets/{NeighborhoodSchools-legacy-CTG5Nbpw.js → NeighborhoodSchools-legacy-CRJgyQRJ.js} +2 -2
  130. package/dist/assets/{NeighborhoodSchools-legacy-CTG5Nbpw.js.map → NeighborhoodSchools-legacy-CRJgyQRJ.js.map} +1 -1
  131. package/dist/assets/{NeighborhoodSchools-DFUvz0LY.js → NeighborhoodSchools-zyjBTcAS.js} +2 -2
  132. package/dist/assets/{NeighborhoodSchools-DFUvz0LY.js.map → NeighborhoodSchools-zyjBTcAS.js.map} +1 -1
  133. package/dist/assets/{NeighborhoodShowcase-BxcWXdht.js → NeighborhoodShowcase-DkqbmfHO.js} +2 -2
  134. package/dist/assets/{NeighborhoodShowcase-BxcWXdht.js.map → NeighborhoodShowcase-DkqbmfHO.js.map} +1 -1
  135. package/dist/assets/{NeighborhoodShowcase-legacy-Ciwbw3YX.js → NeighborhoodShowcase-legacy-CztESO-F.js} +2 -2
  136. package/dist/assets/{NeighborhoodShowcase-legacy-Ciwbw3YX.js.map → NeighborhoodShowcase-legacy-CztESO-F.js.map} +1 -1
  137. package/dist/assets/{NoDataContent-K8RstIPw.js → NoDataContent-BOVv2wDG.js} +2 -2
  138. package/dist/assets/{NoDataContent-K8RstIPw.js.map → NoDataContent-BOVv2wDG.js.map} +1 -1
  139. package/dist/assets/{NoDataContent-legacy-CzU5MBcr.js → NoDataContent-legacy-C3AeyeSg.js} +2 -2
  140. package/dist/assets/{NoDataContent-legacy-CzU5MBcr.js.map → NoDataContent-legacy-C3AeyeSg.js.map} +1 -1
  141. package/dist/assets/{ResizeWrapper-iptN_OTD.js → ResizeWrapper-Bhg67yfB.js} +2 -2
  142. package/dist/assets/{ResizeWrapper-iptN_OTD.js.map → ResizeWrapper-Bhg67yfB.js.map} +1 -1
  143. package/dist/assets/{ResizeWrapper-legacy-OscRVVIk.js → ResizeWrapper-legacy-F6SJE_TA.js} +2 -2
  144. package/dist/assets/{ResizeWrapper-legacy-OscRVVIk.js.map → ResizeWrapper-legacy-F6SJE_TA.js.map} +1 -1
  145. package/dist/assets/{ScoreCardList-BGFtynWY.js → ScoreCardList-DReE0M82.js} +2 -2
  146. package/dist/assets/{ScoreCardList-BGFtynWY.js.map → ScoreCardList-DReE0M82.js.map} +1 -1
  147. package/dist/assets/{ScoreCardList-legacy-DkYwRt8q.js → ScoreCardList-legacy-B-Iw3TWS.js} +2 -2
  148. package/dist/assets/{ScoreCardList-legacy-DkYwRt8q.js.map → ScoreCardList-legacy-B-Iw3TWS.js.map} +1 -1
  149. package/dist/assets/{ScoreIcon-legacy-CKB6p9iW.js → ScoreIcon-legacy-Ds3IYvwY.js} +2 -2
  150. package/dist/assets/{ScoreIcon-legacy-CKB6p9iW.js.map → ScoreIcon-legacy-Ds3IYvwY.js.map} +1 -1
  151. package/dist/assets/{ScoreIcon-BGcwqtBH.js → ScoreIcon-qr7Dyd1_.js} +2 -2
  152. package/dist/assets/{ScoreIcon-BGcwqtBH.js.map → ScoreIcon-qr7Dyd1_.js.map} +1 -1
  153. package/dist/assets/{Testing-BQ7AFsvh-B0zjSsQX.js → Testing-BQ7AFsvh-DFMBrZvz.js} +2 -2
  154. package/dist/assets/{Testing-BQ7AFsvh-B0zjSsQX.js.map → Testing-BQ7AFsvh-DFMBrZvz.js.map} +1 -1
  155. package/dist/assets/{Testing-BQ7AFsvh-legacy-DWyP-TZm.js → Testing-BQ7AFsvh-legacy-u-xLnoNh.js} +2 -2
  156. package/dist/assets/{Testing-BQ7AFsvh-legacy-DWyP-TZm.js.map → Testing-BQ7AFsvh-legacy-u-xLnoNh.js.map} +1 -1
  157. package/dist/assets/{Testing-CZDor_UM-DKHyShOL.js → Testing-CZDor_UM-BXoIFD2V.js} +2 -2
  158. package/dist/assets/{Testing-CZDor_UM-DKHyShOL.js.map → Testing-CZDor_UM-BXoIFD2V.js.map} +1 -1
  159. package/dist/assets/{Testing-CZDor_UM-legacy-DYOc_7jJ.js → Testing-CZDor_UM-legacy-nUkPPr7r.js} +2 -2
  160. package/dist/assets/{Testing-CZDor_UM-legacy-DYOc_7jJ.js.map → Testing-CZDor_UM-legacy-nUkPPr7r.js.map} +1 -1
  161. package/dist/assets/{Testing-CxwUbSxG-Vw-NLu0P.js → Testing-CxwUbSxG-Bht4ySMN.js} +2 -2
  162. package/dist/assets/{Testing-CxwUbSxG-Vw-NLu0P.js.map → Testing-CxwUbSxG-Bht4ySMN.js.map} +1 -1
  163. package/dist/assets/{Testing-CxwUbSxG-legacy-Dpbq1Bh4.js → Testing-CxwUbSxG-legacy-CW2pKq5L.js} +2 -2
  164. package/dist/assets/{Testing-CxwUbSxG-legacy-Dpbq1Bh4.js.map → Testing-CxwUbSxG-legacy-CW2pKq5L.js.map} +1 -1
  165. package/dist/assets/{Testing-vfABKYEg-legacy-BpzPtqgn.js → Testing-vfABKYEg-legacy-CAaWJ3i7.js} +2 -2
  166. package/dist/assets/{Testing-vfABKYEg-legacy-BpzPtqgn.js.map → Testing-vfABKYEg-legacy-CAaWJ3i7.js.map} +1 -1
  167. package/dist/assets/{Testing-vfABKYEg-BEq8jFJw.js → Testing-vfABKYEg-nwKJxiQ-.js} +2 -2
  168. package/dist/assets/{Testing-vfABKYEg-BEq8jFJw.js.map → Testing-vfABKYEg-nwKJxiQ-.js.map} +1 -1
  169. package/dist/assets/{Testing-wan6urXy-PZYC8nyQ.js → Testing-wan6urXy-B0sm4u_j.js} +2 -2
  170. package/dist/assets/{Testing-wan6urXy-PZYC8nyQ.js.map → Testing-wan6urXy-B0sm4u_j.js.map} +1 -1
  171. package/dist/assets/{Testing-wan6urXy-legacy-CKFpdCQ6.js → Testing-wan6urXy-legacy-CQ0zqTGx.js} +2 -2
  172. package/dist/assets/{Testing-wan6urXy-legacy-CKFpdCQ6.js.map → Testing-wan6urXy-legacy-CQ0zqTGx.js.map} +1 -1
  173. package/dist/assets/{TitleHeader-BZ-WJqqQ.js → TitleHeader-DqQxUayY.js} +2 -2
  174. package/dist/assets/{TitleHeader-BZ-WJqqQ.js.map → TitleHeader-DqQxUayY.js.map} +1 -1
  175. package/dist/assets/{TitleHeader-legacy-VTfonLLs.js → TitleHeader-legacy-pLHeIO4_.js} +2 -2
  176. package/dist/assets/{TitleHeader-legacy-VTfonLLs.js.map → TitleHeader-legacy-pLHeIO4_.js.map} +1 -1
  177. package/dist/assets/{Trans-DJmgQYxZ.js → Trans-BLu0zcU1.js} +2 -2
  178. package/dist/assets/{Trans-DJmgQYxZ.js.map → Trans-BLu0zcU1.js.map} +1 -1
  179. package/dist/assets/{Trans-legacy-DfM0QowQ.js → Trans-legacy-CQPgpMfP.js} +2 -2
  180. package/dist/assets/{Trans-legacy-DfM0QowQ.js.map → Trans-legacy-CQPgpMfP.js.map} +1 -1
  181. package/dist/assets/{ValidateOptions-BOHq0NLG.js → ValidateOptions-BivAr3ZH.js} +2 -2
  182. package/dist/assets/{ValidateOptions-BOHq0NLG.js.map → ValidateOptions-BivAr3ZH.js.map} +1 -1
  183. package/dist/assets/{ValidateOptions-legacy-CRx_un0J.js → ValidateOptions-legacy-B4kQEpo7.js} +2 -2
  184. package/dist/assets/{ValidateOptions-legacy-CRx_un0J.js.map → ValidateOptions-legacy-B4kQEpo7.js.map} +1 -1
  185. package/dist/assets/{dist-DjT90Vie.js → dist-JadUzcvL.js} +2 -2
  186. package/dist/assets/{dist-DjT90Vie.js.map → dist-JadUzcvL.js.map} +1 -1
  187. package/dist/assets/{dist-legacy-C6cEG2G4.js → dist-legacy-6uOt0Yh8.js} +2 -2
  188. package/dist/assets/{dist-legacy-C6cEG2G4.js.map → dist-legacy-6uOt0Yh8.js.map} +1 -1
  189. package/dist/assets/{getMapProviderConfig-CLYWizpG.js → getMapProviderConfig-DNFSt_ai.js} +3 -3
  190. package/dist/assets/{getMapProviderConfig-CLYWizpG.js.map → getMapProviderConfig-DNFSt_ai.js.map} +1 -1
  191. package/dist/assets/{getMapProviderConfig-legacy-BqZuG0-K.js → getMapProviderConfig-legacy-DRwYzoDU.js} +2 -2
  192. package/dist/assets/{getMapProviderConfig-legacy-BqZuG0-K.js.map → getMapProviderConfig-legacy-DRwYzoDU.js.map} +1 -1
  193. package/dist/assets/{getPaddedBounds-FpsQymJC-CamcKdIj.js → getPaddedBounds-FpsQymJC--V91KbDr.js} +2 -2
  194. package/dist/assets/{getPaddedBounds-FpsQymJC-CamcKdIj.js.map → getPaddedBounds-FpsQymJC--V91KbDr.js.map} +1 -1
  195. package/dist/assets/{getPaddedBounds-FpsQymJC-legacy-TefV3FWy.js → getPaddedBounds-FpsQymJC-legacy-BAfRrfiC.js} +2 -2
  196. package/dist/assets/{getPaddedBounds-FpsQymJC-legacy-TefV3FWy.js.map → getPaddedBounds-FpsQymJC-legacy-BAfRrfiC.js.map} +1 -1
  197. package/dist/assets/{index-BLDMLEaX.js → index-DHfBmUAQ.js} +3 -3
  198. package/dist/assets/{index-BLDMLEaX.js.map → index-DHfBmUAQ.js.map} +1 -1
  199. package/dist/assets/{index-legacy-BzMlHwaA.js → index-legacy-CdRffLlb.js} +2 -2
  200. package/dist/assets/{index-legacy-BzMlHwaA.js.map → index-legacy-CdRffLlb.js.map} +1 -1
  201. package/dist/assets/{index.es-D680q4E2.js → index.es-B0TyuPgo.js} +2 -2
  202. package/dist/assets/{index.es-D680q4E2.js.map → index.es-B0TyuPgo.js.map} +1 -1
  203. package/dist/assets/{index.es-legacy-CLQaVm5G.js → index.es-legacy-DGBuVsHM.js} +2 -2
  204. package/dist/assets/{index.es-legacy-CLQaVm5G.js.map → index.es-legacy-DGBuVsHM.js.map} +1 -1
  205. package/dist/assets/{mapbox-BiIB2Zbq-DgXGTLoF.js → mapbox-BiIB2Zbq-gUZoKTZh.js} +2 -2
  206. package/dist/assets/{mapbox-BiIB2Zbq-DgXGTLoF.js.map → mapbox-BiIB2Zbq-gUZoKTZh.js.map} +1 -1
  207. package/dist/assets/{mapbox-BiIB2Zbq-legacy-CWG67TM7.js → mapbox-BiIB2Zbq-legacy-BzLqYdgk.js} +2 -2
  208. package/dist/assets/{mapbox-BiIB2Zbq-legacy-CWG67TM7.js.map → mapbox-BiIB2Zbq-legacy-BzLqYdgk.js.map} +1 -1
  209. package/dist/assets/{maplibre-Cx0I-z8h-CKf-PaNJ.js → maplibre-Cx0I-z8h-CpfLgNDU.js} +2 -2
  210. package/dist/assets/{maplibre-Cx0I-z8h-CKf-PaNJ.js.map → maplibre-Cx0I-z8h-CpfLgNDU.js.map} +1 -1
  211. package/dist/assets/{maplibre-Cx0I-z8h-legacy-BLv0jU9u.js → maplibre-Cx0I-z8h-legacy-DNmyXE2u.js} +2 -2
  212. package/dist/assets/{maplibre-Cx0I-z8h-legacy-BLv0jU9u.js.map → maplibre-Cx0I-z8h-legacy-DNmyXE2u.js.map} +1 -1
  213. package/dist/assets/neighborhood-fallback-Bx8UkjEB.js.map +1 -1
  214. package/dist/assets/{sdks-COqbeKyR.js → sdks-e3TteF4P.js} +2 -2
  215. package/dist/assets/{sdks-COqbeKyR.js.map → sdks-e3TteF4P.js.map} +1 -1
  216. package/dist/assets/{sdks-legacy-DQ7jLJZE.js → sdks-legacy-BcdXj8R9.js} +2 -2
  217. package/dist/assets/{sdks-legacy-DQ7jLJZE.js.map → sdks-legacy-BcdXj8R9.js.map} +1 -1
  218. package/dist/assets/{styles-DCI3UJny-DrJgfl7H.js → styles-DCI3UJny-OwNwQYJv.js} +2 -2
  219. package/dist/assets/{styles-DCI3UJny-DrJgfl7H.js.map → styles-DCI3UJny-OwNwQYJv.js.map} +1 -1
  220. package/dist/assets/{styles-DCI3UJny-legacy-Dw44-3MI.js → styles-DCI3UJny-legacy-BfzvePT0.js} +2 -2
  221. package/dist/assets/{styles-DCI3UJny-legacy-Dw44-3MI.js.map → styles-DCI3UJny-legacy-BfzvePT0.js.map} +1 -1
  222. package/dist/assets/{styles-DMA_7NV0-D3y1DeLZ.js → styles-DMA_7NV0-CJzE42wT.js} +2 -2
  223. package/dist/assets/{styles-DMA_7NV0-D3y1DeLZ.js.map → styles-DMA_7NV0-CJzE42wT.js.map} +1 -1
  224. package/dist/assets/{styles-DMA_7NV0-legacy-CYkSS_lc.js → styles-DMA_7NV0-legacy-DO9L0b_C.js} +2 -2
  225. package/dist/assets/{styles-DMA_7NV0-legacy-CYkSS_lc.js.map → styles-DMA_7NV0-legacy-DO9L0b_C.js.map} +1 -1
  226. package/dist/assets/{useDemographicsData-DbxsBDeY.js → useDemographicsData-C4iCuplI.js} +2 -2
  227. package/dist/assets/{useDemographicsData-DbxsBDeY.js.map → useDemographicsData-C4iCuplI.js.map} +1 -1
  228. package/dist/assets/{useDemographicsData-legacy-CG3XHkyh.js → useDemographicsData-legacy-OsSaC0p-.js} +2 -2
  229. package/dist/assets/{useDemographicsData-legacy-CG3XHkyh.js.map → useDemographicsData-legacy-OsSaC0p-.js.map} +1 -1
  230. package/dist/assets/{useGeographies-Ca5nEDBN.js → useGeographies-Dbxf3asb.js} +2 -2
  231. package/dist/assets/{useGeographies-Ca5nEDBN.js.map → useGeographies-Dbxf3asb.js.map} +1 -1
  232. package/dist/assets/{useGeographies-legacy-CcWz8DvM.js → useGeographies-legacy-BFHs291p.js} +2 -2
  233. package/dist/assets/{useGeographies-legacy-CcWz8DvM.js.map → useGeographies-legacy-BFHs291p.js.map} +1 -1
  234. package/dist/assets/{useIsMobile-Bxsws0pn.js → useIsMobile-DNaqDzbl.js} +2 -2
  235. package/dist/assets/{useIsMobile-Bxsws0pn.js.map → useIsMobile-DNaqDzbl.js.map} +1 -1
  236. package/dist/assets/{useIsMobile-legacy-zb8bPQUw.js → useIsMobile-legacy-B6-NPP6W.js} +2 -2
  237. package/dist/assets/{useIsMobile-legacy-zb8bPQUw.js.map → useIsMobile-legacy-B6-NPP6W.js.map} +1 -1
  238. package/dist/assets/{useLocation-Cw-YxWBt.js → useLocation-ZUEWhDQZ.js} +2 -2
  239. package/dist/assets/{useLocation-Cw-YxWBt.js.map → useLocation-ZUEWhDQZ.js.map} +1 -1
  240. package/dist/assets/{useLocation-legacy-DROxjKYy.js → useLocation-legacy-DwBFDrsA.js} +2 -2
  241. package/dist/assets/{useLocation-legacy-DROxjKYy.js.map → useLocation-legacy-DwBFDrsA.js.map} +1 -1
  242. package/dist/assets/{useProfiles-8Z_GZOzb.js → useProfiles-BIFSAlrA.js} +2 -2
  243. package/dist/assets/{useProfiles-8Z_GZOzb.js.map → useProfiles-BIFSAlrA.js.map} +1 -1
  244. package/dist/assets/{useProfiles-legacy-C4_roJUq.js → useProfiles-legacy-DAWflSgN.js} +2 -2
  245. package/dist/assets/{useProfiles-legacy-C4_roJUq.js.map → useProfiles-legacy-DAWflSgN.js.map} +1 -1
  246. package/dist/assets/{useSchools-legacy-T6pvbGsp.js → useSchools-legacy-CgZHAzMa.js} +2 -2
  247. package/dist/assets/{useSchools-legacy-T6pvbGsp.js.map → useSchools-legacy-CgZHAzMa.js.map} +1 -1
  248. package/dist/assets/{useSchools-DyrTKmXR.js → useSchools-qUQmMbTk.js} +2 -2
  249. package/dist/assets/{useSchools-DyrTKmXR.js.map → useSchools-qUQmMbTk.js.map} +1 -1
  250. package/dist/assets/{useScores--bTvRnnj.js → useScores-C2l0EkUs.js} +2 -2
  251. package/dist/assets/{useScores--bTvRnnj.js.map → useScores-C2l0EkUs.js.map} +1 -1
  252. package/dist/assets/{useScores-legacy-C2gadPY-.js → useScores-legacy-BtI93V2X.js} +2 -2
  253. package/dist/assets/{useScores-legacy-C2gadPY-.js.map → useScores-legacy-BtI93V2X.js.map} +1 -1
  254. package/dist/assets/{utils-CV8G-gCd-CCr0oecj.js → utils-CV8G-gCd-BA5hEMgo.js} +2 -2
  255. package/dist/assets/{utils-CV8G-gCd-CCr0oecj.js.map → utils-CV8G-gCd-BA5hEMgo.js.map} +1 -1
  256. package/dist/assets/{utils-CV8G-gCd-legacy-DwIJ3EdU.js → utils-CV8G-gCd-legacy-C6n6__tU.js} +2 -2
  257. package/dist/assets/{utils-CV8G-gCd-legacy-DwIJ3EdU.js.map → utils-CV8G-gCd-legacy-C6n6__tU.js.map} +1 -1
  258. package/dist/index.html +2 -2
  259. package/dist/types/sdks/LocalContent/components/Sidebar/Root/ScoreDetails/index.d.ts.map +1 -1
  260. package/dist/types/sdks/LocalContent/components/Sidebar/Root/ScoreDetails/index.js +3 -1
  261. package/dist/types/sdks/LocalContent/components/Sidebar/Root/ScoreDetails/index.js.map +1 -1
  262. package/dist/types/sdks/LocalContent/components/Sidebar/Root/ScoreDetails/index.test.js +24 -0
  263. package/dist/types/sdks/LocalContent/components/Sidebar/Root/ScoreDetails/index.test.js.map +1 -1
  264. package/package.json +1 -1
  265. package/dist/assets/LocalContent-legacy-ibTI5FZ4.js +0 -2
@@ -1,2 +1,2 @@
1
- import{a as e}from"./rolldown-runtime-BEU_UCik.js";import{l as i}from"./google-maps-vendor-BeDgURNz.js";import{a as t,c as o,d as a,f as n,g as r,h as s,i as d,m as l,n as h,o as g,p as c,r as m,t as p,u}from"./sdks-COqbeKyR.js";import{Y as b,i as f,n as v}from"./index-BLDMLEaX.js";import{a as y,r as x}from"./index.es-D680q4E2.js";import{t as I}from"./useGeographies-Ca5nEDBN.js";import{t as _}from"./useResponsiveBreakpoints-DjnptSN9.js";import{t as j}from"./Attribution-BsltvGRU.js";/* empty css */import{t as N}from"./ResizeWrapper-iptN_OTD.js";import{t as A}from"./ValidateOptions-BOHq0NLG.js";import{t as C}from"./useIsMobile-Bxsws0pn.js";import{t as w}from"./TitleHeader-BZ-WJqqQ.js";import{n as D,t as O}from"./ScoreCardList-BGFtynWY.js";import{t as E}from"./NoDataContent-K8RstIPw.js";import{t as L}from"./neighborhood-fallback-Bx8UkjEB.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:r}=function({geogID:e,externalId:i,limit:t}){const{client:o}=d(),a={geogId:e,externalId:i,limit:t};return s({queryKey:k.list(a),queryFn:async()=>await o.getSimilarNeighborhoods(a),enabled:!!e})}({...e,limit:8}),l=(0,M.useMemo)(()=>{let e=[];return r&&r.most_similar?(e=r.most_similar.length<t||!i?.lg?[...r.most_similar]:r.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",{...i,affordabilityComparison:t}}(r?.affordability_index||void 0,e))):e},[r,t,i]),h=(r?.most_similar||[]).length>4&&t<8,g=l.some(e=>void 0!==e?.affordabilityComparison);return{isLoading:a,isFetched:n,similarNeighborhoods:l,hasAffordabilityIndex:g,neighborhoodName:r?.name,limit:t,minimumLimit:4,hasMore:h,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},K=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),H=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),R=b(),G=M.createContext({}),S=()=>(0,M.useContext)(G),P=({children:e})=>{const{sdkState:i}=v(),t=i.globalOptions?.locale||"en",o=g();f(()=>{o.postEvent({eventType:K.SDK_VIEWED}),o.trackAnalyticsEvent({eventName:H.SDK_VIEWED})});const{isLoading:a,data:n}=I({location:{lat:void 0===i.options?.geographyId?i.options?.lat:void 0,lng:void 0===i.options?.geographyId?i.options?.lng:void 0},geogID:i.options?.geographyId||void 0,externalId:i?.globalOptions?.externalId}),{geographyId:r,geography:s}=(0,M.useMemo)(()=>{const e=Object.entries(n||{});return{geographyId:e[0]?.[0],geography:e[0]?.[1]}},[a,n]),{isLoading:d,isFetched:l,similarNeighborhoods:h,hasAffordabilityIndex:c,neighborhoodName:m,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x}=T({geogID:r,externalId:i.globalOptions?.externalId}),_=(0,M.useMemo)(()=>a||d,[a,d]),j=(0,M.useMemo)(()=>({title:i.options?.title,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x,isLoading:_,isFetched:l,neighborhoodName:m,similarNeighborhoods:h,hasAffordabilityIndex:c,hideAffordabilityTags:i.options?.hideAffordabilityTags,hideAttribution:i.options?.hideAttribution,hideThumbnails:i.options?.hideThumbnails,locale:t,level:s?.level||10}),[i.options?.title,i.options?.hideAttribution,p,b,_,l,h,c,m,t,s]);return(0,R.jsx)(G.Provider,{value:j,children:e})},V=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=r("neighborhoodMatch");return(0,R.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},$=()=>{const{t:e}=r("neighborhoodMatch"),i=g(),{limit:t,minimumLimit:o,hasMore:a,viewLess:n,viewMore:s}=S(),d=_();return!d?.lg||!a&&t===o?null:(0,R.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,R.jsxs)(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"}}),n())},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(),d=(0,M.useMemo)(()=>r?{}:{backgroundImage:`url(${i||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[r]),l=(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-testid":"neighborhood-match-card","data-has-url":!!e,"data-height-style":l,...n,children:[(!r||!s)&&(0,R.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:d}),a]})},F=({children:e,...i})=>(0,R.jsx)("h3",{className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title",...i,children:e}),W=({isLoading:e=!1,children:i})=>(0,R.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),q="px-2.5 pt-4 pb-6 min-h-[266px]";function z(){const{t:e}=r(["neighborhoodMatch","common"]),i=g(),{isFetched:t,isLoading:o,similarNeighborhoods:a,hasAffordabilityIndex:n,hideAffordabilityTags:s}=S();return t&&0===a.length?(0,R.jsx)(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:n,children:[void 0!==t.affordabilityComparison&&(0,R.jsx)("div",{className:"absolute top-0 right-4","data-testid":"neighborhood-match-affordability-tag",children:(0,R.jsx)(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}=r(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:a,neighborhoodName:n,hideAttribution:s}=S();return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(w,{title:"string"==typeof i||!1===i?i:e("title",{context:a})}),(0,R.jsx)(V,{neighborhoodName:n,isLoading:o}),(0,R.jsx)(z,{}),(0,R.jsx)($,{}),(0,R.jsx)(j,{sdkName:"neighborhood-match",locale:t,isHidden:s})]})}var U=u({lat:a().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:a().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:n().optional(),title:l().optional(),hideAffordabilityTags:c().optional(),hideAttribution:c().optional(),hideThumbnails:c().optional()}).noUnknown(!0);o(h.neighborhoodMatch.key);var Y=()=>{const{sdkState:e}=v(),i=C(),o=e.globalOptions?.locale||"en",a=(0,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)(m,{environment:e.globalOptions?.environment?.api,apiKey:e.apiKey,appearance:e.globalOptions?.appearance,locale:e.globalOptions?.locale,product:p.NEIGHBORHOOD_MATCH,children:(0,R.jsx)(t,{trackingPipelineSettings:{apiKey:e.apiKey||""},analyticsSettings:h.neighborhoodMatch,meta:{clientId:e.clientId,productName:p.NEIGHBORHOOD_MATCH,productVersion:"1.24.63"},attributes:{location:a,host:e.location,host_url:document.referrer,locale:o,isMobile:i},flags:{isDebugMode:!1},children:(0,R.jsx)(P,{children:(0,R.jsx)(J,{})})})})})})};export{Y as default};
2
- //# sourceMappingURL=NeighborhoodMatch-zUWSiNi8.js.map
1
+ import{a as e}from"./rolldown-runtime-BEU_UCik.js";import{l as i}from"./google-maps-vendor-BeDgURNz.js";import{a as t,c as o,d as a,f as n,g as r,h as s,i as d,m as l,n as h,o as g,p as c,r as m,t as p,u}from"./sdks-e3TteF4P.js";import{Y as b,i as f,n as v}from"./index-DHfBmUAQ.js";import{a as y,r as x}from"./index.es-B0TyuPgo.js";import{t as I}from"./useGeographies-Dbxf3asb.js";import{t as _}from"./useResponsiveBreakpoints-DjnptSN9.js";import{t as j}from"./Attribution-Duhh7k4x.js";/* empty css */import{t as N}from"./ResizeWrapper-Bhg67yfB.js";import{t as A}from"./ValidateOptions-BivAr3ZH.js";import{t as C}from"./useIsMobile-DNaqDzbl.js";import{t as w}from"./TitleHeader-DqQxUayY.js";import{n as D,t as O}from"./ScoreCardList-DReE0M82.js";import{t as E}from"./NoDataContent-BOVv2wDG.js";import{t as L}from"./neighborhood-fallback-Bx8UkjEB.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:r}=function({geogID:e,externalId:i,limit:t}){const{client:o}=d(),a={geogId:e,externalId:i,limit:t};return s({queryKey:k.list(a),queryFn:async()=>await o.getSimilarNeighborhoods(a),enabled:!!e})}({...e,limit:8}),l=(0,M.useMemo)(()=>{let e=[];return r&&r.most_similar?(e=r.most_similar.length<t||!i?.lg?[...r.most_similar]:r.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",{...i,affordabilityComparison:t}}(r?.affordability_index||void 0,e))):e},[r,t,i]),h=(r?.most_similar||[]).length>4&&t<8,g=l.some(e=>void 0!==e?.affordabilityComparison);return{isLoading:a,isFetched:n,similarNeighborhoods:l,hasAffordabilityIndex:g,neighborhoodName:r?.name,limit:t,minimumLimit:4,hasMore:h,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},K=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),H=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),R=b(),G=M.createContext({}),S=()=>(0,M.useContext)(G),P=({children:e})=>{const{sdkState:i}=v(),t=i.globalOptions?.locale||"en",o=g();f(()=>{o.postEvent({eventType:K.SDK_VIEWED}),o.trackAnalyticsEvent({eventName:H.SDK_VIEWED})});const{isLoading:a,data:n}=I({location:{lat:void 0===i.options?.geographyId?i.options?.lat:void 0,lng:void 0===i.options?.geographyId?i.options?.lng:void 0},geogID:i.options?.geographyId||void 0,externalId:i?.globalOptions?.externalId}),{geographyId:r,geography:s}=(0,M.useMemo)(()=>{const e=Object.entries(n||{});return{geographyId:e[0]?.[0],geography:e[0]?.[1]}},[a,n]),{isLoading:d,isFetched:l,similarNeighborhoods:h,hasAffordabilityIndex:c,neighborhoodName:m,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x}=T({geogID:r,externalId:i.globalOptions?.externalId}),_=(0,M.useMemo)(()=>a||d,[a,d]),j=(0,M.useMemo)(()=>({title:i.options?.title,limit:p,minimumLimit:u,hasMore:b,viewMore:y,viewLess:x,isLoading:_,isFetched:l,neighborhoodName:m,similarNeighborhoods:h,hasAffordabilityIndex:c,hideAffordabilityTags:i.options?.hideAffordabilityTags,hideAttribution:i.options?.hideAttribution,hideThumbnails:i.options?.hideThumbnails,locale:t,level:s?.level||10}),[i.options?.title,i.options?.hideAttribution,p,b,_,l,h,c,m,t,s]);return(0,R.jsx)(G.Provider,{value:j,children:e})},V=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=r("neighborhoodMatch");return(0,R.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},$=()=>{const{t:e}=r("neighborhoodMatch"),i=g(),{limit:t,minimumLimit:o,hasMore:a,viewLess:n,viewMore:s}=S(),d=_();return!d?.lg||!a&&t===o?null:(0,R.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,R.jsxs)(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"}}),n())},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(),d=(0,M.useMemo)(()=>r?{}:{backgroundImage:`url(${i||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[r]),l=(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-testid":"neighborhood-match-card","data-has-url":!!e,"data-height-style":l,...n,children:[(!r||!s)&&(0,R.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:d}),a]})},F=({children:e,...i})=>(0,R.jsx)("h3",{className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title",...i,children:e}),W=({isLoading:e=!1,children:i})=>(0,R.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),q="px-2.5 pt-4 pb-6 min-h-[266px]";function z(){const{t:e}=r(["neighborhoodMatch","common"]),i=g(),{isFetched:t,isLoading:o,similarNeighborhoods:a,hasAffordabilityIndex:n,hideAffordabilityTags:s}=S();return t&&0===a.length?(0,R.jsx)(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:n,children:[void 0!==t.affordabilityComparison&&(0,R.jsx)("div",{className:"absolute top-0 right-4","data-testid":"neighborhood-match-affordability-tag",children:(0,R.jsx)(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}=r(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:a,neighborhoodName:n,hideAttribution:s}=S();return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(w,{title:"string"==typeof i||!1===i?i:e("title",{context:a})}),(0,R.jsx)(V,{neighborhoodName:n,isLoading:o}),(0,R.jsx)(z,{}),(0,R.jsx)($,{}),(0,R.jsx)(j,{sdkName:"neighborhood-match",locale:t,isHidden:s})]})}var U=u({lat:a().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:a().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:n().optional(),title:l().optional(),hideAffordabilityTags:c().optional(),hideAttribution:c().optional(),hideThumbnails:c().optional()}).noUnknown(!0);o(h.neighborhoodMatch.key);var Y=()=>{const{sdkState:e}=v(),i=C(),o=e.globalOptions?.locale||"en",a=(0,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)(m,{environment:e.globalOptions?.environment?.api,apiKey:e.apiKey,appearance:e.globalOptions?.appearance,locale:e.globalOptions?.locale,product:p.NEIGHBORHOOD_MATCH,children:(0,R.jsx)(t,{trackingPipelineSettings:{apiKey:e.apiKey||""},analyticsSettings:h.neighborhoodMatch,meta:{clientId:e.clientId,productName:p.NEIGHBORHOOD_MATCH,productVersion:"1.24.64"},attributes:{location:a,host:e.location,host_url:document.referrer,locale:o,isMobile:i},flags:{isDebugMode:!1},children:(0,R.jsx)(P,{children:(0,R.jsx)(J,{})})})})})})};export{Y as default};
2
+ //# sourceMappingURL=NeighborhoodMatch-2dDNoHEC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NeighborhoodMatch-zUWSiNi8.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title>&nbsp;</CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"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"}
1
+ {"version":3,"file":"NeighborhoodMatch-2dDNoHEC.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title>&nbsp;</CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(){const e=["url","imageSrc","expanded","onClick","children"],i=["children"];function t(e,i){if(null==e)return{};var t,o,n=function(e,i){if(null==e)return{};var t={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(-1!==i.indexOf(o))continue;t[o]=e[o]}return t}(e,i);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],-1===i.indexOf(t)&&{}.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}function o(e,i){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);i&&(o=o.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,o)}return t}function n(e){for(var i=1;i<arguments.length;i++){var t=null!=arguments[i]?arguments[i]:{};i%2?o(Object(t),!0).forEach(function(i){a(e,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach(function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(t,i))})}return e}function a(e,i,t){return(i=function(e){var i=function(e,i){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var o=t.call(e,i||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===i?String:Number)(e)}(e,"string");return"symbol"==typeof i?i:i+""}(i))in e?Object.defineProperty(e,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[i]=t,e}System.register(["./rolldown-runtime-legacy-dtqCu9Cl.js","./google-maps-vendor-legacy-D5NgIsmz.js","./sdks-legacy-DQ7jLJZE.js","./index-legacy-BzMlHwaA.js","./index.es-legacy-CLQaVm5G.js","./useGeographies-legacy-CcWz8DvM.js","./useResponsiveBreakpoints-legacy-CfoMoiQ8.js","./Attribution-legacy-BNtn1w7h.js","./globals-legacy-CFLw8JiR.js","./ResizeWrapper-legacy-OscRVVIk.js","./ValidateOptions-legacy-CRx_un0J.js","./useIsMobile-legacy-zb8bPQUw.js","./TitleHeader-legacy-VTfonLLs.js","./ScoreCardList-legacy-DkYwRt8q.js","./NoDataContent-legacy-CzU5MBcr.js","./neighborhood-fallback-legacy-BjzkGm-m.js"],function(o,a){var r,l,d,s,c,g,h,u,p,v,m,b,f,y,x,j,I,O,_,w,N,C,A,D,E,k,L,M,T,P,S,K,H,R,G,V,$,B,F,W,q,z,J,U,Y,Q,X,Z;function ee(){const{t:e}=h(["neighborhoodMatch","common"]),i=b(),{isFetched:t,isLoading:o,similarNeighborhoods:n,hasAffordabilityIndex:a,hideAffordabilityTags:r}=F();return t&&0===n.length?(0,$.jsx)(S,{text:e("noData")}):o?(0,$.jsx)(Y,{isLoading:!0,children:[0,1,2,3].map(e=>(0,$.jsx)(J,{children:(0,$.jsxs)("div",{className:Q,children:[(0,$.jsx)(U,{children:" "}),(0,$.jsx)(P,{children:(0,$.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,$.jsx)(Y,{isLoading:o,children:n.map((t,o)=>{return(0,$.jsxs)(J,{onClick:(n=o,()=>{i.postEvent({eventType:G.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:n}]}),i.trackAnalyticsEvent({eventName:V.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:{ll_position_in_set:n}})}),url:t.redirect_url,imageSrc:t.thumbnail_url,expanded:a,children:[void 0!==t.affordabilityComparison&&(0,$.jsx)("div",{className:X,"data-testid":"neighborhood-match-affordability-tag",children:(0,$.jsx)(w,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!r&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,$.jsxs)("div",{className:Q,children:[(0,$.jsx)(U,{"data-alt":t.name,children:t.name}),t.scores&&(0,$.jsx)(P,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,$.jsx)(T,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var n})})}function ie(){const{t:e}=h(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:n,neighborhoodName:a,hideAttribution:r}=F();return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(M,{title:"string"==typeof i||!1===i?i:e("title",{context:n})}),(0,$.jsx)(q,{neighborhoodName:a,isLoading:o}),(0,$.jsx)(ee,{}),(0,$.jsx)(z,{}),(0,$.jsx)(D,{sdkName:"neighborhood-match",locale:t,isHidden:r})]})}return{setters:[function(e){r=e.a},function(e){l=e.l},function(e){d=e.a,s=e.c,c=e.d,g=e.f,h=e.g,u=e.h,p=e.i,v=e.m,m=e.n,b=e.o,f=e.p,y=e.r,x=e.t,j=e.u},function(e){I=e.Y,O=e.i,_=e.n},function(e){w=e.a,N=e.r},function(e){C=e.t},function(e){A=e.t},function(e){D=e.t},function(e){},function(e){E=e.t},function(e){k=e.t},function(e){L=e.t},function(e){M=e.t},function(e){T=e.n,P=e.t},function(e){S=e.t},function(e){e.t}],execute:function(){K=r(l(),1),H={all:()=>["similarNeighborhoods"],list:e=>[...H.all(),e]},R=e=>{const i=A(),[t,o]=(0,K.useState)(4),{isLoading:a,isFetched:r,data:l}=function({geogID:e,externalId:i,limit:t}){const{client:o}=p(),n={geogId:e,externalId:i,limit:t};return u({queryKey:H.list(n),queryFn:async()=>await o.getSimilarNeighborhoods(n),enabled:!!e})}(n(n({},e),{},{limit:8})),d=(0,K.useMemo)(()=>{let e=[];return l&&l.most_similar?(e=l.most_similar.length<t||null==i||!i.lg?[...l.most_similar]:l.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",n(n({},i),{},{affordabilityComparison:t})}((null==l?void 0:l.affordability_index)||void 0,e))):e},[l,t,i]),s=((null==l?void 0:l.most_similar)||[]).length>4&&t<8,c=d.some(e=>void 0!==(null==e?void 0:e.affordabilityComparison));return{isLoading:a,isFetched:r,similarNeighborhoods:d,hasAffordabilityIndex:c,neighborhoodName:null==l?void 0:l.name,limit:t,minimumLimit:4,hasMore:s,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},G=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),V=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),$=I(),B=K.createContext({}),F=()=>(0,K.useContext)(B),W=({children:e})=>{var i,t,o,n,a,r,l,d,s,c;const{sdkState:g}=_(),h=(null===(i=g.globalOptions)||void 0===i?void 0:i.locale)||"en",u=b();O(()=>{u.postEvent({eventType:G.SDK_VIEWED}),u.trackAnalyticsEvent({eventName:V.SDK_VIEWED})});const{isLoading:p,data:v}=C({location:{lat:void 0===(null===(t=g.options)||void 0===t?void 0:t.geographyId)?null===(o=g.options)||void 0===o?void 0:o.lat:void 0,lng:void 0===(null===(n=g.options)||void 0===n?void 0:n.geographyId)?null===(a=g.options)||void 0===a?void 0:a.lng:void 0},geogID:(null===(r=g.options)||void 0===r?void 0:r.geographyId)||void 0,externalId:null==g||null===(l=g.globalOptions)||void 0===l?void 0:l.externalId}),{geographyId:m,geography:f}=(0,K.useMemo)(()=>{var e,i;const t=Object.entries(v||{});return{geographyId:null===(e=t[0])||void 0===e?void 0:e[0],geography:null===(i=t[0])||void 0===i?void 0:i[1]}},[p,v]),{isLoading:y,isFetched:x,similarNeighborhoods:j,hasAffordabilityIndex:I,neighborhoodName:w,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k}=R({geogID:m,externalId:null===(d=g.globalOptions)||void 0===d?void 0:d.externalId}),L=(0,K.useMemo)(()=>p||y,[p,y]),M=(0,K.useMemo)(()=>{var e,i,t,o;return{title:null===(e=g.options)||void 0===e?void 0:e.title,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k,isLoading:L,isFetched:x,neighborhoodName:w,similarNeighborhoods:j,hasAffordabilityIndex:I,hideAffordabilityTags:null===(i=g.options)||void 0===i?void 0:i.hideAffordabilityTags,hideAttribution:null===(t=g.options)||void 0===t?void 0:t.hideAttribution,hideThumbnails:null===(o=g.options)||void 0===o?void 0:o.hideThumbnails,locale:h,level:(null==f?void 0:f.level)||10}},[null===(s=g.options)||void 0===s?void 0:s.title,null===(c=g.options)||void 0===c?void 0:c.hideAttribution,N,D,L,x,j,I,w,h,f]);return(0,$.jsx)(B.Provider,{value:M,children:e})},q=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=h("neighborhoodMatch");return(0,$.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},z=()=>{const{t:e}=h("neighborhoodMatch"),i=b(),{limit:t,minimumLimit:o,hasMore:n,viewLess:a,viewMore:r}=F(),l=A();return null==l||!l.lg||!n&&t===o?null:(0,$.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,$.jsxs)(N,{variant:"secondary",onClick:()=>{n&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),r()),!n&&t>o&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),a())},children:[n&&e("pagination.next"),!n&&t>o&&e("pagination.previous")]})})},J=i=>{let{url:o,imageSrc:a,expanded:r,onClick:l,children:d}=i,s=t(i,e);const{hideThumbnails:c,hideAffordabilityTags:g}=F(),h=(0,K.useMemo)(()=>c?{}:{backgroundImage:`url(${a||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[c]),u=(0,K.useMemo)(()=>c?r?"expanded":"hidden":"normal",[c,r]);return(0,$.jsxs)("a",n(n({onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==l&&l(),null!==window.top&&(window.top.location.href=e.currentTarget.href))},href:o||void 0,className:'\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type="negative"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type="neutral"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type="positive"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n',"data-testid":"neighborhood-match-card","data-has-url":!!o,"data-height-style":u},s),{},{children:[(!c||!g)&&(0,$.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:h}),d]}))},U=e=>{let{children:o}=e,a=t(e,i);return(0,$.jsx)("h3",n(n({className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title"},a),{},{children:o}))},Y=({isLoading:e=!1,children:i})=>(0,$.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),Q="px-2.5 pt-4 pb-6 min-h-[266px]",X="absolute top-0 right-4",Z=j({lat:c().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:c().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:g().optional(),title:v().optional(),hideAffordabilityTags:f().optional(),hideAttribution:f().optional(),hideThumbnails:f().optional()}).noUnknown(!0),s(m.neighborhoodMatch.key),o("default",()=>{var e,i,t,o,n,a,r;const{sdkState:l}=_(),s=L(),c=(null===(e=l.globalOptions)||void 0===e?void 0:e.locale)||"en",g=(0,K.useMemo)(()=>{var e,i,t,o;return null!==(e=l.options)&&void 0!==e&&e.geographyId?{geographyId:null===(i=l.options)||void 0===i?void 0:i.geographyId}:{lat:null===(t=l.options)||void 0===t?void 0:t.lat,lng:null===(o=l.options)||void 0===o?void 0:o.lng}},[null===(i=l.options)||void 0===i?void 0:i.lat,null===(t=l.options)||void 0===t?void 0:t.lng,null===(o=l.options)||void 0===o?void 0:o.geographyId]);return(0,$.jsx)(E,{children:(0,$.jsx)(k,{sdk:"Neighborhood Match",schema:Z,options:l.options,children:(0,$.jsx)(y,{environment:null===(n=l.globalOptions)||void 0===n||null===(n=n.environment)||void 0===n?void 0:n.api,apiKey:l.apiKey,appearance:null===(a=l.globalOptions)||void 0===a?void 0:a.appearance,locale:null===(r=l.globalOptions)||void 0===r?void 0:r.locale,product:x.NEIGHBORHOOD_MATCH,children:(0,$.jsx)(d,{trackingPipelineSettings:{apiKey:l.apiKey||""},analyticsSettings:m.neighborhoodMatch,meta:{clientId:l.clientId,productName:x.NEIGHBORHOOD_MATCH,productVersion:"1.24.63"},attributes:{location:g,host:l.location,host_url:document.referrer,locale:c,isMobile:s},flags:{isDebugMode:!1},children:(0,$.jsx)(W,{children:(0,$.jsx)(ie,{})})})})})})})}}})}();
2
- //# sourceMappingURL=NeighborhoodMatch-legacy-BkhxK-bz.js.map
1
+ !function(){const e=["url","imageSrc","expanded","onClick","children"],i=["children"];function t(e,i){if(null==e)return{};var t,o,n=function(e,i){if(null==e)return{};var t={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(-1!==i.indexOf(o))continue;t[o]=e[o]}return t}(e,i);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++)t=a[o],-1===i.indexOf(t)&&{}.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}function o(e,i){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);i&&(o=o.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),t.push.apply(t,o)}return t}function n(e){for(var i=1;i<arguments.length;i++){var t=null!=arguments[i]?arguments[i]:{};i%2?o(Object(t),!0).forEach(function(i){a(e,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach(function(i){Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(t,i))})}return e}function a(e,i,t){return(i=function(e){var i=function(e,i){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var o=t.call(e,i||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===i?String:Number)(e)}(e,"string");return"symbol"==typeof i?i:i+""}(i))in e?Object.defineProperty(e,i,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[i]=t,e}System.register(["./rolldown-runtime-legacy-dtqCu9Cl.js","./google-maps-vendor-legacy-D5NgIsmz.js","./sdks-legacy-BcdXj8R9.js","./index-legacy-CdRffLlb.js","./index.es-legacy-DGBuVsHM.js","./useGeographies-legacy-BFHs291p.js","./useResponsiveBreakpoints-legacy-CfoMoiQ8.js","./Attribution-legacy-BbMLLCok.js","./globals-legacy-CFLw8JiR.js","./ResizeWrapper-legacy-F6SJE_TA.js","./ValidateOptions-legacy-B4kQEpo7.js","./useIsMobile-legacy-B6-NPP6W.js","./TitleHeader-legacy-pLHeIO4_.js","./ScoreCardList-legacy-B-Iw3TWS.js","./NoDataContent-legacy-C3AeyeSg.js","./neighborhood-fallback-legacy-BjzkGm-m.js"],function(o,a){var r,l,d,s,c,g,h,u,p,v,m,b,f,y,x,j,I,O,_,w,N,C,A,D,E,k,L,M,T,P,S,K,H,R,G,V,$,B,F,W,q,z,J,U,Y,Q,X,Z;function ee(){const{t:e}=h(["neighborhoodMatch","common"]),i=b(),{isFetched:t,isLoading:o,similarNeighborhoods:n,hasAffordabilityIndex:a,hideAffordabilityTags:r}=F();return t&&0===n.length?(0,$.jsx)(S,{text:e("noData")}):o?(0,$.jsx)(Y,{isLoading:!0,children:[0,1,2,3].map(e=>(0,$.jsx)(J,{children:(0,$.jsxs)("div",{className:Q,children:[(0,$.jsx)(U,{children:" "}),(0,$.jsx)(P,{children:(0,$.jsx)("span",{})})]})},`similar-neighborhood-card-skeleton-${e}`))}):(0,$.jsx)(Y,{isLoading:o,children:n.map((t,o)=>{return(0,$.jsxs)(J,{onClick:(n=o,()=>{i.postEvent({eventType:G.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:[{label:"position_in_set",data:n}]}),i.trackAnalyticsEvent({eventName:V.NEIGHBORHOOD_CARD_CLICKED,eventAttributes:{ll_position_in_set:n}})}),url:t.redirect_url,imageSrc:t.thumbnail_url,expanded:a,children:[void 0!==t.affordabilityComparison&&(0,$.jsx)("div",{className:X,"data-testid":"neighborhood-match-affordability-tag",children:(0,$.jsx)(w,{isTopLeftRounded:!1,isTopRightRounded:!1,isVisible:!r&&!!t.affordabilityComparison,variant:t.affordabilityComparison,children:e(`tags.${t.affordabilityComparison}`)})}),(0,$.jsxs)("div",{className:Q,children:[(0,$.jsx)(U,{"data-alt":t.name,children:t.name}),t.scores&&(0,$.jsx)(P,{children:Object.entries(t.scores).map(([i,o])=>o>=0&&(0,$.jsx)(T,{title:e(`common:scores.${i}.title`),scoreKey:i,value:o},`similar-neighborhood-${t.id}-scores-${i}`))})]})]},`similar-neighborhood-card-${t.id}`);var n})})}function ie(){const{t:e}=h(["neighborhoodMatch","common"]),{title:i,locale:t,isLoading:o,level:n,neighborhoodName:a,hideAttribution:r}=F();return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(M,{title:"string"==typeof i||!1===i?i:e("title",{context:n})}),(0,$.jsx)(q,{neighborhoodName:a,isLoading:o}),(0,$.jsx)(ee,{}),(0,$.jsx)(z,{}),(0,$.jsx)(D,{sdkName:"neighborhood-match",locale:t,isHidden:r})]})}return{setters:[function(e){r=e.a},function(e){l=e.l},function(e){d=e.a,s=e.c,c=e.d,g=e.f,h=e.g,u=e.h,p=e.i,v=e.m,m=e.n,b=e.o,f=e.p,y=e.r,x=e.t,j=e.u},function(e){I=e.Y,O=e.i,_=e.n},function(e){w=e.a,N=e.r},function(e){C=e.t},function(e){A=e.t},function(e){D=e.t},function(e){},function(e){E=e.t},function(e){k=e.t},function(e){L=e.t},function(e){M=e.t},function(e){T=e.n,P=e.t},function(e){S=e.t},function(e){e.t}],execute:function(){K=r(l(),1),H={all:()=>["similarNeighborhoods"],list:e=>[...H.all(),e]},R=e=>{const i=A(),[t,o]=(0,K.useState)(4),{isLoading:a,isFetched:r,data:l}=function({geogID:e,externalId:i,limit:t}){const{client:o}=p(),n={geogId:e,externalId:i,limit:t};return u({queryKey:H.list(n),queryFn:async()=>await o.getSimilarNeighborhoods(n),enabled:!!e})}(n(n({},e),{},{limit:8})),d=(0,K.useMemo)(()=>{let e=[];return l&&l.most_similar?(e=l.most_similar.length<t||null==i||!i.lg?[...l.most_similar]:l.most_similar.slice(0,t),e.map(e=>function(e,i){if(null==e||null==i.affordability_index)return i;let t="";return t=Math.abs(1-e/i.affordability_index)<.05?"neutral":e>i.affordability_index?"negative":"positive",n(n({},i),{},{affordabilityComparison:t})}((null==l?void 0:l.affordability_index)||void 0,e))):e},[l,t,i]),s=((null==l?void 0:l.most_similar)||[]).length>4&&t<8,c=d.some(e=>void 0!==(null==e?void 0:e.affordabilityComparison));return{isLoading:a,isFetched:r,similarNeighborhoods:d,hasAffordabilityIndex:c,neighborhoodName:null==l?void 0:l.name,limit:t,minimumLimit:4,hasMore:s,viewMore:()=>{8!==t&&o(t+4)},viewLess:()=>{t<8||o(t-4)}}},G=function(e){return e.SDK_VIEWED="neighborhood-match-Viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood-match-Card-Clicked",e.PAGINATION_CLICKED="neighborhood-match-Pagination-Clicked",e}({}),V=function(e){return e.SDK_VIEWED="sdk_viewed",e.NEIGHBORHOOD_CARD_CLICKED="neighborhood_card_clicked",e.PAGINATION_CLICKED="pagination_clicked",e}({}),$=I(),B=K.createContext({}),F=()=>(0,K.useContext)(B),W=({children:e})=>{var i,t,o,n,a,r,l,d,s,c;const{sdkState:g}=_(),h=(null===(i=g.globalOptions)||void 0===i?void 0:i.locale)||"en",u=b();O(()=>{u.postEvent({eventType:G.SDK_VIEWED}),u.trackAnalyticsEvent({eventName:V.SDK_VIEWED})});const{isLoading:p,data:v}=C({location:{lat:void 0===(null===(t=g.options)||void 0===t?void 0:t.geographyId)?null===(o=g.options)||void 0===o?void 0:o.lat:void 0,lng:void 0===(null===(n=g.options)||void 0===n?void 0:n.geographyId)?null===(a=g.options)||void 0===a?void 0:a.lng:void 0},geogID:(null===(r=g.options)||void 0===r?void 0:r.geographyId)||void 0,externalId:null==g||null===(l=g.globalOptions)||void 0===l?void 0:l.externalId}),{geographyId:m,geography:f}=(0,K.useMemo)(()=>{var e,i;const t=Object.entries(v||{});return{geographyId:null===(e=t[0])||void 0===e?void 0:e[0],geography:null===(i=t[0])||void 0===i?void 0:i[1]}},[p,v]),{isLoading:y,isFetched:x,similarNeighborhoods:j,hasAffordabilityIndex:I,neighborhoodName:w,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k}=R({geogID:m,externalId:null===(d=g.globalOptions)||void 0===d?void 0:d.externalId}),L=(0,K.useMemo)(()=>p||y,[p,y]),M=(0,K.useMemo)(()=>{var e,i,t,o;return{title:null===(e=g.options)||void 0===e?void 0:e.title,limit:N,minimumLimit:A,hasMore:D,viewMore:E,viewLess:k,isLoading:L,isFetched:x,neighborhoodName:w,similarNeighborhoods:j,hasAffordabilityIndex:I,hideAffordabilityTags:null===(i=g.options)||void 0===i?void 0:i.hideAffordabilityTags,hideAttribution:null===(t=g.options)||void 0===t?void 0:t.hideAttribution,hideThumbnails:null===(o=g.options)||void 0===o?void 0:o.hideThumbnails,locale:h,level:(null==f?void 0:f.level)||10}},[null===(s=g.options)||void 0===s?void 0:s.title,null===(c=g.options)||void 0===c?void 0:c.hideAttribution,N,D,L,x,j,I,w,h,f]);return(0,$.jsx)(B.Provider,{value:M,children:e})},q=({isLoading:e=!1,neighborhoodName:i})=>{const{t:t}=h("neighborhoodMatch");return(0,$.jsx)("p",{className:"\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n","data-testid":"neighborhood-match-description","data-is-loading":e,children:t(i?"descriptionWithNeighborhood":"description",{neighborhoodName:i,interpolation:{escapeValue:!1}})})},z=()=>{const{t:e}=h("neighborhoodMatch"),i=b(),{limit:t,minimumLimit:o,hasMore:n,viewLess:a,viewMore:r}=F(),l=A();return null==l||!l.lg||!n&&t===o?null:(0,$.jsx)("div",{className:"w-full flex align-center justify-center","data-testid":"neighborhood-match-pagination",children:(0,$.jsxs)(N,{variant:"secondary",onClick:()=>{n&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_more"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_more"}}),r()),!n&&t>o&&(i.postEvent({eventType:G.PAGINATION_CLICKED,eventAttributes:[{label:"pagination_action_type",data:"view_less"}]}),i.trackAnalyticsEvent({eventName:V.PAGINATION_CLICKED,eventAttributes:{ll_pagination_action_type:"view_less"}}),a())},children:[n&&e("pagination.next"),!n&&t>o&&e("pagination.previous")]})})},J=i=>{let{url:o,imageSrc:a,expanded:r,onClick:l,children:d}=i,s=t(i,e);const{hideThumbnails:c,hideAffordabilityTags:g}=F(),h=(0,K.useMemo)(()=>c?{}:{backgroundImage:`url(${a||"/sdks-app/v1/assets/neighborhood-fallback-DTJDTD7d.jpg"})`},[c]),u=(0,K.useMemo)(()=>c?r?"expanded":"hidden":"normal",[c,r]);return(0,$.jsxs)("a",n(n({onClick:e=>{e.preventDefault();const{href:i}=e.currentTarget;i&&void 0!==e.currentTarget.href&&0!==i.length&&(void 0!==l&&l(),null!==window.top&&(window.top.location.href=e.currentTarget.href))},href:o||void 0,className:'\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type="negative"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type="neutral"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type="positive"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n',"data-testid":"neighborhood-match-card","data-has-url":!!o,"data-height-style":u},s),{},{children:[(!c||!g)&&(0,$.jsx)("div",{className:'\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style="normal"]:min-h-36\n group-data-[height-style="expanded"]:min-h-7\n group-data-[height-style="expanded"]:bg-transparent\n group-data-[height-style="hidden"]:min-h-0\n',"data-testid":"neighborhood-match-card-image",style:h}),d]}))},U=e=>{let{children:o}=e,a=t(e,i);return(0,$.jsx)("h3",n(n({className:"w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5","data-testid":"neighborhood-match-card-title"},a),{},{children:o}))},Y=({isLoading:e=!1,children:i})=>(0,$.jsx)("div",{className:"group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8","data-testid":"neighborhood-match-card-list","data-is-loading":e,children:i}),Q="px-2.5 pt-4 pb-6 min-h-[266px]",X="absolute top-0 right-4",Z=j({lat:c().min(-90,"Must be a valid latitude.").max(90,"Must be a valid latitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),lng:c().min(-180,"Must be a valid longitude.").max(180,"Must be a valid longitude.").when("geographyId",{is:e=>"string"==typeof e,then:e=>e.optional(),otherwise:e=>e.required()}),geographyId:g().optional(),title:v().optional(),hideAffordabilityTags:f().optional(),hideAttribution:f().optional(),hideThumbnails:f().optional()}).noUnknown(!0),s(m.neighborhoodMatch.key),o("default",()=>{var e,i,t,o,n,a,r;const{sdkState:l}=_(),s=L(),c=(null===(e=l.globalOptions)||void 0===e?void 0:e.locale)||"en",g=(0,K.useMemo)(()=>{var e,i,t,o;return null!==(e=l.options)&&void 0!==e&&e.geographyId?{geographyId:null===(i=l.options)||void 0===i?void 0:i.geographyId}:{lat:null===(t=l.options)||void 0===t?void 0:t.lat,lng:null===(o=l.options)||void 0===o?void 0:o.lng}},[null===(i=l.options)||void 0===i?void 0:i.lat,null===(t=l.options)||void 0===t?void 0:t.lng,null===(o=l.options)||void 0===o?void 0:o.geographyId]);return(0,$.jsx)(E,{children:(0,$.jsx)(k,{sdk:"Neighborhood Match",schema:Z,options:l.options,children:(0,$.jsx)(y,{environment:null===(n=l.globalOptions)||void 0===n||null===(n=n.environment)||void 0===n?void 0:n.api,apiKey:l.apiKey,appearance:null===(a=l.globalOptions)||void 0===a?void 0:a.appearance,locale:null===(r=l.globalOptions)||void 0===r?void 0:r.locale,product:x.NEIGHBORHOOD_MATCH,children:(0,$.jsx)(d,{trackingPipelineSettings:{apiKey:l.apiKey||""},analyticsSettings:m.neighborhoodMatch,meta:{clientId:l.clientId,productName:x.NEIGHBORHOOD_MATCH,productVersion:"1.24.64"},attributes:{location:g,host:l.location,host_url:document.referrer,locale:c,isMobile:s},flags:{isDebugMode:!1},children:(0,$.jsx)(W,{children:(0,$.jsx)(ie,{})})})})})})})}}})}();
2
+ //# sourceMappingURL=NeighborhoodMatch-legacy-DSUP8S00.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NeighborhoodMatch-legacy-BkhxK-bz.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title>&nbsp;</CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"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"}
1
+ {"version":3,"file":"NeighborhoodMatch-legacy-DSUP8S00.js","names":[],"sources":["../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/addAffordabilityComparisonToNeighborhood/index.ts","../../src/features/similarNeighborhoods/keyFactory.ts","../../src/features/clientLibrary/useSimilarNeighborhoods.ts","../../src/sdks/NeighborhoodMatch/hooks/useSimilarNeighborhoods/index.ts","../../src/sdks/NeighborhoodMatch/types.ts","../../src/sdks/NeighborhoodMatch/context.tsx","../../src/sdks/NeighborhoodMatch/components/Description/styles.ts","../../src/sdks/NeighborhoodMatch/components/Description/index.tsx","../../src/sdks/NeighborhoodMatch/components/PaginationButton/styles.ts","../../src/sdks/NeighborhoodMatch/components/PaginationButton/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Card/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/styles.ts","../../src/sdks/NeighborhoodMatch/components/CardList/Root/Title/index.tsx","../../src/sdks/NeighborhoodMatch/components/CardList/Root/index.tsx","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/styles.ts","../../src/sdks/NeighborhoodMatch/components/Neighborhoods/index.tsx","../../src/sdks/NeighborhoodMatch/components/Content/index.tsx","../../src/sdks/NeighborhoodMatch/schema.ts","../../src/sdks/NeighborhoodMatch/index.tsx"],"sourcesContent":["import type { Neighborhood } from \"@local-logic/client\";\nimport type {\n ComparedNeighborhood,\n AffordabilityComparison,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport function addAffordabilityComparisonToNeighborhood(\n baseAffordabilityIndex: number | undefined,\n comparingNeighborhood: Neighborhood,\n): ComparedNeighborhood {\n if (\n baseAffordabilityIndex == null ||\n comparingNeighborhood.affordability_index == null\n ) {\n return comparingNeighborhood;\n }\n\n let affordabilityComparison = \"\";\n\n if (\n Math.abs(\n 1 - baseAffordabilityIndex / comparingNeighborhood.affordability_index,\n ) < 0.05\n ) {\n affordabilityComparison = \"neutral\";\n } else if (\n baseAffordabilityIndex > comparingNeighborhood.affordability_index\n ) {\n affordabilityComparison = \"negative\";\n } else {\n affordabilityComparison = \"positive\";\n }\n\n return {\n ...comparingNeighborhood,\n affordabilityComparison: affordabilityComparison as AffordabilityComparison,\n };\n}\n","import { similarNeighborhoodsParameters } from \"./types\";\n\nexport const similarNeighborhoodsKeys = {\n all: () => [\"similarNeighborhoods\"] as const,\n list: (filters: Partial<similarNeighborhoodsParameters>) =>\n [...similarNeighborhoodsKeys.all(), filters] as const,\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useLocalLogic } from \"~/context/LocalLogicProvider\";\nimport { similarNeighborhoodsKeys } from \"~/features/similarNeighborhoods\";\n\nexport type SimilarNeighborhoodsParams = {\n lat?: number;\n lng?: number;\n geogID?: string;\n externalId?: string;\n limit?: number;\n};\n\nexport function useSimilarNeighborhoods({\n geogID,\n externalId,\n limit,\n}: SimilarNeighborhoodsParams) {\n const { client } = useLocalLogic();\n const params = {\n geogId: geogID,\n externalId,\n limit,\n };\n\n const fetchSimilarNeighborhoods = async () => {\n const response = await client.getSimilarNeighborhoods(params);\n\n return response;\n };\n\n return useQuery({\n queryKey: similarNeighborhoodsKeys.list(params),\n queryFn: fetchSimilarNeighborhoods,\n enabled: !!geogID,\n });\n}\n","import { useMemo, useState } from \"react\";\nimport { addAffordabilityComparisonToNeighborhood } from \"./addAffordabilityComparisonToNeighborhood\";\nimport type { ComparedNeighborhood } from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\nimport {\n useSimilarNeighborhoods as useClientLibrarySimilarNeighborhoods,\n type SimilarNeighborhoodsParams,\n} from \"~/features/clientLibrary/useSimilarNeighborhoods\";\n\nconst MIN_PER_ROW = 4;\nconst MAX_LIMIT = 8;\n\nexport const useSimilarNeighborhoods = (\n params: Omit<SimilarNeighborhoodsParams, \"limit\">,\n) => {\n const breakpoints = useResponsiveBreakpoints();\n const [limit, setLimit] = useState(MIN_PER_ROW);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n data,\n } = useClientLibrarySimilarNeighborhoods({ ...params, limit: MAX_LIMIT });\n\n const similarNeighborhoods = useMemo(() => {\n let neighborhoods: ComparedNeighborhood[] = [];\n\n if (!data || !data.most_similar) {\n return neighborhoods;\n }\n\n if (data.most_similar.length < limit || !breakpoints?.lg) {\n // Somehow we wouldn't have enough to return.\n // So just return what we have\n // We'll also return everything on mobile\n neighborhoods = [...data.most_similar];\n } else {\n neighborhoods = data.most_similar.slice(0, limit);\n }\n\n return neighborhoods.map((similarNeighborhood) =>\n addAffordabilityComparisonToNeighborhood(\n data?.affordability_index || undefined,\n similarNeighborhood,\n ),\n );\n }, [data, limit, breakpoints]);\n\n const hasMore =\n (data?.most_similar || []).length > MIN_PER_ROW && limit < MAX_LIMIT;\n\n const hasAffordabilityIndex = similarNeighborhoods.some(\n (neighborhood) =>\n typeof neighborhood?.affordabilityComparison !== \"undefined\",\n );\n\n const viewMore = () => {\n if (limit === MAX_LIMIT) return;\n setLimit(limit + MIN_PER_ROW);\n };\n\n const viewLess = () => {\n if (limit < MAX_LIMIT) return;\n setLimit(limit - MIN_PER_ROW);\n };\n\n return {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName: data?.name,\n limit,\n minimumLimit: MIN_PER_ROW,\n hasMore,\n viewMore,\n viewLess,\n };\n};\n","import type { Neighborhood } from \"@local-logic/client\";\nimport { SDKOptions } from \"~/types/options\";\n\nexport type Options = {\n lat?: number;\n lng?: number;\n geographyId?: string;\n title?: boolean | string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n};\n\nexport type NeighborhoodMatchProps = SDKOptions<\n Options,\n {\n options: Options | undefined;\n }\n>;\n\nexport type AffordabilityComparison = \"negative\" | \"neutral\" | \"positive\";\nexport interface ComparedNeighborhood extends Neighborhood {\n affordabilityComparison?: AffordabilityComparison;\n}\n\nexport enum TrackingPipelineEvents {\n SDK_VIEWED = \"neighborhood-match-Viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood-match-Card-Clicked\",\n PAGINATION_CLICKED = \"neighborhood-match-Pagination-Clicked\",\n}\n\n// Why are these named differently?\n// https://docs.mixpanel.com/docs/data-structure/events-and-properties#name-events-and-properties-consistently\nexport enum AnalyticsEvents {\n SDK_VIEWED = \"sdk_viewed\",\n NEIGHBORHOOD_CARD_CLICKED = \"neighborhood_card_clicked\",\n PAGINATION_CLICKED = \"pagination_clicked\",\n}\n","import React, { useContext, useMemo } from \"react\";\n\nimport type { NeighborhoodMatchProps, ComparedNeighborhood } from \"./types\";\nimport { useSimilarNeighborhoods } from \"./hooks/useSimilarNeighborhoods\";\nimport useEffectOnce from \"~/hooks/useEffectOnce\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport { useGeographies } from \"~/features/clientLibrary/useGeographies\";\n\nimport { useTracking } from \"~/tracking\";\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\ninterface Location {\n lat: number;\n lng: number;\n}\n\nexport type DefaultContext = {\n title: NeighborhoodMatchProps[\"options\"][\"title\"];\n // This is used to limit the results in the context.\n // We'll still query 8 (10 is the max) so that we don't query again\n // since there's no pagination\n limit: number;\n minimumLimit: number;\n hasMore: boolean;\n viewMore: () => void;\n viewLess: () => void;\n isLoading: boolean;\n isFetched: boolean;\n similarNeighborhoods: ComparedNeighborhood[];\n hasAffordabilityIndex: boolean;\n neighborhoodName?: string;\n hideAffordabilityTags?: boolean;\n hideAttribution?: boolean;\n hideThumbnails?: boolean;\n locale: \"en\" | \"fr\";\n level: number;\n};\n\nconst NeighborhoodMatchContext = React.createContext<DefaultContext>(\n {} as DefaultContext,\n);\n\nconst useNeighborhoodMatch = () => useContext(NeighborhoodMatchContext);\n\nconst NeighborhoodMatchProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const locale = sdkState.globalOptions?.locale || \"en\";\n const tracking = useTracking();\n\n useEffectOnce(() => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.SDK_VIEWED,\n });\n\n tracking.trackAnalyticsEvent({ eventName: AnalyticsEvents.SDK_VIEWED });\n });\n\n const { isLoading: isGeographyLoading, data: geographyData } = useGeographies(\n {\n location: {\n lat:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lat\n : undefined,\n lng:\n typeof sdkState.options?.geographyId === \"undefined\"\n ? sdkState.options?.lng\n : undefined,\n },\n geogID: sdkState.options?.geographyId || undefined,\n externalId: sdkState?.globalOptions?.externalId,\n },\n );\n\n const { geographyId, geography } = useMemo(() => {\n const geographiesArray = Object.entries(geographyData || {});\n\n return {\n geographyId: geographiesArray[0]?.[0],\n geography: geographiesArray[0]?.[1],\n };\n }, [isGeographyLoading, geographyData]);\n\n const {\n isLoading: isSimilarNeighborhoodsLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n } = useSimilarNeighborhoods({\n geogID: geographyId,\n externalId: sdkState.globalOptions?.externalId,\n });\n\n const isLoading = useMemo(\n () => isGeographyLoading || isSimilarNeighborhoodsLoading,\n [isGeographyLoading, isSimilarNeighborhoodsLoading],\n );\n\n const contextValue = useMemo(\n () => ({\n title: sdkState.options?.title,\n limit,\n minimumLimit,\n hasMore,\n viewMore,\n viewLess,\n isLoading,\n isFetched: isSimilarNeighborhoodsFetched,\n neighborhoodName,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags: sdkState.options?.hideAffordabilityTags,\n hideAttribution: sdkState.options?.hideAttribution,\n hideThumbnails: sdkState.options?.hideThumbnails,\n locale,\n level: geography?.level || 10,\n }),\n [\n sdkState.options?.title,\n sdkState.options?.hideAttribution,\n limit,\n hasMore,\n isLoading,\n isSimilarNeighborhoodsFetched,\n similarNeighborhoods,\n hasAffordabilityIndex,\n neighborhoodName,\n locale,\n geography,\n ],\n );\n\n return (\n <NeighborhoodMatchContext.Provider value={contextValue}>\n {children}\n </NeighborhoodMatchContext.Provider>\n );\n};\n\nexport { useNeighborhoodMatch, NeighborhoodMatchProvider, type Location };\n","export const text = `\n text-gray-400 text-sm font-normal leading-5 mb-5\n data-[is-loading=true]:bg-gray-200 data-[is-loading=true]:rounded-sm data-[is-loading=true]:animate-pulse\n data-[is-loading=true]:text-transparent data-[is-loading=true]:max-w-96 data-[is-loading=true]:h-4\n`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\n\nimport * as styles from \"./styles\";\n\nexport const Description = ({\n isLoading = false,\n neighborhoodName,\n}: {\n isLoading?: boolean;\n neighborhoodName?: string;\n}) => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n\n return (\n <p\n className={styles.text}\n data-testid=\"neighborhood-match-description\"\n data-is-loading={isLoading}\n >\n {t(neighborhoodName ? \"descriptionWithNeighborhood\" : \"description\", {\n neighborhoodName,\n interpolation: { escapeValue: false },\n })}\n </p>\n );\n};\n","export const container = `w-full flex align-center justify-center`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Button } from \"@local-logic/design-system\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\nimport { useResponsiveBreakpoints } from \"~/hooks/useResponsiveBreakpoints\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nexport const PaginationButton = () => {\n const { t } = useTranslation(\"neighborhoodMatch\");\n const tracking = useTracking();\n const { limit, minimumLimit, hasMore, viewLess, viewMore } =\n useNeighborhoodMatch();\n const breakpoints = useResponsiveBreakpoints();\n\n const handleClick = () => {\n if (hasMore) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_more\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_more\",\n },\n });\n viewMore();\n }\n\n if (!hasMore && limit > minimumLimit) {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.PAGINATION_CLICKED,\n eventAttributes: [\n {\n label: \"pagination_action_type\",\n data: \"view_less\",\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.PAGINATION_CLICKED,\n eventAttributes: {\n ll_pagination_action_type: \"view_less\",\n },\n });\n\n viewLess();\n }\n };\n\n if (!breakpoints?.lg || (!hasMore && limit === minimumLimit)) {\n return null;\n }\n\n return (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-pagination\"\n >\n <Button variant=\"secondary\" onClick={handleClick}>\n {hasMore && t(\"pagination.next\")}\n {!hasMore && limit > minimumLimit && t(\"pagination.previous\")}\n </Button>\n </div>\n );\n};\n","export const container = `group/card-list w-full flex overflow-auto lg:grid lg:grid-cols-4 gap-x-4 gap-y-8 lg:space-between lg:overflow-hidden no-scrollbar pb-8`;\n","export const container = `\n relative bg-base-white border border-gray-150 rounded-lg min-w-60 overflow-hidden\n shadow-2sm transition-shadow\n group\n \n data-[has-url=true]:hover:shadow-md\n data-[has-url=true]:data-[tag-type=\"negative\"]:hover:border-feedback-danger-100\n data-[has-url=true]:data-[tag-type=\"neutral\"]:hover:border-feedback-warning-200\n data-[has-url=true]:data-[tag-type=\"positive\"]:hover:border-feedback-success-100\n\n group-data-[is-loading=true]/card-list:border-gray-200 group-data-[is-loading=true]/card-list:bg-gray-200/50 group-data-[is-loading=true]/card-list:animate-pulse\n`;\n\nexport const imageCover = `\n bg-gray-300/50 w-full bg-cover bg-no-repeat bg-center\n\n group-data-[height-style=\"normal\"]:min-h-36\n group-data-[height-style=\"expanded\"]:min-h-7\n group-data-[height-style=\"expanded\"]:bg-transparent\n group-data-[height-style=\"hidden\"]:min-h-0\n`;\n","import React, { useMemo } from \"react\";\n\nimport * as styles from \"./styles\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport NeighborhoodFallbackImage from \"~/assets/images/neighborhood-fallback.jpg\";\n\ntype CardProps = {\n url?: string;\n imageSrc?: string;\n expanded?: boolean;\n // Can be used to trigger events\n onClick?: () => void;\n children: React.ReactNode;\n};\n\nexport const Card = ({\n url,\n imageSrc,\n expanded,\n onClick,\n children,\n ...rest\n}: CardProps) => {\n const { hideThumbnails, hideAffordabilityTags } = useNeighborhoodMatch();\n\n const style = useMemo(\n () =>\n hideThumbnails\n ? {}\n : {\n backgroundImage: `url(${imageSrc || NeighborhoodFallbackImage})`,\n },\n [hideThumbnails],\n );\n\n const heightStyle = useMemo(() => {\n if (!hideThumbnails) return \"normal\";\n if (expanded) return \"expanded\";\n\n return \"hidden\";\n }, [hideThumbnails, expanded]);\n\n const handleOnClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n\n const { href } = event.currentTarget;\n\n if (\n !href ||\n typeof event.currentTarget.href === \"undefined\" ||\n href.length === 0\n ) {\n return;\n }\n\n if (typeof onClick !== \"undefined\") {\n onClick();\n }\n\n if (window.top !== null) {\n window.top.location.href = event.currentTarget.href;\n }\n };\n\n return (\n <a\n onClick={handleOnClick}\n href={url || undefined}\n className={styles.container}\n data-testid=\"neighborhood-match-card\"\n data-has-url={!!url}\n data-height-style={heightStyle}\n {...rest}\n >\n {(!hideThumbnails || !hideAffordabilityTags) && (\n <div\n className={styles.imageCover}\n data-testid=\"neighborhood-match-card-image\"\n style={style}\n />\n )}\n\n {children}\n </a>\n );\n};\n","export const title = `w-full truncate text-ellipsis overflow-hidden font-bold text-sm text-base-black hover:text-clip hover:overflow-auto no-scrollbar mb-3.5`;\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Title = ({\n children,\n ...rest\n}: React.ComponentPropsWithoutRef<\"h3\">) => (\n <h3\n className={styles.title}\n data-testid=\"neighborhood-match-card-title\"\n {...rest}\n >\n {children}\n </h3>\n);\n","import React from \"react\";\n\nimport * as styles from \"./styles\";\n\nexport const Root = ({\n isLoading = false,\n children,\n}: {\n isLoading?: boolean;\n children: React.ReactNode;\n}) => (\n <div\n className={styles.container}\n data-testid=\"neighborhood-match-card-list\"\n data-is-loading={isLoading}\n >\n {children}\n </div>\n);\n\n// Export children\nexport { Card } from \"./Card\";\nexport { Title } from \"./Title\";\n","// Setting min height of 266 makes all cards have the same height\n// in case there's less scores in one card\nexport const cardDataContent = `px-2.5 pt-4 pb-6 min-h-[266px]`;\nexport const tag = `absolute top-0 right-4`;\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport type { Neighborhood } from \"@local-logic/client\";\nimport { Tag } from \"@local-logic/design-system\";\nimport * as CardList from \"../CardList\";\nimport * as styles from \"./styles\";\nimport { useTracking } from \"~/tracking\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport {\n TrackingPipelineEvents,\n AnalyticsEvents,\n} from \"~/sdks/NeighborhoodMatch/types\";\n\nimport { NoDataContent } from \"~/components/NoDataContent\";\n\nimport * as ScoreCardList from \"~/components/ScoreCardList\";\n\nexport function Neighborhoods() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const tracking = useTracking();\n const {\n isFetched,\n isLoading,\n similarNeighborhoods,\n hasAffordabilityIndex,\n hideAffordabilityTags,\n } = useNeighborhoodMatch();\n\n const handleCardClickEvent = (position: number) => () => {\n tracking.postEvent({\n eventType: TrackingPipelineEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: [\n {\n label: \"position_in_set\",\n data: position,\n },\n ],\n });\n\n tracking.trackAnalyticsEvent({\n eventName: AnalyticsEvents.NEIGHBORHOOD_CARD_CLICKED,\n eventAttributes: {\n ll_position_in_set: position,\n },\n });\n };\n\n if (isFetched && similarNeighborhoods.length === 0) {\n return <NoDataContent text={t(\"noData\")} />;\n }\n\n if (isLoading) {\n return (\n <CardList.Root isLoading>\n {[0, 1, 2, 3].map((index) => (\n <CardList.Card key={`similar-neighborhood-card-skeleton-${index}`}>\n <div className={styles.cardDataContent}>\n <CardList.Title>&nbsp;</CardList.Title>\n\n <ScoreCardList.Root>\n <span></span>\n </ScoreCardList.Root>\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n }\n\n return (\n <CardList.Root isLoading={isLoading}>\n {similarNeighborhoods.map((neighborhood, index) => (\n <CardList.Card\n key={`similar-neighborhood-card-${neighborhood.id}`}\n onClick={handleCardClickEvent(index)}\n url={neighborhood.redirect_url}\n imageSrc={neighborhood.thumbnail_url}\n expanded={hasAffordabilityIndex}\n >\n {typeof neighborhood.affordabilityComparison !== \"undefined\" && (\n <div\n className={styles.tag}\n data-testid=\"neighborhood-match-affordability-tag\"\n >\n <Tag\n isTopLeftRounded={false}\n isTopRightRounded={false}\n isVisible={\n !hideAffordabilityTags &&\n !!neighborhood.affordabilityComparison\n }\n variant={neighborhood.affordabilityComparison}\n >\n {t(`tags.${neighborhood.affordabilityComparison}`)}\n </Tag>\n </div>\n )}\n\n <div className={styles.cardDataContent}>\n <CardList.Title data-alt={neighborhood.name}>\n {neighborhood.name}\n </CardList.Title>\n\n {neighborhood.scores && (\n <ScoreCardList.Root>\n {Object.entries(neighborhood.scores).map(\n ([key, value]) =>\n value >= 0 && (\n <ScoreCardList.Card\n key={`similar-neighborhood-${neighborhood.id}-scores-${key}`}\n title={t(\n `common:scores.${key as keyof Neighborhood[\"scores\"]}.title`,\n )}\n scoreKey={key as keyof Neighborhood[\"scores\"]}\n value={value}\n />\n ),\n )}\n </ScoreCardList.Root>\n )}\n </div>\n </CardList.Card>\n ))}\n </CardList.Root>\n );\n}\n","import React from \"react\";\n\nimport { useTranslation } from \"react-i18next\";\nimport { Description } from \"../Description\";\nimport { PaginationButton } from \"../PaginationButton\";\nimport { Neighborhoods } from \"../Neighborhoods\";\nimport { useNeighborhoodMatch } from \"~/sdks/NeighborhoodMatch/context\";\n\nimport { TitleHeader } from \"~/components/TitleHeader\";\nimport { Attribution } from \"~/components/Attribution\";\n\nexport function Content() {\n const { t } = useTranslation([\"neighborhoodMatch\", \"common\"]);\n const { title, locale, isLoading, level, neighborhoodName, hideAttribution } =\n useNeighborhoodMatch();\n\n return (\n <>\n <TitleHeader\n title={\n typeof title === \"string\" || title === false\n ? title\n : t(\"title\", {\n context: level,\n })\n }\n />\n\n <Description neighborhoodName={neighborhoodName} isLoading={isLoading} />\n\n <Neighborhoods />\n <PaginationButton />\n\n <Attribution\n sdkName=\"neighborhood-match\"\n locale={locale}\n isHidden={hideAttribution}\n />\n </>\n );\n}\n","import { ObjectSchema, string, boolean, number, object, mixed } from \"yup\";\nimport { Options } from \"./types\";\n\nexport const schema: ObjectSchema<Options> = object({\n lat: number()\n .min(-90, \"Must be a valid latitude.\")\n .max(90, \"Must be a valid latitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n lng: number()\n .min(-180, \"Must be a valid longitude.\")\n .max(180, \"Must be a valid longitude.\")\n .when(\"geographyId\", {\n is: (geographyId?: string) => typeof geographyId === \"string\",\n then: (fieldSchema) => fieldSchema.optional(),\n otherwise: (fieldSchema) => fieldSchema.required(),\n }),\n geographyId: string().optional(),\n title: mixed<string | boolean>().optional(),\n hideAffordabilityTags: boolean().optional(),\n hideAttribution: boolean().optional(),\n hideThumbnails: boolean().optional(),\n}).noUnknown(true);\n","import React, { useMemo } from \"react\";\nimport { NeighborhoodMatchProvider } from \"./context\";\nimport { Content } from \"./components/Content\";\nimport { schema } from \"./schema\";\nimport { NeighborhoodMatchProps } from \"./types\";\nimport { useStateManagerContext } from \"~/context/stateManager\";\nimport useIsMobile from \"~/hooks/useIsMobile\";\n\n// TODO Move this import to sdks/sdks-app/src/App.tsx once all SDKs are migrated\nimport \"~/assets/styles/globals.css\";\n\nimport { TrackingProvider, initializeAnalytics } from \"~/tracking\";\nimport { LocalLogicProvider } from \"~/context/LocalLogicProvider\";\nimport { ANALYTICS_SETTINGS } from \"~/constants/analytics\";\n\nimport ResizeWrapper from \"~/components/ResizeWrapper\";\nimport { ValidateOptions } from \"~/components/ValidateOptions\";\nimport { ProductNames } from \"~/types\";\n\ninitializeAnalytics(ANALYTICS_SETTINGS.neighborhoodMatch.key);\n\nconst NeighborhoodMatch = () => {\n const { sdkState } = useStateManagerContext<NeighborhoodMatchProps>();\n const isMobile = useIsMobile();\n\n const locale = sdkState.globalOptions?.locale || \"en\";\n\n const location = useMemo(() => {\n if (sdkState.options?.geographyId) {\n return {\n geographyId: sdkState.options?.geographyId,\n };\n }\n\n return {\n lat: sdkState.options?.lat,\n lng: sdkState.options?.lng,\n };\n }, [\n sdkState.options?.lat,\n sdkState.options?.lng,\n sdkState.options?.geographyId,\n ]);\n\n return (\n <ResizeWrapper>\n <ValidateOptions\n sdk=\"Neighborhood Match\"\n schema={schema}\n options={sdkState.options!}\n >\n <LocalLogicProvider\n environment={sdkState.globalOptions?.environment?.api}\n apiKey={sdkState.apiKey}\n appearance={sdkState.globalOptions?.appearance}\n locale={sdkState.globalOptions?.locale}\n product={ProductNames.NEIGHBORHOOD_MATCH}\n >\n <TrackingProvider\n trackingPipelineSettings={{\n apiKey: sdkState.apiKey || \"\",\n }}\n analyticsSettings={ANALYTICS_SETTINGS.neighborhoodMatch}\n meta={{\n clientId: sdkState.clientId,\n productName: ProductNames.NEIGHBORHOOD_MATCH,\n productVersion: FULL_APP_VERSION,\n }}\n attributes={{\n location,\n host: sdkState.location,\n host_url: document.referrer,\n locale,\n isMobile,\n }}\n flags={{\n isDebugMode:\n import.meta.env.VITE_TRACKING_PIPELINE_DEBUG === \"true\",\n }}\n >\n <NeighborhoodMatchProvider>\n <Content />\n </NeighborhoodMatchProvider>\n </TrackingProvider>\n </LocalLogicProvider>\n </ValidateOptions>\n </ResizeWrapper>\n );\n};\n\nexport default NeighborhoodMatch;\n"],"mappings":"CAMA,WAAA,MAAA,EAAA,CAAA,MAAA,WAAA,WAAA,UAAA,YAAA,EAAA,CAAA,YAAA,SAAA,EAAA,EAAA,GAAA,GAAA,MAAA,EAAA,MAAA,CAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAAA,GAAA,GAAA,MAAA,EAAA,MAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,IAAA,KAAA,EAAA,GAAA,CAAA,EAAA,eAAA,KAAA,EAAA,GAAA,CAAA,IAAA,IAAA,EAAA,QAAA,GAAA,SAAA,EAAA,GAAA,EAAA,EAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,GAAA,GAAA,OAAA,sBAAA,CAAA,IAAA,EAAA,OAAA,sBAAA,GAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,EAAA,EAAA,IAAA,IAAA,EAAA,QAAA,IAAA,CAAA,EAAA,qBAAA,KAAA,EAAA,KAAA,EAAA,GAAA,EAAA,GAAA,CAAA,OAAA,CAAA,CAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,OAAA,KAAA,GAAA,GAAA,OAAA,sBAAA,CAAA,IAAA,EAAA,OAAA,sBAAA,GAAA,IAAA,EAAA,EAAA,OAAA,SAAA,GAAA,OAAA,OAAA,yBAAA,EAAA,GAAA,UAAA,IAAA,EAAA,KAAA,MAAA,EAAA,EAAA,CAAA,OAAA,CAAA,CAAA,SAAA,EAAA,GAAA,IAAA,IAAA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CAAA,IAAA,EAAA,MAAA,UAAA,GAAA,UAAA,GAAA,CAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,GAAA,QAAA,SAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,OAAA,0BAAA,OAAA,iBAAA,EAAA,OAAA,0BAAA,IAAA,EAAA,OAAA,IAAA,QAAA,SAAA,GAAA,OAAA,eAAA,EAAA,EAAA,OAAA,yBAAA,EAAA,GAAA,EAAA,CAAA,OAAA,CAAA,CAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,SAAA,GAAA,IAAA,EAAA,SAAA,EAAA,GAAA,GAAA,iBAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,OAAA,aAAA,QAAA,IAAA,EAAA,CAAA,IAAA,EAAA,EAAA,KAAA,EAAA,GAAA,WAAA,GAAA,iBAAA,EAAA,OAAA,EAAA,MAAA,IAAA,UAAA,+CAAA,CAAA,OAAA,WAAA,EAAA,OAAA,QAAA,EAAA,CAAA,CAAA,EAAA,UAAA,MAAA,iBAAA,EAAA,EAAA,EAAA,EAAA,CAAA,CAAA,MAAA,EAAA,OAAA,eAAA,EAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,GAAA,EAAA,CAAA,CAAA,OAAA,SAAA,CAAA,wCAAA,0CAAA,4BAAA,6BAAA,gCAAA,sCAAA,gDAAA,mCAAA,+BAAA,qCAAA,uCAAA,mCAAA,mCAAA,qCAAA,qCAAA,8CAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EiBaA,SAAgB,KACd,MAAM,EAAE,GAAM,EAAe,CAAC,oBAAqB,WAC7C,EAAW,KACX,UACJ,EAAA,UACA,EAAA,qBACA,EAAA,sBACA,EAAA,sBACA,GACE,IAqBJ,OAAI,GAA6C,IAAhC,EAAqB,QAC7B,EAAA,EAAA,KAAC,EAAD,CAAe,KAAM,EAAE,YAG5B,GAEA,EAAA,EAAA,KAAC,EAAD,CAAe,WAAA,EACZ,SAAA,CAAC,EAAG,EAAG,EAAG,GAAG,IAAK,IACjB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAhB,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAA,SAAgB,OAEhB,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,OAAD,CAAY,SALE,sCAAsC,SAehE,EAAA,EAAA,KAAC,EAAD,CAA0B,YACvB,SAAA,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,EALZ,SAAA,MAOmD,IAAzC,EAAa,0BACnB,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EACX,cAAY,uCAEZ,UAAA,EAAA,EAAA,KAAC,EAAD,CACE,kBAAkB,EAClB,mBAAmB,EACnB,WACG,KACC,EAAa,wBAEjB,QAAS,EAAa,wBAErB,SAAA,EAAE,QAAQ,EAAa,gCAK9B,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAhB,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CAAgB,WAAU,EAAa,KACpC,SAAA,EAAa,OAGf,EAAa,SACZ,EAAA,EAAA,KAAC,EAAD,CAAA,SACG,OAAO,QAAQ,EAAa,QAAQ,IAAA,EACjC,EAAK,KACL,GAAS,IACP,EAAA,EAAA,KAAC,EAAD,CAEE,MAAO,EACL,iBAAiB,WAEnB,SAAU,EACH,SALF,wBAAwB,EAAa,aAAa,aApChE,6BAA6B,EAAa,MA7CzB,SAiGhC,CCpHA,SAAgB,KACd,MAAM,EAAE,GAAM,EAAe,CAAC,oBAAqB,YAC7C,MAAE,EAAA,OAAO,EAAA,UAAQ,EAAA,MAAW,EAAA,iBAAO,EAAA,gBAAkB,GACzD,IAEF,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CACE,MACmB,iBAAV,IAAgC,IAAV,EACzB,EACA,EAAE,QAAS,CACT,QAAS,OAKnB,EAAA,EAAA,KAAC,EAAD,CAA+B,mBAA6B,eAE5D,EAAA,EAAA,KAAC,GAAD,CAAgB,IAChB,EAAA,EAAA,KAAC,EAAD,CAAmB,IAEnB,EAAA,EAAA,KAAC,EAAD,CACE,QAAQ,qBACA,SACR,SAAU,MAIlB,+bjBtCa,EAA2B,CACtC,IAAA,IAAW,CAAC,wBACZ,KAAO,GACL,IAAI,EAAyB,MAAO,IEQ3B,EACX,IAEA,MAAM,EAAc,KACb,EAAO,IAAA,EAAY,EAAA,UAPR,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,GAEf,CCZM,CAAA,EAAA,EAAA,CAAA,EAA0C,GAAA,CAAA,EAAA,CAAQ,MAZtC,KAcV,GAAA,EAAuB,EAAA,SAAA,KAC3B,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,SACE,EACA,GAEA,GAC4B,MAA1B,GAC6C,MAA7C,EAAsB,oBAEtB,OAAO,EAGT,IAAI,EAA0B,GAgB9B,OATE,EAJA,KAAK,IACH,EAAI,EAAyB,EAAsB,qBACjD,IAEsB,UAE1B,EAAyB,EAAsB,oBAErB,WAEA,WAG5B,EAAA,EAAA,CAAA,EACK,GAAA,CAAA,EAAA,CACsB,2BAE7B,CGKM,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,4BACA,EAAA,0BAAA,kCACA,EAAA,mBAAA,yCACF,CAJO,CAIP,CAAA,GAIY,EAAL,SAAA,UACL,EAAA,WAAA,aACA,EAAA,0BAAA,4BACA,EAAA,mBAAA,sBACF,CAJO,CAIP,CAAA,SCIM,EAAA,EAAiC,cACrC,CAAC,GAGG,EAAA,KAAA,EAA6B,EAAA,YAAW,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,EAAc,EAAA,SAAA,KAAc,IAAA,EAAA,EAC/C,MAAM,EAAmB,OAAO,QAAQ,GAAiB,CAAC,GAE1D,MAAO,CACL,YAAgC,QAAhC,EAAa,EAAiB,UAAE,IAAA,OAAA,EAAnB,EAAsB,GACnC,UAA8B,QAA9B,EAAW,EAAiB,UAAE,IAAA,OAAA,EAAnB,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,EAAY,EAAA,SAAA,IACV,GAAsB,EAC5B,CAAC,EAAoB,IAGjB,GAAA,EAAe,EAAA,SAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAAA,MACZ,CACL,MAAgB,QAAhB,EAAO,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,MACzB,QACA,eACA,UACA,WACA,WACA,YACA,UAAW,EACX,mBACA,uBACA,wBACA,sBAAgC,QAAhC,EAAuB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,sBACzC,gBAA0B,QAA1B,EAAiB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,gBACnC,eAAyB,QAAzB,EAAgB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,eAClC,SACA,OAAO,aAAA,EAAA,EAAW,QAAS,KAE7B,CACW,QADX,EACE,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,MACT,QADS,EAClB,EAAS,eAAA,IAAA,OAAA,EAAT,EAAkB,gBAClB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAIJ,OACE,EAAA,EAAA,KAAC,EAAyB,SAA1B,CAAmC,MAAO,EACvC,cE7IM,EAAA,EACX,aAAY,EACZ,uBAKA,MAAM,EAAE,GAAM,EAAe,qBAE7B,OACE,EAAA,EAAA,KAAC,IAAD,CACE,UDjBc,4QCkBd,cAAY,iCACZ,kBAAiB,EAEhB,SAAA,EAAE,EAAmB,8BAAgC,cAAe,CACnE,mBACA,cAAe,CAAE,aAAa,QETzB,EAAA,KACX,MAAM,EAAE,GAAM,EAAe,qBACvB,EAAW,KACX,MAAE,EAAA,aAAO,EAAA,QAAc,EAAA,SAAS,EAAA,SAAU,GAC9C,IACI,EAAc,IA6CpB,OAAK,UAAA,EAAa,KAAQ,GAAW,IAAU,EACtC,MAIP,EAAA,EAAA,KAAC,MAAD,CACE,UDtEmB,0CCuEnB,cAAY,gCAEZ,UAAA,EAAA,EAAA,MAAC,EAAD,CAAQ,QAAQ,YAAY,QApD1B,KACA,IACF,EAAS,UAAU,CACjB,UAAW,EAAuB,mBAClC,gBAAiB,CACf,CACE,MAAO,yBACP,KAAM,gBAKZ,EAAS,oBAAoB,CAC3B,UAAW,EAAgB,mBAC3B,gBAAiB,CACf,0BAA2B,eAG/B,MAGG,GAAW,EAAQ,IACtB,EAAS,UAAU,CACjB,UAAW,EAAuB,mBAClC,gBAAiB,CACf,CACE,MAAO,yBACP,KAAM,gBAKZ,EAAS,oBAAoB,CAC3B,UAAW,EAAgB,mBAC3B,gBAAiB,CACf,0BAA2B,eAI/B,MAaA,SAAA,CACG,GAAW,EAAE,oBACZ,GAAW,EAAQ,GAAgB,EAAE,6BG3DlC,EAAA,IAOI,IAPI,IACnB,EAAA,SACA,EAAA,SACA,EAAA,QACA,EAAA,SACA,GACG,EAAA,EAAA,EAAA,EAAA,GAEH,MAAM,eAAE,EAAA,sBAAgB,GAA0B,IAE5C,GAAA,EAAQ,EAAA,SAAA,IAEV,EACI,CAAC,EACD,CACE,gBAAiB,OAAO,GAAA,6DAEhC,CAAC,IAGG,GAAA,EAAc,EAAA,SAAA,IACb,EACD,EAAiB,WAEd,SAHqB,SAI3B,CAAC,EAAgB,IAwBpB,OACE,EAAA,EAAA,MAAC,IAAA,EAAA,EAAA,CACC,QAxBmB,IACrB,EAAM,iBAEN,MAAM,KAAE,GAAS,EAAM,cAGpB,QACmC,IAA7B,EAAM,cAAc,MACX,IAAhB,EAAK,cAKgB,IAAZ,GACT,IAGiB,OAAf,OAAO,MACT,OAAO,IAAI,SAAS,KAAO,EAAM,cAAc,QAO/C,KAAM,QAAO,EACb,UDrEmB,+kBCsEnB,cAAY,0BACZ,iBAAgB,EAChB,oBAAmB,GACf,GAAA,CAAA,EAAA,CAPN,SAAA,GASK,IAAmB,KACpB,EAAA,EAAA,KAAC,MAAD,CACE,UDhEgB,oQCiEhB,cAAY,gCACL,UAIV,OE/EM,EAAA,IAAA,IAAS,SACpB,GACG,EAAA,EAAA,EAAA,EAAA,GAAA,OAEH,EAAA,EAAA,KAAC,KAAA,EAAA,EAAA,CACC,UDTiB,0ICUjB,cAAY,iCACR,GAAA,CAAA,EAAA,CAEH,eCTQ,EAAA,EACX,aAAY,EACZ,eAKA,EAAA,EAAA,KAAC,MAAD,CACE,ULZqB,yIKarB,cAAY,+BACZ,kBAAiB,EAEhB,aCdQ,EAAkB,iCAClB,EAAM,yBGAN,EAAgC,EAAO,CAClD,IAAK,IACF,KAAI,GAAK,6BACT,IAAI,GAAI,6BACR,KAAK,cAAe,CACnB,GAAK,GAAgD,iBAAhB,EACrC,KAAO,GAAgB,EAAY,WACnC,UAAY,GAAgB,EAAY,aAE5C,IAAK,IACF,KAAI,IAAM,8BACV,IAAI,IAAK,8BACT,KAAK,cAAe,CACnB,GAAK,GAAgD,iBAAhB,EACrC,KAAO,GAAgB,EAAY,WACnC,UAAY,GAAgB,EAAY,aAE5C,YAAa,IAAS,WACtB,MAAO,IAA0B,WACjC,sBAAuB,IAAU,WACjC,gBAAiB,IAAU,WAC3B,eAAgB,IAAU,aACzB,WAAU,GCNb,EAAoB,EAAmB,kBAAkB,KAAG,EAAA,UAEtD,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,EAAW,EAAA,SAAA,KAAc,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,QAElB,UAAA,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,mBAEtB,UAAA,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,GAGJ,UAAA,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,GAAD,CAAU,mBpB3ExB"}