@next-degree/pickle-shared-js 0.12.7 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{company_service_sanity-2J1ZuUnu.d.cts → company_service_sanity-ByIKe90u.d.cts} +560 -560
- package/dist/{company_service_sanity-KaAGfnNV.d.ts → company_service_sanity-DbYwWmnS.d.ts} +560 -560
- package/dist/components/buttons/BackButton.cjs +5 -8
- package/dist/components/buttons/BackButton.cjs.map +1 -1
- package/dist/components/buttons/BackButton.d.cts +2 -2
- package/dist/components/buttons/BackButton.d.ts +2 -2
- package/dist/components/buttons/BackButton.js +5 -8
- package/dist/components/buttons/BackButton.js.map +1 -1
- package/dist/components/company/CompanyBenefits.cjs +1 -5
- package/dist/components/company/CompanyBenefits.cjs.map +1 -1
- package/dist/components/company/CompanyBenefits.d.cts +2 -2
- package/dist/components/company/CompanyBenefits.d.ts +2 -2
- package/dist/components/company/CompanyBenefits.js +1 -5
- package/dist/components/company/CompanyBenefits.js.map +1 -1
- package/dist/components/company/CompanyInformation.cjs +23 -44
- package/dist/components/company/CompanyInformation.cjs.map +1 -1
- package/dist/components/company/CompanyInformation.d.cts +2 -2
- package/dist/components/company/CompanyInformation.d.ts +2 -2
- package/dist/components/company/CompanyInformation.js +23 -44
- package/dist/components/company/CompanyInformation.js.map +1 -1
- package/dist/components/company/CompanyTake.cjs +12 -26
- package/dist/components/company/CompanyTake.cjs.map +1 -1
- package/dist/components/company/CompanyTake.d.cts +2 -2
- package/dist/components/company/CompanyTake.d.ts +2 -2
- package/dist/components/company/CompanyTake.js +12 -26
- package/dist/components/company/CompanyTake.js.map +1 -1
- package/dist/components/jobCard/JobLocation.cjs +23 -34
- package/dist/components/jobCard/JobLocation.cjs.map +1 -1
- package/dist/components/jobCard/JobLocation.d.cts +3 -3
- package/dist/components/jobCard/JobLocation.d.ts +3 -3
- package/dist/components/jobCard/JobLocation.js +23 -34
- package/dist/components/jobCard/JobLocation.js.map +1 -1
- package/dist/components/jobPost/JobDescription.cjs +164 -30
- package/dist/components/jobPost/JobDescription.cjs.map +1 -1
- package/dist/components/jobPost/JobDescription.d.cts +2 -2
- package/dist/components/jobPost/JobDescription.d.ts +2 -2
- package/dist/components/jobPost/JobDescription.js +164 -30
- package/dist/components/jobPost/JobDescription.js.map +1 -1
- package/dist/components/jobPost/JobHeader.cjs +110 -138
- package/dist/components/jobPost/JobHeader.cjs.map +1 -1
- package/dist/components/jobPost/JobHeader.d.cts +2 -2
- package/dist/components/jobPost/JobHeader.d.ts +2 -2
- package/dist/components/jobPost/JobHeader.js +110 -138
- package/dist/components/jobPost/JobHeader.js.map +1 -1
- package/dist/components/jobPost/JobPost.cjs +382 -318
- package/dist/components/jobPost/JobPost.cjs.map +1 -1
- package/dist/components/jobPost/JobPost.d.cts +3 -3
- package/dist/components/jobPost/JobPost.d.ts +3 -3
- package/dist/components/jobPost/JobPost.js +344 -280
- package/dist/components/jobPost/JobPost.js.map +1 -1
- package/dist/components/primitives/avatar.cjs +3 -4
- package/dist/components/primitives/avatar.cjs.map +1 -1
- package/dist/components/primitives/avatar.js +3 -4
- package/dist/components/primitives/avatar.js.map +1 -1
- package/dist/components/primitives/command.cjs +37 -50
- package/dist/components/primitives/command.cjs.map +1 -1
- package/dist/components/primitives/command.d.cts +5 -6
- package/dist/components/primitives/command.d.ts +5 -6
- package/dist/components/primitives/command.js +37 -50
- package/dist/components/primitives/command.js.map +1 -1
- package/dist/components/primitives/dialog.cjs +18 -27
- package/dist/components/primitives/dialog.cjs.map +1 -1
- package/dist/components/primitives/dialog.d.cts +2 -3
- package/dist/components/primitives/dialog.d.ts +2 -3
- package/dist/components/primitives/dialog.js +18 -27
- package/dist/components/primitives/dialog.js.map +1 -1
- package/dist/components/primitives/input-otp.cjs +8 -11
- package/dist/components/primitives/input-otp.cjs.map +1 -1
- package/dist/components/primitives/input-otp.d.cts +2 -2
- package/dist/components/primitives/input-otp.d.ts +2 -2
- package/dist/components/primitives/input-otp.js +8 -11
- package/dist/components/primitives/input-otp.js.map +1 -1
- package/dist/components/primitives/popover.cjs +2 -3
- package/dist/components/primitives/popover.cjs.map +1 -1
- package/dist/components/primitives/popover.js +2 -3
- package/dist/components/primitives/popover.js.map +1 -1
- package/dist/components/primitives/radio-group.cjs +12 -16
- package/dist/components/primitives/radio-group.cjs.map +1 -1
- package/dist/components/primitives/radio-group.js +12 -16
- package/dist/components/primitives/radio-group.js.map +1 -1
- package/dist/components/primitives/separator.cjs +1 -2
- package/dist/components/primitives/separator.cjs.map +1 -1
- package/dist/components/primitives/separator.js +1 -2
- package/dist/components/primitives/separator.js.map +1 -1
- package/dist/components/primitives/tooltip.cjs +1 -2
- package/dist/components/primitives/tooltip.cjs.map +1 -1
- package/dist/components/primitives/tooltip.js +1 -2
- package/dist/components/primitives/tooltip.js.map +1 -1
- package/dist/components/ui/Avatar.cjs +6 -11
- package/dist/components/ui/Avatar.cjs.map +1 -1
- package/dist/components/ui/Avatar.d.cts +3 -3
- package/dist/components/ui/Avatar.d.ts +3 -3
- package/dist/components/ui/Avatar.js +6 -11
- package/dist/components/ui/Avatar.js.map +1 -1
- package/dist/components/ui/Badge.cjs +12 -2
- package/dist/components/ui/Badge.cjs.map +1 -1
- package/dist/components/ui/Badge.d.cts +1 -2
- package/dist/components/ui/Badge.d.ts +1 -2
- package/dist/components/ui/Badge.js +2 -2
- package/dist/components/ui/Badge.js.map +1 -1
- package/dist/components/ui/Button.cjs +163 -8
- package/dist/components/ui/Button.cjs.map +1 -1
- package/dist/components/ui/Button.d.cts +4 -8
- package/dist/components/ui/Button.d.ts +4 -8
- package/dist/components/ui/Button.js +153 -8
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Checkbox.cjs +18 -28
- package/dist/components/ui/Checkbox.cjs.map +1 -1
- package/dist/components/ui/Checkbox.js +18 -28
- package/dist/components/ui/Checkbox.js.map +1 -1
- package/dist/components/ui/Chip.cjs +12 -2
- package/dist/components/ui/Chip.cjs.map +1 -1
- package/dist/components/ui/Chip.d.cts +1 -2
- package/dist/components/ui/Chip.d.ts +1 -2
- package/dist/components/ui/Chip.js +2 -2
- package/dist/components/ui/Chip.js.map +1 -1
- package/dist/components/ui/Combobox.cjs +171 -233
- package/dist/components/ui/Combobox.cjs.map +1 -1
- package/dist/components/ui/Combobox.js +171 -233
- package/dist/components/ui/Combobox.js.map +1 -1
- package/dist/components/ui/Counter.cjs +56 -74
- package/dist/components/ui/Counter.cjs.map +1 -1
- package/dist/components/ui/Counter.js +56 -74
- package/dist/components/ui/Counter.js.map +1 -1
- package/dist/components/ui/DatePicker.cjs +44 -68
- package/dist/components/ui/DatePicker.cjs.map +1 -1
- package/dist/components/ui/DatePicker.js +44 -68
- package/dist/components/ui/DatePicker.js.map +1 -1
- package/dist/components/ui/DismissibleBanner.cjs +13 -16
- package/dist/components/ui/DismissibleBanner.cjs.map +1 -1
- package/dist/components/ui/DismissibleBanner.d.cts +2 -2
- package/dist/components/ui/DismissibleBanner.d.ts +2 -2
- package/dist/components/ui/DismissibleBanner.js +13 -16
- package/dist/components/ui/DismissibleBanner.js.map +1 -1
- package/dist/components/ui/ErrorMessage.cjs +1 -2
- package/dist/components/ui/ErrorMessage.cjs.map +1 -1
- package/dist/components/ui/ErrorMessage.d.cts +2 -2
- package/dist/components/ui/ErrorMessage.d.ts +2 -2
- package/dist/components/ui/ErrorMessage.js +1 -2
- package/dist/components/ui/ErrorMessage.js.map +1 -1
- package/dist/components/ui/Icon.cjs +1 -2
- package/dist/components/ui/Icon.cjs.map +1 -1
- package/dist/components/ui/Icon.js +1 -2
- package/dist/components/ui/Icon.js.map +1 -1
- package/dist/components/ui/Input.cjs +48 -68
- package/dist/components/ui/Input.cjs.map +1 -1
- package/dist/components/ui/Input.js +48 -68
- package/dist/components/ui/Input.js.map +1 -1
- package/dist/components/ui/InputOtp.cjs +56 -73
- package/dist/components/ui/InputOtp.cjs.map +1 -1
- package/dist/components/ui/InputOtp.js +56 -73
- package/dist/components/ui/InputOtp.js.map +1 -1
- package/dist/components/ui/Label.cjs +14 -24
- package/dist/components/ui/Label.cjs.map +1 -1
- package/dist/components/ui/Label.d.cts +2 -2
- package/dist/components/ui/Label.d.ts +2 -2
- package/dist/components/ui/Label.js +14 -24
- package/dist/components/ui/Label.js.map +1 -1
- package/dist/components/ui/LinkButton.cjs +5 -5
- package/dist/components/ui/LinkButton.cjs.map +1 -1
- package/dist/components/ui/LinkButton.d.cts +1 -2
- package/dist/components/ui/LinkButton.d.ts +1 -2
- package/dist/components/ui/LinkButton.js +5 -5
- package/dist/components/ui/LinkButton.js.map +1 -1
- package/dist/components/ui/ListItem.cjs +32 -48
- package/dist/components/ui/ListItem.cjs.map +1 -1
- package/dist/components/ui/ListItem.d.cts +2 -2
- package/dist/components/ui/ListItem.d.ts +2 -2
- package/dist/components/ui/ListItem.js +32 -48
- package/dist/components/ui/ListItem.js.map +1 -1
- package/dist/components/ui/Map/ClusterMarker.cjs +80 -0
- package/dist/components/ui/Map/ClusterMarker.cjs.map +1 -0
- package/dist/components/ui/Map/ClusterMarker.d.cts +6 -0
- package/dist/components/ui/Map/ClusterMarker.d.ts +6 -0
- package/dist/components/ui/Map/ClusterMarker.js +56 -0
- package/dist/components/ui/Map/ClusterMarker.js.map +1 -0
- package/dist/components/ui/Map/FocusCircle.cjs +86 -0
- package/dist/components/ui/Map/FocusCircle.cjs.map +1 -0
- package/dist/components/ui/Map/FocusCircle.d.cts +5 -0
- package/dist/components/ui/Map/FocusCircle.d.ts +5 -0
- package/dist/components/ui/Map/FocusCircle.js +62 -0
- package/dist/components/ui/Map/FocusCircle.js.map +1 -0
- package/dist/components/ui/Map/IndividualMarker.cjs +60 -0
- package/dist/components/ui/Map/IndividualMarker.cjs.map +1 -0
- package/dist/components/ui/Map/IndividualMarker.d.cts +6 -0
- package/dist/components/ui/Map/IndividualMarker.d.ts +6 -0
- package/dist/components/ui/Map/IndividualMarker.js +36 -0
- package/dist/components/ui/Map/IndividualMarker.js.map +1 -0
- package/dist/components/ui/Map/MapComponent.cjs +401 -0
- package/dist/components/ui/Map/MapComponent.cjs.map +1 -0
- package/dist/components/ui/Map/MapComponent.d.cts +6 -0
- package/dist/components/ui/Map/MapComponent.d.ts +6 -0
- package/dist/components/ui/Map/MapComponent.js +367 -0
- package/dist/components/ui/Map/MapComponent.js.map +1 -0
- package/dist/components/ui/Map/MapContent.cjs +279 -0
- package/dist/components/ui/Map/MapContent.cjs.map +1 -0
- package/dist/components/ui/Map/MapContent.d.cts +6 -0
- package/dist/components/ui/Map/MapContent.d.ts +6 -0
- package/dist/components/ui/Map/MapContent.js +255 -0
- package/dist/components/ui/Map/MapContent.js.map +1 -0
- package/dist/components/ui/Map/clustering.cjs +105 -0
- package/dist/components/ui/Map/clustering.cjs.map +1 -0
- package/dist/components/ui/Map/clustering.d.cts +17 -0
- package/dist/components/ui/Map/clustering.d.ts +17 -0
- package/dist/components/ui/Map/clustering.js +77 -0
- package/dist/components/ui/Map/clustering.js.map +1 -0
- package/dist/components/ui/Map/constants.cjs +65 -0
- package/dist/components/ui/Map/constants.cjs.map +1 -0
- package/dist/components/ui/Map/constants.d.cts +28 -0
- package/dist/components/ui/Map/constants.d.ts +28 -0
- package/dist/components/ui/Map/constants.js +34 -0
- package/dist/components/ui/Map/constants.js.map +1 -0
- package/dist/components/ui/Map/hooks.cjs +96 -0
- package/dist/components/ui/Map/hooks.cjs.map +1 -0
- package/dist/components/ui/Map/hooks.d.cts +17 -0
- package/dist/components/ui/Map/hooks.d.ts +17 -0
- package/dist/components/ui/Map/hooks.js +59 -0
- package/dist/components/ui/Map/hooks.js.map +1 -0
- package/dist/components/ui/Map/index.cjs +402 -0
- package/dist/components/ui/Map/index.cjs.map +1 -0
- package/dist/components/ui/Map/index.d.cts +3 -0
- package/dist/components/ui/Map/index.d.ts +3 -0
- package/dist/components/ui/Map/index.js +365 -0
- package/dist/components/ui/Map/index.js.map +1 -0
- package/dist/components/ui/Map/types.cjs +19 -0
- package/dist/components/ui/Map/types.cjs.map +1 -0
- package/dist/components/ui/Map/types.d.cts +82 -0
- package/dist/components/ui/Map/types.d.ts +82 -0
- package/dist/components/ui/Map/types.js +1 -0
- package/dist/components/ui/Map/types.js.map +1 -0
- package/dist/components/ui/Map/utils.cjs +80 -0
- package/dist/components/ui/Map/utils.cjs.map +1 -0
- package/dist/components/ui/Map/utils.d.cts +9 -0
- package/dist/components/ui/Map/utils.d.ts +9 -0
- package/dist/components/ui/Map/utils.js +49 -0
- package/dist/components/ui/Map/utils.js.map +1 -0
- package/dist/components/ui/PlacesQueryInput.cjs +71 -94
- package/dist/components/ui/PlacesQueryInput.cjs.map +1 -1
- package/dist/components/ui/PlacesQueryInput.d.cts +2 -2
- package/dist/components/ui/PlacesQueryInput.d.ts +2 -2
- package/dist/components/ui/PlacesQueryInput.js +71 -94
- package/dist/components/ui/PlacesQueryInput.js.map +1 -1
- package/dist/components/ui/Radio.cjs +49 -69
- package/dist/components/ui/Radio.cjs.map +1 -1
- package/dist/components/ui/Radio.js +49 -69
- package/dist/components/ui/Radio.js.map +1 -1
- package/dist/components/ui/ReadMore.cjs +163 -25
- package/dist/components/ui/ReadMore.cjs.map +1 -1
- package/dist/components/ui/ReadMore.d.cts +2 -2
- package/dist/components/ui/ReadMore.d.ts +2 -2
- package/dist/components/ui/ReadMore.js +163 -25
- package/dist/components/ui/ReadMore.js.map +1 -1
- package/dist/components/ui/Select.cjs +138 -172
- package/dist/components/ui/Select.cjs.map +1 -1
- package/dist/components/ui/Select.js +132 -166
- package/dist/components/ui/Select.js.map +1 -1
- package/dist/components/ui/StepTabs.cjs +24 -27
- package/dist/components/ui/StepTabs.cjs.map +1 -1
- package/dist/components/ui/StepTabs.d.cts +3 -3
- package/dist/components/ui/StepTabs.d.ts +3 -3
- package/dist/components/ui/StepTabs.js +24 -27
- package/dist/components/ui/StepTabs.js.map +1 -1
- package/dist/components/ui/Switch.cjs +13 -21
- package/dist/components/ui/Switch.cjs.map +1 -1
- package/dist/components/ui/Switch.js +13 -21
- package/dist/components/ui/Switch.js.map +1 -1
- package/dist/components/ui/buttonShadcn.cjs +1 -2
- package/dist/components/ui/buttonShadcn.cjs.map +1 -1
- package/dist/components/ui/buttonShadcn.d.cts +1 -1
- package/dist/components/ui/buttonShadcn.d.ts +1 -1
- package/dist/components/ui/buttonShadcn.js +1 -2
- package/dist/components/ui/buttonShadcn.js.map +1 -1
- package/dist/components/ui/calendar.cjs +5 -6
- package/dist/components/ui/calendar.cjs.map +1 -1
- package/dist/components/ui/calendar.d.cts +1 -2
- package/dist/components/ui/calendar.d.ts +1 -2
- package/dist/components/ui/calendar.js +5 -6
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/contexts/WindowHistoryProvider.cjs +1 -2
- package/dist/contexts/WindowHistoryProvider.cjs.map +1 -1
- package/dist/contexts/WindowHistoryProvider.d.cts +1 -2
- package/dist/contexts/WindowHistoryProvider.d.ts +1 -2
- package/dist/contexts/WindowHistoryProvider.js +1 -2
- package/dist/contexts/WindowHistoryProvider.js.map +1 -1
- package/dist/{displayText-DahwdHdi.d.ts → displayText-Ce_aqgGP.d.ts} +2 -2
- package/dist/{displayText-DW0qiJqh.d.cts → displayText-Cm8PqS6s.d.cts} +2 -2
- package/dist/hooks/useDisplayText.d.cts +3 -3
- package/dist/hooks/useDisplayText.d.ts +3 -3
- package/dist/hooks/useWindowHistory.cjs +0 -1
- package/dist/hooks/useWindowHistory.cjs.map +1 -1
- package/dist/hooks/useWindowHistory.d.cts +0 -1
- package/dist/hooks/useWindowHistory.d.ts +0 -1
- package/dist/hooks/useWindowHistory.js +0 -1
- package/dist/hooks/useWindowHistory.js.map +1 -1
- package/dist/index.cjs +1343 -1111
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +1293 -1061
- package/dist/index.js.map +1 -1
- package/dist/{job_posting_service_sanity-BKo9TBDT.d.ts → job_posting_service_sanity-1eG3Jh9_.d.ts} +496 -496
- package/dist/{job_posting_service_sanity-BNq-Am9N.d.cts → job_posting_service_sanity-DKYye6oH.d.cts} +496 -496
- package/dist/lib/locations.d.cts +3 -3
- package/dist/lib/locations.d.ts +3 -3
- package/dist/lib/mappings.d.cts +3 -3
- package/dist/lib/mappings.d.ts +3 -3
- package/dist/lib/salaryRange.d.cts +1 -1
- package/dist/lib/salaryRange.d.ts +1 -1
- package/dist/services/displayText.d.cts +3 -3
- package/dist/services/displayText.d.ts +3 -3
- package/dist/styles/globals.css +179 -6
- package/dist/styles/globals.css.map +1 -1
- package/dist/types/data/company_service_latest.d.cts +1 -1
- package/dist/types/data/company_service_latest.d.ts +1 -1
- package/dist/types/data/job_posting_service_latest.d.cts +1 -1
- package/dist/types/data/job_posting_service_latest.d.ts +1 -1
- package/dist/types/data/shared_pickle_output_latest.d.cts +1 -1
- package/dist/types/data/shared_pickle_output_latest.d.ts +1 -1
- package/dist/types/index.d.cts +6 -6
- package/dist/types/index.d.ts +6 -6
- package/dist/types/latest/company_service_latest.d.cts +1 -1
- package/dist/types/latest/company_service_latest.d.ts +1 -1
- package/dist/types/latest/custom/company_service_sanity.d.cts +3 -3
- package/dist/types/latest/custom/company_service_sanity.d.ts +3 -3
- package/dist/types/latest/custom/job_posting_service_sanity.d.cts +3 -3
- package/dist/types/latest/custom/job_posting_service_sanity.d.ts +3 -3
- package/dist/types/latest/job_posting_service_latest.d.cts +1 -1
- package/dist/types/latest/job_posting_service_latest.d.ts +1 -1
- package/dist/types/latest/shared_pickle_output_latest.d.cts +1 -1
- package/dist/types/latest/shared_pickle_output_latest.d.ts +1 -1
- package/package.json +5 -3
- package/dist/components/ui/MapComponent.cjs +0 -61
- package/dist/components/ui/MapComponent.cjs.map +0 -1
- package/dist/components/ui/MapComponent.d.cts +0 -15
- package/dist/components/ui/MapComponent.d.ts +0 -15
- package/dist/components/ui/MapComponent.js +0 -41
- package/dist/components/ui/MapComponent.js.map +0 -1
- package/dist/{company_service_latest-CITz7F53.d.cts → company_service_latest-BjyG4KCB.d.cts} +319 -319
- package/dist/{company_service_latest-CITz7F53.d.ts → company_service_latest-BjyG4KCB.d.ts} +319 -319
- package/dist/{company_service_latest-C7Moeufo.d.cts → company_service_latest-KJi2W9Ij.d.cts} +319 -319
- package/dist/{company_service_latest-C7Moeufo.d.ts → company_service_latest-KJi2W9Ij.d.ts} +319 -319
- package/dist/{job_posting_service_latest-DdgK8Nnz.d.cts → job_posting_service_latest-82DHqOGu.d.cts} +274 -274
- package/dist/{job_posting_service_latest-DdgK8Nnz.d.ts → job_posting_service_latest-82DHqOGu.d.ts} +274 -274
- package/dist/{job_posting_service_latest-C_TEBzCf.d.cts → job_posting_service_latest-D9I5NE7l.d.cts} +274 -274
- package/dist/{job_posting_service_latest-C_TEBzCf.d.ts → job_posting_service_latest-D9I5NE7l.d.ts} +274 -274
- package/dist/{shared_pickle_output_latest-CtvHTPeX.d.cts → shared_pickle_output_latest-YbRs_xtC.d.cts} +22 -22
- package/dist/{shared_pickle_output_latest-CtvHTPeX.d.ts → shared_pickle_output_latest-YbRs_xtC.d.ts} +22 -22
- package/dist/{shared_pickle_output_latest-CXBCG04N.d.cts → shared_pickle_output_latest-dO-t8iZx.d.cts} +22 -22
- package/dist/{shared_pickle_output_latest-CXBCG04N.d.ts → shared_pickle_output_latest-dO-t8iZx.d.ts} +22 -22
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
// src/components/ui/Map/MapComponent.tsx
|
|
2
|
+
import { APIProvider } from "@vis.gl/react-google-maps";
|
|
3
|
+
|
|
4
|
+
// src/components/ui/Map/constants.ts
|
|
5
|
+
var DEFAULT_POSITION = { lat: 40.715021, lng: -74.00459 };
|
|
6
|
+
var DEFAULT_ZOOM = 10;
|
|
7
|
+
var CLUSTER_DISTANCE_THRESHOLD = 1e-3;
|
|
8
|
+
var PIN_COLORS = {
|
|
9
|
+
background: "#0B5441",
|
|
10
|
+
borderColor: "#EBFDF1",
|
|
11
|
+
glyphColor: "#D4F500"
|
|
12
|
+
};
|
|
13
|
+
var FOCUS_CIRCLE_STYLES = {
|
|
14
|
+
strokeColor: "#0B5441",
|
|
15
|
+
strokeOpacity: 0.8,
|
|
16
|
+
strokeWeight: 2,
|
|
17
|
+
fillColor: "#0B5441",
|
|
18
|
+
fillOpacity: 0.1,
|
|
19
|
+
clickable: false,
|
|
20
|
+
zIndex: 1
|
|
21
|
+
};
|
|
22
|
+
var CLUSTERING_CONFIG = {
|
|
23
|
+
radius: 60,
|
|
24
|
+
maxZoom: 16,
|
|
25
|
+
minPoints: 2
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// src/components/ui/Map/hooks.ts
|
|
29
|
+
import { useMemo, useState } from "react";
|
|
30
|
+
import useSupercluster from "use-supercluster";
|
|
31
|
+
|
|
32
|
+
// src/components/ui/Map/utils.ts
|
|
33
|
+
function getCenterForCoordinates(coords) {
|
|
34
|
+
if (coords.length === 0) return DEFAULT_POSITION;
|
|
35
|
+
const avgLat = coords.reduce((sum, coord) => sum + coord.lat, 0) / coords.length;
|
|
36
|
+
const avgLng = coords.reduce((sum, coord) => sum + coord.lng, 0) / coords.length;
|
|
37
|
+
return { lat: avgLat, lng: avgLng };
|
|
38
|
+
}
|
|
39
|
+
function getZoomForCoordinates(coords, defaultZoom) {
|
|
40
|
+
if (coords.length <= 1) return defaultZoom;
|
|
41
|
+
const lats = coords.map((coord) => coord.lat);
|
|
42
|
+
const lngs = coords.map((coord) => coord.lng);
|
|
43
|
+
const latDiff = Math.max(...lats) - Math.min(...lats);
|
|
44
|
+
const lngDiff = Math.max(...lngs) - Math.min(...lngs);
|
|
45
|
+
const maxDiff = Math.max(latDiff, lngDiff);
|
|
46
|
+
if (maxDiff > 0.1) return 8;
|
|
47
|
+
if (maxDiff > 0.05) return 10;
|
|
48
|
+
if (maxDiff > 0.01) return 12;
|
|
49
|
+
return 14;
|
|
50
|
+
}
|
|
51
|
+
function filterClusterCoordinates(coordinates, clusterLat, clusterLng) {
|
|
52
|
+
return coordinates.filter((coord) => {
|
|
53
|
+
const latDiff = Math.abs(coord.lat - clusterLat);
|
|
54
|
+
const lngDiff = Math.abs(coord.lng - clusterLng);
|
|
55
|
+
const distance = Math.sqrt(latDiff * latDiff + lngDiff * lngDiff);
|
|
56
|
+
return distance < CLUSTER_DISTANCE_THRESHOLD;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/components/ui/Map/clustering.ts
|
|
61
|
+
function convertCoordinatesToGeoJSON(coordinates) {
|
|
62
|
+
return coordinates.map((coord, index) => ({
|
|
63
|
+
type: "Feature",
|
|
64
|
+
properties: {
|
|
65
|
+
cluster: false,
|
|
66
|
+
pointId: index,
|
|
67
|
+
data: coord.data
|
|
68
|
+
},
|
|
69
|
+
geometry: {
|
|
70
|
+
type: "Point",
|
|
71
|
+
coordinates: [coord.lng, coord.lat]
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/components/ui/Map/hooks.ts
|
|
77
|
+
function useMapBounds(_coordinates) {
|
|
78
|
+
const [bounds, setBounds] = useState([
|
|
79
|
+
[-180, -85],
|
|
80
|
+
[180, 85]
|
|
81
|
+
]);
|
|
82
|
+
return { bounds, setBounds };
|
|
83
|
+
}
|
|
84
|
+
function useZoomLevel(initialZoom) {
|
|
85
|
+
const [zoomLevel, setZoomLevel] = useState(initialZoom);
|
|
86
|
+
return { zoomLevel, setZoomLevel };
|
|
87
|
+
}
|
|
88
|
+
function useClusters(coordinates, bounds, zoomLevel) {
|
|
89
|
+
const points = useMemo(() => {
|
|
90
|
+
if (!coordinates) return [];
|
|
91
|
+
return convertCoordinatesToGeoJSON(coordinates);
|
|
92
|
+
}, [coordinates]);
|
|
93
|
+
const { clusters, supercluster } = useSupercluster({
|
|
94
|
+
points,
|
|
95
|
+
bounds: [-180, -85, 180, 85],
|
|
96
|
+
// Use global bounds for consistency
|
|
97
|
+
zoom: zoomLevel || 10,
|
|
98
|
+
options: CLUSTERING_CONFIG
|
|
99
|
+
});
|
|
100
|
+
return { clusters, supercluster };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/components/ui/Map/MapContent.tsx
|
|
104
|
+
import { AdvancedMarker as AdvancedMarker3, Map, Pin as Pin2, useMap, useMapsLibrary } from "@vis.gl/react-google-maps";
|
|
105
|
+
import { useCallback } from "react";
|
|
106
|
+
|
|
107
|
+
// src/components/ui/Map/ClusterMarker.tsx
|
|
108
|
+
import { AdvancedMarker } from "@vis.gl/react-google-maps";
|
|
109
|
+
function ClusterMarker({
|
|
110
|
+
cluster,
|
|
111
|
+
coordinates,
|
|
112
|
+
onPinClick,
|
|
113
|
+
onPinHover,
|
|
114
|
+
zoomToLevel,
|
|
115
|
+
supercluster
|
|
116
|
+
}) {
|
|
117
|
+
const [lng, lat] = cluster.geometry.coordinates;
|
|
118
|
+
const { point_count: pointCount } = cluster.properties;
|
|
119
|
+
const handleClick = () => {
|
|
120
|
+
const clusterCoordinates = filterClusterCoordinates(coordinates, lat, lng);
|
|
121
|
+
onPinClick?.(clusterCoordinates);
|
|
122
|
+
const expansionZoom = supercluster.getClusterExpansionZoom(cluster.id);
|
|
123
|
+
zoomToLevel(expansionZoom);
|
|
124
|
+
};
|
|
125
|
+
const handleMouseEnter = () => {
|
|
126
|
+
const clusterCoordinates = filterClusterCoordinates(coordinates, lat, lng);
|
|
127
|
+
onPinHover?.(clusterCoordinates);
|
|
128
|
+
};
|
|
129
|
+
const handleMouseLeave = () => onPinHover?.(null);
|
|
130
|
+
return /* @__PURE__ */ React.createElement(
|
|
131
|
+
AdvancedMarker,
|
|
132
|
+
{
|
|
133
|
+
key: `cluster-${cluster.id}`,
|
|
134
|
+
position: { lat, lng },
|
|
135
|
+
onClick: handleClick,
|
|
136
|
+
onMouseEnter: handleMouseEnter,
|
|
137
|
+
onMouseLeave: handleMouseLeave
|
|
138
|
+
},
|
|
139
|
+
/* @__PURE__ */ React.createElement("div", { className: "relative flex items-center justify-center", id: "CLUSTER_MARKER" }, /* @__PURE__ */ React.createElement("div", { className: "flex h-8 w-8 items-center justify-center rounded-full border-2 border-white bg-red-500 text-sm font-bold text-white shadow-lg" }, pointCount || "?"))
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/components/ui/Map/FocusCircle.tsx
|
|
144
|
+
import { useEffect, useMemo as useMemo2, useRef } from "react";
|
|
145
|
+
function FocusCircle({
|
|
146
|
+
focusPoint,
|
|
147
|
+
radiusMiles,
|
|
148
|
+
map,
|
|
149
|
+
mapsLibrary
|
|
150
|
+
}) {
|
|
151
|
+
const circleRef = useRef(null);
|
|
152
|
+
const circleProps = useMemo2(() => {
|
|
153
|
+
if (!focusPoint || !radiusMiles) return null;
|
|
154
|
+
return {
|
|
155
|
+
center: focusPoint,
|
|
156
|
+
radius: radiusMiles * 1609.34
|
|
157
|
+
};
|
|
158
|
+
}, [focusPoint, radiusMiles]);
|
|
159
|
+
useEffect(() => {
|
|
160
|
+
if (!map || !mapsLibrary || !circleProps) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (!circleRef.current) {
|
|
164
|
+
const circle = new google.maps.Circle({
|
|
165
|
+
center: circleProps.center,
|
|
166
|
+
radius: circleProps.radius,
|
|
167
|
+
...FOCUS_CIRCLE_STYLES,
|
|
168
|
+
map
|
|
169
|
+
});
|
|
170
|
+
circleRef.current = circle;
|
|
171
|
+
} else {
|
|
172
|
+
circleRef.current.setCenter(circleProps.center);
|
|
173
|
+
circleRef.current.setRadius(circleProps.radius);
|
|
174
|
+
}
|
|
175
|
+
}, [map, mapsLibrary, circleProps]);
|
|
176
|
+
useEffect(() => {
|
|
177
|
+
return () => {
|
|
178
|
+
if (circleRef.current) {
|
|
179
|
+
circleRef.current.setMap(null);
|
|
180
|
+
circleRef.current = null;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
}, []);
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/components/ui/Map/IndividualMarker.tsx
|
|
188
|
+
import { AdvancedMarker as AdvancedMarker2, Pin } from "@vis.gl/react-google-maps";
|
|
189
|
+
function IndividualMarker({
|
|
190
|
+
coordinate,
|
|
191
|
+
onPinClick,
|
|
192
|
+
onPinHover
|
|
193
|
+
}) {
|
|
194
|
+
const handleMouseEnter = () => onPinHover?.(coordinate);
|
|
195
|
+
const handleMouseLeave = () => onPinHover?.(null);
|
|
196
|
+
const handleClick = () => onPinClick?.(coordinate);
|
|
197
|
+
return /* @__PURE__ */ React.createElement(
|
|
198
|
+
AdvancedMarker2,
|
|
199
|
+
{
|
|
200
|
+
position: { lat: coordinate.lat, lng: coordinate.lng },
|
|
201
|
+
onMouseEnter: handleMouseEnter,
|
|
202
|
+
onMouseLeave: handleMouseLeave,
|
|
203
|
+
onClick: handleClick
|
|
204
|
+
},
|
|
205
|
+
/* @__PURE__ */ React.createElement(Pin, { ...PIN_COLORS })
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/lib/utils.ts
|
|
210
|
+
import { clsx } from "clsx";
|
|
211
|
+
import { twMerge } from "tailwind-merge";
|
|
212
|
+
function cn(...inputs) {
|
|
213
|
+
return twMerge(clsx(inputs));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/components/ui/Map/MapContent.tsx
|
|
217
|
+
function MapContent({
|
|
218
|
+
mapId,
|
|
219
|
+
mapCenter,
|
|
220
|
+
mapZoom,
|
|
221
|
+
position,
|
|
222
|
+
coordinates,
|
|
223
|
+
clusters,
|
|
224
|
+
supercluster,
|
|
225
|
+
onPinHover,
|
|
226
|
+
onPinClick,
|
|
227
|
+
focusPoint,
|
|
228
|
+
radiusMiles,
|
|
229
|
+
className,
|
|
230
|
+
setBounds,
|
|
231
|
+
setZoomLevel
|
|
232
|
+
}) {
|
|
233
|
+
const map = useMap();
|
|
234
|
+
const mapsLibrary = useMapsLibrary("maps");
|
|
235
|
+
const zoomToLevel = useCallback(
|
|
236
|
+
(newZoom) => {
|
|
237
|
+
if (map) {
|
|
238
|
+
map.setZoom(newZoom);
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
[map]
|
|
242
|
+
);
|
|
243
|
+
const handleBoundsChanged = (e) => {
|
|
244
|
+
if (e.detail.bounds) {
|
|
245
|
+
const bounds = e.detail.bounds;
|
|
246
|
+
setBounds([
|
|
247
|
+
[bounds.south, bounds.west],
|
|
248
|
+
[bounds.north, bounds.east]
|
|
249
|
+
]);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const handleZoomChanged = (e) => {
|
|
253
|
+
if (e.detail.zoom) {
|
|
254
|
+
setZoomLevel(e.detail.zoom);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const handleCameraChanged = (e) => {
|
|
258
|
+
if (e.detail.zoom) {
|
|
259
|
+
setZoomLevel(e.detail.zoom);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("relative h-screen max-w-full", className) }, /* @__PURE__ */ React.createElement(
|
|
263
|
+
Map,
|
|
264
|
+
{
|
|
265
|
+
defaultZoom: mapZoom,
|
|
266
|
+
defaultCenter: mapCenter,
|
|
267
|
+
mapId,
|
|
268
|
+
keyboardShortcuts: true,
|
|
269
|
+
disableDefaultUI: true,
|
|
270
|
+
zoomControl: true,
|
|
271
|
+
onBoundsChanged: handleBoundsChanged,
|
|
272
|
+
onZoomChanged: handleZoomChanged,
|
|
273
|
+
onCameraChanged: handleCameraChanged
|
|
274
|
+
},
|
|
275
|
+
position && !coordinates && /* @__PURE__ */ React.createElement(AdvancedMarker3, { position }, /* @__PURE__ */ React.createElement(Pin2, { ...PIN_COLORS })),
|
|
276
|
+
coordinates && clusters.map((cluster) => {
|
|
277
|
+
const { cluster: isCluster } = cluster.properties;
|
|
278
|
+
if (isCluster) {
|
|
279
|
+
return /* @__PURE__ */ React.createElement(
|
|
280
|
+
ClusterMarker,
|
|
281
|
+
{
|
|
282
|
+
key: `cluster-${cluster.id}`,
|
|
283
|
+
cluster,
|
|
284
|
+
coordinates,
|
|
285
|
+
onPinClick,
|
|
286
|
+
onPinHover,
|
|
287
|
+
zoomToLevel,
|
|
288
|
+
supercluster
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
const originalPoint = coordinates[cluster.properties.pointId];
|
|
293
|
+
return /* @__PURE__ */ React.createElement(
|
|
294
|
+
IndividualMarker,
|
|
295
|
+
{
|
|
296
|
+
key: `marker-${cluster.properties.pointId}`,
|
|
297
|
+
coordinate: originalPoint,
|
|
298
|
+
onPinClick,
|
|
299
|
+
onPinHover
|
|
300
|
+
}
|
|
301
|
+
);
|
|
302
|
+
}),
|
|
303
|
+
coordinates && clusters.length === 0 && coordinates.map((coord, index) => /* @__PURE__ */ React.createElement(
|
|
304
|
+
IndividualMarker,
|
|
305
|
+
{
|
|
306
|
+
key: `fallback-${index}`,
|
|
307
|
+
coordinate: coord,
|
|
308
|
+
onPinClick,
|
|
309
|
+
onPinHover
|
|
310
|
+
}
|
|
311
|
+
)),
|
|
312
|
+
focusPoint && radiusMiles && /* @__PURE__ */ React.createElement(
|
|
313
|
+
FocusCircle,
|
|
314
|
+
{
|
|
315
|
+
focusPoint,
|
|
316
|
+
radiusMiles,
|
|
317
|
+
map,
|
|
318
|
+
mapsLibrary
|
|
319
|
+
}
|
|
320
|
+
)
|
|
321
|
+
));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// src/components/ui/Map/MapComponent.tsx
|
|
325
|
+
function MapComponent({
|
|
326
|
+
apiKey,
|
|
327
|
+
mapId,
|
|
328
|
+
position,
|
|
329
|
+
coordinates,
|
|
330
|
+
onPinHover,
|
|
331
|
+
onPinClick,
|
|
332
|
+
focusPoint,
|
|
333
|
+
radiusMiles,
|
|
334
|
+
className,
|
|
335
|
+
zoom = 10
|
|
336
|
+
}) {
|
|
337
|
+
const { bounds, setBounds } = useMapBounds(coordinates);
|
|
338
|
+
const { zoomLevel, setZoomLevel } = useZoomLevel(zoom || DEFAULT_ZOOM);
|
|
339
|
+
const { clusters, supercluster } = useClusters(coordinates, bounds, zoomLevel);
|
|
340
|
+
const mapCenter = coordinates && coordinates.length > 0 ? getCenterForCoordinates(coordinates) : position || DEFAULT_POSITION;
|
|
341
|
+
const mapZoom = coordinates && coordinates.length > 1 ? getZoomForCoordinates(coordinates, zoom) : position ? zoom : DEFAULT_ZOOM;
|
|
342
|
+
return /* @__PURE__ */ React.createElement(APIProvider, { apiKey }, /* @__PURE__ */ React.createElement(
|
|
343
|
+
MapContent,
|
|
344
|
+
{
|
|
345
|
+
mapId,
|
|
346
|
+
mapCenter,
|
|
347
|
+
mapZoom,
|
|
348
|
+
position,
|
|
349
|
+
coordinates,
|
|
350
|
+
clusters,
|
|
351
|
+
supercluster,
|
|
352
|
+
onPinHover,
|
|
353
|
+
onPinClick,
|
|
354
|
+
focusPoint,
|
|
355
|
+
radiusMiles,
|
|
356
|
+
className,
|
|
357
|
+
setBounds,
|
|
358
|
+
setZoomLevel
|
|
359
|
+
}
|
|
360
|
+
));
|
|
361
|
+
}
|
|
362
|
+
export {
|
|
363
|
+
MapComponent
|
|
364
|
+
};
|
|
365
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/Map/MapComponent.tsx","../../../../src/components/ui/Map/constants.ts","../../../../src/components/ui/Map/hooks.ts","../../../../src/components/ui/Map/utils.ts","../../../../src/components/ui/Map/clustering.ts","../../../../src/components/ui/Map/MapContent.tsx","../../../../src/components/ui/Map/ClusterMarker.tsx","../../../../src/components/ui/Map/FocusCircle.tsx","../../../../src/components/ui/Map/IndividualMarker.tsx","../../../../src/lib/utils.ts"],"sourcesContent":["'use client'\n\nimport { APIProvider } from '@vis.gl/react-google-maps'\n\nimport { DEFAULT_POSITION, DEFAULT_ZOOM } from '@/components/ui/Map/constants'\nimport { useClusters, useMapBounds, useZoomLevel } from '@/components/ui/Map/hooks'\nimport { MapContent } from '@/components/ui/Map/MapContent'\nimport type { MapComponentProps, PinData } from '@/components/ui/Map/types'\nimport { getCenterForCoordinates, getZoomForCoordinates } from '@/components/ui/Map/utils'\n\nexport function MapComponent<T = PinData>({\n apiKey,\n mapId,\n position,\n coordinates,\n onPinHover,\n onPinClick,\n focusPoint,\n radiusMiles,\n className,\n zoom = 10,\n}: Readonly<MapComponentProps<T>>) {\n const { bounds, setBounds } = useMapBounds(coordinates)\n const { zoomLevel, setZoomLevel } = useZoomLevel(zoom || DEFAULT_ZOOM)\n const { clusters, supercluster } = useClusters(coordinates, bounds, zoomLevel)\n\n const mapCenter =\n coordinates && coordinates.length > 0\n ? getCenterForCoordinates(coordinates)\n : position || DEFAULT_POSITION\n\n const mapZoom =\n coordinates && coordinates.length > 1\n ? getZoomForCoordinates(coordinates, zoom)\n : position\n ? zoom\n : DEFAULT_ZOOM\n\n return (\n <APIProvider apiKey={apiKey}>\n <MapContent\n mapId={mapId}\n mapCenter={mapCenter}\n mapZoom={mapZoom}\n position={position}\n coordinates={coordinates}\n clusters={clusters}\n supercluster={supercluster}\n onPinHover={onPinHover}\n onPinClick={onPinClick}\n focusPoint={focusPoint}\n radiusMiles={radiusMiles}\n className={className}\n setBounds={setBounds}\n setZoomLevel={setZoomLevel}\n />\n </APIProvider>\n )\n}\n","export const DEFAULT_POSITION = { lat: 40.715021, lng: -74.00459 }\nexport const DEFAULT_ZOOM = 10\nexport const CLUSTER_PIN_SCALE = 1.5\nexport const CLUSTER_DISTANCE_THRESHOLD = 0.001\n\nexport const PIN_COLORS = {\n background: '#0B5441',\n borderColor: '#EBFDF1',\n glyphColor: '#D4F500',\n} as const\n\nexport const FOCUS_CIRCLE_STYLES = {\n strokeColor: '#0B5441',\n strokeOpacity: 0.8,\n strokeWeight: 2,\n fillColor: '#0B5441',\n fillOpacity: 0.1,\n clickable: false,\n zIndex: 1,\n} as const\n\nexport const CLUSTERING_CONFIG = {\n radius: 60,\n maxZoom: 16,\n minPoints: 2,\n} as const\n","import { useMemo, useState } from 'react'\nimport useSupercluster from 'use-supercluster'\n\nimport { convertCoordinatesToGeoJSON } from '@/components/ui/Map/clustering'\nimport { CLUSTERING_CONFIG } from '@/components/ui/Map/constants'\nimport type { Coordinate, PinData } from '@/components/ui/Map/types'\n\nexport function useMapBounds<T = PinData>(_coordinates?: Coordinate<T>[]) {\n const [bounds, setBounds] = useState<[[number, number], [number, number]]>([\n [-180, -85],\n [180, 85],\n ])\n\n // Use global bounds for stability - let the map handle the actual bounds\n // This prevents constant recalculation that causes clustering instability\n return { bounds, setBounds }\n}\n\nexport function useZoomLevel(initialZoom: number) {\n const [zoomLevel, setZoomLevel] = useState(initialZoom)\n return { zoomLevel, setZoomLevel }\n}\n\nexport function useClusters<T = PinData>(\n coordinates?: Coordinate<T>[],\n bounds?: [[number, number], [number, number]],\n zoomLevel?: number\n) {\n const points = useMemo(() => {\n if (!coordinates) return []\n return convertCoordinatesToGeoJSON<T>(coordinates)\n }, [coordinates])\n\n const { clusters, supercluster } = useSupercluster({\n points,\n bounds: [-180, -85, 180, 85], // Use global bounds for consistency\n zoom: zoomLevel || 10,\n options: CLUSTERING_CONFIG,\n })\n\n return { clusters, supercluster }\n}\n","import { CLUSTER_DISTANCE_THRESHOLD, DEFAULT_POSITION } from '@/components/ui/Map/constants'\nimport type { Coordinate, PinData } from '@/components/ui/Map/types'\n\nexport function getCenterForCoordinates<T = PinData>(coords: Coordinate<T>[]): Coordinate<T> {\n if (coords.length === 0) return DEFAULT_POSITION as Coordinate<T>\n\n const avgLat = coords.reduce((sum, coord) => sum + coord.lat, 0) / coords.length\n const avgLng = coords.reduce((sum, coord) => sum + coord.lng, 0) / coords.length\n\n return { lat: avgLat, lng: avgLng }\n}\n\nexport function getZoomForCoordinates<T = PinData>(\n coords: Coordinate<T>[],\n defaultZoom: number\n): number {\n if (coords.length <= 1) return defaultZoom\n\n const lats = coords.map((coord) => coord.lat)\n const lngs = coords.map((coord) => coord.lng)\n\n const latDiff = Math.max(...lats) - Math.min(...lats)\n const lngDiff = Math.max(...lngs) - Math.min(...lngs)\n const maxDiff = Math.max(latDiff, lngDiff)\n\n if (maxDiff > 0.1) return 8\n if (maxDiff > 0.05) return 10\n if (maxDiff > 0.01) return 12\n return 14\n}\n\nexport function getClusteringRadius(zoom: number): number {\n if (zoom <= 8) return 200\n if (zoom <= 12) return 150\n return 100\n}\n\nexport function filterClusterCoordinates<T = PinData>(\n coordinates: Coordinate<T>[],\n clusterLat: number,\n clusterLng: number\n): Coordinate<T>[] {\n return coordinates.filter((coord) => {\n const latDiff = Math.abs(coord.lat - clusterLat)\n const lngDiff = Math.abs(coord.lng - clusterLng)\n const distance = Math.sqrt(latDiff * latDiff + lngDiff * lngDiff)\n return distance < CLUSTER_DISTANCE_THRESHOLD\n })\n}\n\nexport function calculateDistance<T = PinData>(\n coord1: Coordinate<T>,\n coord2: Coordinate<T>\n): number {\n const latDiff = Math.abs(coord1.lat - coord2.lat)\n const lngDiff = Math.abs(coord1.lng - coord2.lng)\n return Math.sqrt(latDiff * latDiff + lngDiff * lngDiff)\n}\n","import { CLUSTER_DISTANCE_THRESHOLD } from '@/components/ui/Map/constants'\nimport type { ClusterFeature, Coordinate, PinData } from '@/components/ui/Map/types'\nimport { calculateDistance } from '@/components/ui/Map/utils'\n\nexport function convertCoordinatesToGeoJSON<T = PinData>(coordinates: Coordinate<T>[]) {\n return coordinates.map((coord, index) => ({\n type: 'Feature' as const,\n properties: {\n cluster: false,\n pointId: index,\n data: coord.data,\n },\n geometry: {\n type: 'Point' as const,\n coordinates: [coord.lng, coord.lat],\n },\n }))\n}\n\nexport function createManualClusters<T = PinData>(\n coordinates: Coordinate<T>[]\n): ClusterFeature<T>[] {\n if (!coordinates || coordinates.length === 0) return []\n\n const clusters: ClusterFeature<T>[] = []\n const processed = new Set<number>()\n\n coordinates.forEach((coord, index) => {\n if (processed.has(index)) return\n\n const nearby: number[] = [index]\n coordinates.forEach((otherCoord, otherIndex) => {\n if (otherIndex === index || processed.has(otherIndex)) return\n\n const distance = calculateDistance(coord, otherCoord)\n\n if (distance < CLUSTER_DISTANCE_THRESHOLD) {\n nearby.push(otherIndex)\n }\n })\n\n if (nearby.length >= 2) {\n clusters.push({\n type: 'Feature' as const,\n properties: {\n cluster: true,\n point_count: nearby.length,\n },\n geometry: {\n type: 'Point' as const,\n coordinates: [coord.lng, coord.lat],\n },\n id: clusters.length,\n })\n\n nearby.forEach((i) => processed.add(i))\n } else {\n clusters.push({\n type: 'Feature' as const,\n properties: {\n cluster: false,\n pointId: index,\n data: coord.data,\n },\n geometry: {\n type: 'Point' as const,\n coordinates: [coord.lng, coord.lat],\n },\n id: clusters.length,\n })\n processed.add(index)\n }\n })\n\n return clusters\n}\n","'use client'\n\nimport { AdvancedMarker, Map, Pin, useMap, useMapsLibrary } from '@vis.gl/react-google-maps'\nimport { useCallback } from 'react'\n\nimport { ClusterMarker } from '@/components/ui/Map/ClusterMarker'\nimport { PIN_COLORS } from '@/components/ui/Map/constants'\nimport { FocusCircle } from '@/components/ui/Map/FocusCircle'\nimport { IndividualMarker } from '@/components/ui/Map/IndividualMarker'\nimport type { MapContentProps, PinData } from '@/components/ui/Map/types'\nimport { cn } from '@/lib/utils'\n\nexport function MapContent<T = PinData>({\n mapId,\n mapCenter,\n mapZoom,\n position,\n coordinates,\n clusters,\n supercluster,\n onPinHover,\n onPinClick,\n focusPoint,\n radiusMiles,\n className,\n setBounds,\n setZoomLevel,\n}: MapContentProps<T>) {\n const map = useMap()\n const mapsLibrary = useMapsLibrary('maps')\n\n const zoomToLevel = useCallback(\n (newZoom: number) => {\n if (map) {\n map.setZoom(newZoom)\n }\n },\n [map]\n )\n\n const handleBoundsChanged = (e: {\n detail: { bounds: { south: number; west: number; north: number; east: number } }\n }) => {\n if (e.detail.bounds) {\n const bounds = e.detail.bounds\n setBounds([\n [bounds.south, bounds.west],\n [bounds.north, bounds.east],\n ])\n }\n }\n\n const handleZoomChanged = (e: { detail: { zoom: number } }) => {\n if (e.detail.zoom) {\n setZoomLevel(e.detail.zoom)\n }\n }\n\n const handleCameraChanged = (e: { detail: { zoom: number } }) => {\n if (e.detail.zoom) {\n setZoomLevel(e.detail.zoom)\n }\n }\n\n return (\n <div className={cn('relative h-screen max-w-full', className)}>\n <Map\n defaultZoom={mapZoom}\n defaultCenter={mapCenter}\n mapId={mapId}\n keyboardShortcuts={true}\n disableDefaultUI={true}\n zoomControl={true}\n onBoundsChanged={handleBoundsChanged}\n onZoomChanged={handleZoomChanged}\n onCameraChanged={handleCameraChanged}\n >\n {position && !coordinates && (\n <AdvancedMarker position={position}>\n <Pin {...PIN_COLORS} />\n </AdvancedMarker>\n )}\n\n {coordinates &&\n clusters.map((cluster) => {\n const { cluster: isCluster } = cluster.properties\n\n if (isCluster) {\n return (\n <ClusterMarker\n key={`cluster-${cluster.id}`}\n cluster={cluster}\n coordinates={coordinates}\n onPinClick={onPinClick}\n onPinHover={onPinHover}\n zoomToLevel={zoomToLevel}\n supercluster={supercluster}\n />\n )\n }\n\n const originalPoint = coordinates[cluster.properties.pointId!]\n return (\n <IndividualMarker\n key={`marker-${cluster.properties.pointId}`}\n coordinate={originalPoint}\n onPinClick={onPinClick}\n onPinHover={onPinHover}\n />\n )\n })}\n\n {coordinates &&\n clusters.length === 0 &&\n coordinates.map((coord, index) => (\n <IndividualMarker\n key={`fallback-${index}`}\n coordinate={coord}\n onPinClick={onPinClick}\n onPinHover={onPinHover}\n />\n ))}\n\n {focusPoint && radiusMiles && (\n <FocusCircle\n focusPoint={focusPoint}\n radiusMiles={radiusMiles}\n map={map}\n mapsLibrary={mapsLibrary}\n />\n )}\n </Map>\n </div>\n )\n}\n","'use client'\n\nimport { AdvancedMarker } from '@vis.gl/react-google-maps'\n\nimport type { ClusterMarkerProps, PinData } from '@/components/ui/Map/types'\nimport { filterClusterCoordinates } from '@/components/ui/Map/utils'\n\nexport function ClusterMarker<T = PinData>({\n cluster,\n coordinates,\n onPinClick,\n onPinHover,\n zoomToLevel,\n supercluster,\n}: ClusterMarkerProps<T>) {\n const [lng, lat] = cluster.geometry.coordinates\n const { point_count: pointCount } = cluster.properties\n\n const handleClick = () => {\n const clusterCoordinates = filterClusterCoordinates(coordinates, lat, lng)\n onPinClick?.(clusterCoordinates)\n\n const expansionZoom = supercluster.getClusterExpansionZoom(cluster.id)\n zoomToLevel(expansionZoom)\n }\n\n const handleMouseEnter = () => {\n const clusterCoordinates = filterClusterCoordinates(coordinates, lat, lng)\n onPinHover?.(clusterCoordinates)\n }\n\n const handleMouseLeave = () => onPinHover?.(null)\n\n return (\n <AdvancedMarker\n key={`cluster-${cluster.id}`}\n position={{ lat, lng }}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <div className=\"relative flex items-center justify-center\" id=\"CLUSTER_MARKER\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full border-2 border-white bg-red-500 text-sm font-bold text-white shadow-lg\">\n {pointCount || '?'}\n </div>\n </div>\n </AdvancedMarker>\n )\n}\n","'use client'\n\nimport { useEffect, useMemo, useRef } from 'react'\n\nimport { FOCUS_CIRCLE_STYLES } from '@/components/ui/Map/constants'\nimport type { FocusCircleProps, PinData } from '@/components/ui/Map/types'\n\nexport function FocusCircle<T = PinData>({\n focusPoint,\n radiusMiles,\n map,\n mapsLibrary,\n}: FocusCircleProps<T>) {\n const circleRef = useRef<google.maps.Circle | null>(null)\n\n const circleProps = useMemo(() => {\n if (!focusPoint || !radiusMiles) return null\n return {\n center: focusPoint,\n radius: radiusMiles * 1609.34,\n }\n }, [focusPoint, radiusMiles])\n\n useEffect(() => {\n if (!map || !mapsLibrary || !circleProps) {\n return\n }\n\n if (!circleRef.current) {\n const circle = new google.maps.Circle({\n center: circleProps.center,\n radius: circleProps.radius,\n ...FOCUS_CIRCLE_STYLES,\n map: map,\n })\n\n circleRef.current = circle\n } else {\n circleRef.current.setCenter(circleProps.center)\n circleRef.current.setRadius(circleProps.radius)\n }\n }, [map, mapsLibrary, circleProps])\n\n useEffect(() => {\n return () => {\n if (circleRef.current) {\n circleRef.current.setMap(null)\n circleRef.current = null\n }\n }\n }, [])\n\n return null\n}\n","'use client'\n\nimport { AdvancedMarker, Pin } from '@vis.gl/react-google-maps'\n\nimport { PIN_COLORS } from '@/components/ui/Map/constants'\nimport type { IndividualMarkerProps, PinData } from '@/components/ui/Map/types'\n\nexport function IndividualMarker<T = PinData>({\n coordinate,\n onPinClick,\n onPinHover,\n}: IndividualMarkerProps<T>) {\n const handleMouseEnter = () => onPinHover?.(coordinate)\n const handleMouseLeave = () => onPinHover?.(null)\n const handleClick = () => onPinClick?.(coordinate)\n\n return (\n <AdvancedMarker\n position={{ lat: coordinate.lat, lng: coordinate.lng }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClick={handleClick}\n >\n <Pin {...PIN_COLORS} />\n </AdvancedMarker>\n )\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n"],"mappings":"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","names":["AdvancedMarker","Pin","useMemo","useMemo","AdvancedMarker","AdvancedMarker","AdvancedMarker","Pin"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/components/ui/Map/types.ts
|
|
17
|
+
var types_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(types_exports);
|
|
19
|
+
//# sourceMappingURL=types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ui/Map/types.ts"],"sourcesContent":["// Base pin data interface\nexport interface PinData {\n name?: string\n type?: string\n}\n\n// Generic coordinate interface with typed data\nexport interface Coordinate<T = PinData> {\n lat: number\n lng: number\n data?: T\n}\n\n// Type alias for common use cases\nexport type LocationCoordinate = Coordinate<PinData>\n\n// Cluster-related interfaces\nexport interface ClusterPinData {\n coordinates: Coordinate[]\n count: number\n}\n\nexport interface ClusterFeature<T = PinData> {\n type: 'Feature'\n properties: {\n cluster: boolean\n point_count?: number\n pointId?: number\n data?: T\n }\n geometry: {\n type: 'Point'\n coordinates: [number, number]\n }\n id: number\n}\n\nexport interface SuperclusterInstance {\n getClusterExpansionZoom(clusterId: number): number\n}\n\nexport type PinEventHandler<T = PinData> = (pin: Coordinate<T> | Coordinate<T>[] | null) => void\n\nexport type PinClickHandler<T = PinData> = (pin: Coordinate<T> | Coordinate<T>[]) => void\n\nexport interface MapComponentProps<T = PinData> {\n apiKey: string\n mapId: string\n position?: Coordinate<T>\n coordinates?: Coordinate<T>[]\n onPinHover?: PinEventHandler<T>\n onPinClick?: PinClickHandler<T>\n focusPoint?: Coordinate<T>\n radiusMiles?: number\n className?: string\n zoom?: number\n}\n\nexport interface MapContentProps<T = PinData> {\n mapId: string\n mapCenter: Coordinate<T>\n mapZoom: number\n position?: Coordinate<T>\n coordinates?: Coordinate<T>[]\n clusters: ClusterFeature<T>[]\n supercluster: SuperclusterInstance\n onPinHover?: PinEventHandler<T>\n onPinClick?: PinClickHandler<T>\n focusPoint?: Coordinate<T>\n radiusMiles?: number\n className?: string\n setBounds: (bounds: [[number, number], [number, number]]) => void\n setZoomLevel: (zoom: number) => void\n}\n\nexport interface ClusterMarkerProps<T = PinData> {\n cluster: ClusterFeature<T>\n coordinates: Coordinate<T>[]\n onPinClick?: PinClickHandler<T>\n onPinHover?: PinEventHandler<T>\n zoomToLevel: (zoom: number) => void\n supercluster: SuperclusterInstance\n}\n\nexport interface IndividualMarkerProps<T = PinData> {\n coordinate: Coordinate<T>\n onPinClick?: PinClickHandler<T>\n onPinHover?: PinEventHandler<T>\n}\n\nexport interface FocusCircleProps<T = PinData> {\n focusPoint: Coordinate<T>\n radiusMiles: number\n map: google.maps.Map | null\n mapsLibrary: google.maps.MapsLibrary | null\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
interface PinData {
|
|
2
|
+
name?: string;
|
|
3
|
+
type?: string;
|
|
4
|
+
}
|
|
5
|
+
interface Coordinate<T = PinData> {
|
|
6
|
+
lat: number;
|
|
7
|
+
lng: number;
|
|
8
|
+
data?: T;
|
|
9
|
+
}
|
|
10
|
+
type LocationCoordinate = Coordinate<PinData>;
|
|
11
|
+
interface ClusterPinData {
|
|
12
|
+
coordinates: Coordinate[];
|
|
13
|
+
count: number;
|
|
14
|
+
}
|
|
15
|
+
interface ClusterFeature<T = PinData> {
|
|
16
|
+
type: 'Feature';
|
|
17
|
+
properties: {
|
|
18
|
+
cluster: boolean;
|
|
19
|
+
point_count?: number;
|
|
20
|
+
pointId?: number;
|
|
21
|
+
data?: T;
|
|
22
|
+
};
|
|
23
|
+
geometry: {
|
|
24
|
+
type: 'Point';
|
|
25
|
+
coordinates: [number, number];
|
|
26
|
+
};
|
|
27
|
+
id: number;
|
|
28
|
+
}
|
|
29
|
+
interface SuperclusterInstance {
|
|
30
|
+
getClusterExpansionZoom(clusterId: number): number;
|
|
31
|
+
}
|
|
32
|
+
type PinEventHandler<T = PinData> = (pin: Coordinate<T> | Coordinate<T>[] | null) => void;
|
|
33
|
+
type PinClickHandler<T = PinData> = (pin: Coordinate<T> | Coordinate<T>[]) => void;
|
|
34
|
+
interface MapComponentProps<T = PinData> {
|
|
35
|
+
apiKey: string;
|
|
36
|
+
mapId: string;
|
|
37
|
+
position?: Coordinate<T>;
|
|
38
|
+
coordinates?: Coordinate<T>[];
|
|
39
|
+
onPinHover?: PinEventHandler<T>;
|
|
40
|
+
onPinClick?: PinClickHandler<T>;
|
|
41
|
+
focusPoint?: Coordinate<T>;
|
|
42
|
+
radiusMiles?: number;
|
|
43
|
+
className?: string;
|
|
44
|
+
zoom?: number;
|
|
45
|
+
}
|
|
46
|
+
interface MapContentProps<T = PinData> {
|
|
47
|
+
mapId: string;
|
|
48
|
+
mapCenter: Coordinate<T>;
|
|
49
|
+
mapZoom: number;
|
|
50
|
+
position?: Coordinate<T>;
|
|
51
|
+
coordinates?: Coordinate<T>[];
|
|
52
|
+
clusters: ClusterFeature<T>[];
|
|
53
|
+
supercluster: SuperclusterInstance;
|
|
54
|
+
onPinHover?: PinEventHandler<T>;
|
|
55
|
+
onPinClick?: PinClickHandler<T>;
|
|
56
|
+
focusPoint?: Coordinate<T>;
|
|
57
|
+
radiusMiles?: number;
|
|
58
|
+
className?: string;
|
|
59
|
+
setBounds: (bounds: [[number, number], [number, number]]) => void;
|
|
60
|
+
setZoomLevel: (zoom: number) => void;
|
|
61
|
+
}
|
|
62
|
+
interface ClusterMarkerProps<T = PinData> {
|
|
63
|
+
cluster: ClusterFeature<T>;
|
|
64
|
+
coordinates: Coordinate<T>[];
|
|
65
|
+
onPinClick?: PinClickHandler<T>;
|
|
66
|
+
onPinHover?: PinEventHandler<T>;
|
|
67
|
+
zoomToLevel: (zoom: number) => void;
|
|
68
|
+
supercluster: SuperclusterInstance;
|
|
69
|
+
}
|
|
70
|
+
interface IndividualMarkerProps<T = PinData> {
|
|
71
|
+
coordinate: Coordinate<T>;
|
|
72
|
+
onPinClick?: PinClickHandler<T>;
|
|
73
|
+
onPinHover?: PinEventHandler<T>;
|
|
74
|
+
}
|
|
75
|
+
interface FocusCircleProps<T = PinData> {
|
|
76
|
+
focusPoint: Coordinate<T>;
|
|
77
|
+
radiusMiles: number;
|
|
78
|
+
map: google.maps.Map | null;
|
|
79
|
+
mapsLibrary: google.maps.MapsLibrary | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type { ClusterFeature, ClusterMarkerProps, ClusterPinData, Coordinate, FocusCircleProps, IndividualMarkerProps, LocationCoordinate, MapComponentProps, MapContentProps, PinClickHandler, PinData, PinEventHandler, SuperclusterInstance };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
interface PinData {
|
|
2
|
+
name?: string;
|
|
3
|
+
type?: string;
|
|
4
|
+
}
|
|
5
|
+
interface Coordinate<T = PinData> {
|
|
6
|
+
lat: number;
|
|
7
|
+
lng: number;
|
|
8
|
+
data?: T;
|
|
9
|
+
}
|
|
10
|
+
type LocationCoordinate = Coordinate<PinData>;
|
|
11
|
+
interface ClusterPinData {
|
|
12
|
+
coordinates: Coordinate[];
|
|
13
|
+
count: number;
|
|
14
|
+
}
|
|
15
|
+
interface ClusterFeature<T = PinData> {
|
|
16
|
+
type: 'Feature';
|
|
17
|
+
properties: {
|
|
18
|
+
cluster: boolean;
|
|
19
|
+
point_count?: number;
|
|
20
|
+
pointId?: number;
|
|
21
|
+
data?: T;
|
|
22
|
+
};
|
|
23
|
+
geometry: {
|
|
24
|
+
type: 'Point';
|
|
25
|
+
coordinates: [number, number];
|
|
26
|
+
};
|
|
27
|
+
id: number;
|
|
28
|
+
}
|
|
29
|
+
interface SuperclusterInstance {
|
|
30
|
+
getClusterExpansionZoom(clusterId: number): number;
|
|
31
|
+
}
|
|
32
|
+
type PinEventHandler<T = PinData> = (pin: Coordinate<T> | Coordinate<T>[] | null) => void;
|
|
33
|
+
type PinClickHandler<T = PinData> = (pin: Coordinate<T> | Coordinate<T>[]) => void;
|
|
34
|
+
interface MapComponentProps<T = PinData> {
|
|
35
|
+
apiKey: string;
|
|
36
|
+
mapId: string;
|
|
37
|
+
position?: Coordinate<T>;
|
|
38
|
+
coordinates?: Coordinate<T>[];
|
|
39
|
+
onPinHover?: PinEventHandler<T>;
|
|
40
|
+
onPinClick?: PinClickHandler<T>;
|
|
41
|
+
focusPoint?: Coordinate<T>;
|
|
42
|
+
radiusMiles?: number;
|
|
43
|
+
className?: string;
|
|
44
|
+
zoom?: number;
|
|
45
|
+
}
|
|
46
|
+
interface MapContentProps<T = PinData> {
|
|
47
|
+
mapId: string;
|
|
48
|
+
mapCenter: Coordinate<T>;
|
|
49
|
+
mapZoom: number;
|
|
50
|
+
position?: Coordinate<T>;
|
|
51
|
+
coordinates?: Coordinate<T>[];
|
|
52
|
+
clusters: ClusterFeature<T>[];
|
|
53
|
+
supercluster: SuperclusterInstance;
|
|
54
|
+
onPinHover?: PinEventHandler<T>;
|
|
55
|
+
onPinClick?: PinClickHandler<T>;
|
|
56
|
+
focusPoint?: Coordinate<T>;
|
|
57
|
+
radiusMiles?: number;
|
|
58
|
+
className?: string;
|
|
59
|
+
setBounds: (bounds: [[number, number], [number, number]]) => void;
|
|
60
|
+
setZoomLevel: (zoom: number) => void;
|
|
61
|
+
}
|
|
62
|
+
interface ClusterMarkerProps<T = PinData> {
|
|
63
|
+
cluster: ClusterFeature<T>;
|
|
64
|
+
coordinates: Coordinate<T>[];
|
|
65
|
+
onPinClick?: PinClickHandler<T>;
|
|
66
|
+
onPinHover?: PinEventHandler<T>;
|
|
67
|
+
zoomToLevel: (zoom: number) => void;
|
|
68
|
+
supercluster: SuperclusterInstance;
|
|
69
|
+
}
|
|
70
|
+
interface IndividualMarkerProps<T = PinData> {
|
|
71
|
+
coordinate: Coordinate<T>;
|
|
72
|
+
onPinClick?: PinClickHandler<T>;
|
|
73
|
+
onPinHover?: PinEventHandler<T>;
|
|
74
|
+
}
|
|
75
|
+
interface FocusCircleProps<T = PinData> {
|
|
76
|
+
focusPoint: Coordinate<T>;
|
|
77
|
+
radiusMiles: number;
|
|
78
|
+
map: google.maps.Map | null;
|
|
79
|
+
mapsLibrary: google.maps.MapsLibrary | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type { ClusterFeature, ClusterMarkerProps, ClusterPinData, Coordinate, FocusCircleProps, IndividualMarkerProps, LocationCoordinate, MapComponentProps, MapContentProps, PinClickHandler, PinData, PinEventHandler, SuperclusterInstance };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|