From f0a06a9053f357f6fedf5bbe5bab13b0723969ee Mon Sep 17 00:00:00 2001 From: Lanskikh Date: Wed, 23 Apr 2025 17:26:28 +0500 Subject: [PATCH] search pages with filters in process --- .env | 1 + bun.lock | 10 +- package.json | 4 +- .../images/search/rove_home_dubai_marina.png | Bin 0 -> 16203 bytes .../images/search/rove_home_marasi_drive.png | Bin 0 -> 14098 bytes src/api/ky.ts | 5 + src/components/Compass.tsx | 2 +- src/components/FlatCard.tsx | 48 ++++ src/components/Footer.tsx | 2 +- src/components/FullScreenButton.tsx | 2 +- src/components/Header.tsx | 4 +- src/components/Map.tsx | 4 +- src/components/ProjectFilter.tsx | 32 +++ src/components/SearchFilters.tsx | 252 ++++++++++++++++++ src/components/UnitTypesFilter.tsx | 29 ++ src/components/WeatherWidget.tsx | 6 +- src/components/icons/FiltersIcon.tsx | 12 + src/components/icons/HeartIcon.tsx | 15 ++ src/components/icons/RestartIcon.tsx | 14 + src/components/ui/MultiRangeSlider.tsx | 19 +- src/data/projects.ts | 10 + src/hooks/useDebounce.ts | 13 + src/index.css | 16 +- src/layout/DefaultLayout.tsx | 4 +- src/lib/queryClient.ts | 5 + src/main.tsx | 8 +- src/pages/SearchPage.tsx | 107 +++++++- src/types/IUnit.ts | 15 ++ vite.config.ts | 2 +- 29 files changed, 602 insertions(+), 39 deletions(-) create mode 100644 .env create mode 100644 public/images/search/rove_home_dubai_marina.png create mode 100644 public/images/search/rove_home_marasi_drive.png create mode 100644 src/api/ky.ts create mode 100644 src/components/FlatCard.tsx create mode 100644 src/components/ProjectFilter.tsx create mode 100644 src/components/SearchFilters.tsx create mode 100644 src/components/UnitTypesFilter.tsx create mode 100644 src/components/icons/FiltersIcon.tsx create mode 100644 src/components/icons/HeartIcon.tsx create mode 100644 src/components/icons/RestartIcon.tsx create mode 100644 src/data/projects.ts create mode 100644 src/hooks/useDebounce.ts create mode 100644 src/lib/queryClient.ts create mode 100644 src/types/IUnit.ts diff --git a/.env b/.env new file mode 100644 index 0000000..cd41370 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +VITE_API_URL=http://localhost:3000 \ No newline at end of file diff --git a/bun.lock b/bun.lock index 06b217b..2c0561c 100644 --- a/bun.lock +++ b/bun.lock @@ -5,12 +5,12 @@ "name": "irth-new", "dependencies": { "@tailwindcss/vite": "^4.1.3", - "@tanstack/react-query": "^5.72.1", + "@tanstack/react-query": "^5.74.4", "@tweenjs/tween.js": "^25.0.0", "@uidotdev/usehooks": "^2.4.1", "clsx": "^2.1.1", "gsap": "^3.12.7", - "ky": "^1.8.0", + "ky": "^1.8.1", "motion": "^12.6.3", "openmeteo": "^1.2.0", "react": "^19.0.0", @@ -216,9 +216,9 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.3", "", { "dependencies": { "@tailwindcss/node": "4.1.3", "@tailwindcss/oxide": "4.1.3", "tailwindcss": "4.1.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "sha512-lUI/QaDxLtlV52Lho6pu07CG9pSnRYLOPmKGIQjyHdTBagemc6HmgZxyjGAQ/5HMPrNeWBfTVIpQl0/jLXvWHQ=="], - "@tanstack/query-core": ["@tanstack/query-core@5.72.1", "", {}, "sha512-nOu0EEkZuJ0BZnYgeaEfo44+psq1jBO7/zp3KudixD4dvgOVerrhAhDEKsWx2N7MxB59mjO4r0ddP/VqWGPK+Q=="], + "@tanstack/query-core": ["@tanstack/query-core@5.74.4", "", {}, "sha512-YuG0A0+3i9b2Gfo9fkmNnkUWh5+5cFhWBN0pJAHkHilTx6A0nv8kepkk4T4GRt4e5ahbtFj2eTtkiPcVU1xO4A=="], - "@tanstack/react-query": ["@tanstack/react-query@5.72.1", "", { "dependencies": { "@tanstack/query-core": "5.72.1" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-4UEMyRx54xj144D2nDvDIMiXSG5BrqyCJrmyNoGbymNS+VWODcBDFrmRk9p2fe12UGZ4JtKPTNuW2Jg0aisUgQ=="], + "@tanstack/react-query": ["@tanstack/react-query@5.74.4", "", { "dependencies": { "@tanstack/query-core": "5.74.4" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-mAbxw60d4ffQ4qmRYfkO1xzRBPUEf/72Dgo3qqea0J66nIKuDTLEqQt0ku++SDFlMGMnB6uKDnEG1xD/TDse4Q=="], "@tweenjs/tween.js": ["@tweenjs/tween.js@25.0.0", "", {}, "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A=="], @@ -390,7 +390,7 @@ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - "ky": ["ky@1.8.0", "", {}, "sha512-DoKGmG27nT8t/1F9gV8vNzggJ3mLAyD49J8tTMWHeZvS8qLc7GlyTieicYtFzvDznMe/q2u38peOjkWc5/pjvw=="], + "ky": ["ky@1.8.1", "", {}, "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="], "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], diff --git a/package.json b/package.json index 4c1b0ce..49a8c99 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,12 @@ }, "dependencies": { "@tailwindcss/vite": "^4.1.3", - "@tanstack/react-query": "^5.72.1", + "@tanstack/react-query": "^5.74.4", "@tweenjs/tween.js": "^25.0.0", "@uidotdev/usehooks": "^2.4.1", "clsx": "^2.1.1", "gsap": "^3.12.7", - "ky": "^1.8.0", + "ky": "^1.8.1", "motion": "^12.6.3", "openmeteo": "^1.2.0", "react": "^19.0.0", diff --git a/public/images/search/rove_home_dubai_marina.png b/public/images/search/rove_home_dubai_marina.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab718bad12a7bb6d80806f6a0a3a25372f729ff GIT binary patch literal 16203 zcmV-RKeWJ!P)A*= z4ohE_EwjDv^xpo@`_Ag;?thnyUQBM1&BE+5^ZR|@Z+Xi5P89e*d>r4g$-eSC-=BN) z{a-J)MOy0Cz5c9o$|YAh$IZM0*;b8n<#+xS7QG6kWtD(I?2&R;(HQ=B>1fEiaT z!o6Sr5jqaP1&^i>k+cSzU-=W#Y7-)^Be-hL#i*zm%Q)(gD7^@Oeq}3+dZ6{K-($s! zhg?m4;hoCrSzDg@!!tWQ^*jG*0afFl@bJgubCoI8BWYmn@P(uH?Qd>G*=2X2+~`Ml zy9;-Gdo^ym`9`$v-H4vnQ^=WI4Mo6zOxDG#k_Y;m$b-Omdv(trtz(a}8`5^-54o06)L}RTAq<)Z2ChaLCMg2mlR3PB< zpY6cd^$z1`yC1!AErQk}>^rgnrnp~bpW7S2 z&z}7Y+H7?gw2#G$-@6Uj3O^?0#GxMd1?=|e5g&44&#O9o#VQoyf7AR=3R;aCJx!w)B`MEe9G{JRb7i@`POc_^ew^!HA?F$Soy>xWB=Uj8! z34BhE&n19vx7+#6?|yreB8?Tv6zm@dj6;LLOCcq{iwB?AS#Z&qJcN>37}Eh9ICLC2 zMgz|5ehnYKvkm&}B21bv1!Kz{_~By@p|iCGIXVT@Y8@;_Bg#t)apP_Of@Cs^fpfdD z`1Y@%FPK1!vJ^UZ1CH+7g)3&&VNA^=@S+!#fQe^Ml&5&=u4GKyaUH{UbdRMMo`FCaG|GEdd-L3Yaq2ATZvQ?>c!Y;E*nP32!dGd?FOUL<} ziIJ~3vnB?I&4}Op=vzqH%4Bp~T08LKt`k`C)vw~@=3k?|=_I1@I3i&`{KJFrutYDO zF%@Ob3Yc|j!Wb=*ia3g$c_^zbL@bu(A`aq>ZCm+byK(LGY7A-$fT=fQ&(UKzN0>7y z2l&B{e};B*4WeN;{_@O^apvGIdvj~&nouaV3V+Are}x0xJw48ZDz%CKx=tb1Kq)eg z-;_!QF!Pcrm3Uey-$D!z@vNFKq`Q9zw&VcX2IJ5~`tg$=J&kcwrsKrn{kYKU!Quro zFy-oHEdM0F_V99ynK%tIN{tvlegdpkGn6VN4xYULw`UN055I}hqS44Vm1D!^w_rBu zF{+{j)zvkaJbe~YHCJPB+rJ?kS3{-M!|W(PjWZu_H^mS-xdFd>{xu|cy{UM-p4WGM zR#uh^pYidTGmx3*Osir$l!{cHn*B|wOcDz*fFh0xF;~-2F`D8zl_*;_d}TWGrBSI6 z9Oyx3p9jOk!w97`ym&wM?AV6=E&Z?+mh-oX^%&@3uNz0}PvVBFF2jJi0^I@j(s&H% zWE$6Ael?~|nvbu4`R4@TCvl{4H>$^shMkb8wYiO1=Eut~uEqJk{16u{S_a$XD`74u z$Ez>@4zZyYOtS?r^N#OvLD^W6anY^oQt8x=9`Z#sfj#GrI}<6z4y{)2RPa{Q zGDs=844k|SVoC;$wfji`A%mKdD<$BJne^e^bQacs6VR*F$j!0h%A1$LGt>j$un+ft@#|c(C@#8qGGAjK zRK_IgCe&g32S?Dx0W{Eh42IAk#$9?1e5NYcwE?`p>nKvaO{lCH&!C%;N+iVH*p=zT zl1IP&*p{cCdiqljmrq^7J+0@Qu}Ek~EE;o0qY;!4+^SRx0q>AjWlB`V#;1@=qJ*ek z5j&BYY0(h*XEn>O-yedm|0EiM*|5NepD;*TTP|wnd;wp7`|Rw|Xs>-#8CXKXwmJ9NGsZgWz@#;_SJzxa*edQ8M#t z7z&(ZC_t32`-SN>STv~=Uwr&&SZgnb4q>cW^GB$aR%nzC+ICN`gn%Jubh zZPIAePDgH@92l`cKu%bZSt>=0!BNSfA%?9OBC3=qXkJWGDRW%T6+Rc?RK4bod(hR{ z4P&?;$`~_b>{vW<&yCQe5|}lOSpzMyv}u%=WZ`=c-icH=ig86Hh=n2;_JvScX2p$* zuELZ_6VcyPkE_1$FtQzC6wlG&NPRu_?cIwz7hi$ywg4V^;3@p+rIjch?ce|@ho@r@ z7MmTL-`kBrmj9)be#M|G5#xm`#S|3%n$aWzbMpJ9*4EZ}6%`f#V>$oL4D4<`wOXgw z*NN3hB@>8p`icH0-bKw!O3S&y$R(2uYD#`3Q-m)mF*p)3JLMNIQp4bfeQxY}YXgpT z1koD+LY{tvLP0EC_7!|%^*YpX81#Dr=n5*adB;K2b26XW^A=*moy=GT{A4IgzWQTy z87r`>sSm&V_N~zQIx$JzkD|GEBYW137&qEUY`GaPu6YJ`UH1SUzxM~o&$mKPe0Z?o zAZ*!ojGZ(ErKKfE#G<^;lw>z74bgmLCa}8daVI8N({eAfPzpsLUlhPG2k%1JUh!`@h(qPu?xrn=aaMM?R zgtnd@vo_8vM2UHd-t4hNB6Fa}Gmz7-!G+KVEB?pP{_ zMc3WJ%=QvVh_-_f_LS*`*)|gn9c`F7aoSApyKiqj@RpvTmWBwXiVQ_dcyhL-582hzp$>J!rb**M zVG7f$IB&JTCit-#2)~x<1I?kR#X-*d6d^tT;n*8i6+;;n2&?ce? zp52R!7vBd3MFvGl9lX6RyuI}`Oeo97@X6hne8o-7Iw$&k?1jU=Sqr@S`VIvAL0Bw0p+VXc{`m9wEE#xo z|Bj{Z?v`&EsGg_whf~pJGRjG1(kW&3Nd_V^O-xzwXHms6$eGD2Ry9-6NtvN) zmP!x%-uN;bJOnXzbpq?xZ^Xa<@pX)``tiH(e+5IsLl`w>4!pztczoqgxi}h@yACDA z#VE=$G85I9fAw`x^Yw3d;M?dP93+1}jrVpRfO@DE#RkBVTZAz;Jq8`Qv+Mm=FgP@f zNPjOboiYKH)uZ7qyaaZg7xzDKF9+L@Y(sjTinK6_b(?ofx+t<;!{?Rc?*^U5`K5dB zaxsHXe5wFGboZ^BEZGHiy(Js*L<|G%=LvcTk(E;@`-I7;mVH7wQoCC$Rf_vh99ARN|L$qTOJ+bv2()eEOPE4xcE`it$MtvJ zhpuyn;8A8HsLdog+k!yz~(1$s9 ztblXER19>rqm`MycgvrUPc5dvZo#xgcR`(B4pYL97vJ6ut-BNR=g)#I%YdG)e!RK; z1hVW#*>)svQjCxTuD*&rR;5zeQ}J|!S-9)32JrZf9nPWN##M25uifIvgC(aF23t0K zejhqG{)7e;ktAuE zF@^OT-oOKo{}83AHaz+Ga`@?SluVk9{@z}E|Hn@<;ARZOG^lVoQI=yMz)<0u8*f1> zmco>I3(?ch-pD_{zk3%76kZIrG$OaC6gMqffq+4ezJ_DC(Aox*zZ;r>ANJA;OuqRm zD9JZr{(`B9c-+{`%yTe!3faF!)ewTo>&-}TT5@ z>*hp`6I2VdprRg`qs1QU!X~clrU-y^SHa+!U0{GFU=a(pBzU5lI z8IH1A$!S$O9R|9a5#@Btc4WhBwaFE-6QhYhsyV4da~FYAm~ z!|RXmcQqP~{)R7nVb_LDTU;V;pKxJwcEMt`EsqLQFO`?Gh=}BvUx*~J@Np~)0T8P447C@gp=>R3}tr@E~+f#dZlEb3Wyo+zjijt ziwjUyRf9P<+>iF=bC{Sv1?ucH&K-FT#lAiq+xZSf)k{$`=UQB(Rl^%i;=uc>U^1le z(FfZwaq1;#t-b|0b|o%!d0~`;k&CMrLCc7BYK>VALow`hd<_%vVp6GtPNR8*A=~*$ z25x%(d3(^;y-pe8cuxdj&E^2f%7c-EBuweb-E)B`rh_U>u^jCVt0wa=1@C1hrV|Od z2uWsOie-?=z_grT@wk9D6!ar83Ih>DwGMO~`v5*`E%b=swU?jAEnj~UU-{P`VcPVW z=)Q22O(!3|qz2#p4sqU)57F+^FcC_acug7(qO7rV&`6-YZ{H4_`EUbD?K%|e5-6g` zYN31;jRY}ZFNC}0INYcAVW_WUqe%={?tCBz}8&>9MET6o>>*KgSpkpcYD9oH<(%P+poR$2qC z(TXrLrIXM>tDtz`AA~8pkQZOXR8GnsWY04|q0_L}aXM*K9P`@DPF zH;v!ZYSEN4&$o8=qhj(LsN(@-vxIl;IDiS`CnC}E5q|Z=qk_A@Q8kSm)s34U{5lFb zKn9~Kl$JZm9t^~mT1>m&Xg;+M z#l@u(NN1S|Vm+v^NFi zJHag4@X8C!3_C8l<`y|^%PXo-NTs-gzHa}8bA(OV5?&a%U^xyu9(~|GD$31NtqquT zC3&$y2j|qwkwwUJ>ikDYQf}M2aUJwg51cgzt8?;;?6$lz zW>+yQs1lt`CrJJkWFcoj0g(N$k~~o*{f?|`rR0xNKa*@j0>Vrd3LK?Ueu4)DRuODP ztg4WW{3-`DUKiY&64_hUulX~U|KcUwe(!^rIAI(*P9G!#FTp@aL52DebbEXp45vx8 zG!WQSPYbg%dolu)QQv$2U7UDt1IiqvUd-50Gv;H$^m%CS?8J>Lp2P=RpM$&c7!Dsi zfGRSMiKDBbv^uc(;h%tsh`AFBI6Q(hy1WvOsd%j_-iL;nDJ%&!?^UHxv;Xlq(c4GZ zlv-;NWnQpx)0SVV2%hbZ%F#b__q9vtG1PsY+_Hs`!48u>mswawL#7JNEb085T>eg) zlum;T$^DpRWc*Z9Lb4+=&aIpl6$FRblVG!^koj z;61+^zxd9h>@OPRRL_7S;=`hQAA*tiEyP7BqqJW@^(4VR&%fawN>j{Miw{sIQJq0S>ap)zMPn~4QUOFQTk z>c}?4qKm#Q0;goQDO6h7lG5=oTa`u*7V$fj9H;<6M+62|D(9%J4*Q(kQRCnzIoA-z4EMJp(RG2%G>SA=$6|B9R56Zt%EcFBXAosc zg$4p6v8>X`jN+V@#sXvsr-|E?X$j@ID3DWFO010IAo14ZvE}I0+K|QUJm1`kAHJ{^ zmrbuDgz7=4=QKiuNMYX27aw{YmBej@mI!KUFCuf8ghV)q;swhParfg@dK`vL8!`Km zO9*^{YwunzG2qVaZ{rs~c@a-Pay9nt{tJxye1PRXeo`IG`Nfzpi+=HNH-=~t#Kgo+ zX7HYZ!4tbG)FKzsGT&rXsYPGp6jm$6?=g_Xgc=4p9t%5Fx8JmIDK)=3k*47A(CQ6v z6j#f!ZQ=llP=6D&Ziu}wFTaGTtAL}(%okP*1TC{oN~WUMLE>kr1%9F?@Xch2GjSDa z_CV@vhMKFO_P3KFDRB1m8F;!o(0Je-tozkZ5hwM_uAU07k1*q3?!)NnYJ7P3AWCT} zjjk$}?P0+!%itgCKz7L}zQ2cHyAVBG;C1WP;n1EBFsi%|!JZaOpc$pf9fK>D+<`7% z6x%jD4--Y)4X>=FL8YPrKbpN&LBTa9lR&tJVkjtu62p5FRixx1E13nNoJ9pmCz41Y zPI#wKt9w-s-gEPc?1De8D1XL2_j5;&&v?vROS}V1gl)eNXZFvcU+6w+|9H&0|00$24hc|7- zZOpg?%et7BX+^FDiGeosH#cDXxapD-=Gv`tcfxOe_$|cyy5P*Q;G!?wFU|R)saGPu zrkW~Q1A}6~p896&d*?O&4h0Cm8{;mThcN`tTAdbSF1r<}Knw1D;3o98^<&r*lp={* zT(=@4y$NAhICcW?iteXk4@`@}DTbvfTlV5qJmFC-yLIsjYGDOp$3WEG%YGGrUTdHd zQwSS@vmuN8SEEPc2?1luq*CGF)DzG|L9ro8g#%&27~Z%t8qWlbbW8%elw3{*FB4QE zXPi6J!)ZGf?x+q{T@o+;@sIe{n)mRs>4APb&c-d3$z4I<~bax@x-3W)x z3X|DRW}|?%uns=09f$Y6hr@5Kr37z)udNX?X3oY$x_pD~5SD%K7ic?k5OLoS_MdLS zxq~|~+;$eZHZ!se#ImKeDAJ}RuI+J?Zn6S3DotiIDl+&_^hKe=hZDxa{_8f2KF;^=1Sj>6@7y&L?L>L*oMJCD(E+m&hSSGxte-5|B#-_PPi8qy#godPvQKLy=eI8 zJ-qY6uUWz>l+;dxHWkLj*WN%zRLGf?CXg;iE|GzFuPImG!s_tBSvi(H(Fbcz0Xhf0 zbmF$-y{(%t+L?zziXW4ib&k=~C~uWu%mF=$GH<oJWW;S~1tMqxJghK%dVWciRvK2)t>uJH~Rg&tdl^M3BpaLGx2%>g% zggq`z)wzHy!$RDrWV2Qq&1gP(5PE(eXm8~L#Gw_2k?eD+Ol@-diohu3N+_g~n;xCx46)2$RAdBTS<50h z#9fF@1VW+V!esuQkiR3~j%xWAZ-2s6Tt(rOFh-}wP-iQ}gBF_Ltbc-9jln`eax|iR zU7c7NzDG`hNh%g%@}{+F39hBhDY#;Cj9s)N&+UCn+L!iVegscaH~wjVd&JPQL9 z68b$MSd3bPLq6FDRiYP;Y>Lv5=SSEk^aiu!!D=!Rzn7GkZep0pr@H<6%b)OewUT+* zh&Tjv$wpDtSOon6dLaa`1jb%su3lFI16L}yLgW-%Mpj5j6$~1`q%$o*wL&d>qatI? zN!%pyl=vc!@}&ql>USVytt1YQU>k9q*=|GCglV|p-mg)~2~j1kWV6>Hm)SAU+Xt22 zD)(3G>6T@&7j4`43S1|TQ5G{};#GHYp!s1etU*p;3H@RZ;_Ol5XI+DRFMS`Kts<~m zNzE>rI)jizi&=9QB1#9Yimk{!?13+oApY$lI1X}PgazJ`Qht)0H_4-tWo`-L^kL;tH5$=&-IYbCx;DuTo1yJzs0wd+- z8riE-8I@K5XN6*9|4YVL&uqzpybyt;MPpWoVMBP)+0umUs+sb&>;@&C`_oH!X8l$y zxO_IkWC#6SEy&3$qL^#IHCHbpGdaac-_ILRQq8tYJZaBz!mGAo_`+W7-TY_XmalyvW^(otRE!z}tG$3O=0)(3>5Qoz zhs9s~2Fe`_^2|#1;9mB6oAgAYe4nJ88)-R(A%zhQOWP|cYn=UFaAJQjj3}peJe6ut zEx+&9CHa+OopGkLbIc_1ByU(lzxE8vH7zYd4=16Ol9JHGRLrEjV*7{|n^9fF)J-ct z-U~A_y;4dUU{TI8$RetoX5D=Rtf3*QGTH2bF>Kwu1rw)CMa9HfxaGb_$b9@1ZaL6c zzInM08b!SnB2033t0*BoownViWgYEZG9zYOb2rRdGKPX${yxQm7F59% zQ?Q)Hu7sEzhC*Q%B1w!vGCPW;x-D8*kVDOAG{}i8`n|w}iCEmFHk$PH4zdmLrsWki zauOLR51lx$2Nl&84ED6a)f8nf^wB%DOM)RYEtT2eD}@BP163(ujckNu6aqx2)k-o9vt6+#Im`)f8Tr&H~4d-2q&CuwL6;`!Is zf*go6&LRQqV?TZlU41@y`h;5+MJ{{y`+E$B_bm%?`q&}l<`tHQ95-ovU9UgWGX;bisEWXDO^-?ME#1sHloi7FIFn^QO3e-cTjK$$sR8R8aoG` zhJ(nUR}mLmU8-AdxUw)DOWx+|??E{1hr726L%p3anoUv<&}z*n6iPG+w2*fMc+D-c zOM{4MA_s*4(*pk~#Y7feo}*q#eND<3QqdTh%IvefodYnjKZcbS31harz6BT0Uw|>w zF2~Kw9wIdGppeYLLeM;VR1MnOdr@3ER=$2V)o3GW+o_``aN+D(_GAakK9l}&p#wML7ois;I z4p;CnOg8$nJ~zp>2Tcv9*nr1Nx&sl+k)sO`mZkvL0?7y^T0AS|`;qOxiV-#v&ul!( zFU&%3fWyGkPija3i2rWU4YV~GghmRTqU0jG1~SUX|RE za%gQu=sB?!Yk&F*?)sN|aqgpfOucv(##T*cP!t#*>_++gucA_wz=7R6Fl+V%^wNMb zn`WSV!llSl3}akvHjW(XlbAJ0%ThoVQJRXR+$AMZLTh6a0^x*27YQN{VF3trJQ3qP zo3$rYYu9gy-2J7ymiBga*exuP{_ZyPbacqEEq1Sm8Fk@pWV1o1IJd=Fj{*iEDN|kq zCPAd{m1J8&n9KpCk)a|~4P{2XR%QTqG@Xa$`h(C|>@us)oji^|{Pr2R&KyNc<9WH0 z)j4)L*C2w?wY8*QB{GW(i;7`m#%P(vlP^QSeSQPSZl&Z{LN2Q>43D@f1zVuYa6S-!V(`L_}DR8lg{jZ2C9t+20DT%{< zS(Ls{G5zhlX${M+h)hJXoe-y2e?6y^pW|JRw8|(mG_%E0Y$8v}2`tPbMV!`PbO1vG zeH1CIRC)5~@}=;~OY8B)habdsH{FgaZ(0gJZ%izfIOaNSDh>AjVZN?`zJ!LJu7P~m zfCEPkqqDsmj@)A0eCI=`EziM)uz@Ny%QxRCk2w^TmY|{j0IWtMt;C5)pPL5n%_a4Rf?SQT1*%>4%!lmsks{1RYM4Hc#6P@ULFdE z;q?b(&yKU&@*SC-2SO?l!&#*gAUh`M9II{fCp!~dJGbmqX%wEW_>f)0-ja@aP)gIr z#-L^8m$DbyxSGc#$W5{TrHKXOMmtm7f|#H?l>QU$cIa{^3A2Uq9^xvw`HrMP(X&Xp z4k6LgL|&Q3P-+U=nh(-Asv|HBQC_m)D_^<~SvETs&YR3D(n>5kFyz6*E4~DsFM_Q{ zw@Vmg(CKAAoic?B%|gwtobar{I*%5?!u7&`&o zfiy0@crG(p&)F8m$<_f*bt_9Wg1){X^z-$EkrWPv2$u|;gLLC)hQ+CODv>$#A`Ev~ zzU2DKM0D3DI}^6-s*fyxXz9$V%AzqUtr4a|CmK&3mYaFRLB4^0H&dO{GpmFzY~V%D z<=8PxJ}GE08=}-pBTYM@iFP0rY-e`rG%f%d>F zFT8^LAO9xq`QkEMapRpB>gyqvo50f3Va}zOp}m*Gpm>Zt{*_NAVl^3Y@@yl{H_%9` zslnBYzr@OjAYv|Jwwh5kb_z?I45=@?8Vz}uE)G-`|bkYh?>GcHgVImI#Z7z^juau&DnWTv=ph6RDw9d>PDm+&86!zYxD&~2 zT@gWziyhiZMaJe);*-x}_)kZ@+S`x2{li1{91`yRd-kAq+(g2P9x2ZsI&ucJwG*hl z+HlDgizGjk=Ruf#X_0{p< z)5X67PyKEit{Ih!g$pl+A?`zi%8uWzeFq)G0ay!0;gY%Yc;l4R$cAz#QwioHb`tE_ zy$2?Xja3kr=Yne0 zYH398ppQA@l>rirM1Tgtxe6(tiOdagLW^N2Fk&p3bglaRUn)M1*?&5z)O_&0)$w@b ziFU06I&&U6+dAaA5IRSwru8ZKB2pp#W)}y;FfwvLJY&2NxA}uAilWC+S~VX=`#8L| zbv^v_XLs#8j{9$2gtEf1*xTUcuRGvVRidsmhbGo*sNhuBr=wCXPbSC$Nb$_sRyY`R z9kVLUJ{wJl-Cb0UnJ%HAR~~XqQToyfZc7MdrWR;(WJ~g&KW-+`0(+P)a~wnLbxcs4 z=xAy{(~)x&!jF^r)F3-cM}`%VL?9APO0pDW)OW|q7eOD1f?i@R#MkkznSC}^lnNUHdq1YbjDq|=B2li5O|QYPiL z<3ub(@ZT((eu_<>LzVxI0!3MkH0h6Z2XJKL5!`eo4Jr>+cLrWOAD4hy9H7)?96D8o zx(X43J+=yP`=O%)C-5FjA*9;>jKNl_ zG+ezfVNQrRs+hcT{@5IxIBvn{Qai>}UyDs2?ZIW2&A>Yc>M?QgU1-}O_-p3mW;m%v z39+<|6TB}#KFike<`G@dU96NT|yiVnq=#wAc< zOXAp3npfc=DFUc0Rcz!&xPwWSe*y+Vg<(I%%rH9;eT)xwZO1eYoH{{Qj%F9Do9Z<*)N)~8o? zwlzQRbXJlF53>ZQcvP{uUfPc^XD)j3L4m!S97&8V+T8U@9$kYVp02 z;?NMDz<=}js|T*%Tl>8oYQ280=m%Bbd*_g=QBOzX<9a+ZsKvDCtz1{6ty*-Ar`A7$!7-oyMYiv_1RLM7w1znEI*@3^s0cA(W68K2~lzksMeItQdP_S(+Mu5nbN#El{qA1 zBID4Ka^>acQPu9?@5H2gADCCBlj&7R_P}O#km!eLj#E)NKS=5mCNHG$Np8Gx%K;QS z2zF~KiRdHD(rn_Y0Hyf?_8z@drA?L`siX*SoG11h^Y@B{D4`VIRa#C-1E;ddq`@!; zla7E|0$agE#V#*N?BjBWgUBAS@u!~|E3!>|qMME-DwGsG1&18AfFZhV9`}&+HcVOB zh*3Qfdao#D9j)4=JZ-9$I^el;jmWQ^&inJovQ07A@w8IzhtaF!E57s8TGwX|pm=y(Do&gwoEq8a6X*0y ze*B?6#1~p}axE#Nk$BHyAvI*?h+`3heBUmLB6hNPi_M0aJ#uTX$h3eomw&WHr_cgn?W{cLBhp;6QfQ*3z1bR+J<2XoCS7^ z5VFLCWyt28W-7`L*P%ip1Z{DX8fo-ov^X^-GKuZQF@3(4-C`mJG{_*?vna!JV2H!o zxy(8(-_Psw&{MI)Aa=e|3(R3q`}+o@G!{|C|AuYI@tS$P(%wr zPf1>6j+lVMET^HNA@or7=HWHk+AQ zMv02FO2d+hrP5Mrl1H%wmE_`xGag!z3jDLHy*)Dw#Pp3u+vZbpXx&=R<2y>`sVW6=7oa8J9^?u=Yf-H zgp%R}x(WRQ{cQX;3~|+~Mpw(AdfaZbwRQ61RWkEF{`8`BIxJ0hxszWyd`c-`ic?WB zu>*iwn+TG~P}RsTsYE>E)ry1GqSq;;tCf_mV={RZ=+E>J@`%r>v6qx&tVc>H!bLN&ECntV z!z__Z$lx1^Lq+h!ZU~Lo4Z+v5GmCrsX$T>6a!SPo99=0sa3VsxG9p?a4D5@|gDw|4 z^}NlS*SS7zTt3q$Sgv04j%)dCOXh{5z8x$pr-~p`H1P!cRaa++B<}*%Tj}W8+04bM zA~6*O>KA*i4WwA^!6Eq>2!3Bsnm8f@Wri>Vl>ADv=Lv2r)bJ3oW|%&)nv%XasV-nm zDv|lT8gU$NtH^~iJkL8LXRcHft#=_ z=OT&@DP{~(Uc#9WjGWwpa>b~qC>fY!#Dt*7hw8ElVsol1>^<@r0fS<-@wJ9S5T8b) zA#PK%-^Nmz5697Kg%+8y9L2{6eEH6+ILK7&o0?DdXp2qaNrgB;CAJ$Yq<9yJ#HHIP zdY$0d0^%4b=)S#YCl}fdRWw|G`>o5audV%bpH}oAAOEXQZ~OSM=<2IiB_rMyb1s@7 zvm%d;K9`!ECwKuL9{3P##}&Bl1_SmT02)s>W9EE2P8?0(is^aiV;|e~?jUB)(4pL@ zhho?$QLLXL!+B;(T4}&=i2aIxuO3C{RNyDq&4Oo;IFuRYPg`-W;S93%X}MuMCIkYp zjYMOij;EKKPOW+Lp5I;NYOkS3TmqO{b2nb+FT=<0)~--=>e0b09a7z`*eFUO1l z_TYfO3w8(8}xI(P5hGe%=6!>x;Ii0)faZJP$Gy$@k;A+D&Mh$uR- zWm^K}RR+}aMmqZKD5>Ps<@bc%juv_^ab{OAs>a!VFT#ct?pW@`zWwd&opCgFyP-BI zV2|cvYQzTx>0zFq!-r5xVN=6QW9t3xM!0B5*|kIi9>Nu!1E<>jIMWf88%V{8gZ?4! z&a%SntKa{y{$2c?kI&^ZRO=g>JSQ4j*Z<(QDQ&MF>ZmihL-unGLzq~R15LUN>g+CT zK6)0RK`m;F?NmMrFihiKe6UR*sKIS>#-S>&f`h`1{pWqCy~K>k6(xA2?sA-sHsb6_ zuRMn=_UaiaJeUdSH6|^Nb`H?IqR5cep{-bneHR)r+|HpxEE&*>9jpd)_fo%PPb{Li zp?1Vv-Tr|Ud-k0BT0>Lk=kj6QpXXHhfK+UI=5A5f#)S8-0E7pVp(cfPJ-1 zgVJm#3amQxX#26l+W~7~DN-6E*3(~64`?veJ{l$k{gbo}Iu5F2%pf6>yRYBlcln>_ zXmd~gU~A)Ae2$OL^<$7fe(XQ%+I88IF^Q^dzur`vLUD z0`!LmP+MAt02x7ya#=gYRPk{)ld}ro47!~?Vi{Ad*h7&P+0<1qg|9PxP6X4TIIh6ipx-q`uB%jJpSbAJ3&K1+Y! zpMSoXUc(ZNR=ZT#mK)zch->Fhg-;T8DkP~e>g!wRfrQc0-HIW%5BA~`mUtV5(*P_+ z6^>I=6p*K?!iI@ue}GEYf+Gz-kROWEsiGKF>5P literal 0 HcmV?d00001 diff --git a/public/images/search/rove_home_marasi_drive.png b/public/images/search/rove_home_marasi_drive.png new file mode 100644 index 0000000000000000000000000000000000000000..22d2c60a0001a408adfbebbed664e5966d79c653 GIT binary patch literal 14098 zcmV+tH|@xYP)SZ5)B9Fcx$pn#q2yQ+NzwK>DI5?z zy;i;d-hKDp_j_pIpYV9-q05Ovq_*3%0z-f^;<|3qGOeUMCbwZ4F!{$YT;5}34bx2V zX4Zw9vJ5Nbn9hD*qjBt)?i$YGpXe~~k9a)v(9uL87}@Pw<}HR{>@f@^!Puzq@P~%u z!m{LV~|ZX_)F~ zzUQBFEuQ%ByE`ApKk)Gn7QhFXZDu5Lk71afbR9P#_c^>!DM|TMTY~44I}HSQLuZu^ zmIRis(?R0Tj^V1Dv`o3pY~+(2K8Iz@hb3!G=t#@+ESO#vJC2<)4eLJ3vG#xHJ#8uc z0~~LA0PkhsS_7ebTn5f(xCse_$|Q!*Vtq>BBr@`^P(9$%fZTzutUzq{i;yv@hk8ou z%e}17q+Do2O4ZPaCYdLh50gNsp^mRNZ6=u|IjkO+ z@@LcWFx0yso`A&^bzEZwFXgW+1bhOf+=XDC{y6W~uUSsO*Fawmjcex1plrGMMrjn{OB}eDGqd9uw>n z3{?Qpydo)c{@_y(0R0?UC{qRbapw4^K6LBPUe+dl#^VcLJAaSm^BpxTV|Uo^QzfRb z&X6E7695$q<|68bgP`eGCGC36!B)>;aO7f5(<^0HJuXjly>7w0g6-({ZJ3VADp?6> z8jkuz4F!&RKt*gNtK};7=eg>6Y+`$erAPmIf9|9B8IQM|fzl-Ef$)8P)BL3TEGKAr zL6Nd*xKeJ03SL73;?WhKrGZO@z^gk6nq*2thXn?)((mf#p~_RT#w$t7>&}kKIGx!( zW~8BT)mGUinQk)s4X?HhwSZ88RJdwrI57>ylOFuwjjf-;TRh%U0HtKvIUnOmjR?-U zULd5*4DT)FA`E5<$m1ll46mEoyr`h1OVM-%*EHDc64jX+jI^Ovt-!TQ8sj8*mM%ky zsA@Kb&L_zA2VEtI^CqsqC-EzM)L&${bFyTU2F$>U9z z@E-0$cNgL*_~yJW8Eb#e)+ z>s^mLgZGVCj=T4U80P%^J#T6;x7NWc_#lZ)Yn)mc6b^@hwY$wa|4kJ!q^ z);($>7bE`)o=E^2@)KX*67S+GYxr+>uSF!*iI)!?z*qm2%3UgA&{n zqAlfWdwsUqq~PeR_M5)fGgINAyOOz%;*K66=S%#q%FHCI<4p(g4VUmAKYTe^_uG4U ztx4S&T#uY+Y*Q!ZN*U@ds=6vPZE-z9Ec{NmpwyY6$|u0v6}0uO#w*YKCBF03|B7Gv z?eCy_V4YMxrYA1q(FZ<;pS$Z$Y<%ahVs?Q|C~P8EY9MUZnjDWAG0hq}Thja9ZJg`u;=FSLdi>kkAahY+_@Xzl34AAIT#1g4(E=f8Rk@xFCf znz@AR>=@Q<+Kf9s`Ue1oT_Mjc3SR8!;Bj#a*BCV)6Y&J@SSSlEGy-r*-SLRGo{GQ3x>GoTlD2bO!o;eiTbtJoCtBapTs096tO4e(o1OhW;(@#^Dzq#o0v{ zKX~?GTz%!07$3WU&D(Cpd-?eB0|#;N$v=cI7{wp{$6vwG<3|zOaW|&RG2*VH8j9+w zu3kJCnipb4wdlVJF-;8ziZMuWQ>GZMRxqwdKFJl2xjysOyRI~TqA~GPGw^}0Uwp9P zSR<~j%SGx@R@ybRV`6z(Sa%JDN3J5tE`mOt74mbvsb%?dq_qPtJpMW4OC?mQRs7DU ze-m*li~9Jp_|w1o3Z^fdMARw4Nsr^7-}ZhiP94FMfA%{#x%bQ1bk#c%iuNKF??AfZ z$NEGSwLnZ^u$FaFgDTk+bJQtj0_N*Zj%herXL~=pme*>eN<3)MZ3!cOIQRav`255G ze)iGJck_KeY57?eKD^%cJqJWiE?{arl=75@Vndg4jr2yICS~F0$JCrU0`X4FOrC+$ zsAE+}99L{wj~5QUh=2VX_u)^!^D@@c%huHVfmmHkfk%tBinLK zu4j*FP3}sEy60O*-Fx0r00sA$Ne>v7UP)Id3Qxl4(^%pN^a{pFz#Ls3ma?KuRn~IC z0_Kt(@^E`!5+|Pj8|?jyPZRf6qsHf)Jbe;h+j|x_+;|sqQx_C0v?Z@YX7V^D&%A_> zf8vwK)LU?H-`9~_T)>{Y-cRgnpkX`e3}W#foILbAzW>FKqP2bjEgkLD-^PlIBmeje zT`fwX2sWy9H&@8H;gz-S$d=0Dh6LWx6pdMV?_)=4?!MUo+P3k4>sa*eH2IZPvpt!l zI;kp9y=vOr)OaXm;4?Ki8-jTOKU&&5@%ZOIf!^w2eE7p3N5$6QduGN)Ea*d-rQFQ` zFV0S*!UtCkZN$cH*Py?%1FJ*Jh`04(!{!}0clsy-!I%nyWP7=oL%1b|_|SFu_E&!o zXTSMhFwn#Ei^LR7a+|p4$v6p>t?<}X_-JU~OEU-)+Mg60beb$d1vuez@z9$J;1?ge zd^ZX29<3quN;=RVCP8%Rdj1v@ z)VE2r>mkg-ht|}km z*W{~@;=>>RPdGX{fvK5EovHOIqLHAwpi;RG!ym%M@hRMN)n?3;!HRXcaWuI7`PDgzK;8MdQZ$iN?tBi!1K?OjE_HiXNQ^T^ChA>NWeSAUY`f{PQU&Y-)u zi;cooR~U*!k;^VKa4}qW{X1}RcAk~tAR4l;_s>6#zxk72M{9dXyD_F`u6lT_Qqs#n z38;c55BHkYr!U1Lkmp+-8Zx-`hL5EdRd$o>hET52RwaJgwF>-^I4Y$)7Uw5$#kv6$(2C6LS>zW| z*tB^qqKO{N&oAKg>Eqb4ZM!DNjxNMTql$b!k6p8o0CHCIbQeXe-e$rk7nVI2GHlb7v8MFX?kiZ z?X}};8O^8ba%jNvn7f#rrlvNQey#2LV0*5I&6=$XX0q0O{vb2YhYmIk>3U0)Y;9db z=xS@h%STQj-)KRkV-SPuwqpC1E0By8DfWxluyGw1CW35++3L5{!j%eT#9CvDqBOV| z;ZRTsT7j5oXCKVOY9$?4nw-(B8dWyBd`(^6n)&GKQ@zo0Rp6Dva&;yul5YGcFI)-W zAANIf51*Oz`FslJOwU_WD%;X0;F=z*H#7%SSZ8@1%hZ3R>sji=UZ2}WgBC*MHbS<; z0ncP*0|4FWuJ#V%SrL(FCt`^XEKz|NW*AG^96tBQU&7(hIV9I?W}v!oDRo9kLECn` z#qc80nC6IXWYo z)4`@4#~%{kJ>%~Fe*)y0mVhoBrIGoXU`re3iFM;s<7n$1Knt_T&0T_%o53~L>_ks@4;J$! zyf#Ywi^r)t`r+6O6|fdIjbgcsdcDEhQDwsFigQq@)#-|>RPto7t5^i1^h1iuD_Q6Y zBS1qdKvz*EtH~dm!IsNoJOV$|OjH0L+M7wxXS-XJfCn!si1MhErfOvBU3BT#p0ZVK z-_*giyfTq26Y66$pKoao&-K71UzLejLzCJ@84C-G=)gESq~qFZ|AXL_?1 zbA|Z39>>*qD6~vmasy4fOUJ?R%v=e!a@^Hi#@XF$CX&zmP?O4M3%K;`_t7`J9>4mF@5Z*Pcj5Hd0-k^FIh?yNrb<_mD4WZ{VkZxiZx)No zsMcO5%GG*RYbA5Vh|%cX^q-98IlGFcG?=kvVrpk^i@GLj#iue9%P>8LA$dVcm#`AJ zg%3XAU7~TPsdS$M?RQ!Vd=&w;#BMirvkD?;!E3?4R zmaE+K^L5!$5k8qRRK404Y&5+_!Z^ry7TzpJoa>{P-GmwP`9>_3PKa+n3~uJEda)WO zO6Ex!NLTgg4y;MD#svX4y(>y{K-1K6PibRWO_o!vtslb!9T>LG;$Pm-#q2XNlg9L$2y5*F~S7_6Vf|D|g1y_o+=x5+M4W`FxJ=ZF{zt;~|^7 zg6*#9ypD-J9hXu7w{WWHyG1g|^b8*Wqc#VlAoyauP9{x0U(aj)6+UNrh|;)j0;<#JU~rtxwDe>vL5P8vqUn!>`lr*UEI z3?^RvYh1VMdhC41KSNv38nh377JI+{945}6K!f<%V7WOF87|Ol$X_7#*tqz;@8iJb zBJR55X59V$T{u{5AZG{RgS+A?8D_JD6_4<`vCh&)IVaSVRbYC}!dNkBm7&nQHq~SW z?wq7AV3$=($#B`Qj0k$?39EERsKm%_(nsyaD#_z4343Gvk z-po&{<5JeZbD#eV$#ej>Ubhopdb~;-Y6xc!eHUTBjYXQK+irM2BE9PoXEl^V8}QM) z|1EC2^ko=Qy#O!_VLLZ?I~kk8&`Kml`7| zIbs6qeI!cLu5@8jWtrYnqs=DasnXF+j~_M_N>kA`8b#=qcR! zzke4?M@A{#A`IeA{PMqlfd1h;&Yw7pd?Cldiw^-B3iYb%nH!GQzqF|g*j$(2SC%_@^(_W z&B2Xkf`TpZ)=eG`g$zuNokpCbwzFq7Hf`F@AdaI}uMxW%=;%mdRhJ)UE?z*yZbzwD zLA-q<1_m}``=&u`+82a- zu6N#o^*7&%tt~w`dp4!Cw?K~1XRfdY9WB@6DLP#gP2)l@=c;T_VQnmU4aV?NR%M{0 zv)FF34@KvUBt-+~px&H7xkR3sU^N-1XF}@TQc$Bz;X#&X^SfU6)zd@|{5;23PB0Yf zgjw9rkQPy>5$8Gv6bvYnfiGG`X_lJJDYD+ej9R~O8y4oLaA_*VV2*L_zQ~g{xd5Hm zxOoe*<;!$;YN)WGtnO{Y9q(nylTUu{nU|1w=@uIEq#6E zre~Zglfb(~+LG+t1vC~fGyASnX=nKi&p;7l*bw9XFn z>pjeB<4}|L=rN$cw%WSkY9m~4Yj!o@dK-UiZ;{zJ(O{=ctlEaz{3}RALgaMIbfepJ zqqnO#aQZSLiEe}fHtMA+#?BwX#HI776qY!(TaBK<^@y;+NHYraGirsj(%qt%M7taQ zFw#p4yg(n`wflN<&UQTVH{ZtE>)y|Eq3hFTpj1;DKs8s{3}vZJn5Kt)#A$ih3L|f~ z=&`17Lm!7>9ERtKw-aYi(=J=W$c;Cki?C8Gx=nwO=8I{10~BXv_mkdb<#_vBbk@r& zYL2%ej;1I&Q@yPm9;Z@{ufjvpS>7I8w*_YoJ)`%;$o!$Y42QE^TfNZF_sU^@YzF8| zz#zvfuygkG4P(dVo0u69q;oV(6J2=W#TRHWv|={1q^Y~BCF1PNEMgHqsZkY+xe^-` z)kz|ba(aRo=*OXFParuo$YB(_G0ljM?he(#t0eVBO1JjTb~X=#GO(^pVsXUAr|0m+ zPk$1t)~+YDi=uz+8hq=ke};#@_<5||bOrwN7k-~rpwGb<rha^^0%jc>DB}8Kd0}$>m6l_t7Hq2SX}b13bIt21xC4Fry>1v1%6L zyy&>Eg7>{+J)S)4;^O6T+<4Qwu$;|Mja;N9W+TzF3O(};PVTB|LFYMW@+;DAAl}-B z$?18*LrpDeDB6l;^34;MmPy~A`c8eO5DNl*yG&Bes9%~Wn%5Q2VV|Y4P{I(de#Ydea6d}R^RCZ~RBs{QU4>`<) zM$JaFt&fXR#muscul-4PX9A+k09Y3;kp4H&0?$QekvJ;0` z;vtq*0XzB!F*7!ycd{zo9-uys!4(W^8^HYJYxv7Q{2!=Nw)JsTV8={6^T;FU=1?lg z_w0?;)J6e6r-?Jm^hJGHREf9ou3o&j@0;k|`d;kZoW!B$4{LXZo+h)}OkF&4IeF;m zZ=l6j#kE&mh3+ffftoK$ZD=z?{7U9L{uh6Zfp`!bcI-sFzn`>%#%9&gR+XXqx3 zZDg+A;3$G#IAcl71TKir(y6aVxiEh&!u;d~3=gfs+%lC$z(t~a80*)qMH_9da{U0a zsST%IJBi`sAWeu0^lnsb6vR8aXdqSX0&w8;!*~Uj!tG)D;s1?iwD)X8_GQ|mJ2Fb{J{vbjdGCK`0Z~WWi<>Vn_bA7 ztQ?$v^+n=bG_ifq2w`QryMe)$Xz@BJpe@tNPm^zoMw zX*CrVx}L~!TJWJPAVq)9j*6XM!NN7`~|ewOp-YqK~X4#VWh zPA=u~^fTYaxzS@7Y%QaYpB19kjL}4uz1M0w$e$-Kp2N&^iZZW)VyVoF4k*iia`Y^! znXDQnH5f#LnPi08+2N<@Gw#HtOXqNYY6-QLA&yPy;8Y8wR}IWfXQ_(FBWam2#UOf1 zFjI0O!X|k3%qZ4uzn%$Hr-omf64N==8f#516|&0bYwhSpqp+y7?JLiH2kWlbhMV7e zqbi#&mdM)m+wjuDB=WSAWTix4`_=vl-C%6b9hBV{dK($D&Tn{g73%Gf&!ZHMq6Ge6 zj2SmbJHG`JQ?rJP1ND74l#@Marh>?Sx zoyg_VNY70w$4Aspu~fklb#hBQ%JXE_QvH}Tas%w>%S&T)Zo+Ux+p`oyt*xji&S;>W z<59H*&e5aXKx=~6nId#ocr!qlq!oPda^8Zq?}rTbK4xt%g+67k5-Lj_%aiyL5j4TucrjKj+xXh6-pp6QfC&IXn@xF;<^f4 zn)iwvG@Yg3kwa%m*{Y$eDQ&GF_7GN`JvL~IWal}#iDD6?Q@ zc9xU5arK@>p6o1TUpNs%Y9@^XFFc2SHjy*uN0DHc4c8V?t(Lv_kYF%M42IA9KFZlM zC;8bvEY^F4j4eC44&YU2cn zv}8qJ?;v`6`%suoVR`%%Huc9~)UsIB(~3mQr%FAMNU%8czUnGdzg9|PZea#qpiJ!jcyf?<)vwk2P!-#&RxhHqV0pc zK1&hq8nIdM&?2VGZG-o>M1pF7vK|Kf>pw@ z*APS(ny@0(;t;DA>5kV+vSF1igiz)#)Q_9PhLI(;NC`i4`6SElSH#$^)zm5rS5pYe z+YOes+?1UFX-?DT&YnQj$&=qLW9;lG7UySF@Mot=__N>t0!}~sBImtfXp7oZCjyVC z+guk3ZYe&dMRik5f7sALx~H9L*`%q3X$3|1#<*f!jbuu;W^zBo=#mI>}r2EU=2 zmfdjF_B6xL5M*&-9R^k|u&+I&&MTWG4)XER@+3({MUmt>%Us~7#)hJ{oAX?JF0WS- zhFNWRQdX+3kj}F5ii`p9vND-wLgcnL5-uN`@bCsf3ZJ2&C#t;1@YMx7Utqj7Nb;1LvZS!CuW)$3wW z--=d)hUf(@LX_zxesnQDS_VUparxdP5#n!)rur5zz7Ju}JAD0p(w!7}yh#qnvi z!6+IC;ndl21~0%2bBL{em7yXfJ7^eWX3tAeDvsG2PoTsEkW5Z5aS%n~olh^a;p7Mf zHEqoqdbV6ER|q3xOolw>XUC9Pn&qO&w@w%LuLSV^`|l?qH1|mW#ln(9X=4V+7Qkg- zgb3GJ|8mhmW~X86bT>U(B4r`;!r^P=L!~j5Wd)tOw;$b98zU{Xw?${N{ArJXrfUkb z(>zHABsDoppw7Xm=7>Q#nz1fUpB=-&qv!D-KJfu`x3`nZ)YWIn_PI5y`q4r{Dg&zS zzCN|hLrOBUlqRNya+wvotgFv}NWgUbH-v3>ipD*=?FQLBBy zU)7R%30GUFgESk59a6gW_@#@8$3obW?ALCM$SGmlW`kL%wWiP*Vf0CmTHzR z^~E`!WTaK`zP7dw^5PJ#-M#_q*9>ryS0ooBKC_WXrii^(vo&d!%}RpbYNrG->LeX( z;f8|eb>g|k^}I@k@k?hBrd!h>4lXWCVe;}>6*$>BD+ZxMrs1T{cHfB`>^q;yA{qCY3&X{+Va_fkC~ugc&H#M@@#%%4oHb zFX<19@`F0t+ORw~kM7nO{>`3uQf9RhtQ(5>28^KMmwGtRP@gX5XoS3~r!9zMr&Bm| z=mg3H>hq}yjM7<|n43X+Jd7}Lt0cp3mGO?sYQdziRabn{rER8!h@-!B)53G9Nyn@d z6xN2rQ7kdrYQ(qv(hM=0MYuSlAS)b+Vr1KPw9UklKj?lc=)mBc-v7VR}ESjteK@8sYq15NXB`~G&8ha zO?8%;nFR(=GOt#Xfq96WuZw}mA-VBN%uHP(yQq?`Rr&fLUOw=GVjD8YG29vs9(h4= zLE*=a9p<^Zh>=N1nkOs11TVr$r<>fs_dbu+cJw6y<+LuUQ(4+jn$sBGRe94eH`yUY1Gf@>N1@{*zf zt@P-m2~5)+F3<;z5YLj7SOLy+TSF$&l{jwQ^-e5j<}kHTV5+ads=P^YE<^ft9M+D#lkqTT^qlF5M`l5W5FV)BMphu zWyxeFxyYUTe0qgukeJ)XMoE%PjVgowa3I0yAEl$od5!q zx^RMg(nQ4Hfi#T(akE=#`3`rlLeW`=Pux6+(dl#e=H(OU?rRC9-~Kz4HI+bz4z`2D_EX zPTJDqq7W2+t6!C6u4)tft0-n?RL9#!s?ot_(bd*T>%1FZJu-{Iu3?s61fioLboRAS zEzF|SIDu=DYjBk0{D1!Gx6s`a#nG8FxXkI^>3Jc^IqYt);2ekGeVx6qO3b)&1WQb{ za%%{~9UU0jaTAgQ8}RJjr`1;>L=i!476@@+$rL!eiV*8ElP{}AHqY|+g&JtJuEkXP z5QkE9kkCi{Jw;p&scj>!UB3^1&tc%l9M|pIy_cGBcZC!{xRu_yWvHRJkZRcl)ymFT zCpk94i>MbUu~?P~+Ccq1eW(R{)X1=|erE#ztt_KRHzd*;#176k_MIHXZ@g~o3SNHcRSfsEW2hrYtn|^u)W6k;S4`>F z!1Ad>=p3KKD94~yqMgl!pC@yUVwt9B2>V`n32O)!VP9DB(b?r`^2{+kVyLr0$oK9@ z{DqjyH=gQ^0vj8hYA1kbD5|JV&@{3&BX%YGL+bB~ll9{Qc>an?Rm~SmcVwz2 zDh`L@)S6IsQKk({t@++Q*>sMy0+!p^#luL;# z9B>LKXD5-JyoivIryP8RnK%x!(2m=#*n%1t$46(TTy}8i#95rZM5Qu2j~_h0pO{p~ zzI{Jnw>B{`dJbVaNK<455oWM#loay=YG%w?&!v5oq&{S79CunF^mMO<8=6K(d;lgh zI>ct-V>6T>k1b6x8^g$QVQQQZF4su9NoUIS>?e*LIluqM#mR@CaQwl8zx&`jZhp^D z&1u}zs5X?hCwm4R*?r^6Y;=+LHP|J)s1v79x90hGmVB#)sv-w}y#sBOKx5-eYDC)6 z5m3&FuzE-RZo3e2mDi|xmN3}ANG_JfZ99gr%uMnz(=z#G<-4_U{MbU-))Hw^nmSD0 zCKN+{^?<;O-TV#;8%d#9Vq>r|#7^B7=*8r`460htyUN9xiBV)|qqnsaN&;QT(Sf0O z!(1&x2x(`7DPvo52fA4xmHaH3Mee~T4^DmMC&lO|22hS`*7V$O_}$(9aBL*N6%*-_ zNCcE^RH^tl**b+ICl6rD+8r#(K8(@0Othuhsh7FJG0rfKl7ZAXKX9m6HYt%F;ecIj zn3O@hoj|@YM*2b7*oZPnK6;1=y2}Ij!O5re*H86ViIl=uzqE`nVUz67vQ&ez4TJcW z&Fw2CyXuCNuxd@-%? zdNAIC4I740Gg|3!4jg;(D_{PpzmUiJX-_zC>{#XcYwvh!wun75>0^nKGlNr?4`Hcv z0@KSf$scBEB&ky?oTr>r@~OlOaBOnA*gOX?GJpe^;InMfoaG9hE$7Iv zY#I%OfIz4PTi2|?-j`m%_g{P!dw=je`ulp(8kX#fqD1Ry)nK1$3|I5M8O}8h=Y2Rn zI)QTLHNG$Lv~rA`@*F!avy~0&@n^rwhG46m3TCB+Hoq7IoUYLgk8n&NlI{9!H{hDB z*P^{`5KDAj&R>{FP0q}`XLd66Q-6`8fj4;U`QV;pX71&^wi`~yXv0T>HMJ4FVbXfX zc7psqoH;Q8P7&4KJa7cKd1#O}6qDS4k)>v$t)t2ykWir z7f$6lldh^x?2l0G1f!I14Hd)|f@BD5S;krAc?R7eU7&Gv^sl8E?8o`Zqe!m5A=TZ# z{nkJK(*3D75|^Kvfz4y|)M&OZx$TMN<;_6#sF+$d9CKjaE=^2kAeOmsX~M& zZevq&D~HrF9-UCX`oyhSSl|$_y~}2K(-$npNQrEvK!UPaF&I{x8|_9&eaUBd^#&|4 zqy4@(E|0xRJ>5lKmcb{sci~}kS`q57lq5T{;BbKpRAwCG?4}j*DTEL=Sgz!UrIJ`w zJl`<&w@E+Is#3xD5#;HmX^hNp;FK=cSS44de1Xnezy6n>O}){$yx|ON9(U~iU^1RO zzqhR|l3Ykr+j54RSvswpjM;P*1AW9dBSw`%>xnXNW|nRTsa7UB;0U z6_)EDmMKmC=w-93;ifE60wMkCKpI^0`v^mQN0WzIXHkndh!wYsUiZDkHM(P zl9k^>!v%0;fG@t57`q0ROZpoGu{g_@dU%0WSly}6c%>;!5-sLHqJ0QGtw~~Z9N}1d zii+yiFTKIcYaVYn1DnT%)T!+HWbg?}wcSCV-P;~m#Kfc@MgED(d^Vu1rR=hJODq$X zb9WypO(@M1O{2X#iePywx@a6YB&%i6QO>Zm+2yNs7oFYg)-hXcCvk{Vvd<QOO6w0x*SYcOgsL|?j#>G(25V19Z1n>}?r{U>XNTN33`?fP@G z8AJ){#9xjQ9ko@rP~sew5--x~(l#en1$;CKI8~!}n4cTR@GvJ~bU9`h*hzWyv2ZI| zgY9JgIc110&65Vvr76*sUf;WwN+gb+_5``;dE9pWbvQ9L&k0}|ojtB1#dT6E`MPUr zae>*ECf%W>z=k2e*FlVgJT-ci8aKiWbV#XWoZ235#dWLJJm`0Gzw}$b^INlc3&&du z;7TCRWS-i3#pba@EV4U_cxaAvppE8dE$4^OJ^7Y7V5qGfSFRtxZM)u$OXqSJ9lwYg zOSVddBb(dBsK_r>)%aCxdy|dm>dn_-ZQn+W(RSN3w1d(!jz!Ks`rFA5r>C-8lf$3> zjr;%L{-^fuuiz~nKT`nZIDLBZ*rz^l_amuXDw)Y#Ka}i2wUyM3bQ;d87Z<Nf;kG+5GkF;s zsh4lwvUT55sqmiv^OdKb!q0g8%mI|++xvfzJ@eZ1BfUL6W4B*-?Z}+ZV`u&%fAu(K-(?lzis>Q6JLGi%g0;e?#REoeM92L z)(j7k3q~;1-_Id;3^#0FgAe@ko!GdloBBF}lb07Up0A*2))A-ocuCU0{bMj@Eq~ zU@dW;Vr4tq2lm}~)in?P?q|NdAOFC|KS}_b$G!L7n^-eAbW3Nrv1erDs@<1H&n5%( z4(sf|vup%Wiu=k`GYR5Ya^Fh_ z6B{;ez~a)f+Rj@@FQiCr>4^# QZ~y=R07*qoM6N<$f<^xUH2?qr literal 0 HcmV?d00001 diff --git a/src/api/ky.ts b/src/api/ky.ts new file mode 100644 index 0000000..6ba63a5 --- /dev/null +++ b/src/api/ky.ts @@ -0,0 +1,5 @@ +import ky from "ky"; + +export const api = ky.create({ + prefixUrl: import.meta.env.VITE_API_URL, +}); diff --git a/src/components/Compass.tsx b/src/components/Compass.tsx index b29f03c..9c2e39b 100644 --- a/src/components/Compass.tsx +++ b/src/components/Compass.tsx @@ -10,7 +10,7 @@ function Compass({ imgStyle }: CompassProps) { diff --git a/src/components/FlatCard.tsx b/src/components/FlatCard.tsx new file mode 100644 index 0000000..1686fd5 --- /dev/null +++ b/src/components/FlatCard.tsx @@ -0,0 +1,48 @@ +import { IUnit } from "../types/IUnit"; +import HeartIcon from "./icons/HeartIcon"; +import Button from "./ui/Button"; + +function FlatCard({ + project, + unitNo, + floor, + unitType, + squareFt, + salesPrice, +}: IUnit) { + return ( +
+
+
+

