From a924573ee6b33e4d1e62a958c2dcb92a679e0051 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Tue, 7 Jul 2026 02:19:45 +0900 Subject: [PATCH] 0.1.0 (#1) * Align zoom and tilt between 3D google maps and others * Align zoom and tilt between 3D google maps and others * create showProviderSelector property to control of the visibilty for map provider on the common header * refactor: replace useCameraActions/useNavigation hooks with direct MapViewState camera control in examples * refactor: rename MarkerFromProps to Marker in CirclePage example and update js-sdk-react submodule * fix: prevent camera desync during paired fly-to animation in CameraSyncPage * feat: add drop animation support to marker animation example * fix: correctly detect current branch name for git push in commit-all.sh * feat: display live camera and visible region details on VisibleRegionPage * feat: add draggable radius handle to CirclePage and mark unsupported provider pages * (wip) implementing overlays * Detect inside or outside of polygon * Update example * Update example * feat: add react-icons package and marker icon examples Add @mapconductor/react-icons workspace package with custom marker icons (circle, flag, info bubbles), a new MarkerIconsPage example showcasing icon variants, and rework the info bubble example pages to demonstrate click-to-open/close bubble interactions. * feat: add react-geojson-layer, react-heatmap, and react-marker-clustering packages with example pages * Initial commit * Spin-out react-heatmap react-geojson-layer react-marker-clustering * ci: add GitHub Pages deployment workflow and fix base URL for static assets --- .github/workflows/deploy-basic-example.yml | 64 ++ .gitmodules | 12 + examples/basic/package.json | 4 + .../public/geojson/sample-railway.geojson | 149 ++++ .../basic/public/postoffice/cluster_red.png | Bin 0 -> 204970 bytes .../basic/public/postoffice/postoffice.webp | Bin 0 -> 5008 bytes examples/basic/src/App.tsx | 77 +- examples/basic/src/MapViewContainer.tsx | 58 +- examples/basic/src/hooks/useNavigation.ts | 33 - examples/basic/src/index.css | 150 ++++ examples/basic/src/main.tsx | 2 +- examples/basic/src/pages/CirclePage.tsx | 157 +++- .../basic/src/pages/common/sampleHelpers.ts | 16 - .../pages/geojson/basic/BasicGeoJSONPage.tsx | 83 ++ .../pages/geojson/layer/GeoJSONLayerPage.tsx | 142 ++++ .../src/pages/groundimage/GroundImagePage.tsx | 4 +- .../pages/heatmaplayer/HeatmapLayerPage.tsx | 95 +++ .../pages/infobubble/MultipleBubblesPage.tsx | 77 +- .../infobubble/RichContentBubblePage.tsx | 63 +- .../pages/infobubble/SimpleInfoBubblePage.tsx | 29 +- .../pages/infobubble/StyledInfoBubblePage.tsx | 61 +- .../src/pages/map/basic/StoreMapPage.tsx | 8 +- .../pages/map/camerasync/CameraSyncPage.tsx | 555 +++++++++++++ .../pages/map/camerasync/camera-sync-page.css | 174 ++++ .../basic/src/pages/map/flyto/FlyToPage.tsx | 20 +- .../basic/src/pages/map/tilt/TiltPage.tsx | 10 +- .../map/visibleregion/VisibleRegionPage.tsx | 55 +- .../marker/animation/MarkerAnimationPage.tsx | 25 +- .../pages/marker/icons/MarkerIconsPage.tsx | 362 ++++++++ .../marker/postoffice/PostOfficePage.tsx | 25 +- .../PostOfficeClusterPage.tsx | 255 ++++++ .../src/pages/polygon/click/California.ts | 773 ++++++++++++++++++ .../pages/polygon/click/PolygonClickPage.tsx | 134 ++- .../polygon/geodesic/PolygonGeodesicPage.tsx | 97 ++- .../pages/polygon/hole/PolygonHolePage.tsx | 122 ++- .../src/pages/rasterlayer/RasterLayerPage.tsx | 3 +- examples/basic/src/sampleRegistry.ts | 24 +- examples/basic/vite.config.ts | 1 + js-sdk-core | 2 +- js-sdk-react | 2 +- package.json | 5 +- pnpm-lock.yaml | 402 ++++++--- pnpm-workspace.yaml | 6 + react-for-googlemaps | 2 +- react-for-maplibre | 2 +- react-geojson-layer | 1 + react-heatmap | 1 + react-icons | 1 + react-marker-clustering | 1 + scripts/commit-all.sh | 8 +- 50 files changed, 3907 insertions(+), 445 deletions(-) create mode 100644 .github/workflows/deploy-basic-example.yml create mode 100644 examples/basic/public/geojson/sample-railway.geojson create mode 100644 examples/basic/public/postoffice/cluster_red.png create mode 100644 examples/basic/public/postoffice/postoffice.webp delete mode 100644 examples/basic/src/hooks/useNavigation.ts create mode 100644 examples/basic/src/pages/geojson/basic/BasicGeoJSONPage.tsx create mode 100644 examples/basic/src/pages/geojson/layer/GeoJSONLayerPage.tsx create mode 100644 examples/basic/src/pages/heatmaplayer/HeatmapLayerPage.tsx create mode 100644 examples/basic/src/pages/map/camerasync/CameraSyncPage.tsx create mode 100644 examples/basic/src/pages/map/camerasync/camera-sync-page.css create mode 100644 examples/basic/src/pages/marker/icons/MarkerIconsPage.tsx create mode 100644 examples/basic/src/pages/marker/postofficecluster/PostOfficeClusterPage.tsx create mode 100644 examples/basic/src/pages/polygon/click/California.ts create mode 160000 react-geojson-layer create mode 160000 react-heatmap create mode 160000 react-icons create mode 160000 react-marker-clustering diff --git a/.github/workflows/deploy-basic-example.yml b/.github/workflows/deploy-basic-example.yml new file mode 100644 index 0000000..8a10099 --- /dev/null +++ b/.github/workflows/deploy-basic-example.yml @@ -0,0 +1,64 @@ +name: Deploy basic example + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v7 + with: + submodules: recursive + + - name: Setup pnpm + uses: pnpm/action-setup@v6 + + - name: Setup Node + uses: actions/setup-node@v6 + with: + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build basic example + run: pnpm --filter @mapconductor/example-basic build + env: + VITE_BASE_PATH: /${{ github.event.repository.name }}/ + VITE_GOOGLE_MAPS_API_KEY: ${{ secrets.VITE_GOOGLE_MAPS_API_KEY }} + + - name: Add SPA fallback + run: cp examples/basic/dist/index.html examples/basic/dist/404.html + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: examples/basic/dist + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitmodules b/.gitmodules index db60de9..e79c27b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,15 @@ [submodule "reactnative-for-maplibre"] path = reactnative-for-maplibre url = ./reactnative-for-maplibre +[submodule "react-geojson-layer"] + path = react-geojson-layer + url = ./react-geojson-layer +[submodule "react-heatmap"] + path = react-heatmap + url = ./react-heatmap +[submodule "react-icons"] + path = react-icons + url = ./react-icons +[submodule "react-marker-clustering"] + path = react-marker-clustering + url = ./react-marker-clustering diff --git a/examples/basic/package.json b/examples/basic/package.json index a8beb9b..68ff014 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -13,7 +13,11 @@ "@mapconductor/js-sdk-core": "workspace:*", "@mapconductor/react-for-googlemaps": "workspace:*", "@mapconductor/react-for-maplibre": "workspace:*", + "@mapconductor/react-icons": "workspace:*", + "@mapconductor/react-marker-clustering": "workspace:*", "@mapconductor/js-sdk-react": "workspace:*", + "@mapconductor/react-geojson-layer": "workspace:*", + "@mapconductor/react-heatmap": "workspace:*", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.18.0" diff --git a/examples/basic/public/geojson/sample-railway.geojson b/examples/basic/public/geojson/sample-railway.geojson new file mode 100644 index 0000000..86b5167 --- /dev/null +++ b/examples/basic/public/geojson/sample-railway.geojson @@ -0,0 +1,149 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "yamanote-1", + "geometry": { + "type": "LineString", + "coordinates": [ + [139.7744, 35.6812], + [139.7703, 35.6818], + [139.7664, 35.6830], + [139.7627, 35.6855], + [139.7599, 35.6882], + [139.7587, 35.6916], + [139.7592, 35.6950], + [139.7614, 35.6980], + [139.7649, 35.6999], + [139.7692, 35.7007], + [139.7732, 35.6998], + [139.7764, 35.6977], + [139.7785, 35.6947], + [139.7784, 35.6913], + [139.7766, 35.6882], + [139.7744, 35.6812] + ] + }, + "properties": { + "N02_002": "普通鉄道", + "N02_003": "幹線鉄道", + "N02_004": "山手線", + "N02_005": "東日本旅客鉄道" + } + }, + { + "type": "Feature", + "id": "chuo-1", + "geometry": { + "type": "LineString", + "coordinates": [ + [139.7320, 35.6980], + [139.7420, 35.6980], + [139.7520, 35.6974], + [139.7620, 35.6967], + [139.7665, 35.6958], + [139.7744, 35.6812] + ] + }, + "properties": { + "N02_002": "普通鉄道", + "N02_003": "幹線鉄道", + "N02_004": "中央線快速", + "N02_005": "東日本旅客鉄道" + } + }, + { + "type": "Feature", + "id": "ginza-1", + "geometry": { + "type": "LineString", + "coordinates": [ + [139.7353, 35.6673], + [139.7432, 35.6727], + [139.7516, 35.6753], + [139.7595, 35.6762], + [139.7659, 35.6773], + [139.7707, 35.6804], + [139.7744, 35.6812], + [139.7760, 35.6775], + [139.7781, 35.6742], + [139.7822, 35.6719] + ] + }, + "properties": { + "N02_002": "普通鉄道", + "N02_003": "地下鉄", + "N02_004": "銀座線", + "N02_005": "東京地下鉄" + } + }, + { + "type": "Feature", + "id": "sobu-1", + "geometry": { + "type": "LineString", + "coordinates": [ + [139.7744, 35.6812], + [139.7817, 35.6856], + [139.7891, 35.6892], + [139.7972, 35.6909], + [139.8063, 35.6934], + [139.8133, 35.6979] + ] + }, + "properties": { + "N02_002": "普通鉄道", + "N02_003": "幹線鉄道", + "N02_004": "総武線", + "N02_005": "東日本旅客鉄道" + } + }, + { + "type": "Feature", + "id": "keihin-1", + "geometry": { + "type": "LineString", + "coordinates": [ + [139.7744, 35.6812], + [139.7712, 35.6770], + [139.7687, 35.6726], + [139.7668, 35.6682], + [139.7649, 35.6621], + [139.7635, 35.6560] + ] + }, + "properties": { + "N02_002": "普通鉄道", + "N02_003": "幹線鉄道", + "N02_004": "京浜東北線", + "N02_005": "東日本旅客鉄道" + } + }, + { + "type": "Feature", + "id": "hibiya-1", + "geometry": { + "type": "LineString", + "coordinates": [ + [139.7150, 35.6450], + [139.7243, 35.6511], + [139.7327, 35.6572], + [139.7411, 35.6634], + [139.7500, 35.6697], + [139.7600, 35.6750], + [139.7687, 35.6795], + [139.7744, 35.6812], + [139.7800, 35.6844], + [139.7851, 35.6876] + ] + }, + "properties": { + "N02_002": "普通鉄道", + "N02_003": "地下鉄", + "N02_004": "日比谷線", + "N02_005": "東京地下鉄" + } + } + ] +} diff --git a/examples/basic/public/postoffice/cluster_red.png b/examples/basic/public/postoffice/cluster_red.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd5c60d175c033b2c946886f311313040ea4d19 GIT binary patch literal 204970 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%0AZ*RdqIW?GC&;y6N|9r+3XYs>Qj0)Z4hw5kOT7!c z$xK{|!svKF5^OuudoNL&i0uObD=u#|oJEzaORJ951m6 zoi4m4Vt6&o=8U4}XB2Jg8$y`L*@6NuY&DkkD%I|!*r#J4MhBm|!hu?~T!Ex7i?AMn z5Qu5|p7DIU8ulStlMqPz=sK6!-ZC?5V3?PljRt@VT=g>~gfj{%m3!?>KPU#v5jF?y z))?>(@%ya4=nRK@2N?Vj60!e^$?AA6FC##X184fCS)5j8fmY^KLGvZ)BXVHUE}pKB zG_%@qw1_xW8jjDxwSBI4m*RyB-c%K&6tbZ=vlban)ES}aqfTDm=m)p%aQ<(oj#>QPx%-V3T5({AqXL33>I^I|7Egu~dhgeuabc9SOVix12 zajP--)zSQg2*kyV_Lq%nX^wzk)>EQ(;?Cuu?YI6A4j=@P* z;lz>?h~^cUHv>~hY9DkjJ;~q>RzE|j9@nDmzfX`+cy*ggjE*+>n>+B;fM&%i@v`<% zUpLUM*2WH_QpwTSs-_-c77Zek*BSm4q_RlCxH7 zmP+&N<@cB(a+f&hGCBWT(n$!ug$d?2UknB&4_88vBG&W|6ix^~M+(gkT9h$N)R(Tm z3uP#B2a9*$Ap2@N&#iC^$P0GEg!y zg^VK{ZcQSta^Psx1tx$q&K{lVS1ej}z(G>LNGTe*?OA*}fybSO5}X5*jtc{^Ey&BM zFGjKmG%Z;KsV|25N)X<|NZ>iOq!-@h@{~K1I&ih`SGD^LHRL4C|Jvte7!0bTf0uGmM zup27~B;CQWo}>{*ash-Z244~e#}VI50A8NeGJF7qpInN@=$b%)rtJWU>4xLW9w1mj zYMi?J;Pbdq7XDwmiW-Cy&7LdhM7 zx#Y^941cEKka3;evHq-oqfX)Impk(CunLKLaW=bJPV^?);hPZ}@UGxS+hjX{+ot=` zvU<-T2|u;Bw`m%V=OZ{tBfpD61~`P&4gI2e0<`ogY*i)B#=vy$oJBpuUZ*ZWTIT4$ zIA3=>7K0E6zCU8faa5q3e|dU`fZsuE^~moGWf2~fs^kE0d^~ATyLdm~1pk4QF9WyN z>-!!2-qhkWZhso#^+xWVVZgWX1F+B}%aGQ~d=hL(byQWotEw-vBc(>CGeNv&_jF*zR6rllvEUZsa<9y8k;`#cmMMxA99EpputQMwL5=yoh`a?wy0=d(WGqHbELwyHS*Gao^EQj zM@NDzWmiwy11X!D@$voc>u}7_r?N@xE4!6^(J9&8=l$_`gN8+CeEH*NMJEFpj#AnI zIWvd#wjBx8E4pcN+9z>oq0t`dTjEz!BceT)3c8aTPUdN%)Sr$=h*odj$UR<<7*d*a z@?F+XeO824|DmD~>%owUzJaW4co^%FDmt|`+qYa`0y`; zmTd4IFf|9(Hz!5;byWFjY5KK{FFQJ|g^5<53?x}7#4eV?_lKEa3l0jgPA#mLB97;8 zJ-ayi!tZC&Lt6cYAtsnjfvErRdgsxPvYw97SoF^Puk)xqzH|qo74@2rA8ej*pwciV zmRTs}?%X9uQyam=4=b>fdF|rvBu>n|K+9BRNsR~M38Mb756y=LB@k}n+RcW=v8jFFIe;BRgvT+g!V)3i>C%^k8>wYEz0N01WkV7UqzVwI^1Bg@aPO_iGZ8UOgn#kI(eWudff<<5H!B)Di6isc`cW)JSiUh0p1Z$o=ZM z<>~3v5m76@eS47x+a@NFhU0kHz3TbH-Y<2wP0pQ((|#LqkEDxXrM9@Oq%Uw2#Uy#mwrNCh|=w%qJ8aT1IZZSS18!y=ahdrCt-AEFuT^ke>tv+xUG?_Y-7c`mn z?TouBJ=5SZu8XX8VO=oxY#lT4@&nyyxe8ux>t*fyCy{STtalXYSSe;+RYpo-eIa zXIM2X=2CYi`9H+@bOz{Rdttt7g|Khvfdgc<(|C84(Ankp8i1Xa^}a8TGn!q97s3K4 zVHsvu@t@5f9i@gpx^$8h+?mtGd4ew8cZn@>C7?^MCC=QhIFV}cl=r^XssQh4xa5vQ zErsLgkrjRz-HdEPwYF$y3HEScsmei#@En7Y&dPAZMqSmGa=P~nuUjPo!-s9HB7*K^ zP6nj;)*ovpO=H(`I!6fSS5~}CiW&|EwG#`Gj5;Ht=FbN6Oe~*LGOt_w!n3}Qq3-Od z#Yn9lnTU*My1ShM5`NZM`bb)E+dNSOxnyj?2bdJ9QoqQ;bK|5%dt|1@X|H>TRjFb= zZnB}#6U{1^STyq$U6%^CtV8Ga3R%|7Q3{$o)h({u8a4eg_BCK{AXR$TeQ!-YVr1so z+^Z_YI#7>PJTTmG&akN4Or)k{nnATwiqsvH71!*J!V$v-N(U+Xy|9?g0oK86JGCmxCz4#VP7d9C8npFB7-?6Z#l}1^Kt+|^jWK>SA*iH zj`B)9!GAjVU}wt`E8)l_jLkC@wm>%&TokUue^##_wH%&&j+`TB^N z+Dfmv=c8y5-<@~r^*iPg@b9NZo9f7_qt+Ys5pauIZ-6IXrWw~qJ2%H~*0b!NR9Kf^ zBshL|-1^ZX{Y8a|uwyw|yXt>j6VUy!McSgB*^%jJKI_Qe@i`NIb%KO)y4LP;xz@tL zxhB@pJ2q2aL#hjjnr=ieWg%BvZ$$XQE#wjX)PVGB9_U8r0GDdd37cUXZbV!}GCh3X zB3-0jS(GGeUF*`$z5GLA7AQ=&)M=60tiaI8!fObpPdydPMT+kE25K@>PFR z5i1WI%Y4Ab4-)C3e!s+7)x(I3zg(AYw!YbZ==9oW>!DxZ*4z4sVm=OZzh&hyKqxRA z{cGezo{B4Y$NgsK=_DAZ1MEQsBlP3 zZEA%K}&`ycJ&~=enZjl9u33S zGgEgN6w_|3F{Pz_THWOT+NP-~?0F;3bI5odT1C%_4&Uy9Fn%g1(3(|kV#|<#ItP+$@{=OPjQaZJ5P>vd*5SwxvU+K8wx&9wyA?JADpy|2?C&=#plOf+rSgUK0}Q1ew<~q;5m!F4s7k35OP1}VYWSpdWFg_L6#q_2%C4-Z`{ddA z!%E>KG5KL}b^Zm*)cwe; zlD)N+9;Z{O7xq8{dMM=d`t8`nf~?=NO%X<%Oxa7y%~~)mWwp1p=uu3@Vp*8#!UCm^ z&}mC(Q`!Bp3nj_D52@((rER4s@j?$d)*~$qDz~Q-c`m7=UoY@6eml~@&1}Z@yapt+FvXHagmv(l>}b7 z9PghxH!5+9lOXZwgMw1UQi)xzMQ^Ke&9n0>8}Hr2C}Cx9#6>$7mSno@#9`wfBRD%{ z9%J28?3W#><_h<&DOd!^j2_>5v2x1Rl2)8?XHK0nBk>@)$pX75UhV*C$X8#vcm$nq5fgA(wbboha@UZ@?qT=q@#pkAS>tx=);LuiHu7;#o6hNIZAxL6q;4 zM7#T;HL});r^F!)ihfLbsa7|nP@6P_)ugMQgVc$FnayM~=@+EbURAeNdF7zU1(%zHZHiDRcRJ$ z6t<o$-ZYxmkouhx4J^qHHe9O68Qs6uJ6K8-u;(&G-))T=DSX8jcHicH$}p=WAaj z%Mz%N?b)V09BWcfmMeaAU68wK>vwKn?QWC)lC)deRYzKVGJV=+dvC0qo!xN-nD|$A z4R%;)V}#Ytv-Lx=Qjbc_4~XZS1Ih7E7+Fo!d5LaWM!ADr?e=6bL-UW7kw`y=)wzT* zquaTeo|a)3?$z{|-_O1C(BSFa%!i*EHG|1NQW$^RkYffBf^ub@`C*(_15z!g4!g>F zC-$Eo-A6KR3t%q$T_h$hJ2Bde>2_jaSb9X896A5+x}My!pBY_#eO1;%nkiFM#@hYz zz@>ai0zTeE3H=rGg62NvC-1&yWitGNvu=Y=L6SM=jVJrU^UgQzBi`QEtC!v2Qnl|i z+3z;*x&!atT1=Iyg-^UxcGx!&y!ygv-)7m|cAx)b$egq63M=N3UzU{LV~feU8!C3q zhDz7uPs}U5IVdeLNkuDK8pty$AD2CvD80IIoG9E}dTFAA+5A&V6Azm6 z^5JLRfD;-UO;}}Qyw2Wrrk1%~+?=i*jq<~EaodLKRu^MOwlxW|mb`n;W!MjV@@o$r zV-(_S_H|R^UAy+D)%=coucIYH+Ltf48Y2cTN-tZRb5vNsr{}}_OP$JCE2H6Uyo#j) zk5bT#y}S=F`K&g!IL+M@@y}ugk?&y9FUF!Uc5wl`Xjw9rrba&J3n9%V2jUOMpZwr= zp2NE2rcoeK`m9s7KR5d|g%wYjoyQe!pSqP5#_-t)9d~URHt83bu-0n|qBJ>m5A)I0 zB9%(-bns6tBC{NAH?k71D=s(O*hnr?d|`hq-2zsU4d`YU8Z>dbL9-ZMU%0X^F`Dh3 zu(ya^Q+O;AXDDxDS}yRG731?`v|+1v+*n`HnQYwPYbKvF59zNlRv5UZKh`#8?rp5s@SfbVsF(#=Thn5vE68ISiP1nd)&effo) z!GX#V8J8AM4|(JRseDFc9U3z5cw$DFLO&75lWkQp&Y$(aGJr~FOPlt_^)(ezpQTBm zNrx{ulYz?m=eni0HI)u+YJ2@>8Z1~nQ~Y=I!$spaOZ7eOX2o+&R*edE?y9EwZw9q7 zhgkSW+5bvedbZ5|Q>tr{%ED=fqb#w(spA*lMQ>-;J&CQU4OLHx7#|aHF-@%L-a~z- zS&-hbC!r@Mp2XxHj-uw)t1$Bk&U6r5R zExCGeja@;Dv%&ASsV59p`hrYYWyGs*6Lh8ig@5AdJf}>u=O(DGt9ac5WZ6wpJH#E2 z<+5RuNp3D{P^x-Sp5q0=DcO?UZ8C*98*(b0zRuZs^GJSgcY*Bn{{xdiY`?j$&lI1F zCmT_#EuIrsDIQ}OaTqbUY^F@L7oL00cI@0`&cgz8H&p}X*6*H*W;x@UBK?=wcXV7d z4ws8@6w>4jB{l$)^SqyyS?l+d|5f+j)} z%h5c{5;qfvEMZ{FVsx$gz=!MA9Pu<*WFr;TNadJrDj861*w~>>N7jj%Wu6|Z(-2Nh zt>IK*+tSB@I)qSCOJ@k>skPbo@G_r6;6#}|A`H=@&26g2cd#@fgb#vhxS?-!Ou>n7 z`2!yVlK_de1P-nWUgR*vrcEoyg@vPCwZ)YDa4mkxpxKf`389V>R>UlM6(}qOSUHwwYA3L827CElvW>2CrM(I zmC(S10^bTlk~FN*qG4Ibm}+KH8_^fMyY_;Y&k3?3@j)+PQY7TmDdEb*PnOUyj*g|s zte~sNb5My6(w45?Qqwc)loBoJn4{yl2gl$WAID$SmX6{}37tH9Lzak%nktWlldR({ zo{Y?lb7#Zk(i6!K=Tq;td0TE$PxK99a(Iyv0~*6f*QLT>#OX{Brz$8RPnNJTM;$dR z^fP?PETsfxL(?a5NN^H0T%)drRG$u>O-#&8AJ;)d!>hRRHR9r-@194s z+!v3ALxWA)*%viDlr<_up90JAK!pbZ1182!G+(P+`x2OWb^XwB4bIPnA=9;-^{{bB z--q%3ekP3vbwRTXX7&~+6G7M_;v{cgf z#7K1IPHvqK*7z|~-}uOeG0fFKmk5=PvL7wL^j+CF>zKdU&_erAh;8n>o@1U^3Lrd-j=%ORPGFP9~-weLYO}-K>QH$rTcA{VD!(fa` zSMAED=3+ts1D9MRyexkRqSC02LZBi}TxJ0~iWmbg9^qvZcqXQ$GMV^vD6l04%!Fpn ziiH#yuo5vnDI8XXjiz`QaVE?NP!3HW>A7JfE)2y+WiA^x4I&%uc1nRMmPpL3BxU2W zp_Ba^jf#hgE|HY7lZuzaR9_8hv}q+SErXJZk&N zSA@X7pEG~$C01P7ea<$pRRxK$ zt{NYjB`PRlPoIJ_jugpQb@ju93N75jb6VLOPd4-py?Ln51~3}HWPta$&7C`~xpRj# zdDol2?Ck?Kuy?mLw?AjiUAt`HV802v=0Ir!`}TQr`|~yczj^Qw4@=z2z5(=JwDP$Z zthsluHwXHy*(|NeYnSGWFWLZp243841Mqc+*yMe4bH@ud@WKu&H72n%%ceDXS6)8< zyft5V-UeuA9|Q3B?6J(>z1y3I`pJKun#9=To&Uh|#JzjB`2aB(eATh}3 z2WkcR2p~xMOj*Di$S^9U1uJ;M&&AL*awTL^)4}q`g(@wFjRMwA1!bOBhU&TwFjWAb zy&*E3tB;Rd(M2ow@&P7Ma-I<2KPkai0;w?;Lm`rD*vWO4v7yb8f|lmOg@hs{_o=OF zU`K$`cD$P?Wqr5mlP8A?J+aWY95<{ISxJqz1Ycpg`kdo5Z=N-q1HSXo$9!MYlcK^L z*M@g`gj^=UWbTxanafxzVLa-~e($;Zr34FZ>TcAo#ff&O2ZHhX5h zXw=O~E?UG`vsivyYaZ!hy-GDJGGY`NM0_rEQD#tk=FaOGFfBz3w+;gwh?!DKFfB1VV zzVWwK``d4L?T$OGc;Er6eeWKxefuBGzVQt!zWFVyefK-5;@@kvzyG^beDj;xPI~sh z{g&>$Bh};|{q*uyWm{Dv2Q{nu7} z6aHQ3%lCKhu)5~+=U+?xANi0q59~Ki51@cdnSleLGQluY#W~>Iz@s>z0WfEbqxu!# zNfjJn?xr(jrmhYoZz{QiDDcUbE=TZnf*=Zf^^Hx3wcX)GWpH>pc*x3}P}I$mMoUR5 zZf4BEjPPi4J8za!GA5C=jZcCQqoN{J)dWO=&jj4$1AB(yC~Oi3%UvhumPUx$cK3Z=fxRy9zDlRR;vdq%K zU_gm67(FY}RnhqLDfDoZH!FD@0)S-+1J#*4F=z4%Rzy%b3wK$%zxju~cHxCy^z?Y@ z1Y2py000mGNklAN)=mavCBH5y6&v%CXe;#a;Zn-1b>5KFx!lix;1s%$%m zp;Iww4EeSkzs4HsOZM_v#brgko}791U2vg4+Siv3^3K|I-di{&tNu~JDWG8mAl-B` z?rnCW0oKWlqth`ss9DtoakIofiIPcR)kzgkI*EQefCMv3afd4B$_9y+BNpKYqwE?k z%)w)VF9%hfJ6TN2Au}9jnR;Y?ld`E}#`QrwmG8{9tl2(PN|~2+;KQoIBNU#r*zDO> zg7b45AN1$hZ1chmbz}@6?UJ5MH7=K|#$Z4$3A3(cR(th%_4;egP_p<4fyqoq{Nzn$ zFk2j#aX*OT?JenBLj zh;)e&xX{6G3Av+NS{fMe+L9&Kw_`_oaMR}G+{3j`YyvdYtU$G<(~$56x!lpD6tm11 ztuTAzbhCI0VDX6!KwJYSjlh*NW?XjJK;Qdj%$hx=-renGUmt5*Qwy50e#x)%VUcop zbn{|Fo95smU8;jPvA(e|I*XV%Ua{zT_T_oyG?dIZI0EB?dyWZGaSkp`HKdhmn1v~s z7+sccJj0@`7~o?-QHK?`5@zqt5pQKx8LKE}Re^18CF44^vDjMTZr`yUjEGLHu)f(d zt(Z5@tzds7J;O+9xuTIvs%4(TQC~vm;3;vG zy<$eqX;&4EEHd=PO_~Z!^^K3ir^=klI1!UL2_A&Ja&GY5^2fz*wfpxSu*d%DuRPUi zRzn$RQj#310@a9gs1oNstCVtsCMPOO;I~sZqat+Fs8onJkEgclz)6%*l8Wn)2;9+O z*pw2!-O)?Qh&XX!5k{G$ge8)yB*g>KGd}9#!cxM_Fr=tY({f0eZ5&+^coa9wev_3n zj1L@qCI-qzv}rompSr1J!(iwVP+J!eu%QqkJTqq_kY-Fzsi)g^KKOt=)qlu}JS;La zWXp3Gd!Ea^566vE7-A%)!{Qvcb(v3JX2t8yFfSxilR z)5o<~v!)qRb4h7XEUUP5<&_$f1k>I4XxS6rvmn9Ai+yR*$bM2@U6YY#QblgYLR@;0 z`^H#Wcik;7$O*B#0+lyZ=_4^yO_zc*Iv82gytv}^R`hgd<$OSaU{p|Y;!vrqb5C-4 zbCZr)78_IdL=!GWEz2MH6*u>cHly2+PeR>^9TSQ<8kVDXl#&@`u*C>4;AnhWXq!Ir zAufKTKS;>1b@g37)sUX*66G=t*wgpjXQ}C)gdTBFWw?@*7(jh03LGyJKGjyOnYf{s zAeio|EhSIl8c}N0c(ni$yk&i7sv8?C<%IK(PDwcF#F?CLP{itRA7?K+Jyy)*TE zZ1w77^?JpHPXoo2Z~`f6IIWV5VJaP3X6P6n^f_XZhoVUlPn23Zu#gh88nhH!6)?O6 z6J-@Ot6nutc-ez$=_AWUdY&cfrrdIxBC1@}PL@TcPupH&8yhz3@9Vec@3_-C(W=*Z zC=GVRrkNP01N*9pi^_(E5Flh^s3bA0ebAY){PC=g4h=(03s0Osbqqs;NkJ{qgG`_H zl&Kk>f>AyLawC#rrqUF@^im=kjB&-0=#2=`p%@-4f1K@36+`9$1hE>5t{^Z~ag$Fg zVabig%MRe1Igjm)3J!f_l-zBNFiqEY;vEhY1?dDIT zyQLgR13Y!=NHqpznNRqo#USY{xA|vxbgUULn?-+8m&rbPu8heJLCpU|5qMR1_uO}N zcE9_)v(H&xs~1Jt*T*Wvy$Wj#>ksZ&0$G}>MJzMbGp*3{SXVhp=vrN|pv%gK57xZQ zmkam?v9P)4gL+ax6+VSd_N63Ub#dennkeaLtipLQhK;Vtlj&1waYT@9jn%R0w)BY> z8C+u=L!^o}g$`pXs3Cm1^x!jenYdT8LsO?&=cTLNstte?Fs|HGE?R9TN_WMV8BSk{ z)Cw)zxg-fa0)j7HE$P*8D7Sb-ARQ@Fdy9}u;2Oe_fdXyeEkDGY^;BnSsUwrJ^eci7 zuWGvw+9-}eKI0_Z^FV07?|bH1)2}Y3R9Hu?jtE;uAYH1Bjl*ypQNhWRbw)8urjG`p z)+8}Q!_al8s+}rvkhM9lU=q7UFX`e*O+38oLSx zoy>RBFoy0Bxh~`u3%O(nRbj7jJdcxCTez;6%!nP=iiEGk2id$hy`Z%`yq0u0Uzp?@Agz+5K&v-L6cny_^g|XloW4h~1Oh43o>t$VC zZ#A=c3IGU`wG@+e;xX@&MxgWcMdK|$aMsjyQ@gu+Nd9I6O*vyRE49F|+^~i@EEb`` z4t*9*)-*Rg6xDiHa;M_l5^3Sf+Xr-LV^~%WSoCr~>mjWAZeGbfXA<~~BY$nO+>l4~ z(DAHK+m!*~P<^J~HeulP@Uyp@!p(;gUlRzdUrv4z0Mz znp39O!Tks9z@EL(zI0%Zi1zM1Y5(rsY2U8hwtx2?NW8t&d(!?F>A$$w4({2T4(#1) z2X^m;m&x|S-@gZ5MQPveJtC`oV7q%yZtr^$zfi7sXMWoM;%>%!(e~{Up{H^1vw!zq z!#+W(ZQpKWBIG%~7kAr%J$tKI_Uu(V>+RpY*N4U;`+d82+x{2#_@14+(o=Wd;XPax z-5m|96$N*>o^-m&{K6GrIn^1rG9@q*ewjEO;A{|GonPsx<{Y7KWj?9M!CrRgi=9gR zgMXrvs7-yz>2v-V5B=O$jX&JLw?Qh!gGtSmVvq{r(o*Fo$uEv78$)0Iq|d|>?W8t! z2_?nA3~<1_iM?5xm1Uxj3;Lz{Zqm~=<7JM&vQWDzHT0TI%t|lj%uPGCZnf{f_##O@ zDK^IjcV>;`wu#o0Ub5XX-$!f@4;(U2g&+PdfUyHI$*r^5ocV)g{a>%{=y;Wx*ft42 zG36p42n0?5fpnSK@}KPN{3r8zdKOu;nV`y?waVOBf>`lsJ8e2JDsf)qTx%9AWT zai@(eVTCyhBI@E%sYuPFC||5`^j)g3sycg<0e)~`rsdSLJ2SM5k5fA}#aSPzutJ%Y zSPi7;%d>m-?I_cgUMpbKGLPC&R~rTCvF=x)sZ+wN$hGk9-?7v7Y=6Oa?cC`*x9@;n z@Lk)V_nq6e`wQEigSPw5=OFR6zu-Hbf5Bha{=B{LJhXkgZGY|sdw$#V{`_;>ZO3!Z zQE#*SAHUFl;W>1mozK5uJDg_-*SxpLx&Y1Ap6}vmMWg zwzvAv+YZI_3}ZaK&2~KdoV~DZyFD)*;(LKO)u*-{@ORMP@!WH1Co$~UhAsVFjJ50e zoxbaZoo3vgZu#;b*z}arxl`B%fQWN$KoHp7s43L$fF`O~0uz#;Vj!{>$nZ_%hEw=l zH+1P)MQvA^>AIFsa=A%)m(mVYOsvn5U|?x|z-B@4M_Bss4VNolulX zh(Iw3=NwZ$Nd$OdIOW=zGvB^^O7|NZ9UV3AAIJ-o=jBF=mK^6*EwKt3D~>v5taa5v z4Yc7JA1dys%(Mp5)%ptym#Dca$AgT;MFC!-3D+6X4HZKpIhGX9eW#bDjz}!$j>j!4 zdzsM7&BJanaLJ93(MM2750=BHG8xD&wL2`>^s_J5SYEbl6@ipIHQ5|B@4h>I^O|ey z%j?$K@4x$9_WSR-CjFoHyxYF`?yK!fSHH`C_o}t&b638_{`U{R5&9wf{ExgT{odQw z*_Yn+PWwOaxyFD0`fKe=*I%1{@7inZcdvOz`kkxR+2`K+7W@2L-fUlZ%MaV<*Sy8Q z__nM3%U8cMed*ndbNzel53ak;zswk4V!SWDeVzaAm2Xa;d&?W`ci!?Q`yyj~=^a`SW&t3Uu``laKY`?qqt@g!tyv@Ie zuit;qwdwb7c#nPQJ@4@^UJo(e7v6rAOZWeK%NzZF1$WNEC2DK zDV&8F-8~Lu8Ad=eSPsld4A4rctj?M7fyq(D!Bm=#8roDGTkVos4Cz5MaY!-Q=p@LE z`qlN~e3FtbV$Nyyg9mB^nUSR2YRMLx;x z@p089N7}ilSrRYv$5O#F2n3D~fi%M!=e^fzKie~HdZ)2$rLxI7lvur}^7@J+RwUN~<tVJQ>#Kjl}QDj7CWO;;;zz2xPhyIk{ORnD<2Gm+fxTGtGGNP}he6whqKCVMqCK))o z2`}A6VN15ZkXAhQL|XjtBWb~d8*SbL8&mHin^NzVt+w=uC+&h~x1|-_Nnf~aTU!3~ zGuHd~<2G;eW?QiF;k59+2W1}D*GtZ`FPd#f3AN{_~!FT7~_gPPWf11wY|Eb+w27>06 zGF+|(K$X-m!J6{|W)5a0!m{*~6Q7yH&QWJer>1JtBW>bA3XVN&Y|yikrZE_9

`x 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 LNkvXXu0mjfFz-9F literal 0 HcmV?d00001 diff --git a/examples/basic/public/postoffice/postoffice.webp b/examples/basic/public/postoffice/postoffice.webp new file mode 100644 index 0000000000000000000000000000000000000000..a8f16aa064d5367ff26894db8c38c792a17d6775 GIT binary patch literal 5008 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 a9A*;dOAkDaKlSk)6g<)i=0d0d0002njkh!a literal 0 HcmV?d00001 diff --git a/examples/basic/src/App.tsx b/examples/basic/src/App.tsx index 057b42c..a9c4a45 100644 --- a/examples/basic/src/App.tsx +++ b/examples/basic/src/App.tsx @@ -3,7 +3,7 @@ import { Routes, Route, Navigate, useNavigate, useLocation, useParams } from 're import { PageNav } from './components/PageNav'; import { CirclePage } from './pages/CirclePage'; import { MapPage } from './pages/map/basic/StoreMapPage'; -import { MarkerPage } from './pages/MarkerPage'; +import { MarkerIconsPage } from './pages/marker/icons/MarkerIconsPage'; import { PolygonPage } from './pages/PolygonPage'; import { PolylinePage } from './pages/PolylinePage'; import { GroundImagePage } from './pages/groundimage/GroundImagePage'; @@ -15,25 +15,49 @@ import { MapDesignPage } from './pages/map/design/MapDesignPage'; import { FlyToPage } from './pages/map/flyto/FlyToPage'; import { TiltPage } from './pages/map/tilt/TiltPage'; import { VisibleRegionPage } from './pages/map/visibleregion/VisibleRegionPage'; +import { CameraSyncPage } from './pages/map/camerasync/CameraSyncPage'; import { MarkerAnimationPage } from './pages/marker/animation/MarkerAnimationPage'; import { PostOfficePage } from './pages/marker/postoffice/PostOfficePage'; +import { PostOfficeClusterPage } from './pages/marker/postofficecluster/PostOfficeClusterPage'; import { PolygonClickPage } from './pages/polygon/click/PolygonClickPage'; import { PolygonGeodesicPage } from './pages/polygon/geodesic/PolygonGeodesicPage'; import { PolygonHolePage } from './pages/polygon/hole/PolygonHolePage'; import { PolylineClickPage } from './pages/polyline/click/PolylineClickPage'; import { RasterLayerPage } from './pages/rasterlayer/RasterLayerPage'; -import { UnsupportedSamplePage } from './pages/unsupported/UnsupportedSamplePage'; -import { DEFAULT_SAMPLE_PAGE, SAMPLE_PAGES, isKnownSamplePage } from './sampleRegistry'; +import { HeatmapLayerPage } from './pages/heatmaplayer/HeatmapLayerPage'; +import { BasicGeoJSONPage } from './pages/geojson/basic/BasicGeoJSONPage'; +import { GeoJSONLayerPage } from './pages/geojson/layer/GeoJSONLayerPage'; +import { DEFAULT_SAMPLE_PAGE, getSamplePageDefinition, isKnownSamplePage } from './sampleRegistry'; type MapProvider = 'maplibre' | 'google' | 'google-3d'; +function providerRouteId(provider: string | undefined): string { + return provider ?? ''; +} + +function isPageUnavailableOnProvider(page: string | undefined, provider: string | undefined): boolean { + const definition = getSamplePageDefinition(page); + return definition?.unavailableProviders?.includes(providerRouteId(provider)) ?? false; +} + +function ProviderUnavailableOverlay() { + return ( +

+ ); +} + function pageContent(page: string | undefined) { switch (page) { case 'map-design': return ; case 'fly-to': return ; case 'tilt': return ; case 'visible-region': return ; - case 'marker': return ; + case 'camera-sync': return ; + case 'marker': return ; case 'marker-animation': return ; case 'post-office': return ; case 'circle': return ; @@ -49,12 +73,10 @@ function pageContent(page: string | undefined) { case 'info-bubble-styled': return ; case 'info-bubble-multiple': return ; case 'info-bubble-rich': return ; - case 'post-office-cluster': - case 'geojson-basic': - case 'geojson-layer': - case 'heatmap-layer': - case 'camera-sync': - return item.id === page)?.label ?? 'Unsupported'} />; + case 'post-office-cluster': return ; + case 'heatmap-layer': return ; + case 'geojson-basic': return ; + case 'geojson-layer': return ; default: return ; } } @@ -68,7 +90,14 @@ function ProviderPageRoute() { return ; } - return pageContent(page); + const isUnavailable = isPageUnavailableOnProvider(requestedPage, provider); + + return ( + <> + {isUnavailable ? : pageContent(page)} + {isUnavailable && } + + ); } function App() { @@ -81,6 +110,8 @@ function App() { location.pathname.startsWith('/google-maps-3d') ? 'google-3d' : location.pathname.startsWith('/google-maps') ? 'google' : null; + const currentPage = location.pathname.split('/').filter(Boolean)[1] || DEFAULT_SAMPLE_PAGE; + const showProviderSelector = getSamplePageDefinition(currentPage)?.showProviderSelector ?? true; const switchProvider = (provider: MapProvider) => { const pathParts = location.pathname.split('/').filter(Boolean); @@ -111,17 +142,19 @@ function App() { - + {showProviderSelector && ( + + )} diff --git a/examples/basic/src/MapViewContainer.tsx b/examples/basic/src/MapViewContainer.tsx index 01abe4a..b7385a1 100644 --- a/examples/basic/src/MapViewContainer.tsx +++ b/examples/basic/src/MapViewContainer.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef } from 'react'; -import { useNavigate, useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router-dom'; import { MapLibreDesign, MapLibreView, useMapLibreViewState, type MapLibreViewState } from '@mapconductor/react-for-maplibre'; import { GoogleMapDesign, GoogleMapsView, GoogleMapsView2D, useGoogleMapViewState, type GoogleMapViewState } from '@mapconductor/react-for-googlemaps'; import { createGeoPoint, createMapCameraPosition, MarkerTilingOptions, type GeoPoint, type MapCameraPosition, type MapViewStateInterface, type MapDesignTypeInterface } from '@mapconductor/js-sdk-core'; @@ -12,6 +12,8 @@ export { DEFAULT_CAMERA }; interface MapViewContainerProps { children?: React.ReactNode; onMapClick?: (point: GeoPoint) => void; + onCameraMoveStart?: (cam: MapCameraPosition) => void; + onCameraMove?: (cam: MapCameraPosition) => void; onCameraMoveEnd?: (cam: MapCameraPosition) => void; markerTilingOptions?: MarkerTilingOptions; state: MapViewStateInterface>; @@ -38,18 +40,26 @@ export function useSampleMapViewState(initialCamera: InitialCamera = DEFAULT_CAM return mapLibreState; } -function MapLibreContainer({ children, onMapClick, onCameraMoveEnd, markerTilingOptions, state }: MapViewContainerProps) { +function MapLibreContainer({ children, onMapClick, onCameraMoveStart, onCameraMove, onCameraMoveEnd, markerTilingOptions, state }: MapViewContainerProps) { const mapState = state as MapLibreViewState; - const isActive = useRef(true); - useEffect(() => () => { isActive.current = false; }, []); + const isActive = useRef(false); + useEffect(() => () => { isActive.current = true; }, []); return ( { + if (!isActive.current) return; + onCameraMoveStart?.(newCam); + }} + onCameraMove={(newCam: any) => { + if (!isActive.current) return; + onCameraMove?.(newCam); + }} onCameraMoveEnd={(newCam: any) => { if (!isActive.current) return; onCameraMoveEnd?.(newCam); @@ -60,12 +70,11 @@ function MapLibreContainer({ children, onMapClick, onCameraMoveEnd, markerTiling ); } -function GoogleMapsContainer2D({ children, onMapClick, onCameraMoveEnd, markerTilingOptions, state }: MapViewContainerProps) { - const navigate = useNavigate(); +function GoogleMapsContainer2D({ children, onMapClick, onCameraMoveStart, onCameraMove, onCameraMoveEnd, markerTilingOptions, state }: MapViewContainerProps) { const mapState = state as GoogleMapViewState; - const isActive = useRef(true); - useEffect(() => () => { isActive.current = false; }, []); + const isActive = useRef(false); + useEffect(() => () => { isActive.current = true; }, []); const apiKey = import.meta.env.VITE_GOOGLE_MAPS_API_KEY || ''; if (!apiKey || apiKey === 'your_api_key_here') { @@ -86,7 +95,16 @@ function GoogleMapsContainer2D({ children, onMapClick, onCameraMoveEnd, markerTi apiKey={apiKey} mapId={'DEMO_MAP_ID'} version='alpha' + libraries={'map3d'} // for demo markerTilingOptions={markerTilingOptions} + onCameraMoveStart={(newCam: any) => { + if (!isActive.current) return; + onCameraMoveStart?.(newCam); + }} + onCameraMove={(newCam: any) => { + if (!isActive.current) return; + onCameraMove?.(newCam); + }} onMapClick={onMapClick} onCameraMoveEnd={(newCam: any) => { if (!isActive.current) return; @@ -98,11 +116,11 @@ function GoogleMapsContainer2D({ children, onMapClick, onCameraMoveEnd, markerTi ); } -function GoogleMapsContainer3D({ children, onMapClick, onCameraMoveEnd, state }: MapViewContainerProps) { +function GoogleMapsContainer3D({ children, onMapClick, onCameraMoveStart, onCameraMove, onCameraMoveEnd, state }: MapViewContainerProps) { const mapState = state as GoogleMapViewState; - const isActive = useRef(true); - useEffect(() => () => { isActive.current = false; }, []); + const isActive = useRef(false); + useEffect(() => () => { isActive.current = true; }, []); const apiKey = import.meta.env.VITE_GOOGLE_MAPS_API_KEY || ''; if (!apiKey || apiKey === 'your_api_key_here') { @@ -124,6 +142,14 @@ function GoogleMapsContainer3D({ children, onMapClick, onCameraMoveEnd, state }: mapId={'DEMO_MAP_ID'} version='alpha' onMapClick={onMapClick} + onCameraMoveStart={(newCam: any) => { + if (!isActive.current) return; + onCameraMoveStart?.(newCam); + }} + onCameraMove={(newCam: any) => { + if (!isActive.current) return; + onCameraMove?.(newCam); + }} onCameraMoveEnd={(newCam: any) => { if (!isActive.current) return; onCameraMoveEnd?.(newCam); @@ -134,7 +160,7 @@ function GoogleMapsContainer3D({ children, onMapClick, onCameraMoveEnd, state }: ); } -export function MapViewContainer({ children, onMapClick, onCameraMoveEnd, markerTilingOptions, state }: MapViewContainerProps) { +export function MapViewContainer({ children, onMapClick, onCameraMoveStart, onCameraMove, onCameraMoveEnd, markerTilingOptions, state }: MapViewContainerProps) { const location = useLocation(); const isGoogle3D = location.pathname.startsWith('/google-maps-3d'); const isGoogle2D = !isGoogle3D && location.pathname.startsWith('/google-maps'); @@ -142,6 +168,8 @@ export function MapViewContainer({ children, onMapClick, onCameraMoveEnd, marker if (isGoogle3D) { return {children} @@ -150,6 +178,8 @@ export function MapViewContainer({ children, onMapClick, onCameraMoveEnd, marker if (isGoogle2D) { return @@ -158,6 +188,8 @@ export function MapViewContainer({ children, onMapClick, onCameraMoveEnd, marker } return diff --git a/examples/basic/src/hooks/useNavigation.ts b/examples/basic/src/hooks/useNavigation.ts deleted file mode 100644 index 35240ce..0000000 --- a/examples/basic/src/hooks/useNavigation.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { useState, useCallback } from 'react'; -import { createGeoPoint, createMapCameraPosition } from '@mapconductor/js-sdk-core'; -import { useCamera } from '@mapconductor/js-sdk-react'; - -/** - * Custom hook for handling map navigation with loading state - */ -export function useNavigation() { - const { moveCamera } = useCamera(); - const [isNavigating, setIsNavigating] = useState(false); - - const flyToLocation = useCallback( - async (lat: number, lng: number) => { - setIsNavigating(true); - try { - await moveCamera(createMapCameraPosition({ - position: createGeoPoint({ latitude: lat, longitude: lng }), - zoom: 10, - })); - } catch (error) { - console.error('Navigation error:', error); - } finally { - setIsNavigating(false); - } - }, - [moveCamera] - ); - - return { - flyToLocation, - isNavigating, - }; -} diff --git a/examples/basic/src/index.css b/examples/basic/src/index.css index 700b1fb..eac03a5 100644 --- a/examples/basic/src/index.css +++ b/examples/basic/src/index.css @@ -1,4 +1,5 @@ @import './pages/map/design/map-design-page.css'; +@import './pages/map/camerasync/camera-sync-page.css'; * { margin: 0; @@ -196,6 +197,57 @@ body, color: white; } +.simple-text-bubble { + color: #2563eb; + padding: 4px; +} + +.marker-icon-info-bubble { + max-width: min(360px, 72vw); + white-space: pre-wrap; + color: #111827; + font: 12px/1.35 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace; +} + +.right-tail-info-bubble { + position: relative; + width: max-content; + max-width: 220px; + padding: 8px; + margin-left: 8px; + border: 2px solid #000000; + border-radius: 4px; + background: #ffffff; + color: #2563eb; + font-size: 13px; + line-height: 1.35; + box-shadow: 0 3px 14px rgba(15, 23, 42, 0.18); +} + +.right-tail-info-bubble::before, +.right-tail-info-bubble::after { + content: ''; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 0; + height: 0; +} + +.right-tail-info-bubble::before { + left: -10px; + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-right: 10px solid #000000; +} + +.right-tail-info-bubble::after { + left: -7px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 8px solid #ffffff; +} + .rich-bubble { display: grid; gap: 6px; @@ -208,6 +260,62 @@ body, font-size: 13px; } +.rich-location-bubble { + display: grid; + gap: 8px; + width: 200px; + color: #111827; + font-size: 13px; +} + +.rich-location-bubble strong { + font-size: 18px; + line-height: 1.2; +} + +.rich-location-bubble p { + color: #6b7280; + line-height: 1.35; +} + +.rating-row { + display: flex; + align-items: center; + gap: 4px; + font-size: 12px; +} + +.rating-stars { + display: flex; + gap: 1px; +} + +.rating-stars span { + color: #9ca3af; +} + +.rating-stars .filled { + color: #facc15; +} + +.multi-bubble-content { + display: grid; + gap: 2px; + min-height: 0; + padding: 0; + border: 0; + background: transparent; + color: #111827; + cursor: pointer; + text-align: left; + font: inherit; +} + +.multi-bubble-content span { + color: #6b7280; + font-size: 12px; +} + .map-container { flex: 1; min-width: 0; @@ -262,6 +370,23 @@ body, margin-top: 8px; } +.circle-radius-label { + position: absolute; + z-index: 1200; + transform: translate(-50%, -50%); + color: #dc2626; + font-size: 14px; + font-weight: 700; + line-height: 1; + text-shadow: + -2px -2px 0 #ffffff, + 2px -2px 0 #ffffff, + -2px 2px 0 #ffffff, + 2px 2px 0 #ffffff, + 0 0 5px rgba(255, 255, 255, 0.95); + pointer-events: none; +} + .toast-stack { position: absolute; bottom: 80px; @@ -284,6 +409,31 @@ body, white-space: pre-line; } +.provider-unavailable-overlay { + position: absolute; + inset: 0; + z-index: 2500; + display: grid; + place-items: center; + padding: 24px; + background: rgba(15, 23, 42, 0.42); + pointer-events: auto; +} + +.provider-unavailable-box { + width: min(420px, 100%); + padding: 18px 22px; + border: 1px solid rgba(148, 163, 184, 0.45); + border-radius: 8px; + background: rgba(255, 255, 255, 0.96); + color: #111827; + box-shadow: 0 18px 42px rgba(15, 23, 42, 0.3); + font-size: 0.98rem; + font-weight: 600; + line-height: 1.35; + text-align: center; +} + @media (max-width: 760px) { .header { min-height: 58px; diff --git a/examples/basic/src/main.tsx b/examples/basic/src/main.tsx index a814b52..4f982c8 100644 --- a/examples/basic/src/main.tsx +++ b/examples/basic/src/main.tsx @@ -6,7 +6,7 @@ import './index.css'; ReactDOM.createRoot(document.getElementById('root')!).render( - + diff --git a/examples/basic/src/pages/CirclePage.tsx b/examples/basic/src/pages/CirclePage.tsx index 53b2ab3..9951f20 100644 --- a/examples/basic/src/pages/CirclePage.tsx +++ b/examples/basic/src/pages/CirclePage.tsx @@ -1,49 +1,160 @@ -import { useMemo, useState } from 'react'; -import { createCircleState } from '@mapconductor/js-sdk-core'; -import { Circle, MarkerFromProps } from '@mapconductor/js-sdk-react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { + ColorDefaultIcon, + Spherical, + calculatePositionAtDistance, + computeDistanceBetween, + createCircleState, + createGeoPoint, + type GeoPoint, + type MarkerState, + type Offset, +} from '@mapconductor/js-sdk-core'; +import { Circle, Marker, Polyline } from '@mapconductor/js-sdk-react'; import { ControlPanel, SliderControl } from '../components/ControlPanel'; import { Toast, useToast } from '../components/Toast'; -import { CIRCLE_CENTER } from '../data/storeData'; import { MapViewContainer, useSampleMapViewState } from '../MapViewContainer'; -const INIT_CAMERA = { lat: 21.3825, lng: -157.9330, zoom: 12 }; +const CIRCLE_CENTER = createGeoPoint({ latitude: 21.382314, longitude: -157.933097 }); +const INIT_CAMERA = { lat: CIRCLE_CENTER.latitude, lng: CIRCLE_CENTER.longitude, zoom: 12 }; +const INITIAL_RADIUS_METERS = 1000; +const SUPPRESS_CIRCLE_CLICK_AFTER_MARKER_DRAG_MS = 300; +const CIRCLE_COLORS = ['#0000ff', '#ff0000', '#008000', '#00ffff', '#d3d3d3', '#ff00ff']; + +function rgba(hex: string, alpha: number): string { + const value = hex.replace('#', ''); + const r = parseInt(value.slice(0, 2), 16); + const g = parseInt(value.slice(2, 4), 16); + const b = parseInt(value.slice(4, 6), 16); + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +} + +function radiusLabelPosition( + center: GeoPoint, + edge: GeoPoint, + mapViewState: ReturnType, +): Offset | null | Promise { + const holder = mapViewState.getMapViewHolder(); + if (!holder) return null; + const midpoint = Spherical.linearInterpolate({ from: center, to: edge, fraction: 0.5 }); + return holder.toScreenOffset(midpoint); +} export function CirclePage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const [radius, setRadius] = useState(1000); + const [edgePosition, setEdgePosition] = useState(() => + calculatePositionAtDistance({ + center: CIRCLE_CENTER, + distanceMeters: INITIAL_RADIUS_METERS, + bearingDegrees: 90, + }), + ); + const [colorIndex, setColorIndex] = useState(0); const [fillOpacity, setFillOpacity] = useState(0.3); const [strokeWidth, setStrokeWidth] = useState(3); + const [labelOffset, setLabelOffset] = useState(null); + const [cameraTick, setCameraTick] = useState(0); + const suppressCircleClickUntilRef = useRef(0); const { messages, showToast, dismissToast } = useToast(); + const radius = useMemo( + () => computeDistanceBetween(CIRCLE_CENTER, edgePosition), + [edgePosition], + ); + + const updateLabelPosition = useCallback(() => { + const next = radiusLabelPosition(CIRCLE_CENTER, edgePosition, mapViewState); + if (next instanceof Promise) { + next.then(setLabelOffset).catch(() => setLabelOffset(null)); + } else { + setLabelOffset(next); + } + }, [edgePosition, mapViewState]); + + useEffect(() => { + updateLabelPosition(); + const raf = requestAnimationFrame(updateLabelPosition); + return () => cancelAnimationFrame(raf); + }, [cameraTick, updateLabelPosition]); + + const handleMarkerMove = useCallback((dragged: MarkerState) => { + setEdgePosition(dragged.position); + }, []); + + const handleMarkerDragEnd = useCallback((dragged: MarkerState) => { + suppressCircleClickUntilRef.current = + Date.now() + SUPPRESS_CIRCLE_CLICK_AFTER_MARKER_DRAG_MS; + setEdgePosition(dragged.position); + }, []); const circleState = useMemo( () => createCircleState({ - id: 'demo-circle', + id: 'circle', center: CIRCLE_CENTER, radiusMeters: radius, - fillColor: `rgba(0, 100, 255, ${fillOpacity})`, - strokeColor: '#0064ff', + fillColor: rgba(CIRCLE_COLORS[colorIndex], fillOpacity), + strokeColor: 'rgba(0, 0, 255, 0.5)', strokeWidth, clickable: true, - onClick: () => showToast(`Circle clicked - radius: ${radius.toFixed(0)}m`), + onClick: () => { + if (Date.now() < suppressCircleClickUntilRef.current) return; + setColorIndex((index) => (index + 1) % CIRCLE_COLORS.length); + showToast(`Circle clicked - Radius: ${radius.toFixed(0)}m`); + }, }), - [radius, fillOpacity, strokeWidth, showToast] + [colorIndex, fillOpacity, radius, showToast, strokeWidth], + ); + + const centerIcon = useMemo( + () => new ColorDefaultIcon('#ff0000', { strokeColor: '#ffffff', label: 'C' }), + [], + ); + const edgeIcon = useMemo( + () => new ColorDefaultIcon('#008000', { strokeColor: '#ffffff', label: 'E' }), + [], ); return ( - + setCameraTick((tick) => tick + 1)} + onCameraMoveEnd={() => setCameraTick((tick) => tick + 1)} + > - + + + + {labelOffset && ( +
+ {radius.toFixed(0)} m +
+ )} - `${value.toFixed(0)}m`} - onChange={setRadius} - /> `${value.toFixed(1)}px`} onChange={setStrokeWidth} /> diff --git a/examples/basic/src/pages/common/sampleHelpers.ts b/examples/basic/src/pages/common/sampleHelpers.ts index 184dd22..c46af5e 100644 --- a/examples/basic/src/pages/common/sampleHelpers.ts +++ b/examples/basic/src/pages/common/sampleHelpers.ts @@ -1,11 +1,8 @@ import { ColorDefaultIcon, createGeoPoint, - createMapCameraPosition, createMarkerState, - type GeoPoint, } from '@mapconductor/js-sdk-core'; -import { useMapViewController } from '@mapconductor/js-sdk-react'; export const HONOLULU = createGeoPoint({ latitude: 21.382314, longitude: -157.933097 }); export const SAPPORO = createGeoPoint({ latitude: 43.06417, longitude: 141.34694 }); @@ -18,16 +15,3 @@ export function cityMarker(id: string, label: string, latitude: number, longitud icon: new ColorDefaultIcon('#2563eb', { label: label.slice(0, 1), labelTextColor: '#ffffff' }), }); } - -export function useCameraActions() { - const controller = useMapViewController(); - - return { - getBounds: () => controller?.getBounds() ?? null, - getCameraPosition: () => controller?.getCameraPosition() ?? null, - animateCamera: (center: GeoPoint, duration = 800, zoom = 13, bearing = 0, tilt = 0) => { - if (!controller) return; - void controller.animateCamera(createMapCameraPosition({ position: center, zoom, bearing, tilt }), { duration }); - }, - }; -} diff --git a/examples/basic/src/pages/geojson/basic/BasicGeoJSONPage.tsx b/examples/basic/src/pages/geojson/basic/BasicGeoJSONPage.tsx new file mode 100644 index 0000000..f2a4b70 --- /dev/null +++ b/examples/basic/src/pages/geojson/basic/BasicGeoJSONPage.tsx @@ -0,0 +1,83 @@ +import { useMemo, useState, useEffect } from 'react'; +import { + GeoJSONLayer, + GeoJSONLayerState, + GeoJSONParser, + colorArgb, +} from '@mapconductor/react-geojson-layer'; +import type { GeoJSONFeatureData } from '@mapconductor/react-geojson-layer'; +import { ControlPanel } from '../../../components/ControlPanel'; +import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; + +const INIT_CAMERA = { lat: 25.255377, lng: 55.3089185, zoom: 13 }; + +const BASIC_GEOJSON = `{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [55.30122473231012, 25.26476622289597], + [55.29743486255916, 25.25827212207261], + [55.28978863411328, 25.251356725509737], + [55.300027931336984, 25.246425506635504], + [55.307474692951274, 25.244200378933655], + [55.31212891895635, 25.256408010450187], + [55.30774064871093, 25.26266169122738], + [55.301357710197806, 25.264946609615492], + [55.30122473231012, 25.26476622289597] + ], + [ + [55.30084858315658, 25.256531695820797], + [55.298280197635705, 25.252243254705405], + [55.30163885563897, 25.250501032248863], + [55.304059065092645, 25.254700192612702], + [55.30084858315658, 25.256531695820797] + ], + [ + [55.30173763969924, 25.262517391695198], + [55.301095543307355, 25.26122200491396], + [55.30396028103232, 25.259479911263526], + [55.30489872958182, 25.261132667394975], + [55.30173763969924, 25.262517391695198] + ] + ] + }, + "properties": {} + } + ] +}`; + +export function BasicGeoJSONPage() { + const mapViewState = useSampleMapViewState(INIT_CAMERA); + + const layerState = useMemo( + () => + new GeoJSONLayerState({ + fillColor: colorArgb(127, 0x3b, 0xb2, 0xd0), + strokeColor: colorArgb(255, 0x1d, 0x70, 0x82), + strokeWidth: 2, + }), + [], + ); + + const [features, setFeatures] = useState([]); + + useEffect(() => { + setFeatures(GeoJSONParser.parseFeatures(BASIC_GEOJSON)); + }, []); + + return ( + + + +

+ GeoJSON ポリゴン(ホール付き)を表示しています。 +

+
+
+ ); +} diff --git a/examples/basic/src/pages/geojson/layer/GeoJSONLayerPage.tsx b/examples/basic/src/pages/geojson/layer/GeoJSONLayerPage.tsx new file mode 100644 index 0000000..979ed21 --- /dev/null +++ b/examples/basic/src/pages/geojson/layer/GeoJSONLayerPage.tsx @@ -0,0 +1,142 @@ +import { useCallback, useMemo, useState, useEffect } from 'react'; +import { createGeoPoint, type GeoPoint } from '@mapconductor/js-sdk-core'; +import { InfoBubbleAtPosition } from '@mapconductor/js-sdk-react'; +import { + GeoJSONLayer, + GeoJSONLayerState, + GeoJSONParser, + colorArgb, +} from '@mapconductor/react-geojson-layer'; +import type { GeoJSONFeatureData } from '@mapconductor/react-geojson-layer'; +import { ControlPanel } from '../../../components/ControlPanel'; +import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; + +const INIT_CAMERA = { lat: 35.68, lng: 139.77, zoom: 13 }; + +interface SelectedFeature { + position: GeoPoint; + properties: Record; +} + +const PROPERTY_LABELS: Record = { + N02_002: '鉄道区分', + N02_003: '事業者種別', + N02_004: '路線名', + N02_005: '運営会社', +}; + +export function GeoJSONLayerPage() { + const mapViewState = useSampleMapViewState(INIT_CAMERA); + const [features, setFeatures] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [selected, setSelected] = useState(null); + + const layerState = useMemo( + () => + new GeoJSONLayerState({ + strokeColor: colorArgb(200, 250, 36, 29), + strokeWidth: 6, + onClick: (feature, position) => { + setSelected({ + position: createGeoPoint({ latitude: position.latitude, longitude: position.longitude }), + properties: feature.properties ?? {}, + }); + }, + }), + [], + ); + + useEffect(() => { + fetch(`${import.meta.env.BASE_URL}geojson/sample-railway.geojson`) + .then(r => { + if (!r.ok) throw new Error(`HTTP ${r.status}`); + return r.text(); + }) + .then(text => { + setFeatures(GeoJSONParser.parseFeatures(text)); + setIsLoading(false); + }) + .catch(err => { + setError(String(err)); + setIsLoading(false); + }); + }, []); + + const handleMapClick = useCallback( + (point: GeoPoint) => { + if (!layerState.processClick(point)) { + setSelected(null); + } + }, + [layerState], + ); + + if (error) { + return ( +
+

データの読み込みに失敗しました: {error}

+
+ ); + } + + return ( + + + + {selected && ( + + + + )} + + + {isLoading ? ( +

GeoJSON 読み込み中...

+ ) : ( +

+ 路線をタップするとプロパティが表示されます。 +

+ )} +
+
+ ); +} + +function PropertyTable({ properties }: { properties: Record }) { + const entries = Object.entries(properties); + if (entries.length === 0) return

プロパティなし

; + + return ( + + + + + + + + + {entries.map(([key, value]) => ( + + + + + ))} + +
プロパティ
{PROPERTY_LABELS[key] ?? key}{value == null ? '' : String(value)}
+ ); +} + +const thStyle: React.CSSProperties = { + border: '1px solid #bbb', + padding: '4px 8px', + textAlign: 'left', + fontWeight: 600, + color: '#333', +}; + +const tdStyle: React.CSSProperties = { + border: '1px solid #bbb', + padding: '4px 8px', + color: '#222', +}; diff --git a/examples/basic/src/pages/groundimage/GroundImagePage.tsx b/examples/basic/src/pages/groundimage/GroundImagePage.tsx index 071e3f6..5006a7f 100644 --- a/examples/basic/src/pages/groundimage/GroundImagePage.tsx +++ b/examples/basic/src/pages/groundimage/GroundImagePage.tsx @@ -12,8 +12,8 @@ import { Toast, useToast } from '../../components/Toast'; import { MapViewContainer, useSampleMapViewState } from '../../MapViewContainer'; const INIT_CAMERA = { lat: 40.7410, lng: -74.1758, zoom: 11 }; -const GROUND_IMAGE_URL = '/newark_nj_1922_0.webp'; -const CLICKED_GROUND_IMAGE_URL = '/newark_nj_1922_1.webp'; +const GROUND_IMAGE_URL = `${import.meta.env.BASE_URL}newark_nj_1922_0.webp`; +const CLICKED_GROUND_IMAGE_URL = `${import.meta.env.BASE_URL}newark_nj_1922_1.webp`; export function GroundImagePage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); diff --git a/examples/basic/src/pages/heatmaplayer/HeatmapLayerPage.tsx b/examples/basic/src/pages/heatmaplayer/HeatmapLayerPage.tsx new file mode 100644 index 0000000..963b09f --- /dev/null +++ b/examples/basic/src/pages/heatmaplayer/HeatmapLayerPage.tsx @@ -0,0 +1,95 @@ +import { useEffect, useState } from 'react'; +import { useLocation } from 'react-router-dom'; +import { createGeoPoint, createMapCameraPosition } from '@mapconductor/js-sdk-core'; +import { GoogleMapDesign, useGoogleMapViewState } from '@mapconductor/react-for-googlemaps'; +import { MapLibreDesign, useMapLibreViewState } from '@mapconductor/react-for-maplibre'; +import { HeatmapOverlay, HeatmapPoints, HeatmapPointState } from '@mapconductor/react-heatmap'; +import { ControlPanel } from '../../components/ControlPanel'; +import { MapViewContainer } from '../../MapViewContainer'; +import type { MapDesignTypeInterface, MapViewStateInterface } from '@mapconductor/js-sdk-core'; + +const INIT_CAMERA_POSITION = createMapCameraPosition({ + position: createGeoPoint({ latitude: 35.68049, longitude: 139.76669 }), + zoom: 10, +}); + +function HeatmapLayerPageContent({ + mapViewState, +}: { + mapViewState: MapViewStateInterface>; +}) { + const [heatmapPoints, setHeatmapPoints] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + fetch(`${import.meta.env.BASE_URL}postoffice/postoffices.json`) + .then(r => { + if (!r.ok) throw new Error(`HTTP ${r.status}`); + return r.json() as Promise<[number, number, string, string][]>; + }) + .then(data => { + const points = data.map(([lat, lng], i) => + new HeatmapPointState({ + id: `po-${i}`, + position: createGeoPoint({ latitude: lat, longitude: lng }), + }), + ); + setHeatmapPoints(points); + setIsLoading(false); + }) + .catch(err => { + setError(String(err)); + setIsLoading(false); + }); + }, []); + + if (error) { + return ( +
+

データの読み込みに失敗しました: {error}

+
+ ); + } + + return ( + + + + + + + {isLoading ? ( +

データ読み込み中...

+ ) : ( +

+ 郵便局データをヒートマップで表示しています。 +

+ )} +
+
+ ); +} + +function GoogleHeatmapLayerPage() { + const mapViewState = useGoogleMapViewState({ + mapDesignType: GoogleMapDesign.Normal, + cameraPosition: INIT_CAMERA_POSITION, + }); + return ; +} + +function MapLibreHeatmapLayerPage() { + const mapViewState = useMapLibreViewState({ + mapDesignType: MapLibreDesign.MapTilerTonerEn, + cameraPosition: INIT_CAMERA_POSITION, + }); + return ; +} + +export function HeatmapLayerPage() { + const location = useLocation(); + return location.pathname.startsWith('/google-maps') + ? + : ; +} diff --git a/examples/basic/src/pages/infobubble/MultipleBubblesPage.tsx b/examples/basic/src/pages/infobubble/MultipleBubblesPage.tsx index e17d6dd..b32926d 100644 --- a/examples/basic/src/pages/infobubble/MultipleBubblesPage.tsx +++ b/examples/basic/src/pages/infobubble/MultipleBubblesPage.tsx @@ -1,26 +1,75 @@ -import { useMemo } from 'react'; +import { useMemo, useState } from 'react'; +import { ColorDefaultIcon, createGeoPoint, createMarkerState } from '@mapconductor/js-sdk-core'; import { InfoBubble, Markers } from '@mapconductor/js-sdk-react'; -import { cityMarker } from '../common/sampleHelpers'; import { MapViewContainer, useSampleMapViewState } from '../../MapViewContainer'; -const INIT_CAMERA = { lat: 43.065, lng: 141.345, zoom: 12 }; +const INIT_CAMERA = { lat: 37.7749, lng: -122.4194, zoom: 15, pitch: 45 }; export function MultipleBubblesPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const markers = useMemo(() => [ - cityMarker('bubble-1', 'One', 43.06417, 141.34694), - cityMarker('bubble-2', 'Two', 43.07, 141.36), - cityMarker('bubble-3', 'Three', 43.055, 141.33), - ], []); + const [selectedMarkerIds, setSelectedMarkerIds] = useState>( + () => new Set(['marker_0', 'marker_1', 'marker_2']) + ); + const markers = useMemo( + () => + [ + { + position: createGeoPoint({ latitude: 37.7749, longitude: -122.4194 }), + name: 'Restaurant A', + color: '#ef4444', + }, + { + position: createGeoPoint({ latitude: 37.7849, longitude: -122.4094 }), + name: 'Hotel B', + color: '#2563eb', + }, + { + position: createGeoPoint({ latitude: 37.7649, longitude: -122.4294 }), + name: 'Shop C', + color: '#22c55e', + }, + ].map((data, index) => + createMarkerState({ + id: `marker_${index}`, + position: data.position, + icon: new ColorDefaultIcon(data.color, { label: `${index + 1}`, labelTextColor: '#ffffff' }), + extra: data.name, + onClick: state => { + setSelectedMarkerIds(prev => { + const next = new Set(prev); + if (next.has(state.id)) next.delete(state.id); + else next.add(state.id); + return next; + }); + }, + }) + ), + [] + ); return ( - + setSelectedMarkerIds(new Set())}> - {markers.map(marker => ( - -
{marker.extra as string}
-
- ))} + {markers.map(marker => + selectedMarkerIds.has(marker.id) ? ( + + + + ) : null + )}
); } diff --git a/examples/basic/src/pages/infobubble/RichContentBubblePage.tsx b/examples/basic/src/pages/infobubble/RichContentBubblePage.tsx index e50968d..c1774f1 100644 --- a/examples/basic/src/pages/infobubble/RichContentBubblePage.tsx +++ b/examples/basic/src/pages/infobubble/RichContentBubblePage.tsx @@ -1,23 +1,60 @@ -import { useMemo } from 'react'; -import { InfoBubbleCustom, Marker } from '@mapconductor/js-sdk-react'; -import { cityMarker } from '../common/sampleHelpers'; +import { useMemo, useState } from 'react'; +import { ColorDefaultIcon, createGeoPoint, createMarkerState } from '@mapconductor/js-sdk-core'; +import { InfoBubble, Marker } from '@mapconductor/js-sdk-react'; import { MapViewContainer, useSampleMapViewState } from '../../MapViewContainer'; -const INIT_CAMERA = { lat: 43.0642, lng: 141.3469, zoom: 13 }; +interface LocationInfo extends Record { + name: string; + description: string; + rating: number; +} + +const INIT_CAMERA = { lat: 37.7749, lng: -122.4194, zoom: 10 }; export function RichContentBubblePage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const marker = useMemo(() => cityMarker('rich-bubble', 'Rich', 43.06417, 141.34694), []); + const [selectedMarkerId, setSelectedMarkerId] = useState('golden-gate-park'); + const marker = useMemo(() => { + const locationInfo: LocationInfo = { + name: 'Golden Gate Park', + description: 'A large urban park with gardens, museums, and recreational areas.', + rating: 4.5, + }; + return createMarkerState({ + id: 'golden-gate-park', + position: createGeoPoint({ latitude: 37.7694, longitude: -122.4862 }), + icon: new ColorDefaultIcon('#22c55e', { label: '🌳' }), + extra: locationInfo, + onClick: state => setSelectedMarkerId(state.id), + }); + }, []); + const info = marker.extra as LocationInfo; + return ( - + setSelectedMarkerId(null)}> - -
- Rich content - Status: open - -
-
+ {selectedMarkerId === marker.id && ( + +
+ {info.name} +

{info.description}

+
+ + {Array.from({ length: 5 }, (_, index) => ( + + ))} + + {info.rating}/5 +
+
+
+ )}
); } diff --git a/examples/basic/src/pages/infobubble/SimpleInfoBubblePage.tsx b/examples/basic/src/pages/infobubble/SimpleInfoBubblePage.tsx index 1a0c3fa..0b8ccb0 100644 --- a/examples/basic/src/pages/infobubble/SimpleInfoBubblePage.tsx +++ b/examples/basic/src/pages/infobubble/SimpleInfoBubblePage.tsx @@ -1,19 +1,32 @@ -import { useMemo } from 'react'; +import { useMemo, useState } from 'react'; +import { ColorDefaultIcon, createGeoPoint, createMarkerState } from '@mapconductor/js-sdk-core'; import { InfoBubble, Marker } from '@mapconductor/js-sdk-react'; -import { cityMarker } from '../common/sampleHelpers'; import { MapViewContainer, useSampleMapViewState } from '../../MapViewContainer'; -const INIT_CAMERA = { lat: 43.0642, lng: 141.3469, zoom: 13 }; +const SAN_FRANCISCO = createGeoPoint({ latitude: 37.7749, longitude: -122.4194 }); +const INIT_CAMERA = { lat: 37.7749, lng: -122.4194, zoom: 10 }; export function SimpleInfoBubblePage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const marker = useMemo(() => cityMarker('simple-bubble', 'Sapporo', 43.06417, 141.34694), []); + const [selectedMarkerId, setSelectedMarkerId] = useState('simple-text-bubble'); + const marker = useMemo(() => createMarkerState({ + id: 'simple-text-bubble', + position: SAN_FRANCISCO, + icon: new ColorDefaultIcon('#2563eb', { label: 'SF', labelTextColor: '#ffffff' }), + extra: 'San Francisco - The Golden Gate City', + onClick: state => setSelectedMarkerId(state.id), + }), []); + return ( - + setSelectedMarkerId(null)}> - -
Simple text bubble
-
+ {selectedMarkerId === marker.id && ( + +
+ {marker.extra as string} +
+
+ )}
); } diff --git a/examples/basic/src/pages/infobubble/StyledInfoBubblePage.tsx b/examples/basic/src/pages/infobubble/StyledInfoBubblePage.tsx index 01256b1..c06db05 100644 --- a/examples/basic/src/pages/infobubble/StyledInfoBubblePage.tsx +++ b/examples/basic/src/pages/infobubble/StyledInfoBubblePage.tsx @@ -1,29 +1,52 @@ -import { useState } from 'react'; -import { ColorDefaultIcon, createMarkerState } from '@mapconductor/js-sdk-core'; -import { InfoBubble, Marker } from '@mapconductor/js-sdk-react'; -import { SAPPORO } from '../common/sampleHelpers'; +import { useMemo, useState } from 'react'; +import { ColorDefaultIcon, createGeoPoint, createMarkerState } from '@mapconductor/js-sdk-core'; +import { InfoBubbleCustom, Markers } from '@mapconductor/js-sdk-react'; import { MapViewContainer, useSampleMapViewState } from '../../MapViewContainer'; -const INIT_CAMERA = { lat: 43.0642, lng: 141.3469, zoom: 13 }; +const INIT_CAMERA = { lat: 37.7849, lng: -122.4094, zoom: 15 }; export function StyledInfoBubblePage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const [marker] = useState(() => createMarkerState({ - id: 'styled-bubble', - position: SAPPORO, - draggable: true, - icon: new ColorDefaultIcon('#7c3aed', { label: 'S', labelTextColor: '#ffffff' }), - })); + const [selectedMarkerId, setSelectedMarkerId] = useState('marker1'); + const markers = useMemo(() => { + const marker1 = createMarkerState({ + id: 'marker1', + position: createGeoPoint({ latitude: 37.7749, longitude: -122.4194 }), + icon: new ColorDefaultIcon('#2563eb', { + label: '1', + labelTextColor: '#ffffff', + infoAnchor: { x: 0.5, y: 0.25 }, + }), + draggable: true, + onClick: state => setSelectedMarkerId(state.id), + onDragStart: state => console.log(`マーカーのドラッグを開始: ${state.id}`), + onDrag: state => console.log('マーカーをドラッグ中:', state.position), + onDragEnd: state => console.log(`マーカーのドラッグが終了: ${state.id}`), + }); + const marker2 = createMarkerState({ + id: 'marker2', + position: createGeoPoint({ latitude: 37.7849, longitude: -122.4094 }), + icon: new ColorDefaultIcon('#ef4444', { + label: '2', + labelTextColor: '#ffffff', + infoAnchor: { x: 0.5, y: 0.25 }, + }), + onClick: state => setSelectedMarkerId(state.id), + }); + return [marker1, marker2]; + }, []); + const activeMarker = markers.find(marker => marker.id === selectedMarkerId); return ( - - - -
- Styled bubble - Drag the marker. -
-
+ setSelectedMarkerId(null)}> + + {activeMarker && ( + +
+ {activeMarker.position.toUrlValue(6)} +
+
+ )}
); } diff --git a/examples/basic/src/pages/map/basic/StoreMapPage.tsx b/examples/basic/src/pages/map/basic/StoreMapPage.tsx index b7f75ca..96650fa 100644 --- a/examples/basic/src/pages/map/basic/StoreMapPage.tsx +++ b/examples/basic/src/pages/map/basic/StoreMapPage.tsx @@ -13,10 +13,10 @@ import { StoreInfoView } from './StoreInfoView'; const INIT_CAMERA = { lat: 21.382314, lng: -157.933097, zoom: 10 }; const STORE_ICON_URLS: Record = { - coffee_bean: '/store-icons/coffee_bean.webp', - honolulu_coffee: '/store-icons/honolulu_coffee.webp', - coffee_extra: '/store-icons/coffee_extra.webp', - starbucks: '/store-icons/starbucks.webp', + coffee_bean: `${import.meta.env.BASE_URL}store-icons/coffee_bean.webp`, + honolulu_coffee: `${import.meta.env.BASE_URL}store-icons/honolulu_coffee.webp`, + coffee_extra: `${import.meta.env.BASE_URL}store-icons/coffee_extra.webp`, + starbucks: `${import.meta.env.BASE_URL}store-icons/starbucks.webp`, }; export function MapPage() { diff --git a/examples/basic/src/pages/map/camerasync/CameraSyncPage.tsx b/examples/basic/src/pages/map/camerasync/CameraSyncPage.tsx new file mode 100644 index 0000000..adb310e --- /dev/null +++ b/examples/basic/src/pages/map/camerasync/CameraSyncPage.tsx @@ -0,0 +1,555 @@ +import { useMemo, useRef, useState } from 'react'; +import { + createGeoPoint, + createMapCameraPosition, + createPolygonState, + createPolylineState, + type GeoPoint, + type MapCameraPosition, + type MapDesignTypeInterface, + type MapViewStateInterface, + type PolygonState, + type PolylineState, +} from '@mapconductor/js-sdk-core'; +import { Polygon, Polyline } from '@mapconductor/js-sdk-react'; +import { + GoogleMapDesign, + GoogleMapsView, + GoogleMapsView2D, + useGoogleMapViewState, + type GoogleMapViewState, +} from '@mapconductor/react-for-googlemaps'; +import { + MapLibreDesign, + MapLibreView, + useMapLibreViewState, + type MapLibreViewState, +} from '@mapconductor/react-for-maplibre'; + +type PaneId = 'left' | 'right'; +type PaneProvider = 'maplibre' | 'google-maps' | 'google-maps-3d'; + +interface CameraLocationInfo { + name: string; + bounds: { + southWest: GeoPoint; + northEast: GeoPoint; + }; + center: GeoPoint; + zoom: number; +} + +interface ProgrammaticMoveState { + key: number | null; + target: MapCameraPosition | null; + untilMs: number; + sinceMs: number; +} + +interface PairedFlyToState { + active: boolean; + untilMs: number; + leftEnded: boolean; + rightEnded: boolean; +} + +interface PaneState { + provider: PaneProvider; + mapState: MapViewStateInterface>; +} + +const INITIAL_CAMERA = createMapCameraPosition({ + position: createGeoPoint({ latitude: 35.6812, longitude: 139.7671, altitude: 0 }), + zoom: 12, + bearing: 0, + tilt: 0, +}); + +const PROGRAMMATIC_TTL_MS = 1200; +const PROGRAMMATIC_GRACE_MS = 250; +const MOVE_SYNC_INTERVAL_MS = 33; +const FLY_TO_DURATION_MS = 1000; + +function cameraKey(camera: MapCameraPosition): number { + const latE5 = Math.trunc(camera.position.latitude * 1e5); + const lonE5 = Math.trunc(camera.position.longitude * 1e5); + const zoom100 = Math.trunc(camera.zoom * 100); + const bearing10 = Math.trunc(camera.bearing * 10); + return (((latE5 * 31 + lonE5) * 31 + zoom100) * 31 + bearing10); +} + +function bearingDeltaDeg(a: number, b: number): number { + const d = ((a - b) % 360 + 360) % 360; + return d > 180 ? 360 - d : d; +} + +function isCloseToTarget(camera: MapCameraPosition, target: MapCameraPosition): boolean { + return ( + Math.abs(camera.position.latitude - target.position.latitude) < 0.0012 && + Math.abs(camera.position.longitude - target.position.longitude) < 0.0012 && + Math.abs(camera.zoom - target.zoom) < 0.75 && + bearingDeltaDeg(camera.bearing, target.bearing) < 12 && + Math.abs(camera.tilt - target.tilt) < 6 + ); +} + +function markProgrammaticMove( + ref: React.MutableRefObject, + target: MapCameraPosition, + nowMs: number, + ttlMs = PROGRAMMATIC_TTL_MS, +) { + ref.current = { + key: cameraKey(target), + target, + sinceMs: nowMs, + untilMs: nowMs + ttlMs, + }; +} + +function clearProgrammaticMove(ref: React.MutableRefObject) { + ref.current = { key: null, target: null, sinceMs: 0, untilMs: 0 }; +} + +function clearPairedFlyTo(ref: React.MutableRefObject) { + ref.current = { active: false, untilMs: 0, leftEnded: false, rightEnded: false }; +} + +function isProgrammaticMove( + ref: React.MutableRefObject, + camera: MapCameraPosition, + nowMs: number, +): boolean { + const state = ref.current; + if (state.key == null || nowMs > state.untilMs) return false; + if (cameraKey(camera) === state.key) return true; + return state.target ? isCloseToTarget(camera, state.target) : false; +} + +function defaultLocations(): CameraLocationInfo[] { + return [ + { + name: 'Tokyo', + bounds: { + southWest: createGeoPoint({ latitude: 35.62, longitude: 139.7, altitude: 0 }), + northEast: createGeoPoint({ latitude: 35.74, longitude: 139.84, altitude: 0 }), + }, + center: createGeoPoint({ latitude: 35.6812, longitude: 139.7671, altitude: 0 }), + zoom: 12, + }, + { + name: 'French Southern and Antarctic Lands', + bounds: { + southWest: createGeoPoint({ latitude: -49.5, longitude: 50, altitude: 0 }), + northEast: createGeoPoint({ latitude: -37.5, longitude: 77, altitude: 0 }), + }, + center: createGeoPoint({ latitude: -43.5, longitude: 63.5, altitude: 0 }), + zoom: 4, + }, + { + name: 'Finland', + bounds: { + southWest: createGeoPoint({ latitude: 59.8, longitude: 19.1, altitude: 0 }), + northEast: createGeoPoint({ latitude: 70.1, longitude: 31.6, altitude: 0 }), + }, + center: createGeoPoint({ latitude: 64.95, longitude: 25.35, altitude: 0 }), + zoom: 5, + }, + { + name: 'Iceland', + bounds: { + southWest: createGeoPoint({ latitude: 63.3, longitude: -24.5, altitude: 0 }), + northEast: createGeoPoint({ latitude: 66.6, longitude: -13.5, altitude: 0 }), + }, + center: createGeoPoint({ latitude: 64.95, longitude: -19, altitude: 0 }), + zoom: 6, + }, + { + name: 'Kiribati', + bounds: { + southWest: createGeoPoint({ latitude: -11.5, longitude: -174.5, altitude: 0 }), + northEast: createGeoPoint({ latitude: 5, longitude: -147, altitude: 0 }), + }, + center: createGeoPoint({ latitude: -3.25, longitude: -160.75, altitude: 0 }), + zoom: 4.5, + }, + { + name: 'Oahu Island', + bounds: { + southWest: createGeoPoint({ latitude: 21.25, longitude: -158.3, altitude: 0 }), + northEast: createGeoPoint({ latitude: 21.7, longitude: -157.65, altitude: 0 }), + }, + center: createGeoPoint({ latitude: 21.475, longitude: -157.975, altitude: 0 }), + zoom: 9.5, + }, + ]; +} + +function boundsPolyline(location: CameraLocationInfo, index: number): PolylineState { + const sw = location.bounds.southWest; + const ne = location.bounds.northEast; + return createPolylineState({ + id: `camera_sync_bounds_${index}`, + points: [ + sw, + createGeoPoint({ latitude: sw.latitude, longitude: ne.longitude, altitude: 0 }), + ne, + createGeoPoint({ latitude: ne.latitude, longitude: sw.longitude, altitude: 0 }), + sw, + ], + strokeColor: '#dc2626', + strokeWidth: 3, + geodesic: true, + }); +} + +function referenceRectangles(locations: CameraLocationInfo[]): PolygonState[] { + const size = 1; + return locations.map((location, index) => { + const lat = location.center.latitude; + const lng = location.center.longitude; + return createPolygonState({ + id: `camera_sync_reference_${index}`, + points: [ + createGeoPoint({ latitude: lat - size / 2, longitude: lng - size / 2, altitude: 0 }), + createGeoPoint({ latitude: lat - size / 2, longitude: lng + size / 2, altitude: 0 }), + createGeoPoint({ latitude: lat + size / 2, longitude: lng + size / 2, altitude: 0 }), + createGeoPoint({ latitude: lat + size / 2, longitude: lng - size / 2, altitude: 0 }), + createGeoPoint({ latitude: lat - size / 2, longitude: lng - size / 2, altitude: 0 }), + ], + strokeColor: '#2563eb', + strokeWidth: 2, + fillColor: 'rgba(37, 99, 235, 0.1)', + geodesic: false, + zIndex: 1, + }); + }); +} + +function usePaneState( + provider: PaneProvider, + mapLibreState: MapLibreViewState, + google2DState: GoogleMapViewState, + google3DState: GoogleMapViewState, +): PaneState { + if (provider === 'google-maps') { + return { provider, mapState: google2DState as MapViewStateInterface> }; + } + if (provider === 'google-maps-3d') { + return { provider, mapState: google3DState as MapViewStateInterface> }; + } + return { provider, mapState: mapLibreState as MapViewStateInterface> }; +} + +function providerLabel(provider: PaneProvider): string { + if (provider === 'google-maps') return 'Google Maps'; + if (provider === 'google-maps-3d') return 'Google Maps 3D'; + return 'MapLibre'; +} + +function CameraInfoCard({ label, position }: { label: string; position: MapCameraPosition }) { + return ( +
+ {label} + Lat: {position.position.latitude.toFixed(5)} + Lng: {position.position.longitude.toFixed(5)} + Zoom: {position.zoom.toFixed(2)} + Tilt: {position.tilt.toFixed(1)}deg + Bearing: {position.bearing.toFixed(1)}deg + Alt: {(position.position.altitude ?? 0).toFixed(0)} m +
+ ); +} + +function CameraSyncMapView({ + paneState, + children, + onCameraMove, + onCameraMoveEnd, +}: { + paneState: PaneState; + children: React.ReactNode; + onCameraMove: (camera: MapCameraPosition) => void; + onCameraMoveEnd: (camera: MapCameraPosition) => void; +}) { + if (paneState.provider === 'google-maps' || paneState.provider === 'google-maps-3d') { + const apiKey = import.meta.env.VITE_GOOGLE_MAPS_API_KEY || ''; + if (!apiKey || apiKey === 'your_api_key_here') { + return ( +
+

Google Maps API Key is Missing

+

Add VITE_GOOGLE_MAPS_API_KEY to examples/basic/.env, or switch this pane to MapLibre.

+
+ ); + } + + if (paneState.provider === 'google-maps-3d') { + return ( + + {children} + + ); + } + + return ( + + {children} + + ); + } + + return ( + + {children} + + ); +} + +function CameraSyncMapPane({ + label, + paneState, + selectedProvider, + onProviderChange, + cameraPosition, + onCameraMove, + onCameraMoveEnd, + boundsPolylines, + referenceRectangles, +}: { + label: string; + paneState: PaneState; + selectedProvider: PaneProvider; + onProviderChange: (provider: PaneProvider) => void; + cameraPosition: MapCameraPosition; + onCameraMove: (position: MapCameraPosition) => void; + onCameraMoveEnd: (position: MapCameraPosition) => void; + boundsPolylines: PolylineState[]; + referenceRectangles: PolygonState[]; +}) { + return ( +
+ + {boundsPolylines.map(polyline => )} + {referenceRectangles.map(polygon => )} + + + + + +
+ ); +} + +export function CameraSyncPage() { + const locations = useMemo(defaultLocations, []); + const boundsPolylines = useMemo(() => locations.map(boundsPolyline), [locations]); + const rectangles = useMemo(() => referenceRectangles(locations), [locations]); + + const leftMapLibreState = useMapLibreViewState({ + id: 'camera-sync-left-maplibre', + mapDesignType: MapLibreDesign.OsmBrightJa, + cameraPosition: INITIAL_CAMERA, + }); + const rightMapLibreState = useMapLibreViewState({ + id: 'camera-sync-right-maplibre', + mapDesignType: MapLibreDesign.MapTilerBasicJa, + cameraPosition: INITIAL_CAMERA, + }); + const leftGoogle2DState = useGoogleMapViewState({ + id: 'camera-sync-left-google-2d', + mapDesignType: GoogleMapDesign.Normal, + cameraPosition: INITIAL_CAMERA, + }); + const rightGoogle2DState = useGoogleMapViewState({ + id: 'camera-sync-right-google-2d', + mapDesignType: GoogleMapDesign.Normal, + cameraPosition: INITIAL_CAMERA, + }); + const leftGoogle3DState = useGoogleMapViewState({ + id: 'camera-sync-left-google-3d', + mapDesignType: GoogleMapDesign.Normal, + cameraPosition: INITIAL_CAMERA, + }); + const rightGoogle3DState = useGoogleMapViewState({ + id: 'camera-sync-right-google-3d', + mapDesignType: GoogleMapDesign.Normal, + cameraPosition: INITIAL_CAMERA, + }); + + const [leftProvider, setLeftProvider] = useState('maplibre'); + const [rightProvider, setRightProvider] = useState('google-maps-3d'); + const [leftCameraPosition, setLeftCameraPosition] = useState(INITIAL_CAMERA); + const [rightCameraPosition, setRightCameraPosition] = useState(INITIAL_CAMERA); + + const leftPaneState = usePaneState(leftProvider, leftMapLibreState, leftGoogle2DState, leftGoogle3DState); + const rightPaneState = usePaneState(rightProvider, rightMapLibreState, rightGoogle2DState, rightGoogle3DState); + + const leftProgrammaticRef = useRef({ key: null, target: null, sinceMs: 0, untilMs: 0 }); + const rightProgrammaticRef = useRef({ key: null, target: null, sinceMs: 0, untilMs: 0 }); + const pairedFlyToRef = useRef({ + active: false, + untilMs: 0, + leftEnded: false, + rightEnded: false, + }); + const lastLeftMoveSyncAtMs = useRef(0); + const lastRightMoveSyncAtMs = useRef(0); + + function programmaticRefFor(pane: PaneId) { + return pane === 'left' ? leftProgrammaticRef : rightProgrammaticRef; + } + + function selectedPaneState(pane: PaneId) { + return pane === 'left' ? leftPaneState : rightPaneState; + } + + function setCameraForPane(pane: PaneId, camera: MapCameraPosition) { + if (pane === 'left') setLeftCameraPosition(camera); + else setRightCameraPosition(camera); + } + + function syncFromPane(source: PaneId, position: MapCameraPosition, fromMove: boolean) { + const now = performance.now(); + + if (pairedFlyToRef.current.active) { + if (now > pairedFlyToRef.current.untilMs) { + clearPairedFlyTo(pairedFlyToRef); + clearProgrammaticMove(leftProgrammaticRef); + clearProgrammaticMove(rightProgrammaticRef); + } else { + setCameraForPane(source, position); + if (!fromMove) { + if (source === 'left') pairedFlyToRef.current.leftEnded = true; + else pairedFlyToRef.current.rightEnded = true; + + if (pairedFlyToRef.current.leftEnded && pairedFlyToRef.current.rightEnded) { + clearPairedFlyTo(pairedFlyToRef); + clearProgrammaticMove(leftProgrammaticRef); + clearProgrammaticMove(rightProgrammaticRef); + } + } + return; + } + } + + const sourceRef = programmaticRefFor(source); + + if (sourceRef.current.key != null) { + if (now > sourceRef.current.untilMs) { + clearProgrammaticMove(sourceRef); + } else { + const age = now - sourceRef.current.sinceMs; + if (age <= PROGRAMMATIC_GRACE_MS || isProgrammaticMove(sourceRef, position, now)) { + setCameraForPane(source, position); + return; + } + clearProgrammaticMove(sourceRef); + } + } + + const lastSyncRef = source === 'left' ? lastLeftMoveSyncAtMs : lastRightMoveSyncAtMs; + if (fromMove && now - lastSyncRef.current < MOVE_SYNC_INTERVAL_MS) return; + lastSyncRef.current = now; + + const target: PaneId = source === 'left' ? 'right' : 'left'; + const targetRef = programmaticRefFor(target); + setCameraForPane(source, position); + setCameraForPane(target, position); + markProgrammaticMove(targetRef, position, now); + selectedPaneState(target).mapState.moveCameraTo(position, 0); + } + + function flyToLocation(location: CameraLocationInfo) { + const now = performance.now(); + const position = createMapCameraPosition({ + position: location.center, + zoom: location.zoom, + bearing: 0, + tilt: 0, + }); + + pairedFlyToRef.current = { + active: true, + untilMs: now + FLY_TO_DURATION_MS + PROGRAMMATIC_TTL_MS, + leftEnded: false, + rightEnded: false, + }; + + leftPaneState.mapState.moveCameraTo(position, FLY_TO_DURATION_MS); + rightPaneState.mapState.moveCameraTo(position, FLY_TO_DURATION_MS); + setLeftCameraPosition(position); + setRightCameraPosition(position); + markProgrammaticMove(leftProgrammaticRef, position, now, FLY_TO_DURATION_MS + PROGRAMMATIC_TTL_MS); + markProgrammaticMove(rightProgrammaticRef, position, now, FLY_TO_DURATION_MS + PROGRAMMATIC_TTL_MS); + } + + return ( +
+
+

Camera Sync

+
+ {locations.map(location => ( + + ))} +
+
+ +
+ syncFromPane('left', position, true)} + onCameraMoveEnd={position => syncFromPane('left', position, false)} + boundsPolylines={boundsPolylines} + referenceRectangles={rectangles} + /> + syncFromPane('right', position, true)} + onCameraMoveEnd={position => syncFromPane('right', position, false)} + boundsPolylines={boundsPolylines} + referenceRectangles={rectangles} + /> +
+
+ ); +} diff --git a/examples/basic/src/pages/map/camerasync/camera-sync-page.css b/examples/basic/src/pages/map/camerasync/camera-sync-page.css new file mode 100644 index 0000000..57b6b37 --- /dev/null +++ b/examples/basic/src/pages/map/camerasync/camera-sync-page.css @@ -0,0 +1,174 @@ +.camera-sync-page { + height: 100%; + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + background: #f7f8fb; +} + +.camera-sync-toolbar { + display: grid; + gap: 10px; + padding: 10px; + border-bottom: 1px solid #d9dde7; + background: #ffffff; + z-index: 20; +} + +.camera-sync-toolbar h2 { + color: #172033; + font-size: 1rem; + font-weight: 700; + line-height: 1.2; +} + +.camera-sync-location-list { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.camera-sync-location-list button { + min-height: 32px; + max-width: 220px; + padding: 0.35rem 0.65rem; + border: 1px solid #cbd5e1; + border-radius: 4px; + background: #f8fafc; + color: #1f2937; + cursor: pointer; + font-size: 0.82rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.camera-sync-location-list button:hover { + background: #e2e8f0; +} + +.camera-sync-grid { + min-height: 0; + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 1px; + background: #94a3b8; +} + +.camera-sync-pane { + position: relative; + min-width: 0; + min-height: 0; + background: #e5e7eb; + overflow: hidden; +} + +.camera-sync-pane > .maplibregl-map, +.camera-sync-pane > div:first-child { + width: 100%; + height: 100%; +} + +.camera-sync-provider { + position: absolute; + top: 10px; + left: 10px; + z-index: 1000; + width: min(72%, 320px); + display: grid; + gap: 4px; + padding: 8px; + border: 1px solid rgba(148, 163, 184, 0.7); + border-radius: 6px; + background: rgba(255, 255, 255, 0.94); + box-shadow: 0 2px 10px rgba(15, 23, 42, 0.18); + color: #1f2937; + font-size: 0.78rem; + font-weight: 700; +} + +.camera-sync-provider select { + min-width: 0; + min-height: 32px; + padding: 0.32rem 0.45rem; + border: 1px solid #cbd5e1; + border-radius: 4px; + background: #ffffff; + color: #1f2937; + font-size: 0.86rem; +} + +.camera-sync-info { + position: absolute; + left: 10px; + bottom: 10px; + z-index: 1000; + min-width: 150px; + display: grid; + gap: 3px; + padding: 9px 10px; + border: 1px solid rgba(148, 163, 184, 0.7); + border-radius: 6px; + background: rgba(255, 255, 255, 0.94); + box-shadow: 0 2px 10px rgba(15, 23, 42, 0.18); + color: #1f2937; + font-size: 0.76rem; + line-height: 1.25; +} + +.camera-sync-info strong { + margin-bottom: 2px; + color: #111827; + font-size: 0.8rem; +} + +.camera-sync-missing-key { + height: 100%; + display: grid; + align-content: center; + justify-items: center; + gap: 8px; + padding: 24px; + text-align: center; + background: #f8fafc; + color: #1f2937; +} + +.camera-sync-missing-key h2 { + font-size: 1rem; +} + +.camera-sync-missing-key p { + max-width: 440px; + color: #475569; + font-size: 0.88rem; + line-height: 1.45; +} + +@media (max-width: 860px), (orientation: portrait) { + .camera-sync-grid { + grid-template-columns: minmax(0, 1fr); + grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); + } + + .camera-sync-toolbar { + max-height: 155px; + overflow-y: auto; + } +} + +@media (max-width: 560px) { + .camera-sync-provider { + width: min(86%, 300px); + } + + .camera-sync-info { + max-width: calc(100% - 20px); + grid-template-columns: repeat(2, minmax(0, auto)); + column-gap: 10px; + } + + .camera-sync-info strong { + grid-column: 1 / -1; + } +} diff --git a/examples/basic/src/pages/map/flyto/FlyToPage.tsx b/examples/basic/src/pages/map/flyto/FlyToPage.tsx index 5a0ff3f..61732f7 100644 --- a/examples/basic/src/pages/map/flyto/FlyToPage.tsx +++ b/examples/basic/src/pages/map/flyto/FlyToPage.tsx @@ -1,13 +1,17 @@ import { useMemo } from 'react'; +import { + createMapCameraPosition, + type MapDesignTypeInterface, + type MapViewStateInterface, +} from '@mapconductor/js-sdk-core'; import { Markers } from '@mapconductor/js-sdk-react'; import { ControlPanel } from '../../../components/ControlPanel'; -import { cityMarker, useCameraActions } from '../../common/sampleHelpers'; +import { cityMarker } from '../../common/sampleHelpers'; import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; const INIT_CAMERA = { lat: 35.0, lng: 0.0, zoom: 3 }; -function FlyToContent() { - const { animateCamera } = useCameraActions(); +function FlyToContent({ mapViewState }: { mapViewState: MapViewStateInterface> }) { const markers = useMemo(() => [ cityMarker('tokyo', 'Tokyo', 35.6812, 139.7671), cityMarker('sapporo', 'Sapporo', 43.0642, 141.3469), @@ -21,7 +25,13 @@ function FlyToContent() {
{markers.map(marker => ( - ))} @@ -35,7 +45,7 @@ export function FlyToPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); return ( - + ); } diff --git a/examples/basic/src/pages/map/tilt/TiltPage.tsx b/examples/basic/src/pages/map/tilt/TiltPage.tsx index 15e59aa..79b4b30 100644 --- a/examples/basic/src/pages/map/tilt/TiltPage.tsx +++ b/examples/basic/src/pages/map/tilt/TiltPage.tsx @@ -1,12 +1,11 @@ import { useState } from 'react'; +import type { MapDesignTypeInterface, MapViewStateInterface } from '@mapconductor/js-sdk-core'; import { ControlPanel, SliderControl } from '../../../components/ControlPanel'; -import { HONOLULU, useCameraActions } from '../../common/sampleHelpers'; import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; const INIT_CAMERA = { lat: 21.3069, lng: -157.8583, zoom: 14 }; -function TiltContent() { - const { animateCamera, getCameraPosition } = useCameraActions(); +function TiltContent({ mapViewState }: { mapViewState: MapViewStateInterface> }) { const [tilt, setTilt] = useState(0); return ( @@ -20,8 +19,7 @@ function TiltContent() { format={value => `${value.toFixed(0)}°`} onChange={value => { setTilt(value); - const camera = getCameraPosition(); - animateCamera(camera?.center ?? HONOLULU, 400, camera?.zoom ?? 14, camera?.bearing ?? 0, value); + mapViewState.moveCameraTo(mapViewState.cameraPosition.copy({ tilt: value }), 400); }} /> @@ -32,7 +30,7 @@ export function TiltPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); return ( - + ); } diff --git a/examples/basic/src/pages/map/visibleregion/VisibleRegionPage.tsx b/examples/basic/src/pages/map/visibleregion/VisibleRegionPage.tsx index d2d1e52..d81924e 100644 --- a/examples/basic/src/pages/map/visibleregion/VisibleRegionPage.tsx +++ b/examples/basic/src/pages/map/visibleregion/VisibleRegionPage.tsx @@ -1,32 +1,61 @@ import { useState } from 'react'; +import type { GeoPoint, MapCameraPosition } from '@mapconductor/js-sdk-core'; import { ControlPanel } from '../../../components/ControlPanel'; -import { useCameraActions } from '../../common/sampleHelpers'; import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; const INIT_CAMERA = { lat: 21.3069, lng: -157.8583, zoom: 10 }; -function VisibleRegionContent() { - const { getBounds } = useCameraActions(); - const [summary, setSummary] = useState('Move the map, then read the visible region.'); +function formatPoint(point: GeoPoint | null): string { + return point?.toUrlValue(5) ?? 'Unavailable'; +} + +function VisibleRegionContent({ cameraPosition }: { cameraPosition: MapCameraPosition | null }) { + const visibleRegion = cameraPosition?.visibleRegion ?? null; + const bounds = visibleRegion?.bounds ?? null; return ( - -

{summary}

+

+ Move the map to update the current camera and visible region. +

+

+ Center: {formatPoint(cameraPosition?.position ?? null)} +

+

+ Zoom: {cameraPosition?.zoom.toFixed(2) ?? 'Unavailable'} +

+

+ Bearing: {cameraPosition?.bearing.toFixed(1) ?? 'Unavailable'} deg +

+

+ Tilt: {cameraPosition?.tilt.toFixed(1) ?? 'Unavailable'} deg +

+

+ Bounds: {bounds?.toUrlValue(5) ?? 'Unavailable'} +

+

+ Near Left: {formatPoint(visibleRegion?.nearLeft ?? null)} +

+

+ Near Right: {formatPoint(visibleRegion?.nearRight ?? null)} +

+

+ Far Left: {formatPoint(visibleRegion?.farLeft ?? null)} +

+

+ Far Right: {formatPoint(visibleRegion?.farRight ?? null)} +

); } export function VisibleRegionPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); + const [cameraPosition, setCameraPosition] = useState(null); + return ( - - + + ); } diff --git a/examples/basic/src/pages/marker/animation/MarkerAnimationPage.tsx b/examples/basic/src/pages/marker/animation/MarkerAnimationPage.tsx index a8fc9e1..828b44e 100644 --- a/examples/basic/src/pages/marker/animation/MarkerAnimationPage.tsx +++ b/examples/basic/src/pages/marker/animation/MarkerAnimationPage.tsx @@ -9,24 +9,35 @@ const INIT_CAMERA = { lat: 21.3825, lng: -157.9330, zoom: 14 }; export function MarkerAnimationPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const [bounce, setBounce] = useState(false); + const [animation, setAnimation] = useState(null); + + const triggerAnimation = (nextAnimation: MarkerAnimation) => { + setAnimation(nextAnimation); + window.setTimeout(() => setAnimation(null), 900); + }; + const marker = useMemo(() => createMarkerState({ id: 'animated-marker', position: HONOLULU, - icon: new ColorDefaultIcon('#e74c3c', { label: bounce ? 'B' : 'M', labelTextColor: '#ffffff' }), - animation: bounce ? MarkerAnimation.Bounce : null, + icon: new ColorDefaultIcon('#e74c3c', { + label: animation === MarkerAnimation.Drop ? 'D' : animation === MarkerAnimation.Bounce ? 'B' : 'M', + labelTextColor: '#ffffff', + }), + animation, onClick: state => { state.animate(MarkerAnimation.Bounce); - setBounce(true); - window.setTimeout(() => setBounce(false), 800); + triggerAnimation(MarkerAnimation.Bounce); }, - }), [bounce]); + }), [animation]); return ( - +
+ + +

Tap the marker or the button to trigger the sample animation state.

diff --git a/examples/basic/src/pages/marker/icons/MarkerIconsPage.tsx b/examples/basic/src/pages/marker/icons/MarkerIconsPage.tsx new file mode 100644 index 0000000..56482cc --- /dev/null +++ b/examples/basic/src/pages/marker/icons/MarkerIconsPage.tsx @@ -0,0 +1,362 @@ +import { useEffect, useMemo, useState } from 'react'; +import { + ColorDefaultIcon, + ImageDefaultIcon, + ImageIcon, + MarkerIconSize, + createGeoPoint, + createMarkerState, + type MarkerIcon, + type MarkerState, +} from '@mapconductor/js-sdk-core'; +import { CircleIcon, FlagIcon, RightTailInfoBubbleIcon, RoundInfoBubbleIcon } from '@mapconductor/react-icons'; +import { InfoBubble, Markers } from '@mapconductor/js-sdk-react'; +import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; + +const INIT_CAMERA = { lat: 0.014, lng: 0.008, zoom: 15 }; + +const WEATHER_ICON_URL = svgDataUrl(` + + + + + + + +`); + +const HUMAN_ICON_URL = svgDataUrl(` + + + + + +`); + +const LAUNCHER_ICON_URL = svgDataUrl(` + + + + + + + +`); + +const DEFAULT_MARKER_ICON_URL = svgDataUrl(` + + + + +`); + +interface MarkerDefinition { + id: string; + lat: number; + lng: number; + icon?: MarkerIcon | null; + extra: string; +} + +export function MarkerIconsPage() { + const mapViewState = useSampleMapViewState(INIT_CAMERA); + const weatherImage = useLoadedImage(WEATHER_ICON_URL); + const humanImage = useLoadedImage(HUMAN_ICON_URL); + const launcherImage = useLoadedImage(LAUNCHER_ICON_URL); + const weatherPngUrl = useRasterizedDataUrl(WEATHER_ICON_URL); + const defaultMarkerPngUrl = useRasterizedDataUrl(DEFAULT_MARKER_ICON_URL); + const labelImage = useLabeledMarkerImage('Label'); + const [selected, setSelected] = useState(null); + + const markerDefinitions = useMemo(() => { + const definitions: MarkerDefinition[] = [ + { + id: 'default-scale-0-7', + lat: 0.018, + lng: 0.004, + icon: new ColorDefaultIcon('#ff0000', { scale: 0.7, label: '0.7', debug: true }), + extra: `DefaultIcon( + scale = 0.7, + label = "0.7", + debug = true, +)`, + }, + { + id: 'default-scale-1-0', + lat: 0.018, + lng: 0.006, + icon: new ColorDefaultIcon('#ff0000', { scale: 1, label: '1.0', debug: true }), + extra: `DefaultIcon( + scale = 1.0, + label = "1.0", + debug = true, +)`, + }, + { + id: 'default-scale-1-4', + lat: 0.018, + lng: 0.009, + icon: new ColorDefaultIcon('#ff0000', { scale: 1.4, label: '1.4', debug: true }), + extra: `DefaultIcon( + scale = 1.4, + label = "1.4", + debug = true, +)`, + }, + { + id: 'default-scale-2-1', + lat: 0.018, + lng: 0.013, + icon: new ColorDefaultIcon('#ff0000', { scale: 2.1, label: '2.1', debug: true }), + extra: `DefaultIcon( + scale = 2.1, + label = "2.1", + debug = true, +)`, + }, + { + id: 'default', + lat: 0.014, + lng: 0.004, + icon: null, + extra: 'DefaultIcon()', + }, + { + id: 'default-yellow', + lat: 0.014, + lng: 0.008, + icon: new ColorDefaultIcon('#ffff00', { strokeColor: '#000000', strokeWidth: 2 }), + extra: `DefaultIcon( + fillColor = Color.Yellow, + strokeColor = Color.Black, + strokeWidth = 2.dp, +)`, + }, + { + id: 'default-labeled', + lat: 0.014, + lng: 0.012, + icon: new ColorDefaultIcon('#2ef527', { + strokeColor: '#fc225c', + label: 'AB', + labelTextColor: '#ffffff', + labelStrokeColor: '#000000', + }), + extra: `DefaultIcon( + fillColor = Color(red = 0x2E, green = 0xF5, blue = 0x27), + strokeColor = Color(red = 0xFC, green = 0x22, blue = 0x5C), + label = "AB", + labelTextColor = Color.White, + labelStrokeColor = Color.Black, +)`, + }, + { + id: 'circle-icon', + lat: 0.006, + lng: 0.004, + icon: new CircleIcon('#0000ff', { strokeColor: '#ffffff', strokeWidth: 2 }), + extra: `CircleIcon( + fillColor = Color.Blue, + strokeColor = Color.White, + strokeWidth = 2.dp, +)`, + }, + { + id: 'flag-icon', + lat: 0.006, + lng: 0.007, + icon: new FlagIcon('#008000', { strokeColor: '#808080', strokeWidth: 1 }), + extra: `FlagIcon( + fillColor = Color.Green, + strokeColor = Color.Gray, + strokeWidth = 1.dp, +)`, + }, + { + id: 'round-info-bubble-icon', + lat: 0.006, + lng: 0.012, + icon: new RoundInfoBubbleIcon(defaultMarkerPngUrl ?? DEFAULT_MARKER_ICON_URL, '$197', { + fillColor: '#ffffff', + scale: 1, + iconSize: MarkerIconSize.Small, + }), + extra: `RoundInfoBubbleIcon( + label = "$197", + fillColor = Color.White, + scale = 1, + iconSize = MarkerIconSize.Small, +)`, + }, + { + id: 'right-tail-info-bubble-icon', + lat: 0, + lng: 0.004, + icon: new RightTailInfoBubbleIcon(weatherPngUrl ?? WEATHER_ICON_URL, '5時間37分', '304マイル', { + fillColor: '#ffffff', + labelTextColor: '#000000', + scale: 0.8, + }), + extra: `RightTailInfoBubbleIcon( + label = "5 Hours and 37 minutes", + snippet = "304 miles.", + fillColor = Color.White, + labelTextColor = Color.Black, + scale = 0.8, +)`, + }, + ]; + + if (humanImage) { + definitions.splice(7, 0, { + id: 'drawable-human', + lat: 0.01, + lng: 0.004, + icon: new ImageDefaultIcon(humanImage), + extra: `DrawableDefaultIcon( + backgroundDrawable = icon, +)`, + }); + } + + if (launcherImage) { + definitions.splice(8, 0, { + id: 'drawable-launcher', + lat: 0.01, + lng: 0.006, + icon: new ImageDefaultIcon(launcherImage, { strokeColor: '#000000', scale: 1.5 }), + extra: `DrawableDefaultIcon( + backgroundDrawable = icon, + strokeColor = Color.Black, + scale = 1.5, +)`, + }); + } + + if (weatherImage) { + definitions.splice(9, 0, { + id: 'image-weather', + lat: 0.01, + lng: 0.009, + icon: new ImageIcon(weatherImage, { debug: true, anchor: { x: 0.5, y: 1 } }), + extra: `ImageIcon( + drawable = icon, + debug = true, + anchor = PointF(0.5, 1.0), +)`, + }); + } + + if (labelImage) { + definitions.splice(10, 0, { + id: 'image-label', + lat: 0.01, + lng: 0.012, + icon: new ImageIcon(labelImage, { anchor: { x: 0.5, y: 1 } }), + extra: `ImageIcon( + drawable = createMarkerWithLabelIcon(label), + anchor = Offset(0.5, 1.0), +)`, + }); + } + + return definitions; + }, [defaultMarkerPngUrl, humanImage, labelImage, launcherImage, weatherImage, weatherPngUrl]); + + const markers = useMemo( + () => + markerDefinitions.map(({ id, lat, lng, icon, extra }) => + createMarkerState({ + id, + position: createGeoPoint({ latitude: lat, longitude: lng }), + icon, + extra, + onClick: setSelected, + }) + ), + [markerDefinitions] + ); + + return ( + setSelected(null)}> + + {typeof selected?.extra === 'string' && ( + +
{selected.extra}
+
+ )} +
+ ); +} + +function useLoadedImage(url: string): HTMLImageElement | null { + const [image, setImage] = useState(null); + + useEffect(() => { + const nextImage = new Image(); + nextImage.onload = () => setImage(nextImage); + nextImage.src = url; + return () => { + nextImage.onload = null; + }; + }, [url]); + + return image; +} + +function useRasterizedDataUrl(url: string): string | null { + const image = useLoadedImage(url); + const [rasterizedUrl, setRasterizedUrl] = useState(null); + + useEffect(() => { + if (!image) return; + const canvas = document.createElement('canvas'); + canvas.width = image.naturalWidth || image.width || 64; + canvas.height = image.naturalHeight || image.height || 64; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + ctx.drawImage(image, 0, 0, canvas.width, canvas.height); + setRasterizedUrl(canvas.toDataURL('image/png')); + }, [image]); + + return rasterizedUrl; +} + +function useLabeledMarkerImage(label: string): HTMLCanvasElement | null { + const [canvas, setCanvas] = useState(null); + + useEffect(() => { + const nextCanvas = document.createElement('canvas'); + nextCanvas.width = 96; + nextCanvas.height = 144; + const ctx = nextCanvas.getContext('2d'); + if (!ctx) return; + + ctx.fillStyle = '#2563eb'; + ctx.strokeStyle = '#ffffff'; + ctx.lineWidth = 5; + ctx.beginPath(); + ctx.moveTo(48, 138); + ctx.bezierCurveTo(41, 112, 18, 91, 18, 56); + ctx.bezierCurveTo(18, 34, 31, 20, 48, 20); + ctx.bezierCurveTo(65, 20, 78, 34, 78, 56); + ctx.bezierCurveTo(78, 91, 55, 112, 48, 138); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + ctx.fillStyle = '#ffffff'; + ctx.font = '700 22px sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(label, 48, 68); + + setCanvas(nextCanvas); + }, [label]); + + return canvas; +} + +function svgDataUrl(svg: string): string { + return `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svg.trim())}`; +} diff --git a/examples/basic/src/pages/marker/postoffice/PostOfficePage.tsx b/examples/basic/src/pages/marker/postoffice/PostOfficePage.tsx index 3f0d8c4..61c12e6 100644 --- a/examples/basic/src/pages/marker/postoffice/PostOfficePage.tsx +++ b/examples/basic/src/pages/marker/postoffice/PostOfficePage.tsx @@ -1,6 +1,7 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { useLocation } from 'react-router-dom'; import { + ImageIcon, MarkerTilingOptions, createGeoPoint, createMapCameraPosition, @@ -22,7 +23,6 @@ interface PostOfficeExtra { } // ─── InfoBubble with zoom-in on click ────────────────────────────────────────── -// Must be rendered inside MapViewContainer so useMapViewController can find the context. function PostOfficeInfoBubble({ extra, marker, @@ -63,9 +63,7 @@ const INIT_CAMERA_POSITION = createMapCameraPosition({ const MARKER_TILING_OPTIONS: MarkerTilingOptions = { ...MarkerTilingOptions.Default, iconScaleCallback: (_state, zoom) => { - if (zoom > 12) return 2.0; - if (zoom > 10) return 1.0; - if (zoom > 8) return 0.8; + if (zoom > 10) return 0.8; if (zoom > 5) return 0.5; return 0.2; }, @@ -79,15 +77,24 @@ function PostOfficePageContent({ const [raw, setRaw] = useState<[number, number, string, string][] | null>(null); const [error, setError] = useState(null); const [selected, setSelected] = useState(null); + const [icon, setIcon] = useState(null); // Load post office data useEffect(() => { - fetch('/postoffice/postoffices.json') + fetch(`${import.meta.env.BASE_URL}postoffice/postoffices.json`) .then((r) => { if (!r.ok) throw new Error(`HTTP ${r.status}`); return r.json() as Promise<[number, number, string, string][]>; }) .then(setRaw) + .then(() => new Promise((resolve, reject) => { + const url = `${import.meta.env.BASE_URL}postoffice/postoffice.webp`; + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = () => reject(new Error(`Failed to load icon: ${url}`)); + img.src = url; + })) + .then((img) => setIcon(new ImageIcon(img))) .catch((err) => setError(String(err))); }, []); @@ -99,12 +106,15 @@ function PostOfficePageContent({ id: `po-${i}`, position: createGeoPoint({ latitude: lat, longitude: lng }), extra: { name, address } satisfies PostOfficeExtra, + icon, onClick: (state) => setSelected(state), }), ), - [raw], + [icon], ); + const clearSelect = useCallback(() => setSelected(null), []) + if (error) { return (
@@ -117,6 +127,7 @@ function PostOfficePageContent({ diff --git a/examples/basic/src/pages/marker/postofficecluster/PostOfficeClusterPage.tsx b/examples/basic/src/pages/marker/postofficecluster/PostOfficeClusterPage.tsx new file mode 100644 index 0000000..bf91ce6 --- /dev/null +++ b/examples/basic/src/pages/marker/postofficecluster/PostOfficeClusterPage.tsx @@ -0,0 +1,255 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useLocation } from 'react-router-dom'; +import { + ImageIcon, + createGeoPoint, + createMapCameraPosition, + createMarkerState, + type MapDesignTypeInterface, + type MapViewStateInterface, + type MarkerState, +} from '@mapconductor/js-sdk-core'; +import { InfoBubble } from '@mapconductor/js-sdk-react'; +import { GoogleMapDesign, useGoogleMapViewState } from '@mapconductor/react-for-googlemaps'; +import { MapLibreDesign, useMapLibreViewState } from '@mapconductor/react-for-maplibre'; +import { + MarkerClusterGroup, + type ClusterIconProvider, + type MarkerCluster, +} from '@mapconductor/react-marker-clustering'; +import { ControlPanel } from '../../../components/ControlPanel'; +import { MapViewContainer } from '../../../MapViewContainer'; + +// ─── Data types ──────────────────────────────────────────────────────────────── +interface PostOfficeExtra { + name: string; + address: string; +} + +// ─── Cluster icon helpers ────────────────────────────────────────────────────── +function clusterCountLabel(count: number): string { + if (count > 1_000) return '1k+'; + if (count > 200) return '200+'; + if (count > 100) return '100+'; + return String(count); +} + +function drawClusterCanvas(background: HTMLImageElement, label: string): HTMLCanvasElement { + const canvas = document.createElement('canvas'); + canvas.width = background.naturalWidth; + canvas.height = background.naturalHeight; + const ctx = canvas.getContext('2d')!; + ctx.drawImage(background, 0, 0); + // The bubble occupies roughly the top 38% of the image; its center is at ~20%. + const bubbleCenterY = Math.floor(background.naturalHeight * 0.22); + const fontSize = Math.floor(background.naturalHeight * 0.35); + ctx.font = `bold ${fontSize}px sans-serif`; + ctx.fillStyle = 'white'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText(label, background.naturalWidth / 2, bubbleCenterY); + return canvas; +} + +function buildClusterIconProvider(background: HTMLImageElement): ClusterIconProvider { + const cache = new Map(); + return (count: number) => { + const label = clusterCountLabel(count); + const hit = cache.get(label); + if (hit) return hit; + const canvas = drawClusterCanvas(background, label); + const icon = new ImageIcon(canvas, { anchor: { x: 0.5, y: 0.5 } }); + cache.set(label, icon); + return icon; + }; +} + +// ─── InfoBubble ──────────────────────────────────────────────────────────────── +function PostOfficeInfoBubble({ + extra, + marker, + mapViewState, +}: { + extra: PostOfficeExtra; + marker: MarkerState; + mapViewState: MapViewStateInterface>; +}) { + const handleClick = () => { + mapViewState.moveCameraTo( + createMapCameraPosition({ position: marker.position, zoom: 18, tilt: 30 }), + 2000, + ); + }; + return ( + +
+ {extra.name} + {extra.address} +
+
+ ); +} + +// ─── Constants ───────────────────────────────────────────────────────────────── +const INIT_CAMERA_POSITION = createMapCameraPosition({ + position: createGeoPoint({ latitude: 35.68049, longitude: 139.76669 }), + zoom: 10, +}); + +// ─── Page content ────────────────────────────────────────────────────────────── +function PostOfficeClusterPageContent({ + mapViewState, +}: { + mapViewState: MapViewStateInterface>; +}) { + const [raw, setRaw] = useState<[number, number, string, string][] | null>(null); + const [error, setError] = useState(null); + const [selected, setSelected] = useState(null); + const [markerIcon, setMarkerIcon] = useState(null); + const [clusterIconProvider, setClusterIconProvider] = useState(null); + const [debugHullPolygons, setDebugHullPolygons] = useState(false); + + // Load post office data and icons in parallel. + useEffect(() => { + Promise.all([ + fetch(`${import.meta.env.BASE_URL}postoffice/postoffices.json`) + .then(r => { if (!r.ok) throw new Error(`HTTP ${r.status}`); return r.json() as Promise<[number, number, string, string][]>; }), + loadImage(`${import.meta.env.BASE_URL}postoffice/postoffice.webp`), + loadImage(`${import.meta.env.BASE_URL}postoffice/cluster_red.png`), + ]) + .then(([data, markerImg, clusterImg]) => { + setRaw(data); + // scale 0.5 matches the Android example (24dp on screen). + setMarkerIcon(new ImageIcon(markerImg, { scale: 0.5 })); + setClusterIconProvider(() => buildClusterIconProvider(clusterImg)); + }) + .catch(err => setError(String(err))); + }, []); + + const markerStates = useMemo( + () => + (raw ?? []).map(([lat, lng, name, address], i) => + createMarkerState({ + id: `po-${i}`, + position: createGeoPoint({ latitude: lat, longitude: lng }), + extra: { name, address } satisfies PostOfficeExtra, + icon: markerIcon, + onClick: (state) => setSelected(state), + }), + ), + [markerIcon], + ); + + // Fast O(1) lookup for cluster-click zoom. + const markerMapRef = useRef>(new Map()); + useEffect(() => { + markerMapRef.current = new Map(markerStates.map(s => [s.id, s])); + }, [markerStates]); + + const handleClusterClick = useCallback((cluster: MarkerCluster) => { + const map = markerMapRef.current; + let lat = 0, lon = 0, count = 0; + for (const id of cluster.markerIds) { + const s = map.get(id); + if (!s) continue; + lat += s.position.latitude; + lon += s.position.longitude; + count++; + } + if (count === 0) return; + const camera = mapViewState.cameraPosition; + mapViewState.moveCameraTo( + createMapCameraPosition({ + position: createGeoPoint({ latitude: lat / count, longitude: lon / count }), + zoom: Math.min((camera?.zoom ?? 10) + 2, 18), + }), + 600, + ); + }, [mapViewState]); + + const clearSelect = useCallback(() => setSelected(null), []); + + if (error) { + return ( +
+

データの読み込みに失敗しました: {error}

+
+ ); + } + + return ( + + + + {selected && !(selected.extra as unknown as MarkerCluster)?.markerIds && ( + + )} + + + + {!raw ? ( +

データ読み込み中...

+ ) : ( +

+ クラスターをクリックするとズームインします。
+ 個別マーカーをクリックすると郵便局情報が表示されます。 +

+ )} +
+
+ ); +} + +function loadImage(url: string): Promise { + return new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => resolve(img); + img.onerror = () => reject(new Error(`Failed to load image: ${url}`)); + img.src = url; + }); +} + +// ─── Provider-specific wrappers ──────────────────────────────────────────────── +function GooglePostOfficeClusterPage() { + const mapViewState = useGoogleMapViewState({ + mapDesignType: GoogleMapDesign.Normal, + cameraPosition: INIT_CAMERA_POSITION, + }); + return ; +} + +function MapLibrePostOfficeClusterPage() { + const mapViewState = useMapLibreViewState({ + mapDesignType: MapLibreDesign.OsmBrightJa, + cameraPosition: INIT_CAMERA_POSITION, + }); + return ; +} + +// ─── Page export ─────────────────────────────────────────────────────────────── +export function PostOfficeClusterPage() { + const location = useLocation(); + return location.pathname.startsWith('/google-maps') + ? + : ; +} diff --git a/examples/basic/src/pages/polygon/click/California.ts b/examples/basic/src/pages/polygon/click/California.ts new file mode 100644 index 0000000..f45f842 --- /dev/null +++ b/examples/basic/src/pages/polygon/click/California.ts @@ -0,0 +1,773 @@ +import { GeoPoint } from '@mapconductor/js-sdk-core'; + + +export const california: GeoPoint[][] = + [ + [ + GeoPoint.fromLatLong(37.77205, -123.00111), + GeoPoint.fromLatLong(37.77078, -122.99754), + GeoPoint.fromLatLong(37.76913, -122.99509), + GeoPoint.fromLatLong(37.76387, -122.98741), + GeoPoint.fromLatLong(37.75892, -122.98143), + GeoPoint.fromLatLong(37.75498, -122.9776), + GeoPoint.fromLatLong(37.75258, -122.97545), + GeoPoint.fromLatLong(37.74993, -122.97406), + GeoPoint.fromLatLong(37.74865, -122.97326), + GeoPoint.fromLatLong(37.74782, -122.97045), + GeoPoint.fromLatLong(37.7463, -122.96727), + GeoPoint.fromLatLong(37.74428, -122.9641), + GeoPoint.fromLatLong(37.74195, -122.96106), + GeoPoint.fromLatLong(37.73973, -122.95839), + GeoPoint.fromLatLong(37.73683, -122.95464), + GeoPoint.fromLatLong(37.73219, -122.94998), + GeoPoint.fromLatLong(37.72531, -122.94552), + GeoPoint.fromLatLong(37.72106, -122.94229), + GeoPoint.fromLatLong(37.71535, -122.93971), + GeoPoint.fromLatLong(37.70996, -122.93792), + GeoPoint.fromLatLong(37.70924, -122.93768), + GeoPoint.fromLatLong(37.70246, -122.93586), + GeoPoint.fromLatLong(37.69762, -122.93571), + GeoPoint.fromLatLong(37.69093, -122.93734), + GeoPoint.fromLatLong(37.68654, -122.93903), + GeoPoint.fromLatLong(37.68235, -122.93966), + GeoPoint.fromLatLong(37.67658, -122.94136), + GeoPoint.fromLatLong(37.66977, -122.94501), + GeoPoint.fromLatLong(37.66338, -122.94907), + GeoPoint.fromLatLong(37.65835, -122.95488), + GeoPoint.fromLatLong(37.65198, -122.96301), + GeoPoint.fromLatLong(37.64658, -122.97301), + GeoPoint.fromLatLong(37.6439, -122.98051), + GeoPoint.fromLatLong(37.64178, -122.98675), + GeoPoint.fromLatLong(37.64102, -122.99259), + GeoPoint.fromLatLong(37.63993, -123.00091), + GeoPoint.fromLatLong(37.63983, -123.00111), + GeoPoint.fromLatLong(37.64177, -123.00111), + GeoPoint.fromLatLong(37.64151, -123.0116), + GeoPoint.fromLatLong(37.64522, -123.02715), + GeoPoint.fromLatLong(37.65033, -123.0407), + GeoPoint.fromLatLong(37.65865, -123.05358), + GeoPoint.fromLatLong(37.66732, -123.06358), + GeoPoint.fromLatLong(37.67304, -123.06859), + GeoPoint.fromLatLong(37.68258, -123.07306), + GeoPoint.fromLatLong(37.69007, -123.07492), + GeoPoint.fromLatLong(37.69232, -123.07715), + GeoPoint.fromLatLong(37.69684, -123.08188), + GeoPoint.fromLatLong(37.70075, -123.08606), + GeoPoint.fromLatLong(37.70579, -123.08878), + GeoPoint.fromLatLong(37.71187, -123.0918), + GeoPoint.fromLatLong(37.71369, -123.09285), + GeoPoint.fromLatLong(37.71407, -123.0948), + GeoPoint.fromLatLong(37.71359, -123.09965), + GeoPoint.fromLatLong(37.71265, -123.10492), + GeoPoint.fromLatLong(37.71405, -123.11557), + GeoPoint.fromLatLong(37.71544, -123.11964), + GeoPoint.fromLatLong(37.71673, -123.12611), + GeoPoint.fromLatLong(37.71939, -123.1326), + GeoPoint.fromLatLong(37.72616, -123.14149), + GeoPoint.fromLatLong(37.73228, -123.14913), + GeoPoint.fromLatLong(37.73784, -123.15676), + GeoPoint.fromLatLong(37.74353, -123.16275), + GeoPoint.fromLatLong(37.74993, -123.1667), + GeoPoint.fromLatLong(37.75593, -123.16998), + GeoPoint.fromLatLong(37.7636, -123.17293), + GeoPoint.fromLatLong(37.77183, -123.17376), + GeoPoint.fromLatLong(37.77573, -123.17382), + GeoPoint.fromLatLong(37.77611, -123.17371), + GeoPoint.fromLatLong(37.79236, -123.16911), + GeoPoint.fromLatLong(37.79688, -123.16601), + GeoPoint.fromLatLong(37.802, -123.16094), + GeoPoint.fromLatLong(37.80707, -123.15386), + GeoPoint.fromLatLong(37.80744, -123.15333), + GeoPoint.fromLatLong(37.81195, -123.14721), + GeoPoint.fromLatLong(37.81672, -123.13944), + GeoPoint.fromLatLong(37.81968, -123.13227), + GeoPoint.fromLatLong(37.82166, -123.12611), + GeoPoint.fromLatLong(37.82306, -123.11829), + GeoPoint.fromLatLong(37.82254, -123.10826), + GeoPoint.fromLatLong(37.82188, -123.09526), + GeoPoint.fromLatLong(37.81815, -123.08165), + GeoPoint.fromLatLong(37.81383, -123.07049), + GeoPoint.fromLatLong(37.79982, -123.04882), + GeoPoint.fromLatLong(37.78888, -123.03873), + GeoPoint.fromLatLong(37.78043, -123.0351), + GeoPoint.fromLatLong(37.77837, -123.03384), + GeoPoint.fromLatLong(37.77715, -123.03144), + GeoPoint.fromLatLong(37.77709, -123.02585), + GeoPoint.fromLatLong(37.77607, -123.01697), + GeoPoint.fromLatLong(37.77493, -123.01059), + GeoPoint.fromLatLong(37.77352, -123.00615), + ], + [ + GeoPoint.fromLatLong(33.53589, -119.00093), + GeoPoint.fromLatLong(33.53582, -119.00093), + GeoPoint.fromLatLong(33.5342, -118.99784), + GeoPoint.fromLatLong(33.53271, -118.99445), + GeoPoint.fromLatLong(33.53185, -118.9928), + GeoPoint.fromLatLong(33.53029, -118.99005), + GeoPoint.fromLatLong(33.52743, -118.9862), + GeoPoint.fromLatLong(33.52426, -118.98215), + GeoPoint.fromLatLong(33.52065, -118.9791), + GeoPoint.fromLatLong(33.51768, -118.97654), + GeoPoint.fromLatLong(33.51384, -118.97289), + GeoPoint.fromLatLong(33.51066, -118.97101), + GeoPoint.fromLatLong(33.50556, -118.96831), + GeoPoint.fromLatLong(33.50002, -118.96602), + GeoPoint.fromLatLong(33.4953, -118.9649), + GeoPoint.fromLatLong(33.48521, -118.96276), + GeoPoint.fromLatLong(33.4733, -118.96273), + GeoPoint.fromLatLong(33.46683, -118.96375), + GeoPoint.fromLatLong(33.45792, -118.96676), + GeoPoint.fromLatLong(33.45289, -118.96983), + GeoPoint.fromLatLong(33.44317, -118.97268), + GeoPoint.fromLatLong(33.43111, -118.97848), + GeoPoint.fromLatLong(33.42859, -118.98051), + GeoPoint.fromLatLong(33.42344, -118.98873), + GeoPoint.fromLatLong(33.41996, -118.99598), + GeoPoint.fromLatLong(33.41849, -119.00093), + GeoPoint.fromLatLong(33.4213, -119.00093), + GeoPoint.fromLatLong(33.41677, -119.00952), + GeoPoint.fromLatLong(33.41505, -119.018), + GeoPoint.fromLatLong(33.41287, -119.02704), + GeoPoint.fromLatLong(33.41222, -119.03963), + GeoPoint.fromLatLong(33.41102, -119.05307), + GeoPoint.fromLatLong(33.41255, -119.06412), + GeoPoint.fromLatLong(33.4138, -119.07189), + GeoPoint.fromLatLong(33.41677, -119.07851), + GeoPoint.fromLatLong(33.42139, -119.08651), + GeoPoint.fromLatLong(33.42687, -119.09413), + GeoPoint.fromLatLong(33.43524, -119.10076), + GeoPoint.fromLatLong(33.44044, -119.10378), + GeoPoint.fromLatLong(33.44501, -119.10615), + GeoPoint.fromLatLong(33.45115, -119.10888), + GeoPoint.fromLatLong(33.45632, -119.1088), + GeoPoint.fromLatLong(33.46229, -119.10965), + GeoPoint.fromLatLong(33.46894, -119.10908), + GeoPoint.fromLatLong(33.47428, -119.10957), + GeoPoint.fromLatLong(33.48007, -119.1092), + GeoPoint.fromLatLong(33.48578, -119.10836), + GeoPoint.fromLatLong(33.49119, -119.10791), + GeoPoint.fromLatLong(33.49542, -119.10747), + GeoPoint.fromLatLong(33.49518, -119.10794), + GeoPoint.fromLatLong(33.50002, -119.10721), + GeoPoint.fromLatLong(33.50002, -119.11895), + GeoPoint.fromLatLong(33.5056, -119.11717), + GeoPoint.fromLatLong(33.50986, -119.11508), + GeoPoint.fromLatLong(33.51547, -119.11166), + GeoPoint.fromLatLong(33.51926, -119.10872), + GeoPoint.fromLatLong(33.52289, -119.10421), + GeoPoint.fromLatLong(33.52644, -119.0987), + GeoPoint.fromLatLong(33.5303, -119.09049), + GeoPoint.fromLatLong(33.53291, -119.08374), + GeoPoint.fromLatLong(33.53515, -119.0765), + GeoPoint.fromLatLong(33.53642, -119.07014), + GeoPoint.fromLatLong(33.53671, -119.06616), + GeoPoint.fromLatLong(33.53643, -119.06041), + GeoPoint.fromLatLong(33.53603, -119.05655), + GeoPoint.fromLatLong(33.53676, -119.05394), + GeoPoint.fromLatLong(33.53716, -119.0508), + GeoPoint.fromLatLong(33.53729, -119.04847), + GeoPoint.fromLatLong(33.53722, -119.04706), + GeoPoint.fromLatLong(33.53862, -119.04139), + GeoPoint.fromLatLong(33.53962, -119.03625), + GeoPoint.fromLatLong(33.54012, -119.03074), + GeoPoint.fromLatLong(33.54, -119.02394), + GeoPoint.fromLatLong(33.53919, -119.01735), + GeoPoint.fromLatLong(33.53834, -119.01213), + GeoPoint.fromLatLong(33.53755, -119.00807), + ], + [ + GeoPoint.fromLatLong(32.87504, -118.3289), + GeoPoint.fromLatLong(32.87173, -118.32571), + GeoPoint.fromLatLong(32.86377, -118.31739), + GeoPoint.fromLatLong(32.85347, -118.30489), + GeoPoint.fromLatLong(32.83639, -118.2924), + GeoPoint.fromLatLong(32.82083, -118.28878), + GeoPoint.fromLatLong(32.81053, -118.2899), + GeoPoint.fromLatLong(32.79826, -118.29584), + GeoPoint.fromLatLong(32.78885, -118.30285), + GeoPoint.fromLatLong(32.7768, -118.31853), + GeoPoint.fromLatLong(32.77057, -118.33197), + GeoPoint.fromLatLong(32.76581, -118.35349), + GeoPoint.fromLatLong(32.76708, -118.36427), + GeoPoint.fromLatLong(32.76885, -118.37386), + GeoPoint.fromLatLong(32.77023, -118.37838), + GeoPoint.fromLatLong(32.76808, -118.3812), + GeoPoint.fromLatLong(32.76356, -118.38535), + GeoPoint.fromLatLong(32.7585, -118.39256), + GeoPoint.fromLatLong(32.75523, -118.39952), + GeoPoint.fromLatLong(32.75191, -118.40832), + GeoPoint.fromLatLong(32.75059, -118.4162), + GeoPoint.fromLatLong(32.75004, -118.43654), + GeoPoint.fromLatLong(32.75103, -118.44091), + GeoPoint.fromLatLong(32.75511, -118.45381), + GeoPoint.fromLatLong(32.76018, -118.46471), + GeoPoint.fromLatLong(32.76682, -118.47391), + GeoPoint.fromLatLong(32.77472, -118.48167), + GeoPoint.fromLatLong(32.77916, -118.48497), + GeoPoint.fromLatLong(32.7855, -118.49421), + GeoPoint.fromLatLong(32.79203, -118.50091), + GeoPoint.fromLatLong(32.79688, -118.50765), + GeoPoint.fromLatLong(32.79957, -118.51581), + GeoPoint.fromLatLong(32.80472, -118.52481), + GeoPoint.fromLatLong(32.80877, -118.53178), + GeoPoint.fromLatLong(32.81277, -118.5382), + GeoPoint.fromLatLong(32.82068, -118.54673), + GeoPoint.fromLatLong(32.8288, -118.55319), + GeoPoint.fromLatLong(32.83735, -118.55714), + GeoPoint.fromLatLong(32.84944, -118.56253), + GeoPoint.fromLatLong(32.85456, -118.56735), + GeoPoint.fromLatLong(32.86573, -118.57505), + GeoPoint.fromLatLong(32.87152, -118.58132), + GeoPoint.fromLatLong(32.87884, -118.58794), + GeoPoint.fromLatLong(32.88383, -118.59114), + GeoPoint.fromLatLong(32.89047, -118.59693), + GeoPoint.fromLatLong(32.90356, -118.60352), + GeoPoint.fromLatLong(32.90661, -118.60433), + GeoPoint.fromLatLong(32.91243, -118.60552), + GeoPoint.fromLatLong(32.9182, -118.60547), + GeoPoint.fromLatLong(32.92612, -118.60817), + GeoPoint.fromLatLong(32.92931, -118.61079), + GeoPoint.fromLatLong(32.93685, -118.6186), + GeoPoint.fromLatLong(32.94723, -118.62592), + GeoPoint.fromLatLong(32.95363, -118.62957), + GeoPoint.fromLatLong(32.96221, -118.63387), + GeoPoint.fromLatLong(32.96909, -118.63649), + GeoPoint.fromLatLong(32.97536, -118.63771), + GeoPoint.fromLatLong(32.98261, -118.64049), + GeoPoint.fromLatLong(32.99284, -118.64343), + GeoPoint.fromLatLong(32.99777, -118.64433), + GeoPoint.fromLatLong(33.00003, -118.67017), + GeoPoint.fromLatLong(33.01214, -118.67484), + GeoPoint.fromLatLong(33.02636, -118.67855), + GeoPoint.fromLatLong(33.04935, -118.6756), + GeoPoint.fromLatLong(33.06685, -118.66385), + GeoPoint.fromLatLong(33.08188, -118.6413), + GeoPoint.fromLatLong(33.08566, -118.62592), + GeoPoint.fromLatLong(33.08632, -118.60834), + GeoPoint.fromLatLong(33.08711, -118.58953), + GeoPoint.fromLatLong(33.08222, -118.56492), + GeoPoint.fromLatLong(33.07863, -118.55263), + GeoPoint.fromLatLong(33.06786, -118.53419), + GeoPoint.fromLatLong(33.04989, -118.51497), + GeoPoint.fromLatLong(33.03788, -118.50766), + GeoPoint.fromLatLong(33.03059, -118.50091), + GeoPoint.fromLatLong(33.01792, -118.49113), + GeoPoint.fromLatLong(33.00818, -118.48714), + GeoPoint.fromLatLong(33.00462, -118.48475), + GeoPoint.fromLatLong(33.00003, -118.48141), + GeoPoint.fromLatLong(32.99578, -118.47779), + GeoPoint.fromLatLong(32.98912, -118.47119), + GeoPoint.fromLatLong(32.97525, -118.46018), + GeoPoint.fromLatLong(32.96797, -118.45454), + GeoPoint.fromLatLong(32.96175, -118.44886), + GeoPoint.fromLatLong(32.95795, -118.44215), + GeoPoint.fromLatLong(32.94958, -118.42769), + GeoPoint.fromLatLong(32.94211, -118.41874), + GeoPoint.fromLatLong(32.93647, -118.41127), + GeoPoint.fromLatLong(32.93179, -118.40604), + GeoPoint.fromLatLong(32.91784, -118.39079), + GeoPoint.fromLatLong(32.91508, -118.38644), + GeoPoint.fromLatLong(32.91185, -118.38157), + GeoPoint.fromLatLong(32.9096, -118.37762), + GeoPoint.fromLatLong(32.90869, -118.37591), + GeoPoint.fromLatLong(32.90507, -118.36992), + GeoPoint.fromLatLong(32.90012, -118.36252), + GeoPoint.fromLatLong(32.8945, -118.35639), + GeoPoint.fromLatLong(32.88968, -118.35031), + GeoPoint.fromLatLong(32.88443, -118.34358), + GeoPoint.fromLatLong(32.87975, -118.33746), + GeoPoint.fromLatLong(32.87678, -118.33197), + ], + [ + GeoPoint.fromLatLong(33.41669, -118.30868), + GeoPoint.fromLatLong(33.40972, -118.30713), + GeoPoint.fromLatLong(33.40363, -118.3041), + GeoPoint.fromLatLong(33.38984, -118.28581), + GeoPoint.fromLatLong(33.38074, -118.27721), + GeoPoint.fromLatLong(33.37502, -118.26818), + GeoPoint.fromLatLong(33.36413, -118.25771), + GeoPoint.fromLatLong(33.3534, -118.25138), + GeoPoint.fromLatLong(33.33834, -118.2451), + GeoPoint.fromLatLong(33.31303, -118.24105), + GeoPoint.fromLatLong(33.29106, -118.24594), + GeoPoint.fromLatLong(33.28047, -118.2509), + GeoPoint.fromLatLong(33.2725, -118.25918), + GeoPoint.fromLatLong(33.25909, -118.2807), + GeoPoint.fromLatLong(33.25101, -118.30284), + GeoPoint.fromLatLong(33.25003, -118.30872), + GeoPoint.fromLatLong(33.24847, -118.31862), + GeoPoint.fromLatLong(33.24861, -118.33475), + GeoPoint.fromLatLong(33.25003, -118.34377), + GeoPoint.fromLatLong(33.25507, -118.36331), + GeoPoint.fromLatLong(33.2623, -118.38149), + GeoPoint.fromLatLong(33.2652, -118.38913), + GeoPoint.fromLatLong(33.26794, -118.40256), + GeoPoint.fromLatLong(33.26596, -118.42752), + GeoPoint.fromLatLong(33.26746, -118.44046), + GeoPoint.fromLatLong(33.27289, -118.47146), + GeoPoint.fromLatLong(33.28407, -118.50091), + GeoPoint.fromLatLong(33.28966, -118.51039), + GeoPoint.fromLatLong(33.31518, -118.53488), + GeoPoint.fromLatLong(33.33105, -118.54252), + GeoPoint.fromLatLong(33.35065, -118.54961), + GeoPoint.fromLatLong(33.36935, -118.55119), + GeoPoint.fromLatLong(33.37503, -118.54858), + GeoPoint.fromLatLong(33.38023, -118.55338), + GeoPoint.fromLatLong(33.38103, -118.56363), + GeoPoint.fromLatLong(33.39087, -118.59108), + GeoPoint.fromLatLong(33.40619, -118.61857), + GeoPoint.fromLatLong(33.41507, -118.62592), + GeoPoint.fromLatLong(33.42868, -118.63694), + GeoPoint.fromLatLong(33.44531, -118.65506), + GeoPoint.fromLatLong(33.46733, -118.66592), + GeoPoint.fromLatLong(33.48594, -118.6682), + GeoPoint.fromLatLong(33.50003, -118.66371), + GeoPoint.fromLatLong(33.50576, -118.65992), + GeoPoint.fromLatLong(33.51082, -118.65573), + GeoPoint.fromLatLong(33.51821, -118.64786), + GeoPoint.fromLatLong(33.52403, -118.6384), + GeoPoint.fromLatLong(33.52898, -118.62592), + GeoPoint.fromLatLong(33.53185, -118.61216), + GeoPoint.fromLatLong(33.53232, -118.59976), + GeoPoint.fromLatLong(33.53198, -118.58972), + GeoPoint.fromLatLong(33.53088, -118.58582), + GeoPoint.fromLatLong(33.52841, -118.57914), + GeoPoint.fromLatLong(33.52926, -118.57529), + GeoPoint.fromLatLong(33.52947, -118.57152), + GeoPoint.fromLatLong(33.52948, -118.56719), + GeoPoint.fromLatLong(33.52929, -118.56317), + GeoPoint.fromLatLong(33.52833, -118.55775), + GeoPoint.fromLatLong(33.52921, -118.55502), + GeoPoint.fromLatLong(33.53019, -118.55093), + GeoPoint.fromLatLong(33.53084, -118.5466), + GeoPoint.fromLatLong(33.53126, -118.53894), + GeoPoint.fromLatLong(33.53144, -118.53364), + GeoPoint.fromLatLong(33.53118, -118.52938), + GeoPoint.fromLatLong(33.53015, -118.52324), + GeoPoint.fromLatLong(33.52869, -118.51765), + GeoPoint.fromLatLong(33.52692, -118.51238), + GeoPoint.fromLatLong(33.52491, -118.50676), + GeoPoint.fromLatLong(33.52267, -118.50261), + GeoPoint.fromLatLong(33.52163, -118.50091), + GeoPoint.fromLatLong(33.51838, -118.49671), + GeoPoint.fromLatLong(33.51573, -118.49333), + GeoPoint.fromLatLong(33.51615, -118.48788), + GeoPoint.fromLatLong(33.51606, -118.48262), + GeoPoint.fromLatLong(33.51543, -118.47728), + GeoPoint.fromLatLong(33.513, -118.46896), + GeoPoint.fromLatLong(33.51043, -118.46285), + GeoPoint.fromLatLong(33.50688, -118.45682), + GeoPoint.fromLatLong(33.50339, -118.4522), + GeoPoint.fromLatLong(33.50003, -118.44755), + GeoPoint.fromLatLong(33.48944, -118.43683), + GeoPoint.fromLatLong(33.48894, -118.43243), + GeoPoint.fromLatLong(33.48716, -118.42709), + GeoPoint.fromLatLong(33.48387, -118.42287), + GeoPoint.fromLatLong(33.48178, -118.42084), + GeoPoint.fromLatLong(33.48078, -118.41187), + GeoPoint.fromLatLong(33.47927, -118.40323), + GeoPoint.fromLatLong(33.47671, -118.39513), + GeoPoint.fromLatLong(33.47449, -118.38939), + GeoPoint.fromLatLong(33.47345, -118.38605), + GeoPoint.fromLatLong(33.47157, -118.37798), + GeoPoint.fromLatLong(33.4711, -118.37591), + GeoPoint.fromLatLong(33.469, -118.36922), + GeoPoint.fromLatLong(33.46492, -118.35939), + GeoPoint.fromLatLong(33.45938, -118.35255), + GeoPoint.fromLatLong(33.45782, -118.35092), + GeoPoint.fromLatLong(33.45388, -118.34206), + GeoPoint.fromLatLong(33.44804, -118.33277), + GeoPoint.fromLatLong(33.44198, -118.32465), + GeoPoint.fromLatLong(33.43414, -118.31635), + GeoPoint.fromLatLong(33.42514, -118.31095), + ], + [ + GeoPoint.fromLatLong(34.06867, -119.37595), + GeoPoint.fromLatLong(34.06506, -119.33093), + GeoPoint.fromLatLong(34.03658, -119.29764), + GeoPoint.fromLatLong(34.00001, -119.29647), + GeoPoint.fromLatLong(33.98654, -119.30409), + GeoPoint.fromLatLong(33.96543, -119.34154), + GeoPoint.fromLatLong(33.95636, -119.36976), + GeoPoint.fromLatLong(33.95332, -119.38467), + GeoPoint.fromLatLong(33.95378, -119.40293), + GeoPoint.fromLatLong(33.95591, -119.43296), + GeoPoint.fromLatLong(33.97065, -119.47265), + GeoPoint.fromLatLong(33.97634, -119.49695), + GeoPoint.fromLatLong(33.95492, -119.52331), + GeoPoint.fromLatLong(33.94496, -119.56329), + GeoPoint.fromLatLong(33.93808, -119.59594), + GeoPoint.fromLatLong(33.93588, -119.61853), + GeoPoint.fromLatLong(33.93626, -119.64054), + GeoPoint.fromLatLong(33.9264, -119.66396), + GeoPoint.fromLatLong(33.91844, -119.68239), + GeoPoint.fromLatLong(33.90963, -119.71883), + GeoPoint.fromLatLong(33.9114, -119.75096), + GeoPoint.fromLatLong(33.91061, -119.77831), + GeoPoint.fromLatLong(33.90132, -119.81022), + GeoPoint.fromLatLong(33.90749, -119.85522), + GeoPoint.fromLatLong(33.92265, -119.87823), + GeoPoint.fromLatLong(33.93967, -119.90476), + GeoPoint.fromLatLong(33.9239, -119.91102), + GeoPoint.fromLatLong(33.89438, -119.95029), + GeoPoint.fromLatLong(33.88525, -120.00096), + GeoPoint.fromLatLong(33.875, -120.01553), + GeoPoint.fromLatLong(33.86432, -120.04253), + GeoPoint.fromLatLong(33.85051, -120.08011), + GeoPoint.fromLatLong(33.84235, -120.12596), + GeoPoint.fromLatLong(33.85343, -120.15708), + GeoPoint.fromLatLong(33.86629, -120.183), + GeoPoint.fromLatLong(33.87598, -120.20238), + GeoPoint.fromLatLong(33.89233, -120.22963), + GeoPoint.fromLatLong(33.90844, -120.25097), + GeoPoint.fromLatLong(33.94336, -120.2777), + GeoPoint.fromLatLong(33.96224, -120.29187), + GeoPoint.fromLatLong(33.96637, -120.31739), + GeoPoint.fromLatLong(33.96139, -120.35863), + GeoPoint.fromLatLong(33.96743, -120.39564), + GeoPoint.fromLatLong(33.97495, -120.42259), + GeoPoint.fromLatLong(33.97627, -120.45579), + GeoPoint.fromLatLong(33.98428, -120.48815), + GeoPoint.fromLatLong(33.99735, -120.50308), + GeoPoint.fromLatLong(34.02282, -120.52314), + GeoPoint.fromLatLong(34.05169, -120.53106), + GeoPoint.fromLatLong(34.06864, -120.56699), + GeoPoint.fromLatLong(34.09856, -120.5819), + GeoPoint.fromLatLong(34.12647, -120.57509), + GeoPoint.fromLatLong(34.14642, -120.5487), + GeoPoint.fromLatLong(34.15134, -120.50717), + GeoPoint.fromLatLong(34.14508, -120.48691), + GeoPoint.fromLatLong(34.13929, -120.46529), + GeoPoint.fromLatLong(34.15748, -120.43272), + GeoPoint.fromLatLong(34.15873, -120.40117), + GeoPoint.fromLatLong(34.15242, -120.37598), + GeoPoint.fromLatLong(34.14145, -120.35049), + GeoPoint.fromLatLong(34.12328, -120.33918), + GeoPoint.fromLatLong(34.1138, -120.32434), + GeoPoint.fromLatLong(34.10412, -120.29779), + GeoPoint.fromLatLong(34.0818, -120.27428), + GeoPoint.fromLatLong(34.06508, -120.26241), + GeoPoint.fromLatLong(34.05803, -120.25285), + GeoPoint.fromLatLong(34.06114, -120.231), + GeoPoint.fromLatLong(34.06022, -120.20611), + GeoPoint.fromLatLong(34.06136, -120.1911), + GeoPoint.fromLatLong(34.0757, -120.15901), + GeoPoint.fromLatLong(34.07881, -120.13501), + GeoPoint.fromLatLong(34.07805, -120.11496), + GeoPoint.fromLatLong(34.07449, -120.10292), + GeoPoint.fromLatLong(34.0864, -120.08028), + GeoPoint.fromLatLong(34.09061, -120.04515), + GeoPoint.fromLatLong(34.08404, -120.01021), + GeoPoint.fromLatLong(34.06487, -119.99164), + GeoPoint.fromLatLong(34.09674, -119.97439), + GeoPoint.fromLatLong(34.11256, -119.96547), + GeoPoint.fromLatLong(34.12866, -119.93615), + GeoPoint.fromLatLong(34.12935, -119.90557), + GeoPoint.fromLatLong(34.12608, -119.87988), + GeoPoint.fromLatLong(34.125, -119.86883), + GeoPoint.fromLatLong(34.12019, -119.83796), + GeoPoint.fromLatLong(34.10638, -119.7926), + GeoPoint.fromLatLong(34.11194, -119.76903), + GeoPoint.fromLatLong(34.11092, -119.74522), + GeoPoint.fromLatLong(34.10175, -119.71804), + GeoPoint.fromLatLong(34.09031, -119.68607), + GeoPoint.fromLatLong(34.07122, -119.65493), + GeoPoint.fromLatLong(34.08673, -119.63523), + GeoPoint.fromLatLong(34.0927, -119.62597), + GeoPoint.fromLatLong(34.10564, -119.59056), + GeoPoint.fromLatLong(34.10811, -119.57412), + GeoPoint.fromLatLong(34.10778, -119.54825), + GeoPoint.fromLatLong(34.09871, -119.52459), + GeoPoint.fromLatLong(34.08584, -119.50095), + GeoPoint.fromLatLong(34.07183, -119.47731), + GeoPoint.fromLatLong(34.06474, -119.46004), + GeoPoint.fromLatLong(34.06769, -119.42373), + GeoPoint.fromLatLong(34.06604, -119.38975), + ], + [ + GeoPoint.fromLatLong(33.23455, -119.62594), + GeoPoint.fromLatLong(33.24497, -119.63128), + GeoPoint.fromLatLong(33.24891, -119.63163), + GeoPoint.fromLatLong(33.25322, -119.63154), + GeoPoint.fromLatLong(33.25902, -119.63284), + GeoPoint.fromLatLong(33.27304, -119.6363), + GeoPoint.fromLatLong(33.28596, -119.63479), + GeoPoint.fromLatLong(33.29934, -119.62908), + GeoPoint.fromLatLong(33.30925, -119.62165), + GeoPoint.fromLatLong(33.3148, -119.61453), + GeoPoint.fromLatLong(33.3204, -119.60482), + GeoPoint.fromLatLong(33.32582, -119.59252), + GeoPoint.fromLatLong(33.32779, -119.58268), + GeoPoint.fromLatLong(33.32828, -119.57491), + GeoPoint.fromLatLong(33.32764, -119.56493), + GeoPoint.fromLatLong(33.33118, -119.5546), + GeoPoint.fromLatLong(33.33416, -119.54354), + GeoPoint.fromLatLong(33.33526, -119.53418), + GeoPoint.fromLatLong(33.33486, -119.52531), + GeoPoint.fromLatLong(33.331, -119.50855), + GeoPoint.fromLatLong(33.32911, -119.50094), + GeoPoint.fromLatLong(33.32715, -119.49512), + GeoPoint.fromLatLong(33.32514, -119.49054), + GeoPoint.fromLatLong(33.31683, -119.4713), + GeoPoint.fromLatLong(33.30574, -119.44327), + GeoPoint.fromLatLong(33.30103, -119.43), + GeoPoint.fromLatLong(33.30033, -119.42872), + GeoPoint.fromLatLong(33.30003, -119.42816), + GeoPoint.fromLatLong(33.29894, -119.42618), + GeoPoint.fromLatLong(33.29877, -119.42594), + GeoPoint.fromLatLong(33.29623, -119.4225), + GeoPoint.fromLatLong(33.28951, -119.41337), + GeoPoint.fromLatLong(33.28351, -119.40539), + GeoPoint.fromLatLong(33.28007, -119.39991), + GeoPoint.fromLatLong(33.27438, -119.39098), + GeoPoint.fromLatLong(33.27092, -119.38522), + GeoPoint.fromLatLong(33.26763, -119.37973), + GeoPoint.fromLatLong(33.26476, -119.37594), + GeoPoint.fromLatLong(33.26324, -119.37594), + GeoPoint.fromLatLong(33.25578, -119.36908), + GeoPoint.fromLatLong(33.2534, -119.36723), + GeoPoint.fromLatLong(33.25003, -119.36472), + GeoPoint.fromLatLong(33.24522, -119.36212), + GeoPoint.fromLatLong(33.24206, -119.36093), + GeoPoint.fromLatLong(33.23487, -119.36013), + GeoPoint.fromLatLong(33.22832, -119.36018), + GeoPoint.fromLatLong(33.22145, -119.3607), + GeoPoint.fromLatLong(33.21482, -119.36244), + GeoPoint.fromLatLong(33.20851, -119.3654), + GeoPoint.fromLatLong(33.2026, -119.36845), + GeoPoint.fromLatLong(33.19763, -119.37196), + GeoPoint.fromLatLong(33.19503, -119.37386), + GeoPoint.fromLatLong(33.19219, -119.37594), + GeoPoint.fromLatLong(33.19071, -119.37899), + GeoPoint.fromLatLong(33.18948, -119.38146), + GeoPoint.fromLatLong(33.18628, -119.38614), + GeoPoint.fromLatLong(33.18084, -119.39454), + GeoPoint.fromLatLong(33.16699, -119.43372), + GeoPoint.fromLatLong(33.16527, -119.44497), + GeoPoint.fromLatLong(33.16461, -119.46836), + GeoPoint.fromLatLong(33.1644, -119.47223), + GeoPoint.fromLatLong(33.16364, -119.47526), + GeoPoint.fromLatLong(33.16349, -119.47649), + GeoPoint.fromLatLong(33.16367, -119.47874), + GeoPoint.fromLatLong(33.16391, -119.47959), + GeoPoint.fromLatLong(33.1666, -119.48944), + GeoPoint.fromLatLong(33.16701, -119.49142), + GeoPoint.fromLatLong(33.16739, -119.50094), + GeoPoint.fromLatLong(33.16739, -119.50803), + GeoPoint.fromLatLong(33.16742, -119.51025), + GeoPoint.fromLatLong(33.16776, -119.512), + GeoPoint.fromLatLong(33.169, -119.51688), + GeoPoint.fromLatLong(33.17089, -119.52286), + GeoPoint.fromLatLong(33.17266, -119.52671), + GeoPoint.fromLatLong(33.17325, -119.52901), + GeoPoint.fromLatLong(33.17392, -119.53224), + GeoPoint.fromLatLong(33.17647, -119.54126), + GeoPoint.fromLatLong(33.17882, -119.54676), + GeoPoint.fromLatLong(33.18028, -119.55007), + GeoPoint.fromLatLong(33.18061, -119.55154), + GeoPoint.fromLatLong(33.18126, -119.55319), + GeoPoint.fromLatLong(33.18152, -119.55495), + GeoPoint.fromLatLong(33.18248, -119.56224), + GeoPoint.fromLatLong(33.18462, -119.56932), + GeoPoint.fromLatLong(33.18648, -119.57419), + GeoPoint.fromLatLong(33.1885, -119.57832), + GeoPoint.fromLatLong(33.19019, -119.58097), + GeoPoint.fromLatLong(33.19553, -119.58726), + GeoPoint.fromLatLong(33.19673, -119.58909), + GeoPoint.fromLatLong(33.199, -119.59395), + GeoPoint.fromLatLong(33.20324, -119.60026), + GeoPoint.fromLatLong(33.20692, -119.60528), + GeoPoint.fromLatLong(33.21273, -119.61147), + GeoPoint.fromLatLong(33.21725, -119.61481), + GeoPoint.fromLatLong(33.22248, -119.61824), + GeoPoint.fromLatLong(33.22501, -119.61949), + GeoPoint.fromLatLong(33.22683, -119.61992), + GeoPoint.fromLatLong(33.22786, -119.62092), + GeoPoint.fromLatLong(33.22874, -119.62192), + GeoPoint.fromLatLong(33.23041, -119.62356), + GeoPoint.fromLatLong(33.23247, -119.62519), + ], + [ + GeoPoint.fromLatLong(34.87057, -114.63332), + GeoPoint.fromLatLong(34.86997, -114.63305), + GeoPoint.fromLatLong(34.79181, -114.56953), + GeoPoint.fromLatLong(34.71453, -114.48236), + GeoPoint.fromLatLong(34.64288, -114.44166), + GeoPoint.fromLatLong(34.47903, -114.38169), + GeoPoint.fromLatLong(34.41527, -114.29195), + GeoPoint.fromLatLong(34.31087, -114.14737), + GeoPoint.fromLatLong(34.17212, -114.26017), + GeoPoint.fromLatLong(34.12866, -114.35765), + GeoPoint.fromLatLong(34.04257, -114.4355), + GeoPoint.fromLatLong(33.96372, -114.49813), + GeoPoint.fromLatLong(33.91285, -114.51318), + GeoPoint.fromLatLong(33.84446, -114.52801), + GeoPoint.fromLatLong(33.6969, -114.49649), + GeoPoint.fromLatLong(33.58709, -114.5402), + GeoPoint.fromLatLong(33.47131, -114.61185), + GeoPoint.fromLatLong(33.39691, -114.72123), + GeoPoint.fromLatLong(33.23376, -114.68157), + GeoPoint.fromLatLong(33.03255, -114.62973), + GeoPoint.fromLatLong(32.97206, -114.48131), + GeoPoint.fromLatLong(32.87408, -114.46563), + GeoPoint.fromLatLong(32.73487, -114.58576), + GeoPoint.fromLatLong(32.73137, -114.63501), + GeoPoint.fromLatLong(32.73946, -114.69096), + GeoPoint.fromLatLong(32.71943, -114.71919), + GeoPoint.fromLatLong(32.71875, -114.71972), + GeoPoint.fromLatLong(32.70253, -114.9559), + GeoPoint.fromLatLong(32.66605, -115.47927), + GeoPoint.fromLatLong(32.66438, -115.50314), + GeoPoint.fromLatLong(32.64163, -115.80199), + GeoPoint.fromLatLong(32.6211, -116.0738), + GeoPoint.fromLatLong(32.61112, -116.19899), + GeoPoint.fromLatLong(32.59913, -116.3481), + GeoPoint.fromLatLong(32.58952, -116.46732), + GeoPoint.fromLatLong(32.57725, -116.61646), + GeoPoint.fromLatLong(32.56578, -116.75596), + GeoPoint.fromLatLong(32.55977, -116.82902), + GeoPoint.fromLatLong(32.54863, -116.95778), + GeoPoint.fromLatLong(32.54234, -117.02945), + GeoPoint.fromLatLong(32.5395, -117.06674), + GeoPoint.fromLatLong(32.6209, -117.22314), + GeoPoint.fromLatLong(32.65404, -117.30735), + GeoPoint.fromLatLong(32.83452, -117.34004), + GeoPoint.fromLatLong(33.07321, -117.37526), + GeoPoint.fromLatLong(33.3123, -117.57153), + GeoPoint.fromLatLong(33.40862, -117.71501), + GeoPoint.fromLatLong(33.49087, -117.81636), + GeoPoint.fromLatLong(33.55979, -117.94957), + GeoPoint.fromLatLong(33.63031, -118.06299), + GeoPoint.fromLatLong(33.66343, -118.34541), + GeoPoint.fromLatLong(33.93905, -118.51367), + GeoPoint.fromLatLong(33.98697, -118.62007), + GeoPoint.fromLatLong(33.97556, -118.74596), + GeoPoint.fromLatLong(33.98382, -118.87592), + GeoPoint.fromLatLong(34.07434, -119.22693), + GeoPoint.fromLatLong(34.23687, -119.33489), + GeoPoint.fromLatLong(34.34814, -119.56331), + GeoPoint.fromLatLong(34.34275, -119.73923), + GeoPoint.fromLatLong(34.36437, -119.90542), + GeoPoint.fromLatLong(34.41671, -120.12095), + GeoPoint.fromLatLong(34.41798, -120.24944), + GeoPoint.fromLatLong(34.39674, -120.42603), + GeoPoint.fromLatLong(34.4893, -120.56388), + GeoPoint.fromLatLong(34.51999, -120.6724), + GeoPoint.fromLatLong(34.60609, -120.70856), + GeoPoint.fromLatLong(34.7177, -120.683), + GeoPoint.fromLatLong(34.80895, -120.68251), + GeoPoint.fromLatLong(34.9015, -120.73438), + GeoPoint.fromLatLong(35.03457, -120.6942), + GeoPoint.fromLatLong(35.11198, -120.78292), + GeoPoint.fromLatLong(35.24362, -120.96025), + GeoPoint.fromLatLong(35.37806, -120.93094), + GeoPoint.fromLatLong(35.4377, -121.05951), + GeoPoint.fromLatLong(35.60068, -121.25103), + GeoPoint.fromLatLong(35.81771, -121.4561), + GeoPoint.fromLatLong(36.14645, -121.7489), + GeoPoint.fromLatLong(36.20183, -121.86514), + GeoPoint.fromLatLong(36.25918, -121.92971), + GeoPoint.fromLatLong(36.32734, -121.96481), + GeoPoint.fromLatLong(36.37682, -121.97196), + GeoPoint.fromLatLong(36.42509, -121.98576), + GeoPoint.fromLatLong(36.50891, -122.022), + GeoPoint.fromLatLong(36.58872, -122.04406), + GeoPoint.fromLatLong(36.87495, -122.06832), + GeoPoint.fromLatLong(37.02483, -122.27637), + GeoPoint.fromLatLong(37.14967, -122.4452), + GeoPoint.fromLatLong(37.31479, -122.47161), + GeoPoint.fromLatLong(37.47338, -122.56299), + GeoPoint.fromLatLong(37.62752, -122.57267), + GeoPoint.fromLatLong(37.82781, -122.63247), + GeoPoint.fromLatLong(37.89376, -122.78903), + GeoPoint.fromLatLong(37.97575, -122.89742), + GeoPoint.fromLatLong(37.98809, -123.08461), + GeoPoint.fromLatLong(38.28431, -123.12347), + GeoPoint.fromLatLong(38.40068, -123.18504), + GeoPoint.fromLatLong(38.49991, -123.3304), + GeoPoint.fromLatLong(38.66066, -123.49508), + GeoPoint.fromLatLong(38.84412, -123.7253), + GeoPoint.fromLatLong(39.03837, -123.76207), + GeoPoint.fromLatLong(39.1249, -123.80553), + GeoPoint.fromLatLong(39.21873, -123.84839), + GeoPoint.fromLatLong(39.34835, -123.89494), + GeoPoint.fromLatLong(39.44394, -123.88889), + GeoPoint.fromLatLong(39.55492, -123.83841), + GeoPoint.fromLatLong(39.68453, -123.87391), + GeoPoint.fromLatLong(39.82699, -123.9536), + GeoPoint.fromLatLong(39.95662, -124.06357), + GeoPoint.fromLatLong(40.09338, -124.2312), + GeoPoint.fromLatLong(40.27564, -124.42868), + GeoPoint.fromLatLong(40.45264, -124.47916), + GeoPoint.fromLatLong(40.71898, -124.33411), + GeoPoint.fromLatLong(40.9617, -124.1945), + GeoPoint.fromLatLong(41.03142, -124.2151), + GeoPoint.fromLatLong(41.09222, -124.24743), + GeoPoint.fromLatLong(41.13756, -124.25119), + GeoPoint.fromLatLong(41.18092, -124.21142), + GeoPoint.fromLatLong(41.25705, -124.17435), + GeoPoint.fromLatLong(41.29199, -124.19233), + GeoPoint.fromLatLong(41.31575, -124.23454), + GeoPoint.fromLatLong(41.36383, -124.23517), + GeoPoint.fromLatLong(41.38412, -124.14406), + GeoPoint.fromLatLong(41.51075, -124.15357), + GeoPoint.fromLatLong(41.6897, -124.22986), + GeoPoint.fromLatLong(41.78831, -124.41076), + GeoPoint.fromLatLong(41.85879, -124.31194), + GeoPoint.fromLatLong(41.99807, -124.32829), + GeoPoint.fromLatLong(41.99833, -124.32883), + GeoPoint.fromLatLong(41.99703, -124.11879), + GeoPoint.fromLatLong(41.99625, -123.96782), + GeoPoint.fromLatLong(41.99569, -123.79381), + GeoPoint.fromLatLong(41.99984, -123.62007), + GeoPoint.fromLatLong(42.00086, -123.51413), + GeoPoint.fromLatLong(42.00197, -123.2737), + GeoPoint.fromLatLong(42.00302, -123.03178), + GeoPoint.fromLatLong(42.00388, -122.78389), + GeoPoint.fromLatLong(42.00482, -122.64619), + GeoPoint.fromLatLong(42.00869, -122.40756), + GeoPoint.fromLatLong(42.00755, -122.18647), + GeoPoint.fromLatLong(42.00397, -122.00032), + GeoPoint.fromLatLong(42.00262, -121.81573), + GeoPoint.fromLatLong(42.00077, -121.70538), + GeoPoint.fromLatLong(41.99933, -121.6122), + GeoPoint.fromLatLong(41.99827, -121.51946), + GeoPoint.fromLatLong(41.99738, -121.43715), + GeoPoint.fromLatLong(41.99668, -121.36025), + GeoPoint.fromLatLong(41.99759, -121.26065), + GeoPoint.fromLatLong(41.99336, -120.97395), + GeoPoint.fromLatLong(41.99387, -120.76508), + GeoPoint.fromLatLong(41.99309, -120.60306), + GeoPoint.fromLatLong(41.99313, -120.30731), + GeoPoint.fromLatLong(41.99443, -120.19996), + GeoPoint.fromLatLong(41.99514, -120.00104), + GeoPoint.fromLatLong(41.99454, -119.99917), + GeoPoint.fromLatLong(41.97905, -119.99919), + GeoPoint.fromLatLong(41.26742, -120.00002), + GeoPoint.fromLatLong(40.86934, -119.99926), + GeoPoint.fromLatLong(40.39719, -119.99567), + GeoPoint.fromLatLong(40.08934, -119.99733), + GeoPoint.fromLatLong(39.79567, -120.00049), + GeoPoint.fromLatLong(39.57782, -120.0015), + GeoPoint.fromLatLong(39.37557, -120.00608), + GeoPoint.fromLatLong(38.98156, -119.9748), + GeoPoint.fromLatLong(38.83427, -119.76041), + GeoPoint.fromLatLong(38.60904, -119.43506), + GeoPoint.fromLatLong(38.30368, -119.00097), + GeoPoint.fromLatLong(37.96065, -118.51722), + GeoPoint.fromLatLong(37.75309, -118.22972), + GeoPoint.fromLatLong(37.6185, -118.04392), + GeoPoint.fromLatLong(37.43715, -117.79563), + GeoPoint.fromLatLong(37.08441, -117.31883), + GeoPoint.fromLatLong(36.75057, -116.87227), + GeoPoint.fromLatLong(36.37205, -116.37528), + GeoPoint.fromLatLong(36.14577, -116.08072), + GeoPoint.fromLatLong(36.0018, -115.89512), + GeoPoint.fromLatLong(35.81231, -115.65233), + GeoPoint.fromLatLong(35.59033, -115.36992), + GeoPoint.fromLatLong(35.38796, -115.11622), + GeoPoint.fromLatLong(35.15341, -114.82052), + GeoPoint.fromLatLong(35.00195, -114.63361), + GeoPoint.fromLatLong(35.00186, -114.63349), + ], + ] diff --git a/examples/basic/src/pages/polygon/click/PolygonClickPage.tsx b/examples/basic/src/pages/polygon/click/PolygonClickPage.tsx index 0026dcb..eda2603 100644 --- a/examples/basic/src/pages/polygon/click/PolygonClickPage.tsx +++ b/examples/basic/src/pages/polygon/click/PolygonClickPage.tsx @@ -1,51 +1,109 @@ -import { useMemo } from 'react'; -import { createGeoPoint, createPolygonState } from '@mapconductor/js-sdk-core'; -import { Polygon } from '@mapconductor/js-sdk-react'; +import { useCallback, useMemo, useRef, useState } from 'react'; +import { + ColorDefaultIcon, + MarkerAnimation, + PolygonManager, + createMarkerState, + createPolygonEntity, + createPolygonState, + type GeoPoint, +} from '@mapconductor/js-sdk-core'; +import { InfoBubble, Marker, Polygon } from '@mapconductor/js-sdk-react'; import { ControlPanel } from '../../../components/ControlPanel'; -import { Toast, useToast } from '../../../components/Toast'; import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; +import { california } from './California'; -const INIT_CAMERA = { lat: 36.0, lng: -120.0, zoom: 7 }; +const INIT_CAMERA = { lat: 37.2, lng: -119.6, zoom: 5 }; + +interface ClickedMarker { + position: GeoPoint; + message: string; + sequence: number; +} export function PolygonClickPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const { messages, showToast, dismissToast } = useToast(); - const polygons = useMemo(() => [ - createPolygonState({ - id: 'sf-shape', - points: [ - createGeoPoint({ latitude: 37.82, longitude: -122.52 }), - createGeoPoint({ latitude: 37.83, longitude: -122.35 }), - createGeoPoint({ latitude: 37.70, longitude: -122.32 }), - createGeoPoint({ latitude: 37.68, longitude: -122.50 }), - ], - fillColor: 'rgba(37, 99, 235, 0.32)', - strokeColor: '#2563eb', - strokeWidth: 2, - onClick: event => showToast(`Blue polygon clicked\n${event.clicked.toUrlValue(5)}`), - }), - createPolygonState({ - id: 'la-shape', - points: [ - createGeoPoint({ latitude: 34.13, longitude: -118.52 }), - createGeoPoint({ latitude: 34.13, longitude: -118.18 }), - createGeoPoint({ latitude: 33.94, longitude: -118.16 }), - createGeoPoint({ latitude: 33.92, longitude: -118.48 }), - ], - fillColor: 'rgba(239, 68, 68, 0.28)', - strokeColor: '#ef4444', - strokeWidth: 2, - onClick: event => showToast(`Red polygon clicked\n${event.clicked.toUrlValue(5)}`), - }), - ], [showToast]); + const polygons = useMemo( + () => california.map((points, index) => + createPolygonState({ + id: `california-${index}`, + points, + fillColor: 'rgba(37, 99, 235, 0.28)', + strokeColor: '#2563eb', + strokeWidth: 2, + geodesic: true, + }), + ), + [], + ); + const polygonManager = useMemo(() => { + const manager = new PolygonManager(); + polygons.forEach((polygon) => { + manager.registerEntity(createPolygonEntity({ polygon: null, state: polygon })); + }); + return manager; + }, [polygons]); + const [clickedMarker, setClickedMarker] = useState(null); + const markerIcon = useMemo( + () => new ColorDefaultIcon('#ef4444', { label: 'P', labelTextColor: '#ffffff' }), + [], + ); + const marker = useMemo( + () => clickedMarker + ? createMarkerState({ + id: `polygon-click-${clickedMarker.sequence}`, + position: clickedMarker.position, + icon: markerIcon, + animation: MarkerAnimation.Drop, + }) + : null, + [clickedMarker, markerIcon], + ); + const lastPolygonClickRef = useRef<{ point: GeoPoint; time: number } | null>(null); + + const showClickedMarker = useCallback((clicked: GeoPoint) => { + const isInside = polygonManager.find(clicked) != null; + setClickedMarker((current) => ({ + position: clicked, + message: isInside ? `Inside\n${clicked.toUrlValue(5)}` : 'Outside', + sequence: (current?.sequence ?? 0) + 1, + })); + }, [polygonManager]); + const handleMapClick = useCallback((clicked: GeoPoint) => { + const lastPolygonClick = lastPolygonClickRef.current; + if ( + lastPolygonClick && + Date.now() - lastPolygonClick.time < 250 && + lastPolygonClick.point.equals(clicked) + ) { + return; + } + showClickedMarker(clicked); + }, [showClickedMarker]); + const handlePolygonClick = useCallback((clicked: GeoPoint) => { + lastPolygonClickRef.current = { point: clicked, time: Date.now() }; + showClickedMarker(clicked); + }, [showClickedMarker]); return ( - - {polygons.map(polygon => )} + + {polygons.map(polygon => ( + handlePolygonClick(event.clicked) })} + /> + ))} + {marker && ( + <> + + +
{clickedMarker?.message}
+
+ + )} -

Tap either polygon to show a toast with the clicked location.

+

Tap inside or outside California.

-
); } diff --git a/examples/basic/src/pages/polygon/geodesic/PolygonGeodesicPage.tsx b/examples/basic/src/pages/polygon/geodesic/PolygonGeodesicPage.tsx index dc8501a..c71d054 100644 --- a/examples/basic/src/pages/polygon/geodesic/PolygonGeodesicPage.tsx +++ b/examples/basic/src/pages/polygon/geodesic/PolygonGeodesicPage.tsx @@ -1,37 +1,90 @@ -import { useMemo } from 'react'; -import { createGeoPoint, createPolygonState } from '@mapconductor/js-sdk-core'; -import { Polygon } from '@mapconductor/js-sdk-react'; +import { useMemo, useState } from 'react'; +import { + ColorDefaultIcon, + GeoPoint, + MarkerAnimation, + createMarkerState, + createPolygonState, + type GeoPoint as GeoPointType, + type PolygonEvent, +} from '@mapconductor/js-sdk-core'; +import { InfoBubble, Marker, Polygon } from '@mapconductor/js-sdk-react'; import { ControlPanel } from '../../../components/ControlPanel'; import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; const INIT_CAMERA = { lat: 30.0, lng: 20.0, zoom: 2 }; +interface ClickedPolygon { + position: GeoPointType; + label: string; + markerColor: string; + sequence: number; +} + export function PolygonGeodesicPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); + const [clickedPolygon, setClickedPolygon] = useState(null); const points = useMemo(() => [ - createGeoPoint({ latitude: 35.6812, longitude: 139.7671 }), - createGeoPoint({ latitude: 21.3069, longitude: -157.8583 }), - createGeoPoint({ latitude: 40.7128, longitude: -74.006 }), + GeoPoint.fromLongLat(23.66, 56.42, 5000), + GeoPoint.fromLongLat(13.39, 2.95, 5000), + GeoPoint.fromLongLat(-87.82, 38.58, 5000), + GeoPoint.fromLongLat(23.66, 56.42, 5000), ], []); + const handlePolygonClick = (label: string) => (event: PolygonEvent) => { + setClickedPolygon((current) => ({ + position: event.clicked, + label, + markerColor: event.state.strokeColor, + sequence: (current?.sequence ?? 0) + 1, + })); + }; + const polygons = useMemo(() => [ + createPolygonState({ + id: 'linear-triangle', + points, + fillColor: 'rgba(37, 99, 235, 0.5)', + strokeColor: '#2563eb', + strokeWidth: 2, + geodesic: false, + onClick: handlePolygonClick('Linear Triangle'), + }), + createPolygonState({ + id: 'geodesic-triangle', + points, + fillColor: 'rgba(245, 158, 11, 0.5)', + strokeColor: '#f59e0b', + strokeWidth: 2, + geodesic: true, + zIndex: 3, + onClick: handlePolygonClick('Geodesic Triangle'), + }), + ], [points]); + const marker = useMemo( + () => clickedPolygon + ? createMarkerState({ + id: `polygon-geodesic-click-${clickedPolygon.sequence}`, + position: clickedPolygon.position, + icon: new ColorDefaultIcon(clickedPolygon.markerColor, { + label: 'P', + labelTextColor: '#ffffff', + }), + animation: MarkerAnimation.Drop, + }) + : null, + [clickedPolygon], + ); return ( - - + {polygons.map(polygon => )} + {marker && ( + <> + + +
{clickedPolygon?.label}
+
+ + )}

Blue uses straight screen-space edges. Orange uses geodesic interpolation.

diff --git a/examples/basic/src/pages/polygon/hole/PolygonHolePage.tsx b/examples/basic/src/pages/polygon/hole/PolygonHolePage.tsx index 56fce6b..2f9caf2 100644 --- a/examples/basic/src/pages/polygon/hole/PolygonHolePage.tsx +++ b/examples/basic/src/pages/polygon/hole/PolygonHolePage.tsx @@ -1,49 +1,103 @@ -import { useMemo } from 'react'; -import { createGeoPoint, createPolygonState } from '@mapconductor/js-sdk-core'; -import { Polygon } from '@mapconductor/js-sdk-react'; +import { useMemo, useRef, useState } from 'react'; +import { + ColorDefaultIcon, + createGeoPoint, + createMarkerState, + createPolygonState, + type GeoPoint, + type MarkerState, +} from '@mapconductor/js-sdk-core'; +import { Markers, Polygon } from '@mapconductor/js-sdk-react'; import { ControlPanel } from '../../../components/ControlPanel'; import { MapViewContainer, useSampleMapViewState } from '../../../MapViewContainer'; const INIT_CAMERA = { lat: 43.0602, lng: 141.3195, zoom: 11 }; +const WORLD_POINTS = [ + createGeoPoint({ latitude: 85, longitude: 90 }), + createGeoPoint({ latitude: 85, longitude: 0.1 }), + createGeoPoint({ latitude: 85, longitude: -90 }), + createGeoPoint({ latitude: 85, longitude: -179.9 }), + createGeoPoint({ latitude: -85, longitude: -179.9 }), + createGeoPoint({ latitude: -85, longitude: -90 }), + createGeoPoint({ latitude: -85, longitude: 0.1 }), + createGeoPoint({ latitude: -85, longitude: 90 }), + createGeoPoint({ latitude: -85, longitude: 179.9 }), + createGeoPoint({ latitude: 85, longitude: 179.9 }), +]; +const INITIAL_HOLES = [ + [ + createGeoPoint({ latitude: 43.100869, longitude: 141.352909 }), + createGeoPoint({ latitude: 43.044443, longitude: 141.411895 }), + createGeoPoint({ latitude: 43.050601, longitude: 141.306563 }), + ], + [ + createGeoPoint({ latitude: 43.060351, longitude: 141.319905 }), + createGeoPoint({ latitude: 43.038285, longitude: 141.333247 }), + createGeoPoint({ latitude: 43.049062, longitude: 141.286901 }), + ], +]; +const HOLE_MARKER_COLORS = ['#2563eb', '#f97316']; export function PolygonHolePage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); - const state = useMemo(() => createPolygonState({ - id: 'world-hole', - points: [ - createGeoPoint({ latitude: 85, longitude: 90 }), - createGeoPoint({ latitude: 85, longitude: 0.1 }), - createGeoPoint({ latitude: 85, longitude: -90 }), - createGeoPoint({ latitude: 85, longitude: -179.9 }), - createGeoPoint({ latitude: -85, longitude: -179.9 }), - createGeoPoint({ latitude: -85, longitude: -90 }), - createGeoPoint({ latitude: -85, longitude: 0.1 }), - createGeoPoint({ latitude: -85, longitude: 90 }), - createGeoPoint({ latitude: -85, longitude: 179.9 }), - createGeoPoint({ latitude: 85, longitude: 179.9 }), - ], - holes: [ - [ - createGeoPoint({ latitude: 43.100869, longitude: 141.352909 }), - createGeoPoint({ latitude: 43.044443, longitude: 141.411895 }), - createGeoPoint({ latitude: 43.050601, longitude: 141.306563 }), - ], - [ - createGeoPoint({ latitude: 43.060351, longitude: 141.319905 }), - createGeoPoint({ latitude: 43.038285, longitude: 141.333247 }), - createGeoPoint({ latitude: 43.049062, longitude: 141.286901 }), - ], - ], - fillColor: 'rgba(120, 120, 128, 0.8)', - strokeColor: '#ef4444', - strokeWidth: 2, - }), []); + const [holes, setHoles] = useState(() => INITIAL_HOLES.map(hole => [...hole])); + const setHolesRef = useRef(setHoles); + setHolesRef.current = setHoles; + + const state = useMemo( + () => + createPolygonState({ + id: 'world-hole', + points: WORLD_POINTS, + holes, + fillColor: 'rgba(120, 120, 128, 0.8)', + strokeColor: '#ef4444', + strokeWidth: 2, + }), + [holes] + ); + + const vertexMarkers = useMemo( + () => + holes.flatMap((hole, holeIndex) => + hole.map((point, vertexIndex) => { + const label = `${holeIndex + 1}-${vertexIndex + 1}`; + const updateHoleVertex = (markerState: MarkerState) => { + setHolesRef.current(prev => + prev.map((prevHole, prevHoleIndex) => + prevHoleIndex !== holeIndex + ? prevHole + : prevHole.map((prevPoint, prevVertexIndex) => + prevVertexIndex === vertexIndex ? markerState.position : prevPoint + ) + ) + ); + }; + + return createMarkerState({ + id: `hole-${holeIndex}-${vertexIndex}`, + position: point, + draggable: true, + clickable: false, + icon: new ColorDefaultIcon(HOLE_MARKER_COLORS[holeIndex] ?? '#64748b', { + label, + labelTextColor: '#ffffff', + strokeColor: '#ffffff', + }), + onDrag: updateHoleVertex, + onDragEnd: updateHoleVertex, + }); + }) + ), + [holes] + ); return ( + -

A world-covering polygon with two triangular holes near Sapporo.

+

Drag hole vertex markers to reshape the holes.

); diff --git a/examples/basic/src/pages/rasterlayer/RasterLayerPage.tsx b/examples/basic/src/pages/rasterlayer/RasterLayerPage.tsx index aee8841..ee2234f 100644 --- a/examples/basic/src/pages/rasterlayer/RasterLayerPage.tsx +++ b/examples/basic/src/pages/rasterlayer/RasterLayerPage.tsx @@ -5,6 +5,7 @@ import { ControlPanel, SliderControl } from '../../components/ControlPanel'; import { MapViewContainer, useSampleMapViewState } from '../../MapViewContainer'; const INIT_CAMERA = { lat: 35.6812, lng: 139.7671, zoom: 5 }; +const OSM_TILE_SIZE = 256; export function RasterLayerPage() { const mapViewState = useSampleMapViewState(INIT_CAMERA); @@ -13,7 +14,7 @@ export function RasterLayerPage() { id: 'osm-raster', source: RasterLayerSource.UrlTemplate({ template: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - tileSize: RasterLayerSource.DEFAULT_TILE_SIZE, + tileSize: OSM_TILE_SIZE, attribution: '© OpenStreetMap contributors', }), opacity, diff --git a/examples/basic/src/sampleRegistry.ts b/examples/basic/src/sampleRegistry.ts index 4df30a6..c9e539d 100644 --- a/examples/basic/src/sampleRegistry.ts +++ b/examples/basic/src/sampleRegistry.ts @@ -5,6 +5,8 @@ export interface SamplePageDefinition { label: string; group: string; status?: SampleStatus; + showProviderSelector?: boolean; + unavailableProviders?: string[]; } export const SAMPLE_PAGES: SamplePageDefinition[] = [ @@ -13,27 +15,27 @@ export const SAMPLE_PAGES: SamplePageDefinition[] = [ { id: 'fly-to', label: 'Fly To', group: 'Map' }, { id: 'tilt', label: 'Tilt', group: 'Map' }, { id: 'visible-region', label: 'Visible Region', group: 'Map' }, - { id: 'camera-sync', label: 'Camera Sync', group: 'Map', status: 'unsupported' }, + { id: 'camera-sync', label: 'Camera Sync', group: 'Map', showProviderSelector: false }, { id: 'marker', label: 'Marker Icons', group: 'Marker' }, { id: 'marker-animation', label: 'Marker Animation', group: 'Marker' }, - { id: 'post-office', label: 'Post Office', group: 'Marker' }, - { id: 'post-office-cluster', label: 'Post Office Cluster', group: 'Marker', status: 'unsupported' }, + { id: 'post-office', label: 'Post Office', group: 'Marker', unavailableProviders: ['google-maps-3d'] }, + { id: 'post-office-cluster', label: 'Post Office Cluster', group: 'Marker' }, { id: 'circle', label: 'Circle', group: 'Shape' }, { id: 'polyline', label: 'Polyline', group: 'Shape' }, { id: 'polyline-click', label: 'Polyline Click', group: 'Shape' }, { id: 'polygon', label: 'Polygon', group: 'Shape' }, { id: 'polygon-click', label: 'Polygon Click', group: 'Shape' }, { id: 'polygon-geodesic', label: 'Polygon Geodesic', group: 'Shape' }, - { id: 'polygon-hole', label: 'Polygon Hole', group: 'Shape' }, - { id: 'ground-image', label: 'Ground Image', group: 'Overlay' }, - { id: 'raster-layer', label: 'Raster Layer', group: 'Overlay' }, + { id: 'polygon-hole', label: 'Polygon Hole', group: 'Shape', unavailableProviders: ['google-maps-3d'] }, + { id: 'ground-image', label: 'Ground Image', group: 'Overlay', unavailableProviders: ['google-maps-3d'] }, + { id: 'raster-layer', label: 'Raster Layer', group: 'Overlay', unavailableProviders: ['google-maps-3d'] }, { id: 'info-bubble-simple', label: 'Simple Bubble', group: 'Info Bubble' }, { id: 'info-bubble-styled', label: 'Styled Bubble', group: 'Info Bubble' }, { id: 'info-bubble-multiple', label: 'Multiple Bubbles', group: 'Info Bubble' }, { id: 'info-bubble-rich', label: 'Rich Bubble', group: 'Info Bubble' }, - { id: 'geojson-basic', label: 'GeoJSON Basic', group: 'Extensions', status: 'unsupported' }, - { id: 'geojson-layer', label: 'GeoJSON Layer', group: 'Extensions', status: 'unsupported' }, - { id: 'heatmap-layer', label: 'Heatmap Layer', group: 'Extensions', status: 'unsupported' }, + { id: 'geojson-basic', label: 'GeoJSON Basic', group: 'Extensions', unavailableProviders: ['google-maps-3d'] }, + { id: 'geojson-layer', label: 'GeoJSON Layer', group: 'Extensions', unavailableProviders: ['google-maps-3d'] }, + { id: 'heatmap-layer', label: 'Heatmap Layer', group: 'Extensions', unavailableProviders: ['google-maps-3d'] }, ]; export const DEFAULT_SAMPLE_PAGE = 'map'; @@ -41,3 +43,7 @@ export const DEFAULT_SAMPLE_PAGE = 'map'; export function isKnownSamplePage(page: string | undefined): boolean { return SAMPLE_PAGES.some((item) => item.id === page); } + +export function getSamplePageDefinition(page: string | undefined): SamplePageDefinition | undefined { + return SAMPLE_PAGES.find((item) => item.id === page); +} diff --git a/examples/basic/vite.config.ts b/examples/basic/vite.config.ts index 81e3d0b..21dcd5e 100644 --- a/examples/basic/vite.config.ts +++ b/examples/basic/vite.config.ts @@ -43,6 +43,7 @@ function mapconductorTileServiceWorker(): Plugin { const useHttps = process.env.HTTPS === 'true'; export default defineConfig({ + base: process.env.VITE_BASE_PATH ?? '/', // mkcert() enables server.https itself (with a locally-trusted cert) when present; // no separate server.https config is needed. plugins: [react(), mapconductorTileServiceWorker(), ...(useHttps ? [mkcert()] : [])], diff --git a/js-sdk-core b/js-sdk-core index c3babf4..9b19a1d 160000 --- a/js-sdk-core +++ b/js-sdk-core @@ -1 +1 @@ -Subproject commit c3babf4ee6ce94638cb0edec446e7d34dbe7e73a +Subproject commit 9b19a1d1448210d0756efdf090d1124cedfbe872 diff --git a/js-sdk-react b/js-sdk-react index 7354460..06f3267 160000 --- a/js-sdk-react +++ b/js-sdk-react @@ -1 +1 @@ -Subproject commit 735446073c7e99120f5e33e97333205eaf459458 +Subproject commit 06f3267c7018efb13c852864248ce41d4caaec87 diff --git a/package.json b/package.json index 84b541d..98c2ae2 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,11 @@ "js-sdk-core/", "js-sdk-react/", "js-sdk-reactnative/", + "react-icons/", "react-for-googlemaps/", "react-for-maplibre/", + "react-heatmap/", + "react-marker-clustering/", "reactnative-for-googlemaps/", "reactnative-for-maplibre/", "examples/*" @@ -16,7 +19,7 @@ "scripts": { "build": "pnpm -r --if-present run build", "dev": "pnpm run build && (pnpm run dev:packages & pnpm run dev:examples & wait)", - "dev:packages": "pnpm --parallel --filter @mapconductor/js-sdk-core --filter @mapconductor/js-sdk-react --filter @mapconductor/js-sdk-reactnative --filter @mapconductor/react-for-googlemaps --filter @mapconductor/react-for-maplibre --filter @mapconductor/reactnative-for-googlemaps --filter @mapconductor/reactnative-for-maplibre --if-present run dev --tsconfig ../tsconfig.dev.json", + "dev:packages": "pnpm --parallel --filter @mapconductor/js-sdk-core --filter @mapconductor/js-sdk-react --filter @mapconductor/js-sdk-reactnative --filter @mapconductor/react-icons --filter @mapconductor/react-for-googlemaps --filter @mapconductor/react-for-maplibre --filter @mapconductor/reactnative-for-googlemaps --filter @mapconductor/reactnative-for-maplibre --if-present run dev --tsconfig ../tsconfig.dev.json", "dev:examples": "pnpm --parallel --filter @mapconductor/example-basic --if-present run dev", "lint": "eslint . --ext .ts,.tsx", "lint:fix": "eslint . --ext .ts,.tsx --fix", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4363d3d..b87a1e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,19 +22,19 @@ importers: version: 19.2.2(@types/react@19.2.2) '@typescript-eslint/eslint-plugin': specifier: ^6.15.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3))(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^6.15.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + version: 6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3) eslint: specifier: ^8.56.0 - version: 8.57.1 + version: 8.57.1(supports-color@10.2.2) eslint-plugin-react: specifier: ^7.33.2 - version: 7.37.5(eslint@8.57.1) + version: 7.37.5(eslint@8.57.1(supports-color@10.2.2)) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) + version: 4.6.2(eslint@8.57.1(supports-color@10.2.2)) prettier: specifier: ^3.1.1 version: 3.6.2 @@ -56,6 +56,18 @@ importers: '@mapconductor/react-for-maplibre': specifier: workspace:* version: link:../../react-for-maplibre + '@mapconductor/react-geojson-layer': + specifier: workspace:* + version: link:../../react-geojson-layer + '@mapconductor/react-heatmap': + specifier: workspace:* + version: link:../../react-heatmap + '@mapconductor/react-icons': + specifier: workspace:* + version: link:../../react-icons + '@mapconductor/react-marker-clustering': + specifier: workspace:* + version: link:../../react-marker-clustering react: specifier: ^19.2.7 version: 19.2.7 @@ -104,19 +116,19 @@ importers: version: link:../../reactnative-for-maplibre '@react-native-picker/picker': specifier: 2.11.4 - version: 2.11.4(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 2.11.4(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) expo: specifier: ~57.0.1 - version: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + version: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-status-bar: specifier: ~57.0.0 - version: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + version: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 react-native: specifier: 0.86.0 - version: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + version: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) devDependencies: '@babel/core': specifier: ^7.25.0 @@ -129,10 +141,14 @@ importers: version: 6.0.3 js-sdk-core: + dependencies: + polygon-clipping: + specifier: ^0.15.7 + version: 0.15.7 devDependencies: tsup: specifier: ^8.0.1 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -148,7 +164,7 @@ importers: version: 18.3.1 tsup: specifier: ^8.0.1 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.3.3 version: 5.9.3 @@ -167,7 +183,7 @@ importers: devDependencies: tsup: specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -192,7 +208,7 @@ importers: version: 19.2.7 tsup: specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -214,7 +230,86 @@ importers: version: 19.2.7 tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + react-geojson-layer: + dependencies: + '@mapconductor/js-sdk-core': + specifier: workspace:* + version: link:../js-sdk-core + '@mapconductor/js-sdk-react': + specifier: workspace:* + version: link:../js-sdk-react + devDependencies: + '@types/react': + specifier: ^19.2.0 + version: 19.2.17 + react: + specifier: ^19.2.0 + version: 19.2.7 + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + react-heatmap: + dependencies: + '@mapconductor/js-sdk-core': + specifier: workspace:* + version: link:../js-sdk-core + '@mapconductor/js-sdk-react': + specifier: workspace:* + version: link:../js-sdk-react + devDependencies: + '@types/react': + specifier: ^19.2.0 + version: 19.2.17 + react: + specifier: ^19.2.0 + version: 19.2.7 + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + react-icons: + dependencies: + '@mapconductor/js-sdk-core': + specifier: workspace:* + version: link:../js-sdk-core + devDependencies: + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + react-marker-clustering: + dependencies: + '@mapconductor/js-sdk-core': + specifier: workspace:* + version: link:../js-sdk-core + '@mapconductor/js-sdk-react': + specifier: workspace:* + version: link:../js-sdk-react + devDependencies: + '@types/react': + specifier: ^19.2.0 + version: 19.2.17 + react: + specifier: ^19.2.0 + version: 19.2.7 + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -236,7 +331,7 @@ importers: devDependencies: tsup: specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -258,7 +353,7 @@ importers: devDependencies: tsup: specifier: ^8.5.1 - version: 8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0) + version: 8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -1191,131 +1286,157 @@ packages: resolution: {integrity: sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-gnueabihf@4.62.2': resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.62.0': resolution: {integrity: sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm-musleabihf@4.62.2': resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.62.0': resolution: {integrity: sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.62.2': resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.62.0': resolution: {integrity: sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-musl@4.62.2': resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.62.0': resolution: {integrity: sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-gnu@4.62.2': resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.62.0': resolution: {integrity: sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-musl@4.62.2': resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.62.0': resolution: {integrity: sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.62.2': resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.62.0': resolution: {integrity: sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-musl@4.62.2': resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.62.0': resolution: {integrity: sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.62.2': resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.62.0': resolution: {integrity: sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-musl@4.62.2': resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.62.0': resolution: {integrity: sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.62.2': resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.0': resolution: {integrity: sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.62.2': resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.62.0': resolution: {integrity: sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-linux-x64-musl@4.62.2': resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.62.0': resolution: {integrity: sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==} @@ -2729,24 +2850,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -3155,6 +3280,9 @@ packages: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} + polygon-clipping@0.15.7: + resolution: {integrity: sha512-nhfdr83ECBg6xtqOAJab1tbksbBAOMUltN60bU+llHVOL0e5Onm1WpAXXWXVB39L8AJFssoIhEVuy/S90MmotA==} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3373,6 +3501,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + rollup@4.62.0: resolution: {integrity: sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3514,6 +3645,10 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + splaytree@3.2.3: + resolution: {integrity: sha512-7OXrNWzy6CK+r7Ch9OLPBDTKfB6XlWHjX4P0RU5B3IgFuWPeYN0XtRtlexGRjgbQxpfaUve6jTAwBGWuGntz/w==} + engines: {node: '>=18.20 || >=20'} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -4038,7 +4173,7 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 @@ -4369,12 +4504,12 @@ snapshots: '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7)(supports-color@10.2.2) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) semver: 6.3.1 @@ -4516,14 +4651,14 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1(supports-color@10.2.2))': dependencies: - eslint: 8.57.1 + eslint: 8.57.1(supports-color@10.2.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/eslintrc@2.1.4(supports-color@10.2.2)': dependencies: ajv: 6.12.6 debug: 4.4.3(supports-color@10.2.2) @@ -4539,7 +4674,7 @@ snapshots: '@eslint/js@8.57.1': {} - '@expo/cli@57.0.3(@expo/dom-webview@57.0.0)(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3))(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3)': + '@expo/cli@57.0.3(@expo/dom-webview@57.0.0)(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3))(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/config': 57.0.1(typescript@6.0.3) @@ -4549,21 +4684,21 @@ snapshots: '@expo/image-utils': 0.11.0(typescript@6.0.3) '@expo/inline-modules': 0.1.1(typescript@6.0.3) '@expo/json-file': 11.0.0 - '@expo/log-box': 57.0.0(@expo/dom-webview@57.0.0)(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@expo/log-box': 57.0.0(@expo/dom-webview@57.0.0)(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) '@expo/metro': 56.0.0 '@expo/metro-config': 57.0.2(expo@57.0.1)(typescript@6.0.3) - '@expo/metro-file-map': 57.0.0 + '@expo/metro-file-map': 57.0.0(supports-color@10.2.2) '@expo/osascript': 2.7.0 '@expo/package-manager': 1.13.0 '@expo/plist': 0.8.0 - '@expo/prebuild-config': 57.0.3(typescript@6.0.3) + '@expo/prebuild-config': 57.0.3(supports-color@10.2.2)(typescript@6.0.3) '@expo/require-utils': 57.0.0(typescript@6.0.3) - '@expo/router-server': 57.0.1(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3))(expo-server@57.0.0)(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react@19.2.3) + '@expo/router-server': 57.0.1(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3))(expo-server@57.0.0)(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react@19.2.3)(supports-color@10.2.2) '@expo/schema-utils': 57.0.0 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 2.0.0(ws@8.21.0) '@expo/xcpretty': 4.4.4 - '@react-native/dev-middleware': 0.86.0 + '@react-native/dev-middleware': 0.86.0(supports-color@10.2.2) accepts: 1.3.8 arg: 5.0.2 bplist-creator: 0.1.0 @@ -4574,7 +4709,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3(supports-color@10.2.2) dnssd-advertise: 1.1.6 - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-server: 57.0.0 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -4600,7 +4735,7 @@ snapshots: ws: 8.21.0 zod: 3.25.76 optionalDependencies: - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro-runtime' @@ -4662,18 +4797,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@expo/devtools@57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) - '@expo/dom-webview@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@expo/dom-webview@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)': dependencies: - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) '@expo/env@2.4.0': dependencies: @@ -4685,7 +4820,7 @@ snapshots: '@expo/expo-modules-macros-plugin@0.3.0': {} - '@expo/fingerprint@0.20.1': + '@expo/fingerprint@0.20.1(supports-color@10.2.2)': dependencies: '@expo/env': 2.4.0 '@expo/spawn-async': 1.8.0 @@ -4734,13 +4869,13 @@ snapshots: - supports-color - typescript - '@expo/log-box@57.0.0(@expo/dom-webview@57.0.0)(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@expo/log-box@57.0.0(@expo/dom-webview@57.0.0)(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)': dependencies: - '@expo/dom-webview': 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@expo/dom-webview': 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) anser: 1.4.10 - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) stacktrace-parser: 0.1.11 '@expo/metro-config@57.0.2(expo@57.0.1)(typescript@6.0.3)': @@ -4769,14 +4904,14 @@ snapshots: postcss: 8.5.15 resolve-from: 5.0.0 optionalDependencies: - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@expo/metro-file-map@57.0.0': + '@expo/metro-file-map@57.0.0(supports-color@10.2.2)': dependencies: debug: 4.4.3(supports-color@10.2.2) fb-watchman: 2.0.2 @@ -4827,7 +4962,7 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@57.0.3(typescript@6.0.3)': + '@expo/prebuild-config@57.0.3(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/config': 57.0.1(typescript@6.0.3) '@expo/config-plugins': 57.0.1(typescript@6.0.3) @@ -4853,12 +4988,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/router-server@57.0.1(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3))(expo-server@57.0.0)(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react@19.2.3)': + '@expo/router-server@57.0.1(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3))(expo-server@57.0.0)(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react@19.2.3)(supports-color@10.2.2)': dependencies: debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)) - expo-font: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)) + expo-font: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) expo-server: 57.0.0 react: 19.2.3 optionalDependencies: @@ -4890,7 +5025,7 @@ snapshots: dependencies: '@types/google.maps': 3.65.2 - '@humanwhocodes/config-array@0.13.0': + '@humanwhocodes/config-array@0.13.0(supports-color@10.2.2)': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.3(supports-color@10.2.2) @@ -5003,10 +5138,10 @@ snapshots: dependencies: playwright: 1.61.0 - '@react-native-picker/picker@2.11.4(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@react-native-picker/picker@2.11.4(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)': dependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) '@react-native/assets-registry@0.86.0': {} @@ -5028,9 +5163,9 @@ snapshots: tinyglobby: 0.2.17 yargs: 17.7.3 - '@react-native/community-cli-plugin@0.86.0': + '@react-native/community-cli-plugin@0.86.0(supports-color@10.2.2)': dependencies: - '@react-native/dev-middleware': 0.86.0 + '@react-native/dev-middleware': 0.86.0(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2) invariant: 2.2.4 metro: 0.84.4 @@ -5044,7 +5179,7 @@ snapshots: '@react-native/debugger-frontend@0.86.0': {} - '@react-native/debugger-shell@0.86.0': + '@react-native/debugger-shell@0.86.0(supports-color@10.2.2)': dependencies: cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) @@ -5052,11 +5187,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.86.0': + '@react-native/dev-middleware@0.86.0(supports-color@10.2.2)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.86.0 - '@react-native/debugger-shell': 0.86.0 + '@react-native/debugger-shell': 0.86.0(supports-color@10.2.2) chrome-launcher: 0.15.2 chromium-edge-launcher: 0.3.0 connect: 3.7.0 @@ -5077,12 +5212,12 @@ snapshots: '@react-native/normalize-colors@0.86.0': {} - '@react-native/virtualized-lists@0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)': + '@react-native/virtualized-lists@0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: '@types/react': 19.2.17 @@ -5336,16 +5471,16 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3))(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@10.2.2))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@10.2.2) - eslint: 8.57.1 + eslint: 8.57.1(supports-color@10.2.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -5356,14 +5491,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@10.2.2)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@10.2.2) - eslint: 8.57.1 + eslint: 8.57.1(supports-color@10.2.2) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -5374,12 +5509,12 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1(supports-color@10.2.2))(supports-color@10.2.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@10.2.2)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@10.2.2))(typescript@5.9.3) debug: 4.4.3(supports-color@10.2.2) - eslint: 8.57.1 + eslint: 8.57.1(supports-color@10.2.2) ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -5388,7 +5523,7 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@6.21.0(supports-color@10.2.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -5403,15 +5538,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1(supports-color@10.2.2))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1(supports-color@10.2.2)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@10.2.2)(typescript@5.9.3) + eslint: 8.57.1(supports-color@10.2.2) semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -5568,11 +5703,11 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7)(supports-color@10.2.2): dependencies: '@babel/compat-data': 7.29.7 '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7)(supports-color@10.2.2) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -5580,7 +5715,7 @@ snapshots: babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7): dependencies: '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7)(supports-color@10.2.2) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color @@ -5588,7 +5723,7 @@ snapshots: babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): dependencies: '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7)(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -5612,7 +5747,7 @@ snapshots: transitivePeerDependencies: - '@babel/core' - babel-preset-expo@57.0.1(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.1)(react-refresh@0.14.2): + babel-preset-expo@57.0.1(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.1)(react-refresh@0.14.2)(supports-color@10.2.2): dependencies: '@babel/generator': 7.29.7 '@babel/helper-module-imports': 7.29.7 @@ -5646,7 +5781,7 @@ snapshots: '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) @@ -5659,7 +5794,7 @@ snapshots: react-refresh: 0.14.2 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -6106,11 +6241,11 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1(supports-color@10.2.2)): dependencies: - eslint: 8.57.1 + eslint: 8.57.1(supports-color@10.2.2) - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@8.57.1(supports-color@10.2.2)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -6118,7 +6253,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 8.57.1 + eslint: 8.57.1(supports-color@10.2.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -6139,13 +6274,13 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint@8.57.1(supports-color@10.2.2): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1(supports-color@10.2.2)) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 + '@eslint/eslintrc': 2.1.4(supports-color@10.2.2) '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/config-array': 0.13.0(supports-color@10.2.2) '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.3.0 @@ -6204,40 +6339,40 @@ snapshots: event-target-shim@5.0.1: {} - expo-asset@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + expo-asset@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.0(typescript@6.0.3) - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - typescript - expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)): + expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)): dependencies: '@expo/env': 2.4.0 - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - expo-file-system@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)): + expo-file-system@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)): dependencies: - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) - expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3): dependencies: - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) fontfaceobserver: 2.3.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) expo-keep-awake@57.0.0(expo@57.0.1)(react@19.2.3): dependencies: - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 expo-modules-autolinking@57.0.3(typescript@6.0.3): @@ -6250,54 +6385,54 @@ snapshots: - supports-color - typescript - expo-modules-core@57.0.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + expo-modules-core@57.0.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3): dependencies: '@expo/expo-modules-macros-plugin': 0.3.0 - expo-modules-jsi: 57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)) + expo-modules-jsi: 57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)) invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) - expo-modules-jsi@57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)): + expo-modules-jsi@57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)): dependencies: - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) expo-server@57.0.0: {} - expo-status-bar@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3): + expo-status-bar@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3): dependencies: - expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) - expo@57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + expo@57.0.1(@babel/core@7.29.7)(@expo/dom-webview@57.0.0)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 57.0.3(@expo/dom-webview@57.0.0)(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3))(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + '@expo/cli': 57.0.3(@expo/dom-webview@57.0.0)(expo-constants@57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)))(expo-font@57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3))(expo@57.0.1)(react-dom@19.2.7(react@19.2.3))(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) '@expo/config': 57.0.1(typescript@6.0.3) '@expo/config-plugins': 57.0.1(typescript@6.0.3) - '@expo/devtools': 57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) - '@expo/fingerprint': 0.20.1 + '@expo/devtools': 57.0.0(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) + '@expo/fingerprint': 0.20.1(supports-color@10.2.2) '@expo/local-build-cache-provider': 57.0.1(typescript@6.0.3) - '@expo/log-box': 57.0.0(@expo/dom-webview@57.0.0)(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@expo/log-box': 57.0.0(@expo/dom-webview@57.0.0)(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) '@expo/metro': 56.0.0 '@expo/metro-config': 57.0.2(expo@57.0.1)(typescript@6.0.3) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 57.0.1(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.1)(react-refresh@0.14.2) - expo-asset: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)) - expo-file-system: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)) - expo-font: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + babel-preset-expo: 57.0.1(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.1)(react-refresh@0.14.2)(supports-color@10.2.2) + expo-asset: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3)(typescript@6.0.3) + expo-constants: 57.0.2(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)) + expo-file-system: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2)) + expo-font: 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) expo-keep-awake: 57.0.0(expo@57.0.1)(react@19.2.3) expo-modules-autolinking: 57.0.3(typescript@6.0.3) - expo-modules-core: 57.0.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + expo-modules-core: 57.0.1(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) pretty-format: 29.7.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3) + react-native: 0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2) react-refresh: 0.14.2 whatwg-url-minimum: 0.1.2 optionalDependencies: - '@expo/dom-webview': 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@expo/dom-webview': 57.0.0(expo@57.0.1)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) react-dom: 19.2.7(react@19.2.3) transitivePeerDependencies: - '@babel/core' @@ -7344,6 +7479,11 @@ snapshots: pngjs@3.4.0: {} + polygon-clipping@0.15.7: + dependencies: + robust-predicates: 3.0.3 + splaytree: 3.2.3 + possible-typed-array-names@1.1.0: {} postcss-load-config@6.0.1(postcss@8.5.15)(yaml@2.9.0): @@ -7427,15 +7567,15 @@ snapshots: react-is@18.3.1: {} - react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3): + react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2): dependencies: '@react-native/assets-registry': 0.86.0 '@react-native/codegen': 0.86.0(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.86.0 + '@react-native/community-cli-plugin': 0.86.0(supports-color@10.2.2) '@react-native/gradle-plugin': 0.86.0 '@react-native/js-polyfills': 0.86.0 '@react-native/normalize-colors': 0.86.0 - '@react-native/virtualized-lists': 0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3))(react@19.2.3) + '@react-native/virtualized-lists': 0.86.0(@types/react@19.2.17)(react-native@0.86.0(@babel/core@7.29.7)(@types/react@19.2.17)(react@19.2.3)(supports-color@10.2.2))(react@19.2.3) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -7476,7 +7616,7 @@ snapshots: dependencies: '@react-native/assets-registry': 0.86.0 '@react-native/codegen': 0.86.0(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.86.0 + '@react-native/community-cli-plugin': 0.86.0(supports-color@10.2.2) '@react-native/gradle-plugin': 0.86.0 '@react-native/js-polyfills': 0.86.0 '@react-native/normalize-colors': 0.86.0 @@ -7624,6 +7764,8 @@ snapshots: dependencies: glob: 7.2.3 + robust-predicates@3.0.3: {} + rollup@4.62.0: dependencies: '@types/estree': 1.0.9 @@ -7839,6 +7981,8 @@ snapshots: source-map@0.7.6: {} + splaytree@3.2.3: {} + stackframe@1.3.4: {} stacktrace-parser@0.1.11: @@ -8022,7 +8166,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsup@8.5.1(postcss@8.5.15)(typescript@5.9.3)(yaml@2.9.0): + tsup@8.5.1(postcss@8.5.15)(supports-color@10.2.2)(typescript@5.9.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 37f53e2..7e6dd84 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,8 +2,14 @@ packages: - 'js-sdk-core' - 'js-sdk-react' - 'js-sdk-reactnative' + - 'react-icons' - 'react-for-googlemaps' - 'react-for-maplibre' + - 'react-geojson-layer' + - 'react-heatmap' + - 'react-marker-clustering' - 'reactnative-for-googlemaps' - 'reactnative-for-maplibre' - 'examples/*' +allowBuilds: + esbuild: true diff --git a/react-for-googlemaps b/react-for-googlemaps index 8f1851e..6b67cca 160000 --- a/react-for-googlemaps +++ b/react-for-googlemaps @@ -1 +1 @@ -Subproject commit 8f1851e4716cff980f2ed701269b250abdab469d +Subproject commit 6b67ccafcaaee68eb973df0d87232678c657f62e diff --git a/react-for-maplibre b/react-for-maplibre index 2cc14f9..9547ddb 160000 --- a/react-for-maplibre +++ b/react-for-maplibre @@ -1 +1 @@ -Subproject commit 2cc14f91de6a4de5aa77117f12c8145c655ae579 +Subproject commit 9547ddbcbf2c9e45a380b5b3ee1f3c7983d01126 diff --git a/react-geojson-layer b/react-geojson-layer new file mode 160000 index 0000000..957ff9b --- /dev/null +++ b/react-geojson-layer @@ -0,0 +1 @@ +Subproject commit 957ff9b8063972804b2c25e8578bc51f4295082d diff --git a/react-heatmap b/react-heatmap new file mode 160000 index 0000000..7c6bd04 --- /dev/null +++ b/react-heatmap @@ -0,0 +1 @@ +Subproject commit 7c6bd0496db8990258b95d3297ceab04b294e325 diff --git a/react-icons b/react-icons new file mode 160000 index 0000000..2bffc55 --- /dev/null +++ b/react-icons @@ -0,0 +1 @@ +Subproject commit 2bffc55b9493f082993e88985fbfb61b959c0887 diff --git a/react-marker-clustering b/react-marker-clustering new file mode 160000 index 0000000..092e3b7 --- /dev/null +++ b/react-marker-clustering @@ -0,0 +1 @@ +Subproject commit 092e3b7e1d4e34ada14dd834994098e98d60c660 diff --git a/scripts/commit-all.sh b/scripts/commit-all.sh index 11b4aa3..63825e5 100755 --- a/scripts/commit-all.sh +++ b/scripts/commit-all.sh @@ -33,7 +33,13 @@ git-claude-commit() { if [ -n "$msg" ]; then echo -e "\ncommit message:\n$msg\n" git commit -m "$msg" - git push + local branch + branch=$(git branch --show-current) + if [ -z "$branch" ]; then + echo "Error: Failed to detect current branch." + return $FALSE + fi + git push -u origin "$branch" else echo "Error: Failed to generate commit message." return $FALSE