@12-apps/ui 6.6.0 → 6.8.0
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/{chunk-QLBYAYUG.js → chunk-KR2BP7NK.js} +4 -4
- package/dist/chunk-KR2BP7NK.js.map +1 -0
- package/dist/{chunk-DFVRZ3UK.js → chunk-KXARS46L.js} +3 -3
- package/dist/chunk-KXARS46L.js.map +1 -0
- package/dist/{chunk-JP55QWVR.js → chunk-L7L6SX64.js} +5 -2
- package/dist/chunk-L7L6SX64.js.map +1 -0
- package/dist/{chunk-QZZVHY6U.js → chunk-PVLDKXKR.js} +7 -3
- package/dist/chunk-PVLDKXKR.js.map +1 -0
- package/dist/{chunk-3KWD5Y5O.js → chunk-RXE5CUUE.js} +8 -4
- package/dist/chunk-RXE5CUUE.js.map +1 -0
- package/dist/{chunk-H7UAGTVW.js → chunk-TSG5C7MP.js} +4 -3
- package/dist/chunk-TSG5C7MP.js.map +1 -0
- package/dist/{chunk-NUCLEOHF.js → chunk-UNM7KFDX.js} +44 -14
- package/dist/chunk-UNM7KFDX.js.map +1 -0
- package/dist/{chunk-CEKPLUQV.js → chunk-UY7UF7IN.js} +19 -13
- package/dist/chunk-UY7UF7IN.js.map +1 -0
- package/dist/data-display/Alert.js +1 -1
- package/dist/data-display/AsyncStateContainer.js +2 -1
- package/dist/data-display/AsyncStateContainer.js.map +1 -1
- package/dist/data-display/Banner.js +4 -2
- package/dist/data-display/Banner.js.map +1 -1
- package/dist/data-display/CardKit.js +3 -1
- package/dist/data-display/CardKit.js.map +1 -1
- package/dist/data-display/Carousel.js +5 -2
- package/dist/data-display/Carousel.js.map +1 -1
- package/dist/data-display/DataGrid.js +1 -1
- package/dist/data-display/DataViews.js +90 -66
- package/dist/data-display/DataViews.js.map +1 -1
- package/dist/data-display/HoverCard.js +4 -1
- package/dist/data-display/HoverCard.js.map +1 -1
- package/dist/data-display/Lightbox.js +147 -117
- package/dist/data-display/Lightbox.js.map +1 -1
- package/dist/data-display/MapPreview.js +14 -10
- package/dist/data-display/MapPreview.js.map +1 -1
- package/dist/data-display/Table.js +4 -2
- package/dist/data-display/Table.js.map +1 -1
- package/dist/data-display/TimingDiagram.js +3 -2
- package/dist/data-display/TimingDiagram.js.map +1 -1
- package/dist/feedback/Sonner.js +5 -4
- package/dist/feedback/Sonner.js.map +1 -1
- package/dist/feedback/StackedModal.js +1 -1
- package/dist/feedback/TutorialOverlay.js +19 -5
- package/dist/feedback/TutorialOverlay.js.map +1 -1
- package/dist/form/AddressAutocomplete.js +16 -8
- package/dist/form/AddressAutocomplete.js.map +1 -1
- package/dist/form/Autocomplete.js +9 -7
- package/dist/form/Autocomplete.js.map +1 -1
- package/dist/form/Calendar.js +1 -1
- package/dist/form/CodeEditor.js +14 -9
- package/dist/form/CodeEditor.js.map +1 -1
- package/dist/form/DateRangePicker.js +10 -3
- package/dist/form/DateRangePicker.js.map +1 -1
- package/dist/form/Menubar.js +4 -1
- package/dist/form/Menubar.js.map +1 -1
- package/dist/form/PasswordStrength.js +48 -28
- package/dist/form/PasswordStrength.js.map +1 -1
- package/dist/form/PhoneInput.js +11 -5
- package/dist/form/PhoneInput.js.map +1 -1
- package/dist/form/SearchPalette.js +4 -1
- package/dist/form/SearchPalette.js.map +1 -1
- package/dist/form/Textarea.js +21 -19
- package/dist/form/Textarea.js.map +1 -1
- package/dist/form/UploadButton.js +16 -11
- package/dist/form/UploadButton.js.map +1 -1
- package/dist/layout/ContentToolbar.js +1 -1
- package/dist/layout/Dashboard.js +2 -1
- package/dist/layout/Dashboard.js.map +1 -1
- package/dist/layout/ScrollArea.js +9 -3
- package/dist/layout/ScrollArea.js.map +1 -1
- package/dist/layout/TableFilter.js +1 -1
- package/dist/navigation/Breadcrumbs.js +9 -3
- package/dist/navigation/Breadcrumbs.js.map +1 -1
- package/dist/navigation/CommandPalette.js +20 -7
- package/dist/navigation/CommandPalette.js.map +1 -1
- package/dist/navigation/Pagination.js +1 -1
- package/dist/navigation/Tabs.js +7 -3
- package/dist/navigation/Tabs.js.map +1 -1
- package/dist/pt-BR.js +192 -5
- package/dist/pt-BR.js.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.d.ts +9 -2
- package/dist/types/components/data-display/Alert/Alert.d.ts.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.types.d.ts +25 -9
- package/dist/types/components/data-display/Alert/Alert.types.d.ts.map +1 -1
- package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.d.ts.map +1 -1
- package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts +6 -0
- package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Banner/Banner.d.ts.map +1 -1
- package/dist/types/components/data-display/Banner/Banner.types.d.ts +2 -0
- package/dist/types/components/data-display/Banner/Banner.types.d.ts.map +1 -1
- package/dist/types/components/data-display/CardKit/card-actions-context.d.ts +3 -1
- package/dist/types/components/data-display/CardKit/card-actions-context.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts +3 -0
- package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.parts.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.types.d.ts +7 -0
- package/dist/types/components/data-display/Carousel/Carousel.types.d.ts.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts +1 -0
- package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +5 -0
- package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +29 -1
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +12 -1
- package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-filter-panel.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-grid-bodies.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-pagination.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-table-parts.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts +2 -0
- package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts +9 -0
- package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/LightboxControls.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts +17 -0
- package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts.map +1 -0
- package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts +7 -0
- package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapLayers.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts +9 -0
- package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts +2 -0
- package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.types.d.ts +5 -0
- package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/TableStates.d.ts +3 -1
- package/dist/types/components/data-display/Table/TableStates.d.ts.map +1 -1
- package/dist/types/components/data-display/TimingDiagram/TimingDiagram.d.ts.map +1 -1
- package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts +3 -0
- package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts.map +1 -1
- package/dist/types/components/feedback/Sonner/Sonner.d.ts +8 -0
- package/dist/types/components/feedback/Sonner/Sonner.d.ts.map +1 -1
- package/dist/types/components/feedback/Sonner/Sonner.types.d.ts +2 -0
- package/dist/types/components/feedback/Sonner/Sonner.types.d.ts.map +1 -1
- package/dist/types/components/feedback/Sonner/SonnerToast.d.ts.map +1 -1
- package/dist/types/components/feedback/StackedModal/StackedModal.d.ts.map +1 -1
- package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts +2 -0
- package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
- package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts +2 -0
- package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts +3 -0
- package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts.map +1 -1
- package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts +2 -0
- package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts.map +1 -1
- package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts +7 -0
- package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts.map +1 -1
- package/dist/types/components/form/AddressAutocomplete/AddressAutocompleteField.d.ts.map +1 -1
- package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts +1 -0
- package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts.map +1 -1
- package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts +1 -0
- package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts.map +1 -1
- package/dist/types/components/form/Autocomplete/Autocomplete.d.ts.map +1 -1
- package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts +9 -3
- package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts.map +1 -1
- package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts +7 -0
- package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/Calendar.types.d.ts +6 -0
- package/dist/types/components/form/Calendar/Calendar.types.d.ts.map +1 -1
- package/dist/types/components/form/CodeEditor/CodeEditor.d.ts.map +1 -1
- package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts +7 -0
- package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts.map +1 -1
- package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts +2 -0
- package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts.map +1 -1
- package/dist/types/components/form/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/types/components/form/DateRangePicker/DateRangePicker.range.d.ts.map +1 -1
- package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts +11 -0
- package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts.map +1 -1
- package/dist/types/components/form/DateRangePicker/DateRangePickerFields.d.ts.map +1 -1
- package/dist/types/components/form/Menubar/Menubar.d.ts.map +1 -1
- package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts +1 -0
- package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts.map +1 -1
- package/dist/types/components/form/Menubar/Menubar.types.d.ts +5 -0
- package/dist/types/components/form/Menubar/Menubar.types.d.ts.map +1 -1
- package/dist/types/components/form/PasswordStrength/PasswordStrength.d.ts.map +1 -1
- package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts +4 -2
- package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts.map +1 -1
- package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts +8 -0
- package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts.map +1 -1
- package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
- package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts +7 -0
- package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts.map +1 -1
- package/dist/types/components/form/SearchPalette/SearchPalette.d.ts.map +1 -1
- package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts +2 -0
- package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts.map +1 -1
- package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts +6 -0
- package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts.map +1 -1
- package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
- package/dist/types/components/form/Textarea/Textarea.types.d.ts +16 -1
- package/dist/types/components/form/Textarea/Textarea.types.d.ts.map +1 -1
- package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts +7 -0
- package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
- package/dist/types/components/form/UploadButton/UploadButton.d.ts.map +1 -1
- package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts +6 -3
- package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts.map +1 -1
- package/dist/types/components/form/UploadButton/UploadButton.types.d.ts +7 -0
- package/dist/types/components/form/UploadButton/UploadButton.types.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts +1 -1
- package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts +12 -0
- package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts +1 -1
- package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts +1 -1
- package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts +1 -1
- package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts.map +1 -1
- package/dist/types/components/layout/Dashboard/Dashboard.d.ts +1 -1
- package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts +4 -0
- package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts.map +1 -1
- package/dist/types/components/layout/Dashboard/DashboardParts.d.ts +1 -1
- package/dist/types/components/layout/Dashboard/DashboardParts.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +21 -3
- package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts +2 -0
- package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts.map +1 -1
- package/dist/types/components/layout/TableFilter/TableFilter.d.ts +1 -1
- package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
- package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts +7 -0
- package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts.map +1 -1
- package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts +9 -0
- package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts.map +1 -1
- package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts +2 -0
- package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts.map +1 -1
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +3 -0
- package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -1
- package/dist/types/components/navigation/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts +3 -0
- package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts.map +1 -1
- package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts +2 -0
- package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts.map +1 -1
- package/dist/types/components/navigation/Pagination/Pagination.d.ts.map +1 -1
- package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +2 -0
- package/dist/types/components/navigation/Pagination/Pagination.types.d.ts.map +1 -1
- package/dist/types/components/navigation/Pagination/PaginationParts.d.ts +2 -0
- package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
- package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
- package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +2 -0
- package/dist/types/components/navigation/Tabs/Tabs.types.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +6 -2
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +6 -0
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
- package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts +4 -2
- package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts.map +1 -1
- package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts +8 -7
- package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts.map +1 -1
- package/dist/types/copy/data-display.d.ts +56 -0
- package/dist/types/copy/data-display.d.ts.map +1 -0
- package/dist/types/copy/feedback.d.ts +38 -0
- package/dist/types/copy/feedback.d.ts.map +1 -0
- package/dist/types/copy/form.d.ts +146 -0
- package/dist/types/copy/form.d.ts.map +1 -0
- package/dist/types/copy/layout.d.ts +18 -0
- package/dist/types/copy/layout.d.ts.map +1 -0
- package/dist/types/copy/navigation.d.ts +24 -0
- package/dist/types/copy/navigation.d.ts.map +1 -0
- package/dist/types/copy/shared.d.ts +119 -0
- package/dist/types/copy/shared.d.ts.map +1 -0
- package/dist/types/copy/utility.d.ts +35 -0
- package/dist/types/copy/utility.d.ts.map +1 -0
- package/dist/types/copy.d.ts +13 -113
- package/dist/types/copy.d.ts.map +1 -1
- package/dist/types/pt-BR.d.ts +15 -18
- package/dist/types/pt-BR.d.ts.map +1 -1
- package/dist/types/pt-BR.data-display.d.ts +13 -0
- package/dist/types/pt-BR.data-display.d.ts.map +1 -0
- package/dist/types/pt-BR.feedback.d.ts +8 -0
- package/dist/types/pt-BR.feedback.d.ts.map +1 -0
- package/dist/types/pt-BR.form.d.ts +13 -0
- package/dist/types/pt-BR.form.d.ts.map +1 -0
- package/dist/types/pt-BR.layout.d.ts +7 -0
- package/dist/types/pt-BR.layout.d.ts.map +1 -0
- package/dist/types/pt-BR.navigation.d.ts +8 -0
- package/dist/types/pt-BR.navigation.d.ts.map +1 -0
- package/dist/types/pt-BR.shared.d.ts +21 -0
- package/dist/types/pt-BR.shared.d.ts.map +1 -0
- package/dist/types/pt-BR.utility.d.ts +8 -0
- package/dist/types/pt-BR.utility.d.ts.map +1 -0
- package/dist/types/user-avatar/user-avatar.d.ts +7 -1
- package/dist/types/user-avatar/user-avatar.d.ts.map +1 -1
- package/dist/user-avatar.js +2 -2
- package/dist/user-avatar.js.map +1 -1
- package/dist/utility/InfiniteScroll.js +7 -5
- package/dist/utility/InfiniteScroll.js.map +1 -1
- package/dist/utility/InstallPrompt.js +14 -13
- package/dist/utility/InstallPrompt.js.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/Alert/Alert.tsx +22 -5
- package/src/components/data-display/Alert/Alert.types.ts +20 -10
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +2 -1
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +6 -0
- package/src/components/data-display/Banner/Banner.tsx +5 -2
- package/src/components/data-display/Banner/Banner.types.ts +2 -0
- package/src/components/data-display/CardKit/card-actions-context.tsx +4 -0
- package/src/components/data-display/Carousel/Carousel.chrome.tsx +5 -0
- package/src/components/data-display/Carousel/Carousel.parts.tsx +4 -3
- package/src/components/data-display/Carousel/Carousel.types.ts +7 -0
- package/src/components/data-display/DataGrid/DataGrid.states.tsx +3 -3
- package/src/components/data-display/DataGrid/DataGrid.tsx +1 -1
- package/src/components/data-display/DataGrid/DataGrid.types.ts +5 -0
- package/src/components/data-display/DataViews/data-views-category-pill.tsx +2 -0
- package/src/components/data-display/DataViews/data-views-copy.ts +29 -1
- package/src/components/data-display/DataViews/data-views-day-input.tsx +14 -3
- package/src/components/data-display/DataViews/data-views-filter-panel.tsx +2 -1
- package/src/components/data-display/DataViews/data-views-grid-bodies.tsx +3 -0
- package/src/components/data-display/DataViews/data-views-grid-parts.tsx +9 -10
- package/src/components/data-display/DataViews/data-views-more-fields.tsx +3 -1
- package/src/components/data-display/DataViews/data-views-pagination.tsx +3 -0
- package/src/components/data-display/DataViews/data-views-range-pill.tsx +3 -1
- package/src/components/data-display/DataViews/data-views-table-parts.tsx +1 -0
- package/src/components/data-display/DataViews/data-views-toolbar.tsx +2 -0
- package/src/components/data-display/HoverCard/HoverCard.content.tsx +10 -2
- package/src/components/data-display/HoverCard/HoverCard.tsx +2 -3
- package/src/components/data-display/HoverCard/HoverCard.types.ts +2 -0
- package/src/components/data-display/Lightbox/Lightbox.tsx +3 -0
- package/src/components/data-display/Lightbox/Lightbox.types.ts +9 -0
- package/src/components/data-display/Lightbox/LightboxControls.tsx +28 -15
- package/src/components/data-display/Lightbox/lightbox-copy-context.tsx +42 -0
- package/src/components/data-display/MapPreview/MapControlBar.tsx +17 -9
- package/src/components/data-display/MapPreview/MapLayers.tsx +2 -0
- package/src/components/data-display/MapPreview/MapPreview.types.ts +10 -0
- package/src/components/data-display/MapPreview/MapSearchBar.tsx +4 -1
- package/src/components/data-display/Table/Table.tsx +7 -2
- package/src/components/data-display/Table/Table.types.ts +5 -0
- package/src/components/data-display/Table/TableStates.tsx +2 -2
- package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +3 -2
- package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +3 -0
- package/src/components/feedback/Sonner/Sonner.tsx +15 -3
- package/src/components/feedback/Sonner/Sonner.types.ts +2 -0
- package/src/components/feedback/Sonner/SonnerToast.tsx +2 -1
- package/src/components/feedback/StackedModal/StackedModal.parts.tsx +10 -3
- package/src/components/feedback/StackedModal/StackedModal.tsx +2 -1
- package/src/components/feedback/StackedModal/StackedModal.types.ts +2 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +13 -1
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +3 -0
- package/src/components/feedback/TutorialOverlay/TutorialStepBody.tsx +10 -4
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +7 -0
- package/src/components/form/AddressAutocomplete/AddressAutocompleteField.tsx +2 -0
- package/src/components/form/AddressAutocomplete/AddressFallbackField.tsx +4 -2
- package/src/components/form/AddressAutocomplete/AddressInputField.tsx +13 -6
- package/src/components/form/Autocomplete/Autocomplete.parts.tsx +9 -6
- package/src/components/form/Autocomplete/Autocomplete.tsx +2 -1
- package/src/components/form/Autocomplete/Autocomplete.types.ts +7 -0
- package/src/components/form/Calendar/Calendar.tsx +2 -2
- package/src/components/form/Calendar/Calendar.types.ts +7 -0
- package/src/components/form/CodeEditor/CodeEditor.tsx +6 -4
- package/src/components/form/CodeEditor/CodeEditor.types.ts +7 -0
- package/src/components/form/CodeEditor/CodeEditorToolbar.tsx +12 -5
- package/src/components/form/DateRangePicker/DateRangePicker.range.ts +2 -0
- package/src/components/form/DateRangePicker/DateRangePicker.tsx +4 -0
- package/src/components/form/DateRangePicker/DateRangePicker.types.ts +11 -0
- package/src/components/form/DateRangePicker/DateRangePickerFields.tsx +2 -0
- package/src/components/form/Menubar/Menubar.toolbar.tsx +3 -1
- package/src/components/form/Menubar/Menubar.tsx +2 -1
- package/src/components/form/Menubar/Menubar.types.ts +5 -0
- package/src/components/form/PasswordStrength/PasswordStrength.helpers.tsx +33 -17
- package/src/components/form/PasswordStrength/PasswordStrength.tsx +29 -13
- package/src/components/form/PasswordStrength/PasswordStrength.types.ts +9 -0
- package/src/components/form/PhoneInput/PhoneInput.tsx +15 -5
- package/src/components/form/PhoneInput/PhoneInput.types.ts +7 -0
- package/src/components/form/SearchPalette/SearchPalette.parts.tsx +4 -1
- package/src/components/form/SearchPalette/SearchPalette.tsx +4 -1
- package/src/components/form/SearchPalette/SearchPalette.types.ts +6 -0
- package/src/components/form/Textarea/Textarea.tsx +6 -1
- package/src/components/form/Textarea/Textarea.types.ts +14 -1
- package/src/components/form/Textarea/TextareaRichEditor.tsx +28 -18
- package/src/components/form/UploadButton/UploadButton.parts.tsx +16 -7
- package/src/components/form/UploadButton/UploadButton.tsx +4 -1
- package/src/components/form/UploadButton/UploadButton.types.ts +8 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.tsx +10 -2
- package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +12 -0
- package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +15 -4
- package/src/components/layout/ContentToolbar/SortByDropdown.tsx +12 -3
- package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -1
- package/src/components/layout/Dashboard/Dashboard.types.ts +4 -0
- package/src/components/layout/Dashboard/DashboardParts.tsx +2 -1
- package/src/components/layout/ScrollArea/ScrollArea.tsx +16 -3
- package/src/components/layout/ScrollArea/ScrollArea.types.ts +19 -4
- package/src/components/layout/ScrollArea/ScrollViewport.tsx +4 -1
- package/src/components/layout/TableFilter/TableFilter.tsx +19 -11
- package/src/components/layout/TableFilter/TableFilter.types.ts +8 -0
- package/src/components/layout/TableFilter/TableFilterContext.tsx +10 -0
- package/src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx +11 -4
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +2 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +3 -0
- package/src/components/navigation/CommandPalette/CommandPalette.tsx +15 -5
- package/src/components/navigation/CommandPalette/CommandPalette.types.ts +3 -0
- package/src/components/navigation/CommandPalette/CommandPaletteResults.tsx +5 -2
- package/src/components/navigation/Pagination/Pagination.tsx +2 -0
- package/src/components/navigation/Pagination/Pagination.types.ts +2 -0
- package/src/components/navigation/Pagination/PaginationParts.tsx +4 -1
- package/src/components/navigation/Tabs/Tabs.tsx +8 -3
- package/src/components/navigation/Tabs/Tabs.types.ts +2 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +4 -4
- package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +4 -2
- package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +6 -0
- package/src/components/utility/InstallPrompt/InstallPrompt.tsx +18 -13
- package/src/components/utility/InstallPrompt/InstallPrompt.types.ts +9 -7
- package/src/copy/data-display.ts +60 -0
- package/src/copy/feedback.ts +39 -0
- package/src/copy/form.ts +154 -0
- package/src/copy/layout.ts +18 -0
- package/src/copy/navigation.ts +25 -0
- package/src/copy/shared.ts +122 -0
- package/src/copy/utility.ts +36 -0
- package/src/copy.ts +13 -117
- package/src/pt-BR.data-display.ts +236 -0
- package/src/pt-BR.feedback.ts +25 -0
- package/src/pt-BR.form.ts +96 -0
- package/src/pt-BR.layout.ts +15 -0
- package/src/pt-BR.navigation.ts +21 -0
- package/src/pt-BR.shared.ts +94 -0
- package/src/pt-BR.ts +15 -267
- package/src/pt-BR.utility.ts +21 -0
- package/src/user-avatar/user-avatar.tsx +8 -2
- package/dist/chunk-3KWD5Y5O.js.map +0 -1
- package/dist/chunk-CEKPLUQV.js.map +0 -1
- package/dist/chunk-DFVRZ3UK.js.map +0 -1
- package/dist/chunk-H7UAGTVW.js.map +0 -1
- package/dist/chunk-JP55QWVR.js.map +0 -1
- package/dist/chunk-NUCLEOHF.js.map +0 -1
- package/dist/chunk-QLBYAYUG.js.map +0 -1
- package/dist/chunk-QZZVHY6U.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/data-display/MapPreview/MapPreview.tsx","../../src/components/data-display/MapPreview/MapPreview.helpers.ts","../../src/components/data-display/MapPreview/MapPreview.constants.ts","../../src/components/data-display/MapPreview/MapLayers.tsx","../../src/components/data-display/MapPreview/MapControlBar.tsx","../../src/components/data-display/MapPreview/MapOverlays.tsx","../../src/components/data-display/MapPreview/MapSearchBar.tsx","../../src/components/data-display/MapPreview/MapMarkers.tsx","../../src/components/data-display/MapPreview/mapSurface.ts","../../src/components/data-display/MapPreview/StaticMapView.tsx","../../src/components/data-display/MapPreview/mapProjection.ts","../../src/components/data-display/MapPreview/MapDecorations.tsx","../../src/components/data-display/MapPreview/MapTiles.tsx","../../src/components/data-display/MapPreview/useMapPreview.ts","../../src/components/data-display/MapPreview/MapPreview.hooks.ts"],"sourcesContent":["import { alpha, Box, Paper, styled, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { glassStyles, resolveMapPreviewProps } from './MapPreview.helpers';\nimport type { MapPreviewProps } from './MapPreview.types';\nimport { MapLayers } from './MapLayers';\nimport { MapCoordinates, MapMarkers } from './MapMarkers';\nimport { StaticMapView } from './StaticMapView';\nimport { useMapPreview } from './useMapPreview';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst MapContainer = styled(Paper)(({ theme }) => ({\n position: 'relative',\n width: '100%',\n borderRadius: theme.shape.borderRadius * 2,\n overflow: 'hidden',\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.9)} 0%, ${alpha(theme.palette.background.paper, 0.8)} 100%)`,\n border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,\n}));\n\nconst MapWrapper = styled(Box)<{ height: string }>(({ height }) => ({\n width: '100%',\n height,\n position: 'relative',\n}));\n\nconst cursorFor = (grabbing: boolean, interactive: boolean): string => {\n if (grabbing) return 'grabbing';\n return interactive ? 'grab' : 'default';\n};\n\nexport const MapPreview: FC<MapPreviewProps> = (componentProps) => {\n const props = resolveMapPreviewProps(componentProps);\n const theme = useTheme();\n const { containerRef, view, controls, pointer, search, handleMapClick } = useMapPreview(props);\n\n const height = controls.isFullscreen ? '100vh' : props.height;\n const grabbing = pointer.isDragging || pointer.isPanning;\n\n return (\n <MapContainer\n ref={containerRef}\n elevation={props.variant === 'glass' ? 0 : 2}\n data-testid=\"map-preview-container\"\n role=\"img\"\n aria-label={`Map preview centered at ${view.markerPosition.lat.toFixed(4)}, ${view.markerPosition.lng.toFixed(4)} with zoom level ${view.zoom}`}\n tabIndex={0}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n sx={glassStyles(props.variant, theme)}\n >\n <MapWrapper\n height={height}\n onClick={handleMapClick}\n onMouseDown={pointer.handleMouseDown}\n onMouseMove={pointer.handleMouseMove}\n onMouseUp={pointer.handleMouseUp}\n onMouseLeave={pointer.handleMouseUp}\n style={{\n cursor: cursorFor(grabbing, props.interactive),\n transition: props.animated ? 'all 0.3s ease' : 'none',\n }}\n >\n <StaticMapView\n height={height}\n zoom={view.zoom}\n mapType={view.mapType}\n // The built-in centre marker steps aside for an explicit marker list.\n marker={props.marker && props.markers.length === 0}\n markerPosition={view.markerPosition}\n panOffset={view.panOffset}\n />\n\n <MapMarkers markers={props.markers} centre={view.markerPosition} animated={props.animated} />\n\n <MapLayers\n settings={props}\n zoom={view.zoom}\n mapType={view.mapType}\n search={search}\n controls={controls}\n />\n\n <MapCoordinates position={view.markerPosition} zoom={view.zoom} />\n </MapWrapper>\n </MapContainer>\n );\n};\n\nexport default MapPreview;\n","import type { Theme } from '@mui/material';\nimport { alpha } from '@mui/material';\n\nimport { DEFAULT_ZOOM } from './MapPreview.constants';\nimport type { MapPreviewProps } from './MapPreview.types';\n\ntype MapDefaultedKeys =\n | 'markers'\n | 'marker'\n | 'height'\n | 'interactive'\n | 'zoom'\n | 'mapType'\n | 'variant'\n | 'showControls'\n | 'showSearch'\n | 'searchPlaceholder'\n | 'showRoute'\n | 'heatmapData'\n | 'showHeatmap'\n | 'animated';\n\nexport type ResolvedMapPreviewProps = MapPreviewProps &\n Required<Pick<MapPreviewProps, MapDefaultedKeys>>;\n\nconst MAP_PREVIEW_DEFAULTS: Pick<MapPreviewProps, MapDefaultedKeys> = {\n markers: [],\n marker: true,\n height: '400px',\n interactive: false,\n zoom: DEFAULT_ZOOM,\n mapType: 'roadmap',\n variant: 'default',\n showControls: true,\n showSearch: false,\n searchPlaceholder: 'Search location...',\n showRoute: false,\n heatmapData: [],\n showHeatmap: false,\n animated: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = (props: MapPreviewProps): Partial<MapPreviewProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<MapPreviewProps>;\n\n// Applied as a merge rather than destructuring defaults, which would otherwise\n// put fourteen branches into the component's own complexity budget.\nexport const resolveMapPreviewProps = (props: MapPreviewProps): ResolvedMapPreviewProps =>\n ({ ...MAP_PREVIEW_DEFAULTS, ...definedProps(props) }) as ResolvedMapPreviewProps;\n\nexport const glassStyles = (variant: MapPreviewProps['variant'], theme: Theme) =>\n variant === 'glass'\n ? {\n background: alpha(theme.palette.background.paper, 0.7),\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n }\n : {};\n","import type { MapType } from './MapPreview.types';\n\nexport const MIN_ZOOM = 1;\nexport const MAX_ZOOM = 20;\nexport const DEFAULT_ZOOM = 15;\nexport const CITY_ZOOM = 12;\n\n// The order the map-type button cycles through.\nexport const MAP_TYPES: MapType[] = ['roadmap', 'satellite', 'hybrid', 'terrain'];\n\n// Degrees of movement per pixel dragged — small enough that a drag reads as a\n// nudge rather than a jump.\nexport const DRAG_DEGREES_PER_PIXEL = 0.0001;\n\n// Spread of the simulated coordinate change a map click produces.\nexport const CLICK_JITTER_DEGREES = 0.001;\n\nexport const MARKER_PIXELS_PER_DEGREE = 100;\nexport const HEATMAP_VIEWBOX = { width: 800, height: 400 };\n","import { useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { HEATMAP_VIEWBOX } from './MapPreview.constants';\nimport type { ResolvedMapPreviewProps } from './MapPreview.helpers';\nimport type { MapType } from './MapPreview.types';\nimport { MapControlBar } from './MapControlBar';\nimport { HeatmapOverlay, RouteOverlay } from './MapOverlays';\nimport { MapSearchBar } from './MapSearchBar';\n\nexport interface MapLayersProps {\n settings: ResolvedMapPreviewProps;\n zoom: number;\n mapType: MapType;\n search: {\n searchValue: string;\n isSearching: boolean;\n setSearchValue: (value: string) => void;\n handleSearch: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n };\n controls: {\n handleZoomIn: () => void;\n handleZoomOut: () => void;\n handleCenter: () => void;\n handleToggleMapType: () => void;\n handleToggleFullscreen: () => void;\n };\n}\n\n// Everything drawn over the map surface that is switched on by a prop.\nexport const MapLayers: FC<MapLayersProps> = ({ settings, zoom, mapType, search, controls }) => {\n const theme = useTheme();\n\n return (\n <>\n {settings.showHeatmap && settings.heatmapData.length > 0 && (\n <HeatmapOverlay\n points={settings.heatmapData}\n width={HEATMAP_VIEWBOX.width}\n height={HEATMAP_VIEWBOX.height}\n />\n )}\n\n {settings.showRoute && <RouteOverlay color={settings.routeColor || theme.palette.primary.main} />}\n\n {settings.showSearch && (\n <MapSearchBar\n value={search.searchValue}\n placeholder={settings.searchPlaceholder}\n isSearching={search.isSearching}\n onChange={search.setSearchValue}\n onSubmit={search.handleSearch}\n />\n )}\n\n {settings.showControls && (\n <MapControlBar\n zoom={zoom}\n mapType={mapType}\n onZoomIn={controls.handleZoomIn}\n onZoomOut={controls.handleZoomOut}\n onCenter={controls.handleCenter}\n onToggleMapType={controls.handleToggleMapType}\n onToggleFullscreen={controls.handleToggleFullscreen}\n />\n )}\n </>\n );\n};\n","import FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport LayersIcon from '@mui/icons-material/Layers';\nimport CenterIcon from '@mui/icons-material/MyLocation';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport { alpha, Box, IconButton, styled, Tooltip } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { MAX_ZOOM, MIN_ZOOM } from './MapPreview.constants';\nimport type { MapType } from './MapPreview.types';\n\n// Kept module-local: the inferred type of a styled() component cannot be named\n// across a module boundary here (TS2742).\nconst MapControls = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(2),\n right: theme.spacing(2),\n zIndex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nconst ControlButton = styled(IconButton)(({ theme }) => ({\n background: alpha(theme.palette.background.paper, 0.95),\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[2],\n // Kept clickable while disabled so hover tooltips still work at the limits.\n pointerEvents: 'auto',\n '&:hover': {\n background: theme.palette.background.paper,\n transform: 'scale(1.05)',\n },\n '&:disabled': {\n opacity: 0.5,\n pointerEvents: 'auto',\n },\n}));\n\nexport interface MapControlBarProps {\n zoom: number;\n mapType: MapType;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onCenter: () => void;\n onToggleMapType: () => void;\n onToggleFullscreen: () => void;\n}\n\nexport const MapControlBar: FC<MapControlBarProps> = ({\n zoom,\n mapType,\n onZoomIn,\n onZoomOut,\n onCenter,\n onToggleMapType,\n onToggleFullscreen,\n}) => (\n <MapControls data-testid=\"map-controls\">\n <Tooltip title=\"Zoom in\" placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onZoomIn}\n aria-label=\"Zoom in\"\n data-testid=\"zoom-in-button\"\n disabled={zoom >= MAX_ZOOM}\n >\n <ZoomInIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title=\"Zoom out\" placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onZoomOut}\n aria-label=\"Zoom out\"\n data-testid=\"zoom-out-button\"\n disabled={zoom <= MIN_ZOOM}\n >\n <ZoomOutIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title=\"Center map\" placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onCenter}\n aria-label=\"Center map\"\n data-testid=\"center-button\"\n >\n <CenterIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title={`Map type: ${mapType}`} placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onToggleMapType}\n aria-label=\"Change map type\"\n data-testid=\"map-type-button\"\n >\n <LayersIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title=\"Toggle fullscreen\" placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onToggleFullscreen}\n aria-label=\"Toggle fullscreen\"\n data-testid=\"fullscreen-button\"\n >\n <FullscreenIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n </MapControls>\n);\n","import { useTheme } from '@mui/material';\nimport type { CSSProperties, FC } from 'react';\nimport React from 'react';\n\nimport type { HeatmapPoint } from './MapPreview.types';\n\nconst OVERLAY_STYLE: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 1,\n};\n\nconst MAX_HEAT_RADIUS = 30;\nconst MAX_HEAT_OPACITY = 0.3;\nconst DEGREES_TO_PIXELS = 10;\n\nexport interface HeatmapOverlayProps {\n points: HeatmapPoint[];\n width: number;\n height: number;\n}\n\n// Each point's weight drives both its radius and its opacity, so denser areas\n// read hotter where circles overlap.\nexport const HeatmapOverlay: FC<HeatmapOverlayProps> = ({ points, width, height }) => {\n const theme = useTheme();\n\n if (points.length === 0) return null;\n\n return (\n <svg style={OVERLAY_STYLE} viewBox={`0 0 ${width} ${height}`}>\n {points.map((point, index) => (\n <circle\n key={`${point.lat}-${point.lng}-${index}`}\n cx={width / 2 + point.lng * DEGREES_TO_PIXELS}\n cy={height / 2 - point.lat * DEGREES_TO_PIXELS}\n r={MAX_HEAT_RADIUS * point.weight}\n fill={theme.palette.error.main}\n opacity={MAX_HEAT_OPACITY * point.weight}\n />\n ))}\n </svg>\n );\n};\n\nexport const RouteOverlay: FC<{ color: string }> = ({ color }) => {\n const theme = useTheme();\n\n return (\n <svg style={OVERLAY_STYLE} viewBox=\"0 0 100 100\">\n <path\n d=\"M 20,20 Q 40,10 50,30 T 80,80\"\n stroke={color || theme.palette.primary.main}\n strokeWidth=\"3\"\n fill=\"none\"\n strokeDasharray=\"5,5\"\n opacity=\"0.8\"\n >\n {/* Marching-ants dashes to suggest direction of travel. */}\n <animate attributeName=\"stroke-dashoffset\" values=\"0;10\" dur=\"1s\" repeatCount=\"indefinite\" />\n </path>\n </svg>\n );\n};\n","import SearchIcon from '@mui/icons-material/Search';\nimport { alpha, Box, InputAdornment, styled, TextField } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst SearchBar = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 2,\n width: '90%',\n maxWidth: 400,\n}));\n\nconst SearchField = styled(TextField)(({ theme }) => ({\n '& .MuiOutlinedInput-root': {\n background: alpha(theme.palette.background.paper, 0.95),\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n borderRadius: theme.shape.borderRadius * 2,\n '& fieldset': {\n borderColor: alpha(theme.palette.divider, 0.2),\n },\n },\n}));\n\nexport interface MapSearchBarProps {\n value: string;\n placeholder: string;\n isSearching: boolean;\n onChange: (value: string) => void;\n onSubmit: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nexport const MapSearchBar: FC<MapSearchBarProps> = ({\n value,\n placeholder,\n isSearching,\n onChange,\n onSubmit,\n}) => (\n <SearchBar>\n <SearchField\n fullWidth\n size=\"small\"\n placeholder={placeholder}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyPress={onSubmit}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" sx={{ opacity: isSearching ? 0.5 : 1 }} />\n </InputAdornment>\n ),\n }}\n disabled={isSearching}\n aria-label=\"Search location\"\n />\n </SearchBar>\n);\n","import LocationIcon from '@mui/icons-material/LocationOn';\nimport { alpha, Box, styled, Tooltip, Typography, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { MARKER_PIXELS_PER_DEGREE } from './MapPreview.constants';\nimport type { LatLng, MapMarker } from './MapPreview.types';\nimport { BOUNCE_KEYFRAMES } from './mapSurface';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst CoordinatesDisplay = styled(Box)(({ theme }) => ({\n position: 'absolute',\n bottom: theme.spacing(2),\n left: theme.spacing(2),\n padding: theme.spacing(1, 1.5),\n background: alpha(theme.palette.background.paper, 0.95),\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n borderRadius: theme.shape.borderRadius,\n zIndex: 1,\n}));\n\nexport interface MapMarkersProps {\n markers: MapMarker[];\n centre: LatLng;\n animated: boolean;\n}\n\n// Markers are placed relative to the current centre, so panning moves them with\n// the surface.\nexport const MapMarkers: FC<MapMarkersProps> = ({ markers, centre, animated }) => {\n const theme = useTheme();\n\n return (\n <>\n {markers.map((markerItem, index) => (\n <Box\n key={`${markerItem.position.lat}-${markerItem.position.lng}-${index}`}\n data-testid={`map-marker-${index}`}\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: `translate(\n ${(markerItem.position.lng - centre.lng) * MARKER_PIXELS_PER_DEGREE}px,\n ${-(markerItem.position.lat - centre.lat) * MARKER_PIXELS_PER_DEGREE}px\n )`,\n zIndex: 3,\n cursor: markerItem.onClick ? 'pointer' : 'default',\n }}\n onClick={markerItem.onClick}\n title={markerItem.title}\n >\n <Tooltip title={markerItem.description || markerItem.title || ''}>\n <LocationIcon\n sx={{\n fontSize: 32,\n color: theme.palette.error.main,\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.3))',\n animation: animated ? 'bounce 2s infinite' : 'none',\n '@keyframes bounce': BOUNCE_KEYFRAMES,\n }}\n />\n </Tooltip>\n </Box>\n ))}\n </>\n );\n};\n\nexport const MapCoordinates: FC<{ position: LatLng; zoom: number }> = ({ position, zoom }) => (\n <CoordinatesDisplay data-testid=\"coordinates-display\">\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace' }}>\n Lat: {position.lat.toFixed(6)}, Lng: {position.lng.toFixed(6)}\n </Typography>\n {zoom > 0 && (\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace', display: 'block' }}>\n Zoom: {zoom}\n </Typography>\n )}\n </CoordinatesDisplay>\n);\n","import type { Theme } from '@mui/material';\nimport { alpha } from '@mui/material';\n\nimport type { MapType } from './MapPreview.types';\n\ntype GreyShade = keyof Theme['palette']['grey'];\n\nconst greyGradient = (theme: Theme, from: GreyShade, to: GreyShade, opacity = 1): string => {\n const shade = (key: GreyShade) => alpha(theme.palette.grey[key], opacity);\n return `linear-gradient(135deg, ${shade(from)} 0%, ${shade(to)} 100%)`;\n};\n\n// The backdrop behind the tiles: dark for satellite, green for terrain, and\n// grey for road maps, following the theme's own light/dark choice.\nexport const surfaceBackground = (mapType: MapType, theme: Theme): string => {\n if (mapType === 'satellite') return greyGradient(theme, 900, 800);\n if (mapType === 'terrain') {\n return `linear-gradient(135deg, ${alpha('#8BC34A', 0.2)} 0%, ${alpha('#4CAF50', 0.3)} 100%)`;\n }\n if (theme.palette.mode === 'dark') return greyGradient(theme, 900, 800);\n return greyGradient(theme, 100, 200);\n};\n\nexport const tileBackground = (mapType: MapType, theme: Theme): string => {\n if (mapType === 'satellite') {\n return `linear-gradient(135deg, ${alpha('#1a1a1a', 0.9)} 0%, ${alpha('#2a2a2a', 0.9)} 100%)`;\n }\n if (mapType === 'terrain') {\n return `linear-gradient(135deg, ${alpha('#7cb342', 0.1)} 0%, ${alpha('#558b2f', 0.1)} 100%)`;\n }\n return greyGradient(theme, 100, 200, 0.5);\n};\n\nexport const BOUNCE_KEYFRAMES = {\n '0%, 100%': { transform: 'translateY(0)' },\n '50%': { transform: 'translateY(-10px)' },\n} as const;\n","import { Box, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React, { useMemo } from 'react';\n\nimport { getTileCoordinates } from './mapProjection';\nimport { surfaceBackground } from './mapSurface';\nimport type { LatLng, MapType } from './MapPreview.types';\nimport {\n MapCentreMarker,\n MapCompass,\n MapDecorativePins,\n MapRoads,\n MapScaleBar,\n} from './MapDecorations';\nimport { MapTiles } from './MapTiles';\n\nexport interface StaticMapViewProps {\n height: string;\n zoom: number;\n mapType: MapType;\n marker?: boolean;\n markerPosition?: LatLng;\n panOffset?: { x: number; y: number };\n}\n\n// A stand-in map surface: a tile grid at the right coordinates for the current\n// position and zoom, with the usual furniture drawn over it.\nexport const StaticMapView: FC<StaticMapViewProps> = ({\n height,\n zoom,\n mapType,\n marker,\n markerPosition,\n panOffset = { x: 0, y: 0 },\n}) => {\n const theme = useTheme();\n\n const tileOrigin = useMemo(\n () =>\n markerPosition ? getTileCoordinates(markerPosition.lat, markerPosition.lng, zoom) : null,\n [markerPosition, zoom],\n );\n\n return (\n <Box\n data-testid=\"static-map-view\"\n sx={{\n width: '100%',\n height,\n position: 'relative',\n background: surfaceBackground(mapType, theme),\n overflow: 'hidden',\n }}\n >\n <MapTiles origin={tileOrigin} zoom={zoom} mapType={mapType} panOffset={panOffset} />\n <MapRoads />\n {marker && <MapCentreMarker />}\n <MapDecorativePins />\n <MapScaleBar zoom={zoom} />\n <MapCompass />\n </Box>\n );\n};\n","export const TILE_SIZE = 256;\n\n// Metres covered by one pixel at zoom 0 on the equator; each zoom level halves it.\nconst EQUATOR_METRES_PER_PIXEL = 156543.03392;\nconst SCALE_BAR_PIXELS = 100;\nconst GEOCODE_DELAY_MS = 300;\n\n// Web Mercator. Longitude maps linearly; latitude goes through the log of the\n// tangent, clamped just short of the poles where that diverges.\nconst project = (lat: number, lng: number) => {\n const siny = Math.sin((lat * Math.PI) / 180);\n const boundedSiny = Math.max(-0.9999, Math.min(0.9999, siny));\n\n return {\n x: TILE_SIZE * (0.5 + lng / 360),\n y: TILE_SIZE * (0.5 - Math.log((1 + boundedSiny) / (1 - boundedSiny)) / (4 * Math.PI)),\n };\n};\n\nexport const getTileCoordinates = (lat: number, lng: number, zoom: number) => {\n const scale = 1 << zoom;\n const world = project(lat, lng);\n\n return {\n x: Math.floor(Math.floor(world.x * scale) / TILE_SIZE),\n y: Math.floor(Math.floor(world.y * scale) / TILE_SIZE),\n };\n};\n\nexport const getScaleDistance = (zoom: number): string => {\n const distance = (EQUATOR_METRES_PER_PIXEL / Math.pow(2, zoom)) * SCALE_BAR_PIXELS;\n\n if (distance >= 1000) return `${Math.round(distance / 1000)} km`;\n // Round to the nearest 100m so the bar reads as a round number.\n if (distance >= 100) return `${Math.round(distance / 100) * 100} m`;\n return `${Math.round(distance)} m`;\n};\n\nconst MOCK_GEOCODE_RESULTS: Record<string, { lat: number; lng: number }> = {\n 'san francisco': { lat: 37.7749, lng: -122.4194 },\n 'new york': { lat: 40.7128, lng: -74.006 },\n london: { lat: 51.5074, lng: -0.1278 },\n tokyo: { lat: 35.6762, lng: 139.6503 },\n paris: { lat: 48.8566, lng: 2.3522 },\n};\n\n// Stands in for a Places lookup, delay included so the disabled search field is\n// actually observable.\nexport const geocode = async (address: string): Promise<{ lat: number; lng: number } | null> => {\n await new Promise((resolve) => window.setTimeout(resolve, GEOCODE_DELAY_MS));\n return MOCK_GEOCODE_RESULTS[address.toLowerCase().trim()] || null;\n};\n","import LocationIcon from '@mui/icons-material/LocationOn';\nimport NavigationIcon from '@mui/icons-material/Navigation';\nimport PlaceIcon from '@mui/icons-material/Place';\nimport { alpha, Box, Typography, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { getScaleDistance } from './mapProjection';\nimport { BOUNCE_KEYFRAMES } from './mapSurface';\n\n// Decorative only: these give the mock surface something to look like without\n// standing in for real map data.\nexport const MapRoads: FC = () => {\n const theme = useTheme();\n\n return (\n <Box sx={{ position: 'absolute', top: '20%', left: '15%', width: '70%', height: '60%', opacity: 0.2 }}>\n <svg width=\"100%\" height=\"100%\" style={{ position: 'absolute' }}>\n <path\n d=\"M 10,50 Q 30,30 50,50 T 90,50\"\n stroke={theme.palette.text.secondary}\n strokeWidth=\"2\"\n fill=\"none\"\n opacity=\"0.3\"\n />\n <path\n d=\"M 50,10 L 50,90\"\n stroke={theme.palette.text.secondary}\n strokeWidth=\"1.5\"\n fill=\"none\"\n opacity=\"0.3\"\n />\n <path\n d=\"M 20,30 L 80,70\"\n stroke={theme.palette.text.secondary}\n strokeWidth=\"1\"\n fill=\"none\"\n opacity=\"0.2\"\n />\n </svg>\n </Box>\n );\n};\n\nconst DecorativePin: FC<{ top: string; left: string }> = ({ top, left }) => {\n const theme = useTheme();\n\n return (\n <Box sx={{ position: 'absolute', top, left, opacity: 0.6 }}>\n <PlaceIcon sx={{ fontSize: 20, color: theme.palette.primary.main }} />\n </Box>\n );\n};\n\nexport const MapDecorativePins: FC = () => (\n <>\n <DecorativePin top=\"30%\" left=\"25%\" />\n <DecorativePin top=\"65%\" left=\"70%\" />\n </>\n);\n\nexport const MapCentreMarker: FC = () => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid=\"map-marker\"\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -100%)',\n zIndex: 2,\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.3))',\n }}\n >\n <LocationIcon\n sx={{\n fontSize: 36,\n color: theme.palette.error.main,\n animation: 'bounce 2s infinite',\n '@keyframes bounce': BOUNCE_KEYFRAMES,\n }}\n />\n </Box>\n );\n};\n\nexport const MapScaleBar: FC<{ zoom: number }> = ({ zoom }) => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n position: 'absolute',\n bottom: theme.spacing(2),\n right: theme.spacing(2),\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n padding: theme.spacing(0.5, 1),\n background: alpha(theme.palette.background.paper, 0.9),\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n }}\n >\n <Box\n sx={{\n width: 40,\n height: 2,\n background: theme.palette.text.secondary,\n position: 'relative',\n // The end caps that make the bar read as a measurement.\n '&::before, &::after': {\n content: '\"\"',\n position: 'absolute',\n width: 2,\n height: 6,\n background: theme.palette.text.secondary,\n },\n '&::before': { left: 0, top: -2 },\n '&::after': { right: 0, top: -2 },\n }}\n />\n <Typography variant=\"caption\">{getScaleDistance(zoom)}</Typography>\n </Box>\n );\n};\n\nexport const MapCompass: FC = () => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n width: 40,\n height: 40,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: alpha(theme.palette.background.paper, 0.9),\n borderRadius: '50%',\n boxShadow: theme.shadows[2],\n }}\n >\n <NavigationIcon\n sx={{ fontSize: 24, color: theme.palette.primary.main, transform: 'rotate(-45deg)' }}\n />\n </Box>\n );\n};\n","import { alpha, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { TILE_SIZE } from './mapProjection';\nimport { tileBackground } from './mapSurface';\nimport type { MapType } from './MapPreview.types';\n\n// Two extra rows and columns so panning does not expose an edge.\nconst VISIBLE_TILES = Math.ceil(800 / TILE_SIZE) + 2;\n// Tile coordinates are only legible once the grid is reasonably fine.\nconst LABEL_MIN_ZOOM = 10;\n\nexport interface MapTilesProps {\n origin: { x: number; y: number } | null;\n zoom: number;\n mapType: MapType;\n panOffset: { x: number; y: number };\n}\n\nexport const MapTiles: FC<MapTilesProps> = ({ origin, zoom, mapType, panOffset }) => {\n const theme = useTheme();\n const borderOpacity = theme.palette.mode === 'dark' ? 0.15 : 0.1;\n const background = tileBackground(mapType, theme);\n const half = Math.floor(VISIBLE_TILES / 2);\n\n return (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: `translate(calc(-50% + ${panOffset.x}px), calc(-50% + ${panOffset.y}px))`,\n width: TILE_SIZE * VISIBLE_TILES,\n height: TILE_SIZE * VISIBLE_TILES,\n display: 'grid',\n gridTemplateColumns: `repeat(${VISIBLE_TILES}, ${TILE_SIZE}px)`,\n gridTemplateRows: `repeat(${VISIBLE_TILES}, ${TILE_SIZE}px)`,\n transition: 'transform 0.1s ease-out',\n }}\n >\n {Array.from({ length: VISIBLE_TILES * VISIBLE_TILES }).map((_, index) => {\n // The grid is centred on the origin tile, so indices run from -half.\n const tileX = (origin?.x || 0) + (index % VISIBLE_TILES) - half;\n const tileY = (origin?.y || 0) + Math.floor(index / VISIBLE_TILES) - half;\n\n return (\n <div\n key={`tile-${tileX}-${tileY}`}\n style={{\n width: TILE_SIZE,\n height: TILE_SIZE,\n border: `1px solid ${alpha(theme.palette.divider, borderOpacity)}`,\n background,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '10px',\n color: alpha(theme.palette.text.secondary, 0.3),\n fontFamily: 'monospace',\n userSelect: 'none',\n }}\n >\n {zoom > LABEL_MIN_ZOOM && `${tileX},${tileY}`}\n </div>\n );\n })}\n </div>\n );\n};\n","import { useMemo, useRef } from 'react';\n\nimport {\n useMapClick,\n useMapControls,\n useMapPointer,\n useMapSearch,\n useMapView,\n} from './MapPreview.hooks';\nimport type { ResolvedMapPreviewProps } from './MapPreview.helpers';\n\n// Wires the map's independent concerns together: the view state first, then the\n// controls, pointer handling and search that all write to it.\nexport const useMapPreview = (props: ResolvedMapPreviewProps) => {\n const { center, coordinates: legacyCoordinates, interactive, onMarkerDrag, onMapClick } = props;\n\n // `center` supersedes the older `coordinates` prop; either may be omitted.\n const coordinates = useMemo(\n () => center || legacyCoordinates || { lat: 0, lng: 0 },\n [center, legacyCoordinates],\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const view = useMapView({\n coordinates,\n initialZoom: props.zoom,\n initialMapType: props.mapType,\n });\n\n const controls = useMapControls({\n coordinates,\n zoom: view.zoom,\n mapType: view.mapType,\n zoomTo: view.zoomTo,\n setMapType: view.setMapType,\n setMarkerPosition: view.setMarkerPosition,\n setPanOffset: view.setPanOffset,\n containerRef,\n });\n\n const pointer = useMapPointer({\n interactive,\n markerPosition: view.markerPosition,\n panOffset: view.panOffset,\n onMarkerDrag,\n setMarkerPosition: view.setMarkerPosition,\n setPanOffset: view.setPanOffset,\n });\n\n const search = useMapSearch({ zoomTo: view.zoomTo, setMarkerPosition: view.setMarkerPosition });\n\n const handleMapClick = useMapClick({\n coordinates,\n interactive,\n isPanning: pointer.isPanning,\n onMapClick,\n onMarkerDrag,\n setMarkerPosition: view.setMarkerPosition,\n });\n\n return { containerRef, view, controls, pointer, search, handleMapClick };\n};\n","import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { geocode } from './mapProjection';\nimport {\n CITY_ZOOM,\n CLICK_JITTER_DEGREES,\n DRAG_DEGREES_PER_PIXEL,\n MAP_TYPES,\n MAX_ZOOM,\n MIN_ZOOM,\n} from './MapPreview.constants';\nimport type { LatLng, MapType } from './MapPreview.types';\n\nconst ORIGIN = { x: 0, y: 0 };\n\nexport const useMapView = ({\n coordinates,\n initialZoom,\n initialMapType,\n}: {\n coordinates: LatLng;\n initialZoom: number;\n initialMapType: MapType;\n}) => {\n const [zoom, setZoom] = useState(initialZoom);\n const [mapType, setMapType] = useState<MapType>(initialMapType);\n const [markerPosition, setMarkerPosition] = useState(coordinates);\n const [panOffset, setPanOffset] = useState(ORIGIN);\n\n useEffect(() => {\n setMarkerPosition(coordinates);\n }, [coordinates]);\n\n // Panning is relative to the tile grid, so a zoom change invalidates it.\n const zoomTo = useCallback((next: number) => {\n setZoom(next);\n setPanOffset(ORIGIN);\n }, []);\n\n return {\n zoom,\n zoomTo,\n mapType,\n setMapType,\n markerPosition,\n setMarkerPosition,\n panOffset,\n setPanOffset,\n };\n};\n\nexport const useMapControls = ({\n coordinates,\n zoom,\n mapType,\n zoomTo,\n setMapType,\n setMarkerPosition,\n setPanOffset,\n containerRef,\n}: {\n coordinates: LatLng;\n zoom: number;\n mapType: MapType;\n zoomTo: (zoom: number) => void;\n setMapType: (type: MapType) => void;\n setMarkerPosition: (position: LatLng) => void;\n setPanOffset: (offset: { x: number; y: number }) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n const handleZoomIn = useCallback(() => zoomTo(Math.min(zoom + 1, MAX_ZOOM)), [zoom, zoomTo]);\n const handleZoomOut = useCallback(() => zoomTo(Math.max(zoom - 1, MIN_ZOOM)), [zoom, zoomTo]);\n\n const handleCenter = useCallback(() => {\n setMarkerPosition({ ...coordinates });\n setPanOffset(ORIGIN);\n }, [coordinates, setMarkerPosition, setPanOffset]);\n\n const handleToggleMapType = useCallback(() => {\n const nextIndex = (MAP_TYPES.indexOf(mapType) + 1) % MAP_TYPES.length;\n setMapType(MAP_TYPES[nextIndex] as MapType);\n }, [mapType, setMapType]);\n\n const handleToggleFullscreen = useCallback(() => {\n if (!isFullscreen && containerRef.current) {\n containerRef.current.requestFullscreen?.();\n } else if (document.fullscreenElement) {\n document.exitFullscreen?.();\n }\n setIsFullscreen((prev) => !prev);\n }, [isFullscreen, containerRef]);\n\n return {\n isFullscreen,\n handleZoomIn,\n handleZoomOut,\n handleCenter,\n handleToggleMapType,\n handleToggleFullscreen,\n };\n};\n\ninterface DragStart {\n x: number;\n y: number;\n lat: number;\n lng: number;\n}\n\ninterface PanStart {\n x: number;\n y: number;\n offsetX: number;\n offsetY: number;\n}\n\nconst isOnMapSurface = (target: HTMLElement): boolean =>\n target.dataset.testid === 'static-map-view' ||\n Boolean(target.closest('[data-testid=\"static-map-view\"]'));\n\nconst panTo = (event: React.MouseEvent, start: PanStart) => ({\n x: start.offsetX + (event.clientX - start.x),\n y: start.offsetY + (event.clientY - start.y),\n});\n\nconst dragTo = (event: React.MouseEvent, start: DragStart): LatLng => ({\n lat: start.lat + (event.clientY - start.y) * DRAG_DEGREES_PER_PIXEL,\n lng: start.lng + (event.clientX - start.x) * DRAG_DEGREES_PER_PIXEL,\n});\n\n// Shift-drag pans the surface; a plain drag moves the marker.\nexport const useMapPointer = ({\n interactive,\n markerPosition,\n panOffset,\n onMarkerDrag,\n setMarkerPosition,\n setPanOffset,\n}: {\n interactive: boolean;\n markerPosition: LatLng;\n panOffset: { x: number; y: number };\n onMarkerDrag?: (coords: LatLng) => void;\n setMarkerPosition: (position: LatLng) => void;\n setPanOffset: (offset: { x: number; y: number }) => void;\n}) => {\n const [isDragging, setIsDragging] = useState(false);\n const [isPanning, setIsPanning] = useState(false);\n const dragStartRef = useRef<DragStart | null>(null);\n const panStartRef = useRef<PanStart | null>(null);\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!interactive) return;\n const { clientX: x, clientY: y } = event;\n\n if (isOnMapSurface(event.target as HTMLElement) && event.shiftKey) {\n setIsPanning(true);\n panStartRef.current = { x, y, offsetX: panOffset.x, offsetY: panOffset.y };\n return;\n }\n\n setIsDragging(true);\n dragStartRef.current = { x, y, lat: markerPosition.lat, lng: markerPosition.lng };\n },\n [interactive, markerPosition, panOffset],\n );\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const panStart = panStartRef.current;\n if (isPanning && panStart) {\n setPanOffset(panTo(event, panStart));\n return;\n }\n\n const dragStart = dragStartRef.current;\n if (!isDragging || !dragStart) return;\n\n const position = dragTo(event, dragStart);\n setMarkerPosition(position);\n onMarkerDrag?.(position);\n },\n [isDragging, isPanning, onMarkerDrag, setMarkerPosition, setPanOffset],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n setIsPanning(false);\n dragStartRef.current = null;\n panStartRef.current = null;\n }, []);\n\n return { isDragging, isPanning, handleMouseDown, handleMouseMove, handleMouseUp };\n};\n\nexport const useMapSearch = ({\n zoomTo,\n setMarkerPosition,\n}: {\n zoomTo: (zoom: number) => void;\n setMarkerPosition: (position: LatLng) => void;\n}) => {\n const [searchValue, setSearchValue] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n\n const handleSearch = useCallback(\n async (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Enter' || !searchValue) return;\n\n setIsSearching(true);\n try {\n const result = await geocode(searchValue);\n // An unknown place leaves the map where it is; a production build would\n // surface an error here.\n if (!result) return;\n\n setMarkerPosition({ ...result });\n zoomTo(CITY_ZOOM);\n } finally {\n setIsSearching(false);\n }\n },\n [searchValue, zoomTo, setMarkerPosition],\n );\n\n return { searchValue, setSearchValue, isSearching, handleSearch };\n};\n\nexport const useMapClick = ({\n coordinates,\n interactive,\n isPanning,\n onMapClick,\n onMarkerDrag,\n setMarkerPosition,\n}: {\n coordinates: LatLng;\n interactive: boolean;\n isPanning: boolean;\n onMapClick?: (lat: number, lng: number) => void;\n onMarkerDrag?: (coords: LatLng) => void;\n setMarkerPosition: (position: LatLng) => void;\n}) =>\n useCallback(() => {\n // A pan ends with a click event; that should not also drop a marker.\n if (isPanning) return;\n\n // Without a real projection there is nothing to convert a click position\n // into, so the mock jitters around the centre instead.\n const coords = {\n lat: coordinates.lat + (Math.random() - 0.5) * CLICK_JITTER_DEGREES,\n lng: coordinates.lng + (Math.random() - 0.5) * CLICK_JITTER_DEGREES,\n };\n\n onMapClick?.(coords.lat, coords.lng);\n\n if (interactive && onMarkerDrag) {\n setMarkerPosition(coords);\n onMarkerDrag(coords);\n }\n }, [coordinates, interactive, isPanning, onMapClick, onMarkerDrag, setMarkerPosition]);\n"],"mappings":"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","names":["alpha","Box","styled","useTheme","useTheme","alpha","alpha","jsx","alpha","Box","styled","jsx","jsx","jsxs","useTheme","alpha","Box","styled","Tooltip","useTheme","alpha","Fragment","jsx","jsxs","styled","Box","alpha","useTheme","Tooltip","Box","useTheme","LocationIcon","alpha","Box","Typography","useTheme","Fragment","jsx","jsxs","useTheme","Box","LocationIcon","alpha","Typography","alpha","useTheme","jsx","useTheme","alpha","jsx","jsxs","useTheme","Box","useMemo","useRef","useMemo","useRef","jsx","jsxs","styled","alpha","Box","useTheme"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/data-display/MapPreview/MapPreview.tsx","../../src/components/data-display/MapPreview/MapPreview.helpers.ts","../../src/components/data-display/MapPreview/MapPreview.constants.ts","../../src/components/data-display/MapPreview/MapLayers.tsx","../../src/components/data-display/MapPreview/MapControlBar.tsx","../../src/components/data-display/MapPreview/MapOverlays.tsx","../../src/components/data-display/MapPreview/MapSearchBar.tsx","../../src/components/data-display/MapPreview/MapMarkers.tsx","../../src/components/data-display/MapPreview/mapSurface.ts","../../src/components/data-display/MapPreview/StaticMapView.tsx","../../src/components/data-display/MapPreview/mapProjection.ts","../../src/components/data-display/MapPreview/MapDecorations.tsx","../../src/components/data-display/MapPreview/MapTiles.tsx","../../src/components/data-display/MapPreview/useMapPreview.ts","../../src/components/data-display/MapPreview/MapPreview.hooks.ts"],"sourcesContent":["import { alpha, Box, Paper, styled, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { glassStyles, resolveMapPreviewProps } from './MapPreview.helpers';\nimport type { MapPreviewProps } from './MapPreview.types';\nimport { MapLayers } from './MapLayers';\nimport { MapCoordinates, MapMarkers } from './MapMarkers';\nimport { StaticMapView } from './StaticMapView';\nimport { useMapPreview } from './useMapPreview';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst MapContainer = styled(Paper)(({ theme }) => ({\n position: 'relative',\n width: '100%',\n borderRadius: theme.shape.borderRadius * 2,\n overflow: 'hidden',\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.9)} 0%, ${alpha(theme.palette.background.paper, 0.8)} 100%)`,\n border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,\n}));\n\nconst MapWrapper = styled(Box)<{ height: string }>(({ height }) => ({\n width: '100%',\n height,\n position: 'relative',\n}));\n\nconst cursorFor = (grabbing: boolean, interactive: boolean): string => {\n if (grabbing) return 'grabbing';\n return interactive ? 'grab' : 'default';\n};\n\nexport const MapPreview: FC<MapPreviewProps> = (componentProps) => {\n const props = resolveMapPreviewProps(componentProps);\n const theme = useTheme();\n const { containerRef, view, controls, pointer, search, handleMapClick } = useMapPreview(props);\n\n const height = controls.isFullscreen ? '100vh' : props.height;\n const grabbing = pointer.isDragging || pointer.isPanning;\n\n return (\n <MapContainer\n ref={containerRef}\n elevation={props.variant === 'glass' ? 0 : 2}\n data-testid=\"map-preview-container\"\n role=\"img\"\n aria-label={`Map preview centered at ${view.markerPosition.lat.toFixed(4)}, ${view.markerPosition.lng.toFixed(4)} with zoom level ${view.zoom}`}\n tabIndex={0}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n sx={glassStyles(props.variant, theme)}\n >\n <MapWrapper\n height={height}\n onClick={handleMapClick}\n onMouseDown={pointer.handleMouseDown}\n onMouseMove={pointer.handleMouseMove}\n onMouseUp={pointer.handleMouseUp}\n onMouseLeave={pointer.handleMouseUp}\n style={{\n cursor: cursorFor(grabbing, props.interactive),\n transition: props.animated ? 'all 0.3s ease' : 'none',\n }}\n >\n <StaticMapView\n height={height}\n zoom={view.zoom}\n mapType={view.mapType}\n // The built-in centre marker steps aside for an explicit marker list.\n marker={props.marker && props.markers.length === 0}\n markerPosition={view.markerPosition}\n panOffset={view.panOffset}\n />\n\n <MapMarkers markers={props.markers} centre={view.markerPosition} animated={props.animated} />\n\n <MapLayers\n settings={props}\n zoom={view.zoom}\n mapType={view.mapType}\n search={search}\n controls={controls}\n />\n\n <MapCoordinates position={view.markerPosition} zoom={view.zoom} />\n </MapWrapper>\n </MapContainer>\n );\n};\n\nexport default MapPreview;\n","import type { Theme } from '@mui/material';\nimport { alpha } from '@mui/material';\n\nimport { DEFAULT_ZOOM } from './MapPreview.constants';\nimport type { MapPreviewProps } from './MapPreview.types';\n\ntype MapDefaultedKeys =\n | 'markers'\n | 'marker'\n | 'height'\n | 'interactive'\n | 'zoom'\n | 'mapType'\n | 'variant'\n | 'showControls'\n | 'showSearch'\n | 'searchPlaceholder'\n | 'showRoute'\n | 'heatmapData'\n | 'showHeatmap'\n | 'animated';\n\nexport type ResolvedMapPreviewProps = MapPreviewProps &\n Required<Pick<MapPreviewProps, MapDefaultedKeys>>;\n\nconst MAP_PREVIEW_DEFAULTS: Pick<MapPreviewProps, MapDefaultedKeys> = {\n markers: [],\n marker: true,\n height: '400px',\n interactive: false,\n zoom: DEFAULT_ZOOM,\n mapType: 'roadmap',\n variant: 'default',\n showControls: true,\n showSearch: false,\n searchPlaceholder: 'Search location...',\n showRoute: false,\n heatmapData: [],\n showHeatmap: false,\n animated: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = (props: MapPreviewProps): Partial<MapPreviewProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<MapPreviewProps>;\n\n// Applied as a merge rather than destructuring defaults, which would otherwise\n// put fourteen branches into the component's own complexity budget.\nexport const resolveMapPreviewProps = (props: MapPreviewProps): ResolvedMapPreviewProps =>\n ({ ...MAP_PREVIEW_DEFAULTS, ...definedProps(props) }) as ResolvedMapPreviewProps;\n\nexport const glassStyles = (variant: MapPreviewProps['variant'], theme: Theme) =>\n variant === 'glass'\n ? {\n background: alpha(theme.palette.background.paper, 0.7),\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n }\n : {};\n","import type { MapType } from './MapPreview.types';\n\nexport const MIN_ZOOM = 1;\nexport const MAX_ZOOM = 20;\nexport const DEFAULT_ZOOM = 15;\nexport const CITY_ZOOM = 12;\n\n// The order the map-type button cycles through.\nexport const MAP_TYPES: MapType[] = ['roadmap', 'satellite', 'hybrid', 'terrain'];\n\n// Degrees of movement per pixel dragged — small enough that a drag reads as a\n// nudge rather than a jump.\nexport const DRAG_DEGREES_PER_PIXEL = 0.0001;\n\n// Spread of the simulated coordinate change a map click produces.\nexport const CLICK_JITTER_DEGREES = 0.001;\n\nexport const MARKER_PIXELS_PER_DEGREE = 100;\nexport const HEATMAP_VIEWBOX = { width: 800, height: 400 };\n","import { useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { HEATMAP_VIEWBOX } from './MapPreview.constants';\nimport type { ResolvedMapPreviewProps } from './MapPreview.helpers';\nimport type { MapType } from './MapPreview.types';\nimport { MapControlBar } from './MapControlBar';\nimport { HeatmapOverlay, RouteOverlay } from './MapOverlays';\nimport { MapSearchBar } from './MapSearchBar';\n\nexport interface MapLayersProps {\n settings: ResolvedMapPreviewProps;\n zoom: number;\n mapType: MapType;\n search: {\n searchValue: string;\n isSearching: boolean;\n setSearchValue: (value: string) => void;\n handleSearch: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n };\n controls: {\n handleZoomIn: () => void;\n handleZoomOut: () => void;\n handleCenter: () => void;\n handleToggleMapType: () => void;\n handleToggleFullscreen: () => void;\n };\n}\n\n// Everything drawn over the map surface that is switched on by a prop.\nexport const MapLayers: FC<MapLayersProps> = ({ settings, zoom, mapType, search, controls }) => {\n const theme = useTheme();\n\n return (\n <>\n {settings.showHeatmap && settings.heatmapData.length > 0 && (\n <HeatmapOverlay\n points={settings.heatmapData}\n width={HEATMAP_VIEWBOX.width}\n height={HEATMAP_VIEWBOX.height}\n />\n )}\n\n {settings.showRoute && <RouteOverlay color={settings.routeColor || theme.palette.primary.main} />}\n\n {settings.showSearch && (\n <MapSearchBar\n label={settings.copy.search}\n value={search.searchValue}\n placeholder={settings.searchPlaceholder}\n isSearching={search.isSearching}\n onChange={search.setSearchValue}\n onSubmit={search.handleSearch}\n />\n )}\n\n {settings.showControls && (\n <MapControlBar\n copy={settings.copy}\n zoom={zoom}\n mapType={mapType}\n onZoomIn={controls.handleZoomIn}\n onZoomOut={controls.handleZoomOut}\n onCenter={controls.handleCenter}\n onToggleMapType={controls.handleToggleMapType}\n onToggleFullscreen={controls.handleToggleFullscreen}\n />\n )}\n </>\n );\n};\n","import FullscreenIcon from '@mui/icons-material/Fullscreen';\nimport LayersIcon from '@mui/icons-material/Layers';\nimport CenterIcon from '@mui/icons-material/MyLocation';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport { alpha, Box, IconButton, styled, Tooltip } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { MAX_ZOOM, MIN_ZOOM } from './MapPreview.constants';\nimport type { MapType } from './MapPreview.types';\nimport type { MapPreviewCopy } from '../../../copy';\n\n// Kept module-local: the inferred type of a styled() component cannot be named\n// across a module boundary here (TS2742).\nconst MapControls = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(2),\n right: theme.spacing(2),\n zIndex: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(1),\n}));\n\nconst ControlButton = styled(IconButton)(({ theme }) => ({\n background: alpha(theme.palette.background.paper, 0.95),\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[2],\n // Kept clickable while disabled so hover tooltips still work at the limits.\n pointerEvents: 'auto',\n '&:hover': {\n background: theme.palette.background.paper,\n transform: 'scale(1.05)',\n },\n '&:disabled': {\n opacity: 0.5,\n pointerEvents: 'auto',\n },\n}));\n\nexport interface MapControlBarProps {\n /**\n * The six controls' names. Every one is a glyph with a `title` AND an\n * `aria-label`, so this object is both the tooltip and what a screen reader\n * reads — REQUIRED, because a default is one language for every adopter.\n */\n copy: MapPreviewCopy;\n zoom: number;\n mapType: MapType;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onCenter: () => void;\n onToggleMapType: () => void;\n onToggleFullscreen: () => void;\n}\n\nexport const MapControlBar: FC<MapControlBarProps> = ({\n copy,\n zoom,\n mapType,\n onZoomIn,\n onZoomOut,\n onCenter,\n onToggleMapType,\n onToggleFullscreen,\n}) => (\n <MapControls data-testid=\"map-controls\">\n <Tooltip title={copy.zoomIn} placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onZoomIn}\n aria-label={copy.zoomIn}\n data-testid=\"zoom-in-button\"\n disabled={zoom >= MAX_ZOOM}\n >\n <ZoomInIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title={copy.zoomOut} placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onZoomOut}\n aria-label={copy.zoomOut}\n data-testid=\"zoom-out-button\"\n disabled={zoom <= MIN_ZOOM}\n >\n <ZoomOutIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title={copy.center} placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onCenter}\n aria-label={copy.center}\n data-testid=\"center-button\"\n >\n <CenterIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title={`Map type: ${mapType}`} placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onToggleMapType}\n aria-label={copy.mapType}\n data-testid=\"map-type-button\"\n >\n <LayersIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n <Tooltip title={copy.fullscreen} placement=\"left\">\n <ControlButton\n size=\"small\"\n onClick={onToggleFullscreen}\n aria-label={copy.fullscreen}\n data-testid=\"fullscreen-button\"\n >\n <FullscreenIcon fontSize=\"small\" />\n </ControlButton>\n </Tooltip>\n </MapControls>\n);\n","import { useTheme } from '@mui/material';\nimport type { CSSProperties, FC } from 'react';\nimport React from 'react';\n\nimport type { HeatmapPoint } from './MapPreview.types';\n\nconst OVERLAY_STYLE: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 1,\n};\n\nconst MAX_HEAT_RADIUS = 30;\nconst MAX_HEAT_OPACITY = 0.3;\nconst DEGREES_TO_PIXELS = 10;\n\nexport interface HeatmapOverlayProps {\n points: HeatmapPoint[];\n width: number;\n height: number;\n}\n\n// Each point's weight drives both its radius and its opacity, so denser areas\n// read hotter where circles overlap.\nexport const HeatmapOverlay: FC<HeatmapOverlayProps> = ({ points, width, height }) => {\n const theme = useTheme();\n\n if (points.length === 0) return null;\n\n return (\n <svg style={OVERLAY_STYLE} viewBox={`0 0 ${width} ${height}`}>\n {points.map((point, index) => (\n <circle\n key={`${point.lat}-${point.lng}-${index}`}\n cx={width / 2 + point.lng * DEGREES_TO_PIXELS}\n cy={height / 2 - point.lat * DEGREES_TO_PIXELS}\n r={MAX_HEAT_RADIUS * point.weight}\n fill={theme.palette.error.main}\n opacity={MAX_HEAT_OPACITY * point.weight}\n />\n ))}\n </svg>\n );\n};\n\nexport const RouteOverlay: FC<{ color: string }> = ({ color }) => {\n const theme = useTheme();\n\n return (\n <svg style={OVERLAY_STYLE} viewBox=\"0 0 100 100\">\n <path\n d=\"M 20,20 Q 40,10 50,30 T 80,80\"\n stroke={color || theme.palette.primary.main}\n strokeWidth=\"3\"\n fill=\"none\"\n strokeDasharray=\"5,5\"\n opacity=\"0.8\"\n >\n {/* Marching-ants dashes to suggest direction of travel. */}\n <animate attributeName=\"stroke-dashoffset\" values=\"0;10\" dur=\"1s\" repeatCount=\"indefinite\" />\n </path>\n </svg>\n );\n};\n","import SearchIcon from '@mui/icons-material/Search';\nimport { alpha, Box, InputAdornment, styled, TextField } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst SearchBar = styled(Box)(({ theme }) => ({\n position: 'absolute',\n top: theme.spacing(2),\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 2,\n width: '90%',\n maxWidth: 400,\n}));\n\nconst SearchField = styled(TextField)(({ theme }) => ({\n '& .MuiOutlinedInput-root': {\n background: alpha(theme.palette.background.paper, 0.95),\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n borderRadius: theme.shape.borderRadius * 2,\n '& fieldset': {\n borderColor: alpha(theme.palette.divider, 0.2),\n },\n },\n}));\n\nexport interface MapSearchBarProps {\n /** The field's accessible name — it renders no visible label. REQUIRED. */\n label: string;\n value: string;\n placeholder: string;\n isSearching: boolean;\n onChange: (value: string) => void;\n onSubmit: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nexport const MapSearchBar: FC<MapSearchBarProps> = ({\n label,\n value,\n placeholder,\n isSearching,\n onChange,\n onSubmit,\n}) => (\n <SearchBar>\n <SearchField\n fullWidth\n size=\"small\"\n placeholder={placeholder}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n onKeyPress={onSubmit}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon fontSize=\"small\" sx={{ opacity: isSearching ? 0.5 : 1 }} />\n </InputAdornment>\n ),\n }}\n disabled={isSearching}\n aria-label={label}\n />\n </SearchBar>\n);\n","import LocationIcon from '@mui/icons-material/LocationOn';\nimport { alpha, Box, styled, Tooltip, Typography, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { MARKER_PIXELS_PER_DEGREE } from './MapPreview.constants';\nimport type { LatLng, MapMarker } from './MapPreview.types';\nimport { BOUNCE_KEYFRAMES } from './mapSurface';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst CoordinatesDisplay = styled(Box)(({ theme }) => ({\n position: 'absolute',\n bottom: theme.spacing(2),\n left: theme.spacing(2),\n padding: theme.spacing(1, 1.5),\n background: alpha(theme.palette.background.paper, 0.95),\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n borderRadius: theme.shape.borderRadius,\n zIndex: 1,\n}));\n\nexport interface MapMarkersProps {\n markers: MapMarker[];\n centre: LatLng;\n animated: boolean;\n}\n\n// Markers are placed relative to the current centre, so panning moves them with\n// the surface.\nexport const MapMarkers: FC<MapMarkersProps> = ({ markers, centre, animated }) => {\n const theme = useTheme();\n\n return (\n <>\n {markers.map((markerItem, index) => (\n <Box\n key={`${markerItem.position.lat}-${markerItem.position.lng}-${index}`}\n data-testid={`map-marker-${index}`}\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: `translate(\n ${(markerItem.position.lng - centre.lng) * MARKER_PIXELS_PER_DEGREE}px,\n ${-(markerItem.position.lat - centre.lat) * MARKER_PIXELS_PER_DEGREE}px\n )`,\n zIndex: 3,\n cursor: markerItem.onClick ? 'pointer' : 'default',\n }}\n onClick={markerItem.onClick}\n title={markerItem.title}\n >\n <Tooltip title={markerItem.description || markerItem.title || ''}>\n <LocationIcon\n sx={{\n fontSize: 32,\n color: theme.palette.error.main,\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.3))',\n animation: animated ? 'bounce 2s infinite' : 'none',\n '@keyframes bounce': BOUNCE_KEYFRAMES,\n }}\n />\n </Tooltip>\n </Box>\n ))}\n </>\n );\n};\n\nexport const MapCoordinates: FC<{ position: LatLng; zoom: number }> = ({ position, zoom }) => (\n <CoordinatesDisplay data-testid=\"coordinates-display\">\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace' }}>\n Lat: {position.lat.toFixed(6)}, Lng: {position.lng.toFixed(6)}\n </Typography>\n {zoom > 0 && (\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace', display: 'block' }}>\n Zoom: {zoom}\n </Typography>\n )}\n </CoordinatesDisplay>\n);\n","import type { Theme } from '@mui/material';\nimport { alpha } from '@mui/material';\n\nimport type { MapType } from './MapPreview.types';\n\ntype GreyShade = keyof Theme['palette']['grey'];\n\nconst greyGradient = (theme: Theme, from: GreyShade, to: GreyShade, opacity = 1): string => {\n const shade = (key: GreyShade) => alpha(theme.palette.grey[key], opacity);\n return `linear-gradient(135deg, ${shade(from)} 0%, ${shade(to)} 100%)`;\n};\n\n// The backdrop behind the tiles: dark for satellite, green for terrain, and\n// grey for road maps, following the theme's own light/dark choice.\nexport const surfaceBackground = (mapType: MapType, theme: Theme): string => {\n if (mapType === 'satellite') return greyGradient(theme, 900, 800);\n if (mapType === 'terrain') {\n return `linear-gradient(135deg, ${alpha('#8BC34A', 0.2)} 0%, ${alpha('#4CAF50', 0.3)} 100%)`;\n }\n if (theme.palette.mode === 'dark') return greyGradient(theme, 900, 800);\n return greyGradient(theme, 100, 200);\n};\n\nexport const tileBackground = (mapType: MapType, theme: Theme): string => {\n if (mapType === 'satellite') {\n return `linear-gradient(135deg, ${alpha('#1a1a1a', 0.9)} 0%, ${alpha('#2a2a2a', 0.9)} 100%)`;\n }\n if (mapType === 'terrain') {\n return `linear-gradient(135deg, ${alpha('#7cb342', 0.1)} 0%, ${alpha('#558b2f', 0.1)} 100%)`;\n }\n return greyGradient(theme, 100, 200, 0.5);\n};\n\nexport const BOUNCE_KEYFRAMES = {\n '0%, 100%': { transform: 'translateY(0)' },\n '50%': { transform: 'translateY(-10px)' },\n} as const;\n","import { Box, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React, { useMemo } from 'react';\n\nimport { getTileCoordinates } from './mapProjection';\nimport { surfaceBackground } from './mapSurface';\nimport type { LatLng, MapType } from './MapPreview.types';\nimport {\n MapCentreMarker,\n MapCompass,\n MapDecorativePins,\n MapRoads,\n MapScaleBar,\n} from './MapDecorations';\nimport { MapTiles } from './MapTiles';\n\nexport interface StaticMapViewProps {\n height: string;\n zoom: number;\n mapType: MapType;\n marker?: boolean;\n markerPosition?: LatLng;\n panOffset?: { x: number; y: number };\n}\n\n// A stand-in map surface: a tile grid at the right coordinates for the current\n// position and zoom, with the usual furniture drawn over it.\nexport const StaticMapView: FC<StaticMapViewProps> = ({\n height,\n zoom,\n mapType,\n marker,\n markerPosition,\n panOffset = { x: 0, y: 0 },\n}) => {\n const theme = useTheme();\n\n const tileOrigin = useMemo(\n () =>\n markerPosition ? getTileCoordinates(markerPosition.lat, markerPosition.lng, zoom) : null,\n [markerPosition, zoom],\n );\n\n return (\n <Box\n data-testid=\"static-map-view\"\n sx={{\n width: '100%',\n height,\n position: 'relative',\n background: surfaceBackground(mapType, theme),\n overflow: 'hidden',\n }}\n >\n <MapTiles origin={tileOrigin} zoom={zoom} mapType={mapType} panOffset={panOffset} />\n <MapRoads />\n {marker && <MapCentreMarker />}\n <MapDecorativePins />\n <MapScaleBar zoom={zoom} />\n <MapCompass />\n </Box>\n );\n};\n","export const TILE_SIZE = 256;\n\n// Metres covered by one pixel at zoom 0 on the equator; each zoom level halves it.\nconst EQUATOR_METRES_PER_PIXEL = 156543.03392;\nconst SCALE_BAR_PIXELS = 100;\nconst GEOCODE_DELAY_MS = 300;\n\n// Web Mercator. Longitude maps linearly; latitude goes through the log of the\n// tangent, clamped just short of the poles where that diverges.\nconst project = (lat: number, lng: number) => {\n const siny = Math.sin((lat * Math.PI) / 180);\n const boundedSiny = Math.max(-0.9999, Math.min(0.9999, siny));\n\n return {\n x: TILE_SIZE * (0.5 + lng / 360),\n y: TILE_SIZE * (0.5 - Math.log((1 + boundedSiny) / (1 - boundedSiny)) / (4 * Math.PI)),\n };\n};\n\nexport const getTileCoordinates = (lat: number, lng: number, zoom: number) => {\n const scale = 1 << zoom;\n const world = project(lat, lng);\n\n return {\n x: Math.floor(Math.floor(world.x * scale) / TILE_SIZE),\n y: Math.floor(Math.floor(world.y * scale) / TILE_SIZE),\n };\n};\n\nexport const getScaleDistance = (zoom: number): string => {\n const distance = (EQUATOR_METRES_PER_PIXEL / Math.pow(2, zoom)) * SCALE_BAR_PIXELS;\n\n if (distance >= 1000) return `${Math.round(distance / 1000)} km`;\n // Round to the nearest 100m so the bar reads as a round number.\n if (distance >= 100) return `${Math.round(distance / 100) * 100} m`;\n return `${Math.round(distance)} m`;\n};\n\nconst MOCK_GEOCODE_RESULTS: Record<string, { lat: number; lng: number }> = {\n 'san francisco': { lat: 37.7749, lng: -122.4194 },\n 'new york': { lat: 40.7128, lng: -74.006 },\n london: { lat: 51.5074, lng: -0.1278 },\n tokyo: { lat: 35.6762, lng: 139.6503 },\n paris: { lat: 48.8566, lng: 2.3522 },\n};\n\n// Stands in for a Places lookup, delay included so the disabled search field is\n// actually observable.\nexport const geocode = async (address: string): Promise<{ lat: number; lng: number } | null> => {\n await new Promise((resolve) => window.setTimeout(resolve, GEOCODE_DELAY_MS));\n return MOCK_GEOCODE_RESULTS[address.toLowerCase().trim()] || null;\n};\n","import LocationIcon from '@mui/icons-material/LocationOn';\nimport NavigationIcon from '@mui/icons-material/Navigation';\nimport PlaceIcon from '@mui/icons-material/Place';\nimport { alpha, Box, Typography, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { getScaleDistance } from './mapProjection';\nimport { BOUNCE_KEYFRAMES } from './mapSurface';\n\n// Decorative only: these give the mock surface something to look like without\n// standing in for real map data.\nexport const MapRoads: FC = () => {\n const theme = useTheme();\n\n return (\n <Box sx={{ position: 'absolute', top: '20%', left: '15%', width: '70%', height: '60%', opacity: 0.2 }}>\n <svg width=\"100%\" height=\"100%\" style={{ position: 'absolute' }}>\n <path\n d=\"M 10,50 Q 30,30 50,50 T 90,50\"\n stroke={theme.palette.text.secondary}\n strokeWidth=\"2\"\n fill=\"none\"\n opacity=\"0.3\"\n />\n <path\n d=\"M 50,10 L 50,90\"\n stroke={theme.palette.text.secondary}\n strokeWidth=\"1.5\"\n fill=\"none\"\n opacity=\"0.3\"\n />\n <path\n d=\"M 20,30 L 80,70\"\n stroke={theme.palette.text.secondary}\n strokeWidth=\"1\"\n fill=\"none\"\n opacity=\"0.2\"\n />\n </svg>\n </Box>\n );\n};\n\nconst DecorativePin: FC<{ top: string; left: string }> = ({ top, left }) => {\n const theme = useTheme();\n\n return (\n <Box sx={{ position: 'absolute', top, left, opacity: 0.6 }}>\n <PlaceIcon sx={{ fontSize: 20, color: theme.palette.primary.main }} />\n </Box>\n );\n};\n\nexport const MapDecorativePins: FC = () => (\n <>\n <DecorativePin top=\"30%\" left=\"25%\" />\n <DecorativePin top=\"65%\" left=\"70%\" />\n </>\n);\n\nexport const MapCentreMarker: FC = () => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid=\"map-marker\"\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -100%)',\n zIndex: 2,\n filter: 'drop-shadow(0 2px 4px rgba(0,0,0,0.3))',\n }}\n >\n <LocationIcon\n sx={{\n fontSize: 36,\n color: theme.palette.error.main,\n animation: 'bounce 2s infinite',\n '@keyframes bounce': BOUNCE_KEYFRAMES,\n }}\n />\n </Box>\n );\n};\n\nexport const MapScaleBar: FC<{ zoom: number }> = ({ zoom }) => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n position: 'absolute',\n bottom: theme.spacing(2),\n right: theme.spacing(2),\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n padding: theme.spacing(0.5, 1),\n background: alpha(theme.palette.background.paper, 0.9),\n borderRadius: theme.shape.borderRadius,\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n }}\n >\n <Box\n sx={{\n width: 40,\n height: 2,\n background: theme.palette.text.secondary,\n position: 'relative',\n // The end caps that make the bar read as a measurement.\n '&::before, &::after': {\n content: '\"\"',\n position: 'absolute',\n width: 2,\n height: 6,\n background: theme.palette.text.secondary,\n },\n '&::before': { left: 0, top: -2 },\n '&::after': { right: 0, top: -2 },\n }}\n />\n <Typography variant=\"caption\">{getScaleDistance(zoom)}</Typography>\n </Box>\n );\n};\n\nexport const MapCompass: FC = () => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n width: 40,\n height: 40,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: alpha(theme.palette.background.paper, 0.9),\n borderRadius: '50%',\n boxShadow: theme.shadows[2],\n }}\n >\n <NavigationIcon\n sx={{ fontSize: 24, color: theme.palette.primary.main, transform: 'rotate(-45deg)' }}\n />\n </Box>\n );\n};\n","import { alpha, useTheme } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { TILE_SIZE } from './mapProjection';\nimport { tileBackground } from './mapSurface';\nimport type { MapType } from './MapPreview.types';\n\n// Two extra rows and columns so panning does not expose an edge.\nconst VISIBLE_TILES = Math.ceil(800 / TILE_SIZE) + 2;\n// Tile coordinates are only legible once the grid is reasonably fine.\nconst LABEL_MIN_ZOOM = 10;\n\nexport interface MapTilesProps {\n origin: { x: number; y: number } | null;\n zoom: number;\n mapType: MapType;\n panOffset: { x: number; y: number };\n}\n\nexport const MapTiles: FC<MapTilesProps> = ({ origin, zoom, mapType, panOffset }) => {\n const theme = useTheme();\n const borderOpacity = theme.palette.mode === 'dark' ? 0.15 : 0.1;\n const background = tileBackground(mapType, theme);\n const half = Math.floor(VISIBLE_TILES / 2);\n\n return (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: `translate(calc(-50% + ${panOffset.x}px), calc(-50% + ${panOffset.y}px))`,\n width: TILE_SIZE * VISIBLE_TILES,\n height: TILE_SIZE * VISIBLE_TILES,\n display: 'grid',\n gridTemplateColumns: `repeat(${VISIBLE_TILES}, ${TILE_SIZE}px)`,\n gridTemplateRows: `repeat(${VISIBLE_TILES}, ${TILE_SIZE}px)`,\n transition: 'transform 0.1s ease-out',\n }}\n >\n {Array.from({ length: VISIBLE_TILES * VISIBLE_TILES }).map((_, index) => {\n // The grid is centred on the origin tile, so indices run from -half.\n const tileX = (origin?.x || 0) + (index % VISIBLE_TILES) - half;\n const tileY = (origin?.y || 0) + Math.floor(index / VISIBLE_TILES) - half;\n\n return (\n <div\n key={`tile-${tileX}-${tileY}`}\n style={{\n width: TILE_SIZE,\n height: TILE_SIZE,\n border: `1px solid ${alpha(theme.palette.divider, borderOpacity)}`,\n background,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '10px',\n color: alpha(theme.palette.text.secondary, 0.3),\n fontFamily: 'monospace',\n userSelect: 'none',\n }}\n >\n {zoom > LABEL_MIN_ZOOM && `${tileX},${tileY}`}\n </div>\n );\n })}\n </div>\n );\n};\n","import { useMemo, useRef } from 'react';\n\nimport {\n useMapClick,\n useMapControls,\n useMapPointer,\n useMapSearch,\n useMapView,\n} from './MapPreview.hooks';\nimport type { ResolvedMapPreviewProps } from './MapPreview.helpers';\n\n// Wires the map's independent concerns together: the view state first, then the\n// controls, pointer handling and search that all write to it.\nexport const useMapPreview = (props: ResolvedMapPreviewProps) => {\n const { center, coordinates: legacyCoordinates, interactive, onMarkerDrag, onMapClick } = props;\n\n // `center` supersedes the older `coordinates` prop; either may be omitted.\n const coordinates = useMemo(\n () => center || legacyCoordinates || { lat: 0, lng: 0 },\n [center, legacyCoordinates],\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const view = useMapView({\n coordinates,\n initialZoom: props.zoom,\n initialMapType: props.mapType,\n });\n\n const controls = useMapControls({\n coordinates,\n zoom: view.zoom,\n mapType: view.mapType,\n zoomTo: view.zoomTo,\n setMapType: view.setMapType,\n setMarkerPosition: view.setMarkerPosition,\n setPanOffset: view.setPanOffset,\n containerRef,\n });\n\n const pointer = useMapPointer({\n interactive,\n markerPosition: view.markerPosition,\n panOffset: view.panOffset,\n onMarkerDrag,\n setMarkerPosition: view.setMarkerPosition,\n setPanOffset: view.setPanOffset,\n });\n\n const search = useMapSearch({ zoomTo: view.zoomTo, setMarkerPosition: view.setMarkerPosition });\n\n const handleMapClick = useMapClick({\n coordinates,\n interactive,\n isPanning: pointer.isPanning,\n onMapClick,\n onMarkerDrag,\n setMarkerPosition: view.setMarkerPosition,\n });\n\n return { containerRef, view, controls, pointer, search, handleMapClick };\n};\n","import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { geocode } from './mapProjection';\nimport {\n CITY_ZOOM,\n CLICK_JITTER_DEGREES,\n DRAG_DEGREES_PER_PIXEL,\n MAP_TYPES,\n MAX_ZOOM,\n MIN_ZOOM,\n} from './MapPreview.constants';\nimport type { LatLng, MapType } from './MapPreview.types';\n\nconst ORIGIN = { x: 0, y: 0 };\n\nexport const useMapView = ({\n coordinates,\n initialZoom,\n initialMapType,\n}: {\n coordinates: LatLng;\n initialZoom: number;\n initialMapType: MapType;\n}) => {\n const [zoom, setZoom] = useState(initialZoom);\n const [mapType, setMapType] = useState<MapType>(initialMapType);\n const [markerPosition, setMarkerPosition] = useState(coordinates);\n const [panOffset, setPanOffset] = useState(ORIGIN);\n\n useEffect(() => {\n setMarkerPosition(coordinates);\n }, [coordinates]);\n\n // Panning is relative to the tile grid, so a zoom change invalidates it.\n const zoomTo = useCallback((next: number) => {\n setZoom(next);\n setPanOffset(ORIGIN);\n }, []);\n\n return {\n zoom,\n zoomTo,\n mapType,\n setMapType,\n markerPosition,\n setMarkerPosition,\n panOffset,\n setPanOffset,\n };\n};\n\nexport const useMapControls = ({\n coordinates,\n zoom,\n mapType,\n zoomTo,\n setMapType,\n setMarkerPosition,\n setPanOffset,\n containerRef,\n}: {\n coordinates: LatLng;\n zoom: number;\n mapType: MapType;\n zoomTo: (zoom: number) => void;\n setMapType: (type: MapType) => void;\n setMarkerPosition: (position: LatLng) => void;\n setPanOffset: (offset: { x: number; y: number }) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}) => {\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n const handleZoomIn = useCallback(() => zoomTo(Math.min(zoom + 1, MAX_ZOOM)), [zoom, zoomTo]);\n const handleZoomOut = useCallback(() => zoomTo(Math.max(zoom - 1, MIN_ZOOM)), [zoom, zoomTo]);\n\n const handleCenter = useCallback(() => {\n setMarkerPosition({ ...coordinates });\n setPanOffset(ORIGIN);\n }, [coordinates, setMarkerPosition, setPanOffset]);\n\n const handleToggleMapType = useCallback(() => {\n const nextIndex = (MAP_TYPES.indexOf(mapType) + 1) % MAP_TYPES.length;\n setMapType(MAP_TYPES[nextIndex] as MapType);\n }, [mapType, setMapType]);\n\n const handleToggleFullscreen = useCallback(() => {\n if (!isFullscreen && containerRef.current) {\n containerRef.current.requestFullscreen?.();\n } else if (document.fullscreenElement) {\n document.exitFullscreen?.();\n }\n setIsFullscreen((prev) => !prev);\n }, [isFullscreen, containerRef]);\n\n return {\n isFullscreen,\n handleZoomIn,\n handleZoomOut,\n handleCenter,\n handleToggleMapType,\n handleToggleFullscreen,\n };\n};\n\ninterface DragStart {\n x: number;\n y: number;\n lat: number;\n lng: number;\n}\n\ninterface PanStart {\n x: number;\n y: number;\n offsetX: number;\n offsetY: number;\n}\n\nconst isOnMapSurface = (target: HTMLElement): boolean =>\n target.dataset.testid === 'static-map-view' ||\n Boolean(target.closest('[data-testid=\"static-map-view\"]'));\n\nconst panTo = (event: React.MouseEvent, start: PanStart) => ({\n x: start.offsetX + (event.clientX - start.x),\n y: start.offsetY + (event.clientY - start.y),\n});\n\nconst dragTo = (event: React.MouseEvent, start: DragStart): LatLng => ({\n lat: start.lat + (event.clientY - start.y) * DRAG_DEGREES_PER_PIXEL,\n lng: start.lng + (event.clientX - start.x) * DRAG_DEGREES_PER_PIXEL,\n});\n\n// Shift-drag pans the surface; a plain drag moves the marker.\nexport const useMapPointer = ({\n interactive,\n markerPosition,\n panOffset,\n onMarkerDrag,\n setMarkerPosition,\n setPanOffset,\n}: {\n interactive: boolean;\n markerPosition: LatLng;\n panOffset: { x: number; y: number };\n onMarkerDrag?: (coords: LatLng) => void;\n setMarkerPosition: (position: LatLng) => void;\n setPanOffset: (offset: { x: number; y: number }) => void;\n}) => {\n const [isDragging, setIsDragging] = useState(false);\n const [isPanning, setIsPanning] = useState(false);\n const dragStartRef = useRef<DragStart | null>(null);\n const panStartRef = useRef<PanStart | null>(null);\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (!interactive) return;\n const { clientX: x, clientY: y } = event;\n\n if (isOnMapSurface(event.target as HTMLElement) && event.shiftKey) {\n setIsPanning(true);\n panStartRef.current = { x, y, offsetX: panOffset.x, offsetY: panOffset.y };\n return;\n }\n\n setIsDragging(true);\n dragStartRef.current = { x, y, lat: markerPosition.lat, lng: markerPosition.lng };\n },\n [interactive, markerPosition, panOffset],\n );\n\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const panStart = panStartRef.current;\n if (isPanning && panStart) {\n setPanOffset(panTo(event, panStart));\n return;\n }\n\n const dragStart = dragStartRef.current;\n if (!isDragging || !dragStart) return;\n\n const position = dragTo(event, dragStart);\n setMarkerPosition(position);\n onMarkerDrag?.(position);\n },\n [isDragging, isPanning, onMarkerDrag, setMarkerPosition, setPanOffset],\n );\n\n const handleMouseUp = useCallback(() => {\n setIsDragging(false);\n setIsPanning(false);\n dragStartRef.current = null;\n panStartRef.current = null;\n }, []);\n\n return { isDragging, isPanning, handleMouseDown, handleMouseMove, handleMouseUp };\n};\n\nexport const useMapSearch = ({\n zoomTo,\n setMarkerPosition,\n}: {\n zoomTo: (zoom: number) => void;\n setMarkerPosition: (position: LatLng) => void;\n}) => {\n const [searchValue, setSearchValue] = useState('');\n const [isSearching, setIsSearching] = useState(false);\n\n const handleSearch = useCallback(\n async (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Enter' || !searchValue) return;\n\n setIsSearching(true);\n try {\n const result = await geocode(searchValue);\n // An unknown place leaves the map where it is; a production build would\n // surface an error here.\n if (!result) return;\n\n setMarkerPosition({ ...result });\n zoomTo(CITY_ZOOM);\n } finally {\n setIsSearching(false);\n }\n },\n [searchValue, zoomTo, setMarkerPosition],\n );\n\n return { searchValue, setSearchValue, isSearching, handleSearch };\n};\n\nexport const useMapClick = ({\n coordinates,\n interactive,\n isPanning,\n onMapClick,\n onMarkerDrag,\n setMarkerPosition,\n}: {\n coordinates: LatLng;\n interactive: boolean;\n isPanning: boolean;\n onMapClick?: (lat: number, lng: number) => void;\n onMarkerDrag?: (coords: LatLng) => void;\n setMarkerPosition: (position: LatLng) => void;\n}) =>\n useCallback(() => {\n // A pan ends with a click event; that should not also drop a marker.\n if (isPanning) return;\n\n // Without a real projection there is nothing to convert a click position\n // into, so the mock jitters around the centre instead.\n const coords = {\n lat: coordinates.lat + (Math.random() - 0.5) * CLICK_JITTER_DEGREES,\n lng: coordinates.lng + (Math.random() - 0.5) * CLICK_JITTER_DEGREES,\n };\n\n onMapClick?.(coords.lat, coords.lng);\n\n if (interactive && onMarkerDrag) {\n setMarkerPosition(coords);\n onMarkerDrag(coords);\n }\n }, [coordinates, interactive, isPanning, onMapClick, onMarkerDrag, setMarkerPosition]);\n"],"mappings":"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","names":["alpha","Box","styled","useTheme","useTheme","alpha","alpha","jsx","alpha","Box","styled","jsx","jsx","jsxs","useTheme","alpha","Box","styled","Tooltip","useTheme","alpha","Fragment","jsx","jsxs","styled","Box","alpha","useTheme","Tooltip","Box","useTheme","LocationIcon","alpha","Box","Typography","useTheme","Fragment","jsx","jsxs","useTheme","Box","LocationIcon","alpha","Typography","alpha","useTheme","jsx","useTheme","alpha","jsx","jsxs","useTheme","Box","useMemo","useRef","useMemo","useRef","jsx","jsxs","styled","alpha","Box","useTheme"]}
|
|
@@ -448,7 +448,7 @@ EnhancedTableBody.displayName = "EnhancedTableBody";
|
|
|
448
448
|
// src/components/data-display/Table/TableStates.tsx
|
|
449
449
|
import { Box as Box2, TableBody as TableBody2, TableCell as TableCell2, TableRow as TableRow2 } from "@mui/material";
|
|
450
450
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
451
|
-
var NoDataPlaceholder = () => /* @__PURE__ */ jsx3(Box2, { py: 4, color: "text.secondary", children:
|
|
451
|
+
var NoDataPlaceholder = ({ emptyText }) => /* @__PURE__ */ jsx3(Box2, { py: 4, color: "text.secondary", children: emptyText });
|
|
452
452
|
var EmptyRow = ({
|
|
453
453
|
colSpan,
|
|
454
454
|
children
|
|
@@ -838,7 +838,7 @@ var buildShell = ({
|
|
|
838
838
|
rest
|
|
839
839
|
});
|
|
840
840
|
var TableLoadingState = ({ shell, loadingComponent, columns }) => /* @__PURE__ */ jsx4(TableShell, { ...shell, children: /* @__PURE__ */ jsx4(TableBody3, { "data-testid": "table-loading", children: loadingComponent || /* @__PURE__ */ jsx4(LoadingSkeletonRows, { columns }) }) });
|
|
841
|
-
var TableEmptyState = ({ shell, emptyStateComponent, colSpan }) => /* @__PURE__ */ jsx4(TableShell, { ...shell, children: /* @__PURE__ */ jsx4(EmptyRow, { colSpan, children: emptyStateComponent || /* @__PURE__ */ jsx4(NoDataPlaceholder, {}) }) });
|
|
841
|
+
var TableEmptyState = ({ shell, emptyStateComponent, emptyText, colSpan }) => /* @__PURE__ */ jsx4(TableShell, { ...shell, children: /* @__PURE__ */ jsx4(EmptyRow, { colSpan, children: emptyStateComponent || /* @__PURE__ */ jsx4(NoDataPlaceholder, { emptyText }) }) });
|
|
842
842
|
var Table = React2.forwardRef(
|
|
843
843
|
(tableProps, ref) => {
|
|
844
844
|
const resolved = { ...TABLE_DEFAULTS, ...definedProps(tableProps) };
|
|
@@ -849,6 +849,7 @@ var Table = React2.forwardRef(
|
|
|
849
849
|
loading,
|
|
850
850
|
loadingComponent,
|
|
851
851
|
emptyStateComponent,
|
|
852
|
+
emptyText,
|
|
852
853
|
children,
|
|
853
854
|
...props
|
|
854
855
|
} = resolved;
|
|
@@ -874,6 +875,7 @@ var Table = React2.forwardRef(
|
|
|
874
875
|
{
|
|
875
876
|
shell,
|
|
876
877
|
emptyStateComponent,
|
|
878
|
+
emptyText,
|
|
877
879
|
colSpan: finalColumns?.length || 1
|
|
878
880
|
}
|
|
879
881
|
);
|