{project}

+
+

+ {(unitNo.split("-")[0] === "W" ? "West" : "East") + " Wing"} +

+
+

Floor {floor}

+
+

{unitNo}

+
+
+ +
+
+

+ {unitType},{" "} + {squareFt.toLocaleString(undefined, { maximumFractionDigits: 2 })}{" "} + Sqft +

+

+ AED {Intl.NumberFormat("en").format(salesPrice)} +

+
+
+ ); +} + +export default FlatCard; diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 15c69cb..01e90d8 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -7,7 +7,7 @@ import TwitterIcon from "./icons/TwitterIcon"; function Footer() { return ( -
+
diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 9c14c8a..195575c 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -32,7 +32,7 @@ function Header() {
-
+
@@ -84,7 +84,7 @@ function NavItem({ href, title }: { href: string; title: string }) { function ProfileBar() { return ( - ); diff --git a/src/components/Map.tsx b/src/components/Map.tsx index 7ee43d7..f05e8ff 100644 --- a/src/components/Map.tsx +++ b/src/components/Map.tsx @@ -561,7 +561,7 @@ function Map({ maxZoom = 1 }: MapProps) { return (
-
+
diff --git a/src/components/ProjectFilter.tsx b/src/components/ProjectFilter.tsx new file mode 100644 index 0000000..68566a2 --- /dev/null +++ b/src/components/ProjectFilter.tsx @@ -0,0 +1,32 @@ +import clsx from "clsx"; +import { useSearchParams } from "react-router"; + +function ProjectFilter({ title, img }: { title: string; img: string }) { + const [searchParams, setSearchParams] = useSearchParams(); + + return ( +
{ + setSearchParams((prev) => { + prev.set("project", title); + return prev; + }); + }} + className={clsx( + "2xl:rounded-[2.778vw] rounded-[40px] 2xl:p-[0.278vw] p-1 flex items-center 2xl:gap-[0.556vw] gap-2 text-s 2xl:outline-[0.069vw] outline transition-colors duration-300 cursor-pointer", + searchParams.get("project") === title + ? "outline-[#00BED7]" + : "outline-[#E2E2DC]" + )} + > + +

{title}

+
+ ); +} + +export default ProjectFilter; diff --git a/src/components/SearchFilters.tsx b/src/components/SearchFilters.tsx new file mode 100644 index 0000000..c0e9b24 --- /dev/null +++ b/src/components/SearchFilters.tsx @@ -0,0 +1,252 @@ +import { useQuery } from "@tanstack/react-query"; +import RestartIcon from "./icons/RestartIcon"; +import Button from "./ui/Button"; +import MultiRangeSlider from "./ui/MultiRangeSlider"; +import { api } from "../api/ky"; +import { RefObject, useEffect, useState } from "react"; +import ProjectFilter from "./ProjectFilter"; +import { useNavigate, useSearchParams } from "react-router"; +import UnitTypesFilter from "./UnitTypesFilter"; +import { projects } from "../data/projects"; +import { useDebounce } from "../hooks/useDebounce"; + +interface Filters { + unitTypes: string[]; + views: string[]; + area: [number, number]; + cost: [number, number]; + floor: [number, number]; +} + +function SearchFilters({ + inModal = false, + ref, +}: { + inModal?: boolean; + ref: RefObject; +}) { + const [project, setProject] = useState(); + const [unitTypes, setUnitTypes] = useState([]); + + const [searchParams, setSearchParams] = useSearchParams(); + + const navigate = useNavigate(); + + const { data: filters } = useQuery({ + queryKey: ["filters", project], + queryFn: () => + api + .get(`units/filters?${project ? `project=${project}` : ""}`) + .json(), + }); + + useEffect(() => { + const projectValue = searchParams.get("project"); + const unitTypesValue = searchParams.getAll("unitTypes"); + if (projectValue) setProject(projectValue); + if (unitTypesValue) setUnitTypes(unitTypesValue); + }, [searchParams]); + + useEffect(() => { + if (filters) { + setCurrentMinCost(filters.cost[0]); + setCurrentMaxCost(filters.cost[1]); + setCurrentMinArea(filters.area[0]); + setCurrentMaxArea(filters.area[1]); + setCurrentMinFloor(filters.floor[0]); + setCurrentMaxFloor(filters.floor[1]); + } + }, [filters]); + + const [currentMinCost, setCurrentMinCost] = useState(); + const [currentMaxCost, setCurrentMaxCost] = useState(); + + const [currentMinArea, setCurrentMinArea] = useState(); + const [currentMaxArea, setCurrentMaxArea] = useState(); + + const [currentMinFloor, setCurrentMinFloor] = useState(); + const [currentMaxFloor, setCurrentMaxFloor] = useState(); + + function resetFilters() { + setProject(undefined); + setUnitTypes([]); + if (filters) { + setCurrentMinCost(filters.cost[0]); + setCurrentMaxCost(filters.cost[1]); + setCurrentMinArea(filters.area[0]); + setCurrentMaxArea(filters.area[1]); + setCurrentMinFloor(filters.floor[0]); + setCurrentMaxFloor(filters.floor[1]); + } + navigate("/search"); + } + + const debouncedMinCost = useDebounce(currentMinCost, 500); + const debouncedMaxCost = useDebounce(currentMaxCost, 500); + + const debouncedMinArea = useDebounce(currentMinArea, 500); + const debouncedMaxArea = useDebounce(currentMaxArea, 500); + + const debouncedMinFloor = useDebounce(currentMinFloor, 500); + const debouncedMaxFloor = useDebounce(currentMaxFloor, 500); + + const { data: count } = useQuery({ + queryKey: [ + "units", + "count", + project, + unitTypes, + debouncedMinCost, + debouncedMaxCost, + debouncedMinArea, + debouncedMaxArea, + debouncedMinFloor, + debouncedMaxFloor, + ], + queryFn: () => + api + .get( + `units/count?${project ? `project=${project}` : ""}${unitTypes + .map((unitType) => `&unitTypes=${unitType}`) + .join("")}${ + debouncedMinCost && debouncedMaxCost + ? `&cost=${Math.round(debouncedMinCost)},${Math.round( + debouncedMaxCost + )}` + : "" + }${ + debouncedMinArea && debouncedMaxArea + ? `&area=${Math.round(debouncedMinArea)},${Math.round( + debouncedMaxArea + )}` + : "" + }${ + debouncedMinFloor && debouncedMaxFloor + ? `&floor=${Math.round(debouncedMinFloor)},${Math.round( + debouncedMaxFloor + )}` + : "" + }` + ) + .json(), + }); + + useEffect(() => { + if (debouncedMinCost && debouncedMaxCost) + setSearchParams((prev) => { + prev.set( + "cost", + `${Math.round(debouncedMinCost)},${Math.round(debouncedMaxCost)}` + ); + return prev; + }); + + if (debouncedMinArea && debouncedMaxArea) + setSearchParams((prev) => { + prev.set( + "area", + `${Math.round(debouncedMinArea)},${Math.round(debouncedMaxArea)}` + ); + return prev; + }); + + if (debouncedMinFloor && debouncedMaxFloor) + setSearchParams((prev) => { + prev.set( + "floor", + `${Math.round(debouncedMinFloor)},${Math.round(debouncedMaxFloor)}` + ); + return prev; + }); + }, [ + debouncedMinCost, + debouncedMaxCost, + debouncedMinArea, + debouncedMaxArea, + debouncedMinFloor, + debouncedMaxFloor, + setSearchParams, + ]); + + return ( +
+
+

+ Search +

+
+ {projects.map((project) => ( + + ))} +
+
+
+ {filters && ( + <> +
+

Apartment type

+
+ {filters.unitTypes.map((unitType) => ( + + ))} +
+
+
+ + + +
+
+ {inModal ? ( + + ) : ( +

{count} Apartments found

+ )} + +
+ + )} +
+ ); +} + +export default SearchFilters; diff --git a/src/components/UnitTypesFilter.tsx b/src/components/UnitTypesFilter.tsx new file mode 100644 index 0000000..6475539 --- /dev/null +++ b/src/components/UnitTypesFilter.tsx @@ -0,0 +1,29 @@ +import clsx from "clsx"; +import { useSearchParams } from "react-router"; + +function UnitTypesFilter({ title }: { title: string }) { + const [searchParams, setSearchParams] = useSearchParams(); + + return ( +
{ + setSearchParams((prev) => { + if (prev.getAll("unitTypes").includes(title)) + prev.delete("unitTypes", title); + else prev.append("unitTypes", title); + return prev; + }); + }} + className={clsx( + "2xl:px-[1.389vw] 2xl:py-[0.833vw] px-5 py-3 2xl:rounded-[2.778vw] rounded-[40px] outline transition-colors duration-300 cursor-pointer", + searchParams.getAll("unitTypes").includes(title) + ? "outline-[#00BED7]" + : "outline-[#E2E2DC]" + )} + > + {title} +
+ ); +} + +export default UnitTypesFilter; diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index ad39391..ff9dd77 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -18,20 +18,20 @@ export default function WeatherWidget({ const formattedTime = `${hours}:${minutes}`; return ( -
+

{day}

{formattedTime}

-
+

{date.getDate()} {month}

{dayPart}

-
+

{temperature}°C

); diff --git a/src/components/icons/FiltersIcon.tsx b/src/components/icons/FiltersIcon.tsx new file mode 100644 index 0000000..2206a29 --- /dev/null +++ b/src/components/icons/FiltersIcon.tsx @@ -0,0 +1,12 @@ +function FiltersIcon() { + return ( + + + + ); +} + +export default FiltersIcon; diff --git a/src/components/icons/HeartIcon.tsx b/src/components/icons/HeartIcon.tsx new file mode 100644 index 0000000..8707771 --- /dev/null +++ b/src/components/icons/HeartIcon.tsx @@ -0,0 +1,15 @@ +function HeartIcon() { + return ( + + + + ); +} + +export default HeartIcon; diff --git a/src/components/icons/RestartIcon.tsx b/src/components/icons/RestartIcon.tsx new file mode 100644 index 0000000..cc36c16 --- /dev/null +++ b/src/components/icons/RestartIcon.tsx @@ -0,0 +1,14 @@ +function RestartIcon() { + return ( + + + + ); +} + +export default RestartIcon; diff --git a/src/components/ui/MultiRangeSlider.tsx b/src/components/ui/MultiRangeSlider.tsx index 6ecad23..f617f42 100644 --- a/src/components/ui/MultiRangeSlider.tsx +++ b/src/components/ui/MultiRangeSlider.tsx @@ -15,6 +15,7 @@ interface IMultiRangeSlider { currentMax: number; step: number; disabled?: boolean; + label: string; onChangeMin: (min: number) => void; onChangeMax: (max: number) => void; } @@ -27,6 +28,7 @@ function MultiRangeSlider({ onChangeMin, onChangeMax, step, + label, disabled = false, }: IMultiRangeSlider) { const [current, setCurrent] = useState<"min" | "max" | null>(null); @@ -85,22 +87,25 @@ function MultiRangeSlider({ }); return ( -
-
+
+

{label}

+

- {Intl.NumberFormat("en-IN").format(Math.round(currentMin))} + {Intl.NumberFormat("en").format(Math.round(currentMin))}

- {Intl.NumberFormat("en-IN").format(Math.round(currentMax))} + {Intl.NumberFormat("en").format(Math.round(currentMax))}

-
+
} - onTouchMove={handleChange as React.TouchEventHandler} + onTouchMove={ + handleChange as React.TouchEventHandler + } >
(value: T, delay: number) { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const timeout = setTimeout(() => setDebouncedValue(value), delay); + + return () => clearTimeout(timeout); + }, [value, delay]); + + return debouncedValue; +} diff --git a/src/index.css b/src/index.css index 7ef378e..23f941d 100644 --- a/src/index.css +++ b/src/index.css @@ -5,16 +5,14 @@ --breakpoint-2xl: 1440px; } -@layer base { - body { - font-family: "Usual", sans-serif; - color: #0d1922; - } +body { + font-family: "Usual", sans-serif; + color: #0d1922; +} - button { - cursor: pointer; - outline: none; - } +button { + cursor: pointer; + outline: none; } @layer utilities { diff --git a/src/layout/DefaultLayout.tsx b/src/layout/DefaultLayout.tsx index 25d0549..f6aa544 100644 --- a/src/layout/DefaultLayout.tsx +++ b/src/layout/DefaultLayout.tsx @@ -4,9 +4,9 @@ import Footer from "../components/Footer"; function DefaultLayout() { return ( -
+
-
+