@road-labs/map-sdk 3.0.1-rc.12 → 3.0.2-rc.14

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/useOnScreen.ts","../src/i18n.ts","../src/utils/version.ts","../src/utils/request.ts","../src/utils/status.ts","../src/utils/statusFilters.ts","../src/contexts/Map.tsx","../src/Boot.tsx","../node_modules/@googlemaps/js-api-loader/dist/index.mjs","../src/utils/loader.ts","../node_modules/latlon-geohash/latlon-geohash.js","../src/components/OverlayView/OverlayView.tsx","../src/components/CustomMarker/CustomMarker.tsx","../src/utils/price.ts","../src/utils/pinState.ts","../src/components/Pin/Pin.tsx","../src/utils/buckets.ts","../src/components/MapMarkers/MapMarkers.tsx","../src/components/Map/Map.tsx","../src/components/StatusDot/StatusDot.tsx","../src/components/AnalyticsOverlay/AnalyticsOverlay.tsx","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/lib/has.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/dom-helpers/esm/hasClass.js","../node_modules/dom-helpers/esm/addClass.js","../node_modules/dom-helpers/esm/removeClass.js","../node_modules/react-transition-group/esm/config.js","../node_modules/react-transition-group/esm/utils/PropTypes.js","../node_modules/react-transition-group/esm/TransitionGroupContext.js","../node_modules/react-transition-group/esm/utils/reflow.js","../node_modules/react-transition-group/esm/Transition.js","../node_modules/react-transition-group/esm/CSSTransition.js","../node_modules/react-transition-group/esm/SwitchTransition.js","../src/components/Stack/View.tsx","../src/components/Stack/Stack.tsx","../src/components/SearchInput/SearchInput.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Range/Range.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/SelectField/SelectField.tsx","../src/assets/connectors/type2.svg","../src/assets/connectors/combo2.svg","../src/assets/connectors/type1.svg","../src/assets/connectors/combo1.svg","../src/assets/connectors/type3.svg","../src/assets/connectors/type3a.svg","../src/assets/connectors/schuko.svg","../src/assets/connectors/chademo.svg","../src/assets/connectors/catarc.svg","../src/components/connectorIcons.ts","../src/utils/filters.ts","../src/screens/Filters/index.tsx","../src/components/LocationPlaceholder/LocationPlaceholder.tsx","../src/components/Icons/Icons.tsx","../src/components/SidebarContainer/SidebarContainer.tsx","../src/components/Debug/Debug.tsx","../src/assets/station-icon.svg","../src/assets/building-icon.svg","../src/assets/car-icon.svg","../src/assets/bolt-icon.svg","../src/assets/pricing-icon.svg","../src/utils/location.ts","../src/utils/formatters.ts","../src/utils/date.ts","../src/utils/ocpi.ts","../src/components/Price/Price.tsx","../src/components/PriceComponents/PriceComponents.tsx","../src/components/CdrPrice/CdrPrice.tsx","../src/components/ConnectorTariff/ConnectorTariff.tsx","../src/utils/notes.ts","../src/screens/Locations/LocationDetailsV1.tsx","../src/components/LocationRow/LocationRow.tsx","../src/screens/Locations/v2/LocationHeader.tsx","../src/screens/Locations/v2/AvailabilitySummary.tsx","../src/screens/Locations/v2/OperatorSection.tsx","../src/utils/openingTimes.ts","../src/screens/Locations/v2/OpeningHours.tsx","../src/screens/Locations/v2/ParkingType.tsx","../src/screens/Locations/v2/ChargingAccessibility.tsx","../src/screens/Locations/v2/EvseHeader.tsx","../src/screens/Locations/v2/EvseStatus.tsx","../src/screens/Locations/v2/ConnectorSocket.tsx","../src/screens/Locations/v2/ConnectorPricing.tsx","../src/screens/Locations/v2/Tariff.tsx","../src/utils/activeTariff.ts","../src/screens/Locations/v2/TariffChips.tsx","../src/screens/Locations/v2/TariffLine.tsx","../src/screens/Locations/v2/ReportProblemButton.tsx","../src/screens/Locations/v2/NoTariff.tsx","../src/screens/Locations/v2/ActiveTariff.tsx","../src/screens/Locations/v2/Connector.tsx","../src/screens/Locations/v2/Evse.tsx","../src/screens/Locations/v2/Directions.tsx","../src/screens/Locations/v2/Location.tsx","../src/screens/Locations/Locations.tsx","../src/components/BackButton/BackButton.tsx","../src/screens/Locations/TariffNote.tsx","../src/screens/Locations/DynamicTariffs.tsx","../src/screens/Locations/v2/TariffDetails.tsx","../src/assets/close-icon.svg","../src/components/CloseButton/CloseButton.tsx","../src/screens/Locations/index.tsx","../src/assets/filter-icon.svg","../src/Router.tsx","../src/App.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, RefObject } from \"react\";\n\nexport default function useOnScreen(ref: RefObject<HTMLElement>) {\n const [wasIntersecting, setWasIntersecting] = useState(false);\n\n const observer = useMemo(\n () =>\n new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n setWasIntersecting(true);\n observer.disconnect();\n }\n }),\n [ref],\n );\n\n useEffect(() => {\n if (!ref.current) return;\n observer.observe(ref.current);\n return () => observer.disconnect();\n }, [ref.current]);\n\n return wasIntersecting;\n}\n","// getLanguage resolves a configured language, or the browser language when\n// none is given, to one of the supported string sets. Matching ignores case so\n// BCP 47 tags such as \"nl-NL\" work as well as \"nl-nl\".\nexport function getLanguage(lng?: string) {\n const language = (lng || window.navigator.language).toLowerCase();\n\n const dutchLangCodes = [\"nl\", \"nl-be\", \"nl-nl\"];\n if (dutchLangCodes.includes(language)) {\n return \"nl\";\n }\n\n const englishLangCodes = [\n \"en\",\n \"en-us\",\n \"en-eg\",\n \"en-au\",\n \"en-gb\",\n \"en-ca\",\n \"en-nz\",\n \"en-ie\",\n \"en-za\",\n \"en-jm\",\n \"en-bz\",\n \"en-tt\",\n ];\n\n if (englishLangCodes.includes(language)) {\n return \"en\";\n }\n\n const germanLangCodes = [\"de\", \"de-ch\", \"de-at\", \"de-lu\", \"de-li\", \"de-de\"];\n if (germanLangCodes.includes(language)) {\n return \"de\";\n }\n\n const frenchLangCodes = [\"fr\", \"fr-be\", \"fr-ca\", \"fr-fr\", \"fr-lu\", \"fr-ch\"];\n if (frenchLangCodes.includes(language)) {\n return \"fr\";\n }\n\n const italianLangCodes = [\"it\", \"it-ch\", \"it-it\"];\n if (italianLangCodes.includes(language)) {\n return \"it\";\n }\n\n const spanishLangCodes = [\n \"es\",\n \"es-ar\",\n \"es-bo\",\n \"es-cl\",\n \"es-co\",\n \"es-cr\",\n \"es-do\",\n \"es-ec\",\n \"es-sv\",\n \"es-gt\",\n \"es-hn\",\n \"es-mx\",\n \"es-ni\",\n \"es-pa\",\n \"es-py\",\n \"es-pe\",\n \"es-pr\",\n \"es-es\",\n \"es-uy\",\n \"es-ve\",\n ];\n\n if (spanishLangCodes.includes(language)) {\n return \"es\";\n }\n\n return \"en\";\n}\n\nexport type LabelsType = {\n \"search.placeholder\": string;\n \"cdrPrice.flatFee\": string;\n \"tariffPriceComponent.dynamicTariffHeader\": string;\n \"tariffPriceComponent.noTariff\": string;\n \"tariffPriceComponent.energy\": string;\n \"tariffPriceComponent.time\": string;\n \"tariffPriceComponent.parkingTime\": string;\n \"tariffPriceComponent.parkingTimeWait\": string;\n \"tariffPriceComponent.flat\": string;\n \"tariffPriceComponent.baseTariff\": string;\n \"tariffPriceComponent.active\": string;\n \"tariffPriceComponent.currentPrice\": string;\n \"tariffPriceComponent.viewTariff\": string;\n \"tariffNote.subHeader\": string;\n \"tariffNote.eFluxScheduledTariffNote\";\n \"tariffNote.dynamicScheduledTariffNote\";\n \"tariffNote.scheduledTariffNote\";\n \"tariffNote.baseTariffNote\";\n \"tariff.congestionPricing\": string;\n \"tariff.fullDetailsHeader\": string;\n \"tariff.lastUpdated\": string;\n \"tariff.report\": string;\n \"tariff.reportThanks\": string;\n \"tariff.reportError\": string;\n \"evse.statusAvailable\": string;\n \"evse.statusCharging\": string;\n \"evse.statusUnavailable\": string;\n \"evse.statusRemoved\": string;\n \"evse.statusPlanned\": string;\n \"evse.statusReserved\": string;\n \"evse.statusInoperative\": string;\n \"evse.statusOutOfOrder\": string;\n \"evse.statusError\": string;\n \"evse.statusUnknown\": string;\n \"evse.pricing\": string;\n \"filters.header\": string;\n \"filters.dcChargers\": string;\n \"filters.efluxChargers\": string;\n \"filters.noAdditionalFee\": string;\n \"filters.available\": string;\n \"filters.charging\": string;\n \"filters.notAvailable\": string;\n \"filters.chargingPower\": string;\n \"filters.connectorType\": string;\n \"filters.apply\": string;\n \"filters.clearAll\": string;\n \"filters.onlyShow\": string;\n \"filters.statusHeading\": string;\n \"evse.statusBlocked\": string;\n \"evse.statusClosed\": string;\n \"ocpp.statusPreparing\": string;\n \"ocpp.statusSuspendedEvse\": string;\n \"ocpp.statusSuspendedEv\": string;\n \"ocpp.statusFinishing\": string;\n \"ocpp.statusFaulted\": string;\n \"analytics.evseStatus\": string;\n \"analytics.roamingStatus\": string;\n \"pin.sites\": string;\n \"filters.maxEnergyPrice\": string;\n \"filters.anyPrice\": string;\n \"pin.pricePerKwh\": string;\n \"filters.chargingAccessibility\": string;\n \"filters.accessibilityAll\": string;\n \"filters.accessibilityTesla\": string;\n \"filters.allAccessibility\": string;\n \"filters.remoteStartStop\": string;\n \"filters.searchPhrase\": string;\n \"filters.searchPhrasePlaceholder\": string;\n \"filters.operator\": string;\n \"filters.excludeOperator\": string;\n \"filters.authMethodCapabilities\": string;\n \"filters.authCapability.rfid\": string;\n \"filters.authCapability.plugAndCharge\": string;\n \"filters.authCapability.creditCard\": string;\n \"filters.authCapability.remoteStartStop\": string;\n \"locationType.onStreet\": string;\n \"locationType.parkingGarage\": string;\n \"locationType.undergroundGarage\": string;\n \"locationType.parkingLot\": string;\n \"locationType.other\": string;\n \"locationType.unknown\": string;\n \"dynamicTariffs.subHeader\": string;\n \"location.viewAllHourlyPrices\": string;\n \"location.operatorInfo\": string;\n \"location.operator\": string;\n \"location.suboperator\": string;\n \"location.owner\": string;\n \"location.openingHours\": string;\n \"location.open24_7\": string;\n \"location.open\": string;\n \"location.openNow\": string;\n \"location.closedNow\": string;\n \"location.closed\": string;\n \"location.open24hours\": string;\n \"location.hours24\": string;\n \"location.opensAt\": string;\n \"location.opensAtDay\": string;\n \"location.closesAt\": string;\n \"location.chargingWhenClosed\": string;\n \"location.exceptionalClosings\": string;\n \"location.exceptionalOpenings\": string;\n \"location.visitWebsite\": string;\n \"weekday.mon\": string;\n \"weekday.tue\": string;\n \"weekday.wed\": string;\n \"weekday.thu\": string;\n \"weekday.fri\": string;\n \"weekday.sat\": string;\n \"weekday.sun\": string;\n \"backButton.backTo\": string;\n};\n\nexport const en: LabelsType = {\n \"search.placeholder\": \"Enter a location...\",\n \"cdrPrice.flatFee\": \"{{total}} additional fee\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Dynamic Tariff - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} session\",\n \"tariffPriceComponent.time\": \"{{total}} / hour\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / hour idle fee\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. wait time before idle fee\",\n \"tariffPriceComponent.noTariff\": \"No tariff available\",\n \"tariffPriceComponent.baseTariff\": \"Base Tariff\",\n \"tariffPriceComponent.active\": \"Active now\",\n \"tariffPriceComponent.currentPrice\": \"Current price\",\n \"filters.header\": \"Filters\",\n \"filters.dcChargers\": \"Fast Chargers\",\n \"filters.efluxChargers\": \"E-Flux Chargers\",\n \"filters.noAdditionalFee\": \"Without additional fee per session\",\n \"filters.available\": \"Available\",\n \"filters.charging\": \"Charging\",\n \"filters.notAvailable\": \"Not Available\",\n \"filters.chargingPower\": \"Charging Power [kW]\",\n \"filters.connectorType\": \"Connector Type\",\n \"filters.apply\": \"Apply Filters\",\n \"filters.clearAll\": \"Clear All Filters\",\n \"filters.onlyShow\": \"Only Show\",\n \"filters.statusHeading\": \"Status\",\n \"evse.statusBlocked\": \"Blocked\",\n \"evse.statusClosed\": \"Closed\",\n \"ocpp.statusPreparing\": \"Preparing\",\n \"ocpp.statusSuspendedEvse\": \"Suspended (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Suspended (EV)\",\n \"ocpp.statusFinishing\": \"Finishing\",\n \"ocpp.statusFaulted\": \"Faulted\",\n \"analytics.evseStatus\": \"EVSE Status\",\n \"analytics.roamingStatus\": \"Roaming Status\",\n \"pin.sites\": \"sites\",\n \"filters.maxEnergyPrice\": \"Max. price per kWh\",\n \"filters.anyPrice\": \"Any\",\n \"pin.pricePerKwh\": \"{{price}} per kWh\",\n \"filters.chargingAccessibility\": \"Vehicle Accessibility\",\n \"filters.accessibilityAll\": \"All vehicles\",\n \"filters.accessibilityTesla\": \"Tesla only\",\n \"filters.allAccessibility\": \"All accessibility types\",\n \"filters.remoteStartStop\": \"Supports remote charge\",\n \"filters.searchPhrase\": \"Search\",\n \"filters.searchPhrasePlaceholder\": \"EVSE ID or location name\",\n \"filters.operator\": \"Include operator(s)\",\n \"filters.excludeOperator\": \"Exclude operator(s)\",\n \"filters.authMethodCapabilities\": \"Payment methods\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Credit / debit card\",\n \"filters.authCapability.remoteStartStop\": \"Remote start/stop\",\n \"evse.statusAvailable\": \"Available\",\n \"evse.statusCharging\": \"Charging\",\n \"evse.statusUnavailable\": \"Unavailable\",\n \"evse.statusRemoved\": \"Removed\",\n \"evse.statusPlanned\": \"Planned\",\n \"evse.statusReserved\": \"Reserved\",\n \"evse.statusInoperative\": \"Inoperative\",\n \"evse.statusOutOfOrder\": \"Out of Order\",\n \"evse.statusError\": \"Error\",\n \"evse.statusUnknown\": \"Unknown\",\n \"locationType.onStreet\": \"On Street\",\n \"locationType.parkingGarage\": \"Parking Garage\",\n \"locationType.undergroundGarage\": \"Underground Garage\",\n \"locationType.parkingLot\": \"Parking Lot\",\n \"locationType.other\": \"Other\",\n \"locationType.unknown\": \"Unknown\",\n \"tariffPriceComponent.viewTariff\": \"View Tariff notes\",\n \"tariffNote.subHeader\": \"Tariff notes\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"A scheduled tariff overrides base tariff prices for specific time period.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Dynamic price is adjusted automatically based on energy market price (1 hour interval).\",\n \"tariffNote.scheduledTariffNote\":\n \"A scheduled tariff overrides base tariff prices for specific time period.\",\n \"tariffNote.baseTariffNote\":\n \"Tariffs shown here have been sent to E-Flux by roaming partner. Accuracy may vary depending on provider.\",\n \"tariff.congestionPricing\": \"Congestion pricing may apply\",\n \"tariff.fullDetailsHeader\": \"Tariff details\",\n \"tariff.lastUpdated\": \"Last updated {{date}}\",\n \"tariff.report\": \"Report\",\n \"tariff.reportThanks\": \"Thanks for reporting\",\n \"tariff.reportError\": \"Couldn't send, try again\",\n \"evse.pricing\": \"Pricing\",\n \"dynamicTariffs.subHeader\": \"Hourly Prices\",\n \"location.viewAllHourlyPrices\": \"View All Hourly Prices\",\n \"location.operatorInfo\": \"Operator\",\n \"location.operator\": \"Operator\",\n \"location.suboperator\": \"Suboperator\",\n \"location.owner\": \"Owner\",\n \"location.openingHours\": \"Opening hours\",\n \"location.open24_7\": \"Open 24/7\",\n \"location.open\": \"Open\",\n \"location.openNow\": \"Open now\",\n \"location.closedNow\": \"Closed\",\n \"location.closed\": \"Closed\",\n \"location.open24hours\": \"Open 24 hours\",\n \"location.hours24\": \"24 hours\",\n \"location.opensAt\": \"Opens {{time}}\",\n \"location.opensAtDay\": \"Opens {{time}} {{day}}\",\n \"location.closesAt\": \"Closes {{time}}\",\n \"location.chargingWhenClosed\": \"Charging available when closed\",\n \"location.exceptionalClosings\": \"Exceptional closing\",\n \"location.exceptionalOpenings\": \"Exceptional opening\",\n \"location.visitWebsite\": \"Website\",\n \"weekday.mon\": \"Mon\",\n \"weekday.tue\": \"Tue\",\n \"weekday.wed\": \"Wed\",\n \"weekday.thu\": \"Thu\",\n \"weekday.fri\": \"Fri\",\n \"weekday.sat\": \"Sat\",\n \"weekday.sun\": \"Sun\",\n \"backButton.backTo\": \"Back To\",\n};\n\nexport const nl: LabelsType = {\n \"search.placeholder\": \"Voer een locatie in...\",\n \"cdrPrice.flatFee\": \"{{total}} extra kosten\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Dynamisch Tarief - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} sessie\",\n \"tariffPriceComponent.time\": \"{{total}} / uur\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / uur blokkeertarief\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. wachttijd voor blokkeertarief\",\n \"tariffPriceComponent.noTariff\": \"Geen beschikbaar tarief\",\n \"tariffPriceComponent.baseTariff\": \"Basistarief\",\n \"tariffPriceComponent.active\": \"Nu actief\",\n \"tariffPriceComponent.currentPrice\": \"Huidige prijs\",\n \"filters.header\": \"Filters\",\n \"filters.dcChargers\": \"DC-laders\",\n \"filters.efluxChargers\": \"E-Flux-laders\",\n \"filters.noAdditionalFee\": \"Zonder extra kosten per sessie\",\n \"filters.available\": \"Beschikbaar\",\n \"filters.charging\": \"Laden\",\n \"filters.notAvailable\": \"Niet beschikbaar\",\n \"filters.chargingPower\": \"Laadvermogen [kW]\",\n \"filters.connectorType\": \"Aansluitingstype\",\n \"filters.apply\": \"Filters toepassen\",\n \"filters.clearAll\": \"Alle filters wissen\",\n \"filters.onlyShow\": \"Alleen tonen\",\n \"filters.statusHeading\": \"Status\",\n \"evse.statusBlocked\": \"Geblokkeerd\",\n \"evse.statusClosed\": \"Gesloten\",\n \"ocpp.statusPreparing\": \"Voorbereiden\",\n \"ocpp.statusSuspendedEvse\": \"Onderbroken (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Onderbroken (EV)\",\n \"ocpp.statusFinishing\": \"Afronden\",\n \"ocpp.statusFaulted\": \"Storing\",\n \"analytics.evseStatus\": \"EVSE-status\",\n \"analytics.roamingStatus\": \"Roamingstatus\",\n \"pin.sites\": \"locaties\",\n \"filters.maxEnergyPrice\": \"Max. prijs per kWh\",\n \"filters.anyPrice\": \"Alle\",\n \"pin.pricePerKwh\": \"{{price}} per kWh\",\n \"filters.chargingAccessibility\": \"Voertuigtoegang\",\n \"filters.accessibilityAll\": \"Alle voertuigen\",\n \"filters.accessibilityTesla\": \"Alleen Tesla\",\n \"filters.allAccessibility\": \"Alle toegankelijkheidstypes\",\n \"filters.remoteStartStop\": \"Ondersteunt op afstand laden\",\n \"filters.searchPhrase\": \"Zoeken\",\n \"filters.searchPhrasePlaceholder\": \"EVSE-ID of locatienaam\",\n \"filters.operator\": \"Operator(s) opnemen\",\n \"filters.excludeOperator\": \"Operator(s) uitsluiten\",\n \"filters.authMethodCapabilities\": \"Betaalmethoden\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Creditcard / pinpas\",\n \"filters.authCapability.remoteStartStop\": \"Op afstand starten/stoppen\",\n \"evse.statusAvailable\": \"Beschikbaar\",\n \"evse.statusCharging\": \"Laden\",\n \"evse.statusUnavailable\": \"Niet beschikbaar\",\n \"evse.statusError\": \"Fout\",\n \"evse.statusRemoved\": \"Verwijderd\",\n \"evse.statusPlanned\": \"Gepland\",\n \"evse.statusReserved\": \"Gereserveerd\",\n \"evse.statusInoperative\": \"Inoperative\",\n \"evse.statusOutOfOrder\": \"Uit van orde\",\n \"evse.statusUnknown\": \"Onbekend\",\n \"locationType.onStreet\": \"Op straat\",\n \"locationType.parkingGarage\": \"Parkeergarage\",\n \"locationType.undergroundGarage\": \"Ondergrondse garage\",\n \"locationType.parkingLot\": \"Parkeerterrein\",\n \"locationType.other\": \"Anders\",\n \"locationType.unknown\": \"Onbekend\",\n \"tariffPriceComponent.viewTariff\": \"Tariefnotitie bekijken\",\n \"tariffNote.subHeader\": \"Tariefnotities\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Een gepland tarief overschrijft de basis tariefprijzen voor een specifieke periode.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"De dynamische prijs wordt automatisch aangepast op basis van de energiemarktprijs (interval van 1 uur).\",\n \"tariffNote.scheduledTariffNote\":\n \"Een gepland tarief overschrijft de basis tariefprijzen voor een specifieke periode.\",\n \"tariffNote.baseTariffNote\":\n \"De hier getoonde tarieven zijn door de roamingpartner aan E-Flux verstrekt. De nauwkeurigheid kan variëren afhankelijk van de aanbieder.\",\n \"tariff.congestionPricing\": \"Congestietarief kan van toepassing zijn\",\n \"tariff.fullDetailsHeader\": \"Tariefdetails\",\n \"tariff.lastUpdated\": \"Laatst bijgewerkt {{date}}\",\n \"tariff.report\": \"Rapporteren\",\n \"tariff.reportThanks\": \"Bedankt voor de melding\",\n \"tariff.reportError\": \"Versturen mislukt, probeer opnieuw\",\n \"evse.pricing\": \"Tarieven\",\n \"dynamicTariffs.subHeader\": \"Uurtarieven\",\n \"location.viewAllHourlyPrices\": \"Bekijk Alle Uurprijzen\",\n \"location.operatorInfo\": \"Exploitant\",\n \"location.operator\": \"Exploitant\",\n \"location.suboperator\": \"Subexploitant\",\n \"location.owner\": \"Eigenaar\",\n \"location.openingHours\": \"Openingstijden\",\n \"location.open24_7\": \"24/7 geopend\",\n \"location.open\": \"Open\",\n \"location.openNow\": \"Nu open\",\n \"location.closedNow\": \"Gesloten\",\n \"location.closed\": \"Gesloten\",\n \"location.open24hours\": \"24 uur geopend\",\n \"location.hours24\": \"24 uur\",\n \"location.opensAt\": \"Opent om {{time}}\",\n \"location.opensAtDay\": \"Opent {{day}} om {{time}}\",\n \"location.closesAt\": \"Sluit om {{time}}\",\n \"location.chargingWhenClosed\": \"Laden mogelijk wanneer gesloten\",\n \"location.exceptionalClosings\": \"Uitzonderlijke sluiting\",\n \"location.exceptionalOpenings\": \"Uitzonderlijke opening\",\n \"location.visitWebsite\": \"Website\",\n \"weekday.mon\": \"Ma\",\n \"weekday.tue\": \"Di\",\n \"weekday.wed\": \"Wo\",\n \"weekday.thu\": \"Do\",\n \"weekday.fri\": \"Vr\",\n \"weekday.sat\": \"Za\",\n \"weekday.sun\": \"Zo\",\n \"backButton.backTo\": \"Terug Naar\",\n};\n\nexport const de: LabelsType = {\n \"search.placeholder\": \"Geben Sie einen Ort ein...\",\n \"cdrPrice.flatFee\": \"{{total}} Zusatzgebühr\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Dynamischer Tarif - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} Sitzung\",\n \"tariffPriceComponent.time\": \"{{total}} / Stunde\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / Stunde Blockiergebühr\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} Min. Wartezeit vor der Blockiergebühr\",\n \"tariffPriceComponent.noTariff\": \"Kein Tarif verfügbar\",\n \"tariffPriceComponent.baseTariff\": \"Grundtarif\",\n \"tariffPriceComponent.active\": \"Aktuell aktiv\",\n \"tariffPriceComponent.currentPrice\": \"Aktueller Preis\",\n \"filters.header\": \"Filter\",\n \"filters.dcChargers\": \"Gleichstrom-Ladegeräte\",\n \"filters.efluxChargers\": \"E-Flux-Ladegeräte\",\n \"filters.noAdditionalFee\": \"Ohne zusätzliche Gebühr pro Sitzung\",\n \"filters.available\": \"Verfügbar\",\n \"filters.charging\": \"Lädt\",\n \"filters.notAvailable\": \"Nicht verfügbar\",\n \"filters.chargingPower\": \"Ladeleistung [kW]\",\n \"filters.connectorType\": \"Steckertyp\",\n \"filters.apply\": \"Filter anwenden\",\n \"filters.clearAll\": \"Alle Filter löschen\",\n \"filters.onlyShow\": \"Nur anzeigen\",\n \"filters.statusHeading\": \"Status\",\n \"evse.statusBlocked\": \"Blockiert\",\n \"evse.statusClosed\": \"Geschlossen\",\n \"ocpp.statusPreparing\": \"Vorbereitung\",\n \"ocpp.statusSuspendedEvse\": \"Unterbrochen (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Unterbrochen (EV)\",\n \"ocpp.statusFinishing\": \"Abschluss\",\n \"ocpp.statusFaulted\": \"Fehler\",\n \"analytics.evseStatus\": \"EVSE-Status\",\n \"analytics.roamingStatus\": \"Roaming-Status\",\n \"pin.sites\": \"Standorte\",\n \"filters.maxEnergyPrice\": \"Max. Preis pro kWh\",\n \"filters.anyPrice\": \"Alle\",\n \"pin.pricePerKwh\": \"{{price}} pro kWh\",\n \"filters.chargingAccessibility\": \"Fahrzeugzugänglichkeit\",\n \"filters.accessibilityAll\": \"Alle Fahrzeuge\",\n \"filters.accessibilityTesla\": \"Nur Tesla\",\n \"filters.allAccessibility\": \"Alle Zugänglichkeitstypen\",\n \"filters.remoteStartStop\": \"Unterstützt Fernladen\",\n \"filters.searchPhrase\": \"Suche\",\n \"filters.searchPhrasePlaceholder\": \"EVSE-ID oder Standortname\",\n \"filters.operator\": \"Betreiber einschließen\",\n \"filters.excludeOperator\": \"Betreiber ausschließen\",\n \"filters.authMethodCapabilities\": \"Zahlungsmethoden\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Kredit- / Debitkarte\",\n \"filters.authCapability.remoteStartStop\": \"Fernstart/-stopp\",\n \"evse.statusAvailable\": \"Verfügbar\",\n \"evse.statusCharging\": \"Lädt\",\n \"evse.statusUnavailable\": \"Nicht verfügbar\",\n \"evse.statusRemoved\": \"Entfernt\",\n \"evse.statusPlanned\": \"Geplant\",\n \"evse.statusReserved\": \"Reserviert\",\n \"evse.statusInoperative\": \"Inoperative\",\n \"evse.statusOutOfOrder\": \"Ausgeschaltet\",\n \"evse.statusError\": \"Fehler\",\n \"evse.statusUnknown\": \"Unbekannt\",\n \"evse.pricing\": \"Preisbildung\",\n \"locationType.onStreet\": \"Straße\",\n \"locationType.parkingGarage\": \"Parkhaus\",\n \"locationType.undergroundGarage\": \"Tiefgarage\",\n \"locationType.parkingLot\": \"Parkplatz\",\n \"locationType.other\": \"Andere\",\n \"locationType.unknown\": \"Unbekannt\",\n \"tariffPriceComponent.viewTariff\": \"Tarif anzeigen\",\n \"tariffNote.subHeader\": \"Tarifhinweise\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Ein geplanter Tarif überschreibt die Basistarifpreise für einen bestimmten Zeitraum.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Der dynamische Preis wird automatisch basierend auf dem Energiepreis auf dem Markt angepasst (im Intervall von 1 Stunde).\",\n \"tariffNote.scheduledTariffNote\":\n \"Ein geplanter Tarif überschreibt die Basistarifpreise für einen bestimmten Zeitraum.\",\n \"tariffNote.baseTariffNote\":\n \"Die hier angezeigten Tarife wurden von einem Roaming-Partner an E-Flux gesendet. Die Genauigkeit kann je nach Anbieter variieren.\",\n \"tariff.congestionPricing\": \"Überlastungstarif kann anfallen\",\n \"tariff.fullDetailsHeader\": \"Tarifdetails\",\n \"tariff.lastUpdated\": \"Zuletzt aktualisiert {{date}}\",\n \"tariff.report\": \"Melden\",\n \"tariff.reportThanks\": \"Danke für die Meldung\",\n \"tariff.reportError\": \"Senden fehlgeschlagen, erneut versuchen\",\n \"dynamicTariffs.subHeader\": \"Stundentarife\",\n \"location.viewAllHourlyPrices\": \"Alle Stundenpreise anzeigen\",\n \"location.operatorInfo\": \"Betreiber\",\n \"location.operator\": \"Betreiber\",\n \"location.suboperator\": \"Unterbetreiber\",\n \"location.owner\": \"Eigentümer\",\n \"location.openingHours\": \"Öffnungszeiten\",\n \"location.open24_7\": \"24/7 geöffnet\",\n \"location.open\": \"Geöffnet\",\n \"location.openNow\": \"Jetzt geöffnet\",\n \"location.closedNow\": \"Geschlossen\",\n \"location.closed\": \"Geschlossen\",\n \"location.open24hours\": \"24 Stunden geöffnet\",\n \"location.hours24\": \"24 Stunden\",\n \"location.opensAt\": \"Öffnet um {{time}}\",\n \"location.opensAtDay\": \"Öffnet {{day}} um {{time}}\",\n \"location.closesAt\": \"Schließt um {{time}}\",\n \"location.chargingWhenClosed\":\n \"Laden auch außerhalb der Öffnungszeiten möglich\",\n \"location.exceptionalClosings\": \"Ausnahmsweise geschlossen\",\n \"location.exceptionalOpenings\": \"Ausnahmsweise geöffnet\",\n \"location.visitWebsite\": \"Website\",\n \"weekday.mon\": \"Mo\",\n \"weekday.tue\": \"Di\",\n \"weekday.wed\": \"Mi\",\n \"weekday.thu\": \"Do\",\n \"weekday.fri\": \"Fr\",\n \"weekday.sat\": \"Sa\",\n \"weekday.sun\": \"So\",\n \"backButton.backTo\": \"Zurück zu\",\n};\n\nexport const fr: LabelsType = {\n \"search.placeholder\": \"Entrez un lieu...\",\n \"cdrPrice.flatFee\": \"{{total}} frais supplémentaires\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Tarif Dynamique - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} session\",\n \"tariffPriceComponent.time\": \"{{total}} / heure\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\":\n \"{{total}} / frais d'occupation par heure\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. avant frais d'occupation\",\n \"tariffPriceComponent.noTariff\": \"Aucun tarif disponible\",\n \"tariffPriceComponent.baseTariff\": \"Tarif de base\",\n \"tariffPriceComponent.active\": \"Actuellement actif\",\n \"tariffPriceComponent.currentPrice\": \"Prix actuel\",\n \"filters.header\": \"Filtres\",\n \"filters.dcChargers\": \"Chargeurs à courant continu\",\n \"filters.efluxChargers\": \"Chargeurs E-Flux\",\n \"filters.noAdditionalFee\": \"Sans frais supplémentaires par séance\",\n \"filters.available\": \"Disponible\",\n \"filters.charging\": \"En charge\",\n \"filters.notAvailable\": \"Indisponible\",\n \"filters.chargingPower\": \"Puissance de charge [kW]\",\n \"filters.connectorType\": \"Type de connecteur\",\n \"filters.apply\": \"Appliquer les filtres\",\n \"filters.clearAll\": \"Effacer tous les filtres\",\n \"filters.onlyShow\": \"Afficher uniquement\",\n \"filters.statusHeading\": \"Statut\",\n \"evse.statusBlocked\": \"Bloqué\",\n \"evse.statusClosed\": \"Fermé\",\n \"ocpp.statusPreparing\": \"Préparation\",\n \"ocpp.statusSuspendedEvse\": \"Suspendu (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Suspendu (EV)\",\n \"ocpp.statusFinishing\": \"Finalisation\",\n \"ocpp.statusFaulted\": \"En défaut\",\n \"analytics.evseStatus\": \"Statut EVSE\",\n \"analytics.roamingStatus\": \"Statut roaming\",\n \"pin.sites\": \"sites\",\n \"filters.maxEnergyPrice\": \"Prix max. par kWh\",\n \"filters.anyPrice\": \"Tous\",\n \"pin.pricePerKwh\": \"{{price}} par kWh\",\n \"filters.chargingAccessibility\": \"Accessibilité véhicule\",\n \"filters.accessibilityAll\": \"Tous véhicules\",\n \"filters.accessibilityTesla\": \"Tesla seulement\",\n \"filters.allAccessibility\": \"Tous types d'accessibilité\",\n \"filters.remoteStartStop\": \"Prend en charge la recharge à distance\",\n \"filters.searchPhrase\": \"Rechercher\",\n \"filters.searchPhrasePlaceholder\": \"ID EVSE ou nom du lieu\",\n \"filters.operator\": \"Inclure le(s) opérateur(s)\",\n \"filters.excludeOperator\": \"Exclure le(s) opérateur(s)\",\n \"filters.authMethodCapabilities\": \"Moyens de paiement\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Carte de crédit / débit\",\n \"filters.authCapability.remoteStartStop\": \"Démarrage/arrêt à distance\",\n \"evse.statusAvailable\": \"Disponible\",\n \"evse.statusCharging\": \"En charge\",\n \"evse.statusUnavailable\": \"Indisponible\",\n \"evse.statusRemoved\": \"Supprimé\",\n \"evse.statusPlanned\": \"Planifié\",\n \"evse.statusReserved\": \"Réservé\",\n \"evse.statusInoperative\": \"Hors service\",\n \"evse.statusOutOfOrder\": \"En panne\",\n \"evse.statusError\": \"Erreur\",\n \"evse.statusUnknown\": \"Inconnu\",\n \"evse.pricing\": \"Tarification\",\n \"locationType.onStreet\": \"Dans la rue\",\n \"locationType.parkingGarage\": \"Parking couvert\",\n \"locationType.undergroundGarage\": \"Parking souterrain\",\n \"locationType.parkingLot\": \"Parking\",\n \"locationType.other\": \"Autre\",\n \"locationType.unknown\": \"Inconnu\",\n \"tariffPriceComponent.viewTariff\": \"Voir le tarif\",\n \"tariffNote.subHeader\": \"Notes tarifaires\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Un tarif programmé remplace les prix de base du tarif pour une période spécifique.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Le prix dynamique est ajusté automatiquement en fonction du prix du marché de l'énergie (intervalle d'une heure).\",\n \"tariffNote.scheduledTariffNote\":\n \"Un tarif programmé remplace les prix de base du tarif pour une période spécifique.\",\n \"tariffNote.baseTariffNote\":\n \"Les tarifs affichés ici ont été transmis à E-Flux par le partenaire d'itinérance. La précision peut varier en fonction du fournisseur.\",\n \"tariff.congestionPricing\": \"Tarification de congestion peut s'appliquer\",\n \"tariff.fullDetailsHeader\": \"Détails du tarif\",\n \"tariff.lastUpdated\": \"Mis à jour {{date}}\",\n \"tariff.report\": \"Signaler\",\n \"tariff.reportThanks\": \"Merci pour le signalement\",\n \"tariff.reportError\": \"Échec de l'envoi, réessayez\",\n \"dynamicTariffs.subHeader\": \"Tarifs horaires\",\n \"location.viewAllHourlyPrices\": \"Voir tous les tarifs horaires\",\n \"location.operatorInfo\": \"Opérateur\",\n \"location.operator\": \"Opérateur\",\n \"location.suboperator\": \"Sous-opérateur\",\n \"location.owner\": \"Propriétaire\",\n \"location.openingHours\": \"Heures d'ouverture\",\n \"location.open24_7\": \"Ouvert 24h/24, 7j/7\",\n \"location.open\": \"Ouvert\",\n \"location.openNow\": \"Ouvert\",\n \"location.closedNow\": \"Fermé\",\n \"location.closed\": \"Fermé\",\n \"location.open24hours\": \"Ouvert 24h/24\",\n \"location.hours24\": \"24 heures\",\n \"location.opensAt\": \"Ouvre à {{time}}\",\n \"location.opensAtDay\": \"Ouvre {{day}} à {{time}}\",\n \"location.closesAt\": \"Ferme à {{time}}\",\n \"location.chargingWhenClosed\":\n \"Recharge possible hors des heures d'ouverture\",\n \"location.exceptionalClosings\": \"Fermeture exceptionnelle\",\n \"location.exceptionalOpenings\": \"Ouverture exceptionnelle\",\n \"location.visitWebsite\": \"Site web\",\n \"weekday.mon\": \"Lun\",\n \"weekday.tue\": \"Mar\",\n \"weekday.wed\": \"Mer\",\n \"weekday.thu\": \"Jeu\",\n \"weekday.fri\": \"Ven\",\n \"weekday.sat\": \"Sam\",\n \"weekday.sun\": \"Dim\",\n \"backButton.backTo\": \"Retour à\",\n};\n\nexport const it: LabelsType = {\n \"search.placeholder\": \"Inserisci una posizione...\",\n \"cdrPrice.flatFee\": \"{{total}} costi aggiuntivi\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Tariffa dinamica - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} sessione\",\n \"tariffPriceComponent.time\": \"{{total}} / ora\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / ora tariffa di inattività\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. tempo di attesa prima della tariffa di inattività\",\n \"tariffPriceComponent.noTariff\": \"Nessuna tariffa disponibile\",\n \"tariffPriceComponent.baseTariff\": \"Tariffa base\",\n \"tariffPriceComponent.active\": \"Attivo ora\",\n \"tariffPriceComponent.currentPrice\": \"Prezzo attuale\",\n \"filters.header\": \"Filtri\",\n \"filters.dcChargers\": \"Caricabatterie DC\",\n \"filters.efluxChargers\": \"Caricabatterie E-Flux\",\n \"filters.noAdditionalFee\": \"Senza costi aggiuntivi per sessione\",\n \"filters.available\": \"Disponibile\",\n \"filters.charging\": \"In carica\",\n \"filters.notAvailable\": \"Non disponibile\",\n \"filters.chargingPower\": \"Potenza di ricarica [kW]\",\n \"filters.connectorType\": \"Tipo di connettore\",\n \"filters.apply\": \"Applica filtri\",\n \"filters.clearAll\": \"Cancella tutti i filtri\",\n \"filters.onlyShow\": \"Mostra solo\",\n \"filters.statusHeading\": \"Stato\",\n \"evse.statusBlocked\": \"Bloccato\",\n \"evse.statusClosed\": \"Chiuso\",\n \"ocpp.statusPreparing\": \"Preparazione\",\n \"ocpp.statusSuspendedEvse\": \"Sospeso (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Sospeso (EV)\",\n \"ocpp.statusFinishing\": \"Completamento\",\n \"ocpp.statusFaulted\": \"Guasto\",\n \"analytics.evseStatus\": \"Stato EVSE\",\n \"analytics.roamingStatus\": \"Stato roaming\",\n \"pin.sites\": \"siti\",\n \"filters.maxEnergyPrice\": \"Prezzo max. per kWh\",\n \"filters.anyPrice\": \"Tutti\",\n \"pin.pricePerKwh\": \"{{price}} per kWh\",\n \"filters.chargingAccessibility\": \"Accessibilità del veicolo\",\n \"filters.accessibilityAll\": \"Tutti i veicoli\",\n \"filters.accessibilityTesla\": \"Solo Tesla\",\n \"filters.allAccessibility\": \"Tutti i tipi di accessibilità\",\n \"filters.remoteStartStop\": \"Supporta la ricarica da remoto\",\n \"filters.searchPhrase\": \"Cerca\",\n \"filters.searchPhrasePlaceholder\": \"ID EVSE o nome della posizione\",\n \"filters.operator\": \"Includi operatore/i\",\n \"filters.excludeOperator\": \"Escludi operatore/i\",\n \"filters.authMethodCapabilities\": \"Metodi di pagamento\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Carta di credito / debito\",\n \"filters.authCapability.remoteStartStop\": \"Avvio/stop remoto\",\n \"evse.statusAvailable\": \"Disponibile\",\n \"evse.statusCharging\": \"In carica\",\n \"evse.statusUnavailable\": \"Non disponibile\",\n \"evse.statusRemoved\": \"Rimossa\",\n \"evse.statusPlanned\": \"Pianificata\",\n \"evse.statusReserved\": \"Réservé\",\n \"evse.statusInoperative\": \"Inoperativo\",\n \"evse.statusOutOfOrder\": \"Fuori servizio\",\n \"evse.statusError\": \"Errore\",\n \"evse.statusUnknown\": \"Sconosciuto\",\n \"locationType.onStreet\": \"In strada\",\n \"locationType.parkingGarage\": \"Garage per il parcheggio\",\n \"locationType.undergroundGarage\": \"Garage sotterraneo\",\n \"locationType.parkingLot\": \"Parcheggio\",\n \"locationType.other\": \"Altro\",\n \"locationType.unknown\": \"Sconosciuto\",\n \"tariffPriceComponent.viewTariff\": \"Visualizza note tariffarie\",\n \"tariffNote.subHeader\": \"Note tariffarie\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Una tariffa programmata sostituisce i prezzi della tariffa base per un periodo di tempo specifico.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Il prezzo dinamico si regola automaticamente in base al prezzo del mercato dell'energia (intervallo di 1 ora).\",\n \"tariffNote.scheduledTariffNote\":\n \"Una tariffa programmata sostituisce i prezzi della tariffa base per un periodo di tempo specifico.\",\n \"tariffNote.baseTariffNote\":\n \"Le tariffe mostrate qui sono state inviate a E-Flux dal partner di roaming. L'accuratezza può variare a seconda del fornitore.\",\n \"tariff.congestionPricing\":\n \"Potrebbero essere applicate tariffe di congestione\",\n \"tariff.fullDetailsHeader\": \"Dettagli tariffa\",\n \"tariff.lastUpdated\": \"Ultimo aggiornamento {{date}}\",\n \"tariff.report\": \"Segnala\",\n \"tariff.reportThanks\": \"Grazie per la segnalazione\",\n \"tariff.reportError\": \"Invio non riuscito, riprova\",\n \"evse.pricing\": \"Prezzi\",\n \"dynamicTariffs.subHeader\": \"Prezzi orari\",\n \"location.viewAllHourlyPrices\": \"Visualizza tutti i prezzi orari\",\n \"location.operatorInfo\": \"Operatore\",\n \"location.operator\": \"Operatore\",\n \"location.suboperator\": \"Sub-operatore\",\n \"location.owner\": \"Proprietario\",\n \"location.openingHours\": \"Orari di apertura\",\n \"location.open24_7\": \"Aperto 24/7\",\n \"location.open\": \"Aperto\",\n \"location.openNow\": \"Aperto ora\",\n \"location.closedNow\": \"Chiuso\",\n \"location.closed\": \"Chiuso\",\n \"location.open24hours\": \"Aperto 24 ore\",\n \"location.hours24\": \"24 ore\",\n \"location.opensAt\": \"Apre alle {{time}}\",\n \"location.opensAtDay\": \"Apre {{day}} alle {{time}}\",\n \"location.closesAt\": \"Chiude alle {{time}}\",\n \"location.chargingWhenClosed\": \"Ricarica disponibile anche da chiuso\",\n \"location.exceptionalClosings\": \"Chiusura eccezionale\",\n \"location.exceptionalOpenings\": \"Apertura eccezionale\",\n \"location.visitWebsite\": \"Sito web\",\n \"weekday.mon\": \"Lun\",\n \"weekday.tue\": \"Mar\",\n \"weekday.wed\": \"Mer\",\n \"weekday.thu\": \"Gio\",\n \"weekday.fri\": \"Ven\",\n \"weekday.sat\": \"Sab\",\n \"weekday.sun\": \"Dom\",\n \"backButton.backTo\": \"Torna a\",\n};\n\nexport const es: LabelsType = {\n \"search.placeholder\": \"Ingrese una ubicación...\",\n \"cdrPrice.flatFee\": \"{{total}} tarifa adicional\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Tarifa Dinámica - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} sesión\",\n \"tariffPriceComponent.time\": \"{{total}} / hora\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / hora tarifa de inactividad\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. tiempo de espera antes de la tarifa de inactividad\",\n \"tariffPriceComponent.noTariff\": \"Tarifa no disponible\",\n \"tariffPriceComponent.baseTariff\": \"Tarifa Base\",\n \"tariffPriceComponent.active\": \"Activo ahora\",\n \"tariffPriceComponent.currentPrice\": \"Precio actual\",\n \"filters.header\": \"Filtros\",\n \"filters.dcChargers\": \"Cargadores DC\",\n \"filters.efluxChargers\": \"Cargadores E-Flux\",\n \"filters.noAdditionalFee\": \"Sin tarifa adicional por sesión\",\n \"filters.available\": \"Disponible\",\n \"filters.charging\": \"Cargando\",\n \"filters.notAvailable\": \"No Disponible\",\n \"filters.chargingPower\": \"Potencia de Carga [kW]\",\n \"filters.connectorType\": \"Tipo de Conector\",\n \"filters.apply\": \"Aplicar Filtros\",\n \"filters.clearAll\": \"Limpiar Todos los Filtros\",\n \"filters.onlyShow\": \"Mostrar Solo\",\n \"filters.statusHeading\": \"Estado\",\n \"evse.statusBlocked\": \"Bloqueado\",\n \"evse.statusClosed\": \"Cerrado\",\n \"ocpp.statusPreparing\": \"Preparando\",\n \"ocpp.statusSuspendedEvse\": \"Suspendido (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Suspendido (EV)\",\n \"ocpp.statusFinishing\": \"Finalizando\",\n \"ocpp.statusFaulted\": \"Averiado\",\n \"analytics.evseStatus\": \"Estado EVSE\",\n \"analytics.roamingStatus\": \"Estado roaming\",\n \"pin.sites\": \"sitios\",\n \"filters.maxEnergyPrice\": \"Precio máx. por kWh\",\n \"filters.anyPrice\": \"Todos\",\n \"pin.pricePerKwh\": \"{{price}} por kWh\",\n \"filters.chargingAccessibility\": \"Accesibilidad del vehículo\",\n \"filters.accessibilityAll\": \"Todos los vehículos\",\n \"filters.accessibilityTesla\": \"Solo Tesla\",\n \"filters.allAccessibility\": \"Todos los tipos de accesibilidad\",\n \"filters.remoteStartStop\": \"Admite carga remota\",\n \"filters.searchPhrase\": \"Buscar\",\n \"filters.searchPhrasePlaceholder\": \"ID de EVSE o nombre de la ubicación\",\n \"filters.operator\": \"Incluir operador(es)\",\n \"filters.excludeOperator\": \"Excluir operador(es)\",\n \"filters.authMethodCapabilities\": \"Métodos de pago\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Tarjeta de crédito / débito\",\n \"filters.authCapability.remoteStartStop\": \"Inicio/parada remota\",\n \"evse.statusRemoved\": \"Eliminado\",\n \"evse.statusPlanned\": \"Planificado\",\n \"evse.statusReserved\": \"Reservado\",\n \"evse.statusInoperative\": \"Fuera de servicio\",\n \"evse.statusOutOfOrder\": \"Averiado\",\n \"evse.statusAvailable\": \"Disponible\",\n \"evse.statusCharging\": \"Cargando\",\n \"evse.statusUnavailable\": \"No Disponible\",\n \"evse.statusError\": \"Error\",\n \"evse.statusUnknown\": \"Desconocido\",\n \"locationType.onStreet\": \"En la calle\",\n \"locationType.parkingGarage\": \"Garaje para Estacionar\",\n \"locationType.undergroundGarage\": \"Garaje Subterráneo\",\n \"locationType.parkingLot\": \"Estacionamiento\",\n \"locationType.other\": \"Otro\",\n \"locationType.unknown\": \"Desconocido\",\n \"tariffPriceComponent.viewTariff\": \"Ver notas de tarifas\",\n \"tariffNote.subHeader\": \"Notas de Tarifas\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Una tarifa programada anula los precios de la tarifa base para un período de tiempo específico.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"El precio dinámico se ajusta automáticamente según el precio del mercado de la energía (intervalo de 1 hora).\",\n \"tariffNote.scheduledTariffNote\":\n \"Una tarifa programada anula los precios de la tarifa base para un período de tiempo específico.\",\n \"tariffNote.baseTariffNote\":\n \"Las tarifas mostradas aquí han sido enviadas a E-Flux por el socio de roaming. La precisión puede variar según el proveedor.\",\n \"tariff.congestionPricing\": \"Puede aplicarse tarifa por congestión\",\n \"tariff.fullDetailsHeader\": \"Detalles de la tarifa\",\n \"tariff.lastUpdated\": \"Última actualización {{date}}\",\n \"tariff.report\": \"Reportar\",\n \"tariff.reportThanks\": \"Gracias por reportarlo\",\n \"tariff.reportError\": \"Error al enviar, inténtalo de nuevo\",\n \"evse.pricing\": \"Precios\",\n \"dynamicTariffs.subHeader\": \"Precios por Hora\",\n \"location.viewAllHourlyPrices\": \"Ver Todos los Precios por Hora\",\n \"location.operatorInfo\": \"Operador\",\n \"location.operator\": \"Operador\",\n \"location.suboperator\": \"Suboperador\",\n \"location.owner\": \"Propietario\",\n \"location.openingHours\": \"Horario de apertura\",\n \"location.open24_7\": \"Abierto 24/7\",\n \"location.open\": \"Abierto\",\n \"location.openNow\": \"Abierto ahora\",\n \"location.closedNow\": \"Cerrado\",\n \"location.closed\": \"Cerrado\",\n \"location.open24hours\": \"Abierto 24 horas\",\n \"location.hours24\": \"24 horas\",\n \"location.opensAt\": \"Abre a las {{time}}\",\n \"location.opensAtDay\": \"Abre {{day}} a las {{time}}\",\n \"location.closesAt\": \"Cierra a las {{time}}\",\n \"location.chargingWhenClosed\": \"Carga disponible cuando está cerrado\",\n \"location.exceptionalClosings\": \"Cierre excepcional\",\n \"location.exceptionalOpenings\": \"Apertura excepcional\",\n \"location.visitWebsite\": \"Sitio web\",\n \"weekday.mon\": \"Lun\",\n \"weekday.tue\": \"Mar\",\n \"weekday.wed\": \"Mié\",\n \"weekday.thu\": \"Jue\",\n \"weekday.fri\": \"Vie\",\n \"weekday.sat\": \"Sáb\",\n \"weekday.sun\": \"Dom\",\n \"backButton.backTo\": \"Volver a\",\n};\n\nexport const strings = {\n en,\n nl,\n de,\n fr,\n it,\n es,\n};\n","// MapVersion is the behaviour set an embedder selects with the `version` prop.\n// Each version keeps everything the one before it does: v2 adds map-key\n// authentication and the v2 details view, v3 adds the redesigned pins and asks\n// the API to count bucket statuses per EVSE rather than per location.\nexport type MapVersion = \"v1\" | \"v2\" | \"v3\";\n\nconst order: MapVersion[] = [\"v1\", \"v2\", \"v3\"];\n\n// versionRank places a version on the ordering above; unknown or missing\n// values rank as v1.\nexport function versionRank(version?: string): number {\n const index = order.indexOf((version || \"\").toLowerCase() as MapVersion);\n return index === -1 ? 0 : index;\n}\n\n// atLeast reports whether a version is the given one or a later one.\nexport function atLeast(version: string | undefined, min: MapVersion): boolean {\n return versionRank(version) >= versionRank(min);\n}\n","import { Analytics, MapKind, RemoteConfig } from \"../types\";\nimport { atLeast } from \"./version\";\n\ntype RequestOptionsType = {\n method?: string;\n body?: string;\n authorization?: string;\n version?: string;\n headers?: {\n \"Content-Type\": string;\n };\n};\n\nexport async function request(url: string, options?: RequestOptionsType) {\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(options.version && {\n version: options.version,\n }),\n ...(options.authorization &&\n atLeast(options.version, \"v2\") && {\n Authorization: `Bearer ${options.authorization}`,\n }),\n },\n ...options,\n });\n\n switch (response.status) {\n case 200:\n return response.json();\n case 400:\n throw new Error(\"Bad request\");\n case 404:\n throw new Error(\"Not Found\");\n case 500:\n throw new Error(\"Server Error\");\n case 503:\n throw new Error(\"Timeout!\");\n default:\n throw new Error(`Unexpected status: ${response.status}`);\n }\n } catch (e) {\n if (e instanceof DOMException) {\n return null;\n }\n throw e;\n }\n}\n\n// buildSearchBody shapes the widget filters into the request body shared by\n// /1/map/search and /1/map/analytics, so both endpoints match the same set.\nexport function buildSearchBody(\n limitToLocationIds: string[],\n props: Record<string, any>,\n) {\n return {\n ...(limitToLocationIds?.length > 0 && {\n locationIds: limitToLocationIds,\n }),\n ...props,\n ...(props?.operatorOnly ? { operator: [props.operatorOnly] } : {}),\n // ALL means no filter on the server, so leave it out of the body\n chargingAccessibility:\n props?.chargingAccessibility && props.chargingAccessibility !== \"ALL\"\n ? props.chargingAccessibility\n : undefined,\n searchPhrase: props?.searchPhrase || undefined,\n excludeOperator: props?.excludeOperator?.length\n ? props.excludeOperator\n : undefined,\n authMethodCapabilities: props?.authMethodCapabilities?.length\n ? props.authMethodCapabilities\n : undefined,\n currency: props?.currency || undefined,\n // the widget holds the limit as a bare amount in the map currency; the API\n // wants it paired with its currency, defaulting to the request currency\n maxEnergyPrice:\n typeof props?.maxEnergyPrice === \"number\"\n ? { amount: props.maxEnergyPrice, currency: props.currency || undefined }\n : undefined,\n };\n}\n\n// mapSearchPath resolves the endpoint for a map kind. Roaming maps stay on the\n// paths the mobile apps use; CPO maps use the /cpo/ variants, which speak the\n// connector OCPP status vocabulary and return individual locations.\nexport function mapSearchPath(\n apiRoot: string,\n kind: MapKind,\n endpoint: \"search\" | \"analytics\",\n): string {\n const root = apiRoot.replace(/\\/+$/, \"\");\n return `${root}/1/map/${kind === \"cpo\" ? \"cpo/\" : \"\"}${endpoint}`;\n}\n\nexport async function _fetchGeohashes(\n apiRoot,\n version,\n authorization,\n limitToLocationIds,\n { precision, ...props },\n kind: MapKind = \"roaming\",\n): Promise<any> {\n return request(mapSearchPath(apiRoot, kind, \"search\"), {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n gridPrecision: precision,\n ...buildSearchBody(limitToLocationIds, props),\n }),\n });\n}\n\nexport async function _fetchAnalytics(\n apiRoot,\n version,\n authorization,\n limitToLocationIds,\n props,\n kind: MapKind = \"roaming\",\n): Promise<{ data: Analytics }> {\n return request(mapSearchPath(apiRoot, kind, \"analytics\"), {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify(buildSearchBody(limitToLocationIds, props)),\n });\n}\n\nexport async function _fetchTariffs(\n apiRoot,\n version,\n authorization,\n { origin, ids },\n): Promise<any> {\n return request(`${apiRoot}/1/map/tariff`, {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n connection_id: origin.connectionId,\n country_code: origin.countryCode,\n party_id: origin.partyId,\n tariff_ids: ids,\n }),\n });\n}\n\nexport async function _fetchLocations(\n apiRoot,\n version,\n authorization,\n { ids, status },\n): Promise<any> {\n return request(`${apiRoot}/1/map/locations`, {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n ids,\n ...(atLeast(version, \"v2\") ? { status } : {}),\n }),\n });\n}\n\nexport async function _reportProblem(\n apiRoot,\n version,\n authorization,\n {\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n }: {\n type: string;\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n },\n): Promise<any> {\n return request(`${apiRoot}/1/map/report-problem`, {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n }),\n });\n}\n\nexport async function loadRemoteConfig(\n apiRoot: string,\n version: string,\n authorization: string,\n): Promise<RemoteConfig> {\n const response = await request(`${apiRoot}/1/map/config`, {\n version: version,\n authorization: authorization,\n });\n\n return response?.data as RemoteConfig;\n}\n","import { LabelsType } from \"../i18n\";\nimport { MapKind } from \"../types\";\nimport { atLeast } from \"./version\";\n\n// Status names reach the widget in two vocabularies. Roaming maps carry the\n// OCPI EVSE status (AVAILABLE, INOPERATIVE, ...). CPO maps carry the connector\n// OCPP status the station reports (PREPARING, FAULTED, ...). Either can arrive\n// bare or with its enum prefix depending on the endpoint, so everything is\n// normalised to a bare upper-case name before it is coloured or labelled.\n\nconst prefixes = [\"EVSE_STATUS_\", \"CONNECTOR_OCPP_STATUS_\"];\n\nexport function normaliseStatus(status?: string): string {\n let name = (status || \"\").toUpperCase();\n for (const prefix of prefixes) {\n if (name.startsWith(prefix)) {\n name = name.slice(prefix.length);\n break;\n }\n }\n if (name === \"\" || name === \"UNSPECIFIED\") {\n return \"UNKNOWN\";\n }\n return name;\n}\n\n// Palette is the set of colours every status maps onto. v1 and v2 maps keep\n// the classic palette; v3 maps use the colours of the redesigned pins.\nexport type Palette = {\n green: string;\n blue: string;\n red: string;\n amber: string;\n grey: string;\n};\n\nexport const classicPalette: Palette = {\n green: \"#33AC19\",\n blue: \"#005CEE\",\n red: \"#EB001B\",\n amber: \"#F0A202\",\n grey: \"#9E9E9E\",\n};\n\nexport const modernPalette: Palette = {\n green: \"#0a924b\",\n blue: \"#3a6cce\",\n red: \"#d73337\",\n amber: \"#d98b09\",\n grey: \"#94999e\",\n};\n\nexport function paletteFor(version?: string): Palette {\n return atLeast(version, \"v3\") ? modernPalette : classicPalette;\n}\n\n// OCPP 1.6 states a connector passes through while a session is on it. They\n// colour like CHARGING so a busy-but-not-yet-charging pin is not read as broken.\nexport const inSessionStatuses = new Set([\n \"CHARGING\",\n \"PREPARING\",\n \"SUSPENDED_EVSE\",\n \"SUSPENDED_EV\",\n \"FINISHING\",\n]);\n\n// StatusTone is what a status means for the colour of whatever shows it.\nexport type StatusTone =\n | \"available\"\n | \"inSession\"\n | \"fault\"\n | \"unavailable\"\n | \"unknown\"\n | \"offline\";\n\n// Roaming maps answer a driver's question: can I charge here? Anything that is\n// neither free nor in use is offline to them.\nfunction roamingTone(name: string): StatusTone {\n if (name === \"AVAILABLE\") return \"available\";\n if (inSessionStatuses.has(name)) return \"inSession\";\n return \"offline\";\n}\n\n// CPO maps answer an operator's question: is anything wrong here? A fault, a\n// station taken out of service on purpose and one that has never reported are\n// three different answers, and RESERVED counts as in use.\nfunction cpoTone(name: string): StatusTone {\n if (name === \"FAULTED\") return \"fault\";\n if (name === \"UNAVAILABLE\") return \"unavailable\";\n if (name === \"UNKNOWN\") return \"unknown\";\n if (name === \"AVAILABLE\") return \"available\";\n if (inSessionStatuses.has(name) || name === \"RESERVED\") return \"inSession\";\n return \"fault\";\n}\n\nexport function statusTone(\n status?: string,\n kind: MapKind = \"roaming\",\n): StatusTone {\n const name = normaliseStatus(status);\n return kind === \"cpo\" ? cpoTone(name) : roamingTone(name);\n}\n\ntype ToneColours = Record<StatusTone, keyof Palette>;\n\n// Up to v2 a roaming map shows three colours: green, blue for a session, red\n// for the rest. v3 follows the pin design: a session is amber, the rest grey.\nconst roamingClassic: ToneColours = {\n available: \"green\",\n inSession: \"blue\",\n offline: \"red\",\n fault: \"red\",\n unavailable: \"red\",\n unknown: \"red\",\n};\n\nconst roamingModern: ToneColours = {\n available: \"green\",\n inSession: \"amber\",\n offline: \"grey\",\n fault: \"red\",\n unavailable: \"grey\",\n unknown: \"grey\",\n};\n\nconst cpoColours: ToneColours = {\n fault: \"red\",\n unavailable: \"amber\",\n unknown: \"grey\",\n available: \"green\",\n inSession: \"blue\",\n offline: \"amber\",\n};\n\nfunction toneColours(kind: MapKind, version?: string): ToneColours {\n if (kind === \"cpo\") return cpoColours;\n return atLeast(version, \"v3\") ? roamingModern : roamingClassic;\n}\n\nexport function toneColour(\n tone: StatusTone,\n kind: MapKind = \"roaming\",\n version?: string,\n): string {\n return paletteFor(version)[toneColours(kind, version)[tone]];\n}\n\nexport function getStatusColor(\n status?: string,\n kind: MapKind = \"roaming\",\n version?: string,\n): string {\n return toneColour(statusTone(status, kind), kind, version);\n}\n\nconst labelKeys: Record<string, keyof LabelsType> = {\n AVAILABLE: \"evse.statusAvailable\",\n CHARGING: \"evse.statusCharging\",\n UNAVAILABLE: \"evse.statusUnavailable\",\n ERROR: \"evse.statusError\",\n UNKNOWN: \"evse.statusUnknown\",\n REMOVED: \"evse.statusRemoved\",\n PLANNED: \"evse.statusPlanned\",\n RESERVED: \"evse.statusReserved\",\n INOPERATIVE: \"evse.statusInoperative\",\n OUTOFORDER: \"evse.statusOutOfOrder\",\n BLOCKED: \"evse.statusBlocked\",\n CLOSED: \"evse.statusClosed\",\n PREPARING: \"ocpp.statusPreparing\",\n SUSPENDED_EVSE: \"ocpp.statusSuspendedEvse\",\n SUSPENDED_EV: \"ocpp.statusSuspendedEv\",\n FINISHING: \"ocpp.statusFinishing\",\n FAULTED: \"ocpp.statusFaulted\",\n};\n\nexport function getStatusLabelKey(status?: string): keyof LabelsType {\n return labelKeys[normaliseStatus(status)] || \"evse.statusUnknown\";\n}\n\n// Marker tone priority per map kind, most important first. A pin takes the\n// first tone any of its statuses maps to.\nconst tonePriority: Record<MapKind, StatusTone[]> = {\n // a driver wants to know something is free\n roaming: [\"available\", \"inSession\", \"offline\"],\n // an operator wants to know something is wrong\n cpo: [\"fault\", \"unavailable\", \"inSession\", \"available\", \"unknown\"],\n};\n\n// pickMarkerColor colours a pin from its status buckets following the kind's\n// priority. With no buckets at all a roaming pin is offline and a CPO pin unknown.\nexport function pickMarkerColor(\n statuses: Array<{ name: string; count: number }> = [],\n kind: MapKind = \"roaming\",\n version?: string,\n): string {\n const tones = new Set(\n statuses.map((status) => statusTone(status.name, kind)),\n );\n const priority = tonePriority[kind];\n const tone =\n priority.find((candidate) => tones.has(candidate)) || priority.at(-1);\n return toneColour(tone, kind, version);\n}\n","import { LabelsType } from \"../i18n\";\nimport { MapKind } from \"../types\";\nimport { getStatusColor, getStatusLabelKey, normaliseStatus } from \"./status\";\n\n// StatusFilterOption is one checkbox in the status section of the filters\n// panel. `values` are the names sent in the search request's `status` list;\n// the option reads as checked when every one of them is selected.\nexport type StatusFilterOption = {\n id: string;\n labelKey: keyof LabelsType;\n values: string[];\n color: string;\n};\n\n// Roaming maps filter on the OCPI EVSE status, grouped the way drivers think:\n// free, busy, or not usable. Colours follow the SDK version's palette.\nfunction roamingOptions(version?: string): StatusFilterOption[] {\n return [\n {\n id: \"statusAvailable\",\n labelKey: \"filters.available\",\n values: [\"AVAILABLE\"],\n color: getStatusColor(\"AVAILABLE\", \"roaming\", version),\n },\n {\n id: \"statusCharging\",\n labelKey: \"filters.charging\",\n values: [\"CHARGING\"],\n color: getStatusColor(\"CHARGING\", \"roaming\", version),\n },\n {\n id: \"statusError\",\n labelKey: \"filters.notAvailable\",\n values: [\"INOPERATIVE\", \"UNKNOWN\"],\n color: getStatusColor(\"INOPERATIVE\", \"roaming\", version),\n },\n ];\n}\n\n// CPO maps filter on the connector OCPP status the station reports, one option\n// per OCPP 1.6 state so an operator can single out e.g. Faulted. The server\n// only knows UNSPECIFIED for the unknown state, so that is the wire value even\n// though it displays as Unknown.\nconst ocppStatuses = [\n \"AVAILABLE\",\n \"PREPARING\",\n \"CHARGING\",\n \"SUSPENDED_EVSE\",\n \"SUSPENDED_EV\",\n \"FINISHING\",\n \"RESERVED\",\n \"UNAVAILABLE\",\n \"FAULTED\",\n \"UNSPECIFIED\",\n];\n\nfunction ocppOptions(version?: string): StatusFilterOption[] {\n return ocppStatuses.map((status) => ({\n id: `ocppStatus_${status}`,\n labelKey: getStatusLabelKey(status),\n values: [status],\n color: getStatusColor(status, \"cpo\", version),\n }));\n}\n\nfunction isCpo(kind?: MapKind): boolean {\n return kind === \"cpo\";\n}\n\nexport function getStatusFilterOptions(\n kind?: MapKind,\n version?: string,\n): StatusFilterOption[] {\n return isCpo(kind) ? ocppOptions(version) : roamingOptions(version);\n}\n\n// toggleOption adds or removes a set of status values from the selected list,\n// keeping the rest untouched and never duplicating a value.\nexport function toggleOption(\n action: \"remove\" | \"add\",\n existing: string[],\n values: string[],\n): string[] {\n switch (action) {\n case \"remove\":\n return existing.filter((value) => !values.includes(value));\n case \"add\":\n return Array.from(new Set([...existing, ...values]));\n }\n}\n\n// findStatusFilterOption returns the filter option a status bucket belongs to,\n// or undefined when the context has no checkbox covering that status (e.g.\n// RESERVED on a roaming map). An UNKNOWN bucket matches the option carrying\n// UNSPECIFIED, the wire value the server knows for it.\nexport function findStatusFilterOption(\n kind: MapKind | undefined,\n status: string,\n): StatusFilterOption | undefined {\n const name = normaliseStatus(status);\n return getStatusFilterOptions(kind).find(\n (option) =>\n option.values.includes(name) ||\n (name === \"UNKNOWN\" && option.values.includes(\"UNSPECIFIED\")),\n );\n}\n\n// isStatusFilterActive reports whether the option covering a status bucket is\n// fully selected, which is when its checkbox would show as checked.\nexport function isStatusFilterActive(\n kind: MapKind | undefined,\n selected: string[],\n status: string,\n): boolean {\n const option = findStatusFilterOption(kind, status);\n return Boolean(\n option && option.values.every((value) => selected.includes(value)),\n );\n}\n\n// toggleStatusFilter flips the option covering a status bucket, the same way a\n// click on its checkbox would, and returns the new selection. Undefined means\n// no option covers the bucket, so there is nothing to toggle.\nexport function toggleStatusFilter(\n kind: MapKind | undefined,\n selected: string[],\n status: string,\n): string[] | undefined {\n const option = findStatusFilterOption(kind, status);\n if (!option) return undefined;\n const action = isStatusFilterActive(kind, selected, status)\n ? \"remove\"\n : \"add\";\n return toggleOption(action, selected, option.values);\n}\n\n// withoutStatusFilter returns the filters with the status selection removed.\n// The status pills fetch their counts with it so every status present in the\n// view stays listed, with the selected ones highlighted, instead of the\n// unselected ones vanishing from the response.\nexport function withoutStatusFilter(\n filters: Record<string, any> | undefined,\n): Record<string, any> {\n const { status, ...rest } = filters || {};\n return rest;\n}\n\n// statusForLocations decides what the status filter sends to /1/map/locations,\n// which narrows a location's EVSEs by roaming status. CPO maps hold connector\n// OCPP names in the filter, which that endpoint cannot match, so they send\n// nothing and the details view shows the whole location.\nexport function statusForLocations(\n kind: MapKind | undefined,\n status: string[] | undefined,\n): string[] | undefined {\n return isCpo(kind) ? undefined : status;\n}\n","import React, { useState, useMemo, useEffect, createContext } from \"react\";\nimport { LabelsType, strings, getLanguage } from \"../i18n\";\nimport {\n _fetchAnalytics,\n _fetchGeohashes,\n _fetchLocations,\n _fetchTariffs,\n _reportProblem,\n loadRemoteConfig,\n} from \"../utils/request\";\nimport {\n Analytics,\n Location,\n MapKind,\n Position,\n RemoteConfig,\n RoadMapOptions,\n Status,\n FilterConfiguration,\n} from \"../types\";\nimport { statusForLocations } from \"../utils/statusFilters\";\nimport { atLeast } from \"../utils/version\";\n\n// SearchBounds is the normalised bounding box the markers were last fetched\n// for. The analytics pill reuses it so its totals match the pins on screen.\nexport type SearchBounds = {\n nwLat: number;\n nwLng: number;\n seLat: number;\n seLng: number;\n};\n\nexport type MapContextType = {\n t: (key: keyof LabelsType, props?: any) => string;\n isReady: boolean;\n options?: RoadMapOptions;\n setPlace: (place: any) => void;\n place?: google.maps.places.PlaceResult;\n fetchGeohashes?: ({ precision, bbox }) => Promise<any>;\n fetchAnalytics?: (args: {\n bbox: SearchBounds;\n [filter: string]: any;\n }) => Promise<{ data: Analytics }>;\n searchBounds?: SearchBounds;\n setSearchBounds?: (bounds: SearchBounds) => void;\n // mapKind follows options.context, which the remote map config overrides once\n // loaded. Components branch on it for paths, clustering and status colours.\n mapKind: MapKind;\n // currency energy prices are shown and filtered in on v3 maps (ISO 4217)\n currency: string;\n fetchLocations?: ({ ids }) => Promise<any>;\n fetchTariffs?: ({ origin, ids }) => Promise<any>;\n reportProblem?: (args: {\n type: string;\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n }) => Promise<any>;\n filters?: any;\n setLocationsIds?: (ids: string[]) => void;\n locationIds?: string[];\n filterConfiguration?: FilterConfiguration;\n setFilters?: (filters: any) => void;\n language: string;\n position?: Position;\n locations?: Location[];\n locationsStatus?: Status;\n isSearching?: boolean;\n setIsSearching?: (isSearching: boolean) => void;\n};\n\n// defaultCurrency matches what the API assumes when a request names none.\nexport const defaultCurrency = \"EUR\";\n\n// MapContext is the context that is used to store the map data include the initial configuration\n// passed to the widget\nexport const MapContext = createContext<MapContextType>({\n isReady: false,\n setPlace: () => {},\n t: (key: string) => `Translate ${key}`,\n language: \"en\",\n mapKind: \"roaming\",\n currency: defaultCurrency,\n});\n\ninterface Props {\n children: React.ReactNode;\n options: RoadMapOptions;\n language: string;\n}\n\nexport const MapProvider: React.FC<Props> = ({ children, ...props }) => {\n const [options, setOptions] = useState<RoadMapOptions>(props.options);\n const [filterConfiguration, setFilterConfiguration] =\n useState<FilterConfiguration>({\n preferredOperators: props.options.preferredOperators,\n // only carry flags the consumer actually set, so an undefined prop does\n // not wipe the value the remote config supplies for it\n ...(props.options.showOperatorOnly !== undefined && {\n showOperatorOnly: props.options.showOperatorOnly,\n }),\n ...(props.options.showNoAdditionalFeeFilter !== undefined && {\n showNoAdditionalFeeFilter: props.options.showNoAdditionalFeeFilter,\n }),\n ...(props.options.showPublishingModeFilter !== undefined && {\n showPublishingModeFilter: props.options.showPublishingModeFilter,\n }),\n ...(props.options.showVehicleAvailabilityFilter !== undefined && {\n showVehicleAvailabilityFilter:\n props.options.showVehicleAvailabilityFilter,\n }),\n ...(props.options.showSearchPhraseFilter !== undefined && {\n showSearchPhraseFilter: props.options.showSearchPhraseFilter,\n }),\n ...(props.options.showExcludeOperatorFilter !== undefined && {\n showExcludeOperatorFilter: props.options.showExcludeOperatorFilter,\n }),\n ...(props.options.showPaymentMethodFilter !== undefined && {\n showPaymentMethodFilter: props.options.showPaymentMethodFilter,\n }),\n ...(props.options.showAnalytics !== undefined && {\n showAnalytics: props.options.showAnalytics,\n }),\n ...(props.options.showPriceFilter !== undefined && {\n showPriceFilter: props.options.showPriceFilter,\n }),\n });\n const [error, setError] = useState();\n const [place, setPlace] = useState();\n const [position, setPosition] = useState<Position>(props.options.position);\n const [filters, setFilters] = useState<{ status?: string }>({});\n const [locationIds, setLocationsIds] = useState<string[]>(\n [props.options.locationId].filter(Boolean),\n );\n const [locations, setLocations] = useState<Location[]>([]);\n const [locationsStatus, setLocationsStatus] = useState<Status>({\n type: \"success\",\n });\n const [isSearching, setIsSearching] = useState<boolean>(false);\n const [searchBounds, setSearchBounds] = useState<SearchBounds>();\n // the map key's context, known once the remote config has loaded\n const [mapContext, setMapContext] = useState<RemoteConfig[\"context\"]>();\n\n // check if debug flag\n const isDebug = window.location.search.includes(\"debug=true\");\n if (isDebug) {\n console.log(\"map-context options\", props.options);\n }\n\n // no language prop: getLanguage falls back to the browser language\n const language = useMemo(\n () => getLanguage(props.options.language),\n [props.options.language],\n );\n const t = useMemo(() => {\n return (key: keyof LabelsType, props): string => {\n return strings[language][key].replace(/\\{\\{(\\w+)\\}\\}/g, (match, p1) => {\n return props[p1];\n });\n };\n }, [language]);\n\n const apiRoot = (() => {\n // a configured apiRoot is honoured for development targets only (a .dev\n // host or a local server); production embeds always use the version's root\n const configured = props.options.apiRoot?.replace(/\\/+$/, \"\");\n if (configured && /\\.dev|localhost|127\\.0\\.0\\.1/.test(configured)) {\n return configured;\n }\n // v2 and v3 share the map-search service; v3 differs by the version header\n // request() sends, not by where it sends it\n return atLeast(props.options.version, \"v2\")\n ? \"https://roaming.road.io/v2/map-search\"\n : \"https://api.road.io\";\n })();\n\n let version = props.options.version;\n let authorization = props.options.authorization;\n\n // if the request URL contains a map_key, override the authorization to enable\n // linking to bespoke map instances without multiple deployments\n const mapKey = window.location.search.split(\"map_key=\")[1];\n if (mapKey) {\n authorization = mapKey;\n // a map key needs at least v2, which authenticates with it\n if (!atLeast(version, \"v2\")) {\n version = \"v2\";\n }\n }\n\n const mapKind: MapKind =\n mapContext?.toLowerCase() === \"cpo\" ? \"cpo\" : \"roaming\";\n\n // the prop wins, then the remote config, then the API default\n const currency = (props.options.currency || options.currency || defaultCurrency)\n .trim()\n .toUpperCase();\n\n const passThroughSearchOptions = {\n // every search and analytics request names the currency so the price on\n // each bucket and the price limit agree with what the widget shows\n ...(atLeast(version, \"v3\") && { currency }),\n ...(props.options.infraProviderId && {\n infraProviderId: props.options.infraProviderId,\n }),\n ...(props.options.partyId && { partyId: props.options.partyId }),\n ...(props.options.partyIds?.length && {\n partyIds: props.options.partyIds,\n }),\n ...(props.options.evseId && { evseId: props.options.evseId }),\n ...(props.options.from && { from: props.options.from }),\n ...(props.options.to && { to: props.options.to }),\n };\n\n const fetchGeohashes = (args) =>\n _fetchGeohashes(\n apiRoot,\n version,\n authorization,\n props.options.limitToLocationIds || [],\n { ...passThroughSearchOptions, ...args },\n mapKind,\n );\n\n const fetchAnalytics = (args) =>\n _fetchAnalytics(\n apiRoot,\n version,\n authorization,\n props.options.limitToLocationIds || [],\n { ...passThroughSearchOptions, ...args },\n mapKind,\n );\n\n const fetchLocations = _fetchLocations.bind(\n null,\n apiRoot,\n version,\n authorization,\n );\n\n const fetchTariffs = _fetchTariffs.bind(\n null,\n apiRoot,\n version,\n authorization,\n );\n\n const reportProblem = _reportProblem.bind(\n null,\n apiRoot,\n version,\n authorization,\n );\n\n async function onFetchLocations({ ids, status }) {\n setLocationsStatus({ type: \"loading\" });\n try {\n const { data } = await fetchLocations({\n ids,\n ...(atLeast(version, \"v2\")\n ? { status: statusForLocations(mapKind, status) }\n : {}),\n });\n setLocations(data.filter((location) => location?.evses?.length));\n setLocationsStatus({ type: \"success\" });\n return data;\n } catch (e) {\n setLocationsStatus({ type: \"error\", error: e });\n }\n }\n\n useEffect(() => {\n if (!props.options.locationId) {\n return;\n }\n onFetchLocations({\n ids: [props.options.locationId],\n status: filters.status,\n }).then((data) => {\n if (data?.length) {\n const location = data[0];\n if (location.geoLocation?.coordinates) {\n setPosition({\n lng: location.geoLocation?.coordinates[0],\n lat: location.geoLocation?.coordinates[1],\n });\n }\n }\n });\n }, [props.options.locationId]);\n\n useEffect(() => {\n loadRemoteConfig(apiRoot, version, authorization)\n .then((rc) => {\n if (isDebug) {\n console.log(\"retrieved remote config\", rc);\n }\n // merge the remote configuration, with the locally defined configuration\n setFilterConfiguration({\n ...rc,\n ...filterConfiguration,\n });\n setOptions({\n googleApiKey: rc.googleMapsApiKey,\n ...options,\n ...rc,\n });\n setMapContext(rc.context);\n if (!options.locationId && !options?.position?.lat && rc.ipLatitude) {\n if (isDebug) {\n console.debug(\"setting position from ip latitude and longitude\");\n }\n setPosition({\n lat: rc.ipLatitude,\n lng: rc.ipLongitude,\n });\n // if the has not set a location id and we have a position\n } else if (!options.locationId) {\n if (isDebug) {\n console.debug(\"setting position from options position\");\n }\n setPosition(\n options?.position?.lat\n ? options.position\n : {\n lat: 52.3676,\n lng: 4.9041,\n },\n );\n }\n })\n .catch((err) => setError(err));\n }, []);\n\n useEffect(() => {\n if (locationIds?.length) {\n onFetchLocations({\n ids: locationIds,\n status: filters.status,\n });\n }\n }, [locationIds]);\n\n useEffect(() => {\n const { theming, shadowRoot } = props.options;\n\n if (shadowRoot) {\n const style =\n shadowRoot.querySelectorAll(\"#road-map-styles\")[0] ||\n document.createElement(\"style\");\n style.setAttribute(\"type\", \"text/css\");\n style.setAttribute(\"id\", \"road-map-styles\");\n style.innerHTML = `\n :host {\n --roadmap-brand-color: ${theming?.brandColor || \"#6102d3\"};\n --roadmap-background-color: ${theming?.backgroundColor || \"#ffffff\"};\n --roadmap-text-color: ${theming?.textColor || \"#2a2a2a\"};\n --roadmap-border-color: ${theming?.borderColor || \"#dddddd\"};\n --roadmap-font-family: ${theming?.fontFamily || \"Inter\"};\n }\n `;\n shadowRoot.appendChild(style);\n }\n }, [props.options.theming]);\n\n // the map kind decides which endpoints to call, so nothing renders before\n // the remote config has said what kind of map this key is. v1 has no map key\n // and its config carries no context, so those embeds run as roaming maps.\n const isReady = Boolean(\n position &&\n options?.googleApiKey &&\n (mapContext || !atLeast(version, \"v2\")),\n );\n\n const providerValue = useMemo(() => {\n return {\n options,\n setPlace,\n place,\n t,\n language,\n fetchGeohashes,\n fetchAnalytics,\n searchBounds,\n setSearchBounds,\n mapKind,\n currency,\n locations,\n locationsStatus,\n filterConfiguration,\n setFilters,\n setLocationsIds,\n locationIds,\n filters,\n fetchTariffs,\n reportProblem,\n fetchLocations,\n isReady,\n position,\n isSearching,\n setIsSearching,\n };\n }, [\n position,\n language,\n locations,\n locationsStatus,\n fetchTariffs,\n reportProblem,\n props.options,\n place,\n setPlace,\n setFilters,\n filters,\n filterConfiguration,\n locationIds,\n setLocationsIds,\n t,\n fetchGeohashes,\n fetchAnalytics,\n searchBounds,\n mapKind,\n currency,\n fetchLocations,\n isReady,\n isSearching,\n ]);\n\n return (\n <MapContext.Provider value={providerValue}>{children}</MapContext.Provider>\n );\n};\n\nexport function useMapContext(): MapContextType {\n const context = React.useContext(MapContext);\n if (context === undefined) {\n throw new Error(\"useMapContext must be used within a MapProvider\");\n }\n return context;\n}\n","import React, { useRef, useContext } from \"react\";\nimport styles from \"./app.module.css\";\nimport useOnScreen from \"./hooks/useOnScreen\";\nimport { MapContext } from \"./contexts/Map\";\n\ninterface Props {\n children?: React.ReactNode;\n height?: number;\n}\n\nexport default function Boot(props: Props) {\n const { isReady } = useContext(MapContext);\n const ref = useRef(null);\n const isVisible = useOnScreen(ref);\n const loaded = isVisible && isReady;\n return (\n <div\n ref={ref}\n className={styles.container}\n style={{\n height: `${props.height}px`,\n }}\n >\n {!loaded && <div className={styles.loader}>Loading...</div>}\n {loaded && props.children}\n </div>\n );\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nvar fastDeepEqual = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n\nvar isEqual = /*@__PURE__*/getDefaultExportFromCjs(fastDeepEqual);\n\n/**\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at.\n *\n * Http://www.apache.org/licenses/LICENSE-2.0.\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_ID = \"__googleMapsScriptId\";\n/**\n * The status of the [[Loader]].\n */\nvar LoaderStatus;\n(function (LoaderStatus) {\n LoaderStatus[LoaderStatus[\"INITIALIZED\"] = 0] = \"INITIALIZED\";\n LoaderStatus[LoaderStatus[\"LOADING\"] = 1] = \"LOADING\";\n LoaderStatus[LoaderStatus[\"SUCCESS\"] = 2] = \"SUCCESS\";\n LoaderStatus[LoaderStatus[\"FAILURE\"] = 3] = \"FAILURE\";\n})(LoaderStatus || (LoaderStatus = {}));\n/**\n * [[Loader]] makes it easier to add Google Maps JavaScript API to your application\n * dynamically using\n * [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n * It works by dynamically creating and appending a script node to the the\n * document head and wrapping the callback function so as to return a promise.\n *\n * ```\n * const loader = new Loader({\n * apiKey: \"\",\n * version: \"weekly\",\n * libraries: [\"places\"]\n * });\n *\n * loader.load().then((google) => {\n * const map = new google.maps.Map(...)\n * })\n * ```\n */\nclass Loader {\n /**\n * Creates an instance of Loader using [[LoaderOptions]]. No defaults are set\n * using this library, instead the defaults are set by the Google Maps\n * JavaScript API server.\n *\n * ```\n * const loader = Loader({apiKey, version: 'weekly', libraries: ['places']});\n * ```\n */\n constructor({ apiKey, authReferrerPolicy, channel, client, id = DEFAULT_ID, language, libraries = [], mapIds, nonce, region, retries = 3, url = \"https://maps.googleapis.com/maps/api/js\", version, }) {\n this.callbacks = [];\n this.done = false;\n this.loading = false;\n this.errors = [];\n this.apiKey = apiKey;\n this.authReferrerPolicy = authReferrerPolicy;\n this.channel = channel;\n this.client = client;\n this.id = id || DEFAULT_ID; // Do not allow empty string\n this.language = language;\n this.libraries = libraries;\n this.mapIds = mapIds;\n this.nonce = nonce;\n this.region = region;\n this.retries = retries;\n this.url = url;\n this.version = version;\n if (Loader.instance) {\n if (!isEqual(this.options, Loader.instance.options)) {\n throw new Error(`Loader must not be called again with different options. ${JSON.stringify(this.options)} !== ${JSON.stringify(Loader.instance.options)}`);\n }\n return Loader.instance;\n }\n Loader.instance = this;\n }\n get options() {\n return {\n version: this.version,\n apiKey: this.apiKey,\n channel: this.channel,\n client: this.client,\n id: this.id,\n libraries: this.libraries,\n language: this.language,\n region: this.region,\n mapIds: this.mapIds,\n nonce: this.nonce,\n url: this.url,\n authReferrerPolicy: this.authReferrerPolicy,\n };\n }\n get status() {\n if (this.errors.length) {\n return LoaderStatus.FAILURE;\n }\n if (this.done) {\n return LoaderStatus.SUCCESS;\n }\n if (this.loading) {\n return LoaderStatus.LOADING;\n }\n return LoaderStatus.INITIALIZED;\n }\n get failed() {\n return this.done && !this.loading && this.errors.length >= this.retries + 1;\n }\n /**\n * CreateUrl returns the Google Maps JavaScript API script url given the [[LoaderOptions]].\n *\n * @ignore\n * @deprecated\n */\n createUrl() {\n let url = this.url;\n url += `?callback=__googleMapsCallback&loading=async`;\n if (this.apiKey) {\n url += `&key=${this.apiKey}`;\n }\n if (this.channel) {\n url += `&channel=${this.channel}`;\n }\n if (this.client) {\n url += `&client=${this.client}`;\n }\n if (this.libraries.length > 0) {\n url += `&libraries=${this.libraries.join(\",\")}`;\n }\n if (this.language) {\n url += `&language=${this.language}`;\n }\n if (this.region) {\n url += `&region=${this.region}`;\n }\n if (this.version) {\n url += `&v=${this.version}`;\n }\n if (this.mapIds) {\n url += `&map_ids=${this.mapIds.join(\",\")}`;\n }\n if (this.authReferrerPolicy) {\n url += `&auth_referrer_policy=${this.authReferrerPolicy}`;\n }\n return url;\n }\n deleteScript() {\n const script = document.getElementById(this.id);\n if (script) {\n script.remove();\n }\n }\n /**\n * Load the Google Maps JavaScript API script and return a Promise.\n * @deprecated, use importLibrary() instead.\n */\n load() {\n return this.loadPromise();\n }\n /**\n * Load the Google Maps JavaScript API script and return a Promise.\n *\n * @ignore\n * @deprecated, use importLibrary() instead.\n */\n loadPromise() {\n return new Promise((resolve, reject) => {\n this.loadCallback((err) => {\n if (!err) {\n resolve(window.google);\n }\n else {\n reject(err.error);\n }\n });\n });\n }\n importLibrary(name) {\n this.execute();\n return google.maps.importLibrary(name);\n }\n /**\n * Load the Google Maps JavaScript API script with a callback.\n * @deprecated, use importLibrary() instead.\n */\n loadCallback(fn) {\n this.callbacks.push(fn);\n this.execute();\n }\n /**\n * Set the script on document.\n */\n setScript() {\n var _a, _b;\n if (document.getElementById(this.id)) {\n // TODO wrap onerror callback for cases where the script was loaded elsewhere\n this.callback();\n return;\n }\n const params = {\n key: this.apiKey,\n channel: this.channel,\n client: this.client,\n libraries: this.libraries.length && this.libraries,\n v: this.version,\n mapIds: this.mapIds,\n language: this.language,\n region: this.region,\n authReferrerPolicy: this.authReferrerPolicy,\n };\n // keep the URL minimal:\n Object.keys(params).forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (key) => !params[key] && delete params[key]);\n if (!((_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.importLibrary)) {\n // tweaked copy of https://developers.google.com/maps/documentation/javascript/load-maps-js-api#dynamic-library-import\n // which also sets the base url, the id, and the nonce\n /* eslint-disable */\n ((g) => {\n // @ts-ignore\n let h, a, k, p = \"The Google Maps JavaScript API\", c = \"google\", l = \"importLibrary\", q = \"__ib__\", m = document, b = window;\n // @ts-ignore\n b = b[c] || (b[c] = {});\n // @ts-ignore\n const d = b.maps || (b.maps = {}), r = new Set(), e = new URLSearchParams(), u = () => \n // @ts-ignore\n h || (h = new Promise((f, n) => __awaiter(this, void 0, void 0, function* () {\n var _a;\n yield (a = m.createElement(\"script\"));\n a.id = this.id;\n e.set(\"libraries\", [...r] + \"\");\n // @ts-ignore\n for (k in g)\n e.set(k.replace(/[A-Z]/g, (t) => \"_\" + t[0].toLowerCase()), g[k]);\n e.set(\"callback\", c + \".maps.\" + q);\n a.src = this.url + `?` + e;\n d[q] = f;\n a.onerror = () => (h = n(Error(p + \" could not load.\")));\n // @ts-ignore\n a.nonce = this.nonce || ((_a = m.querySelector(\"script[nonce]\")) === null || _a === void 0 ? void 0 : _a.nonce) || \"\";\n m.head.append(a);\n })));\n // @ts-ignore\n d[l] ? console.warn(p + \" only loads once. Ignoring:\", g) : (d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)));\n })(params);\n /* eslint-enable */\n }\n // While most libraries populate the global namespace when loaded via bootstrap params,\n // this is not the case for \"marker\" when used with the inline bootstrap loader\n // (and maybe others in the future). So ensure there is an importLibrary for each:\n const libraryPromises = this.libraries.map((library) => this.importLibrary(library));\n // ensure at least one library, to kick off loading...\n if (!libraryPromises.length) {\n libraryPromises.push(this.importLibrary(\"core\"));\n }\n Promise.all(libraryPromises).then(() => this.callback(), (error) => {\n const event = new ErrorEvent(\"error\", { error }); // for backwards compat\n this.loadErrorCallback(event);\n });\n }\n /**\n * Reset the loader state.\n */\n reset() {\n this.deleteScript();\n this.done = false;\n this.loading = false;\n this.errors = [];\n this.onerrorEvent = null;\n }\n resetIfRetryingFailed() {\n if (this.failed) {\n this.reset();\n }\n }\n loadErrorCallback(e) {\n this.errors.push(e);\n if (this.errors.length <= this.retries) {\n const delay = this.errors.length * Math.pow(2, this.errors.length);\n console.error(`Failed to load Google Maps script, retrying in ${delay} ms.`);\n setTimeout(() => {\n this.deleteScript();\n this.setScript();\n }, delay);\n }\n else {\n this.onerrorEvent = e;\n this.callback();\n }\n }\n callback() {\n this.done = true;\n this.loading = false;\n this.callbacks.forEach((cb) => {\n cb(this.onerrorEvent);\n });\n this.callbacks = [];\n }\n execute() {\n this.resetIfRetryingFailed();\n if (this.done) {\n this.callback();\n }\n else {\n // short circuit and warn if google.maps is already loaded\n if (window.google && window.google.maps && window.google.maps.version) {\n console.warn(\"Google Maps already loaded outside @googlemaps/js-api-loader.\" +\n \"This may result in undesirable behavior as options and script parameters may not match.\");\n this.callback();\n return;\n }\n if (this.loading) ;\n else {\n this.loading = true;\n this.setScript();\n }\n }\n }\n}\n\nexport { DEFAULT_ID, Loader, LoaderStatus };\n//# sourceMappingURL=index.mjs.map\n","import { Loader } from \"@googlemaps/js-api-loader\";\n\nlet instance;\nexport function getLoader(apiKey, language): Loader {\n if (instance) return instance;\n\n const loader = new Loader({\n apiKey: apiKey, // Replace with your Google Maps API key\n version: \"weekly\",\n language,\n });\n instance = loader;\n return loader;\n}\n","/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\n/* Geohash encoding/decoding and associated functions (c) Chris Veness 2014-2019 / MIT Licence */\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\n\nconst base32 = '0123456789bcdefghjkmnpqrstuvwxyz'; // (geohash-specific) Base32 map\n\n\n/**\n * Geohash: Gustavo Niemeyer’s geocoding system.\n */\nclass Geohash {\n\n /**\n * Encodes latitude/longitude to geohash, either to specified precision or to automatically\n * evaluated precision.\n *\n * @param {number} lat - Latitude in degrees.\n * @param {number} lon - Longitude in degrees.\n * @param {number} [precision] - Number of characters in resulting geohash.\n * @returns {string} Geohash of supplied latitude/longitude.\n * @throws Invalid geohash.\n *\n * @example\n * const geohash = Geohash.encode(52.205, 0.119, 7); // => 'u120fxw'\n */\n static encode(lat, lon, precision) {\n // infer precision?\n if (typeof precision == 'undefined') {\n // refine geohash until it matches precision of supplied lat/lon\n for (let p=1; p<=12; p++) {\n const hash = Geohash.encode(lat, lon, p);\n const posn = Geohash.decode(hash);\n if (posn.lat==lat && posn.lon==lon) return hash;\n }\n precision = 12; // set to maximum\n }\n\n lat = Number(lat);\n lon = Number(lon);\n precision = Number(precision);\n\n if (isNaN(lat) || isNaN(lon) || isNaN(precision)) throw new Error('Invalid geohash');\n\n let idx = 0; // index into base32 map\n let bit = 0; // each char holds 5 bits\n let evenBit = true;\n let geohash = '';\n\n let latMin = -90, latMax = 90;\n let lonMin = -180, lonMax = 180;\n\n while (geohash.length < precision) {\n if (evenBit) {\n // bisect E-W longitude\n const lonMid = (lonMin + lonMax) / 2;\n if (lon >= lonMid) {\n idx = idx*2 + 1;\n lonMin = lonMid;\n } else {\n idx = idx*2;\n lonMax = lonMid;\n }\n } else {\n // bisect N-S latitude\n const latMid = (latMin + latMax) / 2;\n if (lat >= latMid) {\n idx = idx*2 + 1;\n latMin = latMid;\n } else {\n idx = idx*2;\n latMax = latMid;\n }\n }\n evenBit = !evenBit;\n\n if (++bit == 5) {\n // 5 bits gives us a character: append it and start over\n geohash += base32.charAt(idx);\n bit = 0;\n idx = 0;\n }\n }\n\n return geohash;\n }\n\n\n /**\n * Decode geohash to latitude/longitude (location is approximate centre of geohash cell,\n * to reasonable precision).\n *\n * @param {string} geohash - Geohash string to be converted to latitude/longitude.\n * @returns {{lat:number, lon:number}} (Center of) geohashed location.\n * @throws Invalid geohash.\n *\n * @example\n * const latlon = Geohash.decode('u120fxw'); // => { lat: 52.205, lon: 0.1188 }\n */\n static decode(geohash) {\n\n const bounds = Geohash.bounds(geohash); // <-- the hard work\n // now just determine the centre of the cell...\n\n const latMin = bounds.sw.lat, lonMin = bounds.sw.lon;\n const latMax = bounds.ne.lat, lonMax = bounds.ne.lon;\n\n // cell centre\n let lat = (latMin + latMax)/2;\n let lon = (lonMin + lonMax)/2;\n\n // round to close to centre without excessive precision: ⌊2-log10(Δ°)⌋ decimal places\n lat = lat.toFixed(Math.floor(2-Math.log(latMax-latMin)/Math.LN10));\n lon = lon.toFixed(Math.floor(2-Math.log(lonMax-lonMin)/Math.LN10));\n\n return { lat: Number(lat), lon: Number(lon) };\n }\n\n\n /**\n * Returns SW/NE latitude/longitude bounds of specified geohash.\n *\n * @param {string} geohash - Cell that bounds are required of.\n * @returns {{sw: {lat: number, lon: number}, ne: {lat: number, lon: number}}}\n * @throws Invalid geohash.\n */\n static bounds(geohash) {\n if (geohash.length == 0) throw new Error('Invalid geohash');\n\n geohash = geohash.toLowerCase();\n\n let evenBit = true;\n let latMin = -90, latMax = 90;\n let lonMin = -180, lonMax = 180;\n\n for (let i=0; i<geohash.length; i++) {\n const chr = geohash.charAt(i);\n const idx = base32.indexOf(chr);\n if (idx == -1) throw new Error('Invalid geohash');\n\n for (let n=4; n>=0; n--) {\n const bitN = idx >> n & 1;\n if (evenBit) {\n // longitude\n const lonMid = (lonMin+lonMax) / 2;\n if (bitN == 1) {\n lonMin = lonMid;\n } else {\n lonMax = lonMid;\n }\n } else {\n // latitude\n const latMid = (latMin+latMax) / 2;\n if (bitN == 1) {\n latMin = latMid;\n } else {\n latMax = latMid;\n }\n }\n evenBit = !evenBit;\n }\n }\n\n const bounds = {\n sw: { lat: latMin, lon: lonMin },\n ne: { lat: latMax, lon: lonMax },\n };\n\n return bounds;\n }\n\n\n /**\n * Determines adjacent cell in given direction.\n *\n * @param geohash - Cell to which adjacent cell is required.\n * @param direction - Direction from geohash (N/S/E/W).\n * @returns {string} Geocode of adjacent cell.\n * @throws Invalid geohash.\n */\n static adjacent(geohash, direction) {\n // based on github.com/davetroy/geohash-js\n\n geohash = geohash.toLowerCase();\n direction = direction.toLowerCase();\n\n if (geohash.length == 0) throw new Error('Invalid geohash');\n if ('nsew'.indexOf(direction) == -1) throw new Error('Invalid direction');\n\n const neighbour = {\n n: [ 'p0r21436x8zb9dcf5h7kjnmqesgutwvy', 'bc01fg45238967deuvhjyznpkmstqrwx' ],\n s: [ '14365h7k9dcfesgujnmqp0r2twvyx8zb', '238967debc01fg45kmstqrwxuvhjyznp' ],\n e: [ 'bc01fg45238967deuvhjyznpkmstqrwx', 'p0r21436x8zb9dcf5h7kjnmqesgutwvy' ],\n w: [ '238967debc01fg45kmstqrwxuvhjyznp', '14365h7k9dcfesgujnmqp0r2twvyx8zb' ],\n };\n const border = {\n n: [ 'prxz', 'bcfguvyz' ],\n s: [ '028b', '0145hjnp' ],\n e: [ 'bcfguvyz', 'prxz' ],\n w: [ '0145hjnp', '028b' ],\n };\n\n const lastCh = geohash.slice(-1); // last character of hash\n let parent = geohash.slice(0, -1); // hash without last character\n\n const type = geohash.length % 2;\n\n // check for edge-cases which don't share common prefix\n if (border[direction][type].indexOf(lastCh) != -1 && parent != '') {\n parent = Geohash.adjacent(parent, direction);\n }\n\n // append letter for direction to parent\n return parent + base32.charAt(neighbour[direction][type].indexOf(lastCh));\n }\n\n\n /**\n * Returns all 8 adjacent cells to specified geohash.\n *\n * @param {string} geohash - Geohash neighbours are required of.\n * @returns {{n,ne,e,se,s,sw,w,nw: string}}\n * @throws Invalid geohash.\n */\n static neighbours(geohash) {\n return {\n 'n': Geohash.adjacent(geohash, 'n'),\n 'ne': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'e'),\n 'e': Geohash.adjacent(geohash, 'e'),\n 'se': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'e'),\n 's': Geohash.adjacent(geohash, 's'),\n 'sw': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'w'),\n 'w': Geohash.adjacent(geohash, 'w'),\n 'nw': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'w'),\n };\n }\n\n}\n\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\n\nexport default Geohash;\n","import { PropsWithChildren, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function createOverlay(\n container: HTMLElement,\n pane: keyof google.maps.MapPanes,\n position: google.maps.LatLng | google.maps.LatLngLiteral\n) {\n class Overlay extends google.maps.OverlayView {\n container: HTMLElement;\n pane: keyof google.maps.MapPanes;\n position: google.maps.LatLng | google.maps.LatLngLiteral;\n\n constructor(\n container: HTMLElement,\n pane: keyof google.maps.MapPanes,\n position: google.maps.LatLng | google.maps.LatLngLiteral\n ) {\n super();\n this.container = container;\n this.pane = pane;\n this.position = position;\n }\n\n onAdd(): void {\n const pane = this.getPanes()?.[this.pane];\n pane?.appendChild(this.container);\n }\n\n draw(): void {\n const projection = this.getProjection();\n const point = projection.fromLatLngToDivPixel(this.position);\n\n if (point === null) {\n return;\n }\n\n this.container.style.transform = `translate(${point.x}px, ${point.y}px)`;\n }\n\n onRemove(): void {\n if (this.container.parentNode !== null) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n }\n return new Overlay(container, pane, position);\n}\n\ntype OverlayProps = PropsWithChildren<{\n position: {\n lat: number;\n lon: number;\n };\n pane?: keyof google.maps.MapPanes;\n map: google.maps.Map;\n zIndex?: number;\n}>;\n\nexport default function OverlayView({\n position,\n pane = \"floatPane\",\n map,\n zIndex,\n children,\n}: OverlayProps) {\n const container = useMemo(() => {\n const div = document.createElement(\"div\");\n div.style.position = \"absolute\";\n return div;\n }, []);\n\n const overlay = useMemo(() => {\n return createOverlay(container, pane, {\n lat: position.lat,\n lng: position.lon,\n });\n }, [container, pane, position]);\n\n useEffect(() => {\n overlay?.setMap(map);\n return () => {\n overlay?.setMap(null);\n };\n }, [map, overlay]);\n\n useEffect(() => {\n container.style.zIndex = `${zIndex}`;\n }, [zIndex, container]);\n\n return createPortal(children, container);\n}\n\n","import React, { useCallback, useMemo } from \"react\";\nimport { GeohashItem, MapKind } from \"../../types\";\nimport OverlayView from \"../OverlayView/OverlayView\";\nimport { pickMarkerColor } from \"../../utils/status\";\nimport styles from \"./CustomMarker.module.css\";\n\nconst formatter = new Intl.NumberFormat(undefined, {\n maximumSignificantDigits: 3,\n});\n\nconst formatNumber = (num: number) => {\n return formatter.format(num);\n};\n\ninterface Props {\n data: GeohashItem;\n map?: google.maps.Map;\n onClick: (payload: GeohashItem) => void;\n highlight?: boolean;\n kind?: MapKind;\n}\n\nconst CustomMarker: React.FC<Props> = ({\n data,\n map,\n onClick,\n highlight,\n kind = \"roaming\",\n}) => {\n const handleClick = useCallback(() => {\n onClick(data);\n }, [onClick, data]);\n\n // statuses carry roaming EVSE names on roaming maps and connector OCPP names\n // on CPO maps; the kind picks the colour priority\n const styleColor = useMemo(\n () => ({ background: pickMarkerColor(data.statuses, kind) }),\n [data, kind],\n );\n\n return (\n <OverlayView position={data.centroid} map={map} zIndex={highlight ? 99 : 0}>\n <button\n className={styles.container}\n onClick={handleClick}\n style={styleColor}\n // seems to be useful for ios safari\n onTouchEndCapture={handleClick}\n >\n {data.count > 1 ? formatNumber(data.count) : \"\"}\n </button>\n </OverlayView>\n );\n};\n\nexport default CustomMarker;\n","import { EnergyPrice } from \"../types\";\n\n// usable reports whether the API gave a price the widget can show or filter on.\nexport function usablePrice(price?: EnergyPrice): price is EnergyPrice {\n return Boolean(\n price &&\n typeof price.amount === \"number\" &&\n Number.isFinite(price.amount) &&\n price.currency,\n );\n}\n\nconst formatters = new Map<string, Intl.NumberFormat>();\n\nfunction formatter(language: string, currency: string): Intl.NumberFormat {\n const key = `${language}:${currency}`;\n let format = formatters.get(key);\n if (!format) {\n format = new Intl.NumberFormat(language, {\n style: \"currency\",\n currency,\n currencyDisplay: \"narrowSymbol\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n formatters.set(key, format);\n }\n return format;\n}\n\n// formatEnergyPrice renders a price per kWh the way the pin capsule and the\n// filter show it: narrow symbol, two decimals, in the widget language.\nexport function formatEnergyPrice(\n language: string,\n price?: EnergyPrice,\n): string | undefined {\n if (!usablePrice(price)) return undefined;\n try {\n return formatter(language, price.currency).format(price.amount);\n } catch {\n // an unknown currency code: fall back to the bare code\n return `${price.amount.toFixed(2)} ${price.currency}`;\n }\n}\n\n// Currencies whose prices per kWh sit well above one unit take a coarser\n// ladder; everything else uses the euro-like steps.\nconst tickScale: Record<string, number> = {\n SEK: 10,\n NOK: 10,\n DKK: 10,\n CZK: 25,\n PLN: 4,\n HUF: 400,\n ISK: 150,\n};\n\nconst baseTicks = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];\n\nexport type PriceTick = {\n // the limit to send, undefined for \"no limit\"\n value: number | undefined;\n label: string;\n};\n\n// priceTicks lays out the steps of the max-price slider for a currency, ending\n// with the \"any price\" step that lifts the limit.\nexport function priceTicks(\n language: string,\n currency: string,\n anyLabel: string,\n): PriceTick[] {\n const scale = tickScale[currency.toUpperCase()] || 1;\n const decimals = scale >= 10 ? 0 : 2;\n const format = new Intl.NumberFormat(language, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n return [\n ...baseTicks.map((tick) => {\n const value = Math.round(tick * scale * 100) / 100;\n return { value, label: format.format(value) };\n }),\n { value: undefined, label: anyLabel },\n ];\n}\n","import { EnergyPrice, GeohashItem, MapKind } from \"../types\";\nimport { usablePrice } from \"./price\";\nimport {\n inSessionStatuses,\n modernPalette,\n normaliseStatus,\n Palette,\n} from \"./status\";\n\n// A v3 pin reads a bucket's statuses as charging units (EVSEs on roaming maps,\n// connectors on CPO maps) and turns them into one tone, one glyph and a\n// free/total pair. Colour carries availability only; the glyph repeats the\n// state so it survives greyscale.\n\nexport type PinTone =\n | \"available\"\n | \"inUse\"\n | \"offline\"\n | \"fault\"\n | \"planned\"\n | \"unknown\";\n\nexport type PinGlyph = \"bolt\" | \"ratio\" | \"dash\" | \"plus\" | \"alert\";\n\nexport type PinColours = {\n ring: string;\n text: string;\n};\n\nexport type PinSlice = {\n tone: PinTone;\n ring: string;\n fraction: number;\n};\n\nexport type PinState = {\n tone: PinTone;\n colours: PinColours;\n glyph: PinGlyph;\n free: number;\n total: number;\n // every tone present with its share of the units, in display order; a single\n // entry when the bucket is uniform\n split: PinSlice[];\n};\n\nexport type UnitCounts = {\n free: number;\n busy: number;\n fault: number;\n planned: number;\n unknown: number;\n offline: number;\n total: number;\n};\n\ntype UnitKind = keyof Omit<UnitCounts, \"total\">;\n\nfunction unitKind(name: string): UnitKind {\n if (name === \"AVAILABLE\") return \"free\";\n if (inSessionStatuses.has(name) || name === \"RESERVED\") return \"busy\";\n if (name === \"FAULTED\") return \"fault\";\n if (name === \"PLANNED\") return \"planned\";\n if (name === \"UNKNOWN\") return \"unknown\";\n return \"offline\";\n}\n\nexport function countUnits(\n statuses: Array<{ name: string; count: number }> = [],\n): UnitCounts {\n const counts: UnitCounts = {\n free: 0,\n busy: 0,\n fault: 0,\n planned: 0,\n unknown: 0,\n offline: 0,\n total: 0,\n };\n for (const status of statuses) {\n const count = Math.max(0, status.count || 0);\n counts[unitKind(normaliseStatus(status.name))] += count;\n counts.total += count;\n }\n return counts;\n}\n\n// A CPO pin tells an operator what is wrong first: a fault, then a connector\n// taken out of service, then sessions, then free connectors.\nfunction cpoTone(counts: UnitCounts): PinTone {\n if (counts.fault > 0) return \"fault\";\n if (counts.offline > 0) return \"offline\";\n if (counts.busy > 0) return \"inUse\";\n if (counts.free > 0) return \"available\";\n return \"unknown\";\n}\n\n// A roaming pin follows the design: a single location reads \"in use\" as soon\n// as a session is on it, with the free count in the glyph, while a cluster\n// reads green as soon as anything inside it is free.\nfunction roamingTone(counts: UnitCounts, cluster: boolean): PinTone {\n if (counts.fault > 0) return \"fault\";\n if (cluster && counts.free > 0) return \"available\";\n if (counts.busy > 0) return \"inUse\";\n if (counts.free > 0) return \"available\";\n if (counts.total === 0) return \"unknown\";\n if (counts.planned === counts.total) return \"planned\";\n if (counts.unknown === counts.total) return \"unknown\";\n return \"offline\";\n}\n\nexport function pinTone(\n counts: UnitCounts,\n kind: MapKind,\n cluster: boolean,\n): PinTone {\n if (counts.total === 0) return \"unknown\";\n return kind === \"cpo\" ? cpoTone(counts) : roamingTone(counts, cluster);\n}\n\n// The glyph never hides a free unit: a fault or an outage only gets its own\n// mark when nothing is left to charge on, otherwise the free count shows.\nexport function pinGlyph(counts: UnitCounts, tone: PinTone): PinGlyph {\n if (counts.free > 0) {\n return counts.free === counts.total ? \"bolt\" : \"ratio\";\n }\n if (tone === \"fault\") return \"alert\";\n if (tone === \"planned\") return \"plus\";\n if (counts.busy > 0) return \"ratio\";\n return \"dash\";\n}\n\nconst ringByTone: Record<MapKind, Record<PinTone, keyof Palette>> = {\n roaming: {\n available: \"green\",\n inUse: \"amber\",\n offline: \"grey\",\n fault: \"red\",\n planned: \"grey\",\n unknown: \"grey\",\n },\n // a CPO map keeps blue for sessions so amber stays \"taken out of service\"\n cpo: {\n available: \"green\",\n inUse: \"blue\",\n offline: \"amber\",\n fault: \"red\",\n planned: \"grey\",\n unknown: \"grey\",\n },\n};\n\n// darker companions of the palette for digits drawn on a white body\nconst textByColour: Record<keyof Palette, string> = {\n green: \"#006025\",\n amber: \"#a16100\",\n blue: \"#2b57a8\",\n red: \"#a20519\",\n grey: \"#6d7277\",\n};\n\nexport function pinColours(tone: PinTone, kind: MapKind): PinColours {\n const key = ringByTone[kind][tone];\n return { ring: modernPalette[key], text: textByColour[key] };\n}\n\n// the order slices are drawn round a mixed cluster's ring\nconst sliceOrder: Array<[UnitKind, PinTone]> = [\n [\"free\", \"available\"],\n [\"busy\", \"inUse\"],\n [\"fault\", \"fault\"],\n [\"offline\", \"offline\"],\n [\"planned\", \"planned\"],\n [\"unknown\", \"unknown\"],\n];\n\nexport function pinSplit(counts: UnitCounts, kind: MapKind): PinSlice[] {\n if (counts.total === 0) return [];\n return sliceOrder\n .filter(([unit]) => counts[unit] > 0)\n .map(([unit, tone]) => ({\n tone,\n ring: pinColours(tone, kind).ring,\n fraction: counts[unit] / counts.total,\n }));\n}\n\nexport function describePin(\n statuses: Array<{ name: string; count: number }> | undefined,\n kind: MapKind = \"roaming\",\n cluster = false,\n): PinState {\n const counts = countUnits(statuses);\n const tone = pinTone(counts, kind, cluster);\n return {\n tone,\n colours: pinColours(tone, kind),\n glyph: pinGlyph(counts, tone),\n free: counts.free,\n total: counts.total,\n split: pinSplit(counts, kind),\n };\n}\n\n// isCluster reports whether a bucket stands for more than one location. The\n// index can hold one location several times, once per connection that carries\n// it, and such a bucket counts two with the same id twice; that is still one\n// pin, not a cluster.\nexport function isCluster(data: Pick<GeohashItem, \"count\" | \"ids\">): boolean {\n if (data.count <= 1) return false;\n const ids = data.ids || [];\n return ids.length === 0 || new Set(ids).size > 1;\n}\n\n// pinPrice returns the price a bucket's pin shows in its tag, or undefined\n// when the tag reads as unknown: a cluster, no price, or a price of zero. A\n// zero means the tariff charges by time or session rather than energy, and a\n// pin saying it is free would mislead.\nexport function pinPrice(data: GeohashItem): EnergyPrice | undefined {\n if (isCluster(data)) return undefined;\n if (!usablePrice(data.energyPrice) || data.energyPrice.amount <= 0) {\n return undefined;\n }\n return data.energyPrice;\n}\n","import React, { CSSProperties, useCallback, useMemo } from \"react\";\nimport { GeohashItem, MapKind } from \"../../types\";\nimport OverlayView from \"../OverlayView/OverlayView\";\nimport {\n describePin,\n isCluster,\n PinSlice,\n PinState,\n} from \"../../utils/pinState\";\n\n// Pin is the v3 marker: a white teardrop hanging from its tail tip with the\n// availability in a coloured ring and a glyph (bolt, free/total, dash, plus,\n// alert). Whenever the glyph shows, a single location also carries a price\n// tag under the tip: white digits on a dark tag, or an ellipsis when the price\n// per kWh is not known, the pin above it unchanged. Colour carries\n// availability only; the price is always type, never hue. Small clusters stack two ghost pins behind a count; larger ones are a\n// circle, ringed by the availability split when it is mixed. Styling lives in\n// a stylesheet the markers' parent renders once, so it reaches the page\n// whether or not the published stylesheet has caught up.\n\nconst formatter = new Intl.NumberFormat(undefined, {\n maximumSignificantDigits: 3,\n});\n\n// The tail tip of a square rotated 45 degrees sits sqrt(2)/2 of the side\n// below the square's centre.\nconst TAIL = Math.SQRT1_2;\n\nconst SINGLE = 40;\nconst SELECTED = 52;\nconst COMPACT = 26;\nconst CIRCLE = 48;\nconst CIRCLE_SELECTED = 56;\n// clusters up to this many locations are drawn as stacked pins\nconst STACK_MAX = 9;\n// the price tag hangs this far under the tail tip\nconst TAG_GAP = 4;\n// what the tag says when the price per kWh is not known\nconst UNKNOWN_PRICE = \"\\u2026\";\n\nconst INK = \"#2a2e33\";\nconst MUTED = \"#6d7277\";\n// the price tag, from the design: near-white digits on dark grey\nconst TAG_INK = \"#fdfcf9\";\nconst TAG_BACKGROUND = \"#383c43\";\nconst SHADOW = \"rgba(23, 27, 31, 0.22)\";\nconst SHADOW_SOFT = \"rgba(23, 27, 31, 0.14)\";\nconst SHADOW_DEEP = \"rgba(23, 27, 31, 0.3)\";\n\nexport const pinStylesheet = `\n.roadmap-pin {\n position: absolute;\n left: 0;\n top: 0;\n display: block;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n -webkit-appearance: none;\n appearance: none;\n cursor: pointer;\n font-family: var(--roadmap-font-family, Inter), system-ui, -apple-system, sans-serif;\n animation: roadmap-pin-in 0.18s ease-out both;\n}\n.roadmap-pin:focus-visible {\n outline: none;\n}\n.roadmap-pin-body {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n border-radius: 50% 50% 50% 0;\n border: 3px solid currentColor;\n background: #fff;\n transform: rotate(-45deg);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.12s ease, box-shadow 0.12s ease;\n}\n.roadmap-pin:hover .roadmap-pin-body {\n transform: rotate(-45deg) scale(1.06);\n}\n.roadmap-pin-ghost {\n position: absolute;\n box-sizing: border-box;\n border-radius: 50% 50% 50% 0;\n border: 2px solid;\n transform: rotate(-45deg);\n}\n.roadmap-pin-glyph {\n display: flex;\n align-items: center;\n justify-content: center;\n transform: rotate(45deg);\n line-height: 1;\n white-space: nowrap;\n font-family: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-weight: 500;\n}\n.roadmap-pin-circle,\n.roadmap-pin-ring {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n border-radius: 50%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n line-height: 1;\n transition: transform 0.12s ease;\n}\n.roadmap-pin-circle {\n background: #fff;\n border: 3px solid currentColor;\n}\n.roadmap-pin:hover .roadmap-pin-circle,\n.roadmap-pin:hover .roadmap-pin-ring {\n transform: scale(1.06);\n}\n.roadmap-pin-ring-inner {\n width: calc(100% - 12px);\n height: calc(100% - 12px);\n border-radius: 50%;\n background: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.roadmap-pin-count {\n font-family: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-weight: 500;\n line-height: 1;\n}\n.roadmap-pin-label {\n margin-top: 2px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n line-height: 1;\n}\n.roadmap-pin-tag {\n position: absolute;\n transform: translateX(-50%);\n box-sizing: border-box;\n padding: 2px 6px;\n border-radius: 4px;\n background: ${TAG_BACKGROUND};\n color: ${TAG_INK};\n font-family: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 500;\n line-height: 13px;\n white-space: nowrap;\n pointer-events: none;\n}\n@keyframes roadmap-pin-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: none; }\n}\n`;\n\n// PinStyles renders the pin stylesheet; the markers' parent mounts it once.\nexport function PinStyles() {\n return <style>{pinStylesheet}</style>;\n}\n\nfunction withAlpha(hex: string, alpha: number): string {\n const value = hex.replace(\"#\", \"\");\n const r = parseInt(value.slice(0, 2), 16);\n const g = parseInt(value.slice(2, 4), 16);\n const b = parseInt(value.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n// tailAnchored places a size-square root so its rotated tail tip sits on the\n// geo point.\nfunction tailAnchored(size: number): CSSProperties {\n return {\n width: size,\n height: size,\n left: -size / 2,\n top: -(size / 2 + size * TAIL),\n };\n}\n\nfunction centred(size: number): CSSProperties {\n return { width: size, height: size, left: -size / 2, top: -size / 2 };\n}\n\nfunction conicGradient(split: PinSlice[]): string {\n let at = 0;\n const stops = split.map((slice) => {\n const from = at;\n at += slice.fraction * 100;\n return `${slice.ring} ${from.toFixed(2)}% ${at.toFixed(2)}%`;\n });\n return `conic-gradient(${stops.join(\", \")})`;\n}\n\nfunction Bolt({ scale, fill }: { scale: number; fill: string }) {\n return (\n <svg\n width={12 * scale}\n height={18 * scale}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n <polygon points=\"58,0 18,56 44,56 38,100 84,40 52,40\" fill={fill} />\n </svg>\n );\n}\n\nfunction ratioFontSize(state: PinState, scale: number): number {\n const digits = String(state.free).length + String(state.total).length;\n if (digits <= 2) return 13 * scale;\n if (digits === 3) return 11 * scale;\n return 9.5 * scale;\n}\n\nfunction Glyph({ state, scale }: { state: PinState; scale: number }) {\n const { ring, text } = state.colours;\n switch (state.glyph) {\n case \"bolt\":\n return <Bolt scale={scale} fill={ring} />;\n case \"ratio\":\n return (\n <span style={{ fontSize: ratioFontSize(state, scale), color: text }}>\n {state.free}/{state.total}\n </span>\n );\n case \"dash\":\n return (\n <span\n style={{\n display: \"block\",\n width: 16 * scale,\n height: 2 * scale,\n borderRadius: 2,\n background: text,\n }}\n />\n );\n case \"plus\":\n return <span style={{ fontSize: 14 * scale, color: text }}>+</span>;\n case \"alert\":\n return (\n <span style={{ fontSize: 15 * scale, fontWeight: 700, color: ring }}>\n !\n </span>\n );\n }\n}\n\ntype BodyProps = {\n state: PinState;\n selected?: boolean;\n onClick: () => void;\n label: string;\n};\n\n// bodyStyle is the teardrop itself: muted tones recede, a planned pin is an\n// outline, a selected pin gets a halo.\nfunction bodyStyle(state: PinState, selected: boolean, compact = false) {\n const ring = state.colours.ring;\n const muted = state.tone === \"offline\" || state.tone === \"unknown\";\n const planned = state.tone === \"planned\";\n const style: CSSProperties = {\n borderWidth: compact ? 2.5 : 3,\n borderStyle: planned ? \"dashed\" : \"solid\",\n background: planned ? \"#fcfcf9\" : muted ? \"#f0f2f4\" : \"#fff\",\n boxShadow: planned\n ? \"none\"\n : selected\n ? `0 6px 16px ${SHADOW_DEEP}, 0 0 0 4px ${withAlpha(ring, 0.18)}`\n : muted\n ? `0 2px 5px ${SHADOW_SOFT}`\n : `0 3px 8px ${SHADOW}`,\n };\n return { style, muted };\n}\n\n// SinglePin is one location. Unless compact it hangs the tag under the tail\n// tip, which sits at the bottom edge of the pin's root, so the tag never moves\n// when the pin grows on selection.\nfunction SinglePin({\n state,\n selected = false,\n compact = false,\n tag,\n onClick,\n label,\n}: BodyProps & { compact?: boolean; tag?: string }) {\n const size = compact ? COMPACT : selected ? SELECTED : SINGLE;\n const { style, muted } = bodyStyle(state, selected, compact);\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={{\n ...tailAnchored(size),\n color: state.colours.ring,\n opacity: muted ? 0.85 : 1,\n }}\n onClick={onClick}\n // seems to be useful for ios safari\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span className=\"roadmap-pin-body\" style={style}>\n {!compact && (\n <span className=\"roadmap-pin-glyph\">\n <Glyph state={state} scale={size / SINGLE} />\n </span>\n )}\n </span>\n {tag && !compact && (\n <span\n className=\"roadmap-pin-tag\"\n style={{\n left: size / 2,\n top: size / 2 + size * TAIL + TAG_GAP,\n // an unknown price recedes so the known ones stand out\n opacity: tag === UNKNOWN_PRICE ? 0.5 : 1,\n }}\n >\n {tag}\n </span>\n )}\n </button>\n );\n}\n\nfunction StackedPin({\n state,\n count,\n selected = false,\n onClick,\n label,\n}: BodyProps & { count: number }) {\n const size = selected ? SELECTED : SINGLE;\n const scale = size / SINGLE;\n const ring = state.colours.ring;\n const { style } = bodyStyle(state, selected);\n // two ghost pins peek out behind the front one, up and to the left\n const ghost = (step: number, fill: number, edge: number): CSSProperties => ({\n left: -4 * step,\n top: -4 * step,\n width: size - 2 * step,\n height: size - 2 * step,\n background: withAlpha(ring, fill),\n borderColor: withAlpha(ring, edge),\n });\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={{ ...tailAnchored(size), color: ring }}\n onClick={onClick}\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span className=\"roadmap-pin-ghost\" style={ghost(2, 0.05, 0.3)} />\n <span className=\"roadmap-pin-ghost\" style={ghost(1, 0.08, 0.45)} />\n <span className=\"roadmap-pin-body\" style={style}>\n <span\n className=\"roadmap-pin-glyph\"\n style={{ fontSize: 14 * scale, color: state.colours.text }}\n >\n {formatter.format(count)}\n </span>\n </span>\n </button>\n );\n}\n\nfunction ClusterCircle({\n state,\n count,\n selected = false,\n onClick,\n label,\n sitesLabel,\n}: BodyProps & { count: number; sitesLabel: string }) {\n const size = selected ? CIRCLE_SELECTED : CIRCLE;\n const ring = state.colours.ring;\n const text = formatter.format(count);\n const halo = `0 0 0 ${selected ? 8 : 6}px ${withAlpha(ring, 0.14)}`;\n\n if (state.split.length > 1) {\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={centred(size)}\n onClick={onClick}\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span\n className=\"roadmap-pin-ring\"\n style={{\n background: conicGradient(state.split),\n boxShadow: selected\n ? `0 4px 12px ${SHADOW_DEEP}, ${halo}`\n : `0 3px 8px ${SHADOW}`,\n }}\n >\n <span className=\"roadmap-pin-ring-inner\">\n <span\n className=\"roadmap-pin-count\"\n style={{ fontSize: 14, color: INK }}\n >\n {text}\n </span>\n </span>\n </span>\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={{ ...centred(size), color: ring }}\n onClick={onClick}\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span\n className=\"roadmap-pin-circle\"\n style={{ boxShadow: `0 3px 8px ${SHADOW}, ${halo}` }}\n >\n <span\n className=\"roadmap-pin-count\"\n style={{ fontSize: 15, color: INK }}\n >\n {text}\n </span>\n <span\n className=\"roadmap-pin-label\"\n style={{ fontSize: sitesLabel.length > 6 ? 7 : 8, color: MUTED }}\n >\n {sitesLabel}\n </span>\n </span>\n </button>\n );\n}\n\ninterface Props {\n data: GeohashItem;\n map?: google.maps.Map;\n kind: MapKind;\n onClick: (payload: GeohashItem) => void;\n // the bucket holds the location open in the sidebar\n selected?: boolean;\n // the map is zoomed out far enough that a single pin drops to a dot\n compact?: boolean;\n // the formatted price per kWh for the tag under the pin; absent when the\n // location has none, in which case the tag reads as unknown\n price?: string;\n // accessible wording of that price, e.g. \"€0.42 per kWh\"\n priceLabel?: string;\n // caption under the count of a large cluster, e.g. \"sites\"\n sitesLabel: string;\n}\n\nconst Pin: React.FC<Props> = ({\n data,\n map,\n kind,\n onClick,\n selected = false,\n compact = false,\n price,\n priceLabel,\n sitesLabel,\n}) => {\n const cluster = isCluster(data);\n const state = useMemo(\n () => describePin(data.statuses, kind, cluster),\n [data, kind, cluster],\n );\n const handleClick = useCallback(() => onClick(data), [onClick, data]);\n const label = cluster\n ? `${formatter.format(data.count)} ${sitesLabel}`\n : price\n ? `${state.free}/${state.total}, ${priceLabel || price}`\n : `${state.free}/${state.total}`;\n\n let body: React.ReactNode;\n if (cluster && data.count > STACK_MAX) {\n body = (\n <ClusterCircle\n state={state}\n count={data.count}\n selected={selected}\n onClick={handleClick}\n label={label}\n sitesLabel={sitesLabel}\n />\n );\n } else if (cluster) {\n body = (\n <StackedPin\n state={state}\n count={data.count}\n selected={selected}\n onClick={handleClick}\n label={label}\n />\n );\n } else {\n body = (\n <SinglePin\n state={state}\n selected={selected}\n compact={compact}\n tag={price || UNKNOWN_PRICE}\n onClick={handleClick}\n label={label}\n />\n );\n }\n\n return (\n <OverlayView\n position={data.centroid}\n map={map}\n zIndex={selected ? 99 : cluster ? 1 : 0}\n >\n {body}\n </OverlayView>\n );\n};\n\nexport default Pin;\n","import { GeohashItem } from \"../types\";\n\nfunction sameStatuses(a: GeohashItem, b: GeohashItem): boolean {\n if (a.count !== b.count) return false;\n const left = a.statuses || [];\n const right = b.statuses || [];\n if (left.length !== right.length) return false;\n return left.every(\n (status, i) =>\n status.name === right[i].name && status.count === right[i].count,\n );\n}\n\nfunction samePrice(a: GeohashItem, b: GeohashItem): boolean {\n if (!a.energyPrice || !b.energyPrice) {\n return !a.energyPrice && !b.energyPrice;\n }\n return (\n a.energyPrice.amount === b.energyPrice.amount &&\n a.energyPrice.currency === b.energyPrice.currency\n );\n}\n\n// mergeBuckets reconciles a fresh search response with the buckets already on\n// the map. Buckets that left the view go, new ones come in, and a bucket that\n// is still there keeps its existing object so its marker does not re-render,\n// unless its statuses or price changed, in which case the fresh object wins and\n// the pin recolours or its capsule updates.\nexport function mergeBuckets(\n existing: GeohashItem[],\n incoming: GeohashItem[],\n): GeohashItem[] {\n const byKey = new Map(existing.map((bucket) => [bucket.key, bucket]));\n return incoming.map((bucket) => {\n const previous = byKey.get(bucket.key);\n return previous && sameStatuses(previous, bucket) && samePrice(previous, bucket)\n ? previous\n : bucket;\n });\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport Geohash from \"latlon-geohash\";\nimport CustomMarker from \"../CustomMarker/CustomMarker\";\nimport Pin, { PinStyles } from \"../Pin/Pin\";\nimport { GeohashItem } from \"../../types\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { mergeBuckets } from \"../../utils/buckets\";\nimport { pinPrice } from \"../../utils/pinState\";\nimport { formatEnergyPrice } from \"../../utils/price\";\nimport { atLeast } from \"../../utils/version\";\n\n// below this zoom a single v3 pin drops to a dot without a glyph\nconst compactBelowZoom = 12;\n\nconst geoHashZoom = [\n 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9,\n];\n\nfunction zoomToHashChars(zoom) {\n return geoHashZoom[zoom];\n}\n\nfunction getNormalizedBounds(bounds, zoomLevel) {\n const mapSWPoint = bounds.getSouthWest().toJSON();\n const mapNEPoint = bounds.getNorthEast().toJSON();\n\n const SWGeohash = Geohash.encode(mapSWPoint.lat, mapSWPoint.lng, zoomLevel);\n\n const geohashSWBounds = Geohash.bounds(SWGeohash);\n\n const latStep = Math.abs(geohashSWBounds.sw.lat - geohashSWBounds.ne.lat);\n const lngStep = Math.abs(geohashSWBounds.sw.lon - geohashSWBounds.ne.lon);\n\n let neLat = geohashSWBounds.sw.lat;\n while (neLat <= mapNEPoint.lat) {\n neLat = neLat + latStep;\n }\n\n let neLng = geohashSWBounds.sw.lon;\n while (neLng <= mapNEPoint.lng) {\n neLng = neLng + lngStep;\n }\n\n return {\n nwLat: neLat,\n nwLng: geohashSWBounds.sw.lon,\n seLat: geohashSWBounds.sw.lat,\n seLng: neLng,\n };\n}\n\nfunction isSameBounds(bounds1, bounds2) {\n return (\n bounds1.nwLat === bounds2.nwLat &&\n bounds1.nwLng === bounds2.nwLng &&\n bounds1.seLat === bounds2.seLat &&\n bounds1.seLng === bounds2.seLng\n );\n}\n\nexport default function MapMarkers({\n map,\n filters,\n fetchGeohashes,\n onMarkerClicked,\n}) {\n const {\n setIsSearching,\n setSearchBounds,\n mapKind,\n locationIds,\n options,\n language,\n t,\n } = useMapContext();\n const [data, setData] = useState<GeohashItem[]>([]);\n const [zoom, setZoom] = useState<number>(map.getZoom());\n\n const [mapConfig, setMapConfig] = useState({\n zoom: zoomToHashChars(map.getZoom()),\n normalizedBounds: getNormalizedBounds(\n map.getBounds(),\n zoomToHashChars(map.getZoom()),\n ),\n });\n\n useEffect(() => {\n let currentZoomLevel = mapConfig.zoom;\n let currentBounds = undefined;\n\n map.addListener(\"idle\", () => {\n setZoom(map.getZoom());\n const newZoomLevel = zoomToHashChars(map.getZoom());\n\n const newMapConfig = {\n ...mapConfig,\n zoom: newZoomLevel,\n };\n const bounds = getNormalizedBounds(map.getBounds(), currentZoomLevel);\n\n if (currentBounds && isSameBounds(currentBounds, bounds)) {\n return;\n }\n currentBounds = bounds;\n setMapConfig({\n ...newMapConfig,\n normalizedBounds: bounds,\n });\n });\n }, []);\n\n // reconcile the response with what is on the map: unchanged buckets keep\n // their object (no re-render), changed statuses take the fresh one (recolour)\n function appendData(newData) {\n setData(mergeBuckets(data, newData));\n }\n\n // publish the bounds so the analytics pill totals the same area as the pins\n useEffect(() => {\n if (!mapConfig.normalizedBounds) return;\n setSearchBounds?.(mapConfig.normalizedBounds);\n }, [mapConfig.normalizedBounds]);\n\n useEffect(() => {\n if (!mapConfig.normalizedBounds) return;\n let ignore = false;\n\n setIsSearching(true);\n fetchGeohashes({\n precision: mapConfig.zoom,\n bbox: mapConfig.normalizedBounds,\n ...filters,\n })\n .then(({ data }) => {\n if (ignore) return;\n appendData(data);\n setIsSearching(false);\n })\n .catch((e) => {\n // deal with error\n setIsSearching(false);\n });\n\n return () => {\n ignore = true;\n setIsSearching(false);\n };\n }, [mapConfig, filters, mapKind]);\n\n const _onMarkerClicked = useCallback(\n (data: GeohashItem) => {\n const ids = data.ids;\n if (ids.length == 100) {\n map.setZoom(map.getZoom() + 2);\n }\n map.panTo({ lat: data.centroid.lat, lng: data.centroid.lon });\n if (ids.length !== 100) {\n onMarkerClicked(ids);\n }\n },\n [map, onMarkerClicked],\n );\n\n // v3 draws the redesigned pins; earlier versions keep the round markers\n const modernPins = atLeast(options?.version, \"v3\");\n const isSelected = (item: GeohashItem) =>\n Boolean(locationIds?.length) &&\n item.ids.some((id) => locationIds.includes(id));\n\n if (!modernPins) {\n return (\n <>\n {data.filter(Boolean).map((item: GeohashItem) => (\n <CustomMarker\n map={map}\n key={item.key}\n data={item}\n kind={mapKind}\n onClick={_onMarkerClicked}\n />\n ))}\n </>\n );\n }\n\n return (\n <>\n <PinStyles />\n {data.filter(Boolean).map((item: GeohashItem) => {\n // a single location carries its price per kWh in a tag under the pin;\n // the pin itself reads it as unknown when there is none\n const price = formatEnergyPrice(language, pinPrice(item));\n return (\n <Pin\n map={map}\n key={item.key}\n data={item}\n kind={mapKind}\n selected={isSelected(item)}\n compact={zoom < compactBelowZoom}\n price={price}\n priceLabel={price && t(\"pin.pricePerKwh\", { price })}\n sitesLabel={t(\"pin.sites\")}\n onClick={_onMarkerClicked}\n />\n );\n })}\n </>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\n\nimport { useMapContext } from \"../../contexts/Map\";\n\nimport styles from \"./Map.module.css\";\nimport { getLoader } from \"../../utils/loader\";\n\nimport MapMarkers from \"../MapMarkers/MapMarkers\";\n\n/*\nconst gridParts = [];\n\nfunction eraseGrid() {\n for (var i = 0; i < gridParts.length; i++) {\n gridParts[i].setMap(null);\n }\n gridParts.length = 0;\n}\n\nconst defaults = {\n zoom: 3,\n maxDisplay: 2 * 10240,\n geohashPrecision: 12,\n};\n\n\nfunction drawGrid(map) {\n const level = zoomToHashChars(map.getZoom());\n console.log(level, map.getZoom());\n\n const bounds = map.getBounds();\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n const neHash = Geohash.encode(ne.lat(), ne.lng(), level);\n const nwHash = Geohash.encode(ne.lat(), sw.lng(), level);\n const swHash = Geohash.encode(sw.lat(), sw.lng(), level);\n const seHash = Geohash.encode(sw.lat(), ne.lng(), level);\n\n let current = neHash;\n let eastBound = neHash;\n let westBound = nwHash;\n let maxHash = defaults.maxDisplay;\n\n eraseGrid();\n while (maxHash-- > 0) {\n drawBox(map, current);\n do {\n current = Geohash.adjacent(current, \"w\");\n drawBox(map, current);\n } while (maxHash-- > 0 && current != westBound);\n if (current == swHash) {\n return;\n }\n westBound = Geohash.adjacent(current, \"s\");\n current = eastBound = Geohash.adjacent(eastBound, \"s\");\n }\n alert(\"defaults.maxDisplay limit reached\");\n eraseGrid();\n}\n\n\nfunction drawBox(map, hash) {\n const b = Geohash.bounds(hash);\n const gb = new google.maps.LatLngBounds(\n new google.maps.LatLng(b.sw.lat, b.sw.lon),\n new google.maps.LatLng(b.ne.lat, b.ne.lon)\n );\n const rect = new google.maps.Rectangle({\n map: map,\n bounds: gb,\n strokeColor: \"#3333AA\",\n strokeOpacity: 0.8,\n strokeWeight: 1,\n fillColor: \"#222222\",\n fillOpacity: 0.1,\n });\n const marker = new google.maps.Marker({\n map: map,\n position: gb.getCenter(),\n icon: \" \",\n });\n gridParts.push(rect);\n gridParts.push(marker);\n}\n*/\n\nexport default function MapWrapper() {\n const {\n place,\n options,\n fetchGeohashes,\n setLocationsIds,\n language,\n filters,\n position,\n } = useMapContext();\n\n const apiKey = options.googleApiKey;\n const [map, setMap] = useState<google.maps.Map>();\n\n const mapContainerRef = useRef(null);\n const loader = getLoader(apiKey, language);\n\n useEffect(() => {\n if (map && place?.geometry?.viewport) {\n map.fitBounds(place.geometry.viewport);\n }\n if (map && place?.geometry?.location) {\n /*\n const icon = {\n url: place.icon as string,\n size: new google.maps.Size(71, 71),\n origin: new google.maps.Point(0, 0),\n anchor: new google.maps.Point(17, 34),\n scaledSize: new google.maps.Size(25, 25),\n };\n const marker = new google.maps.Marker({\n map,\n icon,\n title: place.name,\n position: place.geometry.location,\n });\n setMarker(marker);\n */\n map.setCenter(place.geometry.location);\n }\n }, [map, place]);\n\n useEffect(() => {\n loader.importLibrary(\"maps\").then(({ Map }) => {\n const map = new Map(mapContainerRef.current, {\n mapId: \"ced50d4165f3a695\",\n center: position as any, // Initial map center coordinates\n zoom: options.zoomLevel ?? 12, // Initial zoom level,\n zoomControl: true,\n mapTypeControl: false,\n scaleControl: false,\n streetViewControl: false,\n rotateControl: false,\n fullscreenControl: false,\n controlSize: 32,\n clickableIcons: false,\n gestureHandling: options.gestureHandling || \"auto\",\n });\n map.addListener(\"idle\", () => {\n setMap(map);\n });\n return () => {\n console.log(\"unmounting\");\n };\n });\n }, [apiKey]);\n\n return (\n <div className={styles.container} ref={mapContainerRef}>\n {map && map.getBounds() && (\n <MapMarkers\n filters={filters}\n onMarkerClicked={(ids) => {\n setLocationsIds([...ids]);\n }}\n map={map}\n fetchGeohashes={fetchGeohashes}\n />\n )}\n </div>\n );\n}\n\n","import React from \"react\";\n\ninterface Props {\n color: string;\n size?: number;\n}\n\nexport const StatusDot: React.FC<Props> = ({ color, size = 10 }) => (\n <span\n style={{\n display: \"block\",\n width: size,\n height: size,\n borderRadius: size,\n background: color,\n }}\n />\n);\n\nexport default StatusDot;\n","import React, { CSSProperties, useEffect, useMemo, useState } from \"react\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport StatusDot from \"../StatusDot/StatusDot\";\nimport { Analytics, AnalyticsBucket, MapKind } from \"../../types\";\nimport { getStatusColor, getStatusLabelKey } from \"../../utils/status\";\nimport {\n isStatusFilterActive,\n toggleStatusFilter,\n withoutStatusFilter,\n} from \"../../utils/statusFilters\";\nimport { atLeast } from \"../../utils/version\";\n\n// Matches the breakpoint in router.module.css. Below it the controls span the\n// full width, so there is no room next to the filter toggle for the pills.\nconst desktopQuery = \"(min-width: 768px)\";\n\n// Geometry of the controls column in router.module.css: the column is 380px\n// wide with 20px padding, and the search row (search input plus filter toggle)\n// is 48px tall. The pill sits in that row, to the right of the toggle, with\n// the vocabulary switch under it when the map has two breakdowns.\nconst controlsColumnWidth = 380;\nconst edgePadding = 20;\nconst rowHeight = 48;\n\nfunction useIsDesktop() {\n const [isDesktop, setIsDesktop] = useState(\n () => window.matchMedia(desktopQuery).matches,\n );\n\n useEffect(() => {\n const media = window.matchMedia(desktopQuery);\n const onChange = (event: MediaQueryListEvent) =>\n setIsDesktop(event.matches);\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, []);\n\n return isDesktop;\n}\n\n// Styles are inline rather than a CSS module: when the widget renders in a\n// shadow root it loads the published stylesheet, which does not carry classes\n// added since the last release.\nconst overlayStyle: CSSProperties = {\n position: \"absolute\",\n top: edgePadding,\n left: controlsColumnWidth,\n right: edgePadding,\n zIndex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 6,\n fontFamily: \"var(--roadmap-font-family, Inter), system-ui\",\n fontSize: 12,\n lineHeight: \"16px\",\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n transition: \"opacity 0.2s ease\",\n};\n\nconst pillStyle: CSSProperties = {\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n height: rowHeight,\n padding: \"0 12px\",\n background: \"var(--roadmap-background-color, #fff)\",\n border: \"1px solid var(--roadmap-border-color, #ddd)\",\n borderRadius: 10,\n whiteSpace: \"nowrap\",\n // the row around the pills lets map gestures through; the pills themselves\n // take clicks\n pointerEvents: \"auto\",\n};\n\n// the switch under the pill sits straight on the map, so the text is dark grey\n// with a white outline drawn by eight one-pixel shadows, which stays outside\n// the letters at this size where a text stroke would eat into them\nconst switchOutline = \"#fff\";\nconst switchInk = \"#3a3a3a\";\nconst switchTextShadow = [\n \"1px 0 0\",\n \"-1px 0 0\",\n \"0 1px 0\",\n \"0 -1px 0\",\n \"1px 1px 0\",\n \"-1px -1px 0\",\n \"1px -1px 0\",\n \"-1px 1px 0\",\n]\n .map((offset) => `${offset} ${switchOutline}`)\n .join(\", \");\n\nconst switchStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n paddingLeft: 12,\n fontSize: 11,\n fontWeight: 700,\n lineHeight: \"13px\",\n color: switchInk,\n textShadow: switchTextShadow,\n pointerEvents: \"auto\",\n};\n\n// the vocabulary not shown is a lighter grey under the same outline\nconst switchOptionStyle: CSSProperties = {\n padding: 0,\n border: 0,\n background: \"none\",\n font: \"inherit\",\n textShadow: \"inherit\",\n color: \"#8a8a8a\",\n cursor: \"pointer\",\n outline: \"none\",\n};\n\nconst switchActiveStyle: CSSProperties = {\n ...switchOptionStyle,\n color: switchInk,\n cursor: \"default\",\n};\n\n// border longhands only: React drops a longhand that disappears between\n// renders without re-applying a shorthand, which left a currentColor border\n// behind after a bucket was deselected\nconst bucketStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 6px\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"transparent\",\n borderRadius: 6,\n background: \"none\",\n font: \"inherit\",\n color: \"inherit\",\n lineHeight: \"16px\",\n outline: \"none\",\n};\n\n// a bucket whose filter option is selected is outlined in the brand colour\nconst activeBucketStyle: CSSProperties = {\n ...bucketStyle,\n borderColor: \"var(--roadmap-brand-color, #ff3d00)\",\n color: \"var(--roadmap-brand-color, #ff3d00)\",\n};\n\nconst clickableBucketStyle: CSSProperties = {\n cursor: \"pointer\",\n};\n\nconst countStyle: CSSProperties = {\n fontSize: 13,\n fontWeight: 600,\n};\n\n// StatusPill renders one dot, count and label per status bucket. The server\n// already orders buckets by descending count.\n// With filterKind set, a bucket a filter option covers is a button that\n// toggles that option, exactly as its checkbox in the filters panel would.\n// Buckets without an option, and every bucket when filterKind is absent, are\n// display only.\nfunction StatusPill({\n buckets,\n format,\n kind,\n filterKind,\n}: {\n buckets: AnalyticsBucket[];\n format: Intl.NumberFormat;\n kind: MapKind;\n filterKind?: MapKind;\n}) {\n const { t, filters, setFilters, options } = useMapContext();\n const selected: string[] = filters?.status || [];\n\n const onToggle = (status: string) => {\n const next = toggleStatusFilter(filterKind, selected, status);\n if (!next || !setFilters) return;\n setFilters({ ...filters, status: next });\n };\n\n return (\n <div style={pillStyle}>\n {buckets.map((bucket) => {\n const clickable =\n Boolean(filterKind) &&\n toggleStatusFilter(filterKind, selected, bucket.name) !== undefined;\n const active =\n clickable && isStatusFilterActive(filterKind, selected, bucket.name);\n const content = (\n <>\n <StatusDot\n color={getStatusColor(bucket.name, kind, options?.version)}\n size={8}\n />\n <span style={countStyle}>{format.format(bucket.count)}</span>\n {t(getStatusLabelKey(bucket.name))}\n </>\n );\n\n if (!clickable) {\n return (\n <span key={bucket.name} style={bucketStyle}>\n {content}\n </span>\n );\n }\n\n return (\n <button\n key={bucket.name}\n type=\"button\"\n aria-pressed={active}\n style={{\n ...(active ? activeBucketStyle : bucketStyle),\n ...clickableBucketStyle,\n }}\n onClick={() => onToggle(bucket.name)}\n >\n {content}\n </button>\n );\n })}\n </div>\n );\n}\n\n// Vocabulary is which breakdown the pill shows: EVSEs by roaming status, or\n// connectors by the OCPP status the station reports.\ntype Vocabulary = \"roaming\" | \"ocpp\";\n\n// AnalyticsOverlay puts one status pill for the current view next to the\n// filter toggle. Roaming maps get EVSEs by roaming status. CPO maps also have\n// the connectors by OCPP status, and show that by default with a switch under\n// the pill to flip to the roaming view: a gap between what the charger says and\n// what roaming partners see is the signal an operator is after.\nexport default function AnalyticsOverlay() {\n const {\n t,\n language,\n options,\n filters,\n filterConfiguration,\n searchBounds,\n fetchAnalytics,\n mapKind,\n } = useMapContext();\n const [analytics, setAnalytics] = useState<Analytics>();\n const [isLoading, setIsLoading] = useState(false);\n const [vocabulary, setVocabulary] = useState<Vocabulary>(\"ocpp\");\n const isDesktop = useIsDesktop();\n\n const enabled =\n atLeast(options?.version, \"v2\") &&\n Boolean(filterConfiguration?.showAnalytics);\n\n // The pills are a facet control: they list every status in the view and\n // highlight the selected ones, so their counts ignore the status selection.\n // Keyed on content so a status toggle alone does not refetch.\n const analyticsFiltersKey = JSON.stringify(withoutStatusFilter(filters));\n const analyticsFilters = useMemo(\n () => JSON.parse(analyticsFiltersKey),\n [analyticsFiltersKey],\n );\n\n useEffect(() => {\n if (!enabled || !searchBounds || !fetchAnalytics) return;\n let ignore = false;\n\n setIsLoading(true);\n fetchAnalytics({ bbox: searchBounds, ...analyticsFilters })\n .then((response) => {\n if (ignore) return;\n setAnalytics(response?.data);\n })\n .catch(() => {\n // the endpoint is unavailable or the request failed: hide the pills\n // rather than show stale totals for a different view\n if (ignore) return;\n setAnalytics(undefined);\n })\n .finally(() => {\n if (ignore) return;\n setIsLoading(false);\n });\n\n return () => {\n ignore = true;\n };\n }, [enabled, searchBounds, analyticsFilters, mapKind]);\n\n const format = useMemo(() => new Intl.NumberFormat(language), [language]);\n\n if (!enabled || !isDesktop || !analytics) {\n return null;\n }\n\n const isCpo = mapKind === \"cpo\";\n const roamingBuckets = analytics.evses.byStatus || [];\n const ocppBuckets = isCpo ? analytics.connectors.byOcppStatus || [] : [];\n\n const available: Vocabulary[] = [];\n if (ocppBuckets.length > 0) available.push(\"ocpp\");\n if (roamingBuckets.length > 0) available.push(\"roaming\");\n if (available.length === 0) {\n return null;\n }\n\n // the chosen vocabulary can drop out of the view (a filter can empty one\n // breakdown), so the pill falls back to whatever is left without losing the\n // choice for when it returns\n const shown = available.includes(vocabulary) ? vocabulary : available[0];\n\n return (\n <div style={{ ...overlayStyle, opacity: isLoading ? 0.6 : 1 }}>\n {shown === \"ocpp\" ? (\n <StatusPill\n buckets={ocppBuckets}\n format={format}\n kind=\"cpo\"\n filterKind=\"cpo\"\n />\n ) : (\n // roaming statuses keep the roaming palette on every map kind. They\n // filter on roaming maps only: the CPO search filters on OCPP status,\n // so on a CPO map this pill is read-only.\n <StatusPill\n buckets={roamingBuckets}\n format={format}\n kind=\"roaming\"\n filterKind={isCpo ? undefined : \"roaming\"}\n />\n )}\n {available.length > 1 && (\n <div style={switchStyle} role=\"group\">\n {available.map((option, index) => (\n <React.Fragment key={option}>\n {index > 0 && <span aria-hidden=\"true\">|</span>}\n <button\n type=\"button\"\n aria-pressed={option === shown}\n style={option === shown ? switchActiveStyle : switchOptionStyle}\n onClick={() => setVocabulary(option)}\n >\n {t(\n option === \"ocpp\"\n ? \"analytics.evseStatus\"\n : \"analytics.roamingStatus\",\n )}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<<anonymous>>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Checks if a given element has a CSS class.\n * \n * @param element the element\n * @param className the CSS class name\n */\nexport default function hasClass(element, className) {\n if (element.classList) return !!className && element.classList.contains(className);\n return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}","import hasClass from './hasClass';\n/**\n * Adds a CSS class to a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\nexport default function addClass(element, className) {\n if (element.classList) element.classList.add(className);else if (!hasClass(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}","function replaceClassName(origClass, classToRemove) {\n return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n/**\n * Removes a CSS class from a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\n\nexport default function removeClass(element, className) {\n if (element.classList) {\n element.classList.remove(className);\n } else if (typeof element.className === 'string') {\n element.className = replaceClassName(element.className, className);\n } else {\n element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n }\n}","export default {\n disabled: false\n};","import PropTypes from 'prop-types';\nexport var timeoutsShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.number, PropTypes.shape({\n enter: PropTypes.number,\n exit: PropTypes.number,\n appear: PropTypes.number\n}).isRequired]) : null;\nexport var classNamesShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.string, PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string,\n active: PropTypes.string\n}), PropTypes.shape({\n enter: PropTypes.string,\n enterDone: PropTypes.string,\n enterActive: PropTypes.string,\n exit: PropTypes.string,\n exitDone: PropTypes.string,\n exitActive: PropTypes.string\n})]) : null;","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 1 },\n * entered: { opacity: 1 },\n * exiting: { opacity: 0 },\n * exited: { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * <Transition in={inProp} timeout={duration}>\n * {state => (\n * <div style={{\n * ...defaultStyle,\n * ...transitionStyles[state]\n * }}>\n * I'm a fade Transition!\n * </div>\n * )}\n * </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `'entering'`\n * - `'entered'`\n * - `'exiting'`\n * - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n * <div>\n * <Transition in={inProp} timeout={500}>\n * {state => (\n * // ...\n * )}\n * </Transition>\n * <button onClick={() => setInProp(true)}>\n * Click to Enter\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n if (this.props.unmountOnExit || this.props.mountOnEnter) {\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n // To make the animation happen, we have to separate each rendering and avoid being processed as batched.\n\n if (node) forceReflow(node);\n }\n\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n React.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A React reference to DOM element that need to transition:\n * https://stackoverflow.com/a/51127130/4671932\n *\n * - When `nodeRef` prop is used, `node` is not passed to callback functions\n * (e.g. `onEnter`) because user already has direct access to the node.\n * - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n * `nodeRef` need to be provided to `Transition` with changed `key` prop\n * (see\n * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n */\n nodeRef: PropTypes.shape({\n current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n var value = propValue[key];\n return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n }\n }),\n\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * <Transition in={this.state.in} timeout={150}>\n * {state => (\n * <MyComponent className={`fade fade-${state}`} />\n * )}\n * </Transition>\n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * By default the child component does not perform the enter transition when\n * it first mounts, regardless of the value of `in`. If you want this\n * behavior, set both `appear` and `in` to `true`.\n *\n * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n * > only adds an additional enter transition. However, in the\n * > `<CSSTransition>` component that first enter transition does result in\n * > additional `.appear-*` classes, that way you can choose to style it\n * > differently.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. Timeouts are still used as a fallback if provided.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport addOneClass from 'dom-helpers/addClass';\nimport removeOneClass from 'dom-helpers/removeClass';\nimport React from 'react';\nimport Transition from './Transition';\nimport { classNamesShape } from './utils/PropTypes';\nimport { forceReflow } from './utils/reflow';\n\nvar _addClass = function addClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return addOneClass(node, c);\n });\n};\n\nvar removeClass = function removeClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return removeOneClass(node, c);\n });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n * <div>\n * <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n * <div>\n * {\"I'll receive my-node-* classes\"}\n * </div>\n * </CSSTransition>\n * <button type=\"button\" onClick={() => setInProp(true)}>\n * Click to Enter\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n * opacity: 0;\n * }\n * .my-node-enter-active {\n * opacity: 1;\n * transition: opacity 200ms;\n * }\n * .my-node-exit {\n * opacity: 1;\n * }\n * .my-node-exit-active {\n * opacity: 0;\n * transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(CSSTransition, _React$Component);\n\n function CSSTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.appliedClasses = {\n appear: {},\n enter: {},\n exit: {}\n };\n\n _this.onEnter = function (maybeNode, maybeAppearing) {\n var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n node = _this$resolveArgument[0],\n appearing = _this$resolveArgument[1];\n\n _this.removeClasses(node, 'exit');\n\n _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n if (_this.props.onEnter) {\n _this.props.onEnter(maybeNode, maybeAppearing);\n }\n };\n\n _this.onEntering = function (maybeNode, maybeAppearing) {\n var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n node = _this$resolveArgument2[0],\n appearing = _this$resolveArgument2[1];\n\n var type = appearing ? 'appear' : 'enter';\n\n _this.addClass(node, type, 'active');\n\n if (_this.props.onEntering) {\n _this.props.onEntering(maybeNode, maybeAppearing);\n }\n };\n\n _this.onEntered = function (maybeNode, maybeAppearing) {\n var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n node = _this$resolveArgument3[0],\n appearing = _this$resolveArgument3[1];\n\n var type = appearing ? 'appear' : 'enter';\n\n _this.removeClasses(node, type);\n\n _this.addClass(node, type, 'done');\n\n if (_this.props.onEntered) {\n _this.props.onEntered(maybeNode, maybeAppearing);\n }\n };\n\n _this.onExit = function (maybeNode) {\n var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n node = _this$resolveArgument4[0];\n\n _this.removeClasses(node, 'appear');\n\n _this.removeClasses(node, 'enter');\n\n _this.addClass(node, 'exit', 'base');\n\n if (_this.props.onExit) {\n _this.props.onExit(maybeNode);\n }\n };\n\n _this.onExiting = function (maybeNode) {\n var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n node = _this$resolveArgument5[0];\n\n _this.addClass(node, 'exit', 'active');\n\n if (_this.props.onExiting) {\n _this.props.onExiting(maybeNode);\n }\n };\n\n _this.onExited = function (maybeNode) {\n var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n node = _this$resolveArgument6[0];\n\n _this.removeClasses(node, 'exit');\n\n _this.addClass(node, 'exit', 'done');\n\n if (_this.props.onExited) {\n _this.props.onExited(maybeNode);\n }\n };\n\n _this.resolveArguments = function (maybeNode, maybeAppearing) {\n return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n : [maybeNode, maybeAppearing];\n };\n\n _this.getClassNames = function (type) {\n var classNames = _this.props.classNames;\n var isStringClassNames = typeof classNames === 'string';\n var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n return {\n baseClassName: baseClassName,\n activeClassName: activeClassName,\n doneClassName: doneClassName\n };\n };\n\n return _this;\n }\n\n var _proto = CSSTransition.prototype;\n\n _proto.addClass = function addClass(node, type, phase) {\n var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n var _this$getClassNames = this.getClassNames('enter'),\n doneClassName = _this$getClassNames.doneClassName;\n\n if (type === 'appear' && phase === 'done' && doneClassName) {\n className += \" \" + doneClassName;\n } // This is to force a repaint,\n // which is necessary in order to transition styles when adding a class name.\n\n\n if (phase === 'active') {\n if (node) forceReflow(node);\n }\n\n if (className) {\n this.appliedClasses[type][phase] = className;\n\n _addClass(node, className);\n }\n };\n\n _proto.removeClasses = function removeClasses(node, type) {\n var _this$appliedClasses$ = this.appliedClasses[type],\n baseClassName = _this$appliedClasses$.base,\n activeClassName = _this$appliedClasses$.active,\n doneClassName = _this$appliedClasses$.done;\n this.appliedClasses[type] = {};\n\n if (baseClassName) {\n removeClass(node, baseClassName);\n }\n\n if (activeClassName) {\n removeClass(node, activeClassName);\n }\n\n if (doneClassName) {\n removeClass(node, doneClassName);\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n _ = _this$props.classNames,\n props = _objectWithoutPropertiesLoose(_this$props, [\"classNames\"]);\n\n return /*#__PURE__*/React.createElement(Transition, _extends({}, props, {\n onEnter: this.onEnter,\n onEntered: this.onEntered,\n onEntering: this.onEntering,\n onExit: this.onExit,\n onExiting: this.onExiting,\n onExited: this.onExited\n }));\n };\n\n return CSSTransition;\n}(React.Component);\n\nCSSTransition.defaultProps = {\n classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, Transition.propTypes, {\n /**\n * The animation classNames applied to the component as it appears, enters,\n * exits or has finished the transition. A single name can be provided, which\n * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n *\n * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n *\n * A few details to note about how these classes are applied:\n *\n * 1. They are _joined_ with the ones that are already defined on the child\n * component, so if you want to add some base styles, you can use\n * `className` without worrying that it will be overridden.\n *\n * 2. If the transition component mounts with `in={false}`, no classes are\n * applied yet. You might be expecting `*-exit-done`, but if you think\n * about it, a component cannot finish exiting if it hasn't entered yet.\n *\n * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n * allows you to define different behavior for when appearing is done and\n * when regular entering is done, using selectors like\n * `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n * an epic entrance animation when element first appears in the DOM using\n * [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n * simply use `fade-enter-done` for defining both cases.\n *\n * Each individual classNames can also be specified independently like:\n *\n * ```js\n * classNames={{\n * appear: 'my-appear',\n * appearActive: 'my-active-appear',\n * appearDone: 'my-done-appear',\n * enter: 'my-enter',\n * enterActive: 'my-active-enter',\n * enterDone: 'my-done-enter',\n * exit: 'my-exit',\n * exitActive: 'my-active-exit',\n * exitDone: 'my-done-exit',\n * }}\n * ```\n *\n * If you want to set these classes using CSS Modules:\n *\n * ```js\n * import styles from './styles.css';\n * ```\n *\n * you might want to use camelCase in your CSS file, that way could simply\n * spread them instead of listing them one by one:\n *\n * ```js\n * classNames={{ ...styles }}\n * ```\n *\n * @type {string | {\n * appear?: string,\n * appearActive?: string,\n * appearDone?: string,\n * enter?: string,\n * enterActive?: string,\n * enterDone?: string,\n * exit?: string,\n * exitActive?: string,\n * exitDone?: string,\n * }}\n */\n classNames: classNamesShape,\n\n /**\n * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n * applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEnter: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'enter-active' or\n * 'appear-active' class is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'enter' or\n * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntered: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'exit' class is\n * applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement)\n */\n onExit: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement)\n */\n onExiting: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'exit' classes\n * are **removed** and the `exit-done` class is added to the DOM node.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement)\n */\n onExited: PropTypes.func\n}) : {};\nexport default CSSTransition;","import _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\n\nvar _leaveRenders, _enterRenders;\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { ENTERED, ENTERING, EXITING } from './Transition';\nimport TransitionGroupContext from './TransitionGroupContext';\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n if (oldChildren === newChildren) return false;\n\n if (React.isValidElement(oldChildren) && React.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n return false;\n }\n\n return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nexport var modes = {\n out: 'out-in',\n in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n return function () {\n var _element$props;\n\n element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n cb();\n };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n var current = _ref.current,\n changeState = _ref.changeState;\n return React.cloneElement(current, {\n in: false,\n onExited: callHook(current, 'onExited', function () {\n changeState(ENTERING, null);\n })\n });\n}, _leaveRenders[modes.in] = function (_ref2) {\n var current = _ref2.current,\n changeState = _ref2.changeState,\n children = _ref2.children;\n return [current, React.cloneElement(children, {\n in: true,\n onEntered: callHook(children, 'onEntered', function () {\n changeState(ENTERING);\n })\n })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n var children = _ref3.children,\n changeState = _ref3.changeState;\n return React.cloneElement(children, {\n in: true,\n onEntered: callHook(children, 'onEntered', function () {\n changeState(ENTERED, React.cloneElement(children, {\n in: true\n }));\n })\n });\n}, _enterRenders[modes.in] = function (_ref4) {\n var current = _ref4.current,\n children = _ref4.children,\n changeState = _ref4.changeState;\n return [React.cloneElement(current, {\n in: false,\n onExited: callHook(current, 'onExited', function () {\n changeState(ENTERED, React.cloneElement(children, {\n in: true\n }));\n })\n }), React.cloneElement(children, {\n in: true\n })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n * const [state, setState] = useState(false);\n * return (\n * <SwitchTransition>\n * <CSSTransition\n * key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n * addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n * classNames='fade'\n * >\n * <button onClick={() => setState(state => !state)}>\n * {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n * </button>\n * </CSSTransition>\n * </SwitchTransition>\n * );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n * opacity: 0;\n * }\n * .fade-exit{\n * opacity: 1;\n * }\n * .fade-enter-active{\n * opacity: 1;\n * }\n * .fade-exit-active{\n * opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n * transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(SwitchTransition, _React$Component);\n\n function SwitchTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.state = {\n status: ENTERED,\n current: null\n };\n _this.appeared = false;\n\n _this.changeState = function (status, current) {\n if (current === void 0) {\n current = _this.state.current;\n }\n\n _this.setState({\n status: status,\n current: current\n });\n };\n\n return _this;\n }\n\n var _proto = SwitchTransition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n };\n\n SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n if (props.children == null) {\n return {\n current: null\n };\n }\n\n if (state.status === ENTERING && props.mode === modes.in) {\n return {\n status: ENTERING\n };\n }\n\n if (state.current && areChildrenDifferent(state.current, props.children)) {\n return {\n status: EXITING\n };\n }\n\n return {\n current: React.cloneElement(props.children, {\n in: true\n })\n };\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n children = _this$props.children,\n mode = _this$props.mode,\n _this$state = this.state,\n status = _this$state.status,\n current = _this$state.current;\n var data = {\n children: children,\n current: current,\n changeState: this.changeState,\n status: status\n };\n var component;\n\n switch (status) {\n case ENTERING:\n component = enterRenders[mode](data);\n break;\n\n case EXITING:\n component = leaveRenders[mode](data);\n break;\n\n case ENTERED:\n component = current;\n }\n\n return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n value: {\n isMounting: !this.appeared\n }\n }, component);\n };\n\n return SwitchTransition;\n}(React.Component);\n\nSwitchTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * Transition modes.\n * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n *\n * @type {'out-in'|'in-out'}\n */\n mode: PropTypes.oneOf([modes.in, modes.out]),\n\n /**\n * Any `Transition` or `CSSTransition` component.\n */\n children: PropTypes.oneOfType([PropTypes.element.isRequired])\n} : {};\nSwitchTransition.defaultProps = {\n mode: modes.out\n};\nexport default SwitchTransition;","import React from \"react\";\n\nimport styles from \"./stack.module.css\";\n\nexport default function StackView({ name, children }) {\n return <div className={styles.stack}>{children}</div>;\n}\n","import React, {\n createRef,\n useEffect,\n useState,\n createContext,\n useMemo,\n} from \"react\";\nimport { SwitchTransition, CSSTransition } from \"react-transition-group\";\nimport View from \"./View\";\n\nimport styles from \"./stack.module.css\";\n\ntype StackProps = {\n name?: string;\n currentView: string;\n onViewChange: (view: string, args: any) => void;\n children: React.ReactNode;\n};\n\ntype MapContextType = {\n setView: (view: string, args?: any) => void;\n current: {\n name: string;\n args?: any;\n };\n};\n\nexport const StackContext = createContext<MapContextType>({\n setView: () => {},\n current: {\n name: \"none\",\n },\n});\n\nexport function useStackContext() {\n return React.useContext(StackContext);\n}\n\nexport default function Stack({\n name,\n currentView,\n onViewChange,\n children,\n}: StackProps) {\n const elements = {\n none: {\n name: \"none\",\n ref: createRef(),\n view: null,\n },\n };\n\n React.Children.forEach(children, (element) => {\n if (!React.isValidElement(element)) return;\n const { name } = element.props as any;\n if (!name) {\n throw new Error(\"name is required for Stack.View\");\n }\n elements[name] = {\n name: name,\n ref: createRef(),\n view: element,\n };\n });\n\n const [currentRef, setCurrentRef] = useState(elements[currentView].ref);\n\n useEffect(() => {\n setCurrentRef(elements[currentView].ref);\n }, [currentView]);\n\n const { view: View } = elements[currentView];\n\n const [args, setArgs] = useState<any>({});\n\n const contextValue = useMemo(() => {\n return {\n current: {\n name: currentView,\n args: args,\n },\n setView: (view, opt) => {\n setArgs(opt);\n onViewChange(view, opt);\n },\n };\n }, [currentView, onViewChange, args, setArgs]);\n\n return (\n <StackContext.Provider value={contextValue}>\n <SwitchTransition mode=\"out-in\">\n <CSSTransition\n classNames={{\n enter: styles.slideEnter,\n enterActive: styles.slideEnterActive,\n enterDone: styles.slideEnterDone,\n exit: styles.slideExit,\n exitActive: styles.slideExitActive,\n exitDone: styles.slideExitDone,\n }}\n mountOnEnter\n unmountOnExit\n timeout={300}\n key={currentView}\n nodeRef={currentRef}\n addEndListener={(done) => {\n currentRef.current.addEventListener(\"transitionend\", done, false);\n }}\n >\n <div className={styles.stack} ref={currentRef}>\n {View}\n </div>\n </CSSTransition>\n </SwitchTransition>\n </StackContext.Provider>\n );\n}\n\nStack.View = View;\n","import React, { useState, useRef, useEffect, useContext } from \"react\";\nimport { getLoader } from \"../../utils/loader\";\nimport { useMapContext } from \"../../contexts/Map\";\n\nimport styles from \"./SearchInput.module.css\";\n\nexport default function SearchInput({ onFocus }) {\n const { options, setPlace, t, language } = useMapContext();\n const apiKey = options.googleApiKey;\n\n const inputRef = useRef(null);\n\n const loader = getLoader(apiKey, language);\n\n useEffect(() => {\n if (!inputRef.current) return;\n loader.importLibrary(\"places\").then((places) => {\n const autocomplete = new places.Autocomplete(inputRef.current, {\n fields: [\"geometry\"],\n });\n autocomplete.addListener(\"place_changed\", () => {\n const place = autocomplete.getPlace();\n setPlace(place);\n });\n });\n }, [inputRef]);\n\n // Doc for styling the autocomplete\n // https://developers.google.com/maps/documentation/javascript/place-autocomplete#style-autocomplete\n return (\n <div className={styles.container}>\n <input\n onFocus={onFocus}\n ref={inputRef}\n className={styles.searchInput}\n type=\"text\"\n placeholder={t(\"search.placeholder\")}\n />\n </div>\n );\n}\n\n","import React, { useEffect } from \"react\";\n\nimport styles from \"./Checkbox.module.css\";\n\ntype CheckboxToggleProps = {\n id?: string;\n checked: boolean;\n name?: string;\n onChange: (value: boolean) => void;\n type?: \"checkbox\" | \"radio\";\n};\n\nexport default function CheckboxToggle({\n id,\n name,\n checked,\n onChange,\n type = \"checkbox\",\n}: CheckboxToggleProps) {\n const [isChecked, setIsChecked] = React.useState(checked || false);\n\n const onChangeCallback = React.useCallback(\n (e) => {\n setIsChecked(e.target.checked);\n onChange(e.target.checked);\n },\n [onChange],\n );\n\n useEffect(() => {\n setIsChecked(checked);\n }, [checked]);\n\n return (\n <div className={styles.container}>\n <input\n name={name}\n id={id}\n type={type}\n value={isChecked as any}\n checked={isChecked as any}\n onChange={onChangeCallback}\n />\n <span className={styles.box}>\n <svg\n className=\"checkmark\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n </span>\n </div>\n );\n}\n","import React, { CSSProperties } from \"react\";\n\nimport styles from \"./Range.module.css\";\n\nexport default function Range({ ticks, value, onChange }) {\n const inputRef = React.useRef(null);\n\n const convertValue = ticks.findIndex((tick) => tick.value === value);\n\n const bgSize = (convertValue / (ticks.length - 1)) * 100;\n\n return (\n <div className={styles.container}>\n <input\n value={convertValue}\n onChange={(e) => {\n onChange(ticks[e.target.value].value);\n }}\n ref={inputRef}\n className={styles.input}\n type=\"range\"\n list=\"tickmarks\"\n step=\"1\"\n min=\"0\"\n max={ticks.length - 1}\n style={{ \"--roadmap-range-bgize\": `${bgSize}%` } as CSSProperties}\n />\n\n <div className={styles.ticksContainer}>\n {ticks.map((tick, i) => {\n return (\n <div\n onClick={(e) => {\n onChange(ticks[i].value);\n }}\n key={tick.label}\n className={styles.tick}\n >\n {tick.label}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n","import React, { useState, useMemo, useRef, useEffect } from \"react\";\nimport styles from \"./MultiSelect.module.css\";\n\nexport interface MultiSelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n id?: string;\n name?: string;\n options: MultiSelectOption[];\n value?: (string | number)[];\n preferredValues?: (string | number)[];\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n onChange?: (values: (string | number)[]) => void;\n}\n\nconst MultiSelect: React.FC<MultiSelectProps> = ({\n id,\n name,\n options,\n value = [],\n preferredValues = [],\n placeholder = \"Select...\",\n disabled = false,\n className,\n onChange,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const preferredSet = useMemo(\n () => new Set(preferredValues),\n [preferredValues],\n );\n\n const { preferred, others } = useMemo(() => {\n const q = inputValue.toLowerCase();\n const filtered = options.filter((o) => o.label.toLowerCase().includes(q));\n return {\n preferred: filtered.filter((o) => preferredSet.has(o.value)),\n others: filtered.filter((o) => !preferredSet.has(o.value)),\n };\n }, [options, inputValue, preferredSet]);\n\n const flatItems = useMemo(() => [...preferred, ...others], [preferred, others]);\n\n const selectedOptions = useMemo(\n () => options.filter((o) => value.includes(o.value)),\n [options, value],\n );\n\n useEffect(() => {\n if (highlightedIndex >= flatItems.length) {\n setHighlightedIndex(flatItems.length > 0 ? 0 : -1);\n }\n }, [flatItems, highlightedIndex]);\n\n const openMenu = () => {\n if (disabled) return;\n setIsOpen(true);\n if (highlightedIndex < 0 && flatItems.length > 0) setHighlightedIndex(0);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n setInputValue(\"\");\n setHighlightedIndex(-1);\n };\n\n const selectItem = (item: MultiSelectOption) => {\n if (item.disabled) return;\n const next = value.includes(item.value)\n ? value.filter((v) => v !== item.value)\n : [...value, item.value];\n onChange?.(next);\n setInputValue(\"\");\n setIsOpen(true);\n inputRef.current?.focus();\n };\n\n const removeValue = (v: string | number) => {\n onChange?.(value.filter((x) => x !== v));\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n switch (e.key) {\n case \"Backspace\":\n if (inputValue === \"\" && value.length > 0) {\n e.preventDefault();\n onChange?.(value.slice(0, -1));\n }\n return;\n case \"ArrowDown\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n if (flatItems.length > 0) setHighlightedIndex(0);\n } else if (flatItems.length > 0) {\n setHighlightedIndex((i) => (i + 1) % flatItems.length);\n }\n return;\n case \"ArrowUp\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n if (flatItems.length > 0)\n setHighlightedIndex(flatItems.length - 1);\n } else if (flatItems.length > 0) {\n setHighlightedIndex(\n (i) => (i <= 0 ? flatItems.length : i) - 1,\n );\n }\n return;\n case \"Enter\":\n if (isOpen && highlightedIndex >= 0 && flatItems[highlightedIndex]) {\n e.preventDefault();\n selectItem(flatItems[highlightedIndex]);\n }\n return;\n case \"Escape\":\n if (isOpen) {\n e.preventDefault();\n closeMenu();\n }\n return;\n case \"Home\":\n if (isOpen && flatItems.length > 0) {\n e.preventDefault();\n setHighlightedIndex(0);\n }\n return;\n case \"End\":\n if (isOpen && flatItems.length > 0) {\n e.preventDefault();\n setHighlightedIndex(flatItems.length - 1);\n }\n return;\n default:\n return;\n }\n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const next = e.relatedTarget as Node | null;\n if (next && containerRef.current?.contains(next)) return;\n closeMenu();\n };\n\n const toggleDropdown = () => {\n if (disabled) return;\n if (isOpen) {\n setIsOpen(false);\n } else {\n openMenu();\n }\n inputRef.current?.focus();\n };\n\n const renderOption = (option: MultiSelectOption, idx: number, isLast: boolean) => {\n const selected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={`${styles.option} ${\n highlightedIndex === idx ? styles.optionFocused : \"\"\n } ${selected ? styles.optionSelected : \"\"} ${\n option.disabled ? styles.optionDisabled : \"\"\n } ${isLast ? styles.optionLast : \"\"}`}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={option.disabled || undefined}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => {\n if (highlightedIndex !== idx) setHighlightedIndex(idx);\n }}\n onClick={() => selectItem(option)}\n >\n <span className={styles.optionLabel}>{option.label}</span>\n {selected && (\n <svg\n className={styles.optionCheck}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={`${styles.multiSelect} ${className ?? \"\"}`}\n >\n <div className={`${styles.control} ${disabled ? styles.disabled : \"\"}`}>\n <div\n className={styles.valueContainer}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) {\n e.preventDefault();\n inputRef.current?.focus();\n openMenu();\n }\n }}\n >\n {selectedOptions.map((option) => (\n <div key={option.value} className={styles.multiValue}>\n <span className={styles.multiValueLabel}>{option.label}</span>\n <button\n type=\"button\"\n className={styles.multiValueRemove}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => removeValue(option.value)}\n disabled={disabled}\n aria-label={`Remove ${option.label}`}\n >\n ×\n </button>\n </div>\n ))}\n <input\n ref={inputRef}\n id={id}\n name={name}\n className={styles.input}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n setIsOpen(true);\n setHighlightedIndex(0);\n }}\n onKeyDown={handleInputKeyDown}\n onFocus={openMenu}\n onBlur={handleInputBlur}\n placeholder={selectedOptions.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-autocomplete=\"list\"\n />\n </div>\n <button\n type=\"button\"\n className={styles.dropdownIndicator}\n onMouseDown={(e) => e.preventDefault()}\n onClick={toggleDropdown}\n disabled={disabled}\n aria-label=\"Toggle menu\"\n tabIndex={-1}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n </button>\n </div>\n\n {isOpen && (\n <div className={`${styles.menu} ${styles.menuOpen}`} role=\"listbox\">\n <div className={styles.menuList}>\n {preferred.length > 0 && (\n <>\n <div className={styles.groupHeading}>Preferred</div>\n {preferred.map((option, i) =>\n renderOption(\n option,\n i,\n i === preferred.length - 1 && others.length === 0,\n ),\n )}\n </>\n )}\n {others.length > 0 && (\n <>\n {preferred.length > 0 && (\n <>\n <div className={styles.groupSeparator} />\n <div className={styles.groupHeading}>All</div>\n </>\n )}\n {others.map((option, i) =>\n renderOption(\n option,\n preferred.length + i,\n i === others.length - 1,\n ),\n )}\n </>\n )}\n {preferred.length === 0 && others.length === 0 && (\n <div className={styles.noOptions}>No options found</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default MultiSelect;\n","import React from \"react\";\nimport styles from \"./SelectField.module.css\";\n\nexport interface SelectFieldOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectFieldProps {\n id?: string;\n name?: string;\n value?: string | number;\n options: SelectFieldOption[];\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n onChange?: (value: string | number) => void;\n onBlur?: (event: React.FocusEvent<HTMLSelectElement>) => void;\n onFocus?: (event: React.FocusEvent<HTMLSelectElement>) => void;\n}\n\nconst SelectField: React.FC<SelectFieldProps> = ({\n id,\n name,\n value,\n options = [],\n placeholder = \"Select an option\",\n disabled = false,\n className = \"\",\n onChange,\n onBlur,\n onFocus,\n}) => {\n const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const selectedValue = event.target.value;\n const option = options.find(\n (opt) => opt.value.toString() === selectedValue\n );\n\n if (option && onChange) {\n onChange(option.value);\n }\n };\n\n return (\n <div className={`${styles.selectField} ${className}`}>\n <select\n id={id}\n name={name}\n value={value || \"\"}\n disabled={disabled}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n className={styles.select}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option, i) => (\n <option key={`${i}`} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\nexport default SelectField;\n\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M353.286,163.919c16.464,0,29.815,13.351,29.815,29.822%20c0,16.467-13.351,29.819-29.815,29.819c-16.47,0-29.822-13.352-29.822-29.819C323.464,177.27,336.816,163.919,353.286,163.919%20L353.286,163.919z%20M245.838,163.919c16.47,0,29.822,13.351,29.822,29.822c0,16.467-13.352,29.819-29.822,29.819%20c-16.471,0-29.822-13.352-29.822-29.819C216.016,177.27,229.367,163.919,245.838,163.919L245.838,163.919z%20M354.093,338.178%20c22.575,0,40.874,18.299,40.874,40.87c0,22.571-18.299,40.87-40.874,40.87c-22.568,0-40.867-18.299-40.867-40.87%20C313.226,356.477,331.525,338.178,354.093,338.178L354.093,338.178z%20M245.024,338.178c22.575,0,40.874,18.299,40.874,40.87%20c0,22.571-18.299,40.87-40.874,40.87c-22.568,0-40.874-18.299-40.874-40.87C204.151,356.477,222.457,338.178,245.024,338.178%20L245.024,338.178z%20M406.906,244.769c22.575,0,40.874,18.299,40.874,40.87s-18.299,40.87-40.874,40.87%20c-22.568,0-40.867-18.299-40.867-40.87S384.338,244.769,406.906,244.769L406.906,244.769z%20M192.211,244.769%20c22.568,0,40.874,18.299,40.874,40.87s-18.306,40.87-40.874,40.87c-22.575,0-40.874-18.299-40.874-40.87%20S169.636,244.769,192.211,244.769L192.211,244.769z%20M299.559,244.769c22.575,0,40.874,18.299,40.874,40.87%20s-18.299,40.87-40.874,40.87c-22.569,0-40.868-18.299-40.868-40.87S276.99,244.769,299.559,244.769L299.559,244.769z%20M452.99,131.334H146.127c-32.625,37.291-50.332,84.551-50.332,134.107c0,112.541,91.226,203.765,203.764,203.765%20c112.544,0,203.764-91.223,203.764-203.765C503.323,215.889,485.608,168.622,452.99,131.334L452.99,131.334z%20M471.276,105.109%20l-4.672-4.998h-334.09l-4.672,4.998c-40.739,43.6-63.267,100.662-63.267,160.332c0,129.775,105.21,234.988,234.984,234.988%20c129.774,0,234.984-105.213,234.984-234.988C534.542,205.771,512.015,148.709,471.276,105.109L471.276,105.109z%20M480.204,60.027%20H118.914C61.952,110.158,26,183.596,26,265.441C26,416.523,148.48,539,299.559,539c151.085,0,273.558-122.477,273.558-273.559%20C573.117,183.596,537.165,110.158,480.204,60.027z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M228.887,396.793c20.779,0,37.62,16.841,37.62,37.617%20c0,20.773-16.841,37.617-37.62,37.617c-20.773,0-37.613-16.844-37.613-37.617C191.274,413.634,208.115,396.793,228.887,396.793%20L228.887,396.793z%20M366.03,396.793c20.773,0,37.614,16.841,37.614,37.617c0,20.773-16.841,37.617-37.614,37.617%20c-20.779,0-37.62-16.844-37.62-37.617C328.41,413.634,345.251,396.793,366.03,396.793L366.03,396.793z%20M228.375,325.684%20c-29.03,0-55.41,11.868-74.52,30.976c-41.566,41.573-41.566,113.923,0,155.497c19.111,19.111,45.49,30.979,74.52,30.979h138.168%20c29.023,0,55.41-11.868,74.521-30.979c41.565-41.566,41.565-113.928,0-155.497c-18.336-18.336-43.379-30.003-71.019-30.916%20c63.723-27.868,105.151-90.836,105.151-160.733c0-42.14-13.276-74.632-37.316-108.359H161.794%20c-24.033,33.747-37.309,66.2-37.309,108.359c0,69.852,41.359,132.758,105.012,160.674H228.375L228.375,325.684z%20M366.543,357.791%20H228.375c-20.163,0-38.513,8.265-51.824,21.569c-29.023,29.027-29.023,81.069,0,110.096c13.311,13.308,31.654,21.569,51.824,21.569%20h138.168c20.17,0,38.513-8.261,51.824-21.569c29.023-29.027,29.023-81.069,0-110.096%20C405.056,366.057,386.706,357.791,366.543,357.791L366.543,357.791z%20M421.17,88.762c14.523,23.018,21.915,49.024,21.915,76.248%20c0,79.121-64.131,143.245-143.248,143.245S156.595,244.127,156.595,165.01c0-27.234,7.392-53.222,21.915-76.248H421.17%20L421.17,88.762z%20M331.075,225.95c11.726,0,21.236,9.511,21.236,21.236c0,11.733-9.511,21.24-21.236,21.24%20c-11.733,0-21.236-9.507-21.236-21.24C309.839,235.461,319.342,225.95,331.075,225.95L331.075,225.95z%20M268.605,225.95%20c11.726,0,21.243,9.511,21.243,21.236c0,11.733-9.518,21.24-21.243,21.24c-11.726,0-21.236-9.507-21.236-21.24%20C247.369,235.461,256.879,225.95,268.605,225.95L268.605,225.95z%20M236.882,163.754c11.726,0,21.243,9.508,21.243,21.236%20c0,11.729-9.518,21.24-21.243,21.24c-11.726,0-21.236-9.511-21.236-21.24C215.646,173.261,225.156,163.754,236.882,163.754%20L236.882,163.754z%20M299.837,163.754c11.732,0,21.243,9.508,21.243,21.236c0,11.729-9.511,21.24-21.243,21.24%20c-11.726,0-21.236-9.511-21.236-21.24C278.6,173.261,288.111,163.754,299.837,163.754L299.837,163.754z%20M362.798,163.754%20c11.726,0,21.236,9.508,21.236,21.236c0,11.729-9.511,21.24-21.236,21.24c-11.733,0-21.236-9.511-21.236-21.24%20C341.562,173.261,351.065,163.754,362.798,163.754L362.798,163.754z%20M332.079,116.228c6.86,0,12.417,5.561,12.417,12.417%20c0,6.86-5.558,12.425-12.417,12.425s-12.424-5.566-12.424-12.425C319.654,121.79,325.219,116.228,332.079,116.228L332.079,116.228z%20M267.601,116.228c6.86,0,12.425,5.561,12.425,12.417c0,6.86-5.565,12.425-12.425,12.425c-6.86,0-12.417-5.566-12.417-12.425%20C255.184,121.79,260.742,116.228,267.601,116.228L267.601,116.228z%20M177.153,7.87C129.219,7.87,90,47.086,90,95.02v408.83%20c0,47.934,39.219,87.15,87.153,87.15h246.024c47.934,0,87.147-39.216,87.147-87.15V95.02c0-47.934-39.213-87.15-87.147-87.15%20H177.153z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M407.111,334.214c16.317,0,29.543,13.226,29.543,29.543%20c0,16.313-13.227,29.543-29.543,29.543c-16.31,0-29.536-13.229-29.536-29.543C377.576,347.44,390.802,334.214,407.111,334.214%20L407.111,334.214z%20M198.69,334.214c16.317,0,29.543,13.226,29.543,29.543c0,16.313-13.226,29.543-29.543,29.543%20s-29.543-13.229-29.543-29.543C169.147,347.44,182.373,334.214,198.69,334.214L198.69,334.214z%20M227.94,180.772%20c24.971,0,45.213,20.242,45.213,45.213c0,24.967-20.243,45.213-45.213,45.213s-45.213-20.245-45.213-45.213%20C182.727,201.014,202.969,180.772,227.94,180.772L227.94,180.772z%20M377.868,180.772c24.968,0,45.213,20.242,45.213,45.213%20c0,24.967-20.245,45.213-45.213,45.213c-24.974,0-45.213-20.245-45.213-45.213C332.655,201.014,352.894,180.772,377.868,180.772%20L377.868,180.772z%20M302.899,361.142c24.974,0,45.22,20.243,45.22,45.213s-20.245,45.213-45.22,45.213%20c-24.968,0-45.21-20.243-45.21-45.213S277.931,361.142,302.899,361.142L302.899,361.142z%20M302.899,100.142%20c-111.485,0-201.855,90.37-201.855,201.858c0,111.489,90.37,201.859,201.855,201.859c111.491,0,201.865-90.37,201.865-201.859%20C504.764,190.512,414.391,100.142,302.899,100.142L302.899,100.142z%20M302.899,69.21C174.338,69.21,70.113,173.44,70.113,302%20c0,128.561,104.226,232.79,232.787,232.79c128.56,0,232.793-104.229,232.793-232.79C535.692,173.44,431.459,69.21,302.899,69.21%20L302.899,69.21z%20M302.899,31C153.234,31,31.902,152.328,31.902,302c0,149.669,121.331,271,270.997,271%20c149.672,0,271.006-121.331,271.006-271C573.906,152.328,452.571,31,302.899,31z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M246.063,132.777c18.959,0,34.335,15.373,34.335,34.332%20c0,18.965-15.376,34.335-34.335,34.335c-18.961,0-34.332-15.37-34.332-34.335C211.731,148.15,227.102,132.777,246.063,132.777%20L246.063,132.777z%20M357.555,132.777c18.962,0,34.332,15.373,34.332,34.332c0,18.962-15.37,34.335-34.332,34.335%20c-18.961,0-34.331-15.373-34.331-34.335C323.224,148.15,338.594,132.777,357.555,132.777L357.555,132.777z%20M226.875,253.708%20c9.286,0,16.811,7.525,16.811,16.808c0,9.286-7.525,16.811-16.811,16.811c-9.283,0-16.808-7.525-16.808-16.811%20C210.066,261.234,217.592,253.708,226.875,253.708L226.875,253.708z%20M371.359,253.708c9.286,0,16.815,7.525,16.815,16.808%20c0,9.286-7.529,16.811-16.815,16.811c-9.279,0-16.808-7.525-16.808-16.811C354.552,261.234,362.08,253.708,371.359,253.708%20L371.359,253.708z%20M236.304,421.639c19.179,0,34.731,15.548,34.731,34.731c0,19.179-15.552,34.731-34.731,34.731%20c-19.179,0-34.731-15.552-34.731-34.731C201.573,437.187,217.126,421.639,236.304,421.639L236.304,421.639z%20M362.924,421.639%20c19.179,0,34.728,15.548,34.728,34.731c0,19.179-15.549,34.731-34.728,34.731c-19.186,0-34.735-15.552-34.735-34.731%20C328.189,437.187,343.738,421.639,362.924,421.639L362.924,421.639z%20M235.828,355.985c-26.801,0-51.159,10.958-68.804,28.6%20c-38.377,38.383-38.377,105.184,0,143.567c17.645,17.645,42.004,28.602,68.804,28.602h127.568c26.803,0,51.159-10.957,68.804-28.602%20c38.377-38.377,38.377-105.19,0-143.567c-16.91-16.91-39.994-27.679-65.481-28.542c57.148-25.011,97.033-82.036,97.033-148.405%20c0-88.133-70.984-161.938-161.945-161.938c-90.131,0-161.935,73.009-161.935,161.938c0,66.315,39.821,123.302,96.895,148.348%20H235.828L235.828,355.985z%20M159.969,344.666c-6.378,4.464-12.357,9.488-17.866,14.999c-52.137,52.134-52.137,141.271-0.003,193.407%20C167.008,577.982,200.589,592,235.828,592h127.568c35.24,0,68.823-14.018,93.729-38.927c52.137-52.134,52.137-141.276,0-193.41%20c-4.761-4.761-9.874-9.155-15.287-13.143c36.523-36.834,57.159-86.685,57.159-138.883c0-108.993-88.188-197.184-197.19-197.184%20c-108.977,0-197.181,88.207-197.181,197.184C104.627,258.933,124.557,307.996,159.969,344.666L159.969,344.666z%20M363.396,385.629%20H235.828c-18.617,0-35.559,7.631-47.846,19.914c-26.797,26.8-26.797,74.85,0,101.65c12.287,12.286,29.225,19.914,47.846,19.914%20h127.568c18.623,0,35.559-7.628,47.849-19.914c26.797-26.8,26.797-74.85,0-101.65C398.955,393.259,382.013,385.629,363.396,385.629%20L363.396,385.629z%20M301.808,75.381c-73.808,0-132.256,59.869-132.256,132.256c0,72.383,58.448,132.256,132.256,132.256%20c73.815,0,132.265-59.87,132.265-132.256C434.073,135.248,375.622,75.381,301.808,75.381L301.808,75.381z%20M301.808,271.807%20c13.689,0,24.784,11.098,24.784,24.781c0,13.686-11.094,24.78-24.784,24.78c-13.686,0-24.777-11.094-24.777-24.78%20C277.03,282.905,288.122,271.807,301.808,271.807z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M460.592,75.695C501.794,116.897,525,172.38,525,230.692v136.191%20c0,58.315-23.206,113.795-64.408,154.997c-86.029,86.032-228.158,86.032-314.186,0C105.203,480.679,82,425.199,82,366.884V230.692%20c0-58.312,23.203-113.795,64.405-154.997C232.433-10.337,374.563-10.337,460.592,75.695L460.592,75.695z%20M434.493,101.794%20c-71.625-71.628-190.365-71.628-261.989,0c-33.068,33.068-53.597,78.696-53.597,128.898v136.191%20c0,50.205,20.529,95.834,53.597,128.898c71.624,71.628,190.364,71.628,261.989,0c33.067-33.064,53.596-78.693,53.596-128.898%20V230.692C488.089,180.49,467.56,134.862,434.493,101.794L434.493,101.794z%20M195.699,124.99%20c-27.134,27.137-43.982,64.557-43.982,105.702v136.191c0,41.146,16.848,78.568,43.982,105.702%20c58.806,58.814,156.791,58.814,215.598,0c27.138-27.134,43.982-64.557,43.982-105.702V230.692%20c0-41.146-16.845-78.566-43.982-105.702C352.491,66.18,254.506,66.18,195.699,124.99L195.699,124.99z%20M303.497,401.594%20c-17.304,0-31.334,14.029-31.334,31.337c0,17.304,14.03,31.333,31.334,31.333c17.307,0,31.337-14.029,31.337-31.333%20C334.834,415.623,320.804,401.594,303.497,401.594L303.497,401.594z%20M223.204,305.993c-17.308,0-31.338,14.03-31.338,31.334%20c0,17.308,14.03,31.337,31.338,31.337c17.307,0,31.337-14.029,31.337-31.337C254.541,320.023,240.511,305.993,223.204,305.993%20L223.204,305.993z%20M223.204,208.881c-17.308,0-31.338,14.026-31.338,31.334c0,17.307,14.03,31.337,31.338,31.337%20c17.307,0,31.337-14.03,31.337-31.337C254.541,222.907,240.511,208.881,223.204,208.881L223.204,208.881z%20M383.796,305.993%20c-17.308,0-31.338,14.03-31.338,31.334c0,17.308,14.03,31.337,31.338,31.337c17.307,0,31.333-14.029,31.333-31.337%20C415.129,320.023,401.103,305.993,383.796,305.993L383.796,305.993z%20M383.796,208.881c-17.308,0-31.338,14.026-31.338,31.334%20c0,17.307,14.03,31.337,31.338,31.337c17.307,0,31.333-14.03,31.333-31.337C415.129,222.907,401.103,208.881,383.796,208.881%20L383.796,208.881z%20M354.769,129.256c-12.585,0-22.786,10.201-22.786,22.786s10.2,22.786,22.786,22.786%20c12.585,0,22.786-10.201,22.786-22.786S367.354,129.256,354.769,129.256L354.769,129.256z%20M252.228,129.256%20c-12.585,0-22.786,10.201-22.786,22.786s10.2,22.786,22.786,22.786c12.585,0,22.786-10.201,22.786-22.786%20S264.813,129.256,252.228,129.256z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M17%2012.8108C17%2013.1901%2016.898%2013.5661%2016.6687%2013.8682C15.2357%2015.7558%2012.784%2017%2010%2017C7.21614%2017%204.76431%2015.7557%203.33134%2013.8681C3.10199%2013.566%203%2013.1901%203%2012.8108V7.18924C3%206.80993%203.10199%206.43401%203.33134%206.13189C4.76431%204.24428%207.21614%203%2010%203C12.784%203%2015.2357%204.24423%2016.6687%206.13183C16.898%206.43395%2017%206.80986%2017%207.18918V12.8108ZM10%207C10.5522%207%2011%206.55231%2011%206C11%205.44769%2010.5522%205%2010%205C9.44775%205%209%205.44769%209%206C9%206.55231%209.44775%207%2010%207ZM6.5%2011.5C7.32837%2011.5%208%2010.8284%208%2010C8%209.17157%207.32837%208.5%206.5%208.5C5.67163%208.5%205%209.17157%205%2010C5%2010.8284%205.67163%2011.5%206.5%2011.5ZM11.5%2013.5C11.5%2014.3284%2010.8284%2015%2010%2015C9.17163%2015%208.5%2014.3284%208.5%2013.5C8.5%2012.6716%209.17163%2012%2010%2012C10.8284%2012%2011.5%2012.6716%2011.5%2013.5ZM13.5%2011.5C14.3284%2011.5%2015%2010.8284%2015%2010C15%209.17157%2014.3284%208.5%2013.5%208.5C12.6716%208.5%2012%209.17157%2012%2010C12%2010.8284%2012.6716%2011.5%2013.5%2011.5Z'%20fill='currentColor'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M10%201C13.8106%201%2017.1182%202.95715%2018.7732%205.82595C18.9298%206.09752%2019%206.40872%2019%206.72224V13.2778C19%2013.5913%2018.9298%2013.9025%2018.7732%2014.1741C17.1182%2017.0429%2013.8106%2019%2010%2019C6.18943%2019%202.88177%2017.0429%201.22682%2014.1741C1.07016%2013.9025%201%2013.5913%201%2013.2778V6.72224C1%206.40872%201.07016%206.09752%201.22682%205.82595C2.88177%202.95715%206.18943%201%2010%201ZM17.6711%205.64554C17.8973%205.95002%2018%206.32536%2018%206.70467V13.2953C18%2013.6746%2017.8973%2014.05%2017.6711%2014.3545C16.0408%2016.5488%2013.214%2018%2010%2018C6.78594%2018%203.95915%2016.5488%202.32887%2014.3544C2.10268%2014.0499%202%2013.6746%202%2013.2953V6.70472C2%206.32542%202.10268%205.95008%202.32887%205.64561C3.95915%203.45116%206.78594%202%2010%202C13.214%202%2016.0408%203.45116%2017.6711%205.64554Z'%20fill='currentColor'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M395.264,259.724c21.074,0,38.157,17.083,38.157,38.158%20c0,21.074-17.083,38.164-38.157,38.164c-21.075,0-38.165-17.09-38.165-38.164C357.099,276.806,374.189,259.724,395.264,259.724%20L395.264,259.724z%20M206.743,259.724c21.075,0,38.158,17.083,38.158,38.158c0,21.074-17.083,38.164-38.158,38.164%20c-21.074,0-38.164-17.09-38.164-38.164C168.579,276.806,185.669,259.724,206.743,259.724L206.743,259.724z%20M317.092,89.755v29.841%20h-32.183V89.755c-67.083,5.031-127.459,41.741-163.107,98.796v223.399c35.648,57.055,96.024,93.765,163.107,98.802v-29.841h32.183%20v29.841c67.084-5.038,127.459-41.747,163.114-98.802V188.551C444.551,131.496,384.176,94.787,317.092,89.755L317.092,89.755z%20M301,56.962c-85.858,0-165.124,45.192-209.061,118.921l-2.328,3.902v90.784H58.612v59.364h30.999v90.784l2.328,3.902%20C135.876,498.348,215.143,543.539,301,543.539c85.857,0,165.123-45.184,209.06-118.921l2.328-3.902v-90.784h31.006v-59.364h-31.006%20v-90.784l-2.328-3.902C466.124,102.147,386.857,56.962,301,56.962L301,56.962z%20M301,18.251c-155.741,0-282,126.253-282,282%20c0,155.741,126.26,282,282,282c155.747,0,282-126.26,282-282C583,144.504,456.747,18.251,301,18.251z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M261.067,178.239c0,7.551,2.198,14.579,5.985,20.491l20.49-20.491%20l-20.49-20.491C263.265,163.659,261.067,170.694,261.067,178.239L261.067,178.239z%20M298.999,216.171%20c-7.545,0-14.58-2.198-20.488-5.981l20.488-20.491l20.491,20.491C313.581,213.972,306.55,216.171,298.999,216.171L298.999,216.171z%20M336.934,178.239c0-7.545-2.198-14.58-5.985-20.491l-20.491,20.491l20.491,20.491C334.736,192.818,336.934,185.79,336.934,178.239%20L336.934,178.239z%20M319.49,146.295l-20.491,20.484l-20.488-20.484c5.907-3.79,12.943-5.988,20.488-5.988%20C306.55,140.307,313.581,142.505,319.49,146.295L319.49,146.295z%20M298.999,124.101c29.864,0,54.141,24.281,54.141,54.138%20c0,29.864-24.277,54.145-54.141,54.145c-29.858,0-54.138-24.281-54.138-54.145C244.861,148.382,269.141,124.101,298.999,124.101%20L298.999,124.101z%20M261.067,417.863c0,7.551,2.198,14.579,5.985,20.491l20.49-20.491l-20.49-20.491%20C263.265,403.283,261.067,410.319,261.067,417.863L261.067,417.863z%20M298.999,455.795c-7.545,0-14.58-2.198-20.488-5.981%20l20.488-20.491l20.491,20.491C313.581,453.597,306.55,455.795,298.999,455.795L298.999,455.795z%20M336.934,417.863%20c0-7.545-2.198-14.58-5.985-20.491l-20.491,20.491l20.491,20.491C334.736,432.443,336.934,425.415,336.934,417.863L336.934,417.863z%20M319.49,385.92l-20.491,20.484l-20.488-20.484c5.907-3.79,12.943-5.988,20.488-5.988C306.55,379.931,313.581,382.13,319.49,385.92%20L319.49,385.92z%20M298.999,363.725c29.864,0,54.141,24.281,54.141,54.138c0,29.864-24.277,54.145-54.141,54.145%20c-29.858,0-54.138-24.281-54.138-54.145C244.861,388.007,269.141,363.725,298.999,363.725L298.999,363.725z%20M180.188,239.928%20c30.094,0,54.49,24.4,54.49,54.494c0,30.095-24.396,54.494-54.49,54.494c-30.095,0-54.494-24.399-54.494-54.494%20C125.694,264.327,150.093,239.928,180.188,239.928L180.188,239.928z%20M417.816,239.928c30.094,0,54.494,24.4,54.494,54.494%20c0,30.095-24.4,54.494-54.494,54.494c-30.095,0-54.494-24.399-54.494-54.494C363.323,264.327,387.722,239.928,417.816,239.928%20L417.816,239.928z%20M298.999,86.511c116.835,0,211.544,94.708,211.544,211.54c0,116.84-94.708,211.54-211.544,211.54%20c-116.836,0-211.54-94.708-211.54-211.54C87.458,181.219,182.163,86.511,298.999,86.511L298.999,86.511z%20M298.999,54.1%20c134.73,0,243.955,109.225,243.955,243.951c0,134.727-109.225,243.952-243.955,243.952c-134.727,0-243.952-109.225-243.952-243.952%20C55.047,163.324,164.271,54.1,298.999,54.1L298.999,54.1z%20M298.999,14.053C455.846,14.053,583,141.2,583,298.051%20c0,156.844-127.154,283.999-284.001,283.999C142.151,582.049,15,454.895,15,298.051C15,141.2,142.151,14.053,298.999,14.053z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M449.833,45.125C531.521,95.36,586,185.558,586,288.497%20c0,157.672-127.825,285.497-285.503,285.497C142.822,573.994,15,446.169,15,288.497C15,185.558,69.476,95.36,151.167,45.125H449.833%20L449.833,45.125z%20M193.639,256.195c-29.46,0-53.343,23.89-53.343,53.35c0,29.46,23.882,53.343,53.343,53.343%20c29.46,0,53.346-23.882,53.346-53.343C246.985,280.085,223.099,256.195,193.639,256.195L193.639,256.195z%20M407.365,256.195%20c-29.46,0-53.35,23.89-53.35,53.35c0,29.46,23.89,53.343,53.35,53.343c29.46,0,53.343-23.882,53.343-53.343%20C460.708,280.085,436.826,256.195,407.365,256.195L407.365,256.195z%20M442.248,88.407l-4.308-3.053H163.052l-4.304,3.053%20c-64.954,46.088-103.49,120.43-103.49,200.09c0,135.438,109.801,245.239,245.239,245.239c135.437,0,245.245-109.801,245.245-245.239%20C545.742,208.837,507.203,134.495,442.248,88.407L442.248,88.407z%20M427.607,117.937H173.391%20c-54.002,40.321-85.547,103.142-85.547,170.56c0,117.449,95.204,212.656,212.653,212.656c117.455,0,212.663-95.207,212.663-212.656%20C513.16,221.08,481.609,158.258,427.607,117.937L427.607,117.937z%20M300.497,215.65c-11.384,0-20.614,9.226-20.614,20.613%20c0,11.387,9.23,20.614,20.614,20.614c11.387,0,20.62-9.226,20.62-20.614C321.117,224.876,311.883,215.65,300.497,215.65%20L300.497,215.65z%20M300.497,146.275c-11.384,0-20.614,9.226-20.614,20.614c0,11.387,9.23,20.62,20.614,20.62%20c11.387,0,20.62-9.233,20.62-20.62C321.117,155.501,311.883,146.275,300.497,146.275L300.497,146.275z%20M381.735,146.275%20c-11.387,0-20.613,9.226-20.613,20.614c0,11.387,9.226,20.62,20.613,20.62c11.387,0,20.613-9.233,20.613-20.62%20C402.348,155.501,393.122,146.275,381.735,146.275L381.735,146.275z%20M219.265,146.275c-11.387,0-20.616,9.226-20.616,20.614%20c0,11.387,9.23,20.62,20.616,20.62c11.387,0,20.617-9.233,20.617-20.62C239.882,155.501,230.652,146.275,219.265,146.275%20L219.265,146.275z%20M300.497,400.094c-18.881,0-34.186,15.309-34.186,34.189c0,18.887,15.305,34.189,34.186,34.189%20c18.887,0,34.189-15.302,34.189-34.189C334.686,415.403,319.384,400.094,300.497,400.094L300.497,400.094z%20M381.735,417.199%20c-11.387,0-20.613,9.233-20.613,20.62c0,11.38,9.226,20.614,20.613,20.614c11.387,0,20.613-9.233,20.613-20.614%20C402.348,426.433,393.122,417.199,381.735,417.199L381.735,417.199z%20M219.265,417.199c-11.387,0-20.616,9.233-20.616,20.62%20c0,11.38,9.23,20.614,20.616,20.614c11.387,0,20.617-9.233,20.617-20.614C239.882,426.433,230.652,417.199,219.265,417.199z'/%3e%3c/svg%3e\"","import ICON_IEC_62196_T2 from \"../assets/connectors/type2.svg\";\nimport ICON_IEC_62196_T2_COMBO from \"../assets/connectors/combo2.svg\";\nimport ICON_IEC_62196_T1 from \"../assets/connectors/type1.svg\";\nimport ICON_IEC_62196_T1_COMBO from \"../assets/connectors/combo1.svg\";\nimport ICON_IEC_62196_T3 from \"../assets/connectors/type3.svg\";\nimport ICON_IEC_62196_T3A from \"../assets/connectors/type3a.svg\";\nimport ICON_SCHUKO from \"../assets/connectors/schuko.svg\";\nimport ICON_CHADEMO from \"../assets/connectors/chademo.svg\";\nimport ICON_CATARC from \"../assets/connectors/catarc.svg\";\n\nexport default {\n // IEC 62196 Types\n IEC_62196_T1: ICON_IEC_62196_T1,\n IEC_62196_T1_COMBO: ICON_IEC_62196_T1_COMBO,\n IEC_62196_T2: ICON_IEC_62196_T2,\n IEC_62196_T2_COMBO: ICON_IEC_62196_T2_COMBO,\n IEC_62196_T3: ICON_IEC_62196_T3,\n IEC_62196_T3A: ICON_IEC_62196_T3A,\n IEC_62196_T3B: ICON_IEC_62196_T3,\n IEC_62196_T3C: ICON_IEC_62196_T3, // Using T3 as fallback\n\n // DC Fast Charging\n CHADEMO: ICON_CHADEMO,\n CHAOJI: ICON_CHADEMO, // Using CHADEMO as fallback for CHAOJI\n CATARC: ICON_CATARC,\n GBT_AC: ICON_CATARC, // Using CATARC as fallback for GBT AC\n GBT_DC: ICON_CATARC, // Using CATARC as fallback for GBT DC\n\n // AC Domestic Types (using SCHUKO as fallback for most domestic types)\n SCHUKO: ICON_SCHUKO,\n DOMESTIC_A: ICON_SCHUKO,\n DOMESTIC_B: ICON_SCHUKO,\n DOMESTIC_C: ICON_SCHUKO,\n DOMESTIC_D: ICON_SCHUKO,\n DOMESTIC_E: ICON_SCHUKO,\n DOMESTIC_F: ICON_SCHUKO,\n DOMESTIC_G: ICON_SCHUKO,\n DOMESTIC_H: ICON_SCHUKO,\n DOMESTIC_I: ICON_SCHUKO,\n DOMESTIC_J: ICON_SCHUKO,\n DOMESTIC_K: ICON_SCHUKO,\n DOMESTIC_L: ICON_SCHUKO,\n DOMESTIC_M: ICON_SCHUKO,\n DOMESTIC_N: ICON_SCHUKO,\n DOMESTIC_O: ICON_SCHUKO,\n\n // IEC 60309 Industrial Types (using SCHUKO as fallback)\n IEC_60309_2_SINGLE_16: ICON_SCHUKO,\n IEC_60309_2_THREE_16: ICON_SCHUKO,\n IEC_60309_2_THREE_32: ICON_SCHUKO,\n IEC_60309_2_THREE_64: ICON_SCHUKO,\n\n // NEMA Types (using SCHUKO as fallback)\n NEMA_5_20: ICON_SCHUKO,\n NEMA_6_30: ICON_SCHUKO,\n NEMA_6_50: ICON_SCHUKO,\n NEMA_10_30: ICON_SCHUKO,\n NEMA_10_50: ICON_SCHUKO,\n NEMA_14_30: ICON_SCHUKO,\n NEMA_14_50: ICON_SCHUKO,\n\n // Pantograph Types (using CHADEMO as fallback)\n PANTOGRAPH_BOTTOM_UP: ICON_CHADEMO,\n PANTOGRAPH_TOP_DOWN: ICON_CHADEMO,\n\n // Tesla Types (using CHADEMO as fallback)\n TESLA_R: ICON_CHADEMO,\n TESLA_S: ICON_CHADEMO,\n\n // Legacy CONNECTOR_STANDARD_TYPE mappings\n CONNECTOR_STANDARD_TYPE_CHADEMO: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_CHAOJI: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_CATARC: ICON_CATARC,\n CONNECTOR_STANDARD_TYPE_SCHUKO: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_A: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_B: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_C: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_D: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_E: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_F: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_G: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_H: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_I: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_J: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_K: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_L: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_M: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_N: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_O: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_GBT_AC: ICON_CATARC,\n CONNECTOR_STANDARD_TYPE_GBT_DC: ICON_CATARC,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_SINGLE_16: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_THREE_16: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_THREE_32: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_THREE_64: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T1: ICON_IEC_62196_T1,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T1_COMBO: ICON_IEC_62196_T1_COMBO,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T2: ICON_IEC_62196_T2,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T2_COMBO: ICON_IEC_62196_T2_COMBO,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T3A: ICON_IEC_62196_T3A,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T3C: ICON_IEC_62196_T3,\n CONNECTOR_STANDARD_TYPE_NEMA_5_20: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_6_30: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_6_50: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_10_30: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_10_50: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_14_30: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_14_50: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_PANTOGRAPH_BOTTOM_UP: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_PANTOGRAPH_TOP_DOWN: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_TESLA_R: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_TESLA_S: ICON_CHADEMO,\n};\n","export const defaultFilter = {\n minPower: 7,\n operator: [],\n status: [],\n publishingMode: \"\",\n connectorTypes: [],\n chargingAccessibility: \"ALL\",\n noAdditionalCharges: false,\n powerType: undefined,\n operatorOnly: \"\",\n remoteStartStop: false,\n searchPhrase: \"\",\n excludeOperator: [],\n authMethodCapabilities: [],\n // amount per kWh in the map currency; undefined is no limit\n maxEnergyPrice: undefined,\n};\n\nexport function hasFilters(filter) {\n const hasFilters =\n (filter.minPower && filter.minPower !== defaultFilter.minPower) ||\n filter?.status?.length ||\n filter?.connectorTypes?.length ||\n (filter?.chargingAccessibility &&\n filter?.chargingAccessibility !== defaultFilter.chargingAccessibility) ||\n filter?.operator?.length ||\n filter?.powerType ||\n filter?.partyId ||\n filter?.noAdditionalCharges ||\n filter?.operatorOnly ||\n filter?.remoteStartStop ||\n filter?.searchPhrase ||\n filter?.excludeOperator?.length ||\n filter?.authMethodCapabilities?.length ||\n typeof filter?.maxEnergyPrice === \"number\";\n\n return !!hasFilters;\n}\n","import React, { useEffect, useReducer, useRef } from \"react\";\n\nimport styles from \"./filters.module.css\";\nimport Checkbox from \"../../components/Checkbox/Checkbox\";\nimport Range from \"../../components/Range/Range\";\nimport MultiSelect from \"../../components/MultiSelect/MultiSelect\";\nimport SelectField from \"../../components/SelectField/SelectField\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport connectorIcons from \"../../components/connectorIcons\";\nimport { useStackContext } from \"../../components/Stack/Stack\";\nimport { defaultFilter } from \"../../utils/filters\";\nimport { formatEnergyPrice, priceTicks } from \"../../utils/price\";\nimport {\n getStatusFilterOptions,\n toggleOption,\n} from \"../../utils/statusFilters\";\nimport { atLeast } from \"../../utils/version\";\n\nconst authMethodCapabilityOptions = [\n {\n value: \"AUTH_METHOD_CAPABILITY_PLUG_AND_CHARGE\",\n labelKey: \"filters.authCapability.plugAndCharge\" as const,\n },\n {\n value: \"AUTH_METHOD_CAPABILITY_CREDIT_CARD_PAYABLE\",\n labelKey: \"filters.authCapability.creditCard\" as const,\n },\n];\n\n// confirm if this a correct,\nconst powerRanges = [\n {\n label: 3,\n value: 3,\n },\n {\n label: 7,\n value: 7,\n },\n {\n label: 11,\n value: 11,\n },\n {\n label: 22,\n value: 22,\n },\n {\n label: 43,\n value: 43,\n },\n {\n label: 50,\n value: 50,\n },\n {\n label: 100,\n value: 100,\n },\n {\n label: 150,\n value: 150,\n },\n {\n label: 200,\n value: 200,\n },\n {\n label: \"250+\",\n value: 250,\n },\n];\n\nfunction useLocalState(initialState) {\n return useReducer((currentState, updatedState) => {\n return { ...currentState, ...updatedState };\n }, initialState);\n}\n\nexport default function FiltersScreen() {\n const {\n setFilters: applyFilters,\n t,\n filters: contextFilters,\n filterConfiguration,\n options,\n mapKind,\n currency,\n language,\n } = useMapContext();\n // start from whatever is already applied (a status pill may have set a\n // filter before this panel opened) so mounting never clears it\n const [filters, setFilters] = useLocalState({\n ...defaultFilter,\n ...contextFilters,\n });\n\n // the price filter exists on v3 maps only: earlier API versions carry no\n // price on the buckets, so a limit there would hide locations silently\n const showPriceFilter =\n atLeast(options.version, \"v3\") && filterConfiguration?.showPriceFilter;\n const priceLimit =\n typeof filters.maxEnergyPrice === \"number\"\n ? formatEnergyPrice(language, {\n amount: filters.maxEnergyPrice,\n currency,\n })\n : undefined;\n\n const { setView: setParentView } = useStackContext();\n\n const showOperatorFilter =\n atLeast(options.version, \"v2\") &&\n filterConfiguration?.operators?.length > 1;\n\n // filters can also change outside this panel while it is open (a click on a\n // status pill); pick those up, but skip the echo of our own applyFilters call\n const lastApplied = useRef<any>();\n useEffect(() => {\n if (lastApplied.current && contextFilters !== lastApplied.current) {\n setFilters(contextFilters);\n }\n }, [contextFilters]);\n\n useEffect(() => {\n lastApplied.current = filters;\n applyFilters(filters);\n }, [filters]);\n\n return (\n <>\n <div className={styles.headerContainer}>\n <div className={styles.header}>{t(\"filters.header\")}</div>\n </div>\n\n <div className={styles.container}>\n <button\n onClick={() => {\n setFilters(defaultFilter);\n applyFilters(defaultFilter);\n }}\n className={styles.actionLinkClearAll}\n >\n {t(\"filters.clearAll\")}\n </button>\n\n {atLeast(options.version, \"v2\") &&\n filterConfiguration?.showSearchPhraseFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.searchPhrase\")}</div>\n <input\n type=\"text\"\n value={filters.searchPhrase || \"\"}\n placeholder={t(\"filters.searchPhrasePlaceholder\")}\n onChange={(e) => setFilters({ searchPhrase: e.target.value })}\n style={{\n width: \"100%\",\n boxSizing: \"border-box\",\n padding: \"8px 10px\",\n fontFamily: \"var(--roadmap-font-family, Inter), system-ui\",\n fontSize: 14,\n lineHeight: \"20px\",\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n background: \"var(--roadmap-background-color, #fff)\",\n border: \"1px solid var(--roadmap-border-color, #ddd)\",\n borderRadius: 6,\n outline: \"none\",\n }}\n />\n </div>\n )}\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.onlyShow\")}</div>\n <label htmlFor=\"dsChargers\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.dcChargers\")}</div>\n <Checkbox\n id=\"dsChargers\"\n checked={filters.powerType === \"dc\"}\n onChange={(checked) => {\n setFilters({\n powerType: checked ? \"dc\" : undefined,\n });\n }}\n />\n </label>\n\n {!atLeast(options.version, \"v2\") && (\n <label htmlFor=\"efluxChargers\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.efluxChargers\")}</div>\n <Checkbox\n id=\"efluxChargers\"\n checked={filters.partyId === \"EFL\"}\n onChange={(checked) => {\n setFilters({\n partyId: checked ? \"EFL\" : undefined,\n });\n }}\n />\n </label>\n )}\n\n {(!atLeast(options.version, \"v2\") ||\n filterConfiguration?.showNoAdditionalFeeFilter) && (\n <label htmlFor=\"noAdditionalFee\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.noAdditionalFee\")}</div>\n <Checkbox\n id=\"noAdditionalFee\"\n checked={filters.noAdditionalCharges}\n onChange={(checked) => {\n setFilters({\n noAdditionalCharges: checked ? true : undefined,\n });\n }}\n />\n </label>\n )}\n\n <label htmlFor=\"remoteStartStop\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.remoteStartStop\")}</div>\n <Checkbox\n id=\"remoteStartStop\"\n checked={filters.remoteStartStop}\n onChange={(checked) => {\n setFilters({\n remoteStartStop: checked ? true : undefined,\n });\n }}\n />\n </label>\n\n {filterConfiguration.showOperatorOnly &&\n atLeast(options.version, \"v2\") && (\n <label htmlFor=\"operatorOnly\" className={styles.rowLabel}>\n <div\n className={styles.label}\n >{`Show '${filterConfiguration.showOperatorOnly}' only`}</div>\n <Checkbox\n id=\"operatorOnly\"\n checked={\n filters.operatorOnly ===\n filterConfiguration.showOperatorOnly\n }\n onChange={(checked) => {\n setFilters({\n operatorOnly: checked\n ? filterConfiguration.showOperatorOnly\n : undefined,\n });\n }}\n />\n </label>\n )}\n </div>\n\n {showOperatorFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.operator\")}</div>\n <MultiSelect\n id=\"operator\"\n preferredValues={options.preferredOperators}\n value={filters.operator}\n options={[\n ...(filterConfiguration?.operators?.map((operator: any) => ({\n value: operator?.connectionId,\n label: operator?.name,\n selected: filters.operators?.includes(operator?.connectionId),\n })) || []),\n ]}\n placeholder=\"Select operator\"\n onChange={(value) => {\n setFilters({\n operator: value,\n });\n }}\n />\n </div>\n )}\n\n {showOperatorFilter &&\n filterConfiguration?.showExcludeOperatorFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>\n {t(\"filters.excludeOperator\")}\n </div>\n <MultiSelect\n id=\"excludeOperator\"\n preferredValues={options.preferredOperators}\n value={filters.excludeOperator}\n options={[\n ...(filterConfiguration?.operators?.map((operator: any) => ({\n value: operator?.connectionId,\n label: operator?.name,\n selected: filters.excludeOperator?.includes(\n operator?.connectionId,\n ),\n })) || []),\n ]}\n placeholder={t(\"filters.excludeOperator\")}\n onChange={(value) => {\n setFilters({\n excludeOperator: value,\n });\n }}\n />\n </div>\n )}\n\n {filterConfiguration?.showPublishingModeFilter &&\n filterConfiguration?.publishingMode?.length > 1 && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{\"Visibility\"}</div>\n <SelectField\n id=\"publishingMode\"\n value={filters.publishingMode}\n options={[\n { value: \"\", label: \"All locations\" },\n {\n value: \"PUBLISHING_MODE_PUBLIC\",\n label: \"Public locations\",\n },\n {\n value: \"PUBLISHING_MODE_PRIVATE\",\n label: \"Private locations\",\n },\n ]}\n onChange={(value) => {\n setFilters({ publishingMode: value });\n }}\n />\n </div>\n )}\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.statusHeading\")}</div>\n\n {/* CPO maps filter on connector OCPP status, roaming maps on EVSE status;\n the kind comes from the map key's remote config */}\n {getStatusFilterOptions(mapKind, options.version).map((option) => (\n <label\n key={option.id}\n htmlFor={option.id}\n className={styles.rowLabel}\n >\n <div className={styles.label}>\n <div\n className={styles.dot}\n style={{ background: option.color }}\n />\n {t(option.labelKey)}\n </div>\n <Checkbox\n id={option.id}\n name=\"status\"\n checked={option.values.every((value) =>\n filters.status.includes(value),\n )}\n onChange={(checked) => {\n setFilters({\n status: toggleOption(\n checked ? \"add\" : \"remove\",\n filters.status,\n option.values,\n ),\n });\n }}\n />\n </label>\n ))}\n </div>\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.chargingPower\")}</div>\n <Range\n value={filters.minPower}\n onChange={(value) => {\n setFilters({ minPower: value });\n }}\n ticks={powerRanges}\n />\n </div>\n\n {showPriceFilter && (\n <div className={styles.optionsGroup}>\n <div\n className={styles.heading}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n }}\n >\n <span>{t(\"filters.maxEnergyPrice\")}</span>\n {priceLimit && (\n <span\n style={{\n fontFamily:\n '\"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontWeight: 500,\n color: \"var(--roadmap-brand-color, #ff3d00)\",\n }}\n >\n {priceLimit}\n </span>\n )}\n </div>\n <Range\n value={filters.maxEnergyPrice}\n onChange={(value) => {\n setFilters({ maxEnergyPrice: value });\n }}\n ticks={priceTicks(language, currency, t(\"filters.anyPrice\"))}\n />\n </div>\n )}\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.connectorType\")}</div>\n\n <label htmlFor=\"type1\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T1}\n className={styles.connectorIcon}\n />\n Type 1 (Yazaki)\n </div>\n <Checkbox\n id=\"type1\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T1\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T1\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T1\",\n ),\n });\n }}\n />\n </label>\n\n <label htmlFor=\"type2\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T2}\n className={styles.connectorIcon}\n />\n Type 2 (Mennekes)\n </div>\n <Checkbox\n id=\"type2\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T2\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T2\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T2\",\n ),\n });\n }}\n />\n </label>\n <label htmlFor=\"type3\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T3}\n className={styles.connectorIcon}\n />\n Type 3 (Le Grand)\n </div>\n <Checkbox\n id=\"type3\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T3A\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T3A\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T3A\",\n ),\n });\n }}\n />\n </label>\n <label htmlFor=\"CHAdeMo\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.CHADEMO}\n className={styles.connectorIcon}\n />\n CHAdeMo\n </div>\n <Checkbox\n id=\"CHAdeMo\"\n checked={filters.connectorTypes.includes(\"CHADEMO\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"CHADEMO\"]\n : filters.connectorTypes.filter((s) => s !== \"CHADEMO\"),\n });\n }}\n />\n </label>\n <label htmlFor=\"domestic\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.DOMESTIC_F}\n className={styles.connectorIcon}\n />\n Domestic\n </div>\n <Checkbox\n id=\"domestic\"\n checked={filters.connectorTypes.includes(\"DOMESTIC_F\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"DOMESTIC_F\"]\n : filters.connectorTypes.filter((s) => s !== \"DOMESTIC_F\"),\n });\n }}\n />\n </label>\n <label htmlFor=\"combo\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T2_COMBO}\n className={styles.connectorIcon}\n />\n Combo\n </div>\n <Checkbox\n id=\"combo\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T2_COMBO\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T2_COMBO\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T2_COMBO\",\n ),\n });\n }}\n />\n </label>\n </div>\n\n {atLeast(options.version, \"v2\") &&\n filterConfiguration?.showPaymentMethodFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>\n {t(\"filters.authMethodCapabilities\")}\n </div>\n {authMethodCapabilityOptions.map((capability) => {\n const id = `auth-${capability.value}`;\n const checked =\n filters.authMethodCapabilities?.includes(capability.value) ??\n false;\n return (\n <label\n key={capability.value}\n htmlFor={id}\n className={styles.rowLabel}\n >\n <div className={styles.label}>{t(capability.labelKey)}</div>\n <Checkbox\n id={id}\n checked={checked}\n onChange={(isChecked) => {\n setFilters({\n authMethodCapabilities: toggleOption(\n isChecked ? \"add\" : \"remove\",\n filters.authMethodCapabilities || [],\n [capability.value],\n ),\n });\n }}\n />\n </label>\n );\n })}\n </div>\n )}\n\n {filterConfiguration?.showVehicleAvailabilityFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>\n {t(\"filters.chargingAccessibility\")}\n </div>\n <SelectField\n id=\"chargingAccessibility\"\n value={filters.chargingAccessibility || \"ALL\"}\n options={[\n { value: \"ALL\", label: t(\"filters.accessibilityAll\") },\n { value: \"TESLA\", label: t(\"filters.accessibilityTesla\") },\n ]}\n onChange={(value) => {\n setFilters({\n chargingAccessibility: value,\n });\n }}\n />\n </div>\n )}\n </div>\n </>\n );\n}\n","import React, { useEffect } from \"react\";\n\nimport styles from \"./LocationPlaceholder.module.css\";\n\nexport default function LocationPlaceholder() {\n return (\n <div className={styles.container}>\n {/* put in place holders */}\n <div className={styles.header} />\n\n <div className={styles.divider} style={{ marginTop: '15px', marginBottom: '23px' }} />\n\n <div className={styles.iconLine} style={{ width: '60%' }} />\n <div className={styles.iconLine} style={{ width: '45%' }} />\n <div className={styles.iconLine} style={{ width: '50%' }} />\n\n <div className={styles.divider} />\n\n <div className={styles.iconLine} style={{ width: '50%' }} />\n <div className={styles.iconLine} style={{ width: '62%' }} />\n\n <div className={styles.priceLine} />\n\n <div className={styles.divider} />\n\n <div className={styles.iconLine} style={{ width: '50%' }} />\n <div className={styles.iconLine} style={{ width: '57%' }} />\n\n <div className={styles.priceLine} style={{ width: '30%' }} />\n </div>\n );\n}\n\n","import React from \"react\";\n\nexport function ChevronLeft() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 320 512\"\n width=\"12\"\n height=\"12\"\n fill=\"currentColor\"\n >\n <path d=\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l192 192c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 246.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-192 192z\" />\n </svg>\n );\n}\n\nexport function ChevronRight() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 320 512\"\n width=\"12\"\n height=\"12\"\n fill=\"currentColor\"\n >\n <path d=\"M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\" />\n </svg>\n );\n}\n\nexport function ChevronDown() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 320\"\n width=\"10\"\n height=\"10\"\n fill=\"currentColor\"\n >\n <path d=\"M233.4 310.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 242.7 86.6 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\" />\n </svg>\n );\n}\n\nexport function Clock() {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8 0.25C3.72 0.25 0.25 3.72 0.25 8s3.47 7.75 7.75 7.75S15.75 12.28 15.75 8 12.28 0.25 8 0.25zm0 14C4.55 14.25 1.75 11.45 1.75 8S4.55 1.75 8 1.75 14.25 4.55 14.25 8 11.45 14.25 8 14.25zM8.75 4.25a0.75 0.75 0 0 0-1.5 0v4c0 0.2 0.08 0.39 0.22 0.53l2.5 2.5a0.75 0.75 0 1 0 1.06-1.06L8.75 7.94V4.25z\" />\n </svg>\n );\n}\n\nexport function Check() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n >\n <path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06 0l-3-3a.75.75 0 1 1 1.06-1.06L5.75 11.19l6.97-6.97a.75.75 0 0 1 1.06 0z\" />\n </svg>\n );\n}\n\nexport function Info() {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g>\n <path d=\"M8 0.25C3.72009 0.25 0.25 3.72134 0.25 8C0.25 12.2812 3.72009 15.75 8 15.75C12.2799 15.75 15.75 12.2812 15.75 8C15.75 3.72134 12.2799 0.25 8 0.25ZM8 14.25C4.54588 14.25 1.75 11.4553 1.75 8C1.75 4.54703 4.546 1.75 8 1.75C11.4528 1.75 14.25 4.54597 14.25 8C14.25 11.4541 11.4553 14.25 8 14.25ZM8 3.6875C8.72487 3.6875 9.3125 4.27513 9.3125 5C9.3125 5.72487 8.72487 6.3125 8 6.3125C7.27513 6.3125 6.6875 5.72487 6.6875 5C6.6875 4.27513 7.27513 3.6875 8 3.6875ZM9.75 11.625C9.75 11.8321 9.58209 12 9.375 12H6.625C6.41791 12 6.25 11.8321 6.25 11.625V10.875C6.25 10.6679 6.41791 10.5 6.625 10.5H7V8.5H6.625C6.41791 8.5 6.25 8.33209 6.25 8.125V7.375C6.25 7.16791 6.41791 7 6.625 7H8.625C8.83209 7 9 7.16791 9 7.375V10.5H9.375C9.58209 10.5 9.75 10.6679 9.75 10.875V11.625Z\" />\n </g>\n </svg>\n );\n}\n\n","import React from \"react\";\n\nimport styles from \"./SidebarContainer.module.css\";\n\nexport default function SideBarContainer({ children }) {\n return <div className={styles.container}>{children}</div>;\n}\n\n","import SideBarContainer from \"../SidebarContainer/SidebarContainer\";\nimport styles from \"./Debug.module.css\";\n\nexport default function Debug({ location }) {\n return (\n <div className={styles.container}>\n <SideBarContainer>\n <div>\n <h3>Debug: {location.name}</h3>\n </div>\n <div style={{ marginBottom: \"5px\" }}>\n <button\n onClick={() => {\n navigator.clipboard.writeText(JSON.stringify(location, null, 2));\n }}\n >\n Copy location\n </button>\n </div>\n <div className={styles.content}>\n {location.evses.map((evse) => {\n return (\n <div className={styles.evse}>\n <div className={styles.connectorHeader}>\n Evse: {evse.evseId || evse.evse_id}\n </div>\n <div>\n {evse.connectors.map((connector, i) => {\n return (\n <div>\n <div className={styles.connectorHeader}>\n Connector #{i}\n </div>\n <pre className={styles.code}>\n {JSON.stringify(\n connector.tariff || Array.isArray(location.tariffs)\n ? location.tariffs?.find((t) =>\n connector.tariff_ids.includes(t.id),\n )\n : null,\n null,\n 2,\n )}\n </pre>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </SideBarContainer>\n </div>\n );\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='18'%20height='16'%20viewBox='0%200%2018%2016'%20fill='none'%3e%3cg%20clip-path='url(%23clip0_480_2466)'%3e%3cpath%20d='M3.76781%207H5.0925L4.81812%208.71156C4.77812%208.85969%204.9075%209%205.07875%209C5.17188%209%205.26156%208.95719%205.31063%208.88313L7.40219%205.78062C7.50531%205.62469%207.37656%205.42875%207.17031%205.42875H5.88219L6.14094%204.295C6.18625%204.14625%206.05781%204.00031%205.88219%204.00031H4.36438C4.23%204.00031%204.11656%204.08719%204.09875%204.20375L3.50187%206.735C3.48094%206.87531%203.60594%207%203.76781%207ZM17.5%204H17V2.5C17%202.22375%2016.7763%202%2016.5%202C16.2237%202%2016%202.22375%2016%202.5V4H15V2.5C15%202.22375%2014.7762%202%2014.5%202C14.2238%202%2014%202.22375%2014%202.5V4H13.5C13.2238%204%2013%204.22375%2013%204.5V6C13%207.1175%2013.7381%208.05281%2014.75%208.37281V11.625C14.75%2012.1075%2014.3575%2012.5%2013.875%2012.5C13.3925%2012.5%2013%2012.1075%2013%2011.625V10.75C13%209.23344%2011.7666%208%2010.25%208H10V1.5C10%200.671562%209.32844%200%208.5%200H2.5C1.67156%200%201%200.671562%201%201.5V14.5H0.25C0.111875%2014.5%200%2014.6119%200%2014.75V15.75C0%2015.8881%200.111875%2016%200.25%2016H10.75C10.8881%2016%2011%2015.8881%2011%2015.75V14.75C11%2014.6119%2010.8881%2014.5%2010.75%2014.5H10V9.5H10.25C10.9394%209.5%2011.5%2010.0606%2011.5%2010.75V11.625C11.5%2012.9347%2012.5653%2014%2013.875%2014C15.1847%2014%2016.25%2012.9347%2016.25%2011.625V8.37281C17.2619%208.05281%2018%207.1175%2018%206V4.5C18%204.22375%2017.7763%204%2017.5%204ZM8.5%2014.5H2.5V1.5H8.5V14.5ZM16.5%206C16.5%206.55125%2016.0513%207%2015.5%207C14.9487%207%2014.5%206.55125%2014.5%206V5.5H16.5V6Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_480_2466'%3e%3crect%20width='18'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='14'%20height='16'%20viewBox='0%200%2014%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_480_2468)'%3e%3cpath%20d='M4%204.625V3.375C4%203.16875%204.16875%203%204.375%203H5.625C5.83125%203%206%203.16875%206%203.375V4.625C6%204.83125%205.83125%205%205.625%205H4.375C4.16875%205%204%204.83125%204%204.625ZM8.375%205H9.625C9.83125%205%2010%204.83125%2010%204.625V3.375C10%203.16875%209.83125%203%209.625%203H8.375C8.16875%203%208%203.16875%208%203.375V4.625C8%204.83125%208.16875%205%208.375%205ZM4.375%208H5.625C5.83125%208%206%207.83125%206%207.625V6.375C6%206.16875%205.83125%206%205.625%206H4.375C4.16875%206%204%206.16875%204%206.375V7.625C4%207.83125%204.16875%208%204.375%208ZM8.375%208H9.625C9.83125%208%2010%207.83125%2010%207.625V6.375C10%206.16875%209.83125%206%209.625%206H8.375C8.16875%206%208%206.16875%208%206.375V7.625C8%207.83125%208.16875%208%208.375%208ZM6%2010.625V9.375C6%209.16875%205.83125%209%205.625%209H4.375C4.16875%209%204%209.16875%204%209.375V10.625C4%2010.8313%204.16875%2011%204.375%2011H5.625C5.83125%2011%206%2010.8313%206%2010.625ZM8.375%2011H9.625C9.83125%2011%2010%2010.8313%2010%2010.625V9.375C10%209.16875%209.83125%209%209.625%209H8.375C8.16875%209%208%209.16875%208%209.375V10.625C8%2010.8313%208.16875%2011%208.375%2011ZM14%2014.875V16H0V14.875C0%2014.6687%200.16875%2014.5%200.375%2014.5H0.984375V0.75C0.984375%200.334375%201.31875%200%201.73438%200H12.2656C12.6812%200%2013.0156%200.334375%2013.0156%200.75V14.5H13.625C13.8313%2014.5%2014%2014.6687%2014%2014.875ZM2.48438%2014.4688H6V12.375C6%2012.1687%206.16875%2012%206.375%2012H7.625C7.83125%2012%208%2012.1687%208%2012.375V14.4688H11.5156V1.53125L2.5%201.5L2.48438%2014.4688Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_480_2468'%3e%3crect%20width='14'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='20'%20height='16'%20viewBox='0%200%2020%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M17%206H16.5L13.1003%201.75063C12.913%201.51641%2012.6754%201.32734%2012.405%201.19741C12.1347%201.06747%2011.8387%201.00001%2011.5387%201H4.85406C4.03625%201%203.30094%201.49781%202.99719%202.25719L1.5%206V6.07062C0.63875%206.29375%200%207.06906%200%208V11.5C0%2011.7762%200.22375%2012%200.5%2012H2C2%2013.6569%203.34312%2015%205%2015C6.65688%2015%208%2013.6569%208%2012H12C12%2013.6569%2013.3431%2015%2015%2015C16.6569%2015%2018%2013.6569%2018%2012H19.5C19.7763%2012%2020%2011.7762%2020%2011.5V9C20%207.34312%2018.6569%206%2017%206ZM8.75%202.5H11.5387C11.6916%202.5%2011.8338%202.56844%2011.9291%202.6875L14.5791%206H8.75V2.5ZM4.38969%202.81437C4.46625%202.62344%204.64844%202.5%204.85406%202.5H7.25V6H3.11562L4.38969%202.81437ZM5%2013.5C4.17156%2013.5%203.5%2012.8284%203.5%2012C3.5%2011.1716%204.17156%2010.5%205%2010.5C5.82844%2010.5%206.5%2011.1716%206.5%2012C6.5%2012.8284%205.82844%2013.5%205%2013.5ZM15%2013.5C14.1716%2013.5%2013.5%2012.8284%2013.5%2012C13.5%2011.1716%2014.1716%2010.5%2015%2010.5C15.8284%2010.5%2016.5%2011.1716%2016.5%2012C16.5%2012.8284%2015.8284%2013.5%2015%2013.5ZM18.5%2010.5H17.5841C17.0644%209.60719%2016.1078%209%2015%209C13.8922%209%2012.9359%209.60719%2012.4159%2010.5H7.58406C7.06437%209.60719%206.10781%209%205%209C3.89219%209%202.93594%209.60719%202.41594%2010.5H1.5V8C1.5%207.72437%201.72438%207.5%202%207.5H17C17.8272%207.5%2018.5%208.17281%2018.5%209V10.5Z'%20fill='black'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='12'%20height='16'%20viewBox='0%200%2012%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_480_2435)'%3e%3cpath%20d='M11.8068%205.24687C11.5506%204.8%2011.0849%204.53125%2010.5693%204.53125H7.61932L8.51619%201.79688C8.63182%201.36563%208.54119%200.9125%208.26932%200.55625C7.99432%200.203125%207.57869%200%207.13182%200H3.05369C2.34118%200%201.73181%200.534375%201.65368%201.15937L0.0161813%207.79063C-0.0431938%208.22188%200.0849314%208.65625%200.369307%208.98438C0.653682%209.3125%201.06618%209.5%201.50056%209.5H4.56619L3.47556%2014.2406C3.37556%2014.6688%203.47244%2015.1125%203.74431%2015.4563C4.01619%2015.8031%204.42556%2016%204.86619%2016C5.37556%2016%205.85057%2015.725%206.07869%2015.325L11.8037%206.67812C12.0662%206.23125%2012.0662%205.69375%2011.8068%205.24687ZM5.00369%2014.2937L6.45057%208H1.48493L3.05369%201.5L7.04119%201.47187L5.54744%206.03125H10.4381L5.00369%2014.2937Z'%20fill='%232A2A2A'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_480_2435'%3e%3crect%20width='12'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='18'%20height='12'%20viewBox='0%200%2018%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M16.2857%200H0.857143C0.383839%200%200%200.383839%200%200.857143V11.1429C0%2011.6162%200.383839%2012%200.857143%2012H16.2857C16.759%2012%2017.1429%2011.6162%2017.1429%2011.1429V0.857143C17.1429%200.383839%2016.759%200%2016.2857%200ZM15.8571%2010.7143H1.28571V1.28571H15.8571V10.7143ZM7.92857%207.71429H10.0714C10.1898%207.71429%2010.2857%207.61839%2010.2857%207.5V6.64286C10.2857%206.52446%2010.1898%206.42857%2010.0714%206.42857H7.92857C7.81018%206.42857%207.71429%206.52446%207.71429%206.64286V7.5C7.71429%207.61839%207.81018%207.71429%207.92857%207.71429ZM14.3571%206.42857H12.2143C12.0959%206.42857%2012%206.52446%2012%206.64286V7.5C12%207.61839%2012.0959%207.71429%2012.2143%207.71429H14.3571C14.4755%207.71429%2014.5714%207.61839%2014.5714%207.5V6.64286C14.5714%206.52446%2014.4755%206.42857%2014.3571%206.42857ZM7.92857%205.57143H14.3571C14.4755%205.57143%2014.5714%205.47554%2014.5714%205.35714V4.5C14.5714%204.38161%2014.4755%204.28571%2014.3571%204.28571H7.92857C7.81018%204.28571%207.71429%204.38161%207.71429%204.5V5.35714C7.71429%205.47554%207.81018%205.57143%207.92857%205.57143ZM3.60857%206.04607L4.73866%206.3525C4.85089%206.38304%204.92857%206.47437%204.92857%206.57482C4.92857%206.70339%204.80804%206.80786%204.65911%206.80786H3.95357C3.84241%206.80786%203.73312%206.78%203.6383%206.72884C3.5558%206.68411%203.45509%206.69214%203.3908%206.76045L3.0675%207.10143C2.9842%207.18929%202.99786%207.33286%203.09777%207.40116C3.32009%207.5525%203.58152%207.63902%203.85714%207.65616V7.92857C3.85714%208.04696%203.95304%208.14286%204.07143%208.14286H4.5C4.61839%208.14286%204.71429%208.04696%204.71429%207.92857V7.65402C5.30839%207.62455%205.78571%207.15661%205.78571%206.57455C5.78571%206.08786%205.44768%205.65634%204.96286%205.52536L3.83277%205.21893C3.72054%205.18839%203.64286%205.09705%203.64286%204.99661C3.64286%204.86804%203.76339%204.76357%203.91232%204.76357H4.61786C4.72902%204.76357%204.8383%204.79143%204.93312%204.84259C5.01562%204.88705%205.11634%204.87929%205.18062%204.81098L5.50393%204.47C5.58723%204.38214%205.57357%204.23857%205.47366%204.17027C5.25134%204.01893%204.98991%203.93241%204.71429%203.91527V3.64286C4.71429%203.52446%204.61839%203.42857%204.5%203.42857H4.07143C3.95304%203.42857%203.85714%203.52446%203.85714%203.64286V3.91741C3.26304%203.94688%202.78571%204.41482%202.78571%204.99688C2.78571%205.48357%203.12375%205.91509%203.60857%206.04607Z'%20fill='%232A2A2A'/%3e%3c/svg%3e\"","import { getStatusColor } from \"./status\";\n\n// getColorForStatus accepts roaming EVSE and connector OCPP status names, bare\n// or prefixed. See utils/status.ts for the mapping.\nexport function getColorForStatus(status) {\n return getStatusColor(status);\n}\n","import connectorIcons from \"../components/connectorIcons\";\nimport { MapContextType } from \"../contexts/Map\";\nimport { getColorForStatus } from \"./location\";\nimport { getStatusLabelKey } from \"./status\";\n\nexport function getSocketIcon(connector) {\n return connectorIcons[connector.standard || connector.connectorStandardType];\n}\n\nexport function formatNumber(language, value) {\n return new Intl.NumberFormat(language, {\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nexport const connectorPowerTypes = {\n CONNECTOR_POWER_TYPE_UNSPECIFIED: \"Unspecified\",\n CONNECTOR_POWER_TYPE_AC_1_PHASE: \"AC x 1\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE: \"AC x 2\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT: \"AC x 2 Split\",\n CONNECTOR_POWER_TYPE_AC_3_PHASE: \"AC x 3\",\n CONNECTOR_POWER_TYPE_DC: \"DC\",\n CONNECTOR_POWER_TYPE_AC: \"AC\",\n AC_3_PHASE: \"AC x 3\",\n AC_1_PHASE: \"AC x 1\",\n DC: \"DC\",\n};\n\nexport function getSocketText(connector) {\n return [\n formatConnectorStandard(\n connector.standard || connector.connectorStandardType,\n ),\n connectorPowerTypes[\n connector.powerType ||\n connector.power_type ||\n connector.connectorPowerType\n ],\n \"Socket\",\n ].join(\", \");\n}\n\nexport function formatConnectorStandard(value) {\n value = (value || \"\").replace(\"CONNECTOR_STANDARD_TYPE_\", \"\");\n\n if (value === \"IEC_62196_T1\") return \"Type 1\";\n if (value === \"IEC_62196_T1_COMBO\") return \"Type 1 Combo\";\n if (value === \"IEC_62196_T2\") return \"Type 2\";\n if (value === \"IEC_62196_T2_COMBO\") return \"Type 2 Combo\";\n if (value === \"IEC_62196_T3A\") return \"Type 3A\";\n if (value === \"IEC_62196_T3C\") return \"Type 3C\";\n if (value === \"CHADEMO\") return \"CHAdeMO\";\n if (value === \"DOMESTIC_F\") return \"Domestic F\";\n if (value === \"DOMESTIC_E\") return \"Domestic E\";\n if (value === \"DOMESTIC_B\") return \"Domestic B\";\n if (value === \"CATARC\") return \"Catarc\";\n return value;\n}\n\n// getStatusLabel renders a roaming EVSE or connector OCPP status name, bare or\n// prefixed, in the current language.\nexport function getStatusLabel(t: MapContextType[\"t\"], status) {\n return t(getStatusLabelKey(status));\n}\n\nexport function getLocationLabel(t: MapContextType[\"t\"], location) {\n if (location?.type === \"ON_STREET\") {\n return t(`locationType.onStreet`);\n }\n if (location?.type === \"PARKING_GARAGE\") {\n return t(`locationType.parkingGarage`);\n }\n if (location?.type === \"UNDERGROUND_GARAGE\") {\n return t(`locationType.undergroundGarage`);\n }\n if (location?.type === \"PARKING_LOT\") {\n return t(`locationType.parkingLot`);\n }\n\n return t(`locationType.other`);\n}\n\nexport function getStatusColorFromEvses(evses: any[] = []) {\n if (evses.some((evse) => evse.status === \"AVAILABLE\")) {\n return getColorForStatus(\"AVAILABLE\");\n }\n\n if (evses.some((evse) => evse.status === \"CHARGING\")) {\n return getColorForStatus(\"CHARGING\");\n }\n\n return getColorForStatus(\"UNKNOWN\");\n}\n","/**\n * Note there could be bugs here. This is waiting for the Temporal API\n * Or if we cant wait use a library like moment-timezone or similar for more reliable timezone support\n */\n\n// Return offset on date for loc in ±H[:mm] format. Minutes only included if not zero\n// This is a bit special see https://stackoverflow.com/questions/62130983/get-offset-of-the-other-location-in-javascript for explanation\nexport function getTimezoneOffset(date, timeZone) {\n // Try English to get offset. If get abbreviation, use French\n let offset;\n [\"en\", \"fr\"].some((lang) => {\n // Get parts - can't get just timeZoneName, must get one other part at least\n let parts = new Intl.DateTimeFormat(lang, {\n minute: \"numeric\",\n timeZone,\n timeZoneName: \"short\",\n }).formatToParts(date);\n // Get offset from parts\n let tzName = parts.filter(\n (part) => part.type == \"timeZoneName\" && part.value\n );\n // timeZoneName starting with GMT or UTC is offset - keep and stop looping\n // Otherwise it's an abbreviation, keep looping\n if (/^(GMT|UTC)/.test(tzName[0].value)) {\n offset = tzName[0].value.replace(/GMT|UTC/, \"\") || \"+0\";\n return true;\n }\n });\n // Format offset as ±HH:mm\n // Normalise minus sign as ASCII minus (charCode 45)\n let sign = offset[0] == \"\\x2b\" ? \"\\x2b\" : \"\\x2d\";\n let [h, m] = offset.substring(1).split(\":\");\n return sign + h.padStart(2, \"0\") + \":\" + (m || \"00\");\n}\n\n// Convert offset string in ±HH:mm to minutes\nfunction offsetToMins(offset) {\n let sign = /^-/.test(offset) ? -1 : 1;\n let [h, m] = offset.match(/\\d\\d/g);\n return sign * (h * 60 + Number(m));\n}\n\nfunction formatYMD(timeZone, date) {\n const z = (n) => (\"0\" + n).slice(-2);\n const { year, month, day } = new Intl.DateTimeFormat(\"en\", {\n timeZone: timeZone,\n })\n .formatToParts(date)\n .reduce((acc, part) => {\n acc[part.type] = part.value;\n return part;\n }, Object.create(null));\n return `${year}-${z(month)}-${z(day)}`;\n}\n\nexport function tzDate(timeZone, date = new Date()) {\n const offset = getTimezoneOffset(date, timeZone);\n const offMins = offsetToMins(offset);\n const d = new Date(+date);\n d.setUTCMinutes(d.getUTCMinutes() + offMins);\n return d;\n}\n\nexport function startOfDay(timeZone, date = new Date()) {\n const offset = getTimezoneOffset(date, timeZone);\n const offMins = offsetToMins(offset);\n const d = new Date(+date);\n d.setUTCHours(0, -offMins, 0, 0);\n // If date is + or - original date, adjust\n const oDateTS = formatYMD(timeZone, date);\n const sodDateTS = formatYMD(timeZone, d);\n if (sodDateTS > oDateTS) {\n d.setUTCDate(d.getUTCDate() - 1);\n } else if (sodDateTS < oDateTS) {\n d.setUTCDate(d.getUTCDate() + 1);\n }\n return d;\n}\n\nexport function endOfDate(timeZone, date = new Date()) {\n return new Date(startOfDay(timeZone, date).valueOf() + 86399999);\n}\n\n// Could be bugs here\nexport function getNextDayOfWeek(\n date: Date,\n dayOfWeek: number,\n timeZone?: string\n) {\n const resultDate = tzDate(timeZone, date);\n if (resultDate.getUTCDate() !== dayOfWeek) {\n resultDate.setUTCDate(\n date.getUTCDate() + ((7 + dayOfWeek - date.getUTCDay() - 1) % 7) + 1\n );\n }\n\n return {\n start: startOfDay(timeZone, resultDate),\n end: endOfDate(timeZone, resultDate),\n };\n}\n\nexport function getDay(date: Date, timeZone?: string) {\n return tzDate(timeZone, date).getUTCDay();\n}\n","import {\n TariffElement,\n TariffRestrictions,\n DayOfWeek,\n PriceComponent,\n OcpiTariff,\n OcpiTariffElement,\n} from \"../types\";\n\nimport { getDay, getNextDayOfWeek } from \"../utils/date\";\n\nexport function convertTimeToMinutes(time: string) {\n const [hours, minutes] = time.split(\":\");\n return parseInt(hours) * 60 + parseInt(minutes);\n}\n\nfunction convertToTimeSlot(element: TariffElement): Timeslot {\n if (!element?.restrictions?.startTime || !element?.restrictions?.endTime) {\n return {\n elements: [element],\n priceComponents: element.priceComponents,\n startTime: 0,\n endTime: 24 * 60,\n isFullDay: true,\n };\n }\n\n const startTime = convertTimeToMinutes(element.restrictions.startTime);\n const endTime = convertTimeToMinutes(element.restrictions.endTime);\n\n return {\n elements: [element],\n priceComponents: element.priceComponents,\n isFullDay: startTime === 0 && endTime === 24 * 60,\n startTime,\n endTime,\n };\n}\n\ntype Timeslot = {\n isActive?: boolean;\n isFullDay: boolean;\n startTime: number;\n endTime: number;\n elements?: TariffElement[];\n priceComponents: PriceComponent[];\n};\n\n// TODO write this nicer\nexport function getScheduleItems(\n items: Timeslot[],\n isDayActive: boolean,\n now: Date,\n): Timeslot[] {\n const currentTime = (now.getHours() * 60 + now.getMinutes()) % 60;\n\n if (items.length <= 1) {\n return items.map((item) => {\n item.isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime >= currentTime;\n\n return item;\n });\n }\n items = items.sort((a, b) => a.startTime - b.startTime);\n\n let scheduleItems = [items[0]];\n for (let i = 1; i < items.length; i++) {\n const current = items[i];\n\n const refItem = scheduleItems.findLast(\n (item) => item.startTime <= current.startTime,\n );\n if (!refItem) {\n scheduleItems = scheduleItems.filter(\n (item) => item.endTime > current.endTime,\n );\n scheduleItems.unshift(current);\n } else {\n const oldEndTime = refItem.endTime;\n refItem.endTime = current.startTime;\n\n const toAppend = [current];\n if (oldEndTime > current.endTime) {\n toAppend.push({\n ...refItem,\n startTime: current.endTime,\n endTime: oldEndTime,\n });\n }\n scheduleItems.splice(scheduleItems.indexOf(refItem) + 1, 0, ...toAppend);\n }\n\n let maxEndTime = 0;\n scheduleItems = scheduleItems\n .map((item, i) => {\n const prevItem = scheduleItems[i - 1];\n\n if (item.endTime > maxEndTime) {\n maxEndTime = item.endTime;\n } else {\n return null;\n }\n if (prevItem && prevItem.endTime !== item.startTime) {\n item.startTime = prevItem.endTime;\n }\n return item;\n })\n .filter(Boolean);\n }\n\n return scheduleItems.map((item) => {\n item.isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime >= currentTime;\n\n item.isFullDay = item.startTime === 0 && item.endTime === 24 * 60;\n\n return item;\n });\n}\n\nexport function isBaseTariffOCPI(tariffElement: OcpiTariffElement) {\n return (\n //elements without restrictions are always base tariff\n !tariffElement?.restrictions ||\n // elements without time restirctions are also base tariff\n (!tariffElement?.restrictions?.start_date &&\n !tariffElement?.restrictions?.end_date &&\n !tariffElement?.restrictions?.start_time &&\n !tariffElement?.restrictions?.end_time &&\n !tariffElement?.restrictions?.day_of_week &&\n !tariffElement?.restrictions?.day_of_week)\n );\n}\n\nexport function isBaseTarif(tariffElement: TariffElement) {\n return (\n //elements without restrictions are always base tariff\n !tariffElement?.restrictions ||\n // elements without time restirctions are also base tariff\n (!tariffElement?.restrictions?.startDate &&\n !tariffElement?.restrictions?.endDate &&\n !tariffElement?.restrictions?.startTime &&\n !tariffElement?.restrictions?.startTime &&\n !tariffElement?.restrictions?.dayOfWeek)\n );\n}\n\ntype DynamicTariff = {\n date: Date;\n items: Timeslot[];\n};\n\ntype getDynamicTariffProps = {\n elements: TariffElement[];\n limit?: number;\n now: Date;\n};\n\nexport function getDynamicTariffOCPI(\n elements: OcpiTariffElement[],\n limit: number = 6,\n now: Date = new Date(),\n): DynamicTariff[] {\n const filteredElements = [...elements]\n .filter((c) => !isBaseTariffOCPI(c))\n .map((el) => {\n return {\n ...el,\n restrictions: {\n _startDate: new Date(\n `${el.restrictions.start_date}T${el.restrictions.start_time}`,\n ),\n ...el.restrictions,\n },\n };\n })\n .sort((a, b) => {\n return (\n a.restrictions._startDate.valueOf() -\n b.restrictions._startDate.valueOf()\n );\n })\n .filter((c) => {\n return (\n c.restrictions._startDate.valueOf() > now.valueOf() - 180 * 60 * 1000\n );\n })\n .slice(0, limit);\n\n const splitByDay = filteredElements.reduce((acc, curr) => {\n const day = curr.restrictions._startDate.getDate();\n acc[day] = {\n date: new Date(curr.restrictions.start_date),\n items: [...(acc[day]?.items || []), curr],\n };\n return acc;\n }, []);\n\n return Object.keys(splitByDay).map((key) => {\n const { date, items }: { date: Date; items: any[] } = splitByDay[key];\n const formattedItems = items\n .map(({ restrictions, ...c }) => {\n const { _startDate, ...partialRestrictions } = restrictions;\n return {\n ...c,\n restrictions: {\n ...partialRestrictions,\n },\n };\n })\n .map(convertToTimeSlot)\n .map((item) => {\n const isDayActive = getDay(now) === getDay(date);\n const currentTime = now.getHours() * 60 + now.getMinutes();\n\n const isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime - 1 >= currentTime;\n\n return {\n ...item,\n isActive,\n };\n });\n\n return {\n date,\n items: formattedItems,\n };\n });\n}\n\nexport function getDynamicTariff({\n elements,\n limit = 6,\n now = new Date(),\n}: getDynamicTariffProps): DynamicTariff[] {\n const filteredElements = [...elements]\n .filter((c) => !isBaseTarif(c))\n .map((el) => {\n // we are displaying these in the local timezone\n return {\n ...el,\n restrictions: {\n _startDate: new Date(\n `${el.restrictions.startDate}T${el.restrictions.startTime}`,\n ),\n ...el.restrictions,\n },\n };\n })\n .sort((a, b) => {\n return (\n a.restrictions._startDate.valueOf() -\n b.restrictions._startDate.valueOf()\n );\n })\n .filter((c) => {\n return (\n c.restrictions._startDate.valueOf() > now.valueOf() - 180 * 60 * 1000\n );\n })\n .slice(0, limit);\n\n const splitByDay = filteredElements.reduce((acc, curr) => {\n const day = curr.restrictions._startDate.getDate();\n acc[day] = {\n date: new Date(curr.restrictions.startDate),\n items: [...(acc[day]?.items || []), curr],\n };\n return acc;\n }, []);\n\n return Object.keys(splitByDay).map((key) => {\n const { date, items }: { date: Date; items: any[] } = splitByDay[key];\n const formattedItems = items\n .map(({ restrictions, ...c }) => {\n const { _startDate, ...partialRestrictions } = restrictions;\n return {\n ...c,\n restrictions: {\n ...partialRestrictions,\n },\n };\n })\n .map(convertToTimeSlot)\n .map((item) => {\n const isDayActive = getDay(now) === getDay(date);\n const currentTime = now.getHours() * 60 + now.getMinutes();\n\n const isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime - 1 >= currentTime;\n\n return {\n ...item,\n isActive,\n };\n });\n\n return {\n date,\n items: formattedItems,\n };\n });\n}\n\nexport function getScheduledTariff(\n elements: TariffElement[],\n locationTimezone: string,\n) {\n // TODO this timezone from locations\n const today = new Date();\n\n return [...elements].reduce(\n (acc, curr) => {\n const {\n startDate: start_date,\n endDate: end_date,\n dayOfWeek: day_of_week = [],\n } = (curr.restrictions as TariffRestrictions) || {};\n\n // filtering out elements without restrictions\n if (!Object.keys(curr.restrictions || {}).length) {\n return acc;\n }\n\n // TODO not sure this is correct consider timezone + should start_time be included\n const startDate = start_date ? new Date(start_date) : null;\n\n if (start_date) {\n if (startDate.valueOf() > Date.now()) {\n return acc;\n }\n }\n\n // TODO not sure this is correct consider timezone + should end_time be included\n const endDate = end_date ? new Date(end_date) : null;\n\n if (end_date) {\n if (endDate.valueOf() < Date.now()) {\n return acc;\n }\n }\n\n [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n ].forEach((day: DayOfWeek, index) => {\n // note this does not work for timezones yet, until we load a timezone library\n const { start, end } = getNextDayOfWeek(today, index, locationTimezone);\n\n if (startDate) {\n if (startDate.valueOf() > start.valueOf()) {\n return;\n }\n }\n\n if (endDate) {\n if (endDate.valueOf() < end.valueOf()) {\n return;\n }\n }\n if (day_of_week.length && !day_of_week.includes(day)) return;\n\n acc[day] = [...acc[day], curr];\n });\n return acc;\n },\n {\n MONDAY: [],\n TUESDAY: [],\n WEDNESDAY: [],\n THURSDAY: [],\n FRIDAY: [],\n SATURDAY: [],\n SUNDAY: [],\n },\n );\n}\n\nfunction omitFields(obj, fields) {\n return Object.keys(obj).reduce((acc, curr) => {\n if (!fields.includes(curr)) {\n acc[curr] = obj[curr];\n }\n return acc;\n }, {});\n}\n\nfunction isSame(a, b) {\n const aWithoutActive = a.map((item) => omitFields(item, [\"isActive\"]));\n const bWithoutActive = b.map((item) => omitFields(item, [\"isActive\"]));\n return JSON.stringify(aWithoutActive) === JSON.stringify(bWithoutActive);\n}\n\n//merge timeslots that have the same start and end time\nfunction mergeDuplicatesTimeslots(timeslots: Timeslot[]) {\n return timeslots.reduce((acc, cur) => {\n const existing = acc.find((item) => {\n return item.startTime === cur.startTime && item.endTime === cur.endTime;\n });\n if (existing) {\n existing.elements.push(...cur.elements);\n } else {\n acc.push(cur);\n }\n return acc;\n }, []);\n}\n\ntype Schedule = {\n days: DayOfWeek[];\n isActive: boolean;\n items: Timeslot[];\n};\n\n// A base rate element fills the gaps between time-restricted elements.\n// Parking-only base elements (max/min duration) are excluded — they are shown separately.\nfunction isRateBaseTariff(el: TariffElement): boolean {\n if (!isBaseTarif(el)) return false;\n return (el.priceComponents || []).some(\n (pc) => pc.type !== \"PARKING_TIME\" && (pc.price || 0) > 0,\n );\n}\n\n// OCPI tariffs commonly use 00:01 / 23:59 to mean \"from start of day\" / \"to end of day\".\n// Treat these as midnight bounds so the algorithm doesn't produce 1-minute noise segments.\nfunction isEdgeNoise(item: Timeslot): boolean {\n return (\n (item.startTime === 0 && item.endTime <= 1) ||\n (item.startTime >= 1439 && item.endTime === 24 * 60)\n );\n}\n\nexport function getSchedule(\n elements: TariffElement[],\n locationTimezone,\n now,\n): Schedule[] {\n const days = getScheduledTariff(\n elements.concat().filter((c) => !isBaseTarif(c)),\n locationTimezone,\n );\n\n const baseRateElement = elements.find(isRateBaseTariff);\n\n const { SUNDAY, ...rest } = days;\n\n // fixing order sunday has to be first for the getDay function to work\n const [firstDay, ...restDays] = Object.keys({\n SUNDAY: days.SUNDAY,\n ...rest,\n }).map((key, index) => {\n const dayElements = days[key];\n const isActive = getDay(now, locationTimezone) === index;\n\n const dayTimeslots = mergeDuplicatesTimeslots(\n dayElements.map(convertToTimeSlot),\n );\n // Inject the base rate so gaps between time-restricted slots show the base price\n // instead of stretching the adjacent slot across the gap.\n if (baseRateElement && dayTimeslots.length > 0) {\n dayTimeslots.unshift(convertToTimeSlot(baseRateElement));\n }\n\n return {\n day: key,\n isActive,\n items: getScheduleItems(dayTimeslots, isActive, now).filter(\n (item) => !isEdgeNoise(item),\n ),\n };\n });\n\n // switching order back\n return [...restDays, firstDay]\n .reduce((acc, curr, index, items) => {\n const prevEntry = acc[acc.length - 1];\n const prevTimeslots = prevEntry?.items;\n if (!prevTimeslots || !isSame(prevTimeslots, curr.items)) {\n const { day, ...rest } = curr;\n acc.push({\n ...rest,\n days: [curr.day],\n });\n } else {\n prevEntry.days = [prevEntry.days[0], curr.day];\n prevEntry.isActive = prevEntry.isActive || curr.isActive;\n }\n return acc;\n }, [])\n .filter((c) => {\n return !!c.items.length;\n });\n}\n\nexport function getConnectorTariffTypeV2(tariff: OcpiTariff) {\n if (!tariff) {\n return \"none\";\n }\n\n const hasPriceComponents = tariff.elements?.some(\n (element) => element?.price_components?.length > 0,\n );\n if (!hasPriceComponents) {\n return \"none\";\n }\n\n const baseTarifElements = tariff.elements.filter(isBaseTariffOCPI);\n if (baseTarifElements.length === tariff.elements.length) {\n return \"base\";\n }\n\n const dynamicTariffs = getDynamicTariffOCPI(tariff.elements, 6, new Date());\n\n if (dynamicTariffs.length) {\n return \"dynamic\";\n }\n\n return \"scheduled\";\n}\n\nexport function getConnectorTariffType(connectorTarif) {\n const { elements = [] } = connectorTarif;\n const hasPriceComponents = elements?.some(\n (element) => element?.priceComponents?.length > 0,\n );\n\n if (!hasPriceComponents) {\n return \"none\";\n }\n\n const baseTarifElements = elements.filter(isBaseTarif);\n\n if (baseTarifElements.length === elements.length) {\n return \"base\";\n }\n\n const dynamicTariffs = getDynamicTariff({\n elements,\n limit: 6,\n now: new Date(),\n });\n if (dynamicTariffs.length) {\n return \"dynamic\";\n }\n return \"scheduled\";\n}\n\n// Connector Power Type constants\nexport const ConnectorPowerType = {\n CONNECTOR_POWER_TYPE_UNSPECIFIED: \"CONNECTOR_POWER_TYPE_UNSPECIFIED\",\n CONNECTOR_POWER_TYPE_AC_1_PHASE: \"CONNECTOR_POWER_TYPE_AC_1_PHASE\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE: \"CONNECTOR_POWER_TYPE_AC_2_PHASE\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT:\n \"CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT\",\n CONNECTOR_POWER_TYPE_AC_3_PHASE: \"CONNECTOR_POWER_TYPE_AC_3_PHASE\",\n CONNECTOR_POWER_TYPE_DC: \"CONNECTOR_POWER_TYPE_DC\",\n CONNECTOR_POWER_TYPE_AC: \"CONNECTOR_POWER_TYPE_AC\",\n} as const;\n\nexport type ConnectorPowerType =\n (typeof ConnectorPowerType)[keyof typeof ConnectorPowerType];\n\nexport function calculateMaxPower(connector: {\n power: {\n maxWatts: number;\n maxVoltage: number;\n maxAmperage: number;\n };\n connectorPowerType: ConnectorPowerType;\n}): number {\n switch (connector.connectorPowerType) {\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_1_PHASE:\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_DC:\n return (connector.power.maxVoltage * connector.power.maxAmperage) / 1000;\n\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_2_PHASE:\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT:\n return (\n (connector.power.maxVoltage * connector.power.maxAmperage * 2) / 1000\n );\n\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_3_PHASE:\n return (\n (connector.power.maxVoltage * connector.power.maxAmperage * 3) / 1000\n );\n\n default:\n return 0;\n }\n}\n","import React from \"react\";\nimport styles from \"./Price.module.css\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { PriceComponent as PriceComponentType, TariffElement } from \"../../types\";\n\nfunction formatCurrency(value, props) {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: props.currency || \"EUR\",\n maximumFractionDigits: 2,\n }).format(value);\n}\n\ntype PriceComponentsProps = {\n priceComponent: PriceComponentType;\n restrictions?: TariffElement[\"restrictions\"];\n currency: string;\n};\n\nfunction getPrice(priceComponent: PriceComponentType) {\n const vat = !priceComponent.vat ? 0 : priceComponent.vat / 100;\n return priceComponent.price + priceComponent.price * vat;\n}\n\nexport default function PriceComponent({\n priceComponent,\n restrictions = {},\n currency,\n}: PriceComponentsProps) {\n const { t } = useMapContext();\n\n const stringByType = {\n ENERGY: \"tariffPriceComponent.energy\",\n TIME: \"tariffPriceComponent.time\",\n FLAT: \"tariffPriceComponent.flat\",\n PARKING_TIME: \"tariffPriceComponent.parkingTime\",\n };\n\n if (\n restrictions?.minDuration === 0 &&\n restrictions?.maxDuration &&\n priceComponent.type === \"PARKING_TIME\"\n ) {\n return (\n <div className={styles.tariffItem}>\n {t(\"tariffPriceComponent.parkingTimeWait\", {\n minutes: Math.floor(restrictions.maxDuration / 60),\n })}\n </div>\n );\n }\n\n if (!stringByType[priceComponent.type]) return null;\n\n return (\n <div className={styles.tariffItem}>\n {t(stringByType[priceComponent.type] as any, {\n total: formatCurrency(getPrice(priceComponent), {\n currency: currency,\n }),\n })}\n </div>\n );\n}\n\n","import React from \"react\";\n\nimport { PriceComponent, TariffElement } from \"../../types\";\n\nimport Price from \"../Price/Price\";\n\nimport styles from \"./PriceComponents.module.css\";\nimport { useMapContext } from \"../../contexts/Map\";\n\ntype PriceComponentsProps = {\n elements: TariffElement[];\n currency: string;\n};\n\nconst displayOrder = [\"ENERGY\", \"TIME\", \"FLAT\", \"PARKING_TIME\"];\n\ntype SortedElements = {\n type: PriceComponent[\"type\"];\n elements: {\n priceComponent: PriceComponent;\n restrictions: TariffElement[\"restrictions\"];\n }[];\n};\n\nexport default function PriceComponents({\n elements,\n currency,\n}: PriceComponentsProps) {\n const { t } = useMapContext();\n\n // get elements from by type\n const elementsByType = elements.reduce((acc, element) => {\n element.priceComponents.forEach((priceComponent) => {\n if (!acc[priceComponent.type]) acc[priceComponent.type] = [];\n acc[priceComponent.type].push({\n priceComponent,\n restrictions: element.restrictions,\n });\n });\n return acc;\n }, {});\n\n const sortedElements = Object.keys(elementsByType)\n .map((type) => {\n return {\n type,\n elements: elementsByType[type],\n };\n })\n .sort((a: any, b: any) => {\n const aIndex = displayOrder.indexOf(a.type);\n const bIndex = displayOrder.indexOf(b.type);\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n return aIndex - bIndex;\n }) as SortedElements[];\n\n return (\n <div className={styles.container}>\n {sortedElements.map(({ type, elements }, i) => {\n return elements.reverse().map((element, q) => {\n return (\n <Price\n currency={currency}\n key={`${type}-${i}-${q}`}\n priceComponent={element.priceComponent}\n restrictions={element.restrictions}\n />\n );\n });\n })}\n </div>\n );\n}\n\n","import React from \"react\";\n\nimport { CdrAdditionalCharge, PriceComponent, TariffElement } from \"../../types\";\n\nfunction formatCurrency(value, props) {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: props.currency || \"EUR\",\n maximumFractionDigits: 2,\n }).format(value);\n}\n\n// note reuse of price css module\nimport styles from \"../Price/Price.module.css\";\nimport { useMapContext } from \"../../contexts/Map\";\n\ntype CdrPriceComponentsProps = {\n cdrAdditionalCharge: CdrAdditionalCharge;\n currency: string;\n};\n\nfunction getPrice({ vat, price }: { vat?: number; price: number }) {\n const vatAmount = !vat ? 0 : vat / 100;\n return price + price * vatAmount;\n}\n\nexport default function CdrPriceComponent({\n cdrAdditionalCharge,\n currency,\n}: CdrPriceComponentsProps) {\n const { t } = useMapContext();\n\n const stringByType = {\n FLAT_FEE: t(\"cdrPrice.flatFee\", {\n total: formatCurrency(getPrice(cdrAdditionalCharge), {\n currency: currency,\n }),\n }),\n };\n\n return (\n <div className={styles.tariffItem}>\n {stringByType[cdrAdditionalCharge.type]}\n </div>\n );\n}\n\n","import React, { Fragment } from \"react\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { Tariff, CdrAdditionalCharge } from \"../../types\";\nimport { getSchedule, isBaseTarif, getDynamicTariff } from \"../../utils/ocpi\";\n\nimport styles from \"./ConnectorTariff.module.css\";\n\nimport PriceComponents from \"../PriceComponents/PriceComponents\";\nimport CdrPrice from \"../CdrPrice/CdrPrice\";\n\ntype ConnectorTariffProps = {\n tariff: Tariff;\n timezone?: string;\n compact?: boolean;\n cdrAdditionalCharges?: CdrAdditionalCharge[];\n};\n\nfunction formatTime(language, minutes: number) {\n const date = new Date(0);\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n date.setHours(hours, mins, 0, 0);\n // hardcoding to nl for now, because i think people will understand it better in EU\n return date.toLocaleTimeString(\"nl\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nconst defaultTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nfunction daysForLocale(language: string) {\n const { format } = new Intl.DateTimeFormat(language, { weekday: \"long\" });\n return [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n ].reduce((acc, day, index) => {\n acc[day] = format(new Date(Date.UTC(2023, 9, index + 1)));\n return acc;\n }, {});\n}\n\nfunction CdrAdditionalChargeComponent({\n currency,\n cdrAdditionalCharges,\n}: {\n currency: string;\n cdrAdditionalCharges: CdrAdditionalCharge[];\n}) {\n return cdrAdditionalCharges.map((c) => {\n return <CdrPrice key={c.id} currency={currency} cdrAdditionalCharge={c} />;\n });\n}\n\nexport default function ConnectorTariff({\n timezone = defaultTimeZone,\n tariff,\n compact = true,\n cdrAdditionalCharges = [],\n}: ConnectorTariffProps) {\n const { t, language } = useMapContext();\n const i18nDays = daysForLocale(language);\n\n if (!tariff) return null;\n\n const elements = tariff.elements || [];\n const currency = tariff.currency || \"\";\n\n const hasPriceComponents = elements.some(\n (element) => element.priceComponents && element.priceComponents.length > 0,\n );\n\n const dynamicTariffs = getDynamicTariff({\n elements,\n limit: compact ? 6 : 40,\n now: new Date(),\n });\n\n const scheduledTariffs = dynamicTariffs.length\n ? []\n : getSchedule(elements, timezone, new Date());\n\n const baseTarifElements = elements.filter(isBaseTarif);\n\n if (!hasPriceComponents) {\n return (\n <>\n <div className={styles.tariffNote}>\n {t(\"tariffPriceComponent.noTariff\")}\n </div>\n {cdrAdditionalCharges.length > 0 && (\n <div className={styles.container}>\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n )}\n </>\n );\n }\n\n const isBaseActive = !scheduledTariffs.some((element) => element.isActive);\n\n if (scheduledTariffs.length) {\n return (\n <div className={styles.container}>\n {baseTarifElements.length > 0 && (\n <div className={[styles.tariffList, styles.bold].join(\" \")}>\n <div className={styles.tariffHeader}>\n {t(\"tariffPriceComponent.baseTariff\")}\n\n {isBaseActive && (\n <span className={styles.activeNowLabel}>\n {t(\"tariffPriceComponent.active\")}\n </span>\n )}\n </div>\n <PriceComponents elements={baseTarifElements} currency={currency} />\n\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n )}\n\n {scheduledTariffs.map((schedule) => {\n return (\n <div key={schedule.days.join(\"-\")} className={styles.tariffList}>\n <div className={styles.tariffHeader}>\n {schedule.days.map((day) => i18nDays[day]).join(\" - \")}\n\n {schedule.isActive && (\n <span className={styles.activeNowLabel}>\n {t(\"tariffPriceComponent.active\")}\n </span>\n )}\n </div>\n {schedule.items.map((item) => {\n return (\n <div\n key={item.startTime}\n className={item.isActive && styles.bold}\n >\n {!item.isFullDay && (\n <div className={styles.tariffLabel}>\n {formatTime(language, item.startTime)} -{\" \"}\n {formatTime(language, item.endTime)}\n </div>\n )}\n <div>\n <PriceComponents\n elements={item.elements}\n currency={currency}\n />\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n {baseTarifElements.length > 0 && !dynamicTariffs?.length && (\n <div className={styles.tariffList}>\n <PriceComponents elements={baseTarifElements} currency={currency} />\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n )}\n {dynamicTariffs.length > 0 && (\n <>\n {dynamicTariffs.map((dynamicTariff, index) => {\n return (\n <>\n <div className={styles.tariffHeader}>\n {t(\"tariffPriceComponent.dynamicTariffHeader\", {\n date: new Intl.DateTimeFormat(language, {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n }).format(dynamicTariff.date),\n })}\n </div>\n <div className={styles.dynamicTariffList}>\n {dynamicTariff.items.map((item, index) => {\n return (\n <div\n key={[item.startTime, item.endTime, index].join()}\n className={[\n styles.dynamicTariffItem,\n item.isActive && styles.bold,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className={styles.dynamicTariffItemRange}>\n {formatTime(language, item.startTime)} &ndash;{\" \"}\n {formatTime(language, item.endTime)}\n </div>\n <PriceComponents\n elements={item.elements}\n currency={currency}\n />\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n {item.isActive && (\n <span className={styles.activeNowLabel}>\n {t(\"tariffPriceComponent.active\")}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </>\n );\n })}\n </>\n )}\n </div>\n );\n}\n","import { Location, OcpiLocation } from \"../types\";\n\nexport function getNotes(\n t,\n location: Location | OcpiLocation,\n type: \"dynamic\" | \"scheduled\" | \"base\" | \"none\",\n) {\n const notes = [];\n\n if ((location as Location)?.customNote) {\n notes.push((location as Location)?.customNote);\n }\n\n if (type === \"none\") {\n return notes.length ? notes : [t(\"tariffNote.baseTariffNote\")];\n }\n\n if (type === \"dynamic\") {\n notes.push(t(\"tariffNote.dynamicScheduledTariffNote\"));\n }\n\n // is e-flux location\n if (\n (location as Location)?.infraProviderId === \"NLEFL\" ||\n (location as OcpiLocation)?.party_id === \"EFL\"\n ) {\n if (type === \"scheduled\") {\n notes.push(t(\"tariffNote.eFluxScheduledTariffNote\"));\n }\n // if only base tariff\n return notes;\n }\n\n if (type === \"scheduled\") {\n notes.push(\n t(\"tariffNote.baseTariffNote\"),\n t(\"tariffNote.scheduledTariffNote\"),\n );\n } else {\n notes.push(t(\"tariffNote.baseTariffNote\"));\n }\n\n return notes;\n}\n","import React from \"react\";\nimport styles from \"./locations.module.css\";\nimport StationIcon from \"../../assets/station-icon.svg\";\nimport BuildingIcon from \"../../assets/building-icon.svg\";\nimport CarIcon from \"../../assets/car-icon.svg\";\nimport BoltIcon from \"../../assets/bolt-icon.svg\";\nimport PricingIcon from \"../../assets/pricing-icon.svg\";\nimport { Info } from \"../../components/Icons/Icons\";\nimport {\n getStatusColorFromEvses,\n getLocationLabel,\n getStatusLabel,\n getSocketIcon,\n getSocketText,\n} from \"../../utils/formatters\";\nimport ConnectorTariff from \"../../components/ConnectorTariff/ConnectorTariff\";\nimport { getColorForStatus } from \"../../utils/location\";\nimport { getConnectorTariffType } from \"../../utils/ocpi\";\nimport { getNotes } from \"../../utils/notes\";\nimport { formatNumber } from \"../../utils/formatters\";\nimport { useMapContext } from \"../../contexts/Map\";\n\ninterface Props {\n currentLocation: any;\n setView(view: string, args?: any): void;\n evses: any[];\n cdrAdditionalCharges: any[];\n}\n\nconst LocationDetailsV1: React.FC<Props> = ({\n currentLocation,\n evses,\n setView,\n cdrAdditionalCharges,\n}) => {\n const { options, t, language } = useMapContext();\n const availableEvse = evses.filter((evse) => evse.status === \"AVAILABLE\");\n return (\n <div className={styles.container}>\n <div className={styles.row}>\n <img className={styles.icon} src={StationIcon} alt=\"station icon\" />\n <div className={styles.text}>\n {options.locationBaseUrl && (\n <a href={`${options.locationBaseUrl}/${currentLocation.id}`}>\n {currentLocation.name || \"-\"}\n </a>\n )}\n {!options.locationBaseUrl && currentLocation.name}\n </div>\n </div>\n <div className={styles.row}>\n <div className={styles.icon}>\n <div\n style={{\n background: getStatusColorFromEvses(currentLocation.evses),\n }}\n className={styles.statusIcon}\n />\n </div>\n <div className={styles.text}>\n {availableEvse.length} / {evses.length} {t(\"evse.statusAvailable\")}\n </div>\n </div>\n {currentLocation.subOperator?.name && (\n <div className={styles.row}>\n <img className={styles.icon} src={BuildingIcon} alt=\"building icon\" />\n <div className={styles.text}>{currentLocation.subOperator?.name}</div>\n </div>\n )}\n\n {currentLocation.parkingType !== \"UNKNOWN\" && (\n <div className={styles.row}>\n <img className={styles.icon} src={CarIcon} alt=\"parking icon\" />\n <div className={styles.text}>\n {getLocationLabel(t, currentLocation.parkingType)}\n </div>\n </div>\n )}\n\n {evses.map((evse) => {\n return (\n <div key={evse.evseId}>\n <hr className={styles.divider} />\n <div className={styles.row}>\n <img className={styles.icon} src={BoltIcon} alt=\"power icon\" />\n <div className={styles.text}>{evse.evseId}</div>\n </div>\n <div className={styles.row}>\n <div\n style={{\n background: getColorForStatus(evse.status),\n }}\n className={styles.statusIcon}\n />\n <div className={styles.text}>\n {[\n getStatusLabel(t, evse.status),\n evse.maxPower &&\n `${formatNumber(language, Math.floor(evse.maxPower))}kW`,\n ]\n .filter(Boolean)\n .join(\", \")}\n </div>\n </div>\n {evse.connectors.map((connector, i) => {\n const connectorType = getConnectorTariffType(connector.tariff);\n const notes = getNotes(t, currentLocation, connectorType);\n return (\n <div key={`connector-${i}`}>\n {\" \"}\n <div className={styles.row}>\n <img\n className={styles.icon}\n src={getSocketIcon(connector)}\n alt=\"socket type\"\n />\n <div className={styles.text}>\n {getSocketText(connector)}\n </div>\n </div>\n <div className={styles.row}>\n <img\n className={styles.icon}\n src={PricingIcon}\n alt=\"pricing\"\n />\n <div className={styles.text}>{t(\"evse.pricing\")}</div>\n </div>\n <ConnectorTariff\n tariff={connector.tariff}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n {connectorType === \"dynamic\" && (\n <div\n className={styles.tariffNoteLink}\n onClick={() => {\n setView(\"dynamicTariff\", {\n connector: connector,\n evseId: evse.evseId,\n notes: notes,\n locationName: currentLocation.name,\n });\n }}\n >\n {t(\"location.viewAllHourlyPrices\")}\n </div>\n )}\n {notes.length > 0 && (\n <div\n className={styles.tariffNoteLink}\n onClick={() => {\n setView(\"tariffNote\", {\n locationName: currentLocation.name,\n evseId: evse.evseId,\n notes: getNotes(t, currentLocation, connectorType),\n });\n }}\n >\n <Info /> {t(\"tariffPriceComponent.viewTariff\")}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default LocationDetailsV1;\n","import React, { ReactNode, useState } from \"react\";\nimport styles from \"./LocationRow.module.css\";\nimport { ChevronDown } from \"../Icons/Icons\";\n\ninterface Props {\n icon: ReactNode;\n text: ReactNode;\n hint?: ReactNode;\n children?: ReactNode;\n defaultExpanded?: boolean;\n}\n\nconst rowStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"nowrap\",\n alignItems: \"center\",\n padding: \"5px 0\",\n minWidth: 0,\n};\n\nconst iconSlotStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 16,\n width: 16,\n flex: \"0 0 auto\",\n marginRight: 14,\n overflow: \"hidden\",\n};\n\nconst textSlotStyle: React.CSSProperties = {\n flex: \"1 1 auto\",\n minWidth: 0,\n fontSize: 12,\n lineHeight: \"16px\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst hintStyle: React.CSSProperties = {\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n fontWeight: \"normal\",\n};\n\nconst chevronSlotStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 10,\n width: 10,\n flex: \"0 0 auto\",\n marginLeft: 8,\n transition: \"transform 0.15s ease\",\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n};\n\nconst bodyStyle: React.CSSProperties = {\n padding: \"4px 0 6px 30px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n};\n\nexport const LocationRow: React.FC<Props> = ({\n icon,\n text,\n hint,\n children,\n defaultExpanded = false,\n}) => {\n const expandable = React.Children.count(children) > 0;\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const toggle = () => setExpanded((v) => !v);\n\n return (\n <>\n <div\n className={`${styles.row} ${expandable ? styles.expandable : \"\"}`}\n style={{\n ...rowStyle,\n cursor: expandable ? \"pointer\" : undefined,\n userSelect: expandable ? \"none\" : undefined,\n }}\n role={expandable ? \"button\" : undefined}\n tabIndex={expandable ? 0 : undefined}\n aria-expanded={expandable ? expanded : undefined}\n onClick={expandable ? toggle : undefined}\n onKeyDown={\n expandable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggle();\n }\n }\n : undefined\n }\n >\n <span className={styles.icon} style={iconSlotStyle}>\n {React.isValidElement(icon)\n ? React.cloneElement(icon as React.ReactElement<any>, {\n style: {\n maxWidth: 16,\n maxHeight: 16,\n display: \"block\",\n ...((icon as React.ReactElement<any>).props?.style || {}),\n },\n })\n : icon}\n </span>\n <div className={styles.text} style={textSlotStyle}>\n {text}\n {hint != null && (\n <span className={styles.textHint} style={hintStyle}>\n {\" · \"}\n {hint}\n </span>\n )}\n </div>\n {expandable && (\n <span\n className={`${styles.chevron} ${\n expanded ? styles.chevronOpen : \"\"\n }`}\n style={{\n ...chevronSlotStyle,\n transform: expanded ? \"rotate(180deg)\" : undefined,\n }}\n >\n <ChevronDown />\n </span>\n )}\n </div>\n {expandable && expanded && (\n <div className={styles.body} style={bodyStyle}>\n {children}\n </div>\n )}\n </>\n );\n};\n\nexport default LocationRow;\n","import React from \"react\";\nimport StationIcon from \"../../../assets/station-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiLocation } from \"../../../types\";\n\ninterface Props {\n location: OcpiLocation;\n}\n\nexport const LocationHeader: React.FC<Props> = ({ location }) => {\n const { options, mapKind } = useMapContext();\n const name = location?.name || \"-\";\n const id = location?.externalId || location?.id;\n\n let href: string | undefined;\n if (id && options.locationUrlTemplate && mapKind === \"cpo\") {\n href = options.locationUrlTemplate.replace(/{{\\s*locationId\\s*}}/g, id);\n } else if (id && options.locationBaseUrl) {\n href = `${options.locationBaseUrl}/${id}`;\n }\n\n const text = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {name}\n </a>\n ) : (\n name\n );\n return (\n <LocationRow\n icon={<img src={StationIcon} alt=\"station icon\" />}\n text={text}\n />\n );\n};\n\nexport default LocationHeader;\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport StatusDot from \"../../../components/StatusDot/StatusDot\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { getStatusColorFromEvses } from \"../../../utils/formatters\";\nimport { OcpiEvse } from \"../../../types\";\n\ninterface Props {\n evses: OcpiEvse[];\n}\n\nexport const AvailabilitySummary: React.FC<Props> = ({ evses }) => {\n const { t } = useMapContext();\n const available = evses?.filter((e) => e.status === \"AVAILABLE\") || [];\n return (\n <LocationRow\n icon={<StatusDot color={getStatusColorFromEvses(evses)} />}\n text={`${available.length} / ${evses?.length || 0} ${t(\"evse.statusAvailable\")}`}\n />\n );\n};\n\nexport default AvailabilitySummary;\n","import React from \"react\";\nimport BuildingIcon from \"../../../assets/building-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiSuboperator } from \"../../../types\";\nimport { LabelsType } from \"../../../i18n\";\nimport styles from \"./OperatorSection.module.css\";\n\ninterface Props {\n operator?: OcpiSuboperator;\n suboperator?: OcpiSuboperator;\n fallbackOperatorName?: string;\n fallbackSuboperatorName?: string;\n}\n\ntype Role = {\n labelKey: keyof LabelsType;\n name?: string;\n website?: string;\n logoUrl?: string;\n};\n\nconst OperatorBlock: React.FC<{ role: Role; showRoleLabel: boolean }> = ({\n role,\n showRoleLabel,\n}) => {\n const { t } = useMapContext();\n if (!role.name) return null;\n return (\n <div\n className={styles.block}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n marginBottom: 8,\n }}\n >\n {showRoleLabel && (\n <div\n className={styles.role}\n style={{\n fontSize: 11,\n textTransform: \"uppercase\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n letterSpacing: \"0.04em\",\n }}\n >\n {t(role.labelKey)}\n </div>\n )}\n <div\n className={styles.header}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}\n >\n {role.logoUrl && (\n <img\n className={styles.logo}\n src={role.logoUrl}\n alt={`${role.name} logo`}\n style={{\n maxHeight: 20,\n maxWidth: 80,\n width: \"auto\",\n height: \"auto\",\n objectFit: \"contain\",\n display: \"block\",\n }}\n />\n )}\n <div\n className={styles.name}\n style={{ fontSize: 13, fontWeight: 600 }}\n >\n {role.name}\n </div>\n </div>\n {role.website && (\n <a\n className={styles.website}\n href={role.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontSize: 12,\n color: \"var(--roadmap-brand-color)\",\n textDecoration: \"none\",\n wordBreak: \"break-all\",\n }}\n >\n {t(\"location.visitWebsite\")}\n </a>\n )}\n </div>\n );\n};\n\nexport const OperatorSection: React.FC<Props> = ({\n operator,\n suboperator,\n fallbackOperatorName,\n fallbackSuboperatorName,\n}) => {\n const { t } = useMapContext();\n\n const subRole: Role = {\n labelKey: \"location.suboperator\",\n name: suboperator?.name || fallbackSuboperatorName,\n website: suboperator?.website,\n logoUrl: suboperator?.logo?.thumbnail || suboperator?.logo?.url,\n };\n const opRole: Role = {\n labelKey: \"location.operator\",\n name: operator?.name || fallbackOperatorName,\n website: operator?.website,\n logoUrl: operator?.logo?.thumbnail || operator?.logo?.url,\n };\n\n const role = subRole.name ? subRole : opRole.name ? opRole : null;\n if (!role) return null;\n\n return (\n <LocationRow\n icon={<img src={BuildingIcon} alt=\"building icon\" />}\n text={t(\"location.operatorInfo\")}\n hint={role.name}\n >\n <OperatorBlock role={role} showRoleLabel={false} />\n </LocationRow>\n );\n};\n\nexport default OperatorSection;\n","import { LabelsType } from \"../i18n\";\n\nexport type RegularHours = {\n weekday: number;\n period_begin: string;\n period_end: string;\n};\n\nexport type ExceptionalPeriod = {\n period_begin: string;\n period_end: string;\n};\n\nexport type OpeningTimes = {\n twentyfourseven: boolean;\n regular_hours?: RegularHours[];\n exceptional_openings?: ExceptionalPeriod[];\n exceptional_closings?: ExceptionalPeriod[];\n};\n\ntype Translate = (key: keyof LabelsType, args?: Record<string, string>) => string;\n\nconst WEEKDAY_KEYS: Array<keyof LabelsType> = [\n \"weekday.mon\",\n \"weekday.tue\",\n \"weekday.wed\",\n \"weekday.thu\",\n \"weekday.fri\",\n \"weekday.sat\",\n \"weekday.sun\",\n];\n\nexport function getWeekdayLabel(t: Translate, weekday: number): string {\n const key = WEEKDAY_KEYS[weekday - 1];\n return key ? t(key) : \"\";\n}\n\n// Full, localised weekday name (e.g. \"Monday\") for an OCPI weekday (1=Mon..7=Sun).\nexport function getWeekdayFullLabel(language: string, weekday: number): string {\n if (weekday < 1 || weekday > 7) return \"\";\n // 2024-01-01 is a Monday, so day-of-month 1..7 maps to Mon..Sun.\n const ref = new Date(2024, 0, weekday);\n return new Intl.DateTimeFormat(language, { weekday: \"long\" }).format(ref);\n}\n\n// OCPI weekday (1=Mon..7=Sun) for the given date (defaults to now).\nexport function getTodayWeekday(now: Date = new Date()): number {\n return jsDayToOcpiWeekday(now.getDay());\n}\n\nexport function groupRegularHoursByWeekday(\n regularHours: RegularHours[] | undefined,\n): Record<number, RegularHours[]> {\n const grouped: Record<number, RegularHours[]> = {};\n for (let i = 1; i <= 7; i++) grouped[i] = [];\n (regularHours || []).forEach((entry) => {\n if (entry.weekday >= 1 && entry.weekday <= 7) {\n grouped[entry.weekday].push(entry);\n }\n });\n for (const day of Object.keys(grouped)) {\n grouped[Number(day)].sort((a, b) =>\n a.period_begin.localeCompare(b.period_begin),\n );\n }\n return grouped;\n}\n\nexport function formatPeriod(begin: string, end: string): string {\n return `${begin} - ${end}`;\n}\n\nfunction timeToMinutes(time: string): number {\n const [h, m] = time.split(\":\").map(Number);\n return h * 60 + (m || 0);\n}\n\nfunction jsDayToOcpiWeekday(jsDay: number): number {\n // JS: 0=Sun..6=Sat. OCPI: 1=Mon..7=Sun.\n return jsDay === 0 ? 7 : jsDay;\n}\n\nfunction isInExceptional(\n periods: ExceptionalPeriod[] | undefined,\n now: Date,\n): ExceptionalPeriod | null {\n if (!periods) return null;\n const t = now.getTime();\n for (const p of periods) {\n const begin = new Date(p.period_begin).getTime();\n const end = new Date(p.period_end).getTime();\n if (!isNaN(begin) && !isNaN(end) && t >= begin && t <= end) return p;\n }\n return null;\n}\n\nexport type OpenStatus = {\n open: boolean;\n // `day` is the OCPI weekday (1=Mon..7=Sun) of the change, set only when it\n // does not fall on the current day (so the UI can render e.g. \"Opens 9:00 Monday\").\n nextChange?: { time: string; label: \"opens\" | \"closes\"; day?: number };\n};\n\nexport function isOpenNow(\n openingTimes: OpeningTimes | undefined,\n now: Date = new Date(),\n): OpenStatus {\n if (!openingTimes) return { open: false };\n if (openingTimes.twentyfourseven) return { open: true };\n\n const todayWeekday = jsDayToOcpiWeekday(now.getDay());\n\n const closing = isInExceptional(openingTimes.exceptional_closings, now);\n if (closing) {\n const reopen = new Date(closing.period_end);\n const reopenWeekday = jsDayToOcpiWeekday(reopen.getDay());\n return {\n open: false,\n nextChange: {\n time: reopen.toISOString().slice(11, 16),\n label: \"opens\",\n day: reopenWeekday === todayWeekday ? undefined : reopenWeekday,\n },\n };\n }\n\n const opening = isInExceptional(openingTimes.exceptional_openings, now);\n if (opening) {\n return {\n open: true,\n nextChange: {\n time: new Date(opening.period_end).toISOString().slice(11, 16),\n label: \"closes\",\n },\n };\n }\n\n const grouped = groupRegularHoursByWeekday(openingTimes.regular_hours);\n const prevWeekday = todayWeekday === 1 ? 7 : todayWeekday - 1;\n const nowMinutes = now.getHours() * 60 + now.getMinutes();\n\n // Check overnight period from previous day still active\n for (const p of grouped[prevWeekday]) {\n const begin = timeToMinutes(p.period_begin);\n const end = timeToMinutes(p.period_end);\n if (end < begin || end === 0) {\n // wraps past midnight\n const endToday = end === 0 ? 24 * 60 : end;\n if (nowMinutes < endToday) {\n return {\n open: true,\n nextChange: { time: p.period_end, label: \"closes\" },\n };\n }\n }\n }\n\n // Check today's periods\n for (const p of grouped[todayWeekday]) {\n const begin = timeToMinutes(p.period_begin);\n const end = timeToMinutes(p.period_end);\n const wraps = end < begin || end === 0;\n const effectiveEnd = wraps ? 24 * 60 : end;\n if (nowMinutes >= begin && nowMinutes < effectiveEnd) {\n return {\n open: true,\n nextChange: { time: p.period_end, label: \"closes\" },\n };\n }\n if (nowMinutes < begin) {\n return {\n open: false,\n nextChange: { time: p.period_begin, label: \"opens\" },\n };\n }\n }\n\n // Find next opening across following days\n for (let i = 1; i <= 7; i++) {\n const wd = ((todayWeekday - 1 + i) % 7) + 1;\n const periods = grouped[wd];\n if (periods.length > 0) {\n return {\n open: false,\n nextChange: {\n time: periods[0].period_begin,\n label: \"opens\",\n day: wd === todayWeekday ? undefined : wd,\n },\n };\n }\n }\n\n return { open: false };\n}\n\nexport function getFutureExceptionalPeriods(\n periods: ExceptionalPeriod[] | undefined,\n now: Date = new Date(),\n): ExceptionalPeriod[] {\n if (!periods) return [];\n const t = now.getTime();\n return periods.filter((p) => {\n const end = new Date(p.period_end).getTime();\n return !isNaN(end) && end >= t;\n });\n}\n\nfunction ordinalSuffix(day: number): string {\n const rem100 = day % 100;\n if (rem100 >= 11 && rem100 <= 13) return \"th\";\n switch (day % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n}\n\n// Friendly, localised calendar date for an exceptional period (e.g. \"May 1st\"\n// in English, \"1. Mai\" in German). Used as the label in the exceptional rows.\nexport function formatExceptionalDate(language: string, dateStr: string): string {\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return dateStr;\n if (language === \"en\") {\n const month = new Intl.DateTimeFormat(\"en\", { month: \"long\" }).format(d);\n const day = d.getDate();\n return `${month} ${day}${ordinalSuffix(day)}`;\n }\n return new Intl.DateTimeFormat(language, {\n month: \"long\",\n day: \"numeric\",\n }).format(d);\n}\n\n// Time-of-day range for a single-day exceptional opening (e.g. \"09:00 - 21:00\").\nexport function formatExceptionalTime(p: ExceptionalPeriod): string {\n const begin = new Date(p.period_begin);\n const end = new Date(p.period_end);\n if (isNaN(begin.getTime()) || isNaN(end.getTime())) {\n return `${p.period_begin} - ${p.period_end}`;\n }\n return formatPeriod(\n begin.toISOString().slice(11, 16),\n end.toISOString().slice(11, 16),\n );\n}\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { Clock } from \"../../../components/Icons/Icons\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport {\n OpeningTimes,\n isOpenNow,\n groupRegularHoursByWeekday,\n formatPeriod,\n getWeekdayFullLabel,\n getTodayWeekday,\n getFutureExceptionalPeriods,\n formatExceptionalDate,\n formatExceptionalTime,\n} from \"../../../utils/openingTimes\";\nimport styles from \"./OpeningHours.module.css\";\n\ninterface Props {\n openingTimes?: OpeningTimes;\n chargingWhenClosed?: boolean;\n}\n\nexport const OpeningHours: React.FC<Props> = ({\n openingTimes,\n chargingWhenClosed,\n}) => {\n const { t, language } = useMapContext();\n if (!openingTimes) return null;\n\n const status = isOpenNow(openingTimes);\n const grouped = groupRegularHoursByWeekday(openingTimes.regular_hours);\n const futureClosings = getFutureExceptionalPeriods(\n openingTimes.exceptional_closings,\n );\n const futureOpenings = getFutureExceptionalPeriods(\n openingTimes.exceptional_openings,\n );\n\n const hasRegular = (openingTimes.regular_hours?.length ?? 0) > 0;\n const showWeek = openingTimes.twentyfourseven || hasRegular;\n\n // No opening information at all — hide the row rather than show a misleading\n // status. (The \"No hours set\" design state is not yet finalised, see PR notes.)\n if (\n !showWeek &&\n futureClosings.length === 0 &&\n futureOpenings.length === 0 &&\n !chargingWhenClosed\n ) {\n return null;\n }\n\n const isOpen = openingTimes.twentyfourseven || status.open;\n const today = getTodayWeekday();\n\n let hint: string | undefined;\n if (openingTimes.twentyfourseven) {\n hint = t(\"location.hours24\");\n } else if (status.nextChange) {\n const { time, label, day } = status.nextChange;\n if (label === \"closes\") {\n hint = t(\"location.closesAt\", { time });\n } else {\n hint = day\n ? t(\"location.opensAtDay\", {\n time,\n day: getWeekdayFullLabel(language, day),\n })\n : t(\"location.opensAt\", { time });\n }\n }\n\n const pillStyle: React.CSSProperties = {\n display: \"inline-block\",\n borderRadius: 8,\n padding: \"1px 8px\",\n fontSize: 12,\n lineHeight: \"16px\",\n fontWeight: 600,\n background: isOpen ? \"#e7f6ec\" : \"#fdecea\",\n color: isOpen ? \"#1b7a3d\" : \"#c5221f\",\n };\n const dayStyle: React.CSSProperties = {\n display: \"flex\",\n fontSize: 12,\n lineHeight: 1.5,\n };\n const dayLabelStyle: React.CSSProperties = { minWidth: 84 };\n const dayValueStyle: React.CSSProperties = { flex: \"1 1 auto\" };\n const todayStyle: React.CSSProperties = { fontWeight: 600 };\n const exceptionalStyle: React.CSSProperties = {\n fontSize: 12,\n marginTop: 8,\n paddingTop: 8,\n borderTop: \"1px solid var(--roadmap-border-color, #e5e5e5)\",\n };\n const exceptionalHeaderStyle: React.CSSProperties = {\n fontWeight: 600,\n marginBottom: 4,\n };\n const footnoteStyle: React.CSSProperties = {\n fontSize: 11,\n fontStyle: \"italic\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n marginTop: 6,\n };\n\n const pill = (\n <span\n className={`${styles.pill} ${isOpen ? styles.pillOpen : styles.pillClosed}`}\n style={pillStyle}\n >\n {isOpen ? t(\"location.open\") : t(\"location.closedNow\")}\n </span>\n );\n\n return (\n <LocationRow icon={<Clock />} text={pill} hint={hint}>\n {showWeek &&\n [1, 2, 3, 4, 5, 6, 7].map((wd) => {\n const isToday = wd === today;\n const value = openingTimes.twentyfourseven\n ? t(\"location.open24hours\")\n : grouped[wd].length === 0\n ? t(\"location.closed\")\n : grouped[wd]\n .map((p) => formatPeriod(p.period_begin, p.period_end))\n .join(\", \");\n return (\n <div\n key={wd}\n className={`${styles.day} ${isToday ? styles.today : \"\"}`}\n style={{ ...dayStyle, ...(isToday ? todayStyle : {}) }}\n >\n <div className={styles.dayLabel} style={dayLabelStyle}>\n {getWeekdayFullLabel(language, wd)}\n </div>\n <div className={styles.dayValue} style={dayValueStyle}>\n {value}\n </div>\n </div>\n );\n })}\n\n {futureClosings.length > 0 && (\n <div className={styles.exceptional} style={exceptionalStyle}>\n <div\n className={`${styles.exceptionalHeader} ${styles.exceptionalClosingHeader}`}\n style={{ ...exceptionalHeaderStyle, color: \"#c5221f\" }}\n >\n {t(\"location.exceptionalClosings\")}\n </div>\n {futureClosings.map((p, i) => (\n <div\n key={`c-${i}`}\n className={`${styles.day} ${styles.today}`}\n style={{ ...dayStyle, ...todayStyle }}\n >\n <div className={styles.dayLabel} style={dayLabelStyle}>\n {formatExceptionalDate(language, p.period_begin)}\n </div>\n <div className={styles.dayValue} style={dayValueStyle}>\n {t(\"location.closed\")}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {futureOpenings.length > 0 && (\n <div className={styles.exceptional} style={exceptionalStyle}>\n <div\n className={`${styles.exceptionalHeader} ${styles.exceptionalOpeningHeader}`}\n style={{ ...exceptionalHeaderStyle, color: \"#1b7a3d\" }}\n >\n {t(\"location.exceptionalOpenings\")}\n </div>\n {futureOpenings.map((p, i) => (\n <div\n key={`o-${i}`}\n className={`${styles.day} ${styles.today}`}\n style={{ ...dayStyle, ...todayStyle }}\n >\n <div className={styles.dayLabel} style={dayLabelStyle}>\n {formatExceptionalDate(language, p.period_begin)}\n </div>\n <div className={styles.dayValue} style={dayValueStyle}>\n {formatExceptionalTime(p)}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {chargingWhenClosed && (\n <div className={styles.footnote} style={footnoteStyle}>\n {t(\"location.chargingWhenClosed\")}\n </div>\n )}\n </LocationRow>\n );\n};\n\nexport default OpeningHours;\n","import React from \"react\";\nimport CarIcon from \"../../../assets/car-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { getLocationLabel } from \"../../../utils/formatters\";\nimport { OcpiLocationType } from \"../../../types\";\n\ninterface Props {\n parkingType?: OcpiLocationType;\n}\n\nexport const ParkingType: React.FC<Props> = ({ parkingType }) => {\n const { t } = useMapContext();\n if (!parkingType || parkingType === \"PARKING_TYPE_UNKNOWN\") return null;\n return (\n <LocationRow\n icon={<img src={CarIcon} alt=\"parking icon\" />}\n text={getLocationLabel(t, parkingType)}\n />\n );\n};\n\nexport default ParkingType;\n","import React from \"react\";\nimport CarIcon from \"../../../assets/car-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\n\ninterface Props {\n accessibility?: string;\n}\n\nexport const ChargingAccessibility: React.FC<Props> = ({ accessibility }) => {\n if (!accessibility) return null;\n return (\n <LocationRow\n icon={<img src={CarIcon} alt=\"accessibility icon\" />}\n text={\n accessibility === \"TESLA\"\n ? \"Tesla vehicles only\"\n : \"All electric vehicles\"\n }\n />\n );\n};\n\nexport default ChargingAccessibility;\n","import React from \"react\";\nimport BoltIcon from \"../../../assets/bolt-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { OcpiEvse } from \"../../../types\";\n\ninterface Props {\n evse: OcpiEvse;\n}\n\nexport const EvseHeader: React.FC<Props> = ({ evse }) => (\n <LocationRow\n icon={<img src={BoltIcon} alt=\"power icon\" />}\n text={evse.evse_id || \"\"}\n hint={evse.physical_reference || undefined}\n />\n);\n\nexport default EvseHeader;\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport StatusDot from \"../../../components/StatusDot/StatusDot\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { getStatusLabel, formatNumber } from \"../../../utils/formatters\";\nimport { getStatusColor } from \"../../../utils/status\";\nimport { calculateMaxPower, ConnectorPowerType } from \"../../../utils/ocpi\";\nimport { OcpiEvse } from \"../../../types\";\n\ninterface Props {\n evse: OcpiEvse;\n}\n\nexport const EvseStatus: React.FC<Props> = ({ evse }) => {\n const { t, language, options } = useMapContext();\n const first = evse.connectors[0];\n const maxKw =\n first?.power && first?.connectorPowerType\n ? `${formatNumber(\n language,\n Math.floor(\n calculateMaxPower(\n first as {\n power: {\n maxWatts: number;\n maxVoltage: number;\n maxAmperage: number;\n };\n connectorPowerType: ConnectorPowerType;\n },\n ),\n ),\n )}kW`\n : null;\n const text = [getStatusLabel(t, evse.status), maxKw]\n .filter(Boolean)\n .join(\", \");\n return (\n <LocationRow\n icon={\n <StatusDot\n color={getStatusColor(evse.status, \"roaming\", options?.version)}\n />\n }\n text={text}\n />\n );\n};\n\nexport default EvseStatus;\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { getSocketIcon, getSocketText } from \"../../../utils/formatters\";\nimport { OcpiConnector } from \"../../../types\";\n\ninterface Props {\n connector: OcpiConnector;\n}\n\nexport const ConnectorSocket: React.FC<Props> = ({ connector }) => (\n <LocationRow\n icon={<img src={getSocketIcon(connector)} alt=\"socket type\" />}\n text={getSocketText(connector)}\n />\n);\n\nexport default ConnectorSocket;\n","import React from \"react\";\nimport PricingIcon from \"../../../assets/pricing-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\n\nexport const ConnectorPricing: React.FC = () => {\n const { t } = useMapContext();\n return (\n <LocationRow\n icon={<img src={PricingIcon} alt=\"pricing\" />}\n text={t(\"evse.pricing\")}\n />\n );\n};\n\nexport default ConnectorPricing;\n","import React from \"react\";\nimport ConnectorTariff from \"../../../components/ConnectorTariff/ConnectorTariff\";\nimport { CdrAdditionalCharge, OcpiTariff, Tariff } from \"../../../types\";\nimport { useMapContext } from \"../../../contexts/Map\";\n\nexport function transformTariff(tariff: OcpiTariff): Tariff {\n if (!tariff?.currency) return null;\n return {\n currency: tariff.currency,\n id: tariff.id,\n country_code: tariff.country_code,\n party_id: tariff.party_id,\n elements: (tariff?.elements || []).map((element) => ({\n priceComponents: (element?.price_components || []).map((component) => ({\n type: (() => {\n switch (component.type) {\n case \"FLAT\":\n return \"FLAT\";\n case \"TIME\":\n return \"TIME\";\n case \"ENERGY\":\n return \"ENERGY\";\n case \"PARKING_TIME\":\n return \"PARKING_TIME\";\n case \"CONGESTION_TIME\":\n return \"CONGESTION_TIME\";\n }\n })() as \"FLAT\" | \"TIME\" | \"ENERGY\" | \"PARKING_TIME\" | \"CONGESTION_TIME\",\n price: component.price,\n vat: component.vat,\n stepSize: component.step_size,\n })),\n ...(element?.restrictions\n ? {\n restrictions: {\n startTime: element?.restrictions?.start_time,\n endTime: element?.restrictions?.end_time,\n startDate: element?.restrictions?.start_date,\n endDate: element?.restrictions?.end_date,\n dayOfWeek: element?.restrictions?.day_of_week,\n minDuration: element?.restrictions?.min_duration,\n maxDuration: element?.restrictions?.max_duration,\n },\n }\n : {}),\n })),\n };\n}\n\ninterface Props {\n tariff: any;\n additionalCharges: CdrAdditionalCharge[];\n}\n\nconst TariffV2: React.FC<Props> = ({ tariff, additionalCharges }) => {\n const { t } = useMapContext();\n\n // Check if tariff has congestion pricing\n const hasCongestionPricing = tariff?.elements?.some((element: any) =>\n element?.price_components?.some((pc: any) => pc.type === \"CONGESTION_TIME\"),\n );\n\n return (\n <>\n {hasCongestionPricing && (\n <div\n style={{\n padding: \"0.8rem\",\n margin: \"0.8rem 0\",\n backgroundColor: \"#FFF4E5\",\n borderLeft: \"3px solid #FF9800\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n color: \"#663C00\",\n }}\n >\n {t(\"tariff.congestionPricing\")}\n </div>\n )}\n <ConnectorTariff\n tariff={transformTariff(tariff as any)}\n cdrAdditionalCharges={additionalCharges}\n />\n </>\n );\n};\n\nexport default TariffV2;\n","import { DayOfWeek, PriceComponent, Tariff, TariffElement } from \"../types\";\nimport { isBaseTarif } from \"./ocpi\";\n\nconst JS_DAY_TO_OCPI: DayOfWeek[] = [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n];\n\nfunction timeToMinutes(time: string): number {\n const [h, m] = time.split(\":\").map(Number);\n return h * 60 + (m || 0);\n}\n\nfunction isInTimeWindow(start: string, end: string, now: Date): boolean {\n const cur = now.getHours() * 60 + now.getMinutes();\n const s = timeToMinutes(start);\n const e = timeToMinutes(end);\n if (e < s) return cur >= s || cur < e; // overnight wrap\n return cur >= s && cur < e;\n}\n\nexport function isElementActive(el: TariffElement, now: Date): boolean {\n if (isBaseTarif(el)) return true;\n const r = el.restrictions!;\n if (r.startTime && r.endTime && !isInTimeWindow(r.startTime, r.endTime, now)) {\n return false;\n }\n if (r.dayOfWeek && r.dayOfWeek.length > 0) {\n const today = JS_DAY_TO_OCPI[now.getDay()];\n if (!r.dayOfWeek.includes(today)) return false;\n }\n if (r.startDate) {\n const d = new Date(r.startDate);\n if (!isNaN(d.getTime()) && now < d) return false;\n }\n if (r.endDate) {\n const d = new Date(r.endDate);\n if (!isNaN(d.getTime()) && now > d) return false;\n }\n return true;\n}\n\nexport type ActiveTariffSelection = {\n elements: TariffElement[];\n currency: string;\n};\n\nfunction bucketKey(type: string, el: TariffElement): string {\n const minD = el.restrictions?.minDuration ?? 0;\n const maxD = el.restrictions?.maxDuration ?? 0;\n return `${type}:${minD}:${maxD}`;\n}\n\nexport function getActiveTariffElements(\n tariff: Tariff | null | undefined,\n now: Date = new Date(),\n): ActiveTariffSelection {\n if (!tariff) return { elements: [], currency: \"\" };\n const all = tariff.elements || [];\n const active = all.filter((el) => isElementActive(el, now));\n\n type Winner = { element: TariffElement; pc: PriceComponent; isBase: boolean };\n const byBucket: Record<string, Winner> = {};\n\n active.forEach((el) => {\n const isBase = isBaseTarif(el);\n (el.priceComponents || []).forEach((pc) => {\n const key = bucketKey(pc.type, el);\n const existing = byBucket[key];\n if (!existing || (existing.isBase && !isBase)) {\n byBucket[key] = { element: el, pc, isBase };\n }\n });\n });\n\n const elementToPcs = new Map<TariffElement, PriceComponent[]>();\n const order: TariffElement[] = [];\n Object.values(byBucket).forEach(({ element, pc }) => {\n if (!elementToPcs.has(element)) {\n elementToPcs.set(element, []);\n order.push(element);\n }\n elementToPcs.get(element)!.push(pc);\n });\n\n const elements: TariffElement[] = order.map((el) => ({\n ...el,\n priceComponents: elementToPcs.get(el)!,\n }));\n\n return { elements, currency: tariff.currency || \"\" };\n}\n","import React from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { CdrAdditionalCharge, PriceComponent, TariffElement } from \"../../../types\";\nimport { LabelsType } from \"../../../i18n\";\n\nconst itemsRowStyle: React.CSSProperties = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 6,\n};\n\nconst itemStyle: React.CSSProperties = {\n fontSize: 12,\n lineHeight: 1.3,\n padding: \"1px 8px\",\n borderRadius: 6,\n background:\n \"color-mix(in srgb, var(--roadmap-brand-color, #6102d3) 12%, transparent)\",\n color: \"var(--roadmap-brand-color, #6102d3)\",\n border:\n \"1px solid color-mix(in srgb, var(--roadmap-brand-color, #6102d3) 30%, transparent)\",\n};\n\nconst itemHighlightStyle: React.CSSProperties = itemStyle;\n\nconst STRING_BY_TYPE: Record<string, keyof LabelsType> = {\n ENERGY: \"tariffPriceComponent.energy\",\n TIME: \"tariffPriceComponent.time\",\n FLAT: \"tariffPriceComponent.flat\",\n PARKING_TIME: \"tariffPriceComponent.parkingTime\",\n};\n\nconst DISPLAY_ORDER = [\"ENERGY\", \"TIME\", \"FLAT\", \"PARKING_TIME\"];\n\nfunction formatCurrency(value: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: currency || \"EUR\",\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction priceWithVat(pc: PriceComponent): number {\n const vat = pc.vat ? pc.vat / 100 : 0;\n return pc.price + pc.price * vat;\n}\n\ntype RenderablePc = {\n pc: PriceComponent;\n restrictions?: TariffElement[\"restrictions\"];\n};\n\nfunction isFreeParkingWindow(\n pc: PriceComponent,\n restrictions: TariffElement[\"restrictions\"] | undefined,\n): boolean {\n return (\n pc.type === \"PARKING_TIME\" &&\n (pc.price || 0) === 0 &&\n !!restrictions?.maxDuration &&\n (!restrictions.minDuration || restrictions.minDuration === 0)\n );\n}\n\nfunction collectAndSort(\n elements: TariffElement[],\n skipZero: boolean,\n): RenderablePc[] {\n const all: RenderablePc[] = [];\n elements.forEach((el) => {\n (el.priceComponents || []).forEach((pc) => {\n if (skipZero && (pc.price || 0) <= 0 && !isFreeParkingWindow(pc, el.restrictions)) {\n return;\n }\n all.push({ pc, restrictions: el.restrictions });\n });\n });\n return all.sort((a, b) => {\n const ai = DISPLAY_ORDER.indexOf(a.pc.type);\n const bi = DISPLAY_ORDER.indexOf(b.pc.type);\n if (ai === -1) return 1;\n if (bi === -1) return -1;\n return ai - bi;\n });\n}\n\ninterface Props {\n elements: TariffElement[];\n currency: string;\n skipZero?: boolean;\n highlight?: boolean;\n additionalCharges?: CdrAdditionalCharge[];\n}\n\nexport const TariffChips: React.FC<Props> = ({\n elements,\n currency,\n skipZero = true,\n highlight = false,\n additionalCharges = [],\n}) => {\n const { t } = useMapContext();\n const items = collectAndSort(elements, skipZero);\n const chipStyle = highlight ? itemHighlightStyle : itemStyle;\n if (items.length === 0 && additionalCharges.length === 0) return null;\n return (\n <div style={itemsRowStyle}>\n {items.map(({ pc, restrictions }, i) => {\n if (isFreeParkingWindow(pc, restrictions)) {\n return (\n <div key={`pc-${i}`} style={chipStyle}>\n {t(\"tariffPriceComponent.parkingTimeWait\", {\n minutes: String(Math.floor(restrictions!.maxDuration! / 60)),\n })}\n </div>\n );\n }\n const labelKey = STRING_BY_TYPE[pc.type];\n if (!labelKey) return null;\n return (\n <div key={`pc-${i}`} style={chipStyle}>\n {t(labelKey, {\n total: formatCurrency(priceWithVat(pc), currency),\n })}\n </div>\n );\n })}\n {additionalCharges.map((c) => {\n if (c.type !== \"FLAT_FEE\") return null;\n const total = c.price + (c.vat ? c.price * (c.vat / 100) : 0);\n return (\n <div key={`cdr-${c.id}`} style={chipStyle}>\n {t(\"cdrPrice.flatFee\", {\n total: formatCurrency(total, currency),\n })}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default TariffChips;\n","import React, { ReactNode } from \"react\";\nimport { CdrAdditionalCharge, TariffElement } from \"../../../types\";\nimport TariffChips from \"./TariffChips\";\n\ninterface Props {\n elements: TariffElement[];\n currency: string;\n label?: ReactNode;\n trailing?: ReactNode;\n highlight?: boolean;\n additionalCharges?: CdrAdditionalCharge[];\n onClick?: () => void;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"6px 0\",\n};\n\nconst headerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n fontSize: 12,\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n};\n\nconst rowStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n};\n\nexport const TariffLine: React.FC<Props> = ({\n elements,\n currency,\n label,\n trailing,\n highlight = false,\n additionalCharges,\n onClick,\n}) => {\n const interactive = !!onClick;\n const containerWithClick: React.CSSProperties = interactive\n ? { ...containerStyle, cursor: \"pointer\", userSelect: \"none\" }\n : containerStyle;\n\n const handleKey = (e: React.KeyboardEvent) => {\n if (!onClick) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <div\n style={containerWithClick}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={onClick}\n onKeyDown={interactive ? handleKey : undefined}\n >\n {label != null && <div style={headerStyle}>{label}</div>}\n <div style={rowStyle}>\n <TariffChips\n elements={elements}\n currency={currency}\n highlight={highlight}\n additionalCharges={additionalCharges}\n />\n {trailing}\n </div>\n </div>\n );\n};\n\nexport default TariffLine;\n","import React, { useState } from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { Check } from \"../../../components/Icons/Icons\";\n\ninterface Props {\n type: string;\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n}\n\ntype Status = \"idle\" | \"submitting\" | \"done\" | \"error\";\n\nconst buttonStyle: React.CSSProperties = {\n fontSize: 12,\n fontWeight: 600,\n padding: \"4px 12px\",\n borderRadius: 6,\n cursor: \"pointer\",\n background: \"transparent\",\n color: \"var(--roadmap-brand-color, #6102d3)\",\n border:\n \"1px solid color-mix(in srgb, var(--roadmap-brand-color, #6102d3) 40%, transparent)\",\n};\n\nconst submittingStyle: React.CSSProperties = {\n ...buttonStyle,\n cursor: \"default\",\n opacity: 0.6,\n};\n\nconst doneStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n color: \"var(--roadmap-brand-color, #6102d3)\",\n};\n\nconst errorStyle: React.CSSProperties = {\n fontSize: 11,\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n marginTop: 6,\n};\n\nexport const ReportProblemButton: React.FC<Props> = ({\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n}) => {\n const { t, reportProblem } = useMapContext();\n const [status, setStatus] = useState<Status>(\"idle\");\n\n const submit = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (status === \"submitting\" || status === \"done\") return;\n setStatus(\"submitting\");\n try {\n await reportProblem?.({\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n });\n setStatus(\"done\");\n } catch {\n setStatus(\"error\");\n }\n };\n\n if (status === \"done\") {\n return (\n <div style={doneStyle}>\n <Check />\n <span>{t(\"tariff.reportThanks\")}</span>\n </div>\n );\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={submit}\n disabled={status === \"submitting\"}\n style={status === \"submitting\" ? submittingStyle : buttonStyle}\n >\n {t(\"tariff.report\")}\n </button>\n {status === \"error\" && (\n <div style={errorStyle}>{t(\"tariff.reportError\")}</div>\n )}\n </>\n );\n};\n\nexport default ReportProblemButton;\n","import React from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport ReportProblemButton from \"./ReportProblemButton\";\n\ninterface Props {\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 10,\n padding: \"14px 14px\",\n marginTop: 6,\n borderRadius: 8,\n background:\n \"color-mix(in srgb, var(--roadmap-text-color, #2a2a2a) 4%, transparent)\",\n};\n\nconst textStyle: React.CSSProperties = {\n fontSize: 12,\n fontStyle: \"italic\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n};\n\nexport const NoTariff: React.FC<Props> = ({\n country_code,\n party_id,\n location_id,\n evse_uid,\n}) => {\n const { t } = useMapContext();\n return (\n <div style={containerStyle}>\n <div style={textStyle}>{t(\"tariffPriceComponent.noTariff\")}</div>\n <ReportProblemButton\n type=\"missing_tariff\"\n country_code={country_code}\n party_id={party_id}\n location_id={location_id}\n evse_uid={evse_uid}\n />\n </div>\n );\n};\n\nexport default NoTariff;\n","import React from \"react\";\nimport { ChevronRight } from \"../../../components/Icons/Icons\";\nimport { CdrAdditionalCharge, OcpiTariff } from \"../../../types\";\nimport { transformTariff } from \"./Tariff\";\nimport { getActiveTariffElements } from \"../../../utils/activeTariff\";\nimport TariffLine from \"./TariffLine\";\nimport NoTariff from \"./NoTariff\";\n\ninterface Props {\n tariff?: OcpiTariff;\n additionalCharges?: CdrAdditionalCharge[];\n evseId?: string;\n evseUid: string;\n countryCode: string;\n partyId: string;\n locationId: string;\n locationName: string;\n setView: (view: string, args?: any) => void;\n}\n\nconst chevronStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n flex: \"0 0 auto\",\n};\n\nexport const ActiveTariff: React.FC<Props> = ({\n tariff,\n additionalCharges = [],\n evseId,\n evseUid,\n countryCode,\n partyId,\n locationId,\n locationName,\n setView,\n}) => {\n const transformed = tariff ? transformTariff(tariff) : null;\n const { elements: rawElements, currency } =\n getActiveTariffElements(transformed);\n\n const activeElements = rawElements\n .map((el) => ({\n ...el,\n priceComponents: (el.priceComponents || []).filter((pc) => {\n if ((pc.price || 0) > 0) return true;\n if (\n pc.type === \"PARKING_TIME\" &&\n el.restrictions?.maxDuration &&\n (!el.restrictions.minDuration || el.restrictions.minDuration === 0)\n ) {\n return true;\n }\n return false;\n }),\n }))\n .filter((el) => el.priceComponents.length > 0);\n\n const hasActiveTariff = !!transformed && activeElements.length > 0;\n\n if (!hasActiveTariff) {\n return (\n <>\n <NoTariff\n country_code={countryCode}\n party_id={partyId}\n location_id={locationId}\n evse_uid={evseUid}\n />\n {additionalCharges.length > 0 && (\n <TariffLine\n elements={[]}\n currency={currency}\n additionalCharges={additionalCharges}\n />\n )}\n </>\n );\n }\n\n const navigate = () =>\n setView(\"tariffDetails\", {\n tariff,\n additionalCharges,\n locationName,\n evseId,\n evseUid,\n countryCode,\n partyId,\n locationId,\n });\n\n return (\n <TariffLine\n elements={activeElements}\n currency={currency}\n highlight\n additionalCharges={additionalCharges}\n onClick={navigate}\n trailing={\n <span style={chevronStyle}>\n <ChevronRight />\n </span>\n }\n />\n );\n};\n\nexport default ActiveTariff;\n","import React from \"react\";\nimport ConnectorSocket from \"./ConnectorSocket\";\nimport ConnectorPricing from \"./ConnectorPricing\";\nimport ActiveTariff from \"./ActiveTariff\";\nimport {\n CdrAdditionalCharge,\n OcpiConnector,\n OcpiLocation,\n OcpiTariff,\n Tariff as TariffType,\n} from \"../../../types\";\n\ninterface Props {\n connector: OcpiConnector;\n tariffs?: TariffType[];\n cdrAdditionalCharges: CdrAdditionalCharge[];\n location: OcpiLocation;\n evseId?: string;\n evseUid?: string;\n setView: (view: string, args?: any) => void;\n}\n\nexport const Connector: React.FC<Props> = ({\n connector,\n tariffs,\n cdrAdditionalCharges,\n location,\n evseId,\n evseUid,\n setView,\n}) => {\n const tariff = tariffs?.find((tr) => tr.id === connector?.tariff_ids?.[0]);\n\n return (\n <>\n <ConnectorSocket connector={connector} />\n <ConnectorPricing />\n <ActiveTariff\n tariff={tariff as unknown as OcpiTariff}\n additionalCharges={cdrAdditionalCharges}\n evseId={evseId}\n evseUid={evseUid || \"\"}\n countryCode={location.country_code}\n partyId={location.party_id}\n locationId={location.id}\n locationName={location.name}\n setView={setView}\n />\n </>\n );\n};\n\nexport default Connector;\n","import React from \"react\";\nimport EvseHeader from \"./EvseHeader\";\nimport EvseStatus from \"./EvseStatus\";\nimport Connector from \"./Connector\";\nimport { getColorForStatus } from \"../../../utils/location\";\nimport {\n CdrAdditionalCharge,\n OcpiEvse,\n OcpiLocation,\n Tariff as TariffType,\n} from \"../../../types\";\n\ninterface Props {\n evse: OcpiEvse;\n tariffs?: TariffType[];\n cdrAdditionalCharges: CdrAdditionalCharge[];\n location: OcpiLocation;\n setView: (view: string, args?: any) => void;\n}\n\nconst cardStyle: React.CSSProperties = {\n background:\n \"color-mix(in srgb, var(--roadmap-text-color, #2a2a2a) 4%, transparent)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n marginTop: 12,\n};\n\nconst connectorBaseStyle: React.CSSProperties = {\n paddingLeft: 10,\n marginTop: 10,\n};\n\nexport const Evse: React.FC<Props> = ({\n evse,\n tariffs,\n cdrAdditionalCharges,\n location,\n setView,\n}) => {\n const statusColor = getColorForStatus(evse.status);\n const connectorStyle: React.CSSProperties = {\n ...connectorBaseStyle,\n borderLeft: `3px solid ${statusColor}`,\n borderRadius: 2,\n };\n\n return (\n <div style={cardStyle}>\n <EvseHeader evse={evse} />\n <EvseStatus evse={evse} />\n {evse.connectors.map((connector, i) => (\n <div key={`connector-${i}`} style={connectorStyle}>\n <Connector\n connector={connector}\n tariffs={tariffs}\n cdrAdditionalCharges={cdrAdditionalCharges}\n location={location}\n evseId={evse.evse_id}\n evseUid={evse.uid}\n setView={setView}\n />\n </div>\n ))}\n </div>\n );\n};\n\nexport default Evse;\n","import React from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiDisplayText } from \"../../../types\";\n\ninterface Props {\n directions?: OcpiDisplayText[];\n}\n\nconst containerStyle: React.CSSProperties = {\n fontSize: 12,\n fontStyle: \"italic\",\n lineHeight: 1.5,\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n padding: \"12px 0 12px 12px\",\n margin: \"8px 0\",\n borderLeft:\n \"3px solid color-mix(in srgb, var(--roadmap-text-color, #2a2a2a) 20%, transparent)\",\n};\n\nfunction pickText(\n directions: OcpiDisplayText[],\n language: string,\n): string | undefined {\n if (!directions || directions.length === 0) return undefined;\n const lang = (language || \"\").toLowerCase();\n const match = directions.find((d) => d.language?.toLowerCase() === lang);\n if (match) return match.text;\n const en = directions.find((d) => d.language?.toLowerCase() === \"en\");\n return (en || directions[0])?.text;\n}\n\nexport const Directions: React.FC<Props> = ({ directions }) => {\n const { language } = useMapContext();\n const text = pickText(directions || [], language);\n if (!text) return null;\n return <div style={containerStyle}>{text}</div>;\n};\n\nexport default Directions;\n","import React from \"react\";\nimport styles from \"../locations.module.css\";\nimport LocationHeader from \"./LocationHeader\";\nimport AvailabilitySummary from \"./AvailabilitySummary\";\nimport OperatorSection from \"./OperatorSection\";\nimport OpeningHours from \"./OpeningHours\";\nimport ParkingType from \"./ParkingType\";\nimport ChargingAccessibility from \"./ChargingAccessibility\";\nimport Evse from \"./Evse\";\nimport Directions from \"./Directions\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiLocation } from \"../../../types\";\n\ninterface Props {\n currentLocation: OcpiLocation;\n setView: (view: string, args?: any) => void;\n}\n\nexport const Location: React.FC<Props> = ({ currentLocation, setView }) => {\n const { options, mapKind } = useMapContext();\n\n return (\n <div className={styles.container}>\n {mapKind === \"cpo\" && (\n <div className={styles.publishingMode}>\n {currentLocation?.publish ? \"Public location\" : \"Private location\"}\n </div>\n )}\n\n <Directions directions={currentLocation.directions} />\n <LocationHeader location={currentLocation} />\n <AvailabilitySummary evses={currentLocation.evses} />\n\n <OperatorSection\n operator={currentLocation.operator}\n suboperator={currentLocation.suboperator || currentLocation.subOperator}\n fallbackOperatorName={\n currentLocation.operator_name || currentLocation.operatorName\n }\n fallbackSuboperatorName={\n currentLocation.suboperator_name || currentLocation.suboperatorName\n }\n />\n\n <OpeningHours\n openingTimes={currentLocation.opening_times}\n chargingWhenClosed={currentLocation.charging_when_closed}\n />\n\n <ParkingType parkingType={currentLocation.parkingType} />\n <ChargingAccessibility accessibility={currentLocation.charging_accessibility} />\n\n {currentLocation.evses?.map((evse) => (\n <Evse\n key={`${evse.evse_id}-${evse.uid}`}\n evse={evse}\n tariffs={currentLocation.tariffs}\n cdrAdditionalCharges={currentLocation.cdrAdditionalCharges || []}\n location={currentLocation}\n setView={setView}\n />\n ))}\n </div>\n );\n};\n\nexport default Location;\n","import React, { useEffect, useState } from \"react\";\nimport styles from \"./locations.module.css\";\nimport LocationPlaceholder from \"../../components/LocationPlaceholder/LocationPlaceholder\";\nimport { ChevronLeft, ChevronRight } from \"../../components/Icons/Icons\";\nimport Debug from \"../../components/Debug/Debug\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { useStackContext } from \"../../components/Stack/Stack\";\nimport LocationDetailsV1 from \"./LocationDetailsV1\";\nimport Location from \"./v2/Location\";\nimport { OcpiLocation } from \"../../types\";\nimport { atLeast } from \"../../utils/version\";\n\ninterface Props {}\n\nconst Locations: React.FC<Props> = () => {\n const { setView } = useStackContext();\n const { locations, locationsStatus, options } = useMapContext();\n const [locationIndex, setLocationIndex] = useState(0);\n\n useEffect(() => {\n setLocationIndex(0);\n }, [locations]);\n\n const currentLocation = locations[locationIndex];\n\n if (locationsStatus.type === \"loading\" || !currentLocation) {\n return (\n <div className={styles.container}>\n <LocationPlaceholder />\n </div>\n );\n }\n\n const { evses = [], cdrAdditionalCharges } = currentLocation;\n\n const canNext = locationIndex < locations.length - 1;\n const canPrev = locationIndex > 0;\n\n const debugMode = window.location?.search?.includes(\"debug\");\n\n const label = () => {\n switch (options.version) {\n case \"v2\":\n return [currentLocation?.address, currentLocation?.city];\n default:\n //@ts-ignore\n return [currentLocation?.address, currentLocation?.city];\n }\n };\n const isV2 = atLeast(options.version, \"v2\");\n\n return (\n <>\n {debugMode && currentLocation && <Debug location={currentLocation} />}\n <div className={styles.headerContainer}>\n <div className={styles.header}>\n {locations.length > 1 && (\n <div className={styles.pagingation}>\n <span>\n {locationIndex + 1} / {locations.length}\n </span>\n\n <button\n disabled={!canPrev}\n onClick={() => {\n setLocationIndex(Math.max(0, locationIndex - 1));\n }}\n >\n <ChevronLeft />\n </button>\n <button\n disabled={!canNext}\n onClick={() =>\n setLocationIndex(\n Math.min(locations.length - 1, locationIndex + 1),\n )\n }\n >\n <ChevronRight />\n </button>\n </div>\n )}\n {label().filter(Boolean).join(\", \")}\n </div>\n </div>\n {!isV2 && (\n <LocationDetailsV1\n setView={setView}\n cdrAdditionalCharges={cdrAdditionalCharges}\n currentLocation={currentLocation}\n evses={evses}\n />\n )}\n {isV2 && (\n <Location\n setView={setView}\n currentLocation={currentLocation as unknown as OcpiLocation}\n />\n )}\n </>\n );\n};\n\nexport default Locations;\n","import React from \"react\";\n\nimport styles from \"./BackButton.module.css\";\n\nimport { ChevronLeft } from \"../Icons/Icons\";\nimport { useMapContext } from \"../../contexts/Map\";\n\nexport default function BackButton({ onClick = () => {} }) {\n const { t } = useMapContext();\n return (\n <button onClick={onClick} className={styles.backButton}>\n <ChevronLeft />\n {t(\"backButton.backTo\")}\n </button>\n );\n}\n","import React, { useEffect, useState, useTransition } from \"react\";\n\nimport { useStackContext } from \"../../components/Stack/Stack\";\n\nimport BackButton from \"../../components/BackButton/BackButton\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport styles from \"./locations.module.css\";\n\nimport BoltIcon from \"../../assets/bolt-icon.svg\";\n\nexport default function TariffNote() {\n const { t } = useMapContext();\n const { current, setView } = useStackContext();\n const { notes = [], evseId, locationName } = current?.args || {};\n\n return (\n <>\n <div className={styles.headerContainer}>\n <div\n className={styles.header}\n onClick={() => setView(\"locations\")}\n style={{ cursor: \"pointer\" }}\n >\n <BackButton />\n {locationName?.text || locationName}\n </div>\n </div>\n <div className={styles.container}>\n <div className={styles.subheader}>{t(\"tariffNote.subHeader\")}</div>\n\n {evseId && (\n <div className={styles.row}>\n <img className={styles.icon} src={BoltIcon} alt=\"power icon\" />\n <div className={styles.text}>{evseId}</div>\n </div>\n )}\n\n {notes.map((note) => (\n <p className={styles.note} key={note}>\n {note}\n </p>\n ))}\n </div>\n </>\n );\n}\n","import { useStackContext } from \"../../components/Stack/Stack\";\n\nimport BackButton from \"../../components/BackButton/BackButton\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport styles from \"./locations.module.css\";\nimport { Info } from \"../../components/Icons/Icons\";\nimport BoltIcon from \"../../assets/bolt-icon.svg\";\nimport ConnectorTariff from \"../../components/ConnectorTariff/ConnectorTariff\";\nimport TariffV2 from \"./v2/Tariff\";\n\nexport default function DynamicTariffs() {\n const { t } = useMapContext();\n const { current, setView } = useStackContext();\n const { connector, tariff, additionalCharges, locationName, evseId, notes } =\n current?.args || {};\n\n const connectorTariff = tariff || connector?.tariff;\n\n if (!connectorTariff) return null;\n\n return (\n <>\n <div className={styles.headerContainer}>\n <div\n className={styles.header}\n onClick={() => setView(\"locations\")}\n style={{ cursor: \"pointer\" }}\n >\n <BackButton />\n {locationName}\n </div>\n </div>\n <div className={styles.container}>\n <div className={styles.subheader}>{t(\"dynamicTariffs.subHeader\")}</div>\n <div className={styles.row}>\n <img className={styles.icon} src={BoltIcon} alt=\"power icon\" />\n <div className={styles.text}>{evseId}</div>\n </div>\n {tariff && (\n <TariffV2 tariff={tariff} additionalCharges={additionalCharges} />\n )}\n {connector.tariff && (\n <ConnectorTariff tariff={connector.tariff} compact={false} />\n )}\n <div\n className={styles.tariffNoteLink}\n onClick={() => {\n setView(\"tariffNote\", {\n locationName: locationName,\n evseId: evseId,\n notes: notes,\n });\n }}\n >\n <Info /> {t(\"tariffPriceComponent.viewTariff\")}\n </div>\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { useStackContext } from \"../../../components/Stack/Stack\";\nimport BackButton from \"../../../components/BackButton/BackButton\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport BoltIcon from \"../../../assets/bolt-icon.svg\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { transformTariff } from \"./Tariff\";\nimport TariffLine from \"./TariffLine\";\nimport NoTariff from \"./NoTariff\";\nimport { CdrAdditionalCharge, TariffElement } from \"../../../types\";\nimport {\n getSchedule,\n getDynamicTariff,\n isBaseTarif,\n} from \"../../../utils/ocpi\";\nimport styles from \"../locations.module.css\";\n\nconst defaultTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nconst sectionStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n marginTop: 14,\n};\n\nconst sectionHeaderStyle: React.CSSProperties = {\n fontSize: 12,\n fontWeight: 600,\n textTransform: \"capitalize\",\n lineHeight: 1.4,\n};\n\nconst descriptionStyle: React.CSSProperties = {\n fontSize: 12,\n lineHeight: 1.5,\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n marginTop: 8,\n};\n\nconst metaStyle: React.CSSProperties = {\n fontSize: 11,\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n marginTop: 6,\n};\n\nfunction formatTime(minutes: number): string {\n const date = new Date(0);\n date.setHours(Math.floor(minutes / 60), minutes % 60, 0, 0);\n return date.toLocaleTimeString(\"nl\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction daysForLocale(language: string): Record<string, string> {\n const { format } = new Intl.DateTimeFormat(language, { weekday: \"long\" });\n return [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n ].reduce(\n (acc, day, index) => {\n acc[day] = format(new Date(Date.UTC(2023, 9, index + 1)));\n return acc;\n },\n {} as Record<string, string>,\n );\n}\n\nfunction elementHasPaidComponents(el: TariffElement): boolean {\n return (el.priceComponents || []).some((pc) => {\n if ((pc.price || 0) > 0) return true;\n // Keep zero-priced PARKING_TIME with maxDuration — it represents the free parking window.\n if (\n pc.type === \"PARKING_TIME\" &&\n el.restrictions?.maxDuration &&\n (!el.restrictions.minDuration || el.restrictions.minDuration === 0)\n ) {\n return true;\n }\n return false;\n });\n}\n\nfunction pickAltText(\n altTexts: Array<{ language: string; text: string }> | undefined,\n language: string,\n): string | undefined {\n if (!altTexts || altTexts.length === 0) return undefined;\n const match = altTexts.find(\n (a) => a.language?.toLowerCase() === language?.toLowerCase(),\n );\n return (match || altTexts[0])?.text;\n}\n\nfunction formatLastUpdated(iso: string | undefined, language: string): string | undefined {\n if (!iso) return undefined;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return undefined;\n return new Intl.DateTimeFormat(language, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(d);\n}\n\nexport default function TariffDetails() {\n const { t, language } = useMapContext();\n const { current, setView } = useStackContext();\n const {\n tariff,\n additionalCharges,\n locationName,\n evseId,\n evseUid,\n countryCode,\n partyId,\n locationId,\n } = current?.args || {};\n\n if (!tariff) return null;\n const transformed = transformTariff(tariff);\n const reportProps = {\n country_code: countryCode || tariff.country_code || \"\",\n party_id: partyId || tariff.party_id || \"\",\n location_id: locationId || \"\",\n evse_uid: evseUid || \"\",\n };\n\n const description = pickAltText(tariff.tariff_alt_text, language);\n const lastUpdated = formatLastUpdated(tariff.last_updated, language);\n\n const renderHeader = () => (\n <div className={styles.headerContainer}>\n <div\n className={styles.header}\n onClick={() => setView(\"locations\")}\n style={{ cursor: \"pointer\" }}\n >\n <BackButton />\n {locationName}\n </div>\n </div>\n );\n\n if (!transformed) {\n return (\n <>\n {renderHeader()}\n <div className={styles.container}>\n <NoTariff {...reportProps} />\n </div>\n </>\n );\n }\n\n const elements = (transformed.elements || []).filter(\n elementHasPaidComponents,\n );\n const currency = transformed.currency || \"\";\n const charges: CdrAdditionalCharge[] = additionalCharges || [];\n\n const baseElements = elements.filter(isBaseTarif);\n const dynamicTariffs = getDynamicTariff({\n elements,\n limit: 40,\n now: new Date(),\n });\n const scheduledTariffs = dynamicTariffs.length\n ? []\n : getSchedule(elements, defaultTimeZone, new Date());\n\n const isBaseActive = !scheduledTariffs.some((s) => s.isActive);\n const i18nDays = daysForLocale(language);\n\n return (\n <>\n {renderHeader()}\n <div className={styles.container}>\n <div className={styles.subheader}>{t(\"tariff.fullDetailsHeader\")}</div>\n {evseId && (\n <LocationRow\n icon={<img src={BoltIcon} alt=\"power icon\" />}\n text={evseId}\n />\n )}\n\n {description && <div style={descriptionStyle}>{description}</div>}\n {lastUpdated && (\n <div style={metaStyle}>\n {t(\"tariff.lastUpdated\", { date: lastUpdated })}\n </div>\n )}\n\n {baseElements.length > 0 && (\n <div style={sectionStyle}>\n <TariffLine\n elements={baseElements}\n currency={currency}\n highlight={scheduledTariffs.length > 0 && isBaseActive}\n additionalCharges={charges}\n />\n </div>\n )}\n\n {scheduledTariffs.map((schedule) => (\n <div key={schedule.days.join(\"-\")} style={sectionStyle}>\n <div style={sectionHeaderStyle}>\n {schedule.days.map((d) => i18nDays[d]).join(\" – \")}\n </div>\n {schedule.items.map((item, i) => (\n <TariffLine\n key={i}\n elements={item.elements || []}\n currency={currency}\n highlight={!!item.isActive}\n label={\n !item.isFullDay\n ? `${formatTime(item.startTime)} – ${formatTime(item.endTime)}`\n : undefined\n }\n />\n ))}\n </div>\n ))}\n\n {dynamicTariffs.map((dyn, i) => (\n <div key={i} style={sectionStyle}>\n <div style={sectionHeaderStyle}>\n {t(\"tariffPriceComponent.dynamicTariffHeader\", {\n date: new Intl.DateTimeFormat(language, {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n }).format(dyn.date),\n })}\n </div>\n {dyn.items.map((item, j) => (\n <TariffLine\n key={j}\n elements={item.elements || []}\n currency={currency}\n highlight={!!item.isActive}\n label={`${formatTime(item.startTime)} – ${formatTime(item.endTime)}`}\n />\n ))}\n </div>\n ))}\n\n {scheduledTariffs.length === 0 &&\n dynamicTariffs.length === 0 &&\n baseElements.length === 0 && <NoTariff {...reportProps} />}\n </div>\n </>\n );\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='10'%20height='11'%20viewBox='0%200%2010%2011'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M6.48751%205.99758L9.85376%202.63133C10.0484%202.43664%2010.0484%202.1207%209.85376%201.9257L9.07157%201.14351C8.87688%200.948826%208.56095%200.948826%208.36595%201.14351L5.00001%204.51008L1.63376%201.14383C1.43907%200.949138%201.12313%200.949138%200.928135%201.14383L0.14626%201.9257C-0.0484277%202.12039%20-0.0484277%202.43633%200.14626%202.63133L3.51251%205.99758L0.14626%209.36383C-0.0484277%209.55851%20-0.0484277%209.87445%200.14626%2010.0695L0.928447%2010.8516C1.12313%2011.0463%201.43907%2011.0463%201.63407%2010.8516L5.00001%207.48508L8.36626%2010.8513C8.56095%2011.046%208.87688%2011.046%209.07188%2010.8513L9.85407%2010.0691C10.0488%209.87445%2010.0488%209.55851%209.85407%209.36351L6.48751%205.99758Z'%20fill='black'/%3e%3c/svg%3e\"","import React from \"react\";\n\nimport CloseIcon from \"../../assets/close-icon.svg\";\nimport styles from \"./CloseButton.module.css\";\n\nexport default function CloseButton({ onClick }) {\n return (\n <button onClick={onClick} className={styles.closeButton}>\n <img src={CloseIcon} />\n </button>\n );\n}\n","import React, { useState } from \"react\";\n\nimport Locations from \"./Locations\";\nimport TariffNote from \"./TariffNote\";\nimport DynamicTariff from \"./DynamicTariffs\";\nimport TariffDetails from \"./v2/TariffDetails\";\nimport Stack from \"../../components/Stack\";\nimport CloseButton from \"../../components/CloseButton/CloseButton\";\nimport SideBarContainer from \"../../components/SidebarContainer/SidebarContainer\";\nimport { useStackContext } from \"../../components/Stack/Stack\";\n\nexport default function LocationsScreeen() {\n const [view, setView] = useState<string>(\"locations\");\n const { setView: setParentView } = useStackContext();\n\n return (\n <Stack name=\"locations\" currentView={view} onViewChange={setView}>\n <Stack.View name=\"locations\">\n <SideBarContainer>\n <CloseButton onClick={() => setParentView(\"none\")} />\n <Locations />\n </SideBarContainer>\n </Stack.View>\n\n <Stack.View name=\"tariffNote\">\n <SideBarContainer>\n <TariffNote />\n </SideBarContainer>\n </Stack.View>\n <Stack.View name=\"dynamicTariff\">\n <SideBarContainer>\n <DynamicTariff />\n </SideBarContainer>\n </Stack.View>\n <Stack.View name=\"tariffDetails\">\n <SideBarContainer>\n <TariffDetails />\n </SideBarContainer>\n </Stack.View>\n </Stack>\n );\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='currentColor'%20xmlns='http://www.w3.org/2000/svg'%20%3e%3cpath%20d='M14.4985%200H1.50178C0.169343%200%20-0.502939%201.61659%200.441124%202.56066L5.5%207.62131V13C5.5%2013.4721%205.72228%2013.9167%206.1%2014.25L8.1%2015.7208C9.07728%2016.4038%2010.5%2015.7689%2010.5%2014.5208V7.62131L15.5592%202.56066C16.5013%201.6185%2015.8336%200%2014.4985%200ZM9%207V14.5L7%2013V7L1.5%201.5H14.5L9%207Z'%20fill='currentColor'%20/%3e%3c/svg%3e\"","import React, { useEffect } from \"react\";\n\nimport { useMapContext } from \"./contexts/Map\";\n\nimport Stack from \"./components/Stack\";\n\nimport styles from \"./router.module.css\";\nimport SearchInput from \"./components/SearchInput/SearchInput\";\n\nimport Filters from \"./screens/Filters\";\nimport Locations from \"./screens/Locations\";\n\nimport filterIcon from \"./assets/filter-icon.svg\";\n\nimport CloseButton from \"./components/CloseButton/CloseButton\";\nimport SideBarContainer from \"./components/SidebarContainer/SidebarContainer\";\n\nimport { hasFilters } from \"./utils/filters\";\n\nexport default function Controls() {\n const { locationIds, fetchLocations, filters, isSearching } = useMapContext();\n const [view, setView] = React.useState<string>(\"none\");\n\n useEffect(() => {\n if (locationIds.length > 0) {\n setView(\"locations\");\n }\n }, [locationIds, setView]);\n\n return (\n <div className={styles.container}>\n <div className={styles.controlsContainer}>\n <SearchInput\n onFocus={() => {\n setView(\"none\");\n }}\n />\n\n <div\n className={styles.filterButton}\n onClick={() => {\n setView(\"filters\");\n }}\n >\n {isSearching ?? false ? (\n <div className={styles.spinner}></div>\n ) : (\n <img className={styles.filterIcon} src={filterIcon} />\n )}\n {hasFilters(filters) && !(isSearching ?? false) && (\n <span className={styles.filterCounter}></span>\n )}\n </div>\n </div>\n\n <div className={styles.stackContainer}>\n <Stack\n name=\"router\"\n currentView={view}\n onViewChange={(view) => {\n setView(view);\n }}\n >\n <Stack.View name=\"locations\">\n <Locations />\n </Stack.View>\n <Stack.View name=\"filters\">\n <SideBarContainer>\n <CloseButton onClick={() => setView(\"none\")} />\n <Filters />\n </SideBarContainer>\n </Stack.View>\n </Stack>\n </div>\n </div>\n );\n}\n","import React, { useEffect } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport Boot from \"./Boot\";\nimport { MapProvider } from \"./contexts/Map\";\nimport Map from \"./components/Map/Map\";\nimport AnalyticsOverlay from \"./components/AnalyticsOverlay/AnalyticsOverlay\";\nimport Router from \"./Router\";\nimport { RoadMapOptions } from \"./types\";\nimport { useRef } from \"react\";\n\nexport default function RoadMap(props: RoadMapOptions) {\n if (!props.shadowRoot && props?.theming?.backgroundColor) {\n return <ShadowMapWrapper {...props} />;\n }\n return (\n <MapProvider options={props} language={props.language}>\n <Boot height={props?.height}>\n <Router />\n <AnalyticsOverlay />\n <Map />\n </Boot>\n </MapProvider>\n );\n}\n\n// This wrapper is used to create a shadow root if one is not provided by the end user\nconst ShadowMapWrapper: React.FC<RoadMapOptions> = (props) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<Root | null>(null);\n const shadowRootRef = useRef<ShadowRoot | null>(null);\n const isInitializedRef = useRef<boolean>(false);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || isInitializedRef.current) return;\n\n const shadowRoot = container.attachShadow({ mode: \"open\" });\n shadowRootRef.current = shadowRoot;\n\n // We default to the most recent version of the sdk stylesheet\n let styleHref = `https://mapsdk.road.io/styles.css`;\n if (props.sdkRoot) {\n styleHref = props.sdkRoot + \"/styles.css\";\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.type = \"text/css\";\n link.href = styleHref;\n\n // Append link to shadow root BEFORE rendering\n shadowRoot.appendChild(link);\n\n // Create React root\n const root = createRoot(shadowRoot);\n rootRef.current = root;\n isInitializedRef.current = true;\n\n return () => {\n if (rootRef.current) {\n rootRef.current.unmount();\n rootRef.current = null;\n }\n shadowRootRef.current = null;\n isInitializedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (!rootRef.current || !shadowRootRef.current) return;\n const roadMapElement = React.createElement(RoadMap, {\n ...props,\n shadowRoot: shadowRootRef.current,\n });\n rootRef.current.render(roadMapElement);\n }, [props]);\n\n return <div ref={containerRef} style={{ height: \"100%\", width: \"100%\" }} />;\n};\n"],"names":["useOnScreen","ref","wasIntersecting","setWasIntersecting","useState","observer","useMemo","entry","useEffect","getLanguage","lng","language","en","nl","de","fr","it","es","strings","order","versionRank","version","index","atLeast","min","request","url","options","response","e","buildSearchBody","limitToLocationIds","props","mapSearchPath","apiRoot","kind","endpoint","_fetchGeohashes","authorization","precision","_fetchAnalytics","_fetchTariffs","origin","ids","_fetchLocations","status","_reportProblem","type","country_code","party_id","location_id","evse_uid","loadRemoteConfig","prefixes","normaliseStatus","name","prefix","classicPalette","modernPalette","paletteFor","inSessionStatuses","roamingTone","cpoTone","statusTone","roamingClassic","roamingModern","cpoColours","toneColours","toneColour","tone","getStatusColor","labelKeys","getStatusLabelKey","tonePriority","pickMarkerColor","statuses","tones","priority","candidate","roamingOptions","ocppStatuses","ocppOptions","isCpo","getStatusFilterOptions","toggleOption","action","existing","values","value","findStatusFilterOption","option","isStatusFilterActive","selected","toggleStatusFilter","withoutStatusFilter","filters","rest","statusForLocations","defaultCurrency","MapContext","createContext","key","MapProvider","children","setOptions","filterConfiguration","setFilterConfiguration","error","setError","place","setPlace","position","setPosition","setFilters","locationIds","setLocationsIds","locations","setLocations","locationsStatus","setLocationsStatus","isSearching","setIsSearching","searchBounds","setSearchBounds","mapContext","setMapContext","isDebug","t","match","p1","configured","mapKey","mapKind","currency","passThroughSearchOptions","fetchGeohashes","args","fetchAnalytics","fetchLocations","fetchTariffs","reportProblem","onFetchLocations","data","location","rc","err","theming","shadowRoot","style","isReady","providerValue","useMapContext","context","React","Boot","useContext","useRef","loaded","jsxs","styles","jsx","__awaiter","thisArg","_arguments","P","generator","adopt","resolve","reject","fulfilled","step","rejected","result","getDefaultExportFromCjs","x","fastDeepEqual","equal","a","b","length","keys","isEqual","DEFAULT_ID","LoaderStatus","Loader","apiKey","authReferrerPolicy","channel","client","id","libraries","mapIds","nonce","region","retries","script","fn","_a","_b","params","g","h","k","p","c","l","q","m","d","r","u","f","n","libraryPromises","library","event","delay","cb","instance","getLoader","loader","base32","Geohash","lat","lon","hash","posn","idx","bit","evenBit","geohash","latMin","latMax","lonMin","lonMax","lonMid","latMid","bounds","i","chr","bitN","direction","neighbour","border","lastCh","parent","createOverlay","container","pane","Overlay","point","OverlayView","map","zIndex","div","overlay","createPortal","formatter","formatNumber","num","CustomMarker","onClick","highlight","handleClick","useCallback","styleColor","usablePrice","price","formatters","format","formatEnergyPrice","tickScale","baseTicks","priceTicks","anyLabel","scale","decimals","tick","unitKind","countUnits","counts","count","cluster","pinTone","pinGlyph","ringByTone","textByColour","pinColours","sliceOrder","pinSplit","unit","describePin","isCluster","pinPrice","TAIL","SINGLE","SELECTED","COMPACT","CIRCLE","CIRCLE_SELECTED","STACK_MAX","TAG_GAP","UNKNOWN_PRICE","INK","MUTED","TAG_INK","TAG_BACKGROUND","SHADOW","SHADOW_SOFT","SHADOW_DEEP","pinStylesheet","PinStyles","withAlpha","hex","alpha","tailAnchored","size","centred","conicGradient","split","at","slice","from","Bolt","fill","ratioFontSize","state","digits","Glyph","ring","text","bodyStyle","compact","muted","planned","SinglePin","tag","label","StackedPin","ghost","edge","ClusterCircle","sitesLabel","halo","Pin","priceLabel","body","sameStatuses","left","right","samePrice","mergeBuckets","incoming","byKey","bucket","previous","compactBelowZoom","geoHashZoom","zoomToHashChars","zoom","getNormalizedBounds","zoomLevel","mapSWPoint","mapNEPoint","SWGeohash","geohashSWBounds","latStep","lngStep","neLat","neLng","isSameBounds","bounds1","bounds2","MapMarkers","onMarkerClicked","setData","setZoom","mapConfig","setMapConfig","currentZoomLevel","currentBounds","newZoomLevel","newMapConfig","appendData","newData","ignore","_onMarkerClicked","modernPins","isSelected","item","Fragment","MapWrapper","setMap","mapContainerRef","Map","StatusDot","color","desktopQuery","controlsColumnWidth","edgePadding","rowHeight","useIsDesktop","isDesktop","setIsDesktop","media","onChange","overlayStyle","pillStyle","switchOutline","switchInk","switchTextShadow","offset","switchStyle","switchOptionStyle","switchActiveStyle","bucketStyle","activeBucketStyle","clickableBucketStyle","countStyle","StatusPill","buckets","filterKind","onToggle","next","clickable","active","content","AnalyticsOverlay","analytics","setAnalytics","isLoading","setIsLoading","vocabulary","setVocabulary","enabled","analyticsFiltersKey","analyticsFilters","roamingBuckets","ocppBuckets","available","shown","_extends","_objectWithoutPropertiesLoose","_setPrototypeOf","_inheritsLoose","o","setPrototypeOf","v","w","y","z","A","reactIs_production_min","hasSymbol","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_ASYNC_MODE_TYPE","REACT_CONCURRENT_MODE_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_BLOCK_TYPE","REACT_FUNDAMENTAL_TYPE","REACT_RESPONDER_TYPE","REACT_SCOPE_TYPE","isValidElementType","typeOf","object","$$typeof","$$typeofType","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","hasWarnedAboutDeprecatedIsAsyncMode","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","reactIs_development","reactIsModule","require$$0","require$$1","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","toObject","val","shouldUseNative","test1","test2","order2","test3","letter","objectAssign","target","source","to","symbols","s","ReactPropTypesSecret","ReactPropTypesSecret_1","has","printWarning","loggedTypeFailures","message","checkPropTypes","typeSpecs","componentName","getStack","typeSpecName","ex","stack","checkPropTypes_1","ReactIs","assign","require$$2","require$$3","require$$4","emptyFunctionThatReturnsNull","factoryWithTypeCheckers","isValidElement","throwOnDirectAccess","ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","iteratorFn","ANONYMOUS","ReactPropTypes","createPrimitiveTypeChecker","createAnyTypeChecker","createArrayOfTypeChecker","createElementTypeChecker","createElementTypeTypeChecker","createInstanceTypeChecker","createNodeChecker","createObjectOfTypeChecker","createEnumTypeChecker","createUnionTypeChecker","createShapeTypeChecker","createStrictShapeTypeChecker","is","PropTypeError","createChainableTypeChecker","validate","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","isRequired","propName","propFullName","secret","cacheKey","chainedCheckType","expectedType","propValue","propType","getPropType","preciseType","getPreciseType","typeChecker","expectedClass","expectedClassName","actualClassName","getClassName","expectedValues","valuesString","arrayOfTypeCheckers","checker","getPostfixForTypeWarning","expectedTypes","checkerResult","expectedTypesMessage","isNode","invalidValidatorError","shapeTypes","allKeys","iterator","isSymbol","emptyFunction","emptyFunctionWithReset","factoryWithThrowingShims","shim","getShim","propTypesModule","hasClass","element","className","addClass","replaceClassName","origClass","classToRemove","removeClass","config","timeoutsShape","PropTypes","classNamesShape","TransitionGroupContext","forceReflow","node","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","_this","parentGroup","appear","initialStatus","_ref","prevState","nextIn","_proto","prevProps","nextStatus","timeout","exit","enter","mounting","ReactDOM","_this2","appearing","_ref2","maybeNode","maybeAppearing","timeouts","enterTimeout","_this3","nextState","callback","_this4","handler","doesNotHaveTimeoutOrListener","_ref3","maybeNextCallback","_this$props","childProps","pt","_len","_key","noop","_addClass","classes","addOneClass","removeOneClass","CSSTransition","_this$resolveArgument","_this$resolveArgument2","_this$resolveArgument3","_this$resolveArgument4","_this$resolveArgument5","_this$resolveArgument6","classNames","isStringClassNames","baseClassName","activeClassName","doneClassName","phase","_this$getClassNames","_this$appliedClasses$","_leaveRenders","_enterRenders","areChildrenDifferent","oldChildren","newChildren","modes","callHook","_element$props","leaveRenders","current","changeState","enterRenders","_ref4","SwitchTransition","mode","_this$state","component","StackView","StackContext","useStackContext","Stack","currentView","onViewChange","elements","createRef","currentRef","setCurrentRef","View","setArgs","contextValue","view","opt","done","SearchInput","onFocus","inputRef","places","autocomplete","CheckboxToggle","checked","isChecked","setIsChecked","onChangeCallback","Range","ticks","convertValue","bgSize","MultiSelect","preferredValues","placeholder","disabled","isOpen","setIsOpen","inputValue","setInputValue","highlightedIndex","setHighlightedIndex","containerRef","preferredSet","preferred","others","filtered","flatItems","selectedOptions","openMenu","closeMenu","selectItem","removeValue","handleInputKeyDown","handleInputBlur","toggleDropdown","renderOption","isLast","SelectField","onBlur","handleChange","selectedValue","ICON_IEC_62196_T2","ICON_IEC_62196_T2_COMBO","ICON_IEC_62196_T1","ICON_IEC_62196_T1_COMBO","ICON_IEC_62196_T3","ICON_IEC_62196_T3A","ICON_SCHUKO","ICON_CHADEMO","ICON_CATARC","connectorIcons","defaultFilter","hasFilters","filter","authMethodCapabilityOptions","powerRanges","useLocalState","initialState","useReducer","currentState","updatedState","FiltersScreen","applyFilters","contextFilters","showPriceFilter","priceLimit","setParentView","showOperatorFilter","lastApplied","Checkbox","operator","capability","LocationPlaceholder","ChevronLeft","ChevronRight","ChevronDown","Clock","Check","Info","SideBarContainer","Debug","evse","connector","StationIcon","BuildingIcon","CarIcon","BoltIcon","PricingIcon","getColorForStatus","getSocketIcon","connectorPowerTypes","getSocketText","formatConnectorStandard","getStatusLabel","getLocationLabel","getStatusColorFromEvses","evses","getTimezoneOffset","date","timeZone","lang","tzName","part","sign","offsetToMins","formatYMD","year","month","day","acc","tzDate","offMins","startOfDay","oDateTS","sodDateTS","endOfDate","getNextDayOfWeek","dayOfWeek","resultDate","getDay","convertTimeToMinutes","time","hours","minutes","convertToTimeSlot","startTime","endTime","getScheduleItems","items","isDayActive","now","currentTime","scheduleItems","refItem","oldEndTime","toAppend","maxEndTime","prevItem","isBaseTarif","tariffElement","getDynamicTariff","limit","splitByDay","el","curr","formattedItems","restrictions","_startDate","partialRestrictions","isActive","getScheduledTariff","locationTimezone","today","start_date","end_date","day_of_week","startDate","endDate","start","end","omitFields","obj","fields","isSame","aWithoutActive","bWithoutActive","mergeDuplicatesTimeslots","timeslots","cur","isRateBaseTariff","pc","isEdgeNoise","getSchedule","days","baseRateElement","SUNDAY","firstDay","restDays","dayElements","dayTimeslots","prevEntry","prevTimeslots","getConnectorTariffType","connectorTarif","ConnectorPowerType","calculateMaxPower","formatCurrency","getPrice","priceComponent","vat","PriceComponent","stringByType","displayOrder","PriceComponents","elementsByType","sortedElements","aIndex","bIndex","Price","vatAmount","CdrPriceComponent","cdrAdditionalCharge","formatTime","mins","defaultTimeZone","daysForLocale","CdrAdditionalChargeComponent","cdrAdditionalCharges","CdrPrice","ConnectorTariff","timezone","tariff","i18nDays","hasPriceComponents","dynamicTariffs","scheduledTariffs","baseTarifElements","isBaseActive","schedule","dynamicTariff","getNotes","notes","LocationDetailsV1","currentLocation","setView","availableEvse","connectorType","rowStyle","iconSlotStyle","textSlotStyle","hintStyle","chevronSlotStyle","LocationRow","icon","hint","defaultExpanded","expandable","expanded","setExpanded","toggle","LocationHeader","href","AvailabilitySummary","OperatorBlock","role","showRoleLabel","OperatorSection","suboperator","fallbackOperatorName","fallbackSuboperatorName","subRole","opRole","getWeekdayFullLabel","weekday","getTodayWeekday","jsDayToOcpiWeekday","groupRegularHoursByWeekday","regularHours","grouped","formatPeriod","begin","timeToMinutes","jsDay","isInExceptional","periods","isOpenNow","openingTimes","todayWeekday","closing","reopen","reopenWeekday","opening","prevWeekday","nowMinutes","effectiveEnd","wd","getFutureExceptionalPeriods","ordinalSuffix","rem100","formatExceptionalDate","dateStr","formatExceptionalTime","OpeningHours","chargingWhenClosed","futureClosings","futureOpenings","hasRegular","showWeek","dayStyle","dayLabelStyle","dayValueStyle","todayStyle","exceptionalStyle","exceptionalHeaderStyle","footnoteStyle","pill","isToday","ParkingType","parkingType","ChargingAccessibility","accessibility","EvseHeader","EvseStatus","first","maxKw","ConnectorSocket","ConnectorPricing","transformTariff","TariffV2","additionalCharges","hasCongestionPricing","JS_DAY_TO_OCPI","isInTimeWindow","isElementActive","bucketKey","minD","maxD","getActiveTariffElements","byBucket","isBase","elementToPcs","itemsRowStyle","itemStyle","itemHighlightStyle","STRING_BY_TYPE","DISPLAY_ORDER","priceWithVat","isFreeParkingWindow","collectAndSort","skipZero","all","ai","bi","TariffChips","chipStyle","labelKey","total","containerStyle","headerStyle","TariffLine","trailing","interactive","containerWithClick","handleKey","buttonStyle","submittingStyle","doneStyle","errorStyle","ReportProblemButton","setStatus","submit","textStyle","NoTariff","chevronStyle","ActiveTariff","evseId","evseUid","countryCode","partyId","locationId","locationName","transformed","rawElements","activeElements","navigate","Connector","tariffs","tr","cardStyle","connectorBaseStyle","Evse","statusColor","connectorStyle","pickText","directions","Directions","Location","Locations","locationIndex","setLocationIndex","canNext","canPrev","debugMode","isV2","BackButton","TariffNote","note","DynamicTariffs","sectionStyle","sectionHeaderStyle","descriptionStyle","metaStyle","elementHasPaidComponents","pickAltText","altTexts","formatLastUpdated","iso","TariffDetails","reportProps","description","lastUpdated","renderHeader","charges","baseElements","dyn","j","CloseIcon","CloseButton","LocationsScreeen","DynamicTariff","filterIcon","Controls","Filters","RoadMap","ShadowMapWrapper","Router","rootRef","shadowRootRef","isInitializedRef","styleHref","link","root","createRoot","roadMapElement"],"mappings":"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","x_google_ignoreList":[8,10,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44]}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/useOnScreen.ts","../src/i18n.ts","../src/utils/version.ts","../src/utils/request.ts","../src/utils/status.ts","../src/utils/location.ts","../src/utils/statusFilters.ts","../src/contexts/Map.tsx","../src/Boot.tsx","../node_modules/@googlemaps/js-api-loader/dist/index.mjs","../src/utils/loader.ts","../node_modules/latlon-geohash/latlon-geohash.js","../src/components/OverlayView/OverlayView.tsx","../src/components/CustomMarker/CustomMarker.tsx","../src/utils/price.ts","../src/utils/pinState.ts","../src/components/Pin/Pin.tsx","../src/utils/buckets.ts","../src/components/MapMarkers/MapMarkers.tsx","../src/components/Map/Map.tsx","../src/components/StatusDot/StatusDot.tsx","../src/components/AnalyticsOverlay/AnalyticsOverlay.tsx","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/lib/has.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/dom-helpers/esm/hasClass.js","../node_modules/dom-helpers/esm/addClass.js","../node_modules/dom-helpers/esm/removeClass.js","../node_modules/react-transition-group/esm/config.js","../node_modules/react-transition-group/esm/utils/PropTypes.js","../node_modules/react-transition-group/esm/TransitionGroupContext.js","../node_modules/react-transition-group/esm/utils/reflow.js","../node_modules/react-transition-group/esm/Transition.js","../node_modules/react-transition-group/esm/CSSTransition.js","../node_modules/react-transition-group/esm/SwitchTransition.js","../src/components/Stack/View.tsx","../src/components/Stack/Stack.tsx","../src/components/SearchInput/SearchInput.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Range/Range.tsx","../src/components/MultiSelect/MultiSelect.tsx","../src/components/SelectField/SelectField.tsx","../src/assets/connectors/type2.svg","../src/assets/connectors/combo2.svg","../src/assets/connectors/type1.svg","../src/assets/connectors/combo1.svg","../src/assets/connectors/type3.svg","../src/assets/connectors/type3a.svg","../src/assets/connectors/schuko.svg","../src/assets/connectors/chademo.svg","../src/assets/connectors/catarc.svg","../src/components/connectorIcons.ts","../src/utils/filters.ts","../src/screens/Filters/index.tsx","../src/components/LocationPlaceholder/LocationPlaceholder.tsx","../src/components/Icons/Icons.tsx","../src/components/SidebarContainer/SidebarContainer.tsx","../src/components/Debug/Debug.tsx","../src/assets/station-icon.svg","../src/assets/building-icon.svg","../src/assets/car-icon.svg","../src/assets/bolt-icon.svg","../src/assets/pricing-icon.svg","../src/utils/formatters.ts","../src/utils/date.ts","../src/utils/ocpi.ts","../src/components/Price/Price.tsx","../src/components/PriceComponents/PriceComponents.tsx","../src/components/CdrPrice/CdrPrice.tsx","../src/components/ConnectorTariff/ConnectorTariff.tsx","../src/utils/notes.ts","../src/screens/Locations/LocationDetailsV1.tsx","../src/components/LocationRow/LocationRow.tsx","../src/screens/Locations/v2/LocationHeader.tsx","../src/screens/Locations/v2/AvailabilitySummary.tsx","../src/screens/Locations/v2/OperatorSection.tsx","../src/utils/openingTimes.ts","../src/screens/Locations/v2/OpeningHours.tsx","../src/screens/Locations/v2/ParkingType.tsx","../src/screens/Locations/v2/ChargingAccessibility.tsx","../src/screens/Locations/v2/EvseHeader.tsx","../src/screens/Locations/v2/EvseStatus.tsx","../src/screens/Locations/v2/ConnectorSocket.tsx","../src/screens/Locations/v2/ConnectorPricing.tsx","../src/screens/Locations/v2/Tariff.tsx","../src/utils/activeTariff.ts","../src/screens/Locations/v2/TariffChips.tsx","../src/screens/Locations/v2/TariffLine.tsx","../src/screens/Locations/v2/ReportProblemButton.tsx","../src/screens/Locations/v2/NoTariff.tsx","../src/screens/Locations/v2/ActiveTariff.tsx","../src/screens/Locations/v2/Connector.tsx","../src/screens/Locations/v2/Evse.tsx","../src/screens/Locations/v2/Directions.tsx","../src/screens/Locations/v2/Location.tsx","../src/screens/Locations/Locations.tsx","../src/components/BackButton/BackButton.tsx","../src/screens/Locations/TariffNote.tsx","../src/screens/Locations/DynamicTariffs.tsx","../src/screens/Locations/v2/TariffDetails.tsx","../src/assets/close-icon.svg","../src/components/CloseButton/CloseButton.tsx","../src/screens/Locations/index.tsx","../src/assets/filter-icon.svg","../src/Router.tsx","../src/App.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, RefObject } from \"react\";\n\nexport default function useOnScreen(ref: RefObject<HTMLElement>) {\n const [wasIntersecting, setWasIntersecting] = useState(false);\n\n const observer = useMemo(\n () =>\n new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n setWasIntersecting(true);\n observer.disconnect();\n }\n }),\n [ref],\n );\n\n useEffect(() => {\n if (!ref.current) return;\n observer.observe(ref.current);\n return () => observer.disconnect();\n }, [ref.current]);\n\n return wasIntersecting;\n}\n","// getLanguage resolves a configured language, or the browser language when\n// none is given, to one of the supported string sets. Matching ignores case so\n// BCP 47 tags such as \"nl-NL\" work as well as \"nl-nl\".\nexport function getLanguage(lng?: string) {\n const language = (lng || window.navigator.language).toLowerCase();\n\n const dutchLangCodes = [\"nl\", \"nl-be\", \"nl-nl\"];\n if (dutchLangCodes.includes(language)) {\n return \"nl\";\n }\n\n const englishLangCodes = [\n \"en\",\n \"en-us\",\n \"en-eg\",\n \"en-au\",\n \"en-gb\",\n \"en-ca\",\n \"en-nz\",\n \"en-ie\",\n \"en-za\",\n \"en-jm\",\n \"en-bz\",\n \"en-tt\",\n ];\n\n if (englishLangCodes.includes(language)) {\n return \"en\";\n }\n\n const germanLangCodes = [\"de\", \"de-ch\", \"de-at\", \"de-lu\", \"de-li\", \"de-de\"];\n if (germanLangCodes.includes(language)) {\n return \"de\";\n }\n\n const frenchLangCodes = [\"fr\", \"fr-be\", \"fr-ca\", \"fr-fr\", \"fr-lu\", \"fr-ch\"];\n if (frenchLangCodes.includes(language)) {\n return \"fr\";\n }\n\n const italianLangCodes = [\"it\", \"it-ch\", \"it-it\"];\n if (italianLangCodes.includes(language)) {\n return \"it\";\n }\n\n const spanishLangCodes = [\n \"es\",\n \"es-ar\",\n \"es-bo\",\n \"es-cl\",\n \"es-co\",\n \"es-cr\",\n \"es-do\",\n \"es-ec\",\n \"es-sv\",\n \"es-gt\",\n \"es-hn\",\n \"es-mx\",\n \"es-ni\",\n \"es-pa\",\n \"es-py\",\n \"es-pe\",\n \"es-pr\",\n \"es-es\",\n \"es-uy\",\n \"es-ve\",\n ];\n\n if (spanishLangCodes.includes(language)) {\n return \"es\";\n }\n\n return \"en\";\n}\n\nexport type LabelsType = {\n \"search.placeholder\": string;\n \"cdrPrice.flatFee\": string;\n \"tariffPriceComponent.dynamicTariffHeader\": string;\n \"tariffPriceComponent.noTariff\": string;\n \"tariffPriceComponent.energy\": string;\n \"tariffPriceComponent.time\": string;\n \"tariffPriceComponent.parkingTime\": string;\n \"tariffPriceComponent.parkingTimeWait\": string;\n \"tariffPriceComponent.flat\": string;\n \"tariffPriceComponent.baseTariff\": string;\n \"tariffPriceComponent.active\": string;\n \"tariffPriceComponent.currentPrice\": string;\n \"tariffPriceComponent.viewTariff\": string;\n \"tariffNote.subHeader\": string;\n \"tariffNote.eFluxScheduledTariffNote\";\n \"tariffNote.dynamicScheduledTariffNote\";\n \"tariffNote.scheduledTariffNote\";\n \"tariffNote.baseTariffNote\";\n \"tariff.congestionPricing\": string;\n \"tariff.fullDetailsHeader\": string;\n \"tariff.lastUpdated\": string;\n \"tariff.report\": string;\n \"tariff.reportThanks\": string;\n \"tariff.reportError\": string;\n \"evse.statusAvailable\": string;\n \"evse.statusCharging\": string;\n \"evse.statusUnavailable\": string;\n \"evse.statusRemoved\": string;\n \"evse.statusPlanned\": string;\n \"evse.statusReserved\": string;\n \"evse.statusInoperative\": string;\n \"evse.statusOutOfOrder\": string;\n \"evse.statusError\": string;\n \"evse.statusUnknown\": string;\n \"evse.pricing\": string;\n \"filters.header\": string;\n \"filters.dcChargers\": string;\n \"filters.efluxChargers\": string;\n \"filters.noAdditionalFee\": string;\n \"filters.available\": string;\n \"filters.charging\": string;\n \"filters.notAvailable\": string;\n \"filters.chargingPower\": string;\n \"filters.connectorType\": string;\n \"filters.apply\": string;\n \"filters.clearAll\": string;\n \"filters.onlyShow\": string;\n \"filters.statusHeading\": string;\n \"evse.statusBlocked\": string;\n \"evse.statusClosed\": string;\n \"ocpp.statusPreparing\": string;\n \"ocpp.statusSuspendedEvse\": string;\n \"ocpp.statusSuspendedEv\": string;\n \"ocpp.statusFinishing\": string;\n \"ocpp.statusFaulted\": string;\n \"analytics.evseStatus\": string;\n \"analytics.roamingStatus\": string;\n \"pin.sites\": string;\n \"filters.maxEnergyPrice\": string;\n \"filters.anyPrice\": string;\n \"pin.pricePerKwh\": string;\n \"filters.chargingAccessibility\": string;\n \"filters.accessibilityAll\": string;\n \"filters.accessibilityTesla\": string;\n \"filters.allAccessibility\": string;\n \"filters.remoteStartStop\": string;\n \"filters.searchPhrase\": string;\n \"filters.searchPhrasePlaceholder\": string;\n \"filters.operator\": string;\n \"filters.excludeOperator\": string;\n \"filters.authMethodCapabilities\": string;\n \"filters.authCapability.rfid\": string;\n \"filters.authCapability.plugAndCharge\": string;\n \"filters.authCapability.creditCard\": string;\n \"filters.authCapability.remoteStartStop\": string;\n \"locationType.onStreet\": string;\n \"locationType.parkingGarage\": string;\n \"locationType.undergroundGarage\": string;\n \"locationType.parkingLot\": string;\n \"locationType.other\": string;\n \"locationType.unknown\": string;\n \"dynamicTariffs.subHeader\": string;\n \"location.viewAllHourlyPrices\": string;\n \"location.operatorInfo\": string;\n \"location.operator\": string;\n \"location.suboperator\": string;\n \"location.owner\": string;\n \"location.openingHours\": string;\n \"location.open24_7\": string;\n \"location.open\": string;\n \"location.openNow\": string;\n \"location.closedNow\": string;\n \"location.closed\": string;\n \"location.open24hours\": string;\n \"location.hours24\": string;\n \"location.opensAt\": string;\n \"location.opensAtDay\": string;\n \"location.closesAt\": string;\n \"location.chargingWhenClosed\": string;\n \"location.exceptionalClosings\": string;\n \"location.exceptionalOpenings\": string;\n \"location.visitWebsite\": string;\n \"weekday.mon\": string;\n \"weekday.tue\": string;\n \"weekday.wed\": string;\n \"weekday.thu\": string;\n \"weekday.fri\": string;\n \"weekday.sat\": string;\n \"weekday.sun\": string;\n \"backButton.backTo\": string;\n};\n\nexport const en: LabelsType = {\n \"search.placeholder\": \"Enter a location...\",\n \"cdrPrice.flatFee\": \"{{total}} additional fee\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Dynamic Tariff - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} session\",\n \"tariffPriceComponent.time\": \"{{total}} / hour\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / hour idle fee\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. wait time before idle fee\",\n \"tariffPriceComponent.noTariff\": \"No tariff available\",\n \"tariffPriceComponent.baseTariff\": \"Base Tariff\",\n \"tariffPriceComponent.active\": \"Active now\",\n \"tariffPriceComponent.currentPrice\": \"Current price\",\n \"filters.header\": \"Filters\",\n \"filters.dcChargers\": \"Fast Chargers\",\n \"filters.efluxChargers\": \"E-Flux Chargers\",\n \"filters.noAdditionalFee\": \"Without additional fee per session\",\n \"filters.available\": \"Available\",\n \"filters.charging\": \"Charging\",\n \"filters.notAvailable\": \"Not Available\",\n \"filters.chargingPower\": \"Charging Power [kW]\",\n \"filters.connectorType\": \"Connector Type\",\n \"filters.apply\": \"Apply Filters\",\n \"filters.clearAll\": \"Clear All Filters\",\n \"filters.onlyShow\": \"Only Show\",\n \"filters.statusHeading\": \"Status\",\n \"evse.statusBlocked\": \"Blocked\",\n \"evse.statusClosed\": \"Closed\",\n \"ocpp.statusPreparing\": \"Preparing\",\n \"ocpp.statusSuspendedEvse\": \"Suspended (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Suspended (EV)\",\n \"ocpp.statusFinishing\": \"Finishing\",\n \"ocpp.statusFaulted\": \"Faulted\",\n \"analytics.evseStatus\": \"EVSE Status\",\n \"analytics.roamingStatus\": \"Roaming Status\",\n \"pin.sites\": \"sites\",\n \"filters.maxEnergyPrice\": \"Max. price per kWh\",\n \"filters.anyPrice\": \"Any\",\n \"pin.pricePerKwh\": \"{{price}} per kWh\",\n \"filters.chargingAccessibility\": \"Vehicle Accessibility\",\n \"filters.accessibilityAll\": \"All vehicles\",\n \"filters.accessibilityTesla\": \"Tesla only\",\n \"filters.allAccessibility\": \"All accessibility types\",\n \"filters.remoteStartStop\": \"Supports remote charge\",\n \"filters.searchPhrase\": \"Search\",\n \"filters.searchPhrasePlaceholder\": \"EVSE ID or location name\",\n \"filters.operator\": \"Include operator(s)\",\n \"filters.excludeOperator\": \"Exclude operator(s)\",\n \"filters.authMethodCapabilities\": \"Payment methods\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Credit / debit card\",\n \"filters.authCapability.remoteStartStop\": \"Remote start/stop\",\n \"evse.statusAvailable\": \"Available\",\n \"evse.statusCharging\": \"Charging\",\n \"evse.statusUnavailable\": \"Unavailable\",\n \"evse.statusRemoved\": \"Removed\",\n \"evse.statusPlanned\": \"Planned\",\n \"evse.statusReserved\": \"Reserved\",\n \"evse.statusInoperative\": \"Inoperative\",\n \"evse.statusOutOfOrder\": \"Out of Order\",\n \"evse.statusError\": \"Error\",\n \"evse.statusUnknown\": \"Unknown\",\n \"locationType.onStreet\": \"On Street\",\n \"locationType.parkingGarage\": \"Parking Garage\",\n \"locationType.undergroundGarage\": \"Underground Garage\",\n \"locationType.parkingLot\": \"Parking Lot\",\n \"locationType.other\": \"Other\",\n \"locationType.unknown\": \"Unknown\",\n \"tariffPriceComponent.viewTariff\": \"View Tariff notes\",\n \"tariffNote.subHeader\": \"Tariff notes\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"A scheduled tariff overrides base tariff prices for specific time period.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Dynamic price is adjusted automatically based on energy market price (1 hour interval).\",\n \"tariffNote.scheduledTariffNote\":\n \"A scheduled tariff overrides base tariff prices for specific time period.\",\n \"tariffNote.baseTariffNote\":\n \"Tariffs shown here have been sent to E-Flux by roaming partner. Accuracy may vary depending on provider.\",\n \"tariff.congestionPricing\": \"Congestion pricing may apply\",\n \"tariff.fullDetailsHeader\": \"Tariff details\",\n \"tariff.lastUpdated\": \"Last updated {{date}}\",\n \"tariff.report\": \"Report\",\n \"tariff.reportThanks\": \"Thanks for reporting\",\n \"tariff.reportError\": \"Couldn't send, try again\",\n \"evse.pricing\": \"Pricing\",\n \"dynamicTariffs.subHeader\": \"Hourly Prices\",\n \"location.viewAllHourlyPrices\": \"View All Hourly Prices\",\n \"location.operatorInfo\": \"Operator\",\n \"location.operator\": \"Operator\",\n \"location.suboperator\": \"Suboperator\",\n \"location.owner\": \"Owner\",\n \"location.openingHours\": \"Opening hours\",\n \"location.open24_7\": \"Open 24/7\",\n \"location.open\": \"Open\",\n \"location.openNow\": \"Open now\",\n \"location.closedNow\": \"Closed\",\n \"location.closed\": \"Closed\",\n \"location.open24hours\": \"Open 24 hours\",\n \"location.hours24\": \"24 hours\",\n \"location.opensAt\": \"Opens {{time}}\",\n \"location.opensAtDay\": \"Opens {{time}} {{day}}\",\n \"location.closesAt\": \"Closes {{time}}\",\n \"location.chargingWhenClosed\": \"Charging available when closed\",\n \"location.exceptionalClosings\": \"Exceptional closing\",\n \"location.exceptionalOpenings\": \"Exceptional opening\",\n \"location.visitWebsite\": \"Website\",\n \"weekday.mon\": \"Mon\",\n \"weekday.tue\": \"Tue\",\n \"weekday.wed\": \"Wed\",\n \"weekday.thu\": \"Thu\",\n \"weekday.fri\": \"Fri\",\n \"weekday.sat\": \"Sat\",\n \"weekday.sun\": \"Sun\",\n \"backButton.backTo\": \"Back To\",\n};\n\nexport const nl: LabelsType = {\n \"search.placeholder\": \"Voer een locatie in...\",\n \"cdrPrice.flatFee\": \"{{total}} extra kosten\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Dynamisch Tarief - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} sessie\",\n \"tariffPriceComponent.time\": \"{{total}} / uur\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / uur blokkeertarief\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. wachttijd voor blokkeertarief\",\n \"tariffPriceComponent.noTariff\": \"Geen beschikbaar tarief\",\n \"tariffPriceComponent.baseTariff\": \"Basistarief\",\n \"tariffPriceComponent.active\": \"Nu actief\",\n \"tariffPriceComponent.currentPrice\": \"Huidige prijs\",\n \"filters.header\": \"Filters\",\n \"filters.dcChargers\": \"DC-laders\",\n \"filters.efluxChargers\": \"E-Flux-laders\",\n \"filters.noAdditionalFee\": \"Zonder extra kosten per sessie\",\n \"filters.available\": \"Beschikbaar\",\n \"filters.charging\": \"Laden\",\n \"filters.notAvailable\": \"Niet beschikbaar\",\n \"filters.chargingPower\": \"Laadvermogen [kW]\",\n \"filters.connectorType\": \"Aansluitingstype\",\n \"filters.apply\": \"Filters toepassen\",\n \"filters.clearAll\": \"Alle filters wissen\",\n \"filters.onlyShow\": \"Alleen tonen\",\n \"filters.statusHeading\": \"Status\",\n \"evse.statusBlocked\": \"Geblokkeerd\",\n \"evse.statusClosed\": \"Gesloten\",\n \"ocpp.statusPreparing\": \"Voorbereiden\",\n \"ocpp.statusSuspendedEvse\": \"Onderbroken (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Onderbroken (EV)\",\n \"ocpp.statusFinishing\": \"Afronden\",\n \"ocpp.statusFaulted\": \"Storing\",\n \"analytics.evseStatus\": \"EVSE-status\",\n \"analytics.roamingStatus\": \"Roamingstatus\",\n \"pin.sites\": \"locaties\",\n \"filters.maxEnergyPrice\": \"Max. prijs per kWh\",\n \"filters.anyPrice\": \"Alle\",\n \"pin.pricePerKwh\": \"{{price}} per kWh\",\n \"filters.chargingAccessibility\": \"Voertuigtoegang\",\n \"filters.accessibilityAll\": \"Alle voertuigen\",\n \"filters.accessibilityTesla\": \"Alleen Tesla\",\n \"filters.allAccessibility\": \"Alle toegankelijkheidstypes\",\n \"filters.remoteStartStop\": \"Ondersteunt op afstand laden\",\n \"filters.searchPhrase\": \"Zoeken\",\n \"filters.searchPhrasePlaceholder\": \"EVSE-ID of locatienaam\",\n \"filters.operator\": \"Operator(s) opnemen\",\n \"filters.excludeOperator\": \"Operator(s) uitsluiten\",\n \"filters.authMethodCapabilities\": \"Betaalmethoden\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Creditcard / pinpas\",\n \"filters.authCapability.remoteStartStop\": \"Op afstand starten/stoppen\",\n \"evse.statusAvailable\": \"Beschikbaar\",\n \"evse.statusCharging\": \"Laden\",\n \"evse.statusUnavailable\": \"Niet beschikbaar\",\n \"evse.statusError\": \"Fout\",\n \"evse.statusRemoved\": \"Verwijderd\",\n \"evse.statusPlanned\": \"Gepland\",\n \"evse.statusReserved\": \"Gereserveerd\",\n \"evse.statusInoperative\": \"Inoperative\",\n \"evse.statusOutOfOrder\": \"Uit van orde\",\n \"evse.statusUnknown\": \"Onbekend\",\n \"locationType.onStreet\": \"Op straat\",\n \"locationType.parkingGarage\": \"Parkeergarage\",\n \"locationType.undergroundGarage\": \"Ondergrondse garage\",\n \"locationType.parkingLot\": \"Parkeerterrein\",\n \"locationType.other\": \"Anders\",\n \"locationType.unknown\": \"Onbekend\",\n \"tariffPriceComponent.viewTariff\": \"Tariefnotitie bekijken\",\n \"tariffNote.subHeader\": \"Tariefnotities\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Een gepland tarief overschrijft de basis tariefprijzen voor een specifieke periode.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"De dynamische prijs wordt automatisch aangepast op basis van de energiemarktprijs (interval van 1 uur).\",\n \"tariffNote.scheduledTariffNote\":\n \"Een gepland tarief overschrijft de basis tariefprijzen voor een specifieke periode.\",\n \"tariffNote.baseTariffNote\":\n \"De hier getoonde tarieven zijn door de roamingpartner aan E-Flux verstrekt. De nauwkeurigheid kan variëren afhankelijk van de aanbieder.\",\n \"tariff.congestionPricing\": \"Congestietarief kan van toepassing zijn\",\n \"tariff.fullDetailsHeader\": \"Tariefdetails\",\n \"tariff.lastUpdated\": \"Laatst bijgewerkt {{date}}\",\n \"tariff.report\": \"Rapporteren\",\n \"tariff.reportThanks\": \"Bedankt voor de melding\",\n \"tariff.reportError\": \"Versturen mislukt, probeer opnieuw\",\n \"evse.pricing\": \"Tarieven\",\n \"dynamicTariffs.subHeader\": \"Uurtarieven\",\n \"location.viewAllHourlyPrices\": \"Bekijk Alle Uurprijzen\",\n \"location.operatorInfo\": \"Exploitant\",\n \"location.operator\": \"Exploitant\",\n \"location.suboperator\": \"Subexploitant\",\n \"location.owner\": \"Eigenaar\",\n \"location.openingHours\": \"Openingstijden\",\n \"location.open24_7\": \"24/7 geopend\",\n \"location.open\": \"Open\",\n \"location.openNow\": \"Nu open\",\n \"location.closedNow\": \"Gesloten\",\n \"location.closed\": \"Gesloten\",\n \"location.open24hours\": \"24 uur geopend\",\n \"location.hours24\": \"24 uur\",\n \"location.opensAt\": \"Opent om {{time}}\",\n \"location.opensAtDay\": \"Opent {{day}} om {{time}}\",\n \"location.closesAt\": \"Sluit om {{time}}\",\n \"location.chargingWhenClosed\": \"Laden mogelijk wanneer gesloten\",\n \"location.exceptionalClosings\": \"Uitzonderlijke sluiting\",\n \"location.exceptionalOpenings\": \"Uitzonderlijke opening\",\n \"location.visitWebsite\": \"Website\",\n \"weekday.mon\": \"Ma\",\n \"weekday.tue\": \"Di\",\n \"weekday.wed\": \"Wo\",\n \"weekday.thu\": \"Do\",\n \"weekday.fri\": \"Vr\",\n \"weekday.sat\": \"Za\",\n \"weekday.sun\": \"Zo\",\n \"backButton.backTo\": \"Terug Naar\",\n};\n\nexport const de: LabelsType = {\n \"search.placeholder\": \"Geben Sie einen Ort ein...\",\n \"cdrPrice.flatFee\": \"{{total}} Zusatzgebühr\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Dynamischer Tarif - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} Sitzung\",\n \"tariffPriceComponent.time\": \"{{total}} / Stunde\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / Stunde Blockiergebühr\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} Min. Wartezeit vor der Blockiergebühr\",\n \"tariffPriceComponent.noTariff\": \"Kein Tarif verfügbar\",\n \"tariffPriceComponent.baseTariff\": \"Grundtarif\",\n \"tariffPriceComponent.active\": \"Aktuell aktiv\",\n \"tariffPriceComponent.currentPrice\": \"Aktueller Preis\",\n \"filters.header\": \"Filter\",\n \"filters.dcChargers\": \"Gleichstrom-Ladegeräte\",\n \"filters.efluxChargers\": \"E-Flux-Ladegeräte\",\n \"filters.noAdditionalFee\": \"Ohne zusätzliche Gebühr pro Sitzung\",\n \"filters.available\": \"Verfügbar\",\n \"filters.charging\": \"Lädt\",\n \"filters.notAvailable\": \"Nicht verfügbar\",\n \"filters.chargingPower\": \"Ladeleistung [kW]\",\n \"filters.connectorType\": \"Steckertyp\",\n \"filters.apply\": \"Filter anwenden\",\n \"filters.clearAll\": \"Alle Filter löschen\",\n \"filters.onlyShow\": \"Nur anzeigen\",\n \"filters.statusHeading\": \"Status\",\n \"evse.statusBlocked\": \"Blockiert\",\n \"evse.statusClosed\": \"Geschlossen\",\n \"ocpp.statusPreparing\": \"Vorbereitung\",\n \"ocpp.statusSuspendedEvse\": \"Unterbrochen (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Unterbrochen (EV)\",\n \"ocpp.statusFinishing\": \"Abschluss\",\n \"ocpp.statusFaulted\": \"Fehler\",\n \"analytics.evseStatus\": \"EVSE-Status\",\n \"analytics.roamingStatus\": \"Roaming-Status\",\n \"pin.sites\": \"Standorte\",\n \"filters.maxEnergyPrice\": \"Max. Preis pro kWh\",\n \"filters.anyPrice\": \"Alle\",\n \"pin.pricePerKwh\": \"{{price}} pro kWh\",\n \"filters.chargingAccessibility\": \"Fahrzeugzugänglichkeit\",\n \"filters.accessibilityAll\": \"Alle Fahrzeuge\",\n \"filters.accessibilityTesla\": \"Nur Tesla\",\n \"filters.allAccessibility\": \"Alle Zugänglichkeitstypen\",\n \"filters.remoteStartStop\": \"Unterstützt Fernladen\",\n \"filters.searchPhrase\": \"Suche\",\n \"filters.searchPhrasePlaceholder\": \"EVSE-ID oder Standortname\",\n \"filters.operator\": \"Betreiber einschließen\",\n \"filters.excludeOperator\": \"Betreiber ausschließen\",\n \"filters.authMethodCapabilities\": \"Zahlungsmethoden\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Kredit- / Debitkarte\",\n \"filters.authCapability.remoteStartStop\": \"Fernstart/-stopp\",\n \"evse.statusAvailable\": \"Verfügbar\",\n \"evse.statusCharging\": \"Lädt\",\n \"evse.statusUnavailable\": \"Nicht verfügbar\",\n \"evse.statusRemoved\": \"Entfernt\",\n \"evse.statusPlanned\": \"Geplant\",\n \"evse.statusReserved\": \"Reserviert\",\n \"evse.statusInoperative\": \"Inoperative\",\n \"evse.statusOutOfOrder\": \"Ausgeschaltet\",\n \"evse.statusError\": \"Fehler\",\n \"evse.statusUnknown\": \"Unbekannt\",\n \"evse.pricing\": \"Preisbildung\",\n \"locationType.onStreet\": \"Straße\",\n \"locationType.parkingGarage\": \"Parkhaus\",\n \"locationType.undergroundGarage\": \"Tiefgarage\",\n \"locationType.parkingLot\": \"Parkplatz\",\n \"locationType.other\": \"Andere\",\n \"locationType.unknown\": \"Unbekannt\",\n \"tariffPriceComponent.viewTariff\": \"Tarif anzeigen\",\n \"tariffNote.subHeader\": \"Tarifhinweise\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Ein geplanter Tarif überschreibt die Basistarifpreise für einen bestimmten Zeitraum.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Der dynamische Preis wird automatisch basierend auf dem Energiepreis auf dem Markt angepasst (im Intervall von 1 Stunde).\",\n \"tariffNote.scheduledTariffNote\":\n \"Ein geplanter Tarif überschreibt die Basistarifpreise für einen bestimmten Zeitraum.\",\n \"tariffNote.baseTariffNote\":\n \"Die hier angezeigten Tarife wurden von einem Roaming-Partner an E-Flux gesendet. Die Genauigkeit kann je nach Anbieter variieren.\",\n \"tariff.congestionPricing\": \"Überlastungstarif kann anfallen\",\n \"tariff.fullDetailsHeader\": \"Tarifdetails\",\n \"tariff.lastUpdated\": \"Zuletzt aktualisiert {{date}}\",\n \"tariff.report\": \"Melden\",\n \"tariff.reportThanks\": \"Danke für die Meldung\",\n \"tariff.reportError\": \"Senden fehlgeschlagen, erneut versuchen\",\n \"dynamicTariffs.subHeader\": \"Stundentarife\",\n \"location.viewAllHourlyPrices\": \"Alle Stundenpreise anzeigen\",\n \"location.operatorInfo\": \"Betreiber\",\n \"location.operator\": \"Betreiber\",\n \"location.suboperator\": \"Unterbetreiber\",\n \"location.owner\": \"Eigentümer\",\n \"location.openingHours\": \"Öffnungszeiten\",\n \"location.open24_7\": \"24/7 geöffnet\",\n \"location.open\": \"Geöffnet\",\n \"location.openNow\": \"Jetzt geöffnet\",\n \"location.closedNow\": \"Geschlossen\",\n \"location.closed\": \"Geschlossen\",\n \"location.open24hours\": \"24 Stunden geöffnet\",\n \"location.hours24\": \"24 Stunden\",\n \"location.opensAt\": \"Öffnet um {{time}}\",\n \"location.opensAtDay\": \"Öffnet {{day}} um {{time}}\",\n \"location.closesAt\": \"Schließt um {{time}}\",\n \"location.chargingWhenClosed\":\n \"Laden auch außerhalb der Öffnungszeiten möglich\",\n \"location.exceptionalClosings\": \"Ausnahmsweise geschlossen\",\n \"location.exceptionalOpenings\": \"Ausnahmsweise geöffnet\",\n \"location.visitWebsite\": \"Website\",\n \"weekday.mon\": \"Mo\",\n \"weekday.tue\": \"Di\",\n \"weekday.wed\": \"Mi\",\n \"weekday.thu\": \"Do\",\n \"weekday.fri\": \"Fr\",\n \"weekday.sat\": \"Sa\",\n \"weekday.sun\": \"So\",\n \"backButton.backTo\": \"Zurück zu\",\n};\n\nexport const fr: LabelsType = {\n \"search.placeholder\": \"Entrez un lieu...\",\n \"cdrPrice.flatFee\": \"{{total}} frais supplémentaires\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Tarif Dynamique - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} session\",\n \"tariffPriceComponent.time\": \"{{total}} / heure\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\":\n \"{{total}} / frais d'occupation par heure\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. avant frais d'occupation\",\n \"tariffPriceComponent.noTariff\": \"Aucun tarif disponible\",\n \"tariffPriceComponent.baseTariff\": \"Tarif de base\",\n \"tariffPriceComponent.active\": \"Actuellement actif\",\n \"tariffPriceComponent.currentPrice\": \"Prix actuel\",\n \"filters.header\": \"Filtres\",\n \"filters.dcChargers\": \"Chargeurs à courant continu\",\n \"filters.efluxChargers\": \"Chargeurs E-Flux\",\n \"filters.noAdditionalFee\": \"Sans frais supplémentaires par séance\",\n \"filters.available\": \"Disponible\",\n \"filters.charging\": \"En charge\",\n \"filters.notAvailable\": \"Indisponible\",\n \"filters.chargingPower\": \"Puissance de charge [kW]\",\n \"filters.connectorType\": \"Type de connecteur\",\n \"filters.apply\": \"Appliquer les filtres\",\n \"filters.clearAll\": \"Effacer tous les filtres\",\n \"filters.onlyShow\": \"Afficher uniquement\",\n \"filters.statusHeading\": \"Statut\",\n \"evse.statusBlocked\": \"Bloqué\",\n \"evse.statusClosed\": \"Fermé\",\n \"ocpp.statusPreparing\": \"Préparation\",\n \"ocpp.statusSuspendedEvse\": \"Suspendu (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Suspendu (EV)\",\n \"ocpp.statusFinishing\": \"Finalisation\",\n \"ocpp.statusFaulted\": \"En défaut\",\n \"analytics.evseStatus\": \"Statut EVSE\",\n \"analytics.roamingStatus\": \"Statut roaming\",\n \"pin.sites\": \"sites\",\n \"filters.maxEnergyPrice\": \"Prix max. par kWh\",\n \"filters.anyPrice\": \"Tous\",\n \"pin.pricePerKwh\": \"{{price}} par kWh\",\n \"filters.chargingAccessibility\": \"Accessibilité véhicule\",\n \"filters.accessibilityAll\": \"Tous véhicules\",\n \"filters.accessibilityTesla\": \"Tesla seulement\",\n \"filters.allAccessibility\": \"Tous types d'accessibilité\",\n \"filters.remoteStartStop\": \"Prend en charge la recharge à distance\",\n \"filters.searchPhrase\": \"Rechercher\",\n \"filters.searchPhrasePlaceholder\": \"ID EVSE ou nom du lieu\",\n \"filters.operator\": \"Inclure le(s) opérateur(s)\",\n \"filters.excludeOperator\": \"Exclure le(s) opérateur(s)\",\n \"filters.authMethodCapabilities\": \"Moyens de paiement\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Carte de crédit / débit\",\n \"filters.authCapability.remoteStartStop\": \"Démarrage/arrêt à distance\",\n \"evse.statusAvailable\": \"Disponible\",\n \"evse.statusCharging\": \"En charge\",\n \"evse.statusUnavailable\": \"Indisponible\",\n \"evse.statusRemoved\": \"Supprimé\",\n \"evse.statusPlanned\": \"Planifié\",\n \"evse.statusReserved\": \"Réservé\",\n \"evse.statusInoperative\": \"Hors service\",\n \"evse.statusOutOfOrder\": \"En panne\",\n \"evse.statusError\": \"Erreur\",\n \"evse.statusUnknown\": \"Inconnu\",\n \"evse.pricing\": \"Tarification\",\n \"locationType.onStreet\": \"Dans la rue\",\n \"locationType.parkingGarage\": \"Parking couvert\",\n \"locationType.undergroundGarage\": \"Parking souterrain\",\n \"locationType.parkingLot\": \"Parking\",\n \"locationType.other\": \"Autre\",\n \"locationType.unknown\": \"Inconnu\",\n \"tariffPriceComponent.viewTariff\": \"Voir le tarif\",\n \"tariffNote.subHeader\": \"Notes tarifaires\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Un tarif programmé remplace les prix de base du tarif pour une période spécifique.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Le prix dynamique est ajusté automatiquement en fonction du prix du marché de l'énergie (intervalle d'une heure).\",\n \"tariffNote.scheduledTariffNote\":\n \"Un tarif programmé remplace les prix de base du tarif pour une période spécifique.\",\n \"tariffNote.baseTariffNote\":\n \"Les tarifs affichés ici ont été transmis à E-Flux par le partenaire d'itinérance. La précision peut varier en fonction du fournisseur.\",\n \"tariff.congestionPricing\": \"Tarification de congestion peut s'appliquer\",\n \"tariff.fullDetailsHeader\": \"Détails du tarif\",\n \"tariff.lastUpdated\": \"Mis à jour {{date}}\",\n \"tariff.report\": \"Signaler\",\n \"tariff.reportThanks\": \"Merci pour le signalement\",\n \"tariff.reportError\": \"Échec de l'envoi, réessayez\",\n \"dynamicTariffs.subHeader\": \"Tarifs horaires\",\n \"location.viewAllHourlyPrices\": \"Voir tous les tarifs horaires\",\n \"location.operatorInfo\": \"Opérateur\",\n \"location.operator\": \"Opérateur\",\n \"location.suboperator\": \"Sous-opérateur\",\n \"location.owner\": \"Propriétaire\",\n \"location.openingHours\": \"Heures d'ouverture\",\n \"location.open24_7\": \"Ouvert 24h/24, 7j/7\",\n \"location.open\": \"Ouvert\",\n \"location.openNow\": \"Ouvert\",\n \"location.closedNow\": \"Fermé\",\n \"location.closed\": \"Fermé\",\n \"location.open24hours\": \"Ouvert 24h/24\",\n \"location.hours24\": \"24 heures\",\n \"location.opensAt\": \"Ouvre à {{time}}\",\n \"location.opensAtDay\": \"Ouvre {{day}} à {{time}}\",\n \"location.closesAt\": \"Ferme à {{time}}\",\n \"location.chargingWhenClosed\":\n \"Recharge possible hors des heures d'ouverture\",\n \"location.exceptionalClosings\": \"Fermeture exceptionnelle\",\n \"location.exceptionalOpenings\": \"Ouverture exceptionnelle\",\n \"location.visitWebsite\": \"Site web\",\n \"weekday.mon\": \"Lun\",\n \"weekday.tue\": \"Mar\",\n \"weekday.wed\": \"Mer\",\n \"weekday.thu\": \"Jeu\",\n \"weekday.fri\": \"Ven\",\n \"weekday.sat\": \"Sam\",\n \"weekday.sun\": \"Dim\",\n \"backButton.backTo\": \"Retour à\",\n};\n\nexport const it: LabelsType = {\n \"search.placeholder\": \"Inserisci una posizione...\",\n \"cdrPrice.flatFee\": \"{{total}} costi aggiuntivi\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Tariffa dinamica - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} sessione\",\n \"tariffPriceComponent.time\": \"{{total}} / ora\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / ora tariffa di inattività\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. tempo di attesa prima della tariffa di inattività\",\n \"tariffPriceComponent.noTariff\": \"Nessuna tariffa disponibile\",\n \"tariffPriceComponent.baseTariff\": \"Tariffa base\",\n \"tariffPriceComponent.active\": \"Attivo ora\",\n \"tariffPriceComponent.currentPrice\": \"Prezzo attuale\",\n \"filters.header\": \"Filtri\",\n \"filters.dcChargers\": \"Caricabatterie DC\",\n \"filters.efluxChargers\": \"Caricabatterie E-Flux\",\n \"filters.noAdditionalFee\": \"Senza costi aggiuntivi per sessione\",\n \"filters.available\": \"Disponibile\",\n \"filters.charging\": \"In carica\",\n \"filters.notAvailable\": \"Non disponibile\",\n \"filters.chargingPower\": \"Potenza di ricarica [kW]\",\n \"filters.connectorType\": \"Tipo di connettore\",\n \"filters.apply\": \"Applica filtri\",\n \"filters.clearAll\": \"Cancella tutti i filtri\",\n \"filters.onlyShow\": \"Mostra solo\",\n \"filters.statusHeading\": \"Stato\",\n \"evse.statusBlocked\": \"Bloccato\",\n \"evse.statusClosed\": \"Chiuso\",\n \"ocpp.statusPreparing\": \"Preparazione\",\n \"ocpp.statusSuspendedEvse\": \"Sospeso (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Sospeso (EV)\",\n \"ocpp.statusFinishing\": \"Completamento\",\n \"ocpp.statusFaulted\": \"Guasto\",\n \"analytics.evseStatus\": \"Stato EVSE\",\n \"analytics.roamingStatus\": \"Stato roaming\",\n \"pin.sites\": \"siti\",\n \"filters.maxEnergyPrice\": \"Prezzo max. per kWh\",\n \"filters.anyPrice\": \"Tutti\",\n \"pin.pricePerKwh\": \"{{price}} per kWh\",\n \"filters.chargingAccessibility\": \"Accessibilità del veicolo\",\n \"filters.accessibilityAll\": \"Tutti i veicoli\",\n \"filters.accessibilityTesla\": \"Solo Tesla\",\n \"filters.allAccessibility\": \"Tutti i tipi di accessibilità\",\n \"filters.remoteStartStop\": \"Supporta la ricarica da remoto\",\n \"filters.searchPhrase\": \"Cerca\",\n \"filters.searchPhrasePlaceholder\": \"ID EVSE o nome della posizione\",\n \"filters.operator\": \"Includi operatore/i\",\n \"filters.excludeOperator\": \"Escludi operatore/i\",\n \"filters.authMethodCapabilities\": \"Metodi di pagamento\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Carta di credito / debito\",\n \"filters.authCapability.remoteStartStop\": \"Avvio/stop remoto\",\n \"evse.statusAvailable\": \"Disponibile\",\n \"evse.statusCharging\": \"In carica\",\n \"evse.statusUnavailable\": \"Non disponibile\",\n \"evse.statusRemoved\": \"Rimossa\",\n \"evse.statusPlanned\": \"Pianificata\",\n \"evse.statusReserved\": \"Réservé\",\n \"evse.statusInoperative\": \"Inoperativo\",\n \"evse.statusOutOfOrder\": \"Fuori servizio\",\n \"evse.statusError\": \"Errore\",\n \"evse.statusUnknown\": \"Sconosciuto\",\n \"locationType.onStreet\": \"In strada\",\n \"locationType.parkingGarage\": \"Garage per il parcheggio\",\n \"locationType.undergroundGarage\": \"Garage sotterraneo\",\n \"locationType.parkingLot\": \"Parcheggio\",\n \"locationType.other\": \"Altro\",\n \"locationType.unknown\": \"Sconosciuto\",\n \"tariffPriceComponent.viewTariff\": \"Visualizza note tariffarie\",\n \"tariffNote.subHeader\": \"Note tariffarie\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Una tariffa programmata sostituisce i prezzi della tariffa base per un periodo di tempo specifico.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"Il prezzo dinamico si regola automaticamente in base al prezzo del mercato dell'energia (intervallo di 1 ora).\",\n \"tariffNote.scheduledTariffNote\":\n \"Una tariffa programmata sostituisce i prezzi della tariffa base per un periodo di tempo specifico.\",\n \"tariffNote.baseTariffNote\":\n \"Le tariffe mostrate qui sono state inviate a E-Flux dal partner di roaming. L'accuratezza può variare a seconda del fornitore.\",\n \"tariff.congestionPricing\":\n \"Potrebbero essere applicate tariffe di congestione\",\n \"tariff.fullDetailsHeader\": \"Dettagli tariffa\",\n \"tariff.lastUpdated\": \"Ultimo aggiornamento {{date}}\",\n \"tariff.report\": \"Segnala\",\n \"tariff.reportThanks\": \"Grazie per la segnalazione\",\n \"tariff.reportError\": \"Invio non riuscito, riprova\",\n \"evse.pricing\": \"Prezzi\",\n \"dynamicTariffs.subHeader\": \"Prezzi orari\",\n \"location.viewAllHourlyPrices\": \"Visualizza tutti i prezzi orari\",\n \"location.operatorInfo\": \"Operatore\",\n \"location.operator\": \"Operatore\",\n \"location.suboperator\": \"Sub-operatore\",\n \"location.owner\": \"Proprietario\",\n \"location.openingHours\": \"Orari di apertura\",\n \"location.open24_7\": \"Aperto 24/7\",\n \"location.open\": \"Aperto\",\n \"location.openNow\": \"Aperto ora\",\n \"location.closedNow\": \"Chiuso\",\n \"location.closed\": \"Chiuso\",\n \"location.open24hours\": \"Aperto 24 ore\",\n \"location.hours24\": \"24 ore\",\n \"location.opensAt\": \"Apre alle {{time}}\",\n \"location.opensAtDay\": \"Apre {{day}} alle {{time}}\",\n \"location.closesAt\": \"Chiude alle {{time}}\",\n \"location.chargingWhenClosed\": \"Ricarica disponibile anche da chiuso\",\n \"location.exceptionalClosings\": \"Chiusura eccezionale\",\n \"location.exceptionalOpenings\": \"Apertura eccezionale\",\n \"location.visitWebsite\": \"Sito web\",\n \"weekday.mon\": \"Lun\",\n \"weekday.tue\": \"Mar\",\n \"weekday.wed\": \"Mer\",\n \"weekday.thu\": \"Gio\",\n \"weekday.fri\": \"Ven\",\n \"weekday.sat\": \"Sab\",\n \"weekday.sun\": \"Dom\",\n \"backButton.backTo\": \"Torna a\",\n};\n\nexport const es: LabelsType = {\n \"search.placeholder\": \"Ingrese una ubicación...\",\n \"cdrPrice.flatFee\": \"{{total}} tarifa adicional\",\n \"tariffPriceComponent.dynamicTariffHeader\": \"Tarifa Dinámica - {{date}}\",\n \"tariffPriceComponent.flat\": \"{{total}} sesión\",\n \"tariffPriceComponent.time\": \"{{total}} / hora\",\n \"tariffPriceComponent.energy\": \"{{total}} / kWh\",\n \"tariffPriceComponent.parkingTime\": \"{{total}} / hora tarifa de inactividad\",\n \"tariffPriceComponent.parkingTimeWait\":\n \"{{minutes}} min. tiempo de espera antes de la tarifa de inactividad\",\n \"tariffPriceComponent.noTariff\": \"Tarifa no disponible\",\n \"tariffPriceComponent.baseTariff\": \"Tarifa Base\",\n \"tariffPriceComponent.active\": \"Activo ahora\",\n \"tariffPriceComponent.currentPrice\": \"Precio actual\",\n \"filters.header\": \"Filtros\",\n \"filters.dcChargers\": \"Cargadores DC\",\n \"filters.efluxChargers\": \"Cargadores E-Flux\",\n \"filters.noAdditionalFee\": \"Sin tarifa adicional por sesión\",\n \"filters.available\": \"Disponible\",\n \"filters.charging\": \"Cargando\",\n \"filters.notAvailable\": \"No Disponible\",\n \"filters.chargingPower\": \"Potencia de Carga [kW]\",\n \"filters.connectorType\": \"Tipo de Conector\",\n \"filters.apply\": \"Aplicar Filtros\",\n \"filters.clearAll\": \"Limpiar Todos los Filtros\",\n \"filters.onlyShow\": \"Mostrar Solo\",\n \"filters.statusHeading\": \"Estado\",\n \"evse.statusBlocked\": \"Bloqueado\",\n \"evse.statusClosed\": \"Cerrado\",\n \"ocpp.statusPreparing\": \"Preparando\",\n \"ocpp.statusSuspendedEvse\": \"Suspendido (EVSE)\",\n \"ocpp.statusSuspendedEv\": \"Suspendido (EV)\",\n \"ocpp.statusFinishing\": \"Finalizando\",\n \"ocpp.statusFaulted\": \"Averiado\",\n \"analytics.evseStatus\": \"Estado EVSE\",\n \"analytics.roamingStatus\": \"Estado roaming\",\n \"pin.sites\": \"sitios\",\n \"filters.maxEnergyPrice\": \"Precio máx. por kWh\",\n \"filters.anyPrice\": \"Todos\",\n \"pin.pricePerKwh\": \"{{price}} por kWh\",\n \"filters.chargingAccessibility\": \"Accesibilidad del vehículo\",\n \"filters.accessibilityAll\": \"Todos los vehículos\",\n \"filters.accessibilityTesla\": \"Solo Tesla\",\n \"filters.allAccessibility\": \"Todos los tipos de accesibilidad\",\n \"filters.remoteStartStop\": \"Admite carga remota\",\n \"filters.searchPhrase\": \"Buscar\",\n \"filters.searchPhrasePlaceholder\": \"ID de EVSE o nombre de la ubicación\",\n \"filters.operator\": \"Incluir operador(es)\",\n \"filters.excludeOperator\": \"Excluir operador(es)\",\n \"filters.authMethodCapabilities\": \"Métodos de pago\",\n \"filters.authCapability.rfid\": \"RFID\",\n \"filters.authCapability.plugAndCharge\": \"Plug and Charge\",\n \"filters.authCapability.creditCard\": \"Tarjeta de crédito / débito\",\n \"filters.authCapability.remoteStartStop\": \"Inicio/parada remota\",\n \"evse.statusRemoved\": \"Eliminado\",\n \"evse.statusPlanned\": \"Planificado\",\n \"evse.statusReserved\": \"Reservado\",\n \"evse.statusInoperative\": \"Fuera de servicio\",\n \"evse.statusOutOfOrder\": \"Averiado\",\n \"evse.statusAvailable\": \"Disponible\",\n \"evse.statusCharging\": \"Cargando\",\n \"evse.statusUnavailable\": \"No Disponible\",\n \"evse.statusError\": \"Error\",\n \"evse.statusUnknown\": \"Desconocido\",\n \"locationType.onStreet\": \"En la calle\",\n \"locationType.parkingGarage\": \"Garaje para Estacionar\",\n \"locationType.undergroundGarage\": \"Garaje Subterráneo\",\n \"locationType.parkingLot\": \"Estacionamiento\",\n \"locationType.other\": \"Otro\",\n \"locationType.unknown\": \"Desconocido\",\n \"tariffPriceComponent.viewTariff\": \"Ver notas de tarifas\",\n \"tariffNote.subHeader\": \"Notas de Tarifas\",\n \"tariffNote.eFluxScheduledTariffNote\":\n \"Una tarifa programada anula los precios de la tarifa base para un período de tiempo específico.\",\n \"tariffNote.dynamicScheduledTariffNote\":\n \"El precio dinámico se ajusta automáticamente según el precio del mercado de la energía (intervalo de 1 hora).\",\n \"tariffNote.scheduledTariffNote\":\n \"Una tarifa programada anula los precios de la tarifa base para un período de tiempo específico.\",\n \"tariffNote.baseTariffNote\":\n \"Las tarifas mostradas aquí han sido enviadas a E-Flux por el socio de roaming. La precisión puede variar según el proveedor.\",\n \"tariff.congestionPricing\": \"Puede aplicarse tarifa por congestión\",\n \"tariff.fullDetailsHeader\": \"Detalles de la tarifa\",\n \"tariff.lastUpdated\": \"Última actualización {{date}}\",\n \"tariff.report\": \"Reportar\",\n \"tariff.reportThanks\": \"Gracias por reportarlo\",\n \"tariff.reportError\": \"Error al enviar, inténtalo de nuevo\",\n \"evse.pricing\": \"Precios\",\n \"dynamicTariffs.subHeader\": \"Precios por Hora\",\n \"location.viewAllHourlyPrices\": \"Ver Todos los Precios por Hora\",\n \"location.operatorInfo\": \"Operador\",\n \"location.operator\": \"Operador\",\n \"location.suboperator\": \"Suboperador\",\n \"location.owner\": \"Propietario\",\n \"location.openingHours\": \"Horario de apertura\",\n \"location.open24_7\": \"Abierto 24/7\",\n \"location.open\": \"Abierto\",\n \"location.openNow\": \"Abierto ahora\",\n \"location.closedNow\": \"Cerrado\",\n \"location.closed\": \"Cerrado\",\n \"location.open24hours\": \"Abierto 24 horas\",\n \"location.hours24\": \"24 horas\",\n \"location.opensAt\": \"Abre a las {{time}}\",\n \"location.opensAtDay\": \"Abre {{day}} a las {{time}}\",\n \"location.closesAt\": \"Cierra a las {{time}}\",\n \"location.chargingWhenClosed\": \"Carga disponible cuando está cerrado\",\n \"location.exceptionalClosings\": \"Cierre excepcional\",\n \"location.exceptionalOpenings\": \"Apertura excepcional\",\n \"location.visitWebsite\": \"Sitio web\",\n \"weekday.mon\": \"Lun\",\n \"weekday.tue\": \"Mar\",\n \"weekday.wed\": \"Mié\",\n \"weekday.thu\": \"Jue\",\n \"weekday.fri\": \"Vie\",\n \"weekday.sat\": \"Sáb\",\n \"weekday.sun\": \"Dom\",\n \"backButton.backTo\": \"Volver a\",\n};\n\nexport const strings = {\n en,\n nl,\n de,\n fr,\n it,\n es,\n};\n","// MapVersion is the behaviour set an embedder selects with the `version` prop.\n// Each version keeps everything the one before it does: v2 adds map-key\n// authentication and the v2 details view, v3 adds the redesigned pins and asks\n// the API to count bucket statuses per EVSE rather than per location.\nexport type MapVersion = \"v1\" | \"v2\" | \"v3\";\n\nconst order: MapVersion[] = [\"v1\", \"v2\", \"v3\"];\n\n// versionRank places a version on the ordering above; unknown or missing\n// values rank as v1.\nexport function versionRank(version?: string): number {\n const index = order.indexOf((version || \"\").toLowerCase() as MapVersion);\n return index === -1 ? 0 : index;\n}\n\n// atLeast reports whether a version is the given one or a later one.\nexport function atLeast(version: string | undefined, min: MapVersion): boolean {\n return versionRank(version) >= versionRank(min);\n}\n","import { Analytics, MapKind, RemoteConfig } from \"../types\";\nimport { atLeast } from \"./version\";\n\ntype RequestOptionsType = {\n method?: string;\n body?: string;\n authorization?: string;\n version?: string;\n headers?: {\n \"Content-Type\": string;\n };\n};\n\nexport async function request(url: string, options?: RequestOptionsType) {\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(options.version && {\n version: options.version,\n }),\n ...(options.authorization &&\n atLeast(options.version, \"v2\") && {\n Authorization: `Bearer ${options.authorization}`,\n }),\n },\n ...options,\n });\n\n switch (response.status) {\n case 200:\n return response.json();\n case 400:\n throw new Error(\"Bad request\");\n case 404:\n throw new Error(\"Not Found\");\n case 500:\n throw new Error(\"Server Error\");\n case 503:\n throw new Error(\"Timeout!\");\n default:\n throw new Error(`Unexpected status: ${response.status}`);\n }\n } catch (e) {\n if (e instanceof DOMException) {\n return null;\n }\n throw e;\n }\n}\n\n// buildSearchBody shapes the widget filters into the request body shared by\n// /1/map/search and /1/map/analytics, so both endpoints match the same set.\nexport function buildSearchBody(\n limitToLocationIds: string[],\n props: Record<string, any>,\n) {\n return {\n ...(limitToLocationIds?.length > 0 && {\n locationIds: limitToLocationIds,\n }),\n ...props,\n ...(props?.operatorOnly ? { operator: [props.operatorOnly] } : {}),\n // ALL means no filter on the server, so leave it out of the body\n chargingAccessibility:\n props?.chargingAccessibility && props.chargingAccessibility !== \"ALL\"\n ? props.chargingAccessibility\n : undefined,\n searchPhrase: props?.searchPhrase || undefined,\n excludeOperator: props?.excludeOperator?.length\n ? props.excludeOperator\n : undefined,\n authMethodCapabilities: props?.authMethodCapabilities?.length\n ? props.authMethodCapabilities\n : undefined,\n currency: props?.currency || undefined,\n // the widget holds the limit as a bare amount in the map currency; the API\n // wants it paired with its currency, defaulting to the request currency\n maxEnergyPrice:\n typeof props?.maxEnergyPrice === \"number\"\n ? { amount: props.maxEnergyPrice, currency: props.currency || undefined }\n : undefined,\n };\n}\n\n// mapSearchPath resolves the endpoint for a map kind. Roaming maps stay on the\n// paths the mobile apps use; CPO maps use the /cpo/ variants, which speak the\n// connector OCPP status vocabulary and return individual locations.\nexport function mapSearchPath(\n apiRoot: string,\n kind: MapKind,\n endpoint: \"search\" | \"analytics\",\n): string {\n const root = apiRoot.replace(/\\/+$/, \"\");\n return `${root}/1/map/${kind === \"cpo\" ? \"cpo/\" : \"\"}${endpoint}`;\n}\n\nexport async function _fetchGeohashes(\n apiRoot,\n version,\n authorization,\n limitToLocationIds,\n { precision, ...props },\n kind: MapKind = \"roaming\",\n): Promise<any> {\n return request(mapSearchPath(apiRoot, kind, \"search\"), {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n gridPrecision: precision,\n ...buildSearchBody(limitToLocationIds, props),\n }),\n });\n}\n\nexport async function _fetchAnalytics(\n apiRoot,\n version,\n authorization,\n limitToLocationIds,\n props,\n kind: MapKind = \"roaming\",\n): Promise<{ data: Analytics }> {\n return request(mapSearchPath(apiRoot, kind, \"analytics\"), {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify(buildSearchBody(limitToLocationIds, props)),\n });\n}\n\nexport async function _fetchTariffs(\n apiRoot,\n version,\n authorization,\n { origin, ids },\n): Promise<any> {\n return request(`${apiRoot}/1/map/tariff`, {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n connection_id: origin.connectionId,\n country_code: origin.countryCode,\n party_id: origin.partyId,\n tariff_ids: ids,\n }),\n });\n}\n\nexport async function _fetchLocations(\n apiRoot,\n version,\n authorization,\n { ids, status },\n): Promise<any> {\n return request(`${apiRoot}/1/map/locations`, {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n ids,\n ...(atLeast(version, \"v2\") ? { status } : {}),\n }),\n });\n}\n\nexport async function _reportProblem(\n apiRoot,\n version,\n authorization,\n {\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n }: {\n type: string;\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n },\n): Promise<any> {\n return request(`${apiRoot}/1/map/report-problem`, {\n method: \"POST\",\n version,\n authorization,\n body: JSON.stringify({\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n }),\n });\n}\n\nexport async function loadRemoteConfig(\n apiRoot: string,\n version: string,\n authorization: string,\n): Promise<RemoteConfig> {\n const response = await request(`${apiRoot}/1/map/config`, {\n version: version,\n authorization: authorization,\n });\n\n return response?.data as RemoteConfig;\n}\n","import { LabelsType } from \"../i18n\";\nimport { MapKind } from \"../types\";\nimport { atLeast } from \"./version\";\n\n// Status names reach the widget in two vocabularies. Roaming maps carry the\n// OCPI EVSE status (AVAILABLE, INOPERATIVE, ...). CPO maps carry the connector\n// OCPP status the station reports (PREPARING, FAULTED, ...). Either can arrive\n// bare or with its enum prefix depending on the endpoint, so everything is\n// normalised to a bare upper-case name before it is coloured or labelled.\n\nconst prefixes = [\"EVSE_STATUS_\", \"CONNECTOR_OCPP_STATUS_\"];\n\nexport function normaliseStatus(status?: string): string {\n let name = (status || \"\").toUpperCase();\n for (const prefix of prefixes) {\n if (name.startsWith(prefix)) {\n name = name.slice(prefix.length);\n break;\n }\n }\n if (name === \"\" || name === \"UNSPECIFIED\") {\n return \"UNKNOWN\";\n }\n return name;\n}\n\n// Palette is the set of colours every status maps onto. v1 and v2 maps keep\n// the classic palette; v3 maps use the colours of the redesigned pins.\nexport type Palette = {\n green: string;\n blue: string;\n red: string;\n amber: string;\n grey: string;\n};\n\nexport const classicPalette: Palette = {\n green: \"#33AC19\",\n blue: \"#005CEE\",\n red: \"#EB001B\",\n amber: \"#F0A202\",\n grey: \"#9E9E9E\",\n};\n\nexport const modernPalette: Palette = {\n green: \"#0a924b\",\n blue: \"#3a6cce\",\n red: \"#d73337\",\n amber: \"#d98b09\",\n grey: \"#94999e\",\n};\n\nexport function paletteFor(version?: string): Palette {\n return atLeast(version, \"v3\") ? modernPalette : classicPalette;\n}\n\n// OCPP 1.6 states a connector passes through while a session is on it. They\n// colour like CHARGING so a busy-but-not-yet-charging pin is not read as broken.\nexport const inSessionStatuses = new Set([\n \"CHARGING\",\n \"PREPARING\",\n \"SUSPENDED_EVSE\",\n \"SUSPENDED_EV\",\n \"FINISHING\",\n]);\n\n// StatusTone is what a status means for the colour of whatever shows it.\nexport type StatusTone =\n | \"available\"\n | \"inSession\"\n | \"fault\"\n | \"unavailable\"\n | \"unknown\"\n | \"offline\";\n\n// Roaming maps answer a driver's question: can I charge here? Anything that is\n// neither free nor in use is offline to them.\nfunction roamingTone(name: string): StatusTone {\n if (name === \"AVAILABLE\") return \"available\";\n if (inSessionStatuses.has(name)) return \"inSession\";\n return \"offline\";\n}\n\n// CPO maps answer an operator's question: is anything wrong here? A fault, a\n// station taken out of service on purpose and one that has never reported are\n// three different answers, and RESERVED counts as in use.\nfunction cpoTone(name: string): StatusTone {\n if (name === \"FAULTED\") return \"fault\";\n if (name === \"UNAVAILABLE\") return \"unavailable\";\n if (name === \"UNKNOWN\") return \"unknown\";\n if (name === \"AVAILABLE\") return \"available\";\n if (inSessionStatuses.has(name) || name === \"RESERVED\") return \"inSession\";\n return \"fault\";\n}\n\nexport function statusTone(\n status?: string,\n kind: MapKind = \"roaming\",\n): StatusTone {\n const name = normaliseStatus(status);\n return kind === \"cpo\" ? cpoTone(name) : roamingTone(name);\n}\n\ntype ToneColours = Record<StatusTone, keyof Palette>;\n\n// Up to v2 a roaming map shows three colours: green, blue for a session, red\n// for the rest. v3 follows the pin design: a session is amber, the rest grey.\nconst roamingClassic: ToneColours = {\n available: \"green\",\n inSession: \"blue\",\n offline: \"red\",\n fault: \"red\",\n unavailable: \"red\",\n unknown: \"red\",\n};\n\nconst roamingModern: ToneColours = {\n available: \"green\",\n inSession: \"amber\",\n offline: \"grey\",\n fault: \"red\",\n unavailable: \"grey\",\n unknown: \"grey\",\n};\n\nconst cpoColours: ToneColours = {\n fault: \"red\",\n unavailable: \"amber\",\n unknown: \"grey\",\n available: \"green\",\n inSession: \"blue\",\n offline: \"amber\",\n};\n\nfunction toneColours(kind: MapKind, version?: string): ToneColours {\n if (kind === \"cpo\") return cpoColours;\n return atLeast(version, \"v3\") ? roamingModern : roamingClassic;\n}\n\nexport function toneColour(\n tone: StatusTone,\n kind: MapKind = \"roaming\",\n version?: string,\n): string {\n return paletteFor(version)[toneColours(kind, version)[tone]];\n}\n\nexport function getStatusColor(\n status?: string,\n kind: MapKind = \"roaming\",\n version?: string,\n): string {\n return toneColour(statusTone(status, kind), kind, version);\n}\n\nconst labelKeys: Record<string, keyof LabelsType> = {\n AVAILABLE: \"evse.statusAvailable\",\n CHARGING: \"evse.statusCharging\",\n UNAVAILABLE: \"evse.statusUnavailable\",\n ERROR: \"evse.statusError\",\n UNKNOWN: \"evse.statusUnknown\",\n REMOVED: \"evse.statusRemoved\",\n PLANNED: \"evse.statusPlanned\",\n RESERVED: \"evse.statusReserved\",\n INOPERATIVE: \"evse.statusInoperative\",\n OUTOFORDER: \"evse.statusOutOfOrder\",\n BLOCKED: \"evse.statusBlocked\",\n CLOSED: \"evse.statusClosed\",\n PREPARING: \"ocpp.statusPreparing\",\n SUSPENDED_EVSE: \"ocpp.statusSuspendedEvse\",\n SUSPENDED_EV: \"ocpp.statusSuspendedEv\",\n FINISHING: \"ocpp.statusFinishing\",\n FAULTED: \"ocpp.statusFaulted\",\n};\n\nexport function getStatusLabelKey(status?: string): keyof LabelsType {\n return labelKeys[normaliseStatus(status)] || \"evse.statusUnknown\";\n}\n\n// Marker tone priority per map kind, most important first. A pin takes the\n// first tone any of its statuses maps to.\nconst tonePriority: Record<MapKind, StatusTone[]> = {\n // a driver wants to know something is free\n roaming: [\"available\", \"inSession\", \"offline\"],\n // an operator wants to know something is wrong\n cpo: [\"fault\", \"unavailable\", \"inSession\", \"available\", \"unknown\"],\n};\n\n// pickMarkerColor colours a pin from its status buckets following the kind's\n// priority. With no buckets at all a roaming pin is offline and a CPO pin unknown.\nexport function pickMarkerColor(\n statuses: Array<{ name: string; count: number }> = [],\n kind: MapKind = \"roaming\",\n version?: string,\n): string {\n const tones = new Set(\n statuses.map((status) => statusTone(status.name, kind)),\n );\n const priority = tonePriority[kind];\n const tone =\n priority.find((candidate) => tones.has(candidate)) || priority.at(-1);\n return toneColour(tone, kind, version);\n}\n","import { getStatusColor } from \"./status\";\nimport { Position } from \"../types\";\n\n// getColorForStatus accepts roaming EVSE and connector OCPP status names, bare\n// or prefixed. See utils/status.ts for the mapping.\nexport function getColorForStatus(status) {\n return getStatusColor(status);\n}\n\n// locationPosition reads a location's map position: v2+ returns OCPI\n// `coordinates` as decimal strings, v1 returns GeoJSON `geoLocation` [lng, lat].\nexport function locationPosition(location): Position | undefined {\n if (location?.coordinates) {\n return {\n lat: Number(location.coordinates.latitude),\n lng: Number(location.coordinates.longitude),\n };\n }\n const coordinates = location?.geoLocation?.coordinates;\n if (coordinates) {\n return { lng: coordinates[0], lat: coordinates[1] };\n }\n}\n","import { LabelsType } from \"../i18n\";\nimport { MapKind } from \"../types\";\nimport { getStatusColor, getStatusLabelKey, normaliseStatus } from \"./status\";\n\n// StatusFilterOption is one checkbox in the status section of the filters\n// panel. `values` are the names sent in the search request's `status` list;\n// the option reads as checked when every one of them is selected.\nexport type StatusFilterOption = {\n id: string;\n labelKey: keyof LabelsType;\n values: string[];\n color: string;\n};\n\n// Roaming maps filter on the OCPI EVSE status, grouped the way drivers think:\n// free, busy, or not usable. Colours follow the SDK version's palette.\nfunction roamingOptions(version?: string): StatusFilterOption[] {\n return [\n {\n id: \"statusAvailable\",\n labelKey: \"filters.available\",\n values: [\"AVAILABLE\"],\n color: getStatusColor(\"AVAILABLE\", \"roaming\", version),\n },\n {\n id: \"statusCharging\",\n labelKey: \"filters.charging\",\n values: [\"CHARGING\"],\n color: getStatusColor(\"CHARGING\", \"roaming\", version),\n },\n {\n id: \"statusError\",\n labelKey: \"filters.notAvailable\",\n values: [\"INOPERATIVE\", \"UNKNOWN\"],\n color: getStatusColor(\"INOPERATIVE\", \"roaming\", version),\n },\n ];\n}\n\n// CPO maps filter on the connector OCPP status the station reports, one option\n// per OCPP 1.6 state so an operator can single out e.g. Faulted. The server\n// only knows UNSPECIFIED for the unknown state, so that is the wire value even\n// though it displays as Unknown.\nconst ocppStatuses = [\n \"AVAILABLE\",\n \"PREPARING\",\n \"CHARGING\",\n \"SUSPENDED_EVSE\",\n \"SUSPENDED_EV\",\n \"FINISHING\",\n \"RESERVED\",\n \"UNAVAILABLE\",\n \"FAULTED\",\n \"UNSPECIFIED\",\n];\n\nfunction ocppOptions(version?: string): StatusFilterOption[] {\n return ocppStatuses.map((status) => ({\n id: `ocppStatus_${status}`,\n labelKey: getStatusLabelKey(status),\n values: [status],\n color: getStatusColor(status, \"cpo\", version),\n }));\n}\n\nfunction isCpo(kind?: MapKind): boolean {\n return kind === \"cpo\";\n}\n\nexport function getStatusFilterOptions(\n kind?: MapKind,\n version?: string,\n): StatusFilterOption[] {\n return isCpo(kind) ? ocppOptions(version) : roamingOptions(version);\n}\n\n// toggleOption adds or removes a set of status values from the selected list,\n// keeping the rest untouched and never duplicating a value.\nexport function toggleOption(\n action: \"remove\" | \"add\",\n existing: string[],\n values: string[],\n): string[] {\n switch (action) {\n case \"remove\":\n return existing.filter((value) => !values.includes(value));\n case \"add\":\n return Array.from(new Set([...existing, ...values]));\n }\n}\n\n// findStatusFilterOption returns the filter option a status bucket belongs to,\n// or undefined when the context has no checkbox covering that status (e.g.\n// RESERVED on a roaming map). An UNKNOWN bucket matches the option carrying\n// UNSPECIFIED, the wire value the server knows for it.\nexport function findStatusFilterOption(\n kind: MapKind | undefined,\n status: string,\n): StatusFilterOption | undefined {\n const name = normaliseStatus(status);\n return getStatusFilterOptions(kind).find(\n (option) =>\n option.values.includes(name) ||\n (name === \"UNKNOWN\" && option.values.includes(\"UNSPECIFIED\")),\n );\n}\n\n// isStatusFilterActive reports whether the option covering a status bucket is\n// fully selected, which is when its checkbox would show as checked.\nexport function isStatusFilterActive(\n kind: MapKind | undefined,\n selected: string[],\n status: string,\n): boolean {\n const option = findStatusFilterOption(kind, status);\n return Boolean(\n option && option.values.every((value) => selected.includes(value)),\n );\n}\n\n// toggleStatusFilter flips the option covering a status bucket, the same way a\n// click on its checkbox would, and returns the new selection. Undefined means\n// no option covers the bucket, so there is nothing to toggle.\nexport function toggleStatusFilter(\n kind: MapKind | undefined,\n selected: string[],\n status: string,\n): string[] | undefined {\n const option = findStatusFilterOption(kind, status);\n if (!option) return undefined;\n const action = isStatusFilterActive(kind, selected, status)\n ? \"remove\"\n : \"add\";\n return toggleOption(action, selected, option.values);\n}\n\n// withoutStatusFilter returns the filters with the status selection removed.\n// The status pills fetch their counts with it so every status present in the\n// view stays listed, with the selected ones highlighted, instead of the\n// unselected ones vanishing from the response.\nexport function withoutStatusFilter(\n filters: Record<string, any> | undefined,\n): Record<string, any> {\n const { status, ...rest } = filters || {};\n return rest;\n}\n\n// statusForLocations decides what the status filter sends to /1/map/locations,\n// which narrows a location's EVSEs by roaming status. CPO maps hold connector\n// OCPP names in the filter, which that endpoint cannot match, so they send\n// nothing and the details view shows the whole location.\nexport function statusForLocations(\n kind: MapKind | undefined,\n status: string[] | undefined,\n): string[] | undefined {\n return isCpo(kind) ? undefined : status;\n}\n","import React, { useState, useMemo, useEffect, createContext } from \"react\";\nimport { LabelsType, strings, getLanguage } from \"../i18n\";\nimport {\n _fetchAnalytics,\n _fetchGeohashes,\n _fetchLocations,\n _fetchTariffs,\n _reportProblem,\n loadRemoteConfig,\n} from \"../utils/request\";\nimport { locationPosition } from \"../utils/location\";\nimport {\n Analytics,\n Location,\n MapKind,\n Position,\n RemoteConfig,\n RoadMapOptions,\n Status,\n FilterConfiguration,\n} from \"../types\";\nimport { statusForLocations } from \"../utils/statusFilters\";\nimport { atLeast } from \"../utils/version\";\n\n// SearchBounds is the normalised bounding box the markers were last fetched\n// for. The analytics pill reuses it so its totals match the pins on screen.\nexport type SearchBounds = {\n nwLat: number;\n nwLng: number;\n seLat: number;\n seLng: number;\n};\n\nexport type MapContextType = {\n t: (key: keyof LabelsType, props?: any) => string;\n isReady: boolean;\n options?: RoadMapOptions;\n setPlace: (place: any) => void;\n place?: google.maps.places.PlaceResult;\n fetchGeohashes?: ({ precision, bbox }) => Promise<any>;\n fetchAnalytics?: (args: {\n bbox: SearchBounds;\n [filter: string]: any;\n }) => Promise<{ data: Analytics }>;\n searchBounds?: SearchBounds;\n setSearchBounds?: (bounds: SearchBounds) => void;\n // mapKind follows options.context, which the remote map config overrides once\n // loaded. Components branch on it for paths, clustering and status colours.\n mapKind: MapKind;\n // currency energy prices are shown and filtered in on v3 maps (ISO 4217)\n currency: string;\n fetchLocations?: ({ ids }) => Promise<any>;\n fetchTariffs?: ({ origin, ids }) => Promise<any>;\n reportProblem?: (args: {\n type: string;\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n }) => Promise<any>;\n filters?: any;\n setLocationsIds?: (ids: string[]) => void;\n locationIds?: string[];\n filterConfiguration?: FilterConfiguration;\n setFilters?: (filters: any) => void;\n language: string;\n position?: Position;\n locations?: Location[];\n locationsStatus?: Status;\n isSearching?: boolean;\n setIsSearching?: (isSearching: boolean) => void;\n};\n\n// defaultCurrency matches what the API assumes when a request names none.\nexport const defaultCurrency = \"EUR\";\n\n// MapContext is the context that is used to store the map data include the initial configuration\n// passed to the widget\nexport const MapContext = createContext<MapContextType>({\n isReady: false,\n setPlace: () => {},\n t: (key: string) => `Translate ${key}`,\n language: \"en\",\n mapKind: \"roaming\",\n currency: defaultCurrency,\n});\n\ninterface Props {\n children: React.ReactNode;\n options: RoadMapOptions;\n language: string;\n}\n\nexport const MapProvider: React.FC<Props> = ({ children, ...props }) => {\n const [options, setOptions] = useState<RoadMapOptions>(props.options);\n const [filterConfiguration, setFilterConfiguration] =\n useState<FilterConfiguration>({\n preferredOperators: props.options.preferredOperators,\n // only carry flags the consumer actually set, so an undefined prop does\n // not wipe the value the remote config supplies for it\n ...(props.options.showOperatorOnly !== undefined && {\n showOperatorOnly: props.options.showOperatorOnly,\n }),\n ...(props.options.showNoAdditionalFeeFilter !== undefined && {\n showNoAdditionalFeeFilter: props.options.showNoAdditionalFeeFilter,\n }),\n ...(props.options.showPublishingModeFilter !== undefined && {\n showPublishingModeFilter: props.options.showPublishingModeFilter,\n }),\n ...(props.options.showVehicleAvailabilityFilter !== undefined && {\n showVehicleAvailabilityFilter:\n props.options.showVehicleAvailabilityFilter,\n }),\n ...(props.options.showSearchPhraseFilter !== undefined && {\n showSearchPhraseFilter: props.options.showSearchPhraseFilter,\n }),\n ...(props.options.showExcludeOperatorFilter !== undefined && {\n showExcludeOperatorFilter: props.options.showExcludeOperatorFilter,\n }),\n ...(props.options.showPaymentMethodFilter !== undefined && {\n showPaymentMethodFilter: props.options.showPaymentMethodFilter,\n }),\n ...(props.options.showAnalytics !== undefined && {\n showAnalytics: props.options.showAnalytics,\n }),\n ...(props.options.showPriceFilter !== undefined && {\n showPriceFilter: props.options.showPriceFilter,\n }),\n });\n const [error, setError] = useState();\n const [place, setPlace] = useState();\n const [position, setPosition] = useState<Position>(props.options.position);\n const [filters, setFilters] = useState<{ status?: string }>({});\n const [locationIds, setLocationsIds] = useState<string[]>(\n [props.options.locationId].filter(Boolean),\n );\n const [locations, setLocations] = useState<Location[]>([]);\n const [locationsStatus, setLocationsStatus] = useState<Status>({\n type: \"success\",\n });\n const [isSearching, setIsSearching] = useState<boolean>(false);\n const [searchBounds, setSearchBounds] = useState<SearchBounds>();\n // the map key's context, known once the remote config has loaded\n const [mapContext, setMapContext] = useState<RemoteConfig[\"context\"]>();\n\n // check if debug flag\n const isDebug = window.location.search.includes(\"debug=true\");\n if (isDebug) {\n console.log(\"map-context options\", props.options);\n }\n\n // no language prop: getLanguage falls back to the browser language\n const language = useMemo(\n () => getLanguage(props.options.language),\n [props.options.language],\n );\n const t = useMemo(() => {\n return (key: keyof LabelsType, props): string => {\n return strings[language][key].replace(/\\{\\{(\\w+)\\}\\}/g, (match, p1) => {\n return props[p1];\n });\n };\n }, [language]);\n\n const apiRoot = (() => {\n // a configured apiRoot is honoured for development targets only (a .dev\n // host or a local server); production embeds always use the version's root\n const configured = props.options.apiRoot?.replace(/\\/+$/, \"\");\n if (configured && /\\.dev|localhost|127\\.0\\.0\\.1/.test(configured)) {\n return configured;\n }\n // v2 and v3 share the map-search service; v3 differs by the version header\n // request() sends, not by where it sends it\n return atLeast(props.options.version, \"v2\")\n ? \"https://roaming.road.io/v2/map-search\"\n : \"https://api.road.io\";\n })();\n\n let version = props.options.version;\n let authorization = props.options.authorization;\n\n // if the request URL contains a map_key, override the authorization to enable\n // linking to bespoke map instances without multiple deployments\n const mapKey = window.location.search.split(\"map_key=\")[1];\n if (mapKey) {\n authorization = mapKey;\n // a map key needs at least v2, which authenticates with it\n if (!atLeast(version, \"v2\")) {\n version = \"v2\";\n }\n }\n\n const mapKind: MapKind =\n mapContext?.toLowerCase() === \"cpo\" ? \"cpo\" : \"roaming\";\n\n // the prop wins, then the remote config, then the API default\n const currency = (props.options.currency || options.currency || defaultCurrency)\n .trim()\n .toUpperCase();\n\n const passThroughSearchOptions = {\n // every search and analytics request names the currency so the price on\n // each bucket and the price limit agree with what the widget shows\n ...(atLeast(version, \"v3\") && { currency }),\n ...(props.options.infraProviderId && {\n infraProviderId: props.options.infraProviderId,\n }),\n ...(props.options.partyId && { partyId: props.options.partyId }),\n ...(props.options.partyIds?.length && {\n partyIds: props.options.partyIds,\n }),\n ...(props.options.evseId && { evseId: props.options.evseId }),\n ...(props.options.from && { from: props.options.from }),\n ...(props.options.to && { to: props.options.to }),\n };\n\n const fetchGeohashes = (args) =>\n _fetchGeohashes(\n apiRoot,\n version,\n authorization,\n props.options.limitToLocationIds || [],\n { ...passThroughSearchOptions, ...args },\n mapKind,\n );\n\n const fetchAnalytics = (args) =>\n _fetchAnalytics(\n apiRoot,\n version,\n authorization,\n props.options.limitToLocationIds || [],\n { ...passThroughSearchOptions, ...args },\n mapKind,\n );\n\n const fetchLocations = _fetchLocations.bind(\n null,\n apiRoot,\n version,\n authorization,\n );\n\n const fetchTariffs = _fetchTariffs.bind(\n null,\n apiRoot,\n version,\n authorization,\n );\n\n const reportProblem = _reportProblem.bind(\n null,\n apiRoot,\n version,\n authorization,\n );\n\n async function onFetchLocations({ ids, status }) {\n setLocationsStatus({ type: \"loading\" });\n try {\n const { data } = await fetchLocations({\n ids,\n ...(atLeast(version, \"v2\")\n ? { status: statusForLocations(mapKind, status) }\n : {}),\n });\n setLocations(data.filter((location) => location?.evses?.length));\n setLocationsStatus({ type: \"success\" });\n return data;\n } catch (e) {\n setLocationsStatus({ type: \"error\", error: e });\n }\n }\n\n useEffect(() => {\n if (!props.options.locationId) {\n return;\n }\n onFetchLocations({\n ids: [props.options.locationId],\n status: filters.status,\n }).then((data) => {\n const position = data?.length && locationPosition(data[0]);\n if (position) {\n setPosition(position);\n }\n });\n }, [props.options.locationId]);\n\n useEffect(() => {\n loadRemoteConfig(apiRoot, version, authorization)\n .then((rc) => {\n if (isDebug) {\n console.log(\"retrieved remote config\", rc);\n }\n // merge the remote configuration, with the locally defined configuration\n setFilterConfiguration({\n ...rc,\n ...filterConfiguration,\n });\n setOptions({\n googleApiKey: rc.googleMapsApiKey,\n ...options,\n ...rc,\n });\n setMapContext(rc.context);\n if (!options.locationId && !options?.position?.lat && rc.ipLatitude) {\n if (isDebug) {\n console.debug(\"setting position from ip latitude and longitude\");\n }\n setPosition({\n lat: rc.ipLatitude,\n lng: rc.ipLongitude,\n });\n // if the has not set a location id and we have a position\n } else if (!options.locationId) {\n if (isDebug) {\n console.debug(\"setting position from options position\");\n }\n setPosition(\n options?.position?.lat\n ? options.position\n : {\n lat: 52.3676,\n lng: 4.9041,\n },\n );\n }\n })\n .catch((err) => setError(err));\n }, []);\n\n useEffect(() => {\n if (locationIds?.length) {\n onFetchLocations({\n ids: locationIds,\n status: filters.status,\n });\n }\n }, [locationIds]);\n\n useEffect(() => {\n const { theming, shadowRoot } = props.options;\n\n if (shadowRoot) {\n const style =\n shadowRoot.querySelectorAll(\"#road-map-styles\")[0] ||\n document.createElement(\"style\");\n style.setAttribute(\"type\", \"text/css\");\n style.setAttribute(\"id\", \"road-map-styles\");\n style.innerHTML = `\n :host {\n --roadmap-brand-color: ${theming?.brandColor || \"#6102d3\"};\n --roadmap-background-color: ${theming?.backgroundColor || \"#ffffff\"};\n --roadmap-text-color: ${theming?.textColor || \"#2a2a2a\"};\n --roadmap-border-color: ${theming?.borderColor || \"#dddddd\"};\n --roadmap-font-family: ${theming?.fontFamily || \"Inter\"};\n }\n `;\n shadowRoot.appendChild(style);\n }\n }, [props.options.theming]);\n\n // the map kind decides which endpoints to call, so nothing renders before\n // the remote config has said what kind of map this key is. v1 has no map key\n // and its config carries no context, so those embeds run as roaming maps.\n const isReady = Boolean(\n position &&\n options?.googleApiKey &&\n (mapContext || !atLeast(version, \"v2\")),\n );\n\n const providerValue = useMemo(() => {\n return {\n options,\n setPlace,\n place,\n t,\n language,\n fetchGeohashes,\n fetchAnalytics,\n searchBounds,\n setSearchBounds,\n mapKind,\n currency,\n locations,\n locationsStatus,\n filterConfiguration,\n setFilters,\n setLocationsIds,\n locationIds,\n filters,\n fetchTariffs,\n reportProblem,\n fetchLocations,\n isReady,\n position,\n isSearching,\n setIsSearching,\n };\n }, [\n position,\n language,\n locations,\n locationsStatus,\n fetchTariffs,\n reportProblem,\n props.options,\n place,\n setPlace,\n setFilters,\n filters,\n filterConfiguration,\n locationIds,\n setLocationsIds,\n t,\n fetchGeohashes,\n fetchAnalytics,\n searchBounds,\n mapKind,\n currency,\n fetchLocations,\n isReady,\n isSearching,\n ]);\n\n return (\n <MapContext.Provider value={providerValue}>{children}</MapContext.Provider>\n );\n};\n\nexport function useMapContext(): MapContextType {\n const context = React.useContext(MapContext);\n if (context === undefined) {\n throw new Error(\"useMapContext must be used within a MapProvider\");\n }\n return context;\n}\n","import React, { useRef, useContext } from \"react\";\nimport styles from \"./app.module.css\";\nimport useOnScreen from \"./hooks/useOnScreen\";\nimport { MapContext } from \"./contexts/Map\";\n\ninterface Props {\n children?: React.ReactNode;\n height?: number;\n}\n\nexport default function Boot(props: Props) {\n const { isReady } = useContext(MapContext);\n const ref = useRef(null);\n const isVisible = useOnScreen(ref);\n const loaded = isVisible && isReady;\n return (\n <div\n ref={ref}\n className={styles.container}\n style={{\n height: `${props.height}px`,\n }}\n >\n {!loaded && <div className={styles.loader}>Loading...</div>}\n {loaded && props.children}\n </div>\n );\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nvar fastDeepEqual = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n\nvar isEqual = /*@__PURE__*/getDefaultExportFromCjs(fastDeepEqual);\n\n/**\n * Copyright 2019 Google LLC. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at.\n *\n * Http://www.apache.org/licenses/LICENSE-2.0.\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst DEFAULT_ID = \"__googleMapsScriptId\";\n/**\n * The status of the [[Loader]].\n */\nvar LoaderStatus;\n(function (LoaderStatus) {\n LoaderStatus[LoaderStatus[\"INITIALIZED\"] = 0] = \"INITIALIZED\";\n LoaderStatus[LoaderStatus[\"LOADING\"] = 1] = \"LOADING\";\n LoaderStatus[LoaderStatus[\"SUCCESS\"] = 2] = \"SUCCESS\";\n LoaderStatus[LoaderStatus[\"FAILURE\"] = 3] = \"FAILURE\";\n})(LoaderStatus || (LoaderStatus = {}));\n/**\n * [[Loader]] makes it easier to add Google Maps JavaScript API to your application\n * dynamically using\n * [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n * It works by dynamically creating and appending a script node to the the\n * document head and wrapping the callback function so as to return a promise.\n *\n * ```\n * const loader = new Loader({\n * apiKey: \"\",\n * version: \"weekly\",\n * libraries: [\"places\"]\n * });\n *\n * loader.load().then((google) => {\n * const map = new google.maps.Map(...)\n * })\n * ```\n */\nclass Loader {\n /**\n * Creates an instance of Loader using [[LoaderOptions]]. No defaults are set\n * using this library, instead the defaults are set by the Google Maps\n * JavaScript API server.\n *\n * ```\n * const loader = Loader({apiKey, version: 'weekly', libraries: ['places']});\n * ```\n */\n constructor({ apiKey, authReferrerPolicy, channel, client, id = DEFAULT_ID, language, libraries = [], mapIds, nonce, region, retries = 3, url = \"https://maps.googleapis.com/maps/api/js\", version, }) {\n this.callbacks = [];\n this.done = false;\n this.loading = false;\n this.errors = [];\n this.apiKey = apiKey;\n this.authReferrerPolicy = authReferrerPolicy;\n this.channel = channel;\n this.client = client;\n this.id = id || DEFAULT_ID; // Do not allow empty string\n this.language = language;\n this.libraries = libraries;\n this.mapIds = mapIds;\n this.nonce = nonce;\n this.region = region;\n this.retries = retries;\n this.url = url;\n this.version = version;\n if (Loader.instance) {\n if (!isEqual(this.options, Loader.instance.options)) {\n throw new Error(`Loader must not be called again with different options. ${JSON.stringify(this.options)} !== ${JSON.stringify(Loader.instance.options)}`);\n }\n return Loader.instance;\n }\n Loader.instance = this;\n }\n get options() {\n return {\n version: this.version,\n apiKey: this.apiKey,\n channel: this.channel,\n client: this.client,\n id: this.id,\n libraries: this.libraries,\n language: this.language,\n region: this.region,\n mapIds: this.mapIds,\n nonce: this.nonce,\n url: this.url,\n authReferrerPolicy: this.authReferrerPolicy,\n };\n }\n get status() {\n if (this.errors.length) {\n return LoaderStatus.FAILURE;\n }\n if (this.done) {\n return LoaderStatus.SUCCESS;\n }\n if (this.loading) {\n return LoaderStatus.LOADING;\n }\n return LoaderStatus.INITIALIZED;\n }\n get failed() {\n return this.done && !this.loading && this.errors.length >= this.retries + 1;\n }\n /**\n * CreateUrl returns the Google Maps JavaScript API script url given the [[LoaderOptions]].\n *\n * @ignore\n * @deprecated\n */\n createUrl() {\n let url = this.url;\n url += `?callback=__googleMapsCallback&loading=async`;\n if (this.apiKey) {\n url += `&key=${this.apiKey}`;\n }\n if (this.channel) {\n url += `&channel=${this.channel}`;\n }\n if (this.client) {\n url += `&client=${this.client}`;\n }\n if (this.libraries.length > 0) {\n url += `&libraries=${this.libraries.join(\",\")}`;\n }\n if (this.language) {\n url += `&language=${this.language}`;\n }\n if (this.region) {\n url += `&region=${this.region}`;\n }\n if (this.version) {\n url += `&v=${this.version}`;\n }\n if (this.mapIds) {\n url += `&map_ids=${this.mapIds.join(\",\")}`;\n }\n if (this.authReferrerPolicy) {\n url += `&auth_referrer_policy=${this.authReferrerPolicy}`;\n }\n return url;\n }\n deleteScript() {\n const script = document.getElementById(this.id);\n if (script) {\n script.remove();\n }\n }\n /**\n * Load the Google Maps JavaScript API script and return a Promise.\n * @deprecated, use importLibrary() instead.\n */\n load() {\n return this.loadPromise();\n }\n /**\n * Load the Google Maps JavaScript API script and return a Promise.\n *\n * @ignore\n * @deprecated, use importLibrary() instead.\n */\n loadPromise() {\n return new Promise((resolve, reject) => {\n this.loadCallback((err) => {\n if (!err) {\n resolve(window.google);\n }\n else {\n reject(err.error);\n }\n });\n });\n }\n importLibrary(name) {\n this.execute();\n return google.maps.importLibrary(name);\n }\n /**\n * Load the Google Maps JavaScript API script with a callback.\n * @deprecated, use importLibrary() instead.\n */\n loadCallback(fn) {\n this.callbacks.push(fn);\n this.execute();\n }\n /**\n * Set the script on document.\n */\n setScript() {\n var _a, _b;\n if (document.getElementById(this.id)) {\n // TODO wrap onerror callback for cases where the script was loaded elsewhere\n this.callback();\n return;\n }\n const params = {\n key: this.apiKey,\n channel: this.channel,\n client: this.client,\n libraries: this.libraries.length && this.libraries,\n v: this.version,\n mapIds: this.mapIds,\n language: this.language,\n region: this.region,\n authReferrerPolicy: this.authReferrerPolicy,\n };\n // keep the URL minimal:\n Object.keys(params).forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (key) => !params[key] && delete params[key]);\n if (!((_b = (_a = window === null || window === void 0 ? void 0 : window.google) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.importLibrary)) {\n // tweaked copy of https://developers.google.com/maps/documentation/javascript/load-maps-js-api#dynamic-library-import\n // which also sets the base url, the id, and the nonce\n /* eslint-disable */\n ((g) => {\n // @ts-ignore\n let h, a, k, p = \"The Google Maps JavaScript API\", c = \"google\", l = \"importLibrary\", q = \"__ib__\", m = document, b = window;\n // @ts-ignore\n b = b[c] || (b[c] = {});\n // @ts-ignore\n const d = b.maps || (b.maps = {}), r = new Set(), e = new URLSearchParams(), u = () => \n // @ts-ignore\n h || (h = new Promise((f, n) => __awaiter(this, void 0, void 0, function* () {\n var _a;\n yield (a = m.createElement(\"script\"));\n a.id = this.id;\n e.set(\"libraries\", [...r] + \"\");\n // @ts-ignore\n for (k in g)\n e.set(k.replace(/[A-Z]/g, (t) => \"_\" + t[0].toLowerCase()), g[k]);\n e.set(\"callback\", c + \".maps.\" + q);\n a.src = this.url + `?` + e;\n d[q] = f;\n a.onerror = () => (h = n(Error(p + \" could not load.\")));\n // @ts-ignore\n a.nonce = this.nonce || ((_a = m.querySelector(\"script[nonce]\")) === null || _a === void 0 ? void 0 : _a.nonce) || \"\";\n m.head.append(a);\n })));\n // @ts-ignore\n d[l] ? console.warn(p + \" only loads once. Ignoring:\", g) : (d[l] = (f, ...n) => r.add(f) && u().then(() => d[l](f, ...n)));\n })(params);\n /* eslint-enable */\n }\n // While most libraries populate the global namespace when loaded via bootstrap params,\n // this is not the case for \"marker\" when used with the inline bootstrap loader\n // (and maybe others in the future). So ensure there is an importLibrary for each:\n const libraryPromises = this.libraries.map((library) => this.importLibrary(library));\n // ensure at least one library, to kick off loading...\n if (!libraryPromises.length) {\n libraryPromises.push(this.importLibrary(\"core\"));\n }\n Promise.all(libraryPromises).then(() => this.callback(), (error) => {\n const event = new ErrorEvent(\"error\", { error }); // for backwards compat\n this.loadErrorCallback(event);\n });\n }\n /**\n * Reset the loader state.\n */\n reset() {\n this.deleteScript();\n this.done = false;\n this.loading = false;\n this.errors = [];\n this.onerrorEvent = null;\n }\n resetIfRetryingFailed() {\n if (this.failed) {\n this.reset();\n }\n }\n loadErrorCallback(e) {\n this.errors.push(e);\n if (this.errors.length <= this.retries) {\n const delay = this.errors.length * Math.pow(2, this.errors.length);\n console.error(`Failed to load Google Maps script, retrying in ${delay} ms.`);\n setTimeout(() => {\n this.deleteScript();\n this.setScript();\n }, delay);\n }\n else {\n this.onerrorEvent = e;\n this.callback();\n }\n }\n callback() {\n this.done = true;\n this.loading = false;\n this.callbacks.forEach((cb) => {\n cb(this.onerrorEvent);\n });\n this.callbacks = [];\n }\n execute() {\n this.resetIfRetryingFailed();\n if (this.done) {\n this.callback();\n }\n else {\n // short circuit and warn if google.maps is already loaded\n if (window.google && window.google.maps && window.google.maps.version) {\n console.warn(\"Google Maps already loaded outside @googlemaps/js-api-loader.\" +\n \"This may result in undesirable behavior as options and script parameters may not match.\");\n this.callback();\n return;\n }\n if (this.loading) ;\n else {\n this.loading = true;\n this.setScript();\n }\n }\n }\n}\n\nexport { DEFAULT_ID, Loader, LoaderStatus };\n//# sourceMappingURL=index.mjs.map\n","import { Loader } from \"@googlemaps/js-api-loader\";\n\nlet instance;\nexport function getLoader(apiKey, language): Loader {\n if (instance) return instance;\n\n const loader = new Loader({\n apiKey: apiKey, // Replace with your Google Maps API key\n version: \"weekly\",\n language,\n });\n instance = loader;\n return loader;\n}\n","/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\n/* Geohash encoding/decoding and associated functions (c) Chris Veness 2014-2019 / MIT Licence */\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\n\nconst base32 = '0123456789bcdefghjkmnpqrstuvwxyz'; // (geohash-specific) Base32 map\n\n\n/**\n * Geohash: Gustavo Niemeyer’s geocoding system.\n */\nclass Geohash {\n\n /**\n * Encodes latitude/longitude to geohash, either to specified precision or to automatically\n * evaluated precision.\n *\n * @param {number} lat - Latitude in degrees.\n * @param {number} lon - Longitude in degrees.\n * @param {number} [precision] - Number of characters in resulting geohash.\n * @returns {string} Geohash of supplied latitude/longitude.\n * @throws Invalid geohash.\n *\n * @example\n * const geohash = Geohash.encode(52.205, 0.119, 7); // => 'u120fxw'\n */\n static encode(lat, lon, precision) {\n // infer precision?\n if (typeof precision == 'undefined') {\n // refine geohash until it matches precision of supplied lat/lon\n for (let p=1; p<=12; p++) {\n const hash = Geohash.encode(lat, lon, p);\n const posn = Geohash.decode(hash);\n if (posn.lat==lat && posn.lon==lon) return hash;\n }\n precision = 12; // set to maximum\n }\n\n lat = Number(lat);\n lon = Number(lon);\n precision = Number(precision);\n\n if (isNaN(lat) || isNaN(lon) || isNaN(precision)) throw new Error('Invalid geohash');\n\n let idx = 0; // index into base32 map\n let bit = 0; // each char holds 5 bits\n let evenBit = true;\n let geohash = '';\n\n let latMin = -90, latMax = 90;\n let lonMin = -180, lonMax = 180;\n\n while (geohash.length < precision) {\n if (evenBit) {\n // bisect E-W longitude\n const lonMid = (lonMin + lonMax) / 2;\n if (lon >= lonMid) {\n idx = idx*2 + 1;\n lonMin = lonMid;\n } else {\n idx = idx*2;\n lonMax = lonMid;\n }\n } else {\n // bisect N-S latitude\n const latMid = (latMin + latMax) / 2;\n if (lat >= latMid) {\n idx = idx*2 + 1;\n latMin = latMid;\n } else {\n idx = idx*2;\n latMax = latMid;\n }\n }\n evenBit = !evenBit;\n\n if (++bit == 5) {\n // 5 bits gives us a character: append it and start over\n geohash += base32.charAt(idx);\n bit = 0;\n idx = 0;\n }\n }\n\n return geohash;\n }\n\n\n /**\n * Decode geohash to latitude/longitude (location is approximate centre of geohash cell,\n * to reasonable precision).\n *\n * @param {string} geohash - Geohash string to be converted to latitude/longitude.\n * @returns {{lat:number, lon:number}} (Center of) geohashed location.\n * @throws Invalid geohash.\n *\n * @example\n * const latlon = Geohash.decode('u120fxw'); // => { lat: 52.205, lon: 0.1188 }\n */\n static decode(geohash) {\n\n const bounds = Geohash.bounds(geohash); // <-- the hard work\n // now just determine the centre of the cell...\n\n const latMin = bounds.sw.lat, lonMin = bounds.sw.lon;\n const latMax = bounds.ne.lat, lonMax = bounds.ne.lon;\n\n // cell centre\n let lat = (latMin + latMax)/2;\n let lon = (lonMin + lonMax)/2;\n\n // round to close to centre without excessive precision: ⌊2-log10(Δ°)⌋ decimal places\n lat = lat.toFixed(Math.floor(2-Math.log(latMax-latMin)/Math.LN10));\n lon = lon.toFixed(Math.floor(2-Math.log(lonMax-lonMin)/Math.LN10));\n\n return { lat: Number(lat), lon: Number(lon) };\n }\n\n\n /**\n * Returns SW/NE latitude/longitude bounds of specified geohash.\n *\n * @param {string} geohash - Cell that bounds are required of.\n * @returns {{sw: {lat: number, lon: number}, ne: {lat: number, lon: number}}}\n * @throws Invalid geohash.\n */\n static bounds(geohash) {\n if (geohash.length == 0) throw new Error('Invalid geohash');\n\n geohash = geohash.toLowerCase();\n\n let evenBit = true;\n let latMin = -90, latMax = 90;\n let lonMin = -180, lonMax = 180;\n\n for (let i=0; i<geohash.length; i++) {\n const chr = geohash.charAt(i);\n const idx = base32.indexOf(chr);\n if (idx == -1) throw new Error('Invalid geohash');\n\n for (let n=4; n>=0; n--) {\n const bitN = idx >> n & 1;\n if (evenBit) {\n // longitude\n const lonMid = (lonMin+lonMax) / 2;\n if (bitN == 1) {\n lonMin = lonMid;\n } else {\n lonMax = lonMid;\n }\n } else {\n // latitude\n const latMid = (latMin+latMax) / 2;\n if (bitN == 1) {\n latMin = latMid;\n } else {\n latMax = latMid;\n }\n }\n evenBit = !evenBit;\n }\n }\n\n const bounds = {\n sw: { lat: latMin, lon: lonMin },\n ne: { lat: latMax, lon: lonMax },\n };\n\n return bounds;\n }\n\n\n /**\n * Determines adjacent cell in given direction.\n *\n * @param geohash - Cell to which adjacent cell is required.\n * @param direction - Direction from geohash (N/S/E/W).\n * @returns {string} Geocode of adjacent cell.\n * @throws Invalid geohash.\n */\n static adjacent(geohash, direction) {\n // based on github.com/davetroy/geohash-js\n\n geohash = geohash.toLowerCase();\n direction = direction.toLowerCase();\n\n if (geohash.length == 0) throw new Error('Invalid geohash');\n if ('nsew'.indexOf(direction) == -1) throw new Error('Invalid direction');\n\n const neighbour = {\n n: [ 'p0r21436x8zb9dcf5h7kjnmqesgutwvy', 'bc01fg45238967deuvhjyznpkmstqrwx' ],\n s: [ '14365h7k9dcfesgujnmqp0r2twvyx8zb', '238967debc01fg45kmstqrwxuvhjyznp' ],\n e: [ 'bc01fg45238967deuvhjyznpkmstqrwx', 'p0r21436x8zb9dcf5h7kjnmqesgutwvy' ],\n w: [ '238967debc01fg45kmstqrwxuvhjyznp', '14365h7k9dcfesgujnmqp0r2twvyx8zb' ],\n };\n const border = {\n n: [ 'prxz', 'bcfguvyz' ],\n s: [ '028b', '0145hjnp' ],\n e: [ 'bcfguvyz', 'prxz' ],\n w: [ '0145hjnp', '028b' ],\n };\n\n const lastCh = geohash.slice(-1); // last character of hash\n let parent = geohash.slice(0, -1); // hash without last character\n\n const type = geohash.length % 2;\n\n // check for edge-cases which don't share common prefix\n if (border[direction][type].indexOf(lastCh) != -1 && parent != '') {\n parent = Geohash.adjacent(parent, direction);\n }\n\n // append letter for direction to parent\n return parent + base32.charAt(neighbour[direction][type].indexOf(lastCh));\n }\n\n\n /**\n * Returns all 8 adjacent cells to specified geohash.\n *\n * @param {string} geohash - Geohash neighbours are required of.\n * @returns {{n,ne,e,se,s,sw,w,nw: string}}\n * @throws Invalid geohash.\n */\n static neighbours(geohash) {\n return {\n 'n': Geohash.adjacent(geohash, 'n'),\n 'ne': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'e'),\n 'e': Geohash.adjacent(geohash, 'e'),\n 'se': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'e'),\n 's': Geohash.adjacent(geohash, 's'),\n 'sw': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'w'),\n 'w': Geohash.adjacent(geohash, 'w'),\n 'nw': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'w'),\n };\n }\n\n}\n\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\n\nexport default Geohash;\n","import { PropsWithChildren, useEffect, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function createOverlay(\n container: HTMLElement,\n pane: keyof google.maps.MapPanes,\n position: google.maps.LatLng | google.maps.LatLngLiteral\n) {\n class Overlay extends google.maps.OverlayView {\n container: HTMLElement;\n pane: keyof google.maps.MapPanes;\n position: google.maps.LatLng | google.maps.LatLngLiteral;\n\n constructor(\n container: HTMLElement,\n pane: keyof google.maps.MapPanes,\n position: google.maps.LatLng | google.maps.LatLngLiteral\n ) {\n super();\n this.container = container;\n this.pane = pane;\n this.position = position;\n }\n\n onAdd(): void {\n const pane = this.getPanes()?.[this.pane];\n pane?.appendChild(this.container);\n }\n\n draw(): void {\n const projection = this.getProjection();\n const point = projection.fromLatLngToDivPixel(this.position);\n\n if (point === null) {\n return;\n }\n\n this.container.style.transform = `translate(${point.x}px, ${point.y}px)`;\n }\n\n onRemove(): void {\n if (this.container.parentNode !== null) {\n this.container.parentNode.removeChild(this.container);\n }\n }\n }\n return new Overlay(container, pane, position);\n}\n\ntype OverlayProps = PropsWithChildren<{\n position: {\n lat: number;\n lon: number;\n };\n pane?: keyof google.maps.MapPanes;\n map: google.maps.Map;\n zIndex?: number;\n}>;\n\nexport default function OverlayView({\n position,\n pane = \"floatPane\",\n map,\n zIndex,\n children,\n}: OverlayProps) {\n const container = useMemo(() => {\n const div = document.createElement(\"div\");\n div.style.position = \"absolute\";\n return div;\n }, []);\n\n const overlay = useMemo(() => {\n return createOverlay(container, pane, {\n lat: position.lat,\n lng: position.lon,\n });\n }, [container, pane, position]);\n\n useEffect(() => {\n overlay?.setMap(map);\n return () => {\n overlay?.setMap(null);\n };\n }, [map, overlay]);\n\n useEffect(() => {\n container.style.zIndex = `${zIndex}`;\n }, [zIndex, container]);\n\n return createPortal(children, container);\n}\n\n","import React, { useCallback, useMemo } from \"react\";\nimport { GeohashItem, MapKind } from \"../../types\";\nimport OverlayView from \"../OverlayView/OverlayView\";\nimport { pickMarkerColor } from \"../../utils/status\";\nimport styles from \"./CustomMarker.module.css\";\n\nconst formatter = new Intl.NumberFormat(undefined, {\n maximumSignificantDigits: 3,\n});\n\nconst formatNumber = (num: number) => {\n return formatter.format(num);\n};\n\ninterface Props {\n data: GeohashItem;\n map?: google.maps.Map;\n onClick: (payload: GeohashItem) => void;\n highlight?: boolean;\n kind?: MapKind;\n}\n\nconst CustomMarker: React.FC<Props> = ({\n data,\n map,\n onClick,\n highlight,\n kind = \"roaming\",\n}) => {\n const handleClick = useCallback(() => {\n onClick(data);\n }, [onClick, data]);\n\n // statuses carry roaming EVSE names on roaming maps and connector OCPP names\n // on CPO maps; the kind picks the colour priority\n const styleColor = useMemo(\n () => ({ background: pickMarkerColor(data.statuses, kind) }),\n [data, kind],\n );\n\n return (\n <OverlayView position={data.centroid} map={map} zIndex={highlight ? 99 : 0}>\n <button\n className={styles.container}\n onClick={handleClick}\n style={styleColor}\n // seems to be useful for ios safari\n onTouchEndCapture={handleClick}\n >\n {data.count > 1 ? formatNumber(data.count) : \"\"}\n </button>\n </OverlayView>\n );\n};\n\nexport default CustomMarker;\n","import { EnergyPrice } from \"../types\";\n\n// usable reports whether the API gave a price the widget can show or filter on.\nexport function usablePrice(price?: EnergyPrice): price is EnergyPrice {\n return Boolean(\n price &&\n typeof price.amount === \"number\" &&\n Number.isFinite(price.amount) &&\n price.currency,\n );\n}\n\nconst formatters = new Map<string, Intl.NumberFormat>();\n\nfunction formatter(language: string, currency: string): Intl.NumberFormat {\n const key = `${language}:${currency}`;\n let format = formatters.get(key);\n if (!format) {\n format = new Intl.NumberFormat(language, {\n style: \"currency\",\n currency,\n currencyDisplay: \"narrowSymbol\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n formatters.set(key, format);\n }\n return format;\n}\n\n// formatEnergyPrice renders a price per kWh the way the pin capsule and the\n// filter show it: narrow symbol, two decimals, in the widget language.\nexport function formatEnergyPrice(\n language: string,\n price?: EnergyPrice,\n): string | undefined {\n if (!usablePrice(price)) return undefined;\n try {\n return formatter(language, price.currency).format(price.amount);\n } catch {\n // an unknown currency code: fall back to the bare code\n return `${price.amount.toFixed(2)} ${price.currency}`;\n }\n}\n\n// Currencies whose prices per kWh sit well above one unit take a coarser\n// ladder; everything else uses the euro-like steps.\nconst tickScale: Record<string, number> = {\n SEK: 10,\n NOK: 10,\n DKK: 10,\n CZK: 25,\n PLN: 4,\n HUF: 400,\n ISK: 150,\n};\n\nconst baseTicks = [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];\n\nexport type PriceTick = {\n // the limit to send, undefined for \"no limit\"\n value: number | undefined;\n label: string;\n};\n\n// priceTicks lays out the steps of the max-price slider for a currency, ending\n// with the \"any price\" step that lifts the limit.\nexport function priceTicks(\n language: string,\n currency: string,\n anyLabel: string,\n): PriceTick[] {\n const scale = tickScale[currency.toUpperCase()] || 1;\n const decimals = scale >= 10 ? 0 : 2;\n const format = new Intl.NumberFormat(language, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n return [\n ...baseTicks.map((tick) => {\n const value = Math.round(tick * scale * 100) / 100;\n return { value, label: format.format(value) };\n }),\n { value: undefined, label: anyLabel },\n ];\n}\n","import { EnergyPrice, GeohashItem, MapKind } from \"../types\";\nimport { usablePrice } from \"./price\";\nimport {\n inSessionStatuses,\n modernPalette,\n normaliseStatus,\n Palette,\n} from \"./status\";\n\n// A v3 pin reads a bucket's statuses as charging units (EVSEs on roaming maps,\n// connectors on CPO maps) and turns them into one tone, one glyph and a\n// free/total pair. Colour carries availability only; the glyph repeats the\n// state so it survives greyscale.\n\nexport type PinTone =\n | \"available\"\n | \"inUse\"\n | \"offline\"\n | \"fault\"\n | \"planned\"\n | \"unknown\";\n\nexport type PinGlyph = \"bolt\" | \"ratio\" | \"dash\" | \"plus\" | \"alert\";\n\nexport type PinColours = {\n ring: string;\n text: string;\n};\n\nexport type PinSlice = {\n tone: PinTone;\n ring: string;\n fraction: number;\n};\n\nexport type PinState = {\n tone: PinTone;\n colours: PinColours;\n glyph: PinGlyph;\n free: number;\n total: number;\n // every tone present with its share of the units, in display order; a single\n // entry when the bucket is uniform\n split: PinSlice[];\n};\n\nexport type UnitCounts = {\n free: number;\n busy: number;\n fault: number;\n planned: number;\n unknown: number;\n offline: number;\n total: number;\n};\n\ntype UnitKind = keyof Omit<UnitCounts, \"total\">;\n\nfunction unitKind(name: string): UnitKind {\n if (name === \"AVAILABLE\") return \"free\";\n if (inSessionStatuses.has(name) || name === \"RESERVED\") return \"busy\";\n if (name === \"FAULTED\") return \"fault\";\n if (name === \"PLANNED\") return \"planned\";\n if (name === \"UNKNOWN\") return \"unknown\";\n return \"offline\";\n}\n\nexport function countUnits(\n statuses: Array<{ name: string; count: number }> = [],\n): UnitCounts {\n const counts: UnitCounts = {\n free: 0,\n busy: 0,\n fault: 0,\n planned: 0,\n unknown: 0,\n offline: 0,\n total: 0,\n };\n for (const status of statuses) {\n const count = Math.max(0, status.count || 0);\n counts[unitKind(normaliseStatus(status.name))] += count;\n counts.total += count;\n }\n return counts;\n}\n\n// A CPO pin tells an operator what is wrong first: a fault, then a connector\n// taken out of service, then sessions, then free connectors.\nfunction cpoTone(counts: UnitCounts): PinTone {\n if (counts.fault > 0) return \"fault\";\n if (counts.offline > 0) return \"offline\";\n if (counts.busy > 0) return \"inUse\";\n if (counts.free > 0) return \"available\";\n return \"unknown\";\n}\n\n// A roaming pin follows the design: a single location reads \"in use\" as soon\n// as a session is on it, with the free count in the glyph, while a cluster\n// reads green as soon as anything inside it is free.\nfunction roamingTone(counts: UnitCounts, cluster: boolean): PinTone {\n if (counts.fault > 0) return \"fault\";\n if (cluster && counts.free > 0) return \"available\";\n if (counts.busy > 0) return \"inUse\";\n if (counts.free > 0) return \"available\";\n if (counts.total === 0) return \"unknown\";\n if (counts.planned === counts.total) return \"planned\";\n if (counts.unknown === counts.total) return \"unknown\";\n return \"offline\";\n}\n\nexport function pinTone(\n counts: UnitCounts,\n kind: MapKind,\n cluster: boolean,\n): PinTone {\n if (counts.total === 0) return \"unknown\";\n return kind === \"cpo\" ? cpoTone(counts) : roamingTone(counts, cluster);\n}\n\n// The glyph never hides a free unit: a fault or an outage only gets its own\n// mark when nothing is left to charge on, otherwise the free count shows.\nexport function pinGlyph(counts: UnitCounts, tone: PinTone): PinGlyph {\n if (counts.free > 0) {\n return counts.free === counts.total ? \"bolt\" : \"ratio\";\n }\n if (tone === \"fault\") return \"alert\";\n if (tone === \"planned\") return \"plus\";\n if (counts.busy > 0) return \"ratio\";\n return \"dash\";\n}\n\nconst ringByTone: Record<MapKind, Record<PinTone, keyof Palette>> = {\n roaming: {\n available: \"green\",\n inUse: \"amber\",\n offline: \"grey\",\n fault: \"red\",\n planned: \"grey\",\n unknown: \"grey\",\n },\n // a CPO map keeps blue for sessions so amber stays \"taken out of service\"\n cpo: {\n available: \"green\",\n inUse: \"blue\",\n offline: \"amber\",\n fault: \"red\",\n planned: \"grey\",\n unknown: \"grey\",\n },\n};\n\n// darker companions of the palette for digits drawn on a white body\nconst textByColour: Record<keyof Palette, string> = {\n green: \"#006025\",\n amber: \"#a16100\",\n blue: \"#2b57a8\",\n red: \"#a20519\",\n grey: \"#6d7277\",\n};\n\nexport function pinColours(tone: PinTone, kind: MapKind): PinColours {\n const key = ringByTone[kind][tone];\n return { ring: modernPalette[key], text: textByColour[key] };\n}\n\n// the order slices are drawn round a mixed cluster's ring\nconst sliceOrder: Array<[UnitKind, PinTone]> = [\n [\"free\", \"available\"],\n [\"busy\", \"inUse\"],\n [\"fault\", \"fault\"],\n [\"offline\", \"offline\"],\n [\"planned\", \"planned\"],\n [\"unknown\", \"unknown\"],\n];\n\nexport function pinSplit(counts: UnitCounts, kind: MapKind): PinSlice[] {\n if (counts.total === 0) return [];\n return sliceOrder\n .filter(([unit]) => counts[unit] > 0)\n .map(([unit, tone]) => ({\n tone,\n ring: pinColours(tone, kind).ring,\n fraction: counts[unit] / counts.total,\n }));\n}\n\nexport function describePin(\n statuses: Array<{ name: string; count: number }> | undefined,\n kind: MapKind = \"roaming\",\n cluster = false,\n): PinState {\n const counts = countUnits(statuses);\n const tone = pinTone(counts, kind, cluster);\n return {\n tone,\n colours: pinColours(tone, kind),\n glyph: pinGlyph(counts, tone),\n free: counts.free,\n total: counts.total,\n split: pinSplit(counts, kind),\n };\n}\n\n// isCluster reports whether a bucket stands for more than one location. The\n// index can hold one location several times, once per connection that carries\n// it, and such a bucket counts two with the same id twice; that is still one\n// pin, not a cluster.\nexport function isCluster(data: Pick<GeohashItem, \"count\" | \"ids\">): boolean {\n if (data.count <= 1) return false;\n const ids = data.ids || [];\n return ids.length === 0 || new Set(ids).size > 1;\n}\n\n// pinPrice returns the price a bucket's pin shows in its tag, or undefined\n// when the tag reads as unknown: a cluster, no price, or a price of zero. A\n// zero means the tariff charges by time or session rather than energy, and a\n// pin saying it is free would mislead.\nexport function pinPrice(data: GeohashItem): EnergyPrice | undefined {\n if (isCluster(data)) return undefined;\n if (!usablePrice(data.energyPrice) || data.energyPrice.amount <= 0) {\n return undefined;\n }\n return data.energyPrice;\n}\n","import React, { CSSProperties, useCallback, useMemo } from \"react\";\nimport { GeohashItem, MapKind } from \"../../types\";\nimport OverlayView from \"../OverlayView/OverlayView\";\nimport {\n describePin,\n isCluster,\n PinSlice,\n PinState,\n} from \"../../utils/pinState\";\n\n// Pin is the v3 marker: a white teardrop hanging from its tail tip with the\n// availability in a coloured ring and a glyph (bolt, free/total, dash, plus,\n// alert). Whenever the glyph shows, a single location also carries a price\n// tag under the tip: white digits on a dark tag, or an ellipsis when the price\n// per kWh is not known, the pin above it unchanged. Colour carries\n// availability only; the price is always type, never hue. Small clusters stack two ghost pins behind a count; larger ones are a\n// circle, ringed by the availability split when it is mixed. Styling lives in\n// a stylesheet the markers' parent renders once, so it reaches the page\n// whether or not the published stylesheet has caught up.\n\nconst formatter = new Intl.NumberFormat(undefined, {\n maximumSignificantDigits: 3,\n});\n\n// The tail tip of a square rotated 45 degrees sits sqrt(2)/2 of the side\n// below the square's centre.\nconst TAIL = Math.SQRT1_2;\n\nconst SINGLE = 40;\nconst SELECTED = 52;\nconst COMPACT = 26;\nconst CIRCLE = 48;\nconst CIRCLE_SELECTED = 56;\n// clusters up to this many locations are drawn as stacked pins\nconst STACK_MAX = 9;\n// the price tag hangs this far under the tail tip\nconst TAG_GAP = 4;\n// what the tag says when the price per kWh is not known\nconst UNKNOWN_PRICE = \"\\u2026\";\n\nconst INK = \"#2a2e33\";\nconst MUTED = \"#6d7277\";\n// the price tag, from the design: near-white digits on dark grey\nconst TAG_INK = \"#fdfcf9\";\nconst TAG_BACKGROUND = \"#383c43\";\nconst SHADOW = \"rgba(23, 27, 31, 0.22)\";\nconst SHADOW_SOFT = \"rgba(23, 27, 31, 0.14)\";\nconst SHADOW_DEEP = \"rgba(23, 27, 31, 0.3)\";\n\nexport const pinStylesheet = `\n.roadmap-pin {\n position: absolute;\n left: 0;\n top: 0;\n display: block;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n -webkit-appearance: none;\n appearance: none;\n cursor: pointer;\n font-family: var(--roadmap-font-family, Inter), system-ui, -apple-system, sans-serif;\n animation: roadmap-pin-in 0.18s ease-out both;\n}\n.roadmap-pin:focus-visible {\n outline: none;\n}\n.roadmap-pin-body {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n border-radius: 50% 50% 50% 0;\n border: 3px solid currentColor;\n background: #fff;\n transform: rotate(-45deg);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.12s ease, box-shadow 0.12s ease;\n}\n.roadmap-pin:hover .roadmap-pin-body {\n transform: rotate(-45deg) scale(1.06);\n}\n.roadmap-pin-ghost {\n position: absolute;\n box-sizing: border-box;\n border-radius: 50% 50% 50% 0;\n border: 2px solid;\n transform: rotate(-45deg);\n}\n.roadmap-pin-glyph {\n display: flex;\n align-items: center;\n justify-content: center;\n transform: rotate(45deg);\n line-height: 1;\n white-space: nowrap;\n font-family: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-weight: 500;\n}\n.roadmap-pin-circle,\n.roadmap-pin-ring {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n border-radius: 50%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n line-height: 1;\n transition: transform 0.12s ease;\n}\n.roadmap-pin-circle {\n background: #fff;\n border: 3px solid currentColor;\n}\n.roadmap-pin:hover .roadmap-pin-circle,\n.roadmap-pin:hover .roadmap-pin-ring {\n transform: scale(1.06);\n}\n.roadmap-pin-ring-inner {\n width: calc(100% - 12px);\n height: calc(100% - 12px);\n border-radius: 50%;\n background: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.roadmap-pin-count {\n font-family: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-weight: 500;\n line-height: 1;\n}\n.roadmap-pin-label {\n margin-top: 2px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n line-height: 1;\n}\n.roadmap-pin-tag {\n position: absolute;\n transform: translateX(-50%);\n box-sizing: border-box;\n padding: 2px 6px;\n border-radius: 4px;\n background: ${TAG_BACKGROUND};\n color: ${TAG_INK};\n font-family: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 500;\n line-height: 13px;\n white-space: nowrap;\n pointer-events: none;\n}\n@keyframes roadmap-pin-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: none; }\n}\n`;\n\n// PinStyles renders the pin stylesheet; the markers' parent mounts it once.\nexport function PinStyles() {\n return <style>{pinStylesheet}</style>;\n}\n\nfunction withAlpha(hex: string, alpha: number): string {\n const value = hex.replace(\"#\", \"\");\n const r = parseInt(value.slice(0, 2), 16);\n const g = parseInt(value.slice(2, 4), 16);\n const b = parseInt(value.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n// tailAnchored places a size-square root so its rotated tail tip sits on the\n// geo point.\nfunction tailAnchored(size: number): CSSProperties {\n return {\n width: size,\n height: size,\n left: -size / 2,\n top: -(size / 2 + size * TAIL),\n };\n}\n\nfunction centred(size: number): CSSProperties {\n return { width: size, height: size, left: -size / 2, top: -size / 2 };\n}\n\nfunction conicGradient(split: PinSlice[]): string {\n let at = 0;\n const stops = split.map((slice) => {\n const from = at;\n at += slice.fraction * 100;\n return `${slice.ring} ${from.toFixed(2)}% ${at.toFixed(2)}%`;\n });\n return `conic-gradient(${stops.join(\", \")})`;\n}\n\nfunction Bolt({ scale, fill }: { scale: number; fill: string }) {\n return (\n <svg\n width={12 * scale}\n height={18 * scale}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n >\n <polygon points=\"58,0 18,56 44,56 38,100 84,40 52,40\" fill={fill} />\n </svg>\n );\n}\n\nfunction ratioFontSize(state: PinState, scale: number): number {\n const digits = String(state.free).length + String(state.total).length;\n if (digits <= 2) return 13 * scale;\n if (digits === 3) return 11 * scale;\n return 9.5 * scale;\n}\n\nfunction Glyph({ state, scale }: { state: PinState; scale: number }) {\n const { ring, text } = state.colours;\n switch (state.glyph) {\n case \"bolt\":\n return <Bolt scale={scale} fill={ring} />;\n case \"ratio\":\n return (\n <span style={{ fontSize: ratioFontSize(state, scale), color: text }}>\n {state.free}/{state.total}\n </span>\n );\n case \"dash\":\n return (\n <span\n style={{\n display: \"block\",\n width: 16 * scale,\n height: 2 * scale,\n borderRadius: 2,\n background: text,\n }}\n />\n );\n case \"plus\":\n return <span style={{ fontSize: 14 * scale, color: text }}>+</span>;\n case \"alert\":\n return (\n <span style={{ fontSize: 15 * scale, fontWeight: 700, color: ring }}>\n !\n </span>\n );\n }\n}\n\ntype BodyProps = {\n state: PinState;\n selected?: boolean;\n onClick: () => void;\n label: string;\n};\n\n// bodyStyle is the teardrop itself: muted tones recede, a planned pin is an\n// outline, a selected pin gets a halo.\nfunction bodyStyle(state: PinState, selected: boolean, compact = false) {\n const ring = state.colours.ring;\n const muted = state.tone === \"offline\" || state.tone === \"unknown\";\n const planned = state.tone === \"planned\";\n const style: CSSProperties = {\n borderWidth: compact ? 2.5 : 3,\n borderStyle: planned ? \"dashed\" : \"solid\",\n background: planned ? \"#fcfcf9\" : muted ? \"#f0f2f4\" : \"#fff\",\n boxShadow: planned\n ? \"none\"\n : selected\n ? `0 6px 16px ${SHADOW_DEEP}, 0 0 0 4px ${withAlpha(ring, 0.18)}`\n : muted\n ? `0 2px 5px ${SHADOW_SOFT}`\n : `0 3px 8px ${SHADOW}`,\n };\n return { style, muted };\n}\n\n// SinglePin is one location. Unless compact it hangs the tag under the tail\n// tip, which sits at the bottom edge of the pin's root, so the tag never moves\n// when the pin grows on selection.\nfunction SinglePin({\n state,\n selected = false,\n compact = false,\n tag,\n onClick,\n label,\n}: BodyProps & { compact?: boolean; tag?: string }) {\n const size = compact ? COMPACT : selected ? SELECTED : SINGLE;\n const { style, muted } = bodyStyle(state, selected, compact);\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={{\n ...tailAnchored(size),\n color: state.colours.ring,\n opacity: muted ? 0.85 : 1,\n }}\n onClick={onClick}\n // seems to be useful for ios safari\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span className=\"roadmap-pin-body\" style={style}>\n {!compact && (\n <span className=\"roadmap-pin-glyph\">\n <Glyph state={state} scale={size / SINGLE} />\n </span>\n )}\n </span>\n {tag && !compact && (\n <span\n className=\"roadmap-pin-tag\"\n style={{\n left: size / 2,\n top: size / 2 + size * TAIL + TAG_GAP,\n // an unknown price recedes so the known ones stand out\n opacity: tag === UNKNOWN_PRICE ? 0.5 : 1,\n }}\n >\n {tag}\n </span>\n )}\n </button>\n );\n}\n\nfunction StackedPin({\n state,\n count,\n selected = false,\n onClick,\n label,\n}: BodyProps & { count: number }) {\n const size = selected ? SELECTED : SINGLE;\n const scale = size / SINGLE;\n const ring = state.colours.ring;\n const { style } = bodyStyle(state, selected);\n // two ghost pins peek out behind the front one, up and to the left\n const ghost = (step: number, fill: number, edge: number): CSSProperties => ({\n left: -4 * step,\n top: -4 * step,\n width: size - 2 * step,\n height: size - 2 * step,\n background: withAlpha(ring, fill),\n borderColor: withAlpha(ring, edge),\n });\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={{ ...tailAnchored(size), color: ring }}\n onClick={onClick}\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span className=\"roadmap-pin-ghost\" style={ghost(2, 0.05, 0.3)} />\n <span className=\"roadmap-pin-ghost\" style={ghost(1, 0.08, 0.45)} />\n <span className=\"roadmap-pin-body\" style={style}>\n <span\n className=\"roadmap-pin-glyph\"\n style={{ fontSize: 14 * scale, color: state.colours.text }}\n >\n {formatter.format(count)}\n </span>\n </span>\n </button>\n );\n}\n\nfunction ClusterCircle({\n state,\n count,\n selected = false,\n onClick,\n label,\n sitesLabel,\n}: BodyProps & { count: number; sitesLabel: string }) {\n const size = selected ? CIRCLE_SELECTED : CIRCLE;\n const ring = state.colours.ring;\n const text = formatter.format(count);\n const halo = `0 0 0 ${selected ? 8 : 6}px ${withAlpha(ring, 0.14)}`;\n\n if (state.split.length > 1) {\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={centred(size)}\n onClick={onClick}\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span\n className=\"roadmap-pin-ring\"\n style={{\n background: conicGradient(state.split),\n boxShadow: selected\n ? `0 4px 12px ${SHADOW_DEEP}, ${halo}`\n : `0 3px 8px ${SHADOW}`,\n }}\n >\n <span className=\"roadmap-pin-ring-inner\">\n <span\n className=\"roadmap-pin-count\"\n style={{ fontSize: 14, color: INK }}\n >\n {text}\n </span>\n </span>\n </span>\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n className=\"roadmap-pin\"\n style={{ ...centred(size), color: ring }}\n onClick={onClick}\n onTouchEndCapture={onClick}\n aria-label={label}\n >\n <span\n className=\"roadmap-pin-circle\"\n style={{ boxShadow: `0 3px 8px ${SHADOW}, ${halo}` }}\n >\n <span\n className=\"roadmap-pin-count\"\n style={{ fontSize: 15, color: INK }}\n >\n {text}\n </span>\n <span\n className=\"roadmap-pin-label\"\n style={{ fontSize: sitesLabel.length > 6 ? 7 : 8, color: MUTED }}\n >\n {sitesLabel}\n </span>\n </span>\n </button>\n );\n}\n\ninterface Props {\n data: GeohashItem;\n map?: google.maps.Map;\n kind: MapKind;\n onClick: (payload: GeohashItem) => void;\n // the bucket holds the location open in the sidebar\n selected?: boolean;\n // the map is zoomed out far enough that a single pin drops to a dot\n compact?: boolean;\n // the formatted price per kWh for the tag under the pin; absent when the\n // location has none, in which case the tag reads as unknown\n price?: string;\n // accessible wording of that price, e.g. \"€0.42 per kWh\"\n priceLabel?: string;\n // caption under the count of a large cluster, e.g. \"sites\"\n sitesLabel: string;\n}\n\nconst Pin: React.FC<Props> = ({\n data,\n map,\n kind,\n onClick,\n selected = false,\n compact = false,\n price,\n priceLabel,\n sitesLabel,\n}) => {\n const cluster = isCluster(data);\n const state = useMemo(\n () => describePin(data.statuses, kind, cluster),\n [data, kind, cluster],\n );\n const handleClick = useCallback(() => onClick(data), [onClick, data]);\n const label = cluster\n ? `${formatter.format(data.count)} ${sitesLabel}`\n : price\n ? `${state.free}/${state.total}, ${priceLabel || price}`\n : `${state.free}/${state.total}`;\n\n let body: React.ReactNode;\n if (cluster && data.count > STACK_MAX) {\n body = (\n <ClusterCircle\n state={state}\n count={data.count}\n selected={selected}\n onClick={handleClick}\n label={label}\n sitesLabel={sitesLabel}\n />\n );\n } else if (cluster) {\n body = (\n <StackedPin\n state={state}\n count={data.count}\n selected={selected}\n onClick={handleClick}\n label={label}\n />\n );\n } else {\n body = (\n <SinglePin\n state={state}\n selected={selected}\n compact={compact}\n tag={price || UNKNOWN_PRICE}\n onClick={handleClick}\n label={label}\n />\n );\n }\n\n return (\n <OverlayView\n position={data.centroid}\n map={map}\n zIndex={selected ? 99 : cluster ? 1 : 0}\n >\n {body}\n </OverlayView>\n );\n};\n\nexport default Pin;\n","import { GeohashItem } from \"../types\";\n\nfunction sameStatuses(a: GeohashItem, b: GeohashItem): boolean {\n if (a.count !== b.count) return false;\n const left = a.statuses || [];\n const right = b.statuses || [];\n if (left.length !== right.length) return false;\n return left.every(\n (status, i) =>\n status.name === right[i].name && status.count === right[i].count,\n );\n}\n\nfunction samePrice(a: GeohashItem, b: GeohashItem): boolean {\n if (!a.energyPrice || !b.energyPrice) {\n return !a.energyPrice && !b.energyPrice;\n }\n return (\n a.energyPrice.amount === b.energyPrice.amount &&\n a.energyPrice.currency === b.energyPrice.currency\n );\n}\n\n// mergeBuckets reconciles a fresh search response with the buckets already on\n// the map. Buckets that left the view go, new ones come in, and a bucket that\n// is still there keeps its existing object so its marker does not re-render,\n// unless its statuses or price changed, in which case the fresh object wins and\n// the pin recolours or its capsule updates.\nexport function mergeBuckets(\n existing: GeohashItem[],\n incoming: GeohashItem[],\n): GeohashItem[] {\n const byKey = new Map(existing.map((bucket) => [bucket.key, bucket]));\n return incoming.map((bucket) => {\n const previous = byKey.get(bucket.key);\n return previous && sameStatuses(previous, bucket) && samePrice(previous, bucket)\n ? previous\n : bucket;\n });\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport Geohash from \"latlon-geohash\";\nimport CustomMarker from \"../CustomMarker/CustomMarker\";\nimport Pin, { PinStyles } from \"../Pin/Pin\";\nimport { GeohashItem } from \"../../types\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { mergeBuckets } from \"../../utils/buckets\";\nimport { pinPrice } from \"../../utils/pinState\";\nimport { formatEnergyPrice } from \"../../utils/price\";\nimport { atLeast } from \"../../utils/version\";\n\n// below this zoom a single v3 pin drops to a dot without a glyph\nconst compactBelowZoom = 12;\n\nconst geoHashZoom = [\n 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9,\n];\n\nfunction zoomToHashChars(zoom) {\n return geoHashZoom[zoom];\n}\n\nfunction getNormalizedBounds(bounds, zoomLevel) {\n const mapSWPoint = bounds.getSouthWest().toJSON();\n const mapNEPoint = bounds.getNorthEast().toJSON();\n\n const SWGeohash = Geohash.encode(mapSWPoint.lat, mapSWPoint.lng, zoomLevel);\n\n const geohashSWBounds = Geohash.bounds(SWGeohash);\n\n const latStep = Math.abs(geohashSWBounds.sw.lat - geohashSWBounds.ne.lat);\n const lngStep = Math.abs(geohashSWBounds.sw.lon - geohashSWBounds.ne.lon);\n\n let neLat = geohashSWBounds.sw.lat;\n while (neLat <= mapNEPoint.lat) {\n neLat = neLat + latStep;\n }\n\n let neLng = geohashSWBounds.sw.lon;\n while (neLng <= mapNEPoint.lng) {\n neLng = neLng + lngStep;\n }\n\n return {\n nwLat: neLat,\n nwLng: geohashSWBounds.sw.lon,\n seLat: geohashSWBounds.sw.lat,\n seLng: neLng,\n };\n}\n\nfunction isSameBounds(bounds1, bounds2) {\n return (\n bounds1.nwLat === bounds2.nwLat &&\n bounds1.nwLng === bounds2.nwLng &&\n bounds1.seLat === bounds2.seLat &&\n bounds1.seLng === bounds2.seLng\n );\n}\n\nexport default function MapMarkers({\n map,\n filters,\n fetchGeohashes,\n onMarkerClicked,\n}) {\n const {\n setIsSearching,\n setSearchBounds,\n mapKind,\n locationIds,\n options,\n language,\n t,\n } = useMapContext();\n const [data, setData] = useState<GeohashItem[]>([]);\n const [zoom, setZoom] = useState<number>(map.getZoom());\n\n const [mapConfig, setMapConfig] = useState({\n zoom: zoomToHashChars(map.getZoom()),\n normalizedBounds: getNormalizedBounds(\n map.getBounds(),\n zoomToHashChars(map.getZoom()),\n ),\n });\n\n useEffect(() => {\n let currentZoomLevel = mapConfig.zoom;\n let currentBounds = undefined;\n\n map.addListener(\"idle\", () => {\n setZoom(map.getZoom());\n const newZoomLevel = zoomToHashChars(map.getZoom());\n\n const newMapConfig = {\n ...mapConfig,\n zoom: newZoomLevel,\n };\n const bounds = getNormalizedBounds(map.getBounds(), currentZoomLevel);\n\n if (currentBounds && isSameBounds(currentBounds, bounds)) {\n return;\n }\n currentBounds = bounds;\n setMapConfig({\n ...newMapConfig,\n normalizedBounds: bounds,\n });\n });\n }, []);\n\n // reconcile the response with what is on the map: unchanged buckets keep\n // their object (no re-render), changed statuses take the fresh one (recolour)\n function appendData(newData) {\n setData(mergeBuckets(data, newData));\n }\n\n // publish the bounds so the analytics pill totals the same area as the pins\n useEffect(() => {\n if (!mapConfig.normalizedBounds) return;\n setSearchBounds?.(mapConfig.normalizedBounds);\n }, [mapConfig.normalizedBounds]);\n\n useEffect(() => {\n if (!mapConfig.normalizedBounds) return;\n let ignore = false;\n\n setIsSearching(true);\n fetchGeohashes({\n precision: mapConfig.zoom,\n bbox: mapConfig.normalizedBounds,\n ...filters,\n })\n .then(({ data }) => {\n if (ignore) return;\n appendData(data);\n setIsSearching(false);\n })\n .catch((e) => {\n // deal with error\n setIsSearching(false);\n });\n\n return () => {\n ignore = true;\n setIsSearching(false);\n };\n }, [mapConfig, filters, mapKind]);\n\n const _onMarkerClicked = useCallback(\n (data: GeohashItem) => {\n const ids = data.ids;\n if (ids.length == 100) {\n map.setZoom(map.getZoom() + 2);\n }\n map.panTo({ lat: data.centroid.lat, lng: data.centroid.lon });\n if (ids.length !== 100) {\n onMarkerClicked(ids);\n }\n },\n [map, onMarkerClicked],\n );\n\n // v3 draws the redesigned pins; earlier versions keep the round markers\n const modernPins = atLeast(options?.version, \"v3\");\n const isSelected = (item: GeohashItem) =>\n Boolean(locationIds?.length) &&\n item.ids.some((id) => locationIds.includes(id));\n\n if (!modernPins) {\n return (\n <>\n {data.filter(Boolean).map((item: GeohashItem) => (\n <CustomMarker\n map={map}\n key={item.key}\n data={item}\n kind={mapKind}\n onClick={_onMarkerClicked}\n />\n ))}\n </>\n );\n }\n\n return (\n <>\n <PinStyles />\n {data.filter(Boolean).map((item: GeohashItem) => {\n // a single location carries its price per kWh in a tag under the pin;\n // the pin itself reads it as unknown when there is none\n const price = formatEnergyPrice(language, pinPrice(item));\n return (\n <Pin\n map={map}\n key={item.key}\n data={item}\n kind={mapKind}\n selected={isSelected(item)}\n compact={zoom < compactBelowZoom}\n price={price}\n priceLabel={price && t(\"pin.pricePerKwh\", { price })}\n sitesLabel={t(\"pin.sites\")}\n onClick={_onMarkerClicked}\n />\n );\n })}\n </>\n );\n}\n","import React, { useEffect, useRef, useState } from \"react\";\n\nimport { useMapContext } from \"../../contexts/Map\";\n\nimport styles from \"./Map.module.css\";\nimport { getLoader } from \"../../utils/loader\";\n\nimport MapMarkers from \"../MapMarkers/MapMarkers\";\n\n/*\nconst gridParts = [];\n\nfunction eraseGrid() {\n for (var i = 0; i < gridParts.length; i++) {\n gridParts[i].setMap(null);\n }\n gridParts.length = 0;\n}\n\nconst defaults = {\n zoom: 3,\n maxDisplay: 2 * 10240,\n geohashPrecision: 12,\n};\n\n\nfunction drawGrid(map) {\n const level = zoomToHashChars(map.getZoom());\n console.log(level, map.getZoom());\n\n const bounds = map.getBounds();\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n const neHash = Geohash.encode(ne.lat(), ne.lng(), level);\n const nwHash = Geohash.encode(ne.lat(), sw.lng(), level);\n const swHash = Geohash.encode(sw.lat(), sw.lng(), level);\n const seHash = Geohash.encode(sw.lat(), ne.lng(), level);\n\n let current = neHash;\n let eastBound = neHash;\n let westBound = nwHash;\n let maxHash = defaults.maxDisplay;\n\n eraseGrid();\n while (maxHash-- > 0) {\n drawBox(map, current);\n do {\n current = Geohash.adjacent(current, \"w\");\n drawBox(map, current);\n } while (maxHash-- > 0 && current != westBound);\n if (current == swHash) {\n return;\n }\n westBound = Geohash.adjacent(current, \"s\");\n current = eastBound = Geohash.adjacent(eastBound, \"s\");\n }\n alert(\"defaults.maxDisplay limit reached\");\n eraseGrid();\n}\n\n\nfunction drawBox(map, hash) {\n const b = Geohash.bounds(hash);\n const gb = new google.maps.LatLngBounds(\n new google.maps.LatLng(b.sw.lat, b.sw.lon),\n new google.maps.LatLng(b.ne.lat, b.ne.lon)\n );\n const rect = new google.maps.Rectangle({\n map: map,\n bounds: gb,\n strokeColor: \"#3333AA\",\n strokeOpacity: 0.8,\n strokeWeight: 1,\n fillColor: \"#222222\",\n fillOpacity: 0.1,\n });\n const marker = new google.maps.Marker({\n map: map,\n position: gb.getCenter(),\n icon: \" \",\n });\n gridParts.push(rect);\n gridParts.push(marker);\n}\n*/\n\nexport default function MapWrapper() {\n const {\n place,\n options,\n fetchGeohashes,\n setLocationsIds,\n language,\n filters,\n position,\n } = useMapContext();\n\n const apiKey = options.googleApiKey;\n const [map, setMap] = useState<google.maps.Map>();\n\n const mapContainerRef = useRef(null);\n const loader = getLoader(apiKey, language);\n\n useEffect(() => {\n if (map && place?.geometry?.viewport) {\n map.fitBounds(place.geometry.viewport);\n }\n if (map && place?.geometry?.location) {\n /*\n const icon = {\n url: place.icon as string,\n size: new google.maps.Size(71, 71),\n origin: new google.maps.Point(0, 0),\n anchor: new google.maps.Point(17, 34),\n scaledSize: new google.maps.Size(25, 25),\n };\n const marker = new google.maps.Marker({\n map,\n icon,\n title: place.name,\n position: place.geometry.location,\n });\n setMarker(marker);\n */\n map.setCenter(place.geometry.location);\n }\n }, [map, place]);\n\n useEffect(() => {\n loader.importLibrary(\"maps\").then(({ Map }) => {\n const map = new Map(mapContainerRef.current, {\n mapId: \"ced50d4165f3a695\",\n center: position as any, // Initial map center coordinates\n zoom: options.zoomLevel ?? 12, // Initial zoom level,\n zoomControl: true,\n mapTypeControl: false,\n scaleControl: false,\n streetViewControl: false,\n rotateControl: false,\n fullscreenControl: false,\n controlSize: 32,\n clickableIcons: false,\n gestureHandling: options.gestureHandling || \"auto\",\n });\n map.addListener(\"idle\", () => {\n setMap(map);\n });\n return () => {\n console.log(\"unmounting\");\n };\n });\n }, [apiKey]);\n\n return (\n <div className={styles.container} ref={mapContainerRef}>\n {map && map.getBounds() && (\n <MapMarkers\n filters={filters}\n onMarkerClicked={(ids) => {\n setLocationsIds([...ids]);\n }}\n map={map}\n fetchGeohashes={fetchGeohashes}\n />\n )}\n </div>\n );\n}\n\n","import React from \"react\";\n\ninterface Props {\n color: string;\n size?: number;\n}\n\nexport const StatusDot: React.FC<Props> = ({ color, size = 10 }) => (\n <span\n style={{\n display: \"block\",\n width: size,\n height: size,\n borderRadius: size,\n background: color,\n }}\n />\n);\n\nexport default StatusDot;\n","import React, { CSSProperties, useEffect, useMemo, useState } from \"react\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport StatusDot from \"../StatusDot/StatusDot\";\nimport { Analytics, AnalyticsBucket, MapKind } from \"../../types\";\nimport { getStatusColor, getStatusLabelKey } from \"../../utils/status\";\nimport {\n isStatusFilterActive,\n toggleStatusFilter,\n withoutStatusFilter,\n} from \"../../utils/statusFilters\";\nimport { atLeast } from \"../../utils/version\";\n\n// Matches the breakpoint in router.module.css. Below it the controls span the\n// full width, so there is no room next to the filter toggle for the pills.\nconst desktopQuery = \"(min-width: 768px)\";\n\n// Geometry of the controls column in router.module.css: the column is 380px\n// wide with 20px padding, and the search row (search input plus filter toggle)\n// is 48px tall. The pill sits in that row, to the right of the toggle, with\n// the vocabulary switch under it when the map has two breakdowns.\nconst controlsColumnWidth = 380;\nconst edgePadding = 20;\nconst rowHeight = 48;\n\nfunction useIsDesktop() {\n const [isDesktop, setIsDesktop] = useState(\n () => window.matchMedia(desktopQuery).matches,\n );\n\n useEffect(() => {\n const media = window.matchMedia(desktopQuery);\n const onChange = (event: MediaQueryListEvent) =>\n setIsDesktop(event.matches);\n media.addEventListener(\"change\", onChange);\n return () => media.removeEventListener(\"change\", onChange);\n }, []);\n\n return isDesktop;\n}\n\n// Styles are inline rather than a CSS module: when the widget renders in a\n// shadow root it loads the published stylesheet, which does not carry classes\n// added since the last release.\nconst overlayStyle: CSSProperties = {\n position: \"absolute\",\n top: edgePadding,\n left: controlsColumnWidth,\n right: edgePadding,\n zIndex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 6,\n fontFamily: \"var(--roadmap-font-family, Inter), system-ui\",\n fontSize: 12,\n lineHeight: \"16px\",\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n transition: \"opacity 0.2s ease\",\n};\n\nconst pillStyle: CSSProperties = {\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 8,\n height: rowHeight,\n padding: \"0 12px\",\n background: \"var(--roadmap-background-color, #fff)\",\n border: \"1px solid var(--roadmap-border-color, #ddd)\",\n borderRadius: 10,\n whiteSpace: \"nowrap\",\n // the row around the pills lets map gestures through; the pills themselves\n // take clicks\n pointerEvents: \"auto\",\n};\n\n// the switch under the pill sits straight on the map, so the text is dark grey\n// with a white outline drawn by eight one-pixel shadows, which stays outside\n// the letters at this size where a text stroke would eat into them\nconst switchOutline = \"#fff\";\nconst switchInk = \"#3a3a3a\";\nconst switchTextShadow = [\n \"1px 0 0\",\n \"-1px 0 0\",\n \"0 1px 0\",\n \"0 -1px 0\",\n \"1px 1px 0\",\n \"-1px -1px 0\",\n \"1px -1px 0\",\n \"-1px 1px 0\",\n]\n .map((offset) => `${offset} ${switchOutline}`)\n .join(\", \");\n\nconst switchStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n paddingLeft: 12,\n fontSize: 11,\n fontWeight: 700,\n lineHeight: \"13px\",\n color: switchInk,\n textShadow: switchTextShadow,\n pointerEvents: \"auto\",\n};\n\n// the vocabulary not shown is a lighter grey under the same outline\nconst switchOptionStyle: CSSProperties = {\n padding: 0,\n border: 0,\n background: \"none\",\n font: \"inherit\",\n textShadow: \"inherit\",\n color: \"#8a8a8a\",\n cursor: \"pointer\",\n outline: \"none\",\n};\n\nconst switchActiveStyle: CSSProperties = {\n ...switchOptionStyle,\n color: switchInk,\n cursor: \"default\",\n};\n\n// border longhands only: React drops a longhand that disappears between\n// renders without re-applying a shorthand, which left a currentColor border\n// behind after a bucket was deselected\nconst bucketStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 6px\",\n borderWidth: 1,\n borderStyle: \"solid\",\n borderColor: \"transparent\",\n borderRadius: 6,\n background: \"none\",\n font: \"inherit\",\n color: \"inherit\",\n lineHeight: \"16px\",\n outline: \"none\",\n};\n\n// a bucket whose filter option is selected is outlined in the brand colour\nconst activeBucketStyle: CSSProperties = {\n ...bucketStyle,\n borderColor: \"var(--roadmap-brand-color, #ff3d00)\",\n color: \"var(--roadmap-brand-color, #ff3d00)\",\n};\n\nconst clickableBucketStyle: CSSProperties = {\n cursor: \"pointer\",\n};\n\nconst countStyle: CSSProperties = {\n fontSize: 13,\n fontWeight: 600,\n};\n\n// StatusPill renders one dot, count and label per status bucket. The server\n// already orders buckets by descending count.\n// With filterKind set, a bucket a filter option covers is a button that\n// toggles that option, exactly as its checkbox in the filters panel would.\n// Buckets without an option, and every bucket when filterKind is absent, are\n// display only.\nfunction StatusPill({\n buckets,\n format,\n kind,\n filterKind,\n}: {\n buckets: AnalyticsBucket[];\n format: Intl.NumberFormat;\n kind: MapKind;\n filterKind?: MapKind;\n}) {\n const { t, filters, setFilters, options } = useMapContext();\n const selected: string[] = filters?.status || [];\n\n const onToggle = (status: string) => {\n const next = toggleStatusFilter(filterKind, selected, status);\n if (!next || !setFilters) return;\n setFilters({ ...filters, status: next });\n };\n\n return (\n <div style={pillStyle}>\n {buckets.map((bucket) => {\n const clickable =\n Boolean(filterKind) &&\n toggleStatusFilter(filterKind, selected, bucket.name) !== undefined;\n const active =\n clickable && isStatusFilterActive(filterKind, selected, bucket.name);\n const content = (\n <>\n <StatusDot\n color={getStatusColor(bucket.name, kind, options?.version)}\n size={8}\n />\n <span style={countStyle}>{format.format(bucket.count)}</span>\n {t(getStatusLabelKey(bucket.name))}\n </>\n );\n\n if (!clickable) {\n return (\n <span key={bucket.name} style={bucketStyle}>\n {content}\n </span>\n );\n }\n\n return (\n <button\n key={bucket.name}\n type=\"button\"\n aria-pressed={active}\n style={{\n ...(active ? activeBucketStyle : bucketStyle),\n ...clickableBucketStyle,\n }}\n onClick={() => onToggle(bucket.name)}\n >\n {content}\n </button>\n );\n })}\n </div>\n );\n}\n\n// Vocabulary is which breakdown the pill shows: EVSEs by roaming status, or\n// connectors by the OCPP status the station reports.\ntype Vocabulary = \"roaming\" | \"ocpp\";\n\n// AnalyticsOverlay puts one status pill for the current view next to the\n// filter toggle. Roaming maps get EVSEs by roaming status. CPO maps also have\n// the connectors by OCPP status, and show that by default with a switch under\n// the pill to flip to the roaming view: a gap between what the charger says and\n// what roaming partners see is the signal an operator is after.\nexport default function AnalyticsOverlay() {\n const {\n t,\n language,\n options,\n filters,\n filterConfiguration,\n searchBounds,\n fetchAnalytics,\n mapKind,\n } = useMapContext();\n const [analytics, setAnalytics] = useState<Analytics>();\n const [isLoading, setIsLoading] = useState(false);\n const [vocabulary, setVocabulary] = useState<Vocabulary>(\"ocpp\");\n const isDesktop = useIsDesktop();\n\n const enabled =\n atLeast(options?.version, \"v2\") &&\n Boolean(filterConfiguration?.showAnalytics);\n\n // The pills are a facet control: they list every status in the view and\n // highlight the selected ones, so their counts ignore the status selection.\n // Keyed on content so a status toggle alone does not refetch.\n const analyticsFiltersKey = JSON.stringify(withoutStatusFilter(filters));\n const analyticsFilters = useMemo(\n () => JSON.parse(analyticsFiltersKey),\n [analyticsFiltersKey],\n );\n\n useEffect(() => {\n if (!enabled || !searchBounds || !fetchAnalytics) return;\n let ignore = false;\n\n setIsLoading(true);\n fetchAnalytics({ bbox: searchBounds, ...analyticsFilters })\n .then((response) => {\n if (ignore) return;\n setAnalytics(response?.data);\n })\n .catch(() => {\n // the endpoint is unavailable or the request failed: hide the pills\n // rather than show stale totals for a different view\n if (ignore) return;\n setAnalytics(undefined);\n })\n .finally(() => {\n if (ignore) return;\n setIsLoading(false);\n });\n\n return () => {\n ignore = true;\n };\n }, [enabled, searchBounds, analyticsFilters, mapKind]);\n\n const format = useMemo(() => new Intl.NumberFormat(language), [language]);\n\n if (!enabled || !isDesktop || !analytics) {\n return null;\n }\n\n const isCpo = mapKind === \"cpo\";\n const roamingBuckets = analytics.evses.byStatus || [];\n const ocppBuckets = isCpo ? analytics.connectors.byOcppStatus || [] : [];\n\n const available: Vocabulary[] = [];\n if (ocppBuckets.length > 0) available.push(\"ocpp\");\n if (roamingBuckets.length > 0) available.push(\"roaming\");\n if (available.length === 0) {\n return null;\n }\n\n // the chosen vocabulary can drop out of the view (a filter can empty one\n // breakdown), so the pill falls back to whatever is left without losing the\n // choice for when it returns\n const shown = available.includes(vocabulary) ? vocabulary : available[0];\n\n return (\n <div style={{ ...overlayStyle, opacity: isLoading ? 0.6 : 1 }}>\n {shown === \"ocpp\" ? (\n <StatusPill\n buckets={ocppBuckets}\n format={format}\n kind=\"cpo\"\n filterKind=\"cpo\"\n />\n ) : (\n // roaming statuses keep the roaming palette on every map kind. They\n // filter on roaming maps only: the CPO search filters on OCPP status,\n // so on a CPO map this pill is read-only.\n <StatusPill\n buckets={roamingBuckets}\n format={format}\n kind=\"roaming\"\n filterKind={isCpo ? undefined : \"roaming\"}\n />\n )}\n {available.length > 1 && (\n <div style={switchStyle} role=\"group\">\n {available.map((option, index) => (\n <React.Fragment key={option}>\n {index > 0 && <span aria-hidden=\"true\">|</span>}\n <button\n type=\"button\"\n aria-pressed={option === shown}\n style={option === shown ? switchActiveStyle : switchOptionStyle}\n onClick={() => setVocabulary(option)}\n >\n {t(\n option === \"ocpp\"\n ? \"analytics.evseStatus\"\n : \"analytics.roamingStatus\",\n )}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n </div>\n );\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<<anonymous>>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Checks if a given element has a CSS class.\n * \n * @param element the element\n * @param className the CSS class name\n */\nexport default function hasClass(element, className) {\n if (element.classList) return !!className && element.classList.contains(className);\n return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}","import hasClass from './hasClass';\n/**\n * Adds a CSS class to a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\nexport default function addClass(element, className) {\n if (element.classList) element.classList.add(className);else if (!hasClass(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}","function replaceClassName(origClass, classToRemove) {\n return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n/**\n * Removes a CSS class from a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\n\nexport default function removeClass(element, className) {\n if (element.classList) {\n element.classList.remove(className);\n } else if (typeof element.className === 'string') {\n element.className = replaceClassName(element.className, className);\n } else {\n element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n }\n}","export default {\n disabled: false\n};","import PropTypes from 'prop-types';\nexport var timeoutsShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.number, PropTypes.shape({\n enter: PropTypes.number,\n exit: PropTypes.number,\n appear: PropTypes.number\n}).isRequired]) : null;\nexport var classNamesShape = process.env.NODE_ENV !== 'production' ? PropTypes.oneOfType([PropTypes.string, PropTypes.shape({\n enter: PropTypes.string,\n exit: PropTypes.string,\n active: PropTypes.string\n}), PropTypes.shape({\n enter: PropTypes.string,\n enterDone: PropTypes.string,\n enterActive: PropTypes.string,\n exit: PropTypes.string,\n exitDone: PropTypes.string,\n exitActive: PropTypes.string\n})]) : null;","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n * transition: `opacity ${duration}ms ease-in-out`,\n * opacity: 0,\n * }\n *\n * const transitionStyles = {\n * entering: { opacity: 1 },\n * entered: { opacity: 1 },\n * exiting: { opacity: 0 },\n * exited: { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n * <Transition in={inProp} timeout={duration}>\n * {state => (\n * <div style={{\n * ...defaultStyle,\n * ...transitionStyles[state]\n * }}>\n * I'm a fade Transition!\n * </div>\n * )}\n * </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n * - `'entering'`\n * - `'entered'`\n * - `'exiting'`\n * - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n * <div>\n * <Transition in={inProp} timeout={500}>\n * {state => (\n * // ...\n * )}\n * </Transition>\n * <button onClick={() => setInProp(true)}>\n * Click to Enter\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n if (this.props.unmountOnExit || this.props.mountOnEnter) {\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n // To make the animation happen, we have to separate each rendering and avoid being processed as batched.\n\n if (node) forceReflow(node);\n }\n\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n React.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A React reference to DOM element that need to transition:\n * https://stackoverflow.com/a/51127130/4671932\n *\n * - When `nodeRef` prop is used, `node` is not passed to callback functions\n * (e.g. `onEnter`) because user already has direct access to the node.\n * - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n * `nodeRef` need to be provided to `Transition` with changed `key` prop\n * (see\n * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n */\n nodeRef: PropTypes.shape({\n current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n var value = propValue[key];\n return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n }\n }),\n\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * <Transition in={this.state.in} timeout={150}>\n * {state => (\n * <MyComponent className={`fade fade-${state}`} />\n * )}\n * </Transition>\n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * By default the child component does not perform the enter transition when\n * it first mounts, regardless of the value of `in`. If you want this\n * behavior, set both `appear` and `in` to `true`.\n *\n * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n * > only adds an additional enter transition. However, in the\n * > `<CSSTransition>` component that first enter transition does result in\n * > additional `.appear-*` classes, that way you can choose to style it\n * > differently.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. Timeouts are still used as a fallback if provided.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport addOneClass from 'dom-helpers/addClass';\nimport removeOneClass from 'dom-helpers/removeClass';\nimport React from 'react';\nimport Transition from './Transition';\nimport { classNamesShape } from './utils/PropTypes';\nimport { forceReflow } from './utils/reflow';\n\nvar _addClass = function addClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return addOneClass(node, c);\n });\n};\n\nvar removeClass = function removeClass(node, classes) {\n return node && classes && classes.split(' ').forEach(function (c) {\n return removeOneClass(node, c);\n });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n * const [inProp, setInProp] = useState(false);\n * return (\n * <div>\n * <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n * <div>\n * {\"I'll receive my-node-* classes\"}\n * </div>\n * </CSSTransition>\n * <button type=\"button\" onClick={() => setInProp(true)}>\n * Click to Enter\n * </button>\n * </div>\n * );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n * opacity: 0;\n * }\n * .my-node-enter-active {\n * opacity: 1;\n * transition: opacity 200ms;\n * }\n * .my-node-exit {\n * opacity: 1;\n * }\n * .my-node-exit-active {\n * opacity: 0;\n * transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(CSSTransition, _React$Component);\n\n function CSSTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.appliedClasses = {\n appear: {},\n enter: {},\n exit: {}\n };\n\n _this.onEnter = function (maybeNode, maybeAppearing) {\n var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n node = _this$resolveArgument[0],\n appearing = _this$resolveArgument[1];\n\n _this.removeClasses(node, 'exit');\n\n _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n if (_this.props.onEnter) {\n _this.props.onEnter(maybeNode, maybeAppearing);\n }\n };\n\n _this.onEntering = function (maybeNode, maybeAppearing) {\n var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n node = _this$resolveArgument2[0],\n appearing = _this$resolveArgument2[1];\n\n var type = appearing ? 'appear' : 'enter';\n\n _this.addClass(node, type, 'active');\n\n if (_this.props.onEntering) {\n _this.props.onEntering(maybeNode, maybeAppearing);\n }\n };\n\n _this.onEntered = function (maybeNode, maybeAppearing) {\n var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n node = _this$resolveArgument3[0],\n appearing = _this$resolveArgument3[1];\n\n var type = appearing ? 'appear' : 'enter';\n\n _this.removeClasses(node, type);\n\n _this.addClass(node, type, 'done');\n\n if (_this.props.onEntered) {\n _this.props.onEntered(maybeNode, maybeAppearing);\n }\n };\n\n _this.onExit = function (maybeNode) {\n var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n node = _this$resolveArgument4[0];\n\n _this.removeClasses(node, 'appear');\n\n _this.removeClasses(node, 'enter');\n\n _this.addClass(node, 'exit', 'base');\n\n if (_this.props.onExit) {\n _this.props.onExit(maybeNode);\n }\n };\n\n _this.onExiting = function (maybeNode) {\n var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n node = _this$resolveArgument5[0];\n\n _this.addClass(node, 'exit', 'active');\n\n if (_this.props.onExiting) {\n _this.props.onExiting(maybeNode);\n }\n };\n\n _this.onExited = function (maybeNode) {\n var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n node = _this$resolveArgument6[0];\n\n _this.removeClasses(node, 'exit');\n\n _this.addClass(node, 'exit', 'done');\n\n if (_this.props.onExited) {\n _this.props.onExited(maybeNode);\n }\n };\n\n _this.resolveArguments = function (maybeNode, maybeAppearing) {\n return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n : [maybeNode, maybeAppearing];\n };\n\n _this.getClassNames = function (type) {\n var classNames = _this.props.classNames;\n var isStringClassNames = typeof classNames === 'string';\n var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n return {\n baseClassName: baseClassName,\n activeClassName: activeClassName,\n doneClassName: doneClassName\n };\n };\n\n return _this;\n }\n\n var _proto = CSSTransition.prototype;\n\n _proto.addClass = function addClass(node, type, phase) {\n var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n var _this$getClassNames = this.getClassNames('enter'),\n doneClassName = _this$getClassNames.doneClassName;\n\n if (type === 'appear' && phase === 'done' && doneClassName) {\n className += \" \" + doneClassName;\n } // This is to force a repaint,\n // which is necessary in order to transition styles when adding a class name.\n\n\n if (phase === 'active') {\n if (node) forceReflow(node);\n }\n\n if (className) {\n this.appliedClasses[type][phase] = className;\n\n _addClass(node, className);\n }\n };\n\n _proto.removeClasses = function removeClasses(node, type) {\n var _this$appliedClasses$ = this.appliedClasses[type],\n baseClassName = _this$appliedClasses$.base,\n activeClassName = _this$appliedClasses$.active,\n doneClassName = _this$appliedClasses$.done;\n this.appliedClasses[type] = {};\n\n if (baseClassName) {\n removeClass(node, baseClassName);\n }\n\n if (activeClassName) {\n removeClass(node, activeClassName);\n }\n\n if (doneClassName) {\n removeClass(node, doneClassName);\n }\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n _ = _this$props.classNames,\n props = _objectWithoutPropertiesLoose(_this$props, [\"classNames\"]);\n\n return /*#__PURE__*/React.createElement(Transition, _extends({}, props, {\n onEnter: this.onEnter,\n onEntered: this.onEntered,\n onEntering: this.onEntering,\n onExit: this.onExit,\n onExiting: this.onExiting,\n onExited: this.onExited\n }));\n };\n\n return CSSTransition;\n}(React.Component);\n\nCSSTransition.defaultProps = {\n classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, Transition.propTypes, {\n /**\n * The animation classNames applied to the component as it appears, enters,\n * exits or has finished the transition. A single name can be provided, which\n * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n *\n * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n *\n * A few details to note about how these classes are applied:\n *\n * 1. They are _joined_ with the ones that are already defined on the child\n * component, so if you want to add some base styles, you can use\n * `className` without worrying that it will be overridden.\n *\n * 2. If the transition component mounts with `in={false}`, no classes are\n * applied yet. You might be expecting `*-exit-done`, but if you think\n * about it, a component cannot finish exiting if it hasn't entered yet.\n *\n * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n * allows you to define different behavior for when appearing is done and\n * when regular entering is done, using selectors like\n * `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n * an epic entrance animation when element first appears in the DOM using\n * [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n * simply use `fade-enter-done` for defining both cases.\n *\n * Each individual classNames can also be specified independently like:\n *\n * ```js\n * classNames={{\n * appear: 'my-appear',\n * appearActive: 'my-active-appear',\n * appearDone: 'my-done-appear',\n * enter: 'my-enter',\n * enterActive: 'my-active-enter',\n * enterDone: 'my-done-enter',\n * exit: 'my-exit',\n * exitActive: 'my-active-exit',\n * exitDone: 'my-done-exit',\n * }}\n * ```\n *\n * If you want to set these classes using CSS Modules:\n *\n * ```js\n * import styles from './styles.css';\n * ```\n *\n * you might want to use camelCase in your CSS file, that way could simply\n * spread them instead of listing them one by one:\n *\n * ```js\n * classNames={{ ...styles }}\n * ```\n *\n * @type {string | {\n * appear?: string,\n * appearActive?: string,\n * appearDone?: string,\n * enter?: string,\n * enterActive?: string,\n * enterDone?: string,\n * exit?: string,\n * exitActive?: string,\n * exitDone?: string,\n * }}\n */\n classNames: classNamesShape,\n\n /**\n * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n * applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEnter: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'enter-active' or\n * 'appear-active' class is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'enter' or\n * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntered: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'exit' class is\n * applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement)\n */\n onExit: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement)\n */\n onExiting: PropTypes.func,\n\n /**\n * A `<Transition>` callback fired immediately after the 'exit' classes\n * are **removed** and the `exit-done` class is added to the DOM node.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement)\n */\n onExited: PropTypes.func\n}) : {};\nexport default CSSTransition;","import _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\n\nvar _leaveRenders, _enterRenders;\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { ENTERED, ENTERING, EXITING } from './Transition';\nimport TransitionGroupContext from './TransitionGroupContext';\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n if (oldChildren === newChildren) return false;\n\n if (React.isValidElement(oldChildren) && React.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n return false;\n }\n\n return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nexport var modes = {\n out: 'out-in',\n in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n return function () {\n var _element$props;\n\n element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n cb();\n };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n var current = _ref.current,\n changeState = _ref.changeState;\n return React.cloneElement(current, {\n in: false,\n onExited: callHook(current, 'onExited', function () {\n changeState(ENTERING, null);\n })\n });\n}, _leaveRenders[modes.in] = function (_ref2) {\n var current = _ref2.current,\n changeState = _ref2.changeState,\n children = _ref2.children;\n return [current, React.cloneElement(children, {\n in: true,\n onEntered: callHook(children, 'onEntered', function () {\n changeState(ENTERING);\n })\n })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n var children = _ref3.children,\n changeState = _ref3.changeState;\n return React.cloneElement(children, {\n in: true,\n onEntered: callHook(children, 'onEntered', function () {\n changeState(ENTERED, React.cloneElement(children, {\n in: true\n }));\n })\n });\n}, _enterRenders[modes.in] = function (_ref4) {\n var current = _ref4.current,\n children = _ref4.children,\n changeState = _ref4.changeState;\n return [React.cloneElement(current, {\n in: false,\n onExited: callHook(current, 'onExited', function () {\n changeState(ENTERED, React.cloneElement(children, {\n in: true\n }));\n })\n }), React.cloneElement(children, {\n in: true\n })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n * const [state, setState] = useState(false);\n * return (\n * <SwitchTransition>\n * <CSSTransition\n * key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n * addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n * classNames='fade'\n * >\n * <button onClick={() => setState(state => !state)}>\n * {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n * </button>\n * </CSSTransition>\n * </SwitchTransition>\n * );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n * opacity: 0;\n * }\n * .fade-exit{\n * opacity: 1;\n * }\n * .fade-enter-active{\n * opacity: 1;\n * }\n * .fade-exit-active{\n * opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n * transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(SwitchTransition, _React$Component);\n\n function SwitchTransition() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.state = {\n status: ENTERED,\n current: null\n };\n _this.appeared = false;\n\n _this.changeState = function (status, current) {\n if (current === void 0) {\n current = _this.state.current;\n }\n\n _this.setState({\n status: status,\n current: current\n });\n };\n\n return _this;\n }\n\n var _proto = SwitchTransition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.appeared = true;\n };\n\n SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n if (props.children == null) {\n return {\n current: null\n };\n }\n\n if (state.status === ENTERING && props.mode === modes.in) {\n return {\n status: ENTERING\n };\n }\n\n if (state.current && areChildrenDifferent(state.current, props.children)) {\n return {\n status: EXITING\n };\n }\n\n return {\n current: React.cloneElement(props.children, {\n in: true\n })\n };\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n children = _this$props.children,\n mode = _this$props.mode,\n _this$state = this.state,\n status = _this$state.status,\n current = _this$state.current;\n var data = {\n children: children,\n current: current,\n changeState: this.changeState,\n status: status\n };\n var component;\n\n switch (status) {\n case ENTERING:\n component = enterRenders[mode](data);\n break;\n\n case EXITING:\n component = leaveRenders[mode](data);\n break;\n\n case ENTERED:\n component = current;\n }\n\n return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n value: {\n isMounting: !this.appeared\n }\n }, component);\n };\n\n return SwitchTransition;\n}(React.Component);\n\nSwitchTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * Transition modes.\n * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n *\n * @type {'out-in'|'in-out'}\n */\n mode: PropTypes.oneOf([modes.in, modes.out]),\n\n /**\n * Any `Transition` or `CSSTransition` component.\n */\n children: PropTypes.oneOfType([PropTypes.element.isRequired])\n} : {};\nSwitchTransition.defaultProps = {\n mode: modes.out\n};\nexport default SwitchTransition;","import React from \"react\";\n\nimport styles from \"./stack.module.css\";\n\nexport default function StackView({ name, children }) {\n return <div className={styles.stack}>{children}</div>;\n}\n","import React, {\n createRef,\n useEffect,\n useState,\n createContext,\n useMemo,\n} from \"react\";\nimport { SwitchTransition, CSSTransition } from \"react-transition-group\";\nimport View from \"./View\";\n\nimport styles from \"./stack.module.css\";\n\ntype StackProps = {\n name?: string;\n currentView: string;\n onViewChange: (view: string, args: any) => void;\n children: React.ReactNode;\n};\n\ntype MapContextType = {\n setView: (view: string, args?: any) => void;\n current: {\n name: string;\n args?: any;\n };\n};\n\nexport const StackContext = createContext<MapContextType>({\n setView: () => {},\n current: {\n name: \"none\",\n },\n});\n\nexport function useStackContext() {\n return React.useContext(StackContext);\n}\n\nexport default function Stack({\n name,\n currentView,\n onViewChange,\n children,\n}: StackProps) {\n const elements = {\n none: {\n name: \"none\",\n ref: createRef(),\n view: null,\n },\n };\n\n React.Children.forEach(children, (element) => {\n if (!React.isValidElement(element)) return;\n const { name } = element.props as any;\n if (!name) {\n throw new Error(\"name is required for Stack.View\");\n }\n elements[name] = {\n name: name,\n ref: createRef(),\n view: element,\n };\n });\n\n const [currentRef, setCurrentRef] = useState(elements[currentView].ref);\n\n useEffect(() => {\n setCurrentRef(elements[currentView].ref);\n }, [currentView]);\n\n const { view: View } = elements[currentView];\n\n const [args, setArgs] = useState<any>({});\n\n const contextValue = useMemo(() => {\n return {\n current: {\n name: currentView,\n args: args,\n },\n setView: (view, opt) => {\n setArgs(opt);\n onViewChange(view, opt);\n },\n };\n }, [currentView, onViewChange, args, setArgs]);\n\n return (\n <StackContext.Provider value={contextValue}>\n <SwitchTransition mode=\"out-in\">\n <CSSTransition\n classNames={{\n enter: styles.slideEnter,\n enterActive: styles.slideEnterActive,\n enterDone: styles.slideEnterDone,\n exit: styles.slideExit,\n exitActive: styles.slideExitActive,\n exitDone: styles.slideExitDone,\n }}\n mountOnEnter\n unmountOnExit\n timeout={300}\n key={currentView}\n nodeRef={currentRef}\n addEndListener={(done) => {\n currentRef.current.addEventListener(\"transitionend\", done, false);\n }}\n >\n <div className={styles.stack} ref={currentRef}>\n {View}\n </div>\n </CSSTransition>\n </SwitchTransition>\n </StackContext.Provider>\n );\n}\n\nStack.View = View;\n","import React, { useState, useRef, useEffect, useContext } from \"react\";\nimport { getLoader } from \"../../utils/loader\";\nimport { useMapContext } from \"../../contexts/Map\";\n\nimport styles from \"./SearchInput.module.css\";\n\nexport default function SearchInput({ onFocus }) {\n const { options, setPlace, t, language } = useMapContext();\n const apiKey = options.googleApiKey;\n\n const inputRef = useRef(null);\n\n const loader = getLoader(apiKey, language);\n\n useEffect(() => {\n if (!inputRef.current) return;\n loader.importLibrary(\"places\").then((places) => {\n const autocomplete = new places.Autocomplete(inputRef.current, {\n fields: [\"geometry\"],\n });\n autocomplete.addListener(\"place_changed\", () => {\n const place = autocomplete.getPlace();\n setPlace(place);\n });\n });\n }, [inputRef]);\n\n // Doc for styling the autocomplete\n // https://developers.google.com/maps/documentation/javascript/place-autocomplete#style-autocomplete\n return (\n <div className={styles.container}>\n <input\n onFocus={onFocus}\n ref={inputRef}\n className={styles.searchInput}\n type=\"text\"\n placeholder={t(\"search.placeholder\")}\n />\n </div>\n );\n}\n\n","import React, { useEffect } from \"react\";\n\nimport styles from \"./Checkbox.module.css\";\n\ntype CheckboxToggleProps = {\n id?: string;\n checked: boolean;\n name?: string;\n onChange: (value: boolean) => void;\n type?: \"checkbox\" | \"radio\";\n};\n\nexport default function CheckboxToggle({\n id,\n name,\n checked,\n onChange,\n type = \"checkbox\",\n}: CheckboxToggleProps) {\n const [isChecked, setIsChecked] = React.useState(checked || false);\n\n const onChangeCallback = React.useCallback(\n (e) => {\n setIsChecked(e.target.checked);\n onChange(e.target.checked);\n },\n [onChange],\n );\n\n useEffect(() => {\n setIsChecked(checked);\n }, [checked]);\n\n return (\n <div className={styles.container}>\n <input\n name={name}\n id={id}\n type={type}\n value={isChecked as any}\n checked={isChecked as any}\n onChange={onChangeCallback}\n />\n <span className={styles.box}>\n <svg\n className=\"checkmark\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n </span>\n </div>\n );\n}\n","import React, { CSSProperties } from \"react\";\n\nimport styles from \"./Range.module.css\";\n\nexport default function Range({ ticks, value, onChange }) {\n const inputRef = React.useRef(null);\n\n const convertValue = ticks.findIndex((tick) => tick.value === value);\n\n const bgSize = (convertValue / (ticks.length - 1)) * 100;\n\n return (\n <div className={styles.container}>\n <input\n value={convertValue}\n onChange={(e) => {\n onChange(ticks[e.target.value].value);\n }}\n ref={inputRef}\n className={styles.input}\n type=\"range\"\n list=\"tickmarks\"\n step=\"1\"\n min=\"0\"\n max={ticks.length - 1}\n style={{ \"--roadmap-range-bgize\": `${bgSize}%` } as CSSProperties}\n />\n\n <div className={styles.ticksContainer}>\n {ticks.map((tick, i) => {\n return (\n <div\n onClick={(e) => {\n onChange(ticks[i].value);\n }}\n key={tick.label}\n className={styles.tick}\n >\n {tick.label}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n","import React, { useState, useMemo, useRef, useEffect } from \"react\";\nimport styles from \"./MultiSelect.module.css\";\n\nexport interface MultiSelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface MultiSelectProps {\n id?: string;\n name?: string;\n options: MultiSelectOption[];\n value?: (string | number)[];\n preferredValues?: (string | number)[];\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n onChange?: (values: (string | number)[]) => void;\n}\n\nconst MultiSelect: React.FC<MultiSelectProps> = ({\n id,\n name,\n options,\n value = [],\n preferredValues = [],\n placeholder = \"Select...\",\n disabled = false,\n className,\n onChange,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const inputRef = useRef<HTMLInputElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const preferredSet = useMemo(\n () => new Set(preferredValues),\n [preferredValues],\n );\n\n const { preferred, others } = useMemo(() => {\n const q = inputValue.toLowerCase();\n const filtered = options.filter((o) => o.label.toLowerCase().includes(q));\n return {\n preferred: filtered.filter((o) => preferredSet.has(o.value)),\n others: filtered.filter((o) => !preferredSet.has(o.value)),\n };\n }, [options, inputValue, preferredSet]);\n\n const flatItems = useMemo(() => [...preferred, ...others], [preferred, others]);\n\n const selectedOptions = useMemo(\n () => options.filter((o) => value.includes(o.value)),\n [options, value],\n );\n\n useEffect(() => {\n if (highlightedIndex >= flatItems.length) {\n setHighlightedIndex(flatItems.length > 0 ? 0 : -1);\n }\n }, [flatItems, highlightedIndex]);\n\n const openMenu = () => {\n if (disabled) return;\n setIsOpen(true);\n if (highlightedIndex < 0 && flatItems.length > 0) setHighlightedIndex(0);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n setInputValue(\"\");\n setHighlightedIndex(-1);\n };\n\n const selectItem = (item: MultiSelectOption) => {\n if (item.disabled) return;\n const next = value.includes(item.value)\n ? value.filter((v) => v !== item.value)\n : [...value, item.value];\n onChange?.(next);\n setInputValue(\"\");\n setIsOpen(true);\n inputRef.current?.focus();\n };\n\n const removeValue = (v: string | number) => {\n onChange?.(value.filter((x) => x !== v));\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n switch (e.key) {\n case \"Backspace\":\n if (inputValue === \"\" && value.length > 0) {\n e.preventDefault();\n onChange?.(value.slice(0, -1));\n }\n return;\n case \"ArrowDown\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n if (flatItems.length > 0) setHighlightedIndex(0);\n } else if (flatItems.length > 0) {\n setHighlightedIndex((i) => (i + 1) % flatItems.length);\n }\n return;\n case \"ArrowUp\":\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n if (flatItems.length > 0)\n setHighlightedIndex(flatItems.length - 1);\n } else if (flatItems.length > 0) {\n setHighlightedIndex(\n (i) => (i <= 0 ? flatItems.length : i) - 1,\n );\n }\n return;\n case \"Enter\":\n if (isOpen && highlightedIndex >= 0 && flatItems[highlightedIndex]) {\n e.preventDefault();\n selectItem(flatItems[highlightedIndex]);\n }\n return;\n case \"Escape\":\n if (isOpen) {\n e.preventDefault();\n closeMenu();\n }\n return;\n case \"Home\":\n if (isOpen && flatItems.length > 0) {\n e.preventDefault();\n setHighlightedIndex(0);\n }\n return;\n case \"End\":\n if (isOpen && flatItems.length > 0) {\n e.preventDefault();\n setHighlightedIndex(flatItems.length - 1);\n }\n return;\n default:\n return;\n }\n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const next = e.relatedTarget as Node | null;\n if (next && containerRef.current?.contains(next)) return;\n closeMenu();\n };\n\n const toggleDropdown = () => {\n if (disabled) return;\n if (isOpen) {\n setIsOpen(false);\n } else {\n openMenu();\n }\n inputRef.current?.focus();\n };\n\n const renderOption = (option: MultiSelectOption, idx: number, isLast: boolean) => {\n const selected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={`${styles.option} ${\n highlightedIndex === idx ? styles.optionFocused : \"\"\n } ${selected ? styles.optionSelected : \"\"} ${\n option.disabled ? styles.optionDisabled : \"\"\n } ${isLast ? styles.optionLast : \"\"}`}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={option.disabled || undefined}\n onMouseDown={(e) => e.preventDefault()}\n onMouseMove={() => {\n if (highlightedIndex !== idx) setHighlightedIndex(idx);\n }}\n onClick={() => selectItem(option)}\n >\n <span className={styles.optionLabel}>{option.label}</span>\n {selected && (\n <svg\n className={styles.optionCheck}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )}\n </div>\n );\n };\n\n return (\n <div\n ref={containerRef}\n className={`${styles.multiSelect} ${className ?? \"\"}`}\n >\n <div className={`${styles.control} ${disabled ? styles.disabled : \"\"}`}>\n <div\n className={styles.valueContainer}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) {\n e.preventDefault();\n inputRef.current?.focus();\n openMenu();\n }\n }}\n >\n {selectedOptions.map((option) => (\n <div key={option.value} className={styles.multiValue}>\n <span className={styles.multiValueLabel}>{option.label}</span>\n <button\n type=\"button\"\n className={styles.multiValueRemove}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => removeValue(option.value)}\n disabled={disabled}\n aria-label={`Remove ${option.label}`}\n >\n ×\n </button>\n </div>\n ))}\n <input\n ref={inputRef}\n id={id}\n name={name}\n className={styles.input}\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n setIsOpen(true);\n setHighlightedIndex(0);\n }}\n onKeyDown={handleInputKeyDown}\n onFocus={openMenu}\n onBlur={handleInputBlur}\n placeholder={selectedOptions.length === 0 ? placeholder : \"\"}\n disabled={disabled}\n autoComplete=\"off\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-autocomplete=\"list\"\n />\n </div>\n <button\n type=\"button\"\n className={styles.dropdownIndicator}\n onMouseDown={(e) => e.preventDefault()}\n onClick={toggleDropdown}\n disabled={disabled}\n aria-label=\"Toggle menu\"\n tabIndex={-1}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n </button>\n </div>\n\n {isOpen && (\n <div className={`${styles.menu} ${styles.menuOpen}`} role=\"listbox\">\n <div className={styles.menuList}>\n {preferred.length > 0 && (\n <>\n <div className={styles.groupHeading}>Preferred</div>\n {preferred.map((option, i) =>\n renderOption(\n option,\n i,\n i === preferred.length - 1 && others.length === 0,\n ),\n )}\n </>\n )}\n {others.length > 0 && (\n <>\n {preferred.length > 0 && (\n <>\n <div className={styles.groupSeparator} />\n <div className={styles.groupHeading}>All</div>\n </>\n )}\n {others.map((option, i) =>\n renderOption(\n option,\n preferred.length + i,\n i === others.length - 1,\n ),\n )}\n </>\n )}\n {preferred.length === 0 && others.length === 0 && (\n <div className={styles.noOptions}>No options found</div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default MultiSelect;\n","import React from \"react\";\nimport styles from \"./SelectField.module.css\";\n\nexport interface SelectFieldOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectFieldProps {\n id?: string;\n name?: string;\n value?: string | number;\n options: SelectFieldOption[];\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n onChange?: (value: string | number) => void;\n onBlur?: (event: React.FocusEvent<HTMLSelectElement>) => void;\n onFocus?: (event: React.FocusEvent<HTMLSelectElement>) => void;\n}\n\nconst SelectField: React.FC<SelectFieldProps> = ({\n id,\n name,\n value,\n options = [],\n placeholder = \"Select an option\",\n disabled = false,\n className = \"\",\n onChange,\n onBlur,\n onFocus,\n}) => {\n const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n const selectedValue = event.target.value;\n const option = options.find(\n (opt) => opt.value.toString() === selectedValue\n );\n\n if (option && onChange) {\n onChange(option.value);\n }\n };\n\n return (\n <div className={`${styles.selectField} ${className}`}>\n <select\n id={id}\n name={name}\n value={value || \"\"}\n disabled={disabled}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n className={styles.select}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option, i) => (\n <option key={`${i}`} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\nexport default SelectField;\n\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M353.286,163.919c16.464,0,29.815,13.351,29.815,29.822%20c0,16.467-13.351,29.819-29.815,29.819c-16.47,0-29.822-13.352-29.822-29.819C323.464,177.27,336.816,163.919,353.286,163.919%20L353.286,163.919z%20M245.838,163.919c16.47,0,29.822,13.351,29.822,29.822c0,16.467-13.352,29.819-29.822,29.819%20c-16.471,0-29.822-13.352-29.822-29.819C216.016,177.27,229.367,163.919,245.838,163.919L245.838,163.919z%20M354.093,338.178%20c22.575,0,40.874,18.299,40.874,40.87c0,22.571-18.299,40.87-40.874,40.87c-22.568,0-40.867-18.299-40.867-40.87%20C313.226,356.477,331.525,338.178,354.093,338.178L354.093,338.178z%20M245.024,338.178c22.575,0,40.874,18.299,40.874,40.87%20c0,22.571-18.299,40.87-40.874,40.87c-22.568,0-40.874-18.299-40.874-40.87C204.151,356.477,222.457,338.178,245.024,338.178%20L245.024,338.178z%20M406.906,244.769c22.575,0,40.874,18.299,40.874,40.87s-18.299,40.87-40.874,40.87%20c-22.568,0-40.867-18.299-40.867-40.87S384.338,244.769,406.906,244.769L406.906,244.769z%20M192.211,244.769%20c22.568,0,40.874,18.299,40.874,40.87s-18.306,40.87-40.874,40.87c-22.575,0-40.874-18.299-40.874-40.87%20S169.636,244.769,192.211,244.769L192.211,244.769z%20M299.559,244.769c22.575,0,40.874,18.299,40.874,40.87%20s-18.299,40.87-40.874,40.87c-22.569,0-40.868-18.299-40.868-40.87S276.99,244.769,299.559,244.769L299.559,244.769z%20M452.99,131.334H146.127c-32.625,37.291-50.332,84.551-50.332,134.107c0,112.541,91.226,203.765,203.764,203.765%20c112.544,0,203.764-91.223,203.764-203.765C503.323,215.889,485.608,168.622,452.99,131.334L452.99,131.334z%20M471.276,105.109%20l-4.672-4.998h-334.09l-4.672,4.998c-40.739,43.6-63.267,100.662-63.267,160.332c0,129.775,105.21,234.988,234.984,234.988%20c129.774,0,234.984-105.213,234.984-234.988C534.542,205.771,512.015,148.709,471.276,105.109L471.276,105.109z%20M480.204,60.027%20H118.914C61.952,110.158,26,183.596,26,265.441C26,416.523,148.48,539,299.559,539c151.085,0,273.558-122.477,273.558-273.559%20C573.117,183.596,537.165,110.158,480.204,60.027z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M228.887,396.793c20.779,0,37.62,16.841,37.62,37.617%20c0,20.773-16.841,37.617-37.62,37.617c-20.773,0-37.613-16.844-37.613-37.617C191.274,413.634,208.115,396.793,228.887,396.793%20L228.887,396.793z%20M366.03,396.793c20.773,0,37.614,16.841,37.614,37.617c0,20.773-16.841,37.617-37.614,37.617%20c-20.779,0-37.62-16.844-37.62-37.617C328.41,413.634,345.251,396.793,366.03,396.793L366.03,396.793z%20M228.375,325.684%20c-29.03,0-55.41,11.868-74.52,30.976c-41.566,41.573-41.566,113.923,0,155.497c19.111,19.111,45.49,30.979,74.52,30.979h138.168%20c29.023,0,55.41-11.868,74.521-30.979c41.565-41.566,41.565-113.928,0-155.497c-18.336-18.336-43.379-30.003-71.019-30.916%20c63.723-27.868,105.151-90.836,105.151-160.733c0-42.14-13.276-74.632-37.316-108.359H161.794%20c-24.033,33.747-37.309,66.2-37.309,108.359c0,69.852,41.359,132.758,105.012,160.674H228.375L228.375,325.684z%20M366.543,357.791%20H228.375c-20.163,0-38.513,8.265-51.824,21.569c-29.023,29.027-29.023,81.069,0,110.096c13.311,13.308,31.654,21.569,51.824,21.569%20h138.168c20.17,0,38.513-8.261,51.824-21.569c29.023-29.027,29.023-81.069,0-110.096%20C405.056,366.057,386.706,357.791,366.543,357.791L366.543,357.791z%20M421.17,88.762c14.523,23.018,21.915,49.024,21.915,76.248%20c0,79.121-64.131,143.245-143.248,143.245S156.595,244.127,156.595,165.01c0-27.234,7.392-53.222,21.915-76.248H421.17%20L421.17,88.762z%20M331.075,225.95c11.726,0,21.236,9.511,21.236,21.236c0,11.733-9.511,21.24-21.236,21.24%20c-11.733,0-21.236-9.507-21.236-21.24C309.839,235.461,319.342,225.95,331.075,225.95L331.075,225.95z%20M268.605,225.95%20c11.726,0,21.243,9.511,21.243,21.236c0,11.733-9.518,21.24-21.243,21.24c-11.726,0-21.236-9.507-21.236-21.24%20C247.369,235.461,256.879,225.95,268.605,225.95L268.605,225.95z%20M236.882,163.754c11.726,0,21.243,9.508,21.243,21.236%20c0,11.729-9.518,21.24-21.243,21.24c-11.726,0-21.236-9.511-21.236-21.24C215.646,173.261,225.156,163.754,236.882,163.754%20L236.882,163.754z%20M299.837,163.754c11.732,0,21.243,9.508,21.243,21.236c0,11.729-9.511,21.24-21.243,21.24%20c-11.726,0-21.236-9.511-21.236-21.24C278.6,173.261,288.111,163.754,299.837,163.754L299.837,163.754z%20M362.798,163.754%20c11.726,0,21.236,9.508,21.236,21.236c0,11.729-9.511,21.24-21.236,21.24c-11.733,0-21.236-9.511-21.236-21.24%20C341.562,173.261,351.065,163.754,362.798,163.754L362.798,163.754z%20M332.079,116.228c6.86,0,12.417,5.561,12.417,12.417%20c0,6.86-5.558,12.425-12.417,12.425s-12.424-5.566-12.424-12.425C319.654,121.79,325.219,116.228,332.079,116.228L332.079,116.228z%20M267.601,116.228c6.86,0,12.425,5.561,12.425,12.417c0,6.86-5.565,12.425-12.425,12.425c-6.86,0-12.417-5.566-12.417-12.425%20C255.184,121.79,260.742,116.228,267.601,116.228L267.601,116.228z%20M177.153,7.87C129.219,7.87,90,47.086,90,95.02v408.83%20c0,47.934,39.219,87.15,87.153,87.15h246.024c47.934,0,87.147-39.216,87.147-87.15V95.02c0-47.934-39.213-87.15-87.147-87.15%20H177.153z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M407.111,334.214c16.317,0,29.543,13.226,29.543,29.543%20c0,16.313-13.227,29.543-29.543,29.543c-16.31,0-29.536-13.229-29.536-29.543C377.576,347.44,390.802,334.214,407.111,334.214%20L407.111,334.214z%20M198.69,334.214c16.317,0,29.543,13.226,29.543,29.543c0,16.313-13.226,29.543-29.543,29.543%20s-29.543-13.229-29.543-29.543C169.147,347.44,182.373,334.214,198.69,334.214L198.69,334.214z%20M227.94,180.772%20c24.971,0,45.213,20.242,45.213,45.213c0,24.967-20.243,45.213-45.213,45.213s-45.213-20.245-45.213-45.213%20C182.727,201.014,202.969,180.772,227.94,180.772L227.94,180.772z%20M377.868,180.772c24.968,0,45.213,20.242,45.213,45.213%20c0,24.967-20.245,45.213-45.213,45.213c-24.974,0-45.213-20.245-45.213-45.213C332.655,201.014,352.894,180.772,377.868,180.772%20L377.868,180.772z%20M302.899,361.142c24.974,0,45.22,20.243,45.22,45.213s-20.245,45.213-45.22,45.213%20c-24.968,0-45.21-20.243-45.21-45.213S277.931,361.142,302.899,361.142L302.899,361.142z%20M302.899,100.142%20c-111.485,0-201.855,90.37-201.855,201.858c0,111.489,90.37,201.859,201.855,201.859c111.491,0,201.865-90.37,201.865-201.859%20C504.764,190.512,414.391,100.142,302.899,100.142L302.899,100.142z%20M302.899,69.21C174.338,69.21,70.113,173.44,70.113,302%20c0,128.561,104.226,232.79,232.787,232.79c128.56,0,232.793-104.229,232.793-232.79C535.692,173.44,431.459,69.21,302.899,69.21%20L302.899,69.21z%20M302.899,31C153.234,31,31.902,152.328,31.902,302c0,149.669,121.331,271,270.997,271%20c149.672,0,271.006-121.331,271.006-271C573.906,152.328,452.571,31,302.899,31z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M246.063,132.777c18.959,0,34.335,15.373,34.335,34.332%20c0,18.965-15.376,34.335-34.335,34.335c-18.961,0-34.332-15.37-34.332-34.335C211.731,148.15,227.102,132.777,246.063,132.777%20L246.063,132.777z%20M357.555,132.777c18.962,0,34.332,15.373,34.332,34.332c0,18.962-15.37,34.335-34.332,34.335%20c-18.961,0-34.331-15.373-34.331-34.335C323.224,148.15,338.594,132.777,357.555,132.777L357.555,132.777z%20M226.875,253.708%20c9.286,0,16.811,7.525,16.811,16.808c0,9.286-7.525,16.811-16.811,16.811c-9.283,0-16.808-7.525-16.808-16.811%20C210.066,261.234,217.592,253.708,226.875,253.708L226.875,253.708z%20M371.359,253.708c9.286,0,16.815,7.525,16.815,16.808%20c0,9.286-7.529,16.811-16.815,16.811c-9.279,0-16.808-7.525-16.808-16.811C354.552,261.234,362.08,253.708,371.359,253.708%20L371.359,253.708z%20M236.304,421.639c19.179,0,34.731,15.548,34.731,34.731c0,19.179-15.552,34.731-34.731,34.731%20c-19.179,0-34.731-15.552-34.731-34.731C201.573,437.187,217.126,421.639,236.304,421.639L236.304,421.639z%20M362.924,421.639%20c19.179,0,34.728,15.548,34.728,34.731c0,19.179-15.549,34.731-34.728,34.731c-19.186,0-34.735-15.552-34.735-34.731%20C328.189,437.187,343.738,421.639,362.924,421.639L362.924,421.639z%20M235.828,355.985c-26.801,0-51.159,10.958-68.804,28.6%20c-38.377,38.383-38.377,105.184,0,143.567c17.645,17.645,42.004,28.602,68.804,28.602h127.568c26.803,0,51.159-10.957,68.804-28.602%20c38.377-38.377,38.377-105.19,0-143.567c-16.91-16.91-39.994-27.679-65.481-28.542c57.148-25.011,97.033-82.036,97.033-148.405%20c0-88.133-70.984-161.938-161.945-161.938c-90.131,0-161.935,73.009-161.935,161.938c0,66.315,39.821,123.302,96.895,148.348%20H235.828L235.828,355.985z%20M159.969,344.666c-6.378,4.464-12.357,9.488-17.866,14.999c-52.137,52.134-52.137,141.271-0.003,193.407%20C167.008,577.982,200.589,592,235.828,592h127.568c35.24,0,68.823-14.018,93.729-38.927c52.137-52.134,52.137-141.276,0-193.41%20c-4.761-4.761-9.874-9.155-15.287-13.143c36.523-36.834,57.159-86.685,57.159-138.883c0-108.993-88.188-197.184-197.19-197.184%20c-108.977,0-197.181,88.207-197.181,197.184C104.627,258.933,124.557,307.996,159.969,344.666L159.969,344.666z%20M363.396,385.629%20H235.828c-18.617,0-35.559,7.631-47.846,19.914c-26.797,26.8-26.797,74.85,0,101.65c12.287,12.286,29.225,19.914,47.846,19.914%20h127.568c18.623,0,35.559-7.628,47.849-19.914c26.797-26.8,26.797-74.85,0-101.65C398.955,393.259,382.013,385.629,363.396,385.629%20L363.396,385.629z%20M301.808,75.381c-73.808,0-132.256,59.869-132.256,132.256c0,72.383,58.448,132.256,132.256,132.256%20c73.815,0,132.265-59.87,132.265-132.256C434.073,135.248,375.622,75.381,301.808,75.381L301.808,75.381z%20M301.808,271.807%20c13.689,0,24.784,11.098,24.784,24.781c0,13.686-11.094,24.78-24.784,24.78c-13.686,0-24.777-11.094-24.777-24.78%20C277.03,282.905,288.122,271.807,301.808,271.807z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3csvg%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M460.592,75.695C501.794,116.897,525,172.38,525,230.692v136.191%20c0,58.315-23.206,113.795-64.408,154.997c-86.029,86.032-228.158,86.032-314.186,0C105.203,480.679,82,425.199,82,366.884V230.692%20c0-58.312,23.203-113.795,64.405-154.997C232.433-10.337,374.563-10.337,460.592,75.695L460.592,75.695z%20M434.493,101.794%20c-71.625-71.628-190.365-71.628-261.989,0c-33.068,33.068-53.597,78.696-53.597,128.898v136.191%20c0,50.205,20.529,95.834,53.597,128.898c71.624,71.628,190.364,71.628,261.989,0c33.067-33.064,53.596-78.693,53.596-128.898%20V230.692C488.089,180.49,467.56,134.862,434.493,101.794L434.493,101.794z%20M195.699,124.99%20c-27.134,27.137-43.982,64.557-43.982,105.702v136.191c0,41.146,16.848,78.568,43.982,105.702%20c58.806,58.814,156.791,58.814,215.598,0c27.138-27.134,43.982-64.557,43.982-105.702V230.692%20c0-41.146-16.845-78.566-43.982-105.702C352.491,66.18,254.506,66.18,195.699,124.99L195.699,124.99z%20M303.497,401.594%20c-17.304,0-31.334,14.029-31.334,31.337c0,17.304,14.03,31.333,31.334,31.333c17.307,0,31.337-14.029,31.337-31.333%20C334.834,415.623,320.804,401.594,303.497,401.594L303.497,401.594z%20M223.204,305.993c-17.308,0-31.338,14.03-31.338,31.334%20c0,17.308,14.03,31.337,31.338,31.337c17.307,0,31.337-14.029,31.337-31.337C254.541,320.023,240.511,305.993,223.204,305.993%20L223.204,305.993z%20M223.204,208.881c-17.308,0-31.338,14.026-31.338,31.334c0,17.307,14.03,31.337,31.338,31.337%20c17.307,0,31.337-14.03,31.337-31.337C254.541,222.907,240.511,208.881,223.204,208.881L223.204,208.881z%20M383.796,305.993%20c-17.308,0-31.338,14.03-31.338,31.334c0,17.308,14.03,31.337,31.338,31.337c17.307,0,31.333-14.029,31.333-31.337%20C415.129,320.023,401.103,305.993,383.796,305.993L383.796,305.993z%20M383.796,208.881c-17.308,0-31.338,14.026-31.338,31.334%20c0,17.307,14.03,31.337,31.338,31.337c17.307,0,31.333-14.03,31.333-31.337C415.129,222.907,401.103,208.881,383.796,208.881%20L383.796,208.881z%20M354.769,129.256c-12.585,0-22.786,10.201-22.786,22.786s10.2,22.786,22.786,22.786%20c12.585,0,22.786-10.201,22.786-22.786S367.354,129.256,354.769,129.256L354.769,129.256z%20M252.228,129.256%20c-12.585,0-22.786,10.201-22.786,22.786s10.2,22.786,22.786,22.786c12.585,0,22.786-10.201,22.786-22.786%20S264.813,129.256,252.228,129.256z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='20'%20height='20'%20viewBox='0%200%2020%2020'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M17%2012.8108C17%2013.1901%2016.898%2013.5661%2016.6687%2013.8682C15.2357%2015.7558%2012.784%2017%2010%2017C7.21614%2017%204.76431%2015.7557%203.33134%2013.8681C3.10199%2013.566%203%2013.1901%203%2012.8108V7.18924C3%206.80993%203.10199%206.43401%203.33134%206.13189C4.76431%204.24428%207.21614%203%2010%203C12.784%203%2015.2357%204.24423%2016.6687%206.13183C16.898%206.43395%2017%206.80986%2017%207.18918V12.8108ZM10%207C10.5522%207%2011%206.55231%2011%206C11%205.44769%2010.5522%205%2010%205C9.44775%205%209%205.44769%209%206C9%206.55231%209.44775%207%2010%207ZM6.5%2011.5C7.32837%2011.5%208%2010.8284%208%2010C8%209.17157%207.32837%208.5%206.5%208.5C5.67163%208.5%205%209.17157%205%2010C5%2010.8284%205.67163%2011.5%206.5%2011.5ZM11.5%2013.5C11.5%2014.3284%2010.8284%2015%2010%2015C9.17163%2015%208.5%2014.3284%208.5%2013.5C8.5%2012.6716%209.17163%2012%2010%2012C10.8284%2012%2011.5%2012.6716%2011.5%2013.5ZM13.5%2011.5C14.3284%2011.5%2015%2010.8284%2015%2010C15%209.17157%2014.3284%208.5%2013.5%208.5C12.6716%208.5%2012%209.17157%2012%2010C12%2010.8284%2012.6716%2011.5%2013.5%2011.5Z'%20fill='currentColor'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M10%201C13.8106%201%2017.1182%202.95715%2018.7732%205.82595C18.9298%206.09752%2019%206.40872%2019%206.72224V13.2778C19%2013.5913%2018.9298%2013.9025%2018.7732%2014.1741C17.1182%2017.0429%2013.8106%2019%2010%2019C6.18943%2019%202.88177%2017.0429%201.22682%2014.1741C1.07016%2013.9025%201%2013.5913%201%2013.2778V6.72224C1%206.40872%201.07016%206.09752%201.22682%205.82595C2.88177%202.95715%206.18943%201%2010%201ZM17.6711%205.64554C17.8973%205.95002%2018%206.32536%2018%206.70467V13.2953C18%2013.6746%2017.8973%2014.05%2017.6711%2014.3545C16.0408%2016.5488%2013.214%2018%2010%2018C6.78594%2018%203.95915%2016.5488%202.32887%2014.3544C2.10268%2014.0499%202%2013.6746%202%2013.2953V6.70472C2%206.32542%202.10268%205.95008%202.32887%205.64561C3.95915%203.45116%206.78594%202%2010%202C13.214%202%2016.0408%203.45116%2017.6711%205.64554Z'%20fill='currentColor'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M395.264,259.724c21.074,0,38.157,17.083,38.157,38.158%20c0,21.074-17.083,38.164-38.157,38.164c-21.075,0-38.165-17.09-38.165-38.164C357.099,276.806,374.189,259.724,395.264,259.724%20L395.264,259.724z%20M206.743,259.724c21.075,0,38.158,17.083,38.158,38.158c0,21.074-17.083,38.164-38.158,38.164%20c-21.074,0-38.164-17.09-38.164-38.164C168.579,276.806,185.669,259.724,206.743,259.724L206.743,259.724z%20M317.092,89.755v29.841%20h-32.183V89.755c-67.083,5.031-127.459,41.741-163.107,98.796v223.399c35.648,57.055,96.024,93.765,163.107,98.802v-29.841h32.183%20v29.841c67.084-5.038,127.459-41.747,163.114-98.802V188.551C444.551,131.496,384.176,94.787,317.092,89.755L317.092,89.755z%20M301,56.962c-85.858,0-165.124,45.192-209.061,118.921l-2.328,3.902v90.784H58.612v59.364h30.999v90.784l2.328,3.902%20C135.876,498.348,215.143,543.539,301,543.539c85.857,0,165.123-45.184,209.06-118.921l2.328-3.902v-90.784h31.006v-59.364h-31.006%20v-90.784l-2.328-3.902C466.124,102.147,386.857,56.962,301,56.962L301,56.962z%20M301,18.251c-155.741,0-282,126.253-282,282%20c0,155.741,126.26,282,282,282c155.747,0,282-126.26,282-282C583,144.504,456.747,18.251,301,18.251z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M261.067,178.239c0,7.551,2.198,14.579,5.985,20.491l20.49-20.491%20l-20.49-20.491C263.265,163.659,261.067,170.694,261.067,178.239L261.067,178.239z%20M298.999,216.171%20c-7.545,0-14.58-2.198-20.488-5.981l20.488-20.491l20.491,20.491C313.581,213.972,306.55,216.171,298.999,216.171L298.999,216.171z%20M336.934,178.239c0-7.545-2.198-14.58-5.985-20.491l-20.491,20.491l20.491,20.491C334.736,192.818,336.934,185.79,336.934,178.239%20L336.934,178.239z%20M319.49,146.295l-20.491,20.484l-20.488-20.484c5.907-3.79,12.943-5.988,20.488-5.988%20C306.55,140.307,313.581,142.505,319.49,146.295L319.49,146.295z%20M298.999,124.101c29.864,0,54.141,24.281,54.141,54.138%20c0,29.864-24.277,54.145-54.141,54.145c-29.858,0-54.138-24.281-54.138-54.145C244.861,148.382,269.141,124.101,298.999,124.101%20L298.999,124.101z%20M261.067,417.863c0,7.551,2.198,14.579,5.985,20.491l20.49-20.491l-20.49-20.491%20C263.265,403.283,261.067,410.319,261.067,417.863L261.067,417.863z%20M298.999,455.795c-7.545,0-14.58-2.198-20.488-5.981%20l20.488-20.491l20.491,20.491C313.581,453.597,306.55,455.795,298.999,455.795L298.999,455.795z%20M336.934,417.863%20c0-7.545-2.198-14.58-5.985-20.491l-20.491,20.491l20.491,20.491C334.736,432.443,336.934,425.415,336.934,417.863L336.934,417.863z%20M319.49,385.92l-20.491,20.484l-20.488-20.484c5.907-3.79,12.943-5.988,20.488-5.988C306.55,379.931,313.581,382.13,319.49,385.92%20L319.49,385.92z%20M298.999,363.725c29.864,0,54.141,24.281,54.141,54.138c0,29.864-24.277,54.145-54.141,54.145%20c-29.858,0-54.138-24.281-54.138-54.145C244.861,388.007,269.141,363.725,298.999,363.725L298.999,363.725z%20M180.188,239.928%20c30.094,0,54.49,24.4,54.49,54.494c0,30.095-24.396,54.494-54.49,54.494c-30.095,0-54.494-24.399-54.494-54.494%20C125.694,264.327,150.093,239.928,180.188,239.928L180.188,239.928z%20M417.816,239.928c30.094,0,54.494,24.4,54.494,54.494%20c0,30.095-24.4,54.494-54.494,54.494c-30.095,0-54.494-24.399-54.494-54.494C363.323,264.327,387.722,239.928,417.816,239.928%20L417.816,239.928z%20M298.999,86.511c116.835,0,211.544,94.708,211.544,211.54c0,116.84-94.708,211.54-211.544,211.54%20c-116.836,0-211.54-94.708-211.54-211.54C87.458,181.219,182.163,86.511,298.999,86.511L298.999,86.511z%20M298.999,54.1%20c134.73,0,243.955,109.225,243.955,243.951c0,134.727-109.225,243.952-243.955,243.952c-134.727,0-243.952-109.225-243.952-243.952%20C55.047,163.324,164.271,54.1,298.999,54.1L298.999,54.1z%20M298.999,14.053C455.846,14.053,583,141.2,583,298.051%20c0,156.844-127.154,283.999-284.001,283.999C142.151,582.049,15,454.895,15,298.051C15,141.2,142.151,14.053,298.999,14.053z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Generator:%20Adobe%20Illustrator%2022.0.1,%20SVG%20Export%20Plug-In%20.%20SVG%20Version:%206.00%20Build%200)%20--%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20600%20600'%20enable-background='new%200%200%20600%20600'%20xml:space='preserve'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20fill='currentColor'%20d='M449.833,45.125C531.521,95.36,586,185.558,586,288.497%20c0,157.672-127.825,285.497-285.503,285.497C142.822,573.994,15,446.169,15,288.497C15,185.558,69.476,95.36,151.167,45.125H449.833%20L449.833,45.125z%20M193.639,256.195c-29.46,0-53.343,23.89-53.343,53.35c0,29.46,23.882,53.343,53.343,53.343%20c29.46,0,53.346-23.882,53.346-53.343C246.985,280.085,223.099,256.195,193.639,256.195L193.639,256.195z%20M407.365,256.195%20c-29.46,0-53.35,23.89-53.35,53.35c0,29.46,23.89,53.343,53.35,53.343c29.46,0,53.343-23.882,53.343-53.343%20C460.708,280.085,436.826,256.195,407.365,256.195L407.365,256.195z%20M442.248,88.407l-4.308-3.053H163.052l-4.304,3.053%20c-64.954,46.088-103.49,120.43-103.49,200.09c0,135.438,109.801,245.239,245.239,245.239c135.437,0,245.245-109.801,245.245-245.239%20C545.742,208.837,507.203,134.495,442.248,88.407L442.248,88.407z%20M427.607,117.937H173.391%20c-54.002,40.321-85.547,103.142-85.547,170.56c0,117.449,95.204,212.656,212.653,212.656c117.455,0,212.663-95.207,212.663-212.656%20C513.16,221.08,481.609,158.258,427.607,117.937L427.607,117.937z%20M300.497,215.65c-11.384,0-20.614,9.226-20.614,20.613%20c0,11.387,9.23,20.614,20.614,20.614c11.387,0,20.62-9.226,20.62-20.614C321.117,224.876,311.883,215.65,300.497,215.65%20L300.497,215.65z%20M300.497,146.275c-11.384,0-20.614,9.226-20.614,20.614c0,11.387,9.23,20.62,20.614,20.62%20c11.387,0,20.62-9.233,20.62-20.62C321.117,155.501,311.883,146.275,300.497,146.275L300.497,146.275z%20M381.735,146.275%20c-11.387,0-20.613,9.226-20.613,20.614c0,11.387,9.226,20.62,20.613,20.62c11.387,0,20.613-9.233,20.613-20.62%20C402.348,155.501,393.122,146.275,381.735,146.275L381.735,146.275z%20M219.265,146.275c-11.387,0-20.616,9.226-20.616,20.614%20c0,11.387,9.23,20.62,20.616,20.62c11.387,0,20.617-9.233,20.617-20.62C239.882,155.501,230.652,146.275,219.265,146.275%20L219.265,146.275z%20M300.497,400.094c-18.881,0-34.186,15.309-34.186,34.189c0,18.887,15.305,34.189,34.186,34.189%20c18.887,0,34.189-15.302,34.189-34.189C334.686,415.403,319.384,400.094,300.497,400.094L300.497,400.094z%20M381.735,417.199%20c-11.387,0-20.613,9.233-20.613,20.62c0,11.38,9.226,20.614,20.613,20.614c11.387,0,20.613-9.233,20.613-20.614%20C402.348,426.433,393.122,417.199,381.735,417.199L381.735,417.199z%20M219.265,417.199c-11.387,0-20.616,9.233-20.616,20.62%20c0,11.38,9.23,20.614,20.616,20.614c11.387,0,20.617-9.233,20.617-20.614C239.882,426.433,230.652,417.199,219.265,417.199z'/%3e%3c/svg%3e\"","import ICON_IEC_62196_T2 from \"../assets/connectors/type2.svg\";\nimport ICON_IEC_62196_T2_COMBO from \"../assets/connectors/combo2.svg\";\nimport ICON_IEC_62196_T1 from \"../assets/connectors/type1.svg\";\nimport ICON_IEC_62196_T1_COMBO from \"../assets/connectors/combo1.svg\";\nimport ICON_IEC_62196_T3 from \"../assets/connectors/type3.svg\";\nimport ICON_IEC_62196_T3A from \"../assets/connectors/type3a.svg\";\nimport ICON_SCHUKO from \"../assets/connectors/schuko.svg\";\nimport ICON_CHADEMO from \"../assets/connectors/chademo.svg\";\nimport ICON_CATARC from \"../assets/connectors/catarc.svg\";\n\nexport default {\n // IEC 62196 Types\n IEC_62196_T1: ICON_IEC_62196_T1,\n IEC_62196_T1_COMBO: ICON_IEC_62196_T1_COMBO,\n IEC_62196_T2: ICON_IEC_62196_T2,\n IEC_62196_T2_COMBO: ICON_IEC_62196_T2_COMBO,\n IEC_62196_T3: ICON_IEC_62196_T3,\n IEC_62196_T3A: ICON_IEC_62196_T3A,\n IEC_62196_T3B: ICON_IEC_62196_T3,\n IEC_62196_T3C: ICON_IEC_62196_T3, // Using T3 as fallback\n\n // DC Fast Charging\n CHADEMO: ICON_CHADEMO,\n CHAOJI: ICON_CHADEMO, // Using CHADEMO as fallback for CHAOJI\n CATARC: ICON_CATARC,\n GBT_AC: ICON_CATARC, // Using CATARC as fallback for GBT AC\n GBT_DC: ICON_CATARC, // Using CATARC as fallback for GBT DC\n\n // AC Domestic Types (using SCHUKO as fallback for most domestic types)\n SCHUKO: ICON_SCHUKO,\n DOMESTIC_A: ICON_SCHUKO,\n DOMESTIC_B: ICON_SCHUKO,\n DOMESTIC_C: ICON_SCHUKO,\n DOMESTIC_D: ICON_SCHUKO,\n DOMESTIC_E: ICON_SCHUKO,\n DOMESTIC_F: ICON_SCHUKO,\n DOMESTIC_G: ICON_SCHUKO,\n DOMESTIC_H: ICON_SCHUKO,\n DOMESTIC_I: ICON_SCHUKO,\n DOMESTIC_J: ICON_SCHUKO,\n DOMESTIC_K: ICON_SCHUKO,\n DOMESTIC_L: ICON_SCHUKO,\n DOMESTIC_M: ICON_SCHUKO,\n DOMESTIC_N: ICON_SCHUKO,\n DOMESTIC_O: ICON_SCHUKO,\n\n // IEC 60309 Industrial Types (using SCHUKO as fallback)\n IEC_60309_2_SINGLE_16: ICON_SCHUKO,\n IEC_60309_2_THREE_16: ICON_SCHUKO,\n IEC_60309_2_THREE_32: ICON_SCHUKO,\n IEC_60309_2_THREE_64: ICON_SCHUKO,\n\n // NEMA Types (using SCHUKO as fallback)\n NEMA_5_20: ICON_SCHUKO,\n NEMA_6_30: ICON_SCHUKO,\n NEMA_6_50: ICON_SCHUKO,\n NEMA_10_30: ICON_SCHUKO,\n NEMA_10_50: ICON_SCHUKO,\n NEMA_14_30: ICON_SCHUKO,\n NEMA_14_50: ICON_SCHUKO,\n\n // Pantograph Types (using CHADEMO as fallback)\n PANTOGRAPH_BOTTOM_UP: ICON_CHADEMO,\n PANTOGRAPH_TOP_DOWN: ICON_CHADEMO,\n\n // Tesla Types (using CHADEMO as fallback)\n TESLA_R: ICON_CHADEMO,\n TESLA_S: ICON_CHADEMO,\n\n // Legacy CONNECTOR_STANDARD_TYPE mappings\n CONNECTOR_STANDARD_TYPE_CHADEMO: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_CHAOJI: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_CATARC: ICON_CATARC,\n CONNECTOR_STANDARD_TYPE_SCHUKO: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_A: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_B: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_C: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_D: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_E: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_F: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_G: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_H: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_I: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_J: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_K: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_L: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_M: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_N: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_DOMESTIC_O: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_GBT_AC: ICON_CATARC,\n CONNECTOR_STANDARD_TYPE_GBT_DC: ICON_CATARC,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_SINGLE_16: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_THREE_16: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_THREE_32: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_60309_2_THREE_64: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T1: ICON_IEC_62196_T1,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T1_COMBO: ICON_IEC_62196_T1_COMBO,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T2: ICON_IEC_62196_T2,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T2_COMBO: ICON_IEC_62196_T2_COMBO,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T3A: ICON_IEC_62196_T3A,\n CONNECTOR_STANDARD_TYPE_IEC_62196_T3C: ICON_IEC_62196_T3,\n CONNECTOR_STANDARD_TYPE_NEMA_5_20: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_6_30: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_6_50: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_10_30: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_10_50: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_14_30: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_NEMA_14_50: ICON_SCHUKO,\n CONNECTOR_STANDARD_TYPE_PANTOGRAPH_BOTTOM_UP: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_PANTOGRAPH_TOP_DOWN: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_TESLA_R: ICON_CHADEMO,\n CONNECTOR_STANDARD_TYPE_TESLA_S: ICON_CHADEMO,\n};\n","export const defaultFilter = {\n minPower: 7,\n operator: [],\n status: [],\n publishingMode: \"\",\n connectorTypes: [],\n chargingAccessibility: \"ALL\",\n noAdditionalCharges: false,\n powerType: undefined,\n operatorOnly: \"\",\n remoteStartStop: false,\n searchPhrase: \"\",\n excludeOperator: [],\n authMethodCapabilities: [],\n // amount per kWh in the map currency; undefined is no limit\n maxEnergyPrice: undefined,\n};\n\nexport function hasFilters(filter) {\n const hasFilters =\n (filter.minPower && filter.minPower !== defaultFilter.minPower) ||\n filter?.status?.length ||\n filter?.connectorTypes?.length ||\n (filter?.chargingAccessibility &&\n filter?.chargingAccessibility !== defaultFilter.chargingAccessibility) ||\n filter?.operator?.length ||\n filter?.powerType ||\n filter?.partyId ||\n filter?.noAdditionalCharges ||\n filter?.operatorOnly ||\n filter?.remoteStartStop ||\n filter?.searchPhrase ||\n filter?.excludeOperator?.length ||\n filter?.authMethodCapabilities?.length ||\n typeof filter?.maxEnergyPrice === \"number\";\n\n return !!hasFilters;\n}\n","import React, { useEffect, useReducer, useRef } from \"react\";\n\nimport styles from \"./filters.module.css\";\nimport Checkbox from \"../../components/Checkbox/Checkbox\";\nimport Range from \"../../components/Range/Range\";\nimport MultiSelect from \"../../components/MultiSelect/MultiSelect\";\nimport SelectField from \"../../components/SelectField/SelectField\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport connectorIcons from \"../../components/connectorIcons\";\nimport { useStackContext } from \"../../components/Stack/Stack\";\nimport { defaultFilter } from \"../../utils/filters\";\nimport { formatEnergyPrice, priceTicks } from \"../../utils/price\";\nimport {\n getStatusFilterOptions,\n toggleOption,\n} from \"../../utils/statusFilters\";\nimport { atLeast } from \"../../utils/version\";\n\nconst authMethodCapabilityOptions = [\n {\n value: \"AUTH_METHOD_CAPABILITY_PLUG_AND_CHARGE\",\n labelKey: \"filters.authCapability.plugAndCharge\" as const,\n },\n {\n value: \"AUTH_METHOD_CAPABILITY_CREDIT_CARD_PAYABLE\",\n labelKey: \"filters.authCapability.creditCard\" as const,\n },\n];\n\n// confirm if this a correct,\nconst powerRanges = [\n {\n label: 3,\n value: 3,\n },\n {\n label: 7,\n value: 7,\n },\n {\n label: 11,\n value: 11,\n },\n {\n label: 22,\n value: 22,\n },\n {\n label: 43,\n value: 43,\n },\n {\n label: 50,\n value: 50,\n },\n {\n label: 100,\n value: 100,\n },\n {\n label: 150,\n value: 150,\n },\n {\n label: 200,\n value: 200,\n },\n {\n label: \"250+\",\n value: 250,\n },\n];\n\nfunction useLocalState(initialState) {\n return useReducer((currentState, updatedState) => {\n return { ...currentState, ...updatedState };\n }, initialState);\n}\n\nexport default function FiltersScreen() {\n const {\n setFilters: applyFilters,\n t,\n filters: contextFilters,\n filterConfiguration,\n options,\n mapKind,\n currency,\n language,\n } = useMapContext();\n // start from whatever is already applied (a status pill may have set a\n // filter before this panel opened) so mounting never clears it\n const [filters, setFilters] = useLocalState({\n ...defaultFilter,\n ...contextFilters,\n });\n\n // the price filter exists on v3 maps only: earlier API versions carry no\n // price on the buckets, so a limit there would hide locations silently\n const showPriceFilter =\n atLeast(options.version, \"v3\") && filterConfiguration?.showPriceFilter;\n const priceLimit =\n typeof filters.maxEnergyPrice === \"number\"\n ? formatEnergyPrice(language, {\n amount: filters.maxEnergyPrice,\n currency,\n })\n : undefined;\n\n const { setView: setParentView } = useStackContext();\n\n const showOperatorFilter =\n atLeast(options.version, \"v2\") &&\n filterConfiguration?.operators?.length > 1;\n\n // filters can also change outside this panel while it is open (a click on a\n // status pill); pick those up, but skip the echo of our own applyFilters call\n const lastApplied = useRef<any>();\n useEffect(() => {\n if (lastApplied.current && contextFilters !== lastApplied.current) {\n setFilters(contextFilters);\n }\n }, [contextFilters]);\n\n useEffect(() => {\n lastApplied.current = filters;\n applyFilters(filters);\n }, [filters]);\n\n return (\n <>\n <div className={styles.headerContainer}>\n <div className={styles.header}>{t(\"filters.header\")}</div>\n </div>\n\n <div className={styles.container}>\n <button\n onClick={() => {\n setFilters(defaultFilter);\n applyFilters(defaultFilter);\n }}\n className={styles.actionLinkClearAll}\n >\n {t(\"filters.clearAll\")}\n </button>\n\n {atLeast(options.version, \"v2\") &&\n filterConfiguration?.showSearchPhraseFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.searchPhrase\")}</div>\n <input\n type=\"text\"\n value={filters.searchPhrase || \"\"}\n placeholder={t(\"filters.searchPhrasePlaceholder\")}\n onChange={(e) => setFilters({ searchPhrase: e.target.value })}\n style={{\n width: \"100%\",\n boxSizing: \"border-box\",\n padding: \"8px 10px\",\n fontFamily: \"var(--roadmap-font-family, Inter), system-ui\",\n fontSize: 14,\n lineHeight: \"20px\",\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n background: \"var(--roadmap-background-color, #fff)\",\n border: \"1px solid var(--roadmap-border-color, #ddd)\",\n borderRadius: 6,\n outline: \"none\",\n }}\n />\n </div>\n )}\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.onlyShow\")}</div>\n <label htmlFor=\"dsChargers\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.dcChargers\")}</div>\n <Checkbox\n id=\"dsChargers\"\n checked={filters.powerType === \"dc\"}\n onChange={(checked) => {\n setFilters({\n powerType: checked ? \"dc\" : undefined,\n });\n }}\n />\n </label>\n\n {!atLeast(options.version, \"v2\") && (\n <label htmlFor=\"efluxChargers\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.efluxChargers\")}</div>\n <Checkbox\n id=\"efluxChargers\"\n checked={filters.partyId === \"EFL\"}\n onChange={(checked) => {\n setFilters({\n partyId: checked ? \"EFL\" : undefined,\n });\n }}\n />\n </label>\n )}\n\n {(!atLeast(options.version, \"v2\") ||\n filterConfiguration?.showNoAdditionalFeeFilter) && (\n <label htmlFor=\"noAdditionalFee\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.noAdditionalFee\")}</div>\n <Checkbox\n id=\"noAdditionalFee\"\n checked={filters.noAdditionalCharges}\n onChange={(checked) => {\n setFilters({\n noAdditionalCharges: checked ? true : undefined,\n });\n }}\n />\n </label>\n )}\n\n <label htmlFor=\"remoteStartStop\" className={styles.rowLabel}>\n <div className={styles.label}>{t(\"filters.remoteStartStop\")}</div>\n <Checkbox\n id=\"remoteStartStop\"\n checked={filters.remoteStartStop}\n onChange={(checked) => {\n setFilters({\n remoteStartStop: checked ? true : undefined,\n });\n }}\n />\n </label>\n\n {filterConfiguration.showOperatorOnly &&\n atLeast(options.version, \"v2\") && (\n <label htmlFor=\"operatorOnly\" className={styles.rowLabel}>\n <div\n className={styles.label}\n >{`Show '${filterConfiguration.showOperatorOnly}' only`}</div>\n <Checkbox\n id=\"operatorOnly\"\n checked={\n filters.operatorOnly ===\n filterConfiguration.showOperatorOnly\n }\n onChange={(checked) => {\n setFilters({\n operatorOnly: checked\n ? filterConfiguration.showOperatorOnly\n : undefined,\n });\n }}\n />\n </label>\n )}\n </div>\n\n {showOperatorFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.operator\")}</div>\n <MultiSelect\n id=\"operator\"\n preferredValues={options.preferredOperators}\n value={filters.operator}\n options={[\n ...(filterConfiguration?.operators?.map((operator: any) => ({\n value: operator?.connectionId,\n label: operator?.name,\n selected: filters.operators?.includes(operator?.connectionId),\n })) || []),\n ]}\n placeholder=\"Select operator\"\n onChange={(value) => {\n setFilters({\n operator: value,\n });\n }}\n />\n </div>\n )}\n\n {showOperatorFilter &&\n filterConfiguration?.showExcludeOperatorFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>\n {t(\"filters.excludeOperator\")}\n </div>\n <MultiSelect\n id=\"excludeOperator\"\n preferredValues={options.preferredOperators}\n value={filters.excludeOperator}\n options={[\n ...(filterConfiguration?.operators?.map((operator: any) => ({\n value: operator?.connectionId,\n label: operator?.name,\n selected: filters.excludeOperator?.includes(\n operator?.connectionId,\n ),\n })) || []),\n ]}\n placeholder={t(\"filters.excludeOperator\")}\n onChange={(value) => {\n setFilters({\n excludeOperator: value,\n });\n }}\n />\n </div>\n )}\n\n {filterConfiguration?.showPublishingModeFilter &&\n filterConfiguration?.publishingMode?.length > 1 && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{\"Visibility\"}</div>\n <SelectField\n id=\"publishingMode\"\n value={filters.publishingMode}\n options={[\n { value: \"\", label: \"All locations\" },\n {\n value: \"PUBLISHING_MODE_PUBLIC\",\n label: \"Public locations\",\n },\n {\n value: \"PUBLISHING_MODE_PRIVATE\",\n label: \"Private locations\",\n },\n ]}\n onChange={(value) => {\n setFilters({ publishingMode: value });\n }}\n />\n </div>\n )}\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.statusHeading\")}</div>\n\n {/* CPO maps filter on connector OCPP status, roaming maps on EVSE status;\n the kind comes from the map key's remote config */}\n {getStatusFilterOptions(mapKind, options.version).map((option) => (\n <label\n key={option.id}\n htmlFor={option.id}\n className={styles.rowLabel}\n >\n <div className={styles.label}>\n <div\n className={styles.dot}\n style={{ background: option.color }}\n />\n {t(option.labelKey)}\n </div>\n <Checkbox\n id={option.id}\n name=\"status\"\n checked={option.values.every((value) =>\n filters.status.includes(value),\n )}\n onChange={(checked) => {\n setFilters({\n status: toggleOption(\n checked ? \"add\" : \"remove\",\n filters.status,\n option.values,\n ),\n });\n }}\n />\n </label>\n ))}\n </div>\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.chargingPower\")}</div>\n <Range\n value={filters.minPower}\n onChange={(value) => {\n setFilters({ minPower: value });\n }}\n ticks={powerRanges}\n />\n </div>\n\n {showPriceFilter && (\n <div className={styles.optionsGroup}>\n <div\n className={styles.heading}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n }}\n >\n <span>{t(\"filters.maxEnergyPrice\")}</span>\n {priceLimit && (\n <span\n style={{\n fontFamily:\n '\"IBM Plex Mono\", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontWeight: 500,\n color: \"var(--roadmap-brand-color, #ff3d00)\",\n }}\n >\n {priceLimit}\n </span>\n )}\n </div>\n <Range\n value={filters.maxEnergyPrice}\n onChange={(value) => {\n setFilters({ maxEnergyPrice: value });\n }}\n ticks={priceTicks(language, currency, t(\"filters.anyPrice\"))}\n />\n </div>\n )}\n\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>{t(\"filters.connectorType\")}</div>\n\n <label htmlFor=\"type1\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T1}\n className={styles.connectorIcon}\n />\n Type 1 (Yazaki)\n </div>\n <Checkbox\n id=\"type1\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T1\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T1\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T1\",\n ),\n });\n }}\n />\n </label>\n\n <label htmlFor=\"type2\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T2}\n className={styles.connectorIcon}\n />\n Type 2 (Mennekes)\n </div>\n <Checkbox\n id=\"type2\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T2\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T2\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T2\",\n ),\n });\n }}\n />\n </label>\n <label htmlFor=\"type3\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T3}\n className={styles.connectorIcon}\n />\n Type 3 (Le Grand)\n </div>\n <Checkbox\n id=\"type3\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T3A\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T3A\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T3A\",\n ),\n });\n }}\n />\n </label>\n <label htmlFor=\"CHAdeMo\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.CHADEMO}\n className={styles.connectorIcon}\n />\n CHAdeMo\n </div>\n <Checkbox\n id=\"CHAdeMo\"\n checked={filters.connectorTypes.includes(\"CHADEMO\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"CHADEMO\"]\n : filters.connectorTypes.filter((s) => s !== \"CHADEMO\"),\n });\n }}\n />\n </label>\n <label htmlFor=\"domestic\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.DOMESTIC_F}\n className={styles.connectorIcon}\n />\n Domestic\n </div>\n <Checkbox\n id=\"domestic\"\n checked={filters.connectorTypes.includes(\"DOMESTIC_F\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"DOMESTIC_F\"]\n : filters.connectorTypes.filter((s) => s !== \"DOMESTIC_F\"),\n });\n }}\n />\n </label>\n <label htmlFor=\"combo\" className={styles.rowLabel}>\n <div className={styles.label}>\n <img\n src={connectorIcons.IEC_62196_T2_COMBO}\n className={styles.connectorIcon}\n />\n Combo\n </div>\n <Checkbox\n id=\"combo\"\n checked={filters.connectorTypes.includes(\"IEC_62196_T2_COMBO\")}\n onChange={(checked) => {\n setFilters({\n connectorTypes: checked\n ? [...filters.connectorTypes, \"IEC_62196_T2_COMBO\"]\n : filters.connectorTypes.filter(\n (s) => s !== \"IEC_62196_T2_COMBO\",\n ),\n });\n }}\n />\n </label>\n </div>\n\n {atLeast(options.version, \"v2\") &&\n filterConfiguration?.showPaymentMethodFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>\n {t(\"filters.authMethodCapabilities\")}\n </div>\n {authMethodCapabilityOptions.map((capability) => {\n const id = `auth-${capability.value}`;\n const checked =\n filters.authMethodCapabilities?.includes(capability.value) ??\n false;\n return (\n <label\n key={capability.value}\n htmlFor={id}\n className={styles.rowLabel}\n >\n <div className={styles.label}>{t(capability.labelKey)}</div>\n <Checkbox\n id={id}\n checked={checked}\n onChange={(isChecked) => {\n setFilters({\n authMethodCapabilities: toggleOption(\n isChecked ? \"add\" : \"remove\",\n filters.authMethodCapabilities || [],\n [capability.value],\n ),\n });\n }}\n />\n </label>\n );\n })}\n </div>\n )}\n\n {filterConfiguration?.showVehicleAvailabilityFilter && (\n <div className={styles.optionsGroup}>\n <div className={styles.heading}>\n {t(\"filters.chargingAccessibility\")}\n </div>\n <SelectField\n id=\"chargingAccessibility\"\n value={filters.chargingAccessibility || \"ALL\"}\n options={[\n { value: \"ALL\", label: t(\"filters.accessibilityAll\") },\n { value: \"TESLA\", label: t(\"filters.accessibilityTesla\") },\n ]}\n onChange={(value) => {\n setFilters({\n chargingAccessibility: value,\n });\n }}\n />\n </div>\n )}\n </div>\n </>\n );\n}\n","import React, { useEffect } from \"react\";\n\nimport styles from \"./LocationPlaceholder.module.css\";\n\nexport default function LocationPlaceholder() {\n return (\n <div className={styles.container}>\n {/* put in place holders */}\n <div className={styles.header} />\n\n <div className={styles.divider} style={{ marginTop: '15px', marginBottom: '23px' }} />\n\n <div className={styles.iconLine} style={{ width: '60%' }} />\n <div className={styles.iconLine} style={{ width: '45%' }} />\n <div className={styles.iconLine} style={{ width: '50%' }} />\n\n <div className={styles.divider} />\n\n <div className={styles.iconLine} style={{ width: '50%' }} />\n <div className={styles.iconLine} style={{ width: '62%' }} />\n\n <div className={styles.priceLine} />\n\n <div className={styles.divider} />\n\n <div className={styles.iconLine} style={{ width: '50%' }} />\n <div className={styles.iconLine} style={{ width: '57%' }} />\n\n <div className={styles.priceLine} style={{ width: '30%' }} />\n </div>\n );\n}\n\n","import React from \"react\";\n\nexport function ChevronLeft() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 320 512\"\n width=\"12\"\n height=\"12\"\n fill=\"currentColor\"\n >\n <path d=\"M9.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l192 192c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256 246.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-192 192z\" />\n </svg>\n );\n}\n\nexport function ChevronRight() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 320 512\"\n width=\"12\"\n height=\"12\"\n fill=\"currentColor\"\n >\n <path d=\"M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\" />\n </svg>\n );\n}\n\nexport function ChevronDown() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 320\"\n width=\"10\"\n height=\"10\"\n fill=\"currentColor\"\n >\n <path d=\"M233.4 310.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 242.7 86.6 73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\" />\n </svg>\n );\n}\n\nexport function Clock() {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8 0.25C3.72 0.25 0.25 3.72 0.25 8s3.47 7.75 7.75 7.75S15.75 12.28 15.75 8 12.28 0.25 8 0.25zm0 14C4.55 14.25 1.75 11.45 1.75 8S4.55 1.75 8 1.75 14.25 4.55 14.25 8 11.45 14.25 8 14.25zM8.75 4.25a0.75 0.75 0 0 0-1.5 0v4c0 0.2 0.08 0.39 0.22 0.53l2.5 2.5a0.75 0.75 0 1 0 1.06-1.06L8.75 7.94V4.25z\" />\n </svg>\n );\n}\n\nexport function Check() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n >\n <path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06 0l-3-3a.75.75 0 1 1 1.06-1.06L5.75 11.19l6.97-6.97a.75.75 0 0 1 1.06 0z\" />\n </svg>\n );\n}\n\nexport function Info() {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width=\"16\"\n height=\"16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g>\n <path d=\"M8 0.25C3.72009 0.25 0.25 3.72134 0.25 8C0.25 12.2812 3.72009 15.75 8 15.75C12.2799 15.75 15.75 12.2812 15.75 8C15.75 3.72134 12.2799 0.25 8 0.25ZM8 14.25C4.54588 14.25 1.75 11.4553 1.75 8C1.75 4.54703 4.546 1.75 8 1.75C11.4528 1.75 14.25 4.54597 14.25 8C14.25 11.4541 11.4553 14.25 8 14.25ZM8 3.6875C8.72487 3.6875 9.3125 4.27513 9.3125 5C9.3125 5.72487 8.72487 6.3125 8 6.3125C7.27513 6.3125 6.6875 5.72487 6.6875 5C6.6875 4.27513 7.27513 3.6875 8 3.6875ZM9.75 11.625C9.75 11.8321 9.58209 12 9.375 12H6.625C6.41791 12 6.25 11.8321 6.25 11.625V10.875C6.25 10.6679 6.41791 10.5 6.625 10.5H7V8.5H6.625C6.41791 8.5 6.25 8.33209 6.25 8.125V7.375C6.25 7.16791 6.41791 7 6.625 7H8.625C8.83209 7 9 7.16791 9 7.375V10.5H9.375C9.58209 10.5 9.75 10.6679 9.75 10.875V11.625Z\" />\n </g>\n </svg>\n );\n}\n\n","import React from \"react\";\n\nimport styles from \"./SidebarContainer.module.css\";\n\nexport default function SideBarContainer({ children }) {\n return <div className={styles.container}>{children}</div>;\n}\n\n","import SideBarContainer from \"../SidebarContainer/SidebarContainer\";\nimport styles from \"./Debug.module.css\";\n\nexport default function Debug({ location }) {\n return (\n <div className={styles.container}>\n <SideBarContainer>\n <div>\n <h3>Debug: {location.name}</h3>\n </div>\n <div style={{ marginBottom: \"5px\" }}>\n <button\n onClick={() => {\n navigator.clipboard.writeText(JSON.stringify(location, null, 2));\n }}\n >\n Copy location\n </button>\n </div>\n <div className={styles.content}>\n {location.evses.map((evse) => {\n return (\n <div className={styles.evse}>\n <div className={styles.connectorHeader}>\n Evse: {evse.evseId || evse.evse_id}\n </div>\n <div>\n {evse.connectors.map((connector, i) => {\n return (\n <div>\n <div className={styles.connectorHeader}>\n Connector #{i}\n </div>\n <pre className={styles.code}>\n {JSON.stringify(\n connector.tariff || Array.isArray(location.tariffs)\n ? location.tariffs?.find((t) =>\n connector.tariff_ids.includes(t.id),\n )\n : null,\n null,\n 2,\n )}\n </pre>\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </SideBarContainer>\n </div>\n );\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='18'%20height='16'%20viewBox='0%200%2018%2016'%20fill='none'%3e%3cg%20clip-path='url(%23clip0_480_2466)'%3e%3cpath%20d='M3.76781%207H5.0925L4.81812%208.71156C4.77812%208.85969%204.9075%209%205.07875%209C5.17188%209%205.26156%208.95719%205.31063%208.88313L7.40219%205.78062C7.50531%205.62469%207.37656%205.42875%207.17031%205.42875H5.88219L6.14094%204.295C6.18625%204.14625%206.05781%204.00031%205.88219%204.00031H4.36438C4.23%204.00031%204.11656%204.08719%204.09875%204.20375L3.50187%206.735C3.48094%206.87531%203.60594%207%203.76781%207ZM17.5%204H17V2.5C17%202.22375%2016.7763%202%2016.5%202C16.2237%202%2016%202.22375%2016%202.5V4H15V2.5C15%202.22375%2014.7762%202%2014.5%202C14.2238%202%2014%202.22375%2014%202.5V4H13.5C13.2238%204%2013%204.22375%2013%204.5V6C13%207.1175%2013.7381%208.05281%2014.75%208.37281V11.625C14.75%2012.1075%2014.3575%2012.5%2013.875%2012.5C13.3925%2012.5%2013%2012.1075%2013%2011.625V10.75C13%209.23344%2011.7666%208%2010.25%208H10V1.5C10%200.671562%209.32844%200%208.5%200H2.5C1.67156%200%201%200.671562%201%201.5V14.5H0.25C0.111875%2014.5%200%2014.6119%200%2014.75V15.75C0%2015.8881%200.111875%2016%200.25%2016H10.75C10.8881%2016%2011%2015.8881%2011%2015.75V14.75C11%2014.6119%2010.8881%2014.5%2010.75%2014.5H10V9.5H10.25C10.9394%209.5%2011.5%2010.0606%2011.5%2010.75V11.625C11.5%2012.9347%2012.5653%2014%2013.875%2014C15.1847%2014%2016.25%2012.9347%2016.25%2011.625V8.37281C17.2619%208.05281%2018%207.1175%2018%206V4.5C18%204.22375%2017.7763%204%2017.5%204ZM8.5%2014.5H2.5V1.5H8.5V14.5ZM16.5%206C16.5%206.55125%2016.0513%207%2015.5%207C14.9487%207%2014.5%206.55125%2014.5%206V5.5H16.5V6Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_480_2466'%3e%3crect%20width='18'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='14'%20height='16'%20viewBox='0%200%2014%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_480_2468)'%3e%3cpath%20d='M4%204.625V3.375C4%203.16875%204.16875%203%204.375%203H5.625C5.83125%203%206%203.16875%206%203.375V4.625C6%204.83125%205.83125%205%205.625%205H4.375C4.16875%205%204%204.83125%204%204.625ZM8.375%205H9.625C9.83125%205%2010%204.83125%2010%204.625V3.375C10%203.16875%209.83125%203%209.625%203H8.375C8.16875%203%208%203.16875%208%203.375V4.625C8%204.83125%208.16875%205%208.375%205ZM4.375%208H5.625C5.83125%208%206%207.83125%206%207.625V6.375C6%206.16875%205.83125%206%205.625%206H4.375C4.16875%206%204%206.16875%204%206.375V7.625C4%207.83125%204.16875%208%204.375%208ZM8.375%208H9.625C9.83125%208%2010%207.83125%2010%207.625V6.375C10%206.16875%209.83125%206%209.625%206H8.375C8.16875%206%208%206.16875%208%206.375V7.625C8%207.83125%208.16875%208%208.375%208ZM6%2010.625V9.375C6%209.16875%205.83125%209%205.625%209H4.375C4.16875%209%204%209.16875%204%209.375V10.625C4%2010.8313%204.16875%2011%204.375%2011H5.625C5.83125%2011%206%2010.8313%206%2010.625ZM8.375%2011H9.625C9.83125%2011%2010%2010.8313%2010%2010.625V9.375C10%209.16875%209.83125%209%209.625%209H8.375C8.16875%209%208%209.16875%208%209.375V10.625C8%2010.8313%208.16875%2011%208.375%2011ZM14%2014.875V16H0V14.875C0%2014.6687%200.16875%2014.5%200.375%2014.5H0.984375V0.75C0.984375%200.334375%201.31875%200%201.73438%200H12.2656C12.6812%200%2013.0156%200.334375%2013.0156%200.75V14.5H13.625C13.8313%2014.5%2014%2014.6687%2014%2014.875ZM2.48438%2014.4688H6V12.375C6%2012.1687%206.16875%2012%206.375%2012H7.625C7.83125%2012%208%2012.1687%208%2012.375V14.4688H11.5156V1.53125L2.5%201.5L2.48438%2014.4688Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_480_2468'%3e%3crect%20width='14'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='20'%20height='16'%20viewBox='0%200%2020%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M17%206H16.5L13.1003%201.75063C12.913%201.51641%2012.6754%201.32734%2012.405%201.19741C12.1347%201.06747%2011.8387%201.00001%2011.5387%201H4.85406C4.03625%201%203.30094%201.49781%202.99719%202.25719L1.5%206V6.07062C0.63875%206.29375%200%207.06906%200%208V11.5C0%2011.7762%200.22375%2012%200.5%2012H2C2%2013.6569%203.34312%2015%205%2015C6.65688%2015%208%2013.6569%208%2012H12C12%2013.6569%2013.3431%2015%2015%2015C16.6569%2015%2018%2013.6569%2018%2012H19.5C19.7763%2012%2020%2011.7762%2020%2011.5V9C20%207.34312%2018.6569%206%2017%206ZM8.75%202.5H11.5387C11.6916%202.5%2011.8338%202.56844%2011.9291%202.6875L14.5791%206H8.75V2.5ZM4.38969%202.81437C4.46625%202.62344%204.64844%202.5%204.85406%202.5H7.25V6H3.11562L4.38969%202.81437ZM5%2013.5C4.17156%2013.5%203.5%2012.8284%203.5%2012C3.5%2011.1716%204.17156%2010.5%205%2010.5C5.82844%2010.5%206.5%2011.1716%206.5%2012C6.5%2012.8284%205.82844%2013.5%205%2013.5ZM15%2013.5C14.1716%2013.5%2013.5%2012.8284%2013.5%2012C13.5%2011.1716%2014.1716%2010.5%2015%2010.5C15.8284%2010.5%2016.5%2011.1716%2016.5%2012C16.5%2012.8284%2015.8284%2013.5%2015%2013.5ZM18.5%2010.5H17.5841C17.0644%209.60719%2016.1078%209%2015%209C13.8922%209%2012.9359%209.60719%2012.4159%2010.5H7.58406C7.06437%209.60719%206.10781%209%205%209C3.89219%209%202.93594%209.60719%202.41594%2010.5H1.5V8C1.5%207.72437%201.72438%207.5%202%207.5H17C17.8272%207.5%2018.5%208.17281%2018.5%209V10.5Z'%20fill='black'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='12'%20height='16'%20viewBox='0%200%2012%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_480_2435)'%3e%3cpath%20d='M11.8068%205.24687C11.5506%204.8%2011.0849%204.53125%2010.5693%204.53125H7.61932L8.51619%201.79688C8.63182%201.36563%208.54119%200.9125%208.26932%200.55625C7.99432%200.203125%207.57869%200%207.13182%200H3.05369C2.34118%200%201.73181%200.534375%201.65368%201.15937L0.0161813%207.79063C-0.0431938%208.22188%200.0849314%208.65625%200.369307%208.98438C0.653682%209.3125%201.06618%209.5%201.50056%209.5H4.56619L3.47556%2014.2406C3.37556%2014.6688%203.47244%2015.1125%203.74431%2015.4563C4.01619%2015.8031%204.42556%2016%204.86619%2016C5.37556%2016%205.85057%2015.725%206.07869%2015.325L11.8037%206.67812C12.0662%206.23125%2012.0662%205.69375%2011.8068%205.24687ZM5.00369%2014.2937L6.45057%208H1.48493L3.05369%201.5L7.04119%201.47187L5.54744%206.03125H10.4381L5.00369%2014.2937Z'%20fill='%232A2A2A'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_480_2435'%3e%3crect%20width='12'%20height='16'%20fill='white'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='18'%20height='12'%20viewBox='0%200%2018%2012'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M16.2857%200H0.857143C0.383839%200%200%200.383839%200%200.857143V11.1429C0%2011.6162%200.383839%2012%200.857143%2012H16.2857C16.759%2012%2017.1429%2011.6162%2017.1429%2011.1429V0.857143C17.1429%200.383839%2016.759%200%2016.2857%200ZM15.8571%2010.7143H1.28571V1.28571H15.8571V10.7143ZM7.92857%207.71429H10.0714C10.1898%207.71429%2010.2857%207.61839%2010.2857%207.5V6.64286C10.2857%206.52446%2010.1898%206.42857%2010.0714%206.42857H7.92857C7.81018%206.42857%207.71429%206.52446%207.71429%206.64286V7.5C7.71429%207.61839%207.81018%207.71429%207.92857%207.71429ZM14.3571%206.42857H12.2143C12.0959%206.42857%2012%206.52446%2012%206.64286V7.5C12%207.61839%2012.0959%207.71429%2012.2143%207.71429H14.3571C14.4755%207.71429%2014.5714%207.61839%2014.5714%207.5V6.64286C14.5714%206.52446%2014.4755%206.42857%2014.3571%206.42857ZM7.92857%205.57143H14.3571C14.4755%205.57143%2014.5714%205.47554%2014.5714%205.35714V4.5C14.5714%204.38161%2014.4755%204.28571%2014.3571%204.28571H7.92857C7.81018%204.28571%207.71429%204.38161%207.71429%204.5V5.35714C7.71429%205.47554%207.81018%205.57143%207.92857%205.57143ZM3.60857%206.04607L4.73866%206.3525C4.85089%206.38304%204.92857%206.47437%204.92857%206.57482C4.92857%206.70339%204.80804%206.80786%204.65911%206.80786H3.95357C3.84241%206.80786%203.73312%206.78%203.6383%206.72884C3.5558%206.68411%203.45509%206.69214%203.3908%206.76045L3.0675%207.10143C2.9842%207.18929%202.99786%207.33286%203.09777%207.40116C3.32009%207.5525%203.58152%207.63902%203.85714%207.65616V7.92857C3.85714%208.04696%203.95304%208.14286%204.07143%208.14286H4.5C4.61839%208.14286%204.71429%208.04696%204.71429%207.92857V7.65402C5.30839%207.62455%205.78571%207.15661%205.78571%206.57455C5.78571%206.08786%205.44768%205.65634%204.96286%205.52536L3.83277%205.21893C3.72054%205.18839%203.64286%205.09705%203.64286%204.99661C3.64286%204.86804%203.76339%204.76357%203.91232%204.76357H4.61786C4.72902%204.76357%204.8383%204.79143%204.93312%204.84259C5.01562%204.88705%205.11634%204.87929%205.18062%204.81098L5.50393%204.47C5.58723%204.38214%205.57357%204.23857%205.47366%204.17027C5.25134%204.01893%204.98991%203.93241%204.71429%203.91527V3.64286C4.71429%203.52446%204.61839%203.42857%204.5%203.42857H4.07143C3.95304%203.42857%203.85714%203.52446%203.85714%203.64286V3.91741C3.26304%203.94688%202.78571%204.41482%202.78571%204.99688C2.78571%205.48357%203.12375%205.91509%203.60857%206.04607Z'%20fill='%232A2A2A'/%3e%3c/svg%3e\"","import connectorIcons from \"../components/connectorIcons\";\nimport { MapContextType } from \"../contexts/Map\";\nimport { getColorForStatus } from \"./location\";\nimport { getStatusLabelKey } from \"./status\";\n\nexport function getSocketIcon(connector) {\n return connectorIcons[connector.standard || connector.connectorStandardType];\n}\n\nexport function formatNumber(language, value) {\n return new Intl.NumberFormat(language, {\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nexport const connectorPowerTypes = {\n CONNECTOR_POWER_TYPE_UNSPECIFIED: \"Unspecified\",\n CONNECTOR_POWER_TYPE_AC_1_PHASE: \"AC x 1\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE: \"AC x 2\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT: \"AC x 2 Split\",\n CONNECTOR_POWER_TYPE_AC_3_PHASE: \"AC x 3\",\n CONNECTOR_POWER_TYPE_DC: \"DC\",\n CONNECTOR_POWER_TYPE_AC: \"AC\",\n AC_3_PHASE: \"AC x 3\",\n AC_1_PHASE: \"AC x 1\",\n DC: \"DC\",\n};\n\nexport function getSocketText(connector) {\n return [\n formatConnectorStandard(\n connector.standard || connector.connectorStandardType,\n ),\n connectorPowerTypes[\n connector.powerType ||\n connector.power_type ||\n connector.connectorPowerType\n ],\n \"Socket\",\n ].join(\", \");\n}\n\nexport function formatConnectorStandard(value) {\n value = (value || \"\").replace(\"CONNECTOR_STANDARD_TYPE_\", \"\");\n\n if (value === \"IEC_62196_T1\") return \"Type 1\";\n if (value === \"IEC_62196_T1_COMBO\") return \"Type 1 Combo\";\n if (value === \"IEC_62196_T2\") return \"Type 2\";\n if (value === \"IEC_62196_T2_COMBO\") return \"Type 2 Combo\";\n if (value === \"IEC_62196_T3A\") return \"Type 3A\";\n if (value === \"IEC_62196_T3C\") return \"Type 3C\";\n if (value === \"CHADEMO\") return \"CHAdeMO\";\n if (value === \"DOMESTIC_F\") return \"Domestic F\";\n if (value === \"DOMESTIC_E\") return \"Domestic E\";\n if (value === \"DOMESTIC_B\") return \"Domestic B\";\n if (value === \"CATARC\") return \"Catarc\";\n return value;\n}\n\n// getStatusLabel renders a roaming EVSE or connector OCPP status name, bare or\n// prefixed, in the current language.\nexport function getStatusLabel(t: MapContextType[\"t\"], status) {\n return t(getStatusLabelKey(status));\n}\n\nexport function getLocationLabel(t: MapContextType[\"t\"], location) {\n if (location?.type === \"ON_STREET\") {\n return t(`locationType.onStreet`);\n }\n if (location?.type === \"PARKING_GARAGE\") {\n return t(`locationType.parkingGarage`);\n }\n if (location?.type === \"UNDERGROUND_GARAGE\") {\n return t(`locationType.undergroundGarage`);\n }\n if (location?.type === \"PARKING_LOT\") {\n return t(`locationType.parkingLot`);\n }\n\n return t(`locationType.other`);\n}\n\nexport function getStatusColorFromEvses(evses: any[] = []) {\n if (evses.some((evse) => evse.status === \"AVAILABLE\")) {\n return getColorForStatus(\"AVAILABLE\");\n }\n\n if (evses.some((evse) => evse.status === \"CHARGING\")) {\n return getColorForStatus(\"CHARGING\");\n }\n\n return getColorForStatus(\"UNKNOWN\");\n}\n","/**\n * Note there could be bugs here. This is waiting for the Temporal API\n * Or if we cant wait use a library like moment-timezone or similar for more reliable timezone support\n */\n\n// Return offset on date for loc in ±H[:mm] format. Minutes only included if not zero\n// This is a bit special see https://stackoverflow.com/questions/62130983/get-offset-of-the-other-location-in-javascript for explanation\nexport function getTimezoneOffset(date, timeZone) {\n // Try English to get offset. If get abbreviation, use French\n let offset;\n [\"en\", \"fr\"].some((lang) => {\n // Get parts - can't get just timeZoneName, must get one other part at least\n let parts = new Intl.DateTimeFormat(lang, {\n minute: \"numeric\",\n timeZone,\n timeZoneName: \"short\",\n }).formatToParts(date);\n // Get offset from parts\n let tzName = parts.filter(\n (part) => part.type == \"timeZoneName\" && part.value\n );\n // timeZoneName starting with GMT or UTC is offset - keep and stop looping\n // Otherwise it's an abbreviation, keep looping\n if (/^(GMT|UTC)/.test(tzName[0].value)) {\n offset = tzName[0].value.replace(/GMT|UTC/, \"\") || \"+0\";\n return true;\n }\n });\n // Format offset as ±HH:mm\n // Normalise minus sign as ASCII minus (charCode 45)\n let sign = offset[0] == \"\\x2b\" ? \"\\x2b\" : \"\\x2d\";\n let [h, m] = offset.substring(1).split(\":\");\n return sign + h.padStart(2, \"0\") + \":\" + (m || \"00\");\n}\n\n// Convert offset string in ±HH:mm to minutes\nfunction offsetToMins(offset) {\n let sign = /^-/.test(offset) ? -1 : 1;\n let [h, m] = offset.match(/\\d\\d/g);\n return sign * (h * 60 + Number(m));\n}\n\nfunction formatYMD(timeZone, date) {\n const z = (n) => (\"0\" + n).slice(-2);\n const { year, month, day } = new Intl.DateTimeFormat(\"en\", {\n timeZone: timeZone,\n })\n .formatToParts(date)\n .reduce((acc, part) => {\n acc[part.type] = part.value;\n return part;\n }, Object.create(null));\n return `${year}-${z(month)}-${z(day)}`;\n}\n\nexport function tzDate(timeZone, date = new Date()) {\n const offset = getTimezoneOffset(date, timeZone);\n const offMins = offsetToMins(offset);\n const d = new Date(+date);\n d.setUTCMinutes(d.getUTCMinutes() + offMins);\n return d;\n}\n\nexport function startOfDay(timeZone, date = new Date()) {\n const offset = getTimezoneOffset(date, timeZone);\n const offMins = offsetToMins(offset);\n const d = new Date(+date);\n d.setUTCHours(0, -offMins, 0, 0);\n // If date is + or - original date, adjust\n const oDateTS = formatYMD(timeZone, date);\n const sodDateTS = formatYMD(timeZone, d);\n if (sodDateTS > oDateTS) {\n d.setUTCDate(d.getUTCDate() - 1);\n } else if (sodDateTS < oDateTS) {\n d.setUTCDate(d.getUTCDate() + 1);\n }\n return d;\n}\n\nexport function endOfDate(timeZone, date = new Date()) {\n return new Date(startOfDay(timeZone, date).valueOf() + 86399999);\n}\n\n// Could be bugs here\nexport function getNextDayOfWeek(\n date: Date,\n dayOfWeek: number,\n timeZone?: string\n) {\n const resultDate = tzDate(timeZone, date);\n if (resultDate.getUTCDate() !== dayOfWeek) {\n resultDate.setUTCDate(\n date.getUTCDate() + ((7 + dayOfWeek - date.getUTCDay() - 1) % 7) + 1\n );\n }\n\n return {\n start: startOfDay(timeZone, resultDate),\n end: endOfDate(timeZone, resultDate),\n };\n}\n\nexport function getDay(date: Date, timeZone?: string) {\n return tzDate(timeZone, date).getUTCDay();\n}\n","import {\n TariffElement,\n TariffRestrictions,\n DayOfWeek,\n PriceComponent,\n OcpiTariff,\n OcpiTariffElement,\n} from \"../types\";\n\nimport { getDay, getNextDayOfWeek } from \"../utils/date\";\n\nexport function convertTimeToMinutes(time: string) {\n const [hours, minutes] = time.split(\":\");\n return parseInt(hours) * 60 + parseInt(minutes);\n}\n\nfunction convertToTimeSlot(element: TariffElement): Timeslot {\n if (!element?.restrictions?.startTime || !element?.restrictions?.endTime) {\n return {\n elements: [element],\n priceComponents: element.priceComponents,\n startTime: 0,\n endTime: 24 * 60,\n isFullDay: true,\n };\n }\n\n const startTime = convertTimeToMinutes(element.restrictions.startTime);\n const endTime = convertTimeToMinutes(element.restrictions.endTime);\n\n return {\n elements: [element],\n priceComponents: element.priceComponents,\n isFullDay: startTime === 0 && endTime === 24 * 60,\n startTime,\n endTime,\n };\n}\n\ntype Timeslot = {\n isActive?: boolean;\n isFullDay: boolean;\n startTime: number;\n endTime: number;\n elements?: TariffElement[];\n priceComponents: PriceComponent[];\n};\n\n// TODO write this nicer\nexport function getScheduleItems(\n items: Timeslot[],\n isDayActive: boolean,\n now: Date,\n): Timeslot[] {\n const currentTime = (now.getHours() * 60 + now.getMinutes()) % 60;\n\n if (items.length <= 1) {\n return items.map((item) => {\n item.isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime >= currentTime;\n\n return item;\n });\n }\n items = items.sort((a, b) => a.startTime - b.startTime);\n\n let scheduleItems = [items[0]];\n for (let i = 1; i < items.length; i++) {\n const current = items[i];\n\n const refItem = scheduleItems.findLast(\n (item) => item.startTime <= current.startTime,\n );\n if (!refItem) {\n scheduleItems = scheduleItems.filter(\n (item) => item.endTime > current.endTime,\n );\n scheduleItems.unshift(current);\n } else {\n const oldEndTime = refItem.endTime;\n refItem.endTime = current.startTime;\n\n const toAppend = [current];\n if (oldEndTime > current.endTime) {\n toAppend.push({\n ...refItem,\n startTime: current.endTime,\n endTime: oldEndTime,\n });\n }\n scheduleItems.splice(scheduleItems.indexOf(refItem) + 1, 0, ...toAppend);\n }\n\n let maxEndTime = 0;\n scheduleItems = scheduleItems\n .map((item, i) => {\n const prevItem = scheduleItems[i - 1];\n\n if (item.endTime > maxEndTime) {\n maxEndTime = item.endTime;\n } else {\n return null;\n }\n if (prevItem && prevItem.endTime !== item.startTime) {\n item.startTime = prevItem.endTime;\n }\n return item;\n })\n .filter(Boolean);\n }\n\n return scheduleItems.map((item) => {\n item.isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime >= currentTime;\n\n item.isFullDay = item.startTime === 0 && item.endTime === 24 * 60;\n\n return item;\n });\n}\n\nexport function isBaseTariffOCPI(tariffElement: OcpiTariffElement) {\n return (\n //elements without restrictions are always base tariff\n !tariffElement?.restrictions ||\n // elements without time restirctions are also base tariff\n (!tariffElement?.restrictions?.start_date &&\n !tariffElement?.restrictions?.end_date &&\n !tariffElement?.restrictions?.start_time &&\n !tariffElement?.restrictions?.end_time &&\n !tariffElement?.restrictions?.day_of_week &&\n !tariffElement?.restrictions?.day_of_week)\n );\n}\n\nexport function isBaseTarif(tariffElement: TariffElement) {\n return (\n //elements without restrictions are always base tariff\n !tariffElement?.restrictions ||\n // elements without time restirctions are also base tariff\n (!tariffElement?.restrictions?.startDate &&\n !tariffElement?.restrictions?.endDate &&\n !tariffElement?.restrictions?.startTime &&\n !tariffElement?.restrictions?.startTime &&\n !tariffElement?.restrictions?.dayOfWeek)\n );\n}\n\ntype DynamicTariff = {\n date: Date;\n items: Timeslot[];\n};\n\ntype getDynamicTariffProps = {\n elements: TariffElement[];\n limit?: number;\n now: Date;\n};\n\nexport function getDynamicTariffOCPI(\n elements: OcpiTariffElement[],\n limit: number = 6,\n now: Date = new Date(),\n): DynamicTariff[] {\n const filteredElements = [...elements]\n .filter((c) => !isBaseTariffOCPI(c))\n .map((el) => {\n return {\n ...el,\n restrictions: {\n _startDate: new Date(\n `${el.restrictions.start_date}T${el.restrictions.start_time}`,\n ),\n ...el.restrictions,\n },\n };\n })\n .sort((a, b) => {\n return (\n a.restrictions._startDate.valueOf() -\n b.restrictions._startDate.valueOf()\n );\n })\n .filter((c) => {\n return (\n c.restrictions._startDate.valueOf() > now.valueOf() - 180 * 60 * 1000\n );\n })\n .slice(0, limit);\n\n const splitByDay = filteredElements.reduce((acc, curr) => {\n const day = curr.restrictions._startDate.getDate();\n acc[day] = {\n date: new Date(curr.restrictions.start_date),\n items: [...(acc[day]?.items || []), curr],\n };\n return acc;\n }, []);\n\n return Object.keys(splitByDay).map((key) => {\n const { date, items }: { date: Date; items: any[] } = splitByDay[key];\n const formattedItems = items\n .map(({ restrictions, ...c }) => {\n const { _startDate, ...partialRestrictions } = restrictions;\n return {\n ...c,\n restrictions: {\n ...partialRestrictions,\n },\n };\n })\n .map(convertToTimeSlot)\n .map((item) => {\n const isDayActive = getDay(now) === getDay(date);\n const currentTime = now.getHours() * 60 + now.getMinutes();\n\n const isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime - 1 >= currentTime;\n\n return {\n ...item,\n isActive,\n };\n });\n\n return {\n date,\n items: formattedItems,\n };\n });\n}\n\nexport function getDynamicTariff({\n elements,\n limit = 6,\n now = new Date(),\n}: getDynamicTariffProps): DynamicTariff[] {\n const filteredElements = [...elements]\n .filter((c) => !isBaseTarif(c))\n .map((el) => {\n // we are displaying these in the local timezone\n return {\n ...el,\n restrictions: {\n _startDate: new Date(\n `${el.restrictions.startDate}T${el.restrictions.startTime}`,\n ),\n ...el.restrictions,\n },\n };\n })\n .sort((a, b) => {\n return (\n a.restrictions._startDate.valueOf() -\n b.restrictions._startDate.valueOf()\n );\n })\n .filter((c) => {\n return (\n c.restrictions._startDate.valueOf() > now.valueOf() - 180 * 60 * 1000\n );\n })\n .slice(0, limit);\n\n const splitByDay = filteredElements.reduce((acc, curr) => {\n const day = curr.restrictions._startDate.getDate();\n acc[day] = {\n date: new Date(curr.restrictions.startDate),\n items: [...(acc[day]?.items || []), curr],\n };\n return acc;\n }, []);\n\n return Object.keys(splitByDay).map((key) => {\n const { date, items }: { date: Date; items: any[] } = splitByDay[key];\n const formattedItems = items\n .map(({ restrictions, ...c }) => {\n const { _startDate, ...partialRestrictions } = restrictions;\n return {\n ...c,\n restrictions: {\n ...partialRestrictions,\n },\n };\n })\n .map(convertToTimeSlot)\n .map((item) => {\n const isDayActive = getDay(now) === getDay(date);\n const currentTime = now.getHours() * 60 + now.getMinutes();\n\n const isActive =\n isDayActive &&\n item.startTime <= currentTime &&\n item.endTime - 1 >= currentTime;\n\n return {\n ...item,\n isActive,\n };\n });\n\n return {\n date,\n items: formattedItems,\n };\n });\n}\n\nexport function getScheduledTariff(\n elements: TariffElement[],\n locationTimezone: string,\n) {\n // TODO this timezone from locations\n const today = new Date();\n\n return [...elements].reduce(\n (acc, curr) => {\n const {\n startDate: start_date,\n endDate: end_date,\n dayOfWeek: day_of_week = [],\n } = (curr.restrictions as TariffRestrictions) || {};\n\n // filtering out elements without restrictions\n if (!Object.keys(curr.restrictions || {}).length) {\n return acc;\n }\n\n // TODO not sure this is correct consider timezone + should start_time be included\n const startDate = start_date ? new Date(start_date) : null;\n\n if (start_date) {\n if (startDate.valueOf() > Date.now()) {\n return acc;\n }\n }\n\n // TODO not sure this is correct consider timezone + should end_time be included\n const endDate = end_date ? new Date(end_date) : null;\n\n if (end_date) {\n if (endDate.valueOf() < Date.now()) {\n return acc;\n }\n }\n\n [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n ].forEach((day: DayOfWeek, index) => {\n // note this does not work for timezones yet, until we load a timezone library\n const { start, end } = getNextDayOfWeek(today, index, locationTimezone);\n\n if (startDate) {\n if (startDate.valueOf() > start.valueOf()) {\n return;\n }\n }\n\n if (endDate) {\n if (endDate.valueOf() < end.valueOf()) {\n return;\n }\n }\n if (day_of_week.length && !day_of_week.includes(day)) return;\n\n acc[day] = [...acc[day], curr];\n });\n return acc;\n },\n {\n MONDAY: [],\n TUESDAY: [],\n WEDNESDAY: [],\n THURSDAY: [],\n FRIDAY: [],\n SATURDAY: [],\n SUNDAY: [],\n },\n );\n}\n\nfunction omitFields(obj, fields) {\n return Object.keys(obj).reduce((acc, curr) => {\n if (!fields.includes(curr)) {\n acc[curr] = obj[curr];\n }\n return acc;\n }, {});\n}\n\nfunction isSame(a, b) {\n const aWithoutActive = a.map((item) => omitFields(item, [\"isActive\"]));\n const bWithoutActive = b.map((item) => omitFields(item, [\"isActive\"]));\n return JSON.stringify(aWithoutActive) === JSON.stringify(bWithoutActive);\n}\n\n//merge timeslots that have the same start and end time\nfunction mergeDuplicatesTimeslots(timeslots: Timeslot[]) {\n return timeslots.reduce((acc, cur) => {\n const existing = acc.find((item) => {\n return item.startTime === cur.startTime && item.endTime === cur.endTime;\n });\n if (existing) {\n existing.elements.push(...cur.elements);\n } else {\n acc.push(cur);\n }\n return acc;\n }, []);\n}\n\ntype Schedule = {\n days: DayOfWeek[];\n isActive: boolean;\n items: Timeslot[];\n};\n\n// A base rate element fills the gaps between time-restricted elements.\n// Parking-only base elements (max/min duration) are excluded — they are shown separately.\nfunction isRateBaseTariff(el: TariffElement): boolean {\n if (!isBaseTarif(el)) return false;\n return (el.priceComponents || []).some(\n (pc) => pc.type !== \"PARKING_TIME\" && (pc.price || 0) > 0,\n );\n}\n\n// OCPI tariffs commonly use 00:01 / 23:59 to mean \"from start of day\" / \"to end of day\".\n// Treat these as midnight bounds so the algorithm doesn't produce 1-minute noise segments.\nfunction isEdgeNoise(item: Timeslot): boolean {\n return (\n (item.startTime === 0 && item.endTime <= 1) ||\n (item.startTime >= 1439 && item.endTime === 24 * 60)\n );\n}\n\nexport function getSchedule(\n elements: TariffElement[],\n locationTimezone,\n now,\n): Schedule[] {\n const days = getScheduledTariff(\n elements.concat().filter((c) => !isBaseTarif(c)),\n locationTimezone,\n );\n\n const baseRateElement = elements.find(isRateBaseTariff);\n\n const { SUNDAY, ...rest } = days;\n\n // fixing order sunday has to be first for the getDay function to work\n const [firstDay, ...restDays] = Object.keys({\n SUNDAY: days.SUNDAY,\n ...rest,\n }).map((key, index) => {\n const dayElements = days[key];\n const isActive = getDay(now, locationTimezone) === index;\n\n const dayTimeslots = mergeDuplicatesTimeslots(\n dayElements.map(convertToTimeSlot),\n );\n // Inject the base rate so gaps between time-restricted slots show the base price\n // instead of stretching the adjacent slot across the gap.\n if (baseRateElement && dayTimeslots.length > 0) {\n dayTimeslots.unshift(convertToTimeSlot(baseRateElement));\n }\n\n return {\n day: key,\n isActive,\n items: getScheduleItems(dayTimeslots, isActive, now).filter(\n (item) => !isEdgeNoise(item),\n ),\n };\n });\n\n // switching order back\n return [...restDays, firstDay]\n .reduce((acc, curr, index, items) => {\n const prevEntry = acc[acc.length - 1];\n const prevTimeslots = prevEntry?.items;\n if (!prevTimeslots || !isSame(prevTimeslots, curr.items)) {\n const { day, ...rest } = curr;\n acc.push({\n ...rest,\n days: [curr.day],\n });\n } else {\n prevEntry.days = [prevEntry.days[0], curr.day];\n prevEntry.isActive = prevEntry.isActive || curr.isActive;\n }\n return acc;\n }, [])\n .filter((c) => {\n return !!c.items.length;\n });\n}\n\nexport function getConnectorTariffTypeV2(tariff: OcpiTariff) {\n if (!tariff) {\n return \"none\";\n }\n\n const hasPriceComponents = tariff.elements?.some(\n (element) => element?.price_components?.length > 0,\n );\n if (!hasPriceComponents) {\n return \"none\";\n }\n\n const baseTarifElements = tariff.elements.filter(isBaseTariffOCPI);\n if (baseTarifElements.length === tariff.elements.length) {\n return \"base\";\n }\n\n const dynamicTariffs = getDynamicTariffOCPI(tariff.elements, 6, new Date());\n\n if (dynamicTariffs.length) {\n return \"dynamic\";\n }\n\n return \"scheduled\";\n}\n\nexport function getConnectorTariffType(connectorTarif) {\n const { elements = [] } = connectorTarif;\n const hasPriceComponents = elements?.some(\n (element) => element?.priceComponents?.length > 0,\n );\n\n if (!hasPriceComponents) {\n return \"none\";\n }\n\n const baseTarifElements = elements.filter(isBaseTarif);\n\n if (baseTarifElements.length === elements.length) {\n return \"base\";\n }\n\n const dynamicTariffs = getDynamicTariff({\n elements,\n limit: 6,\n now: new Date(),\n });\n if (dynamicTariffs.length) {\n return \"dynamic\";\n }\n return \"scheduled\";\n}\n\n// Connector Power Type constants\nexport const ConnectorPowerType = {\n CONNECTOR_POWER_TYPE_UNSPECIFIED: \"CONNECTOR_POWER_TYPE_UNSPECIFIED\",\n CONNECTOR_POWER_TYPE_AC_1_PHASE: \"CONNECTOR_POWER_TYPE_AC_1_PHASE\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE: \"CONNECTOR_POWER_TYPE_AC_2_PHASE\",\n CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT:\n \"CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT\",\n CONNECTOR_POWER_TYPE_AC_3_PHASE: \"CONNECTOR_POWER_TYPE_AC_3_PHASE\",\n CONNECTOR_POWER_TYPE_DC: \"CONNECTOR_POWER_TYPE_DC\",\n CONNECTOR_POWER_TYPE_AC: \"CONNECTOR_POWER_TYPE_AC\",\n} as const;\n\nexport type ConnectorPowerType =\n (typeof ConnectorPowerType)[keyof typeof ConnectorPowerType];\n\nexport function calculateMaxPower(connector: {\n power: {\n maxWatts: number;\n maxVoltage: number;\n maxAmperage: number;\n };\n connectorPowerType: ConnectorPowerType;\n}): number {\n switch (connector.connectorPowerType) {\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_1_PHASE:\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_DC:\n return (connector.power.maxVoltage * connector.power.maxAmperage) / 1000;\n\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_2_PHASE:\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_2_PHASE_SPLIT:\n return (\n (connector.power.maxVoltage * connector.power.maxAmperage * 2) / 1000\n );\n\n case ConnectorPowerType.CONNECTOR_POWER_TYPE_AC_3_PHASE:\n return (\n (connector.power.maxVoltage * connector.power.maxAmperage * 3) / 1000\n );\n\n default:\n return 0;\n }\n}\n","import React from \"react\";\nimport styles from \"./Price.module.css\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { PriceComponent as PriceComponentType, TariffElement } from \"../../types\";\n\nfunction formatCurrency(value, props) {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: props.currency || \"EUR\",\n maximumFractionDigits: 2,\n }).format(value);\n}\n\ntype PriceComponentsProps = {\n priceComponent: PriceComponentType;\n restrictions?: TariffElement[\"restrictions\"];\n currency: string;\n};\n\nfunction getPrice(priceComponent: PriceComponentType) {\n const vat = !priceComponent.vat ? 0 : priceComponent.vat / 100;\n return priceComponent.price + priceComponent.price * vat;\n}\n\nexport default function PriceComponent({\n priceComponent,\n restrictions = {},\n currency,\n}: PriceComponentsProps) {\n const { t } = useMapContext();\n\n const stringByType = {\n ENERGY: \"tariffPriceComponent.energy\",\n TIME: \"tariffPriceComponent.time\",\n FLAT: \"tariffPriceComponent.flat\",\n PARKING_TIME: \"tariffPriceComponent.parkingTime\",\n };\n\n if (\n restrictions?.minDuration === 0 &&\n restrictions?.maxDuration &&\n priceComponent.type === \"PARKING_TIME\"\n ) {\n return (\n <div className={styles.tariffItem}>\n {t(\"tariffPriceComponent.parkingTimeWait\", {\n minutes: Math.floor(restrictions.maxDuration / 60),\n })}\n </div>\n );\n }\n\n if (!stringByType[priceComponent.type]) return null;\n\n return (\n <div className={styles.tariffItem}>\n {t(stringByType[priceComponent.type] as any, {\n total: formatCurrency(getPrice(priceComponent), {\n currency: currency,\n }),\n })}\n </div>\n );\n}\n\n","import React from \"react\";\n\nimport { PriceComponent, TariffElement } from \"../../types\";\n\nimport Price from \"../Price/Price\";\n\nimport styles from \"./PriceComponents.module.css\";\nimport { useMapContext } from \"../../contexts/Map\";\n\ntype PriceComponentsProps = {\n elements: TariffElement[];\n currency: string;\n};\n\nconst displayOrder = [\"ENERGY\", \"TIME\", \"FLAT\", \"PARKING_TIME\"];\n\ntype SortedElements = {\n type: PriceComponent[\"type\"];\n elements: {\n priceComponent: PriceComponent;\n restrictions: TariffElement[\"restrictions\"];\n }[];\n};\n\nexport default function PriceComponents({\n elements,\n currency,\n}: PriceComponentsProps) {\n const { t } = useMapContext();\n\n // get elements from by type\n const elementsByType = elements.reduce((acc, element) => {\n element.priceComponents.forEach((priceComponent) => {\n if (!acc[priceComponent.type]) acc[priceComponent.type] = [];\n acc[priceComponent.type].push({\n priceComponent,\n restrictions: element.restrictions,\n });\n });\n return acc;\n }, {});\n\n const sortedElements = Object.keys(elementsByType)\n .map((type) => {\n return {\n type,\n elements: elementsByType[type],\n };\n })\n .sort((a: any, b: any) => {\n const aIndex = displayOrder.indexOf(a.type);\n const bIndex = displayOrder.indexOf(b.type);\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n return aIndex - bIndex;\n }) as SortedElements[];\n\n return (\n <div className={styles.container}>\n {sortedElements.map(({ type, elements }, i) => {\n return elements.reverse().map((element, q) => {\n return (\n <Price\n currency={currency}\n key={`${type}-${i}-${q}`}\n priceComponent={element.priceComponent}\n restrictions={element.restrictions}\n />\n );\n });\n })}\n </div>\n );\n}\n\n","import React from \"react\";\n\nimport { CdrAdditionalCharge, PriceComponent, TariffElement } from \"../../types\";\n\nfunction formatCurrency(value, props) {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: props.currency || \"EUR\",\n maximumFractionDigits: 2,\n }).format(value);\n}\n\n// note reuse of price css module\nimport styles from \"../Price/Price.module.css\";\nimport { useMapContext } from \"../../contexts/Map\";\n\ntype CdrPriceComponentsProps = {\n cdrAdditionalCharge: CdrAdditionalCharge;\n currency: string;\n};\n\nfunction getPrice({ vat, price }: { vat?: number; price: number }) {\n const vatAmount = !vat ? 0 : vat / 100;\n return price + price * vatAmount;\n}\n\nexport default function CdrPriceComponent({\n cdrAdditionalCharge,\n currency,\n}: CdrPriceComponentsProps) {\n const { t } = useMapContext();\n\n const stringByType = {\n FLAT_FEE: t(\"cdrPrice.flatFee\", {\n total: formatCurrency(getPrice(cdrAdditionalCharge), {\n currency: currency,\n }),\n }),\n };\n\n return (\n <div className={styles.tariffItem}>\n {stringByType[cdrAdditionalCharge.type]}\n </div>\n );\n}\n\n","import React, { Fragment } from \"react\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { Tariff, CdrAdditionalCharge } from \"../../types\";\nimport { getSchedule, isBaseTarif, getDynamicTariff } from \"../../utils/ocpi\";\n\nimport styles from \"./ConnectorTariff.module.css\";\n\nimport PriceComponents from \"../PriceComponents/PriceComponents\";\nimport CdrPrice from \"../CdrPrice/CdrPrice\";\n\ntype ConnectorTariffProps = {\n tariff: Tariff;\n timezone?: string;\n compact?: boolean;\n cdrAdditionalCharges?: CdrAdditionalCharge[];\n};\n\nfunction formatTime(language, minutes: number) {\n const date = new Date(0);\n const hours = Math.floor(minutes / 60);\n const mins = minutes % 60;\n date.setHours(hours, mins, 0, 0);\n // hardcoding to nl for now, because i think people will understand it better in EU\n return date.toLocaleTimeString(\"nl\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nconst defaultTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nfunction daysForLocale(language: string) {\n const { format } = new Intl.DateTimeFormat(language, { weekday: \"long\" });\n return [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n ].reduce((acc, day, index) => {\n acc[day] = format(new Date(Date.UTC(2023, 9, index + 1)));\n return acc;\n }, {});\n}\n\nfunction CdrAdditionalChargeComponent({\n currency,\n cdrAdditionalCharges,\n}: {\n currency: string;\n cdrAdditionalCharges: CdrAdditionalCharge[];\n}) {\n return cdrAdditionalCharges.map((c) => {\n return <CdrPrice key={c.id} currency={currency} cdrAdditionalCharge={c} />;\n });\n}\n\nexport default function ConnectorTariff({\n timezone = defaultTimeZone,\n tariff,\n compact = true,\n cdrAdditionalCharges = [],\n}: ConnectorTariffProps) {\n const { t, language } = useMapContext();\n const i18nDays = daysForLocale(language);\n\n if (!tariff) return null;\n\n const elements = tariff.elements || [];\n const currency = tariff.currency || \"\";\n\n const hasPriceComponents = elements.some(\n (element) => element.priceComponents && element.priceComponents.length > 0,\n );\n\n const dynamicTariffs = getDynamicTariff({\n elements,\n limit: compact ? 6 : 40,\n now: new Date(),\n });\n\n const scheduledTariffs = dynamicTariffs.length\n ? []\n : getSchedule(elements, timezone, new Date());\n\n const baseTarifElements = elements.filter(isBaseTarif);\n\n if (!hasPriceComponents) {\n return (\n <>\n <div className={styles.tariffNote}>\n {t(\"tariffPriceComponent.noTariff\")}\n </div>\n {cdrAdditionalCharges.length > 0 && (\n <div className={styles.container}>\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n )}\n </>\n );\n }\n\n const isBaseActive = !scheduledTariffs.some((element) => element.isActive);\n\n if (scheduledTariffs.length) {\n return (\n <div className={styles.container}>\n {baseTarifElements.length > 0 && (\n <div className={[styles.tariffList, styles.bold].join(\" \")}>\n <div className={styles.tariffHeader}>\n {t(\"tariffPriceComponent.baseTariff\")}\n\n {isBaseActive && (\n <span className={styles.activeNowLabel}>\n {t(\"tariffPriceComponent.active\")}\n </span>\n )}\n </div>\n <PriceComponents elements={baseTarifElements} currency={currency} />\n\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n )}\n\n {scheduledTariffs.map((schedule) => {\n return (\n <div key={schedule.days.join(\"-\")} className={styles.tariffList}>\n <div className={styles.tariffHeader}>\n {schedule.days.map((day) => i18nDays[day]).join(\" - \")}\n\n {schedule.isActive && (\n <span className={styles.activeNowLabel}>\n {t(\"tariffPriceComponent.active\")}\n </span>\n )}\n </div>\n {schedule.items.map((item) => {\n return (\n <div\n key={item.startTime}\n className={item.isActive && styles.bold}\n >\n {!item.isFullDay && (\n <div className={styles.tariffLabel}>\n {formatTime(language, item.startTime)} -{\" \"}\n {formatTime(language, item.endTime)}\n </div>\n )}\n <div>\n <PriceComponents\n elements={item.elements}\n currency={currency}\n />\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <div className={styles.container}>\n {baseTarifElements.length > 0 && !dynamicTariffs?.length && (\n <div className={styles.tariffList}>\n <PriceComponents elements={baseTarifElements} currency={currency} />\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n </div>\n )}\n {dynamicTariffs.length > 0 && (\n <>\n {dynamicTariffs.map((dynamicTariff, index) => {\n return (\n <>\n <div className={styles.tariffHeader}>\n {t(\"tariffPriceComponent.dynamicTariffHeader\", {\n date: new Intl.DateTimeFormat(language, {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n }).format(dynamicTariff.date),\n })}\n </div>\n <div className={styles.dynamicTariffList}>\n {dynamicTariff.items.map((item, index) => {\n return (\n <div\n key={[item.startTime, item.endTime, index].join()}\n className={[\n styles.dynamicTariffItem,\n item.isActive && styles.bold,\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className={styles.dynamicTariffItemRange}>\n {formatTime(language, item.startTime)} &ndash;{\" \"}\n {formatTime(language, item.endTime)}\n </div>\n <PriceComponents\n elements={item.elements}\n currency={currency}\n />\n <CdrAdditionalChargeComponent\n currency={currency}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n {item.isActive && (\n <span className={styles.activeNowLabel}>\n {t(\"tariffPriceComponent.active\")}\n </span>\n )}\n </div>\n );\n })}\n </div>\n </>\n );\n })}\n </>\n )}\n </div>\n );\n}\n","import { Location, OcpiLocation } from \"../types\";\n\nexport function getNotes(\n t,\n location: Location | OcpiLocation,\n type: \"dynamic\" | \"scheduled\" | \"base\" | \"none\",\n) {\n const notes = [];\n\n if ((location as Location)?.customNote) {\n notes.push((location as Location)?.customNote);\n }\n\n if (type === \"none\") {\n return notes.length ? notes : [t(\"tariffNote.baseTariffNote\")];\n }\n\n if (type === \"dynamic\") {\n notes.push(t(\"tariffNote.dynamicScheduledTariffNote\"));\n }\n\n // is e-flux location\n if (\n (location as Location)?.infraProviderId === \"NLEFL\" ||\n (location as OcpiLocation)?.party_id === \"EFL\"\n ) {\n if (type === \"scheduled\") {\n notes.push(t(\"tariffNote.eFluxScheduledTariffNote\"));\n }\n // if only base tariff\n return notes;\n }\n\n if (type === \"scheduled\") {\n notes.push(\n t(\"tariffNote.baseTariffNote\"),\n t(\"tariffNote.scheduledTariffNote\"),\n );\n } else {\n notes.push(t(\"tariffNote.baseTariffNote\"));\n }\n\n return notes;\n}\n","import React from \"react\";\nimport styles from \"./locations.module.css\";\nimport StationIcon from \"../../assets/station-icon.svg\";\nimport BuildingIcon from \"../../assets/building-icon.svg\";\nimport CarIcon from \"../../assets/car-icon.svg\";\nimport BoltIcon from \"../../assets/bolt-icon.svg\";\nimport PricingIcon from \"../../assets/pricing-icon.svg\";\nimport { Info } from \"../../components/Icons/Icons\";\nimport {\n getStatusColorFromEvses,\n getLocationLabel,\n getStatusLabel,\n getSocketIcon,\n getSocketText,\n} from \"../../utils/formatters\";\nimport ConnectorTariff from \"../../components/ConnectorTariff/ConnectorTariff\";\nimport { getColorForStatus } from \"../../utils/location\";\nimport { getConnectorTariffType } from \"../../utils/ocpi\";\nimport { getNotes } from \"../../utils/notes\";\nimport { formatNumber } from \"../../utils/formatters\";\nimport { useMapContext } from \"../../contexts/Map\";\n\ninterface Props {\n currentLocation: any;\n setView(view: string, args?: any): void;\n evses: any[];\n cdrAdditionalCharges: any[];\n}\n\nconst LocationDetailsV1: React.FC<Props> = ({\n currentLocation,\n evses,\n setView,\n cdrAdditionalCharges,\n}) => {\n const { options, t, language } = useMapContext();\n const availableEvse = evses.filter((evse) => evse.status === \"AVAILABLE\");\n return (\n <div className={styles.container}>\n <div className={styles.row}>\n <img className={styles.icon} src={StationIcon} alt=\"station icon\" />\n <div className={styles.text}>\n {options.locationBaseUrl && (\n <a href={`${options.locationBaseUrl}/${currentLocation.id}`}>\n {currentLocation.name || \"-\"}\n </a>\n )}\n {!options.locationBaseUrl && currentLocation.name}\n </div>\n </div>\n <div className={styles.row}>\n <div className={styles.icon}>\n <div\n style={{\n background: getStatusColorFromEvses(currentLocation.evses),\n }}\n className={styles.statusIcon}\n />\n </div>\n <div className={styles.text}>\n {availableEvse.length} / {evses.length} {t(\"evse.statusAvailable\")}\n </div>\n </div>\n {currentLocation.subOperator?.name && (\n <div className={styles.row}>\n <img className={styles.icon} src={BuildingIcon} alt=\"building icon\" />\n <div className={styles.text}>{currentLocation.subOperator?.name}</div>\n </div>\n )}\n\n {currentLocation.parkingType !== \"UNKNOWN\" && (\n <div className={styles.row}>\n <img className={styles.icon} src={CarIcon} alt=\"parking icon\" />\n <div className={styles.text}>\n {getLocationLabel(t, currentLocation.parkingType)}\n </div>\n </div>\n )}\n\n {evses.map((evse) => {\n return (\n <div key={evse.evseId}>\n <hr className={styles.divider} />\n <div className={styles.row}>\n <img className={styles.icon} src={BoltIcon} alt=\"power icon\" />\n <div className={styles.text}>{evse.evseId}</div>\n </div>\n <div className={styles.row}>\n <div\n style={{\n background: getColorForStatus(evse.status),\n }}\n className={styles.statusIcon}\n />\n <div className={styles.text}>\n {[\n getStatusLabel(t, evse.status),\n evse.maxPower &&\n `${formatNumber(language, Math.floor(evse.maxPower))}kW`,\n ]\n .filter(Boolean)\n .join(\", \")}\n </div>\n </div>\n {evse.connectors.map((connector, i) => {\n const connectorType = getConnectorTariffType(connector.tariff);\n const notes = getNotes(t, currentLocation, connectorType);\n return (\n <div key={`connector-${i}`}>\n {\" \"}\n <div className={styles.row}>\n <img\n className={styles.icon}\n src={getSocketIcon(connector)}\n alt=\"socket type\"\n />\n <div className={styles.text}>\n {getSocketText(connector)}\n </div>\n </div>\n <div className={styles.row}>\n <img\n className={styles.icon}\n src={PricingIcon}\n alt=\"pricing\"\n />\n <div className={styles.text}>{t(\"evse.pricing\")}</div>\n </div>\n <ConnectorTariff\n tariff={connector.tariff}\n cdrAdditionalCharges={cdrAdditionalCharges}\n />\n {connectorType === \"dynamic\" && (\n <div\n className={styles.tariffNoteLink}\n onClick={() => {\n setView(\"dynamicTariff\", {\n connector: connector,\n evseId: evse.evseId,\n notes: notes,\n locationName: currentLocation.name,\n });\n }}\n >\n {t(\"location.viewAllHourlyPrices\")}\n </div>\n )}\n {notes.length > 0 && (\n <div\n className={styles.tariffNoteLink}\n onClick={() => {\n setView(\"tariffNote\", {\n locationName: currentLocation.name,\n evseId: evse.evseId,\n notes: getNotes(t, currentLocation, connectorType),\n });\n }}\n >\n <Info /> {t(\"tariffPriceComponent.viewTariff\")}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default LocationDetailsV1;\n","import React, { ReactNode, useState } from \"react\";\nimport styles from \"./LocationRow.module.css\";\nimport { ChevronDown } from \"../Icons/Icons\";\n\ninterface Props {\n icon: ReactNode;\n text: ReactNode;\n hint?: ReactNode;\n children?: ReactNode;\n defaultExpanded?: boolean;\n}\n\nconst rowStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n flexWrap: \"nowrap\",\n alignItems: \"center\",\n padding: \"5px 0\",\n minWidth: 0,\n};\n\nconst iconSlotStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 16,\n width: 16,\n flex: \"0 0 auto\",\n marginRight: 14,\n overflow: \"hidden\",\n};\n\nconst textSlotStyle: React.CSSProperties = {\n flex: \"1 1 auto\",\n minWidth: 0,\n fontSize: 12,\n lineHeight: \"16px\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst hintStyle: React.CSSProperties = {\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n fontWeight: \"normal\",\n};\n\nconst chevronSlotStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 10,\n width: 10,\n flex: \"0 0 auto\",\n marginLeft: 8,\n transition: \"transform 0.15s ease\",\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n};\n\nconst bodyStyle: React.CSSProperties = {\n padding: \"4px 0 6px 30px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n};\n\nexport const LocationRow: React.FC<Props> = ({\n icon,\n text,\n hint,\n children,\n defaultExpanded = false,\n}) => {\n const expandable = React.Children.count(children) > 0;\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const toggle = () => setExpanded((v) => !v);\n\n return (\n <>\n <div\n className={`${styles.row} ${expandable ? styles.expandable : \"\"}`}\n style={{\n ...rowStyle,\n cursor: expandable ? \"pointer\" : undefined,\n userSelect: expandable ? \"none\" : undefined,\n }}\n role={expandable ? \"button\" : undefined}\n tabIndex={expandable ? 0 : undefined}\n aria-expanded={expandable ? expanded : undefined}\n onClick={expandable ? toggle : undefined}\n onKeyDown={\n expandable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n toggle();\n }\n }\n : undefined\n }\n >\n <span className={styles.icon} style={iconSlotStyle}>\n {React.isValidElement(icon)\n ? React.cloneElement(icon as React.ReactElement<any>, {\n style: {\n maxWidth: 16,\n maxHeight: 16,\n display: \"block\",\n ...((icon as React.ReactElement<any>).props?.style || {}),\n },\n })\n : icon}\n </span>\n <div className={styles.text} style={textSlotStyle}>\n {text}\n {hint != null && (\n <span className={styles.textHint} style={hintStyle}>\n {\" · \"}\n {hint}\n </span>\n )}\n </div>\n {expandable && (\n <span\n className={`${styles.chevron} ${\n expanded ? styles.chevronOpen : \"\"\n }`}\n style={{\n ...chevronSlotStyle,\n transform: expanded ? \"rotate(180deg)\" : undefined,\n }}\n >\n <ChevronDown />\n </span>\n )}\n </div>\n {expandable && expanded && (\n <div className={styles.body} style={bodyStyle}>\n {children}\n </div>\n )}\n </>\n );\n};\n\nexport default LocationRow;\n","import React from \"react\";\nimport StationIcon from \"../../../assets/station-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiLocation } from \"../../../types\";\n\ninterface Props {\n location: OcpiLocation;\n}\n\nexport const LocationHeader: React.FC<Props> = ({ location }) => {\n const { options, mapKind } = useMapContext();\n const name = location?.name || \"-\";\n const id = location?.externalId || location?.id;\n\n let href: string | undefined;\n if (id && options.locationUrlTemplate && mapKind === \"cpo\") {\n href = options.locationUrlTemplate.replace(/{{\\s*locationId\\s*}}/g, id);\n } else if (id && options.locationBaseUrl) {\n href = `${options.locationBaseUrl}/${id}`;\n }\n\n const text = href ? (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {name}\n </a>\n ) : (\n name\n );\n return (\n <LocationRow\n icon={<img src={StationIcon} alt=\"station icon\" />}\n text={text}\n />\n );\n};\n\nexport default LocationHeader;\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport StatusDot from \"../../../components/StatusDot/StatusDot\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { getStatusColorFromEvses } from \"../../../utils/formatters\";\nimport { OcpiEvse } from \"../../../types\";\n\ninterface Props {\n evses: OcpiEvse[];\n}\n\nexport const AvailabilitySummary: React.FC<Props> = ({ evses }) => {\n const { t } = useMapContext();\n const available = evses?.filter((e) => e.status === \"AVAILABLE\") || [];\n return (\n <LocationRow\n icon={<StatusDot color={getStatusColorFromEvses(evses)} />}\n text={`${available.length} / ${evses?.length || 0} ${t(\"evse.statusAvailable\")}`}\n />\n );\n};\n\nexport default AvailabilitySummary;\n","import React from \"react\";\nimport BuildingIcon from \"../../../assets/building-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiSuboperator } from \"../../../types\";\nimport { LabelsType } from \"../../../i18n\";\nimport styles from \"./OperatorSection.module.css\";\n\ninterface Props {\n operator?: OcpiSuboperator;\n suboperator?: OcpiSuboperator;\n fallbackOperatorName?: string;\n fallbackSuboperatorName?: string;\n}\n\ntype Role = {\n labelKey: keyof LabelsType;\n name?: string;\n website?: string;\n logoUrl?: string;\n};\n\nconst OperatorBlock: React.FC<{ role: Role; showRoleLabel: boolean }> = ({\n role,\n showRoleLabel,\n}) => {\n const { t } = useMapContext();\n if (!role.name) return null;\n return (\n <div\n className={styles.block}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 2,\n marginBottom: 8,\n }}\n >\n {showRoleLabel && (\n <div\n className={styles.role}\n style={{\n fontSize: 11,\n textTransform: \"uppercase\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n letterSpacing: \"0.04em\",\n }}\n >\n {t(role.labelKey)}\n </div>\n )}\n <div\n className={styles.header}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}\n >\n {role.logoUrl && (\n <img\n className={styles.logo}\n src={role.logoUrl}\n alt={`${role.name} logo`}\n style={{\n maxHeight: 20,\n maxWidth: 80,\n width: \"auto\",\n height: \"auto\",\n objectFit: \"contain\",\n display: \"block\",\n }}\n />\n )}\n <div\n className={styles.name}\n style={{ fontSize: 13, fontWeight: 600 }}\n >\n {role.name}\n </div>\n </div>\n {role.website && (\n <a\n className={styles.website}\n href={role.website}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontSize: 12,\n color: \"var(--roadmap-brand-color)\",\n textDecoration: \"none\",\n wordBreak: \"break-all\",\n }}\n >\n {t(\"location.visitWebsite\")}\n </a>\n )}\n </div>\n );\n};\n\nexport const OperatorSection: React.FC<Props> = ({\n operator,\n suboperator,\n fallbackOperatorName,\n fallbackSuboperatorName,\n}) => {\n const { t } = useMapContext();\n\n const subRole: Role = {\n labelKey: \"location.suboperator\",\n name: suboperator?.name || fallbackSuboperatorName,\n website: suboperator?.website,\n logoUrl: suboperator?.logo?.thumbnail || suboperator?.logo?.url,\n };\n const opRole: Role = {\n labelKey: \"location.operator\",\n name: operator?.name || fallbackOperatorName,\n website: operator?.website,\n logoUrl: operator?.logo?.thumbnail || operator?.logo?.url,\n };\n\n const role = subRole.name ? subRole : opRole.name ? opRole : null;\n if (!role) return null;\n\n return (\n <LocationRow\n icon={<img src={BuildingIcon} alt=\"building icon\" />}\n text={t(\"location.operatorInfo\")}\n hint={role.name}\n >\n <OperatorBlock role={role} showRoleLabel={false} />\n </LocationRow>\n );\n};\n\nexport default OperatorSection;\n","import { LabelsType } from \"../i18n\";\n\nexport type RegularHours = {\n weekday: number;\n period_begin: string;\n period_end: string;\n};\n\nexport type ExceptionalPeriod = {\n period_begin: string;\n period_end: string;\n};\n\nexport type OpeningTimes = {\n twentyfourseven: boolean;\n regular_hours?: RegularHours[];\n exceptional_openings?: ExceptionalPeriod[];\n exceptional_closings?: ExceptionalPeriod[];\n};\n\ntype Translate = (key: keyof LabelsType, args?: Record<string, string>) => string;\n\nconst WEEKDAY_KEYS: Array<keyof LabelsType> = [\n \"weekday.mon\",\n \"weekday.tue\",\n \"weekday.wed\",\n \"weekday.thu\",\n \"weekday.fri\",\n \"weekday.sat\",\n \"weekday.sun\",\n];\n\nexport function getWeekdayLabel(t: Translate, weekday: number): string {\n const key = WEEKDAY_KEYS[weekday - 1];\n return key ? t(key) : \"\";\n}\n\n// Full, localised weekday name (e.g. \"Monday\") for an OCPI weekday (1=Mon..7=Sun).\nexport function getWeekdayFullLabel(language: string, weekday: number): string {\n if (weekday < 1 || weekday > 7) return \"\";\n // 2024-01-01 is a Monday, so day-of-month 1..7 maps to Mon..Sun.\n const ref = new Date(2024, 0, weekday);\n return new Intl.DateTimeFormat(language, { weekday: \"long\" }).format(ref);\n}\n\n// OCPI weekday (1=Mon..7=Sun) for the given date (defaults to now).\nexport function getTodayWeekday(now: Date = new Date()): number {\n return jsDayToOcpiWeekday(now.getDay());\n}\n\nexport function groupRegularHoursByWeekday(\n regularHours: RegularHours[] | undefined,\n): Record<number, RegularHours[]> {\n const grouped: Record<number, RegularHours[]> = {};\n for (let i = 1; i <= 7; i++) grouped[i] = [];\n (regularHours || []).forEach((entry) => {\n if (entry.weekday >= 1 && entry.weekday <= 7) {\n grouped[entry.weekday].push(entry);\n }\n });\n for (const day of Object.keys(grouped)) {\n grouped[Number(day)].sort((a, b) =>\n a.period_begin.localeCompare(b.period_begin),\n );\n }\n return grouped;\n}\n\nexport function formatPeriod(begin: string, end: string): string {\n return `${begin} - ${end}`;\n}\n\nfunction timeToMinutes(time: string): number {\n const [h, m] = time.split(\":\").map(Number);\n return h * 60 + (m || 0);\n}\n\nfunction jsDayToOcpiWeekday(jsDay: number): number {\n // JS: 0=Sun..6=Sat. OCPI: 1=Mon..7=Sun.\n return jsDay === 0 ? 7 : jsDay;\n}\n\nfunction isInExceptional(\n periods: ExceptionalPeriod[] | undefined,\n now: Date,\n): ExceptionalPeriod | null {\n if (!periods) return null;\n const t = now.getTime();\n for (const p of periods) {\n const begin = new Date(p.period_begin).getTime();\n const end = new Date(p.period_end).getTime();\n if (!isNaN(begin) && !isNaN(end) && t >= begin && t <= end) return p;\n }\n return null;\n}\n\nexport type OpenStatus = {\n open: boolean;\n // `day` is the OCPI weekday (1=Mon..7=Sun) of the change, set only when it\n // does not fall on the current day (so the UI can render e.g. \"Opens 9:00 Monday\").\n nextChange?: { time: string; label: \"opens\" | \"closes\"; day?: number };\n};\n\nexport function isOpenNow(\n openingTimes: OpeningTimes | undefined,\n now: Date = new Date(),\n): OpenStatus {\n if (!openingTimes) return { open: false };\n if (openingTimes.twentyfourseven) return { open: true };\n\n const todayWeekday = jsDayToOcpiWeekday(now.getDay());\n\n const closing = isInExceptional(openingTimes.exceptional_closings, now);\n if (closing) {\n const reopen = new Date(closing.period_end);\n const reopenWeekday = jsDayToOcpiWeekday(reopen.getDay());\n return {\n open: false,\n nextChange: {\n time: reopen.toISOString().slice(11, 16),\n label: \"opens\",\n day: reopenWeekday === todayWeekday ? undefined : reopenWeekday,\n },\n };\n }\n\n const opening = isInExceptional(openingTimes.exceptional_openings, now);\n if (opening) {\n return {\n open: true,\n nextChange: {\n time: new Date(opening.period_end).toISOString().slice(11, 16),\n label: \"closes\",\n },\n };\n }\n\n const grouped = groupRegularHoursByWeekday(openingTimes.regular_hours);\n const prevWeekday = todayWeekday === 1 ? 7 : todayWeekday - 1;\n const nowMinutes = now.getHours() * 60 + now.getMinutes();\n\n // Check overnight period from previous day still active\n for (const p of grouped[prevWeekday]) {\n const begin = timeToMinutes(p.period_begin);\n const end = timeToMinutes(p.period_end);\n if (end < begin || end === 0) {\n // wraps past midnight\n const endToday = end === 0 ? 24 * 60 : end;\n if (nowMinutes < endToday) {\n return {\n open: true,\n nextChange: { time: p.period_end, label: \"closes\" },\n };\n }\n }\n }\n\n // Check today's periods\n for (const p of grouped[todayWeekday]) {\n const begin = timeToMinutes(p.period_begin);\n const end = timeToMinutes(p.period_end);\n const wraps = end < begin || end === 0;\n const effectiveEnd = wraps ? 24 * 60 : end;\n if (nowMinutes >= begin && nowMinutes < effectiveEnd) {\n return {\n open: true,\n nextChange: { time: p.period_end, label: \"closes\" },\n };\n }\n if (nowMinutes < begin) {\n return {\n open: false,\n nextChange: { time: p.period_begin, label: \"opens\" },\n };\n }\n }\n\n // Find next opening across following days\n for (let i = 1; i <= 7; i++) {\n const wd = ((todayWeekday - 1 + i) % 7) + 1;\n const periods = grouped[wd];\n if (periods.length > 0) {\n return {\n open: false,\n nextChange: {\n time: periods[0].period_begin,\n label: \"opens\",\n day: wd === todayWeekday ? undefined : wd,\n },\n };\n }\n }\n\n return { open: false };\n}\n\nexport function getFutureExceptionalPeriods(\n periods: ExceptionalPeriod[] | undefined,\n now: Date = new Date(),\n): ExceptionalPeriod[] {\n if (!periods) return [];\n const t = now.getTime();\n return periods.filter((p) => {\n const end = new Date(p.period_end).getTime();\n return !isNaN(end) && end >= t;\n });\n}\n\nfunction ordinalSuffix(day: number): string {\n const rem100 = day % 100;\n if (rem100 >= 11 && rem100 <= 13) return \"th\";\n switch (day % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n}\n\n// Friendly, localised calendar date for an exceptional period (e.g. \"May 1st\"\n// in English, \"1. Mai\" in German). Used as the label in the exceptional rows.\nexport function formatExceptionalDate(language: string, dateStr: string): string {\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return dateStr;\n if (language === \"en\") {\n const month = new Intl.DateTimeFormat(\"en\", { month: \"long\" }).format(d);\n const day = d.getDate();\n return `${month} ${day}${ordinalSuffix(day)}`;\n }\n return new Intl.DateTimeFormat(language, {\n month: \"long\",\n day: \"numeric\",\n }).format(d);\n}\n\n// Time-of-day range for a single-day exceptional opening (e.g. \"09:00 - 21:00\").\nexport function formatExceptionalTime(p: ExceptionalPeriod): string {\n const begin = new Date(p.period_begin);\n const end = new Date(p.period_end);\n if (isNaN(begin.getTime()) || isNaN(end.getTime())) {\n return `${p.period_begin} - ${p.period_end}`;\n }\n return formatPeriod(\n begin.toISOString().slice(11, 16),\n end.toISOString().slice(11, 16),\n );\n}\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { Clock } from \"../../../components/Icons/Icons\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport {\n OpeningTimes,\n isOpenNow,\n groupRegularHoursByWeekday,\n formatPeriod,\n getWeekdayFullLabel,\n getTodayWeekday,\n getFutureExceptionalPeriods,\n formatExceptionalDate,\n formatExceptionalTime,\n} from \"../../../utils/openingTimes\";\nimport styles from \"./OpeningHours.module.css\";\n\ninterface Props {\n openingTimes?: OpeningTimes;\n chargingWhenClosed?: boolean;\n}\n\nexport const OpeningHours: React.FC<Props> = ({\n openingTimes,\n chargingWhenClosed,\n}) => {\n const { t, language } = useMapContext();\n if (!openingTimes) return null;\n\n const status = isOpenNow(openingTimes);\n const grouped = groupRegularHoursByWeekday(openingTimes.regular_hours);\n const futureClosings = getFutureExceptionalPeriods(\n openingTimes.exceptional_closings,\n );\n const futureOpenings = getFutureExceptionalPeriods(\n openingTimes.exceptional_openings,\n );\n\n const hasRegular = (openingTimes.regular_hours?.length ?? 0) > 0;\n const showWeek = openingTimes.twentyfourseven || hasRegular;\n\n // No opening information at all — hide the row rather than show a misleading\n // status. (The \"No hours set\" design state is not yet finalised, see PR notes.)\n if (\n !showWeek &&\n futureClosings.length === 0 &&\n futureOpenings.length === 0 &&\n !chargingWhenClosed\n ) {\n return null;\n }\n\n const isOpen = openingTimes.twentyfourseven || status.open;\n const today = getTodayWeekday();\n\n let hint: string | undefined;\n if (openingTimes.twentyfourseven) {\n hint = t(\"location.hours24\");\n } else if (status.nextChange) {\n const { time, label, day } = status.nextChange;\n if (label === \"closes\") {\n hint = t(\"location.closesAt\", { time });\n } else {\n hint = day\n ? t(\"location.opensAtDay\", {\n time,\n day: getWeekdayFullLabel(language, day),\n })\n : t(\"location.opensAt\", { time });\n }\n }\n\n const pillStyle: React.CSSProperties = {\n display: \"inline-block\",\n borderRadius: 8,\n padding: \"1px 8px\",\n fontSize: 12,\n lineHeight: \"16px\",\n fontWeight: 600,\n background: isOpen ? \"#e7f6ec\" : \"#fdecea\",\n color: isOpen ? \"#1b7a3d\" : \"#c5221f\",\n };\n const dayStyle: React.CSSProperties = {\n display: \"flex\",\n fontSize: 12,\n lineHeight: 1.5,\n };\n const dayLabelStyle: React.CSSProperties = { minWidth: 84 };\n const dayValueStyle: React.CSSProperties = { flex: \"1 1 auto\" };\n const todayStyle: React.CSSProperties = { fontWeight: 600 };\n const exceptionalStyle: React.CSSProperties = {\n fontSize: 12,\n marginTop: 8,\n paddingTop: 8,\n borderTop: \"1px solid var(--roadmap-border-color, #e5e5e5)\",\n };\n const exceptionalHeaderStyle: React.CSSProperties = {\n fontWeight: 600,\n marginBottom: 4,\n };\n const footnoteStyle: React.CSSProperties = {\n fontSize: 11,\n fontStyle: \"italic\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n marginTop: 6,\n };\n\n const pill = (\n <span\n className={`${styles.pill} ${isOpen ? styles.pillOpen : styles.pillClosed}`}\n style={pillStyle}\n >\n {isOpen ? t(\"location.open\") : t(\"location.closedNow\")}\n </span>\n );\n\n return (\n <LocationRow icon={<Clock />} text={pill} hint={hint}>\n {showWeek &&\n [1, 2, 3, 4, 5, 6, 7].map((wd) => {\n const isToday = wd === today;\n const value = openingTimes.twentyfourseven\n ? t(\"location.open24hours\")\n : grouped[wd].length === 0\n ? t(\"location.closed\")\n : grouped[wd]\n .map((p) => formatPeriod(p.period_begin, p.period_end))\n .join(\", \");\n return (\n <div\n key={wd}\n className={`${styles.day} ${isToday ? styles.today : \"\"}`}\n style={{ ...dayStyle, ...(isToday ? todayStyle : {}) }}\n >\n <div className={styles.dayLabel} style={dayLabelStyle}>\n {getWeekdayFullLabel(language, wd)}\n </div>\n <div className={styles.dayValue} style={dayValueStyle}>\n {value}\n </div>\n </div>\n );\n })}\n\n {futureClosings.length > 0 && (\n <div className={styles.exceptional} style={exceptionalStyle}>\n <div\n className={`${styles.exceptionalHeader} ${styles.exceptionalClosingHeader}`}\n style={{ ...exceptionalHeaderStyle, color: \"#c5221f\" }}\n >\n {t(\"location.exceptionalClosings\")}\n </div>\n {futureClosings.map((p, i) => (\n <div\n key={`c-${i}`}\n className={`${styles.day} ${styles.today}`}\n style={{ ...dayStyle, ...todayStyle }}\n >\n <div className={styles.dayLabel} style={dayLabelStyle}>\n {formatExceptionalDate(language, p.period_begin)}\n </div>\n <div className={styles.dayValue} style={dayValueStyle}>\n {t(\"location.closed\")}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {futureOpenings.length > 0 && (\n <div className={styles.exceptional} style={exceptionalStyle}>\n <div\n className={`${styles.exceptionalHeader} ${styles.exceptionalOpeningHeader}`}\n style={{ ...exceptionalHeaderStyle, color: \"#1b7a3d\" }}\n >\n {t(\"location.exceptionalOpenings\")}\n </div>\n {futureOpenings.map((p, i) => (\n <div\n key={`o-${i}`}\n className={`${styles.day} ${styles.today}`}\n style={{ ...dayStyle, ...todayStyle }}\n >\n <div className={styles.dayLabel} style={dayLabelStyle}>\n {formatExceptionalDate(language, p.period_begin)}\n </div>\n <div className={styles.dayValue} style={dayValueStyle}>\n {formatExceptionalTime(p)}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {chargingWhenClosed && (\n <div className={styles.footnote} style={footnoteStyle}>\n {t(\"location.chargingWhenClosed\")}\n </div>\n )}\n </LocationRow>\n );\n};\n\nexport default OpeningHours;\n","import React from \"react\";\nimport CarIcon from \"../../../assets/car-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { getLocationLabel } from \"../../../utils/formatters\";\nimport { OcpiLocationType } from \"../../../types\";\n\ninterface Props {\n parkingType?: OcpiLocationType;\n}\n\nexport const ParkingType: React.FC<Props> = ({ parkingType }) => {\n const { t } = useMapContext();\n if (!parkingType || parkingType === \"PARKING_TYPE_UNKNOWN\") return null;\n return (\n <LocationRow\n icon={<img src={CarIcon} alt=\"parking icon\" />}\n text={getLocationLabel(t, parkingType)}\n />\n );\n};\n\nexport default ParkingType;\n","import React from \"react\";\nimport CarIcon from \"../../../assets/car-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\n\ninterface Props {\n accessibility?: string;\n}\n\nexport const ChargingAccessibility: React.FC<Props> = ({ accessibility }) => {\n if (!accessibility) return null;\n return (\n <LocationRow\n icon={<img src={CarIcon} alt=\"accessibility icon\" />}\n text={\n accessibility === \"TESLA\"\n ? \"Tesla vehicles only\"\n : \"All electric vehicles\"\n }\n />\n );\n};\n\nexport default ChargingAccessibility;\n","import React from \"react\";\nimport BoltIcon from \"../../../assets/bolt-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { OcpiEvse } from \"../../../types\";\n\ninterface Props {\n evse: OcpiEvse;\n}\n\nexport const EvseHeader: React.FC<Props> = ({ evse }) => (\n <LocationRow\n icon={<img src={BoltIcon} alt=\"power icon\" />}\n text={evse.evse_id || \"\"}\n hint={evse.physical_reference || undefined}\n />\n);\n\nexport default EvseHeader;\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport StatusDot from \"../../../components/StatusDot/StatusDot\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { getStatusLabel, formatNumber } from \"../../../utils/formatters\";\nimport { getStatusColor } from \"../../../utils/status\";\nimport { calculateMaxPower, ConnectorPowerType } from \"../../../utils/ocpi\";\nimport { OcpiEvse } from \"../../../types\";\n\ninterface Props {\n evse: OcpiEvse;\n}\n\nexport const EvseStatus: React.FC<Props> = ({ evse }) => {\n const { t, language, options } = useMapContext();\n const first = evse.connectors[0];\n const maxKw =\n first?.power && first?.connectorPowerType\n ? `${formatNumber(\n language,\n Math.floor(\n calculateMaxPower(\n first as {\n power: {\n maxWatts: number;\n maxVoltage: number;\n maxAmperage: number;\n };\n connectorPowerType: ConnectorPowerType;\n },\n ),\n ),\n )}kW`\n : null;\n const text = [getStatusLabel(t, evse.status), maxKw]\n .filter(Boolean)\n .join(\", \");\n return (\n <LocationRow\n icon={\n <StatusDot\n color={getStatusColor(evse.status, \"roaming\", options?.version)}\n />\n }\n text={text}\n />\n );\n};\n\nexport default EvseStatus;\n","import React from \"react\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { getSocketIcon, getSocketText } from \"../../../utils/formatters\";\nimport { OcpiConnector } from \"../../../types\";\n\ninterface Props {\n connector: OcpiConnector;\n}\n\nexport const ConnectorSocket: React.FC<Props> = ({ connector }) => (\n <LocationRow\n icon={<img src={getSocketIcon(connector)} alt=\"socket type\" />}\n text={getSocketText(connector)}\n />\n);\n\nexport default ConnectorSocket;\n","import React from \"react\";\nimport PricingIcon from \"../../../assets/pricing-icon.svg\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport { useMapContext } from \"../../../contexts/Map\";\n\nexport const ConnectorPricing: React.FC = () => {\n const { t } = useMapContext();\n return (\n <LocationRow\n icon={<img src={PricingIcon} alt=\"pricing\" />}\n text={t(\"evse.pricing\")}\n />\n );\n};\n\nexport default ConnectorPricing;\n","import React from \"react\";\nimport ConnectorTariff from \"../../../components/ConnectorTariff/ConnectorTariff\";\nimport { CdrAdditionalCharge, OcpiTariff, Tariff } from \"../../../types\";\nimport { useMapContext } from \"../../../contexts/Map\";\n\nexport function transformTariff(tariff: OcpiTariff): Tariff {\n if (!tariff?.currency) return null;\n return {\n currency: tariff.currency,\n id: tariff.id,\n country_code: tariff.country_code,\n party_id: tariff.party_id,\n elements: (tariff?.elements || []).map((element) => ({\n priceComponents: (element?.price_components || []).map((component) => ({\n type: (() => {\n switch (component.type) {\n case \"FLAT\":\n return \"FLAT\";\n case \"TIME\":\n return \"TIME\";\n case \"ENERGY\":\n return \"ENERGY\";\n case \"PARKING_TIME\":\n return \"PARKING_TIME\";\n case \"CONGESTION_TIME\":\n return \"CONGESTION_TIME\";\n }\n })() as \"FLAT\" | \"TIME\" | \"ENERGY\" | \"PARKING_TIME\" | \"CONGESTION_TIME\",\n price: component.price,\n vat: component.vat,\n stepSize: component.step_size,\n })),\n ...(element?.restrictions\n ? {\n restrictions: {\n startTime: element?.restrictions?.start_time,\n endTime: element?.restrictions?.end_time,\n startDate: element?.restrictions?.start_date,\n endDate: element?.restrictions?.end_date,\n dayOfWeek: element?.restrictions?.day_of_week,\n minDuration: element?.restrictions?.min_duration,\n maxDuration: element?.restrictions?.max_duration,\n },\n }\n : {}),\n })),\n };\n}\n\ninterface Props {\n tariff: any;\n additionalCharges: CdrAdditionalCharge[];\n}\n\nconst TariffV2: React.FC<Props> = ({ tariff, additionalCharges }) => {\n const { t } = useMapContext();\n\n // Check if tariff has congestion pricing\n const hasCongestionPricing = tariff?.elements?.some((element: any) =>\n element?.price_components?.some((pc: any) => pc.type === \"CONGESTION_TIME\"),\n );\n\n return (\n <>\n {hasCongestionPricing && (\n <div\n style={{\n padding: \"0.8rem\",\n margin: \"0.8rem 0\",\n backgroundColor: \"#FFF4E5\",\n borderLeft: \"3px solid #FF9800\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n color: \"#663C00\",\n }}\n >\n {t(\"tariff.congestionPricing\")}\n </div>\n )}\n <ConnectorTariff\n tariff={transformTariff(tariff as any)}\n cdrAdditionalCharges={additionalCharges}\n />\n </>\n );\n};\n\nexport default TariffV2;\n","import { DayOfWeek, PriceComponent, Tariff, TariffElement } from \"../types\";\nimport { isBaseTarif } from \"./ocpi\";\n\nconst JS_DAY_TO_OCPI: DayOfWeek[] = [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n];\n\nfunction timeToMinutes(time: string): number {\n const [h, m] = time.split(\":\").map(Number);\n return h * 60 + (m || 0);\n}\n\nfunction isInTimeWindow(start: string, end: string, now: Date): boolean {\n const cur = now.getHours() * 60 + now.getMinutes();\n const s = timeToMinutes(start);\n const e = timeToMinutes(end);\n if (e < s) return cur >= s || cur < e; // overnight wrap\n return cur >= s && cur < e;\n}\n\nexport function isElementActive(el: TariffElement, now: Date): boolean {\n if (isBaseTarif(el)) return true;\n const r = el.restrictions!;\n if (r.startTime && r.endTime && !isInTimeWindow(r.startTime, r.endTime, now)) {\n return false;\n }\n if (r.dayOfWeek && r.dayOfWeek.length > 0) {\n const today = JS_DAY_TO_OCPI[now.getDay()];\n if (!r.dayOfWeek.includes(today)) return false;\n }\n if (r.startDate) {\n const d = new Date(r.startDate);\n if (!isNaN(d.getTime()) && now < d) return false;\n }\n if (r.endDate) {\n const d = new Date(r.endDate);\n if (!isNaN(d.getTime()) && now > d) return false;\n }\n return true;\n}\n\nexport type ActiveTariffSelection = {\n elements: TariffElement[];\n currency: string;\n};\n\nfunction bucketKey(type: string, el: TariffElement): string {\n const minD = el.restrictions?.minDuration ?? 0;\n const maxD = el.restrictions?.maxDuration ?? 0;\n return `${type}:${minD}:${maxD}`;\n}\n\nexport function getActiveTariffElements(\n tariff: Tariff | null | undefined,\n now: Date = new Date(),\n): ActiveTariffSelection {\n if (!tariff) return { elements: [], currency: \"\" };\n const all = tariff.elements || [];\n const active = all.filter((el) => isElementActive(el, now));\n\n type Winner = { element: TariffElement; pc: PriceComponent; isBase: boolean };\n const byBucket: Record<string, Winner> = {};\n\n active.forEach((el) => {\n const isBase = isBaseTarif(el);\n (el.priceComponents || []).forEach((pc) => {\n const key = bucketKey(pc.type, el);\n const existing = byBucket[key];\n if (!existing || (existing.isBase && !isBase)) {\n byBucket[key] = { element: el, pc, isBase };\n }\n });\n });\n\n const elementToPcs = new Map<TariffElement, PriceComponent[]>();\n const order: TariffElement[] = [];\n Object.values(byBucket).forEach(({ element, pc }) => {\n if (!elementToPcs.has(element)) {\n elementToPcs.set(element, []);\n order.push(element);\n }\n elementToPcs.get(element)!.push(pc);\n });\n\n const elements: TariffElement[] = order.map((el) => ({\n ...el,\n priceComponents: elementToPcs.get(el)!,\n }));\n\n return { elements, currency: tariff.currency || \"\" };\n}\n","import React from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { CdrAdditionalCharge, PriceComponent, TariffElement } from \"../../../types\";\nimport { LabelsType } from \"../../../i18n\";\n\nconst itemsRowStyle: React.CSSProperties = {\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 6,\n};\n\nconst itemStyle: React.CSSProperties = {\n fontSize: 12,\n lineHeight: 1.3,\n padding: \"1px 8px\",\n borderRadius: 6,\n background:\n \"color-mix(in srgb, var(--roadmap-brand-color, #6102d3) 12%, transparent)\",\n color: \"var(--roadmap-brand-color, #6102d3)\",\n border:\n \"1px solid color-mix(in srgb, var(--roadmap-brand-color, #6102d3) 30%, transparent)\",\n};\n\nconst itemHighlightStyle: React.CSSProperties = itemStyle;\n\nconst STRING_BY_TYPE: Record<string, keyof LabelsType> = {\n ENERGY: \"tariffPriceComponent.energy\",\n TIME: \"tariffPriceComponent.time\",\n FLAT: \"tariffPriceComponent.flat\",\n PARKING_TIME: \"tariffPriceComponent.parkingTime\",\n};\n\nconst DISPLAY_ORDER = [\"ENERGY\", \"TIME\", \"FLAT\", \"PARKING_TIME\"];\n\nfunction formatCurrency(value: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: currency || \"EUR\",\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction priceWithVat(pc: PriceComponent): number {\n const vat = pc.vat ? pc.vat / 100 : 0;\n return pc.price + pc.price * vat;\n}\n\ntype RenderablePc = {\n pc: PriceComponent;\n restrictions?: TariffElement[\"restrictions\"];\n};\n\nfunction isFreeParkingWindow(\n pc: PriceComponent,\n restrictions: TariffElement[\"restrictions\"] | undefined,\n): boolean {\n return (\n pc.type === \"PARKING_TIME\" &&\n (pc.price || 0) === 0 &&\n !!restrictions?.maxDuration &&\n (!restrictions.minDuration || restrictions.minDuration === 0)\n );\n}\n\nfunction collectAndSort(\n elements: TariffElement[],\n skipZero: boolean,\n): RenderablePc[] {\n const all: RenderablePc[] = [];\n elements.forEach((el) => {\n (el.priceComponents || []).forEach((pc) => {\n if (skipZero && (pc.price || 0) <= 0 && !isFreeParkingWindow(pc, el.restrictions)) {\n return;\n }\n all.push({ pc, restrictions: el.restrictions });\n });\n });\n return all.sort((a, b) => {\n const ai = DISPLAY_ORDER.indexOf(a.pc.type);\n const bi = DISPLAY_ORDER.indexOf(b.pc.type);\n if (ai === -1) return 1;\n if (bi === -1) return -1;\n return ai - bi;\n });\n}\n\ninterface Props {\n elements: TariffElement[];\n currency: string;\n skipZero?: boolean;\n highlight?: boolean;\n additionalCharges?: CdrAdditionalCharge[];\n}\n\nexport const TariffChips: React.FC<Props> = ({\n elements,\n currency,\n skipZero = true,\n highlight = false,\n additionalCharges = [],\n}) => {\n const { t } = useMapContext();\n const items = collectAndSort(elements, skipZero);\n const chipStyle = highlight ? itemHighlightStyle : itemStyle;\n if (items.length === 0 && additionalCharges.length === 0) return null;\n return (\n <div style={itemsRowStyle}>\n {items.map(({ pc, restrictions }, i) => {\n if (isFreeParkingWindow(pc, restrictions)) {\n return (\n <div key={`pc-${i}`} style={chipStyle}>\n {t(\"tariffPriceComponent.parkingTimeWait\", {\n minutes: String(Math.floor(restrictions!.maxDuration! / 60)),\n })}\n </div>\n );\n }\n const labelKey = STRING_BY_TYPE[pc.type];\n if (!labelKey) return null;\n return (\n <div key={`pc-${i}`} style={chipStyle}>\n {t(labelKey, {\n total: formatCurrency(priceWithVat(pc), currency),\n })}\n </div>\n );\n })}\n {additionalCharges.map((c) => {\n if (c.type !== \"FLAT_FEE\") return null;\n const total = c.price + (c.vat ? c.price * (c.vat / 100) : 0);\n return (\n <div key={`cdr-${c.id}`} style={chipStyle}>\n {t(\"cdrPrice.flatFee\", {\n total: formatCurrency(total, currency),\n })}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default TariffChips;\n","import React, { ReactNode } from \"react\";\nimport { CdrAdditionalCharge, TariffElement } from \"../../../types\";\nimport TariffChips from \"./TariffChips\";\n\ninterface Props {\n elements: TariffElement[];\n currency: string;\n label?: ReactNode;\n trailing?: ReactNode;\n highlight?: boolean;\n additionalCharges?: CdrAdditionalCharge[];\n onClick?: () => void;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"6px 0\",\n};\n\nconst headerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n fontSize: 12,\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n};\n\nconst rowStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n};\n\nexport const TariffLine: React.FC<Props> = ({\n elements,\n currency,\n label,\n trailing,\n highlight = false,\n additionalCharges,\n onClick,\n}) => {\n const interactive = !!onClick;\n const containerWithClick: React.CSSProperties = interactive\n ? { ...containerStyle, cursor: \"pointer\", userSelect: \"none\" }\n : containerStyle;\n\n const handleKey = (e: React.KeyboardEvent) => {\n if (!onClick) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <div\n style={containerWithClick}\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={onClick}\n onKeyDown={interactive ? handleKey : undefined}\n >\n {label != null && <div style={headerStyle}>{label}</div>}\n <div style={rowStyle}>\n <TariffChips\n elements={elements}\n currency={currency}\n highlight={highlight}\n additionalCharges={additionalCharges}\n />\n {trailing}\n </div>\n </div>\n );\n};\n\nexport default TariffLine;\n","import React, { useState } from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { Check } from \"../../../components/Icons/Icons\";\n\ninterface Props {\n type: string;\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n}\n\ntype Status = \"idle\" | \"submitting\" | \"done\" | \"error\";\n\nconst buttonStyle: React.CSSProperties = {\n fontSize: 12,\n fontWeight: 600,\n padding: \"4px 12px\",\n borderRadius: 6,\n cursor: \"pointer\",\n background: \"transparent\",\n color: \"var(--roadmap-brand-color, #6102d3)\",\n border:\n \"1px solid color-mix(in srgb, var(--roadmap-brand-color, #6102d3) 40%, transparent)\",\n};\n\nconst submittingStyle: React.CSSProperties = {\n ...buttonStyle,\n cursor: \"default\",\n opacity: 0.6,\n};\n\nconst doneStyle: React.CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n color: \"var(--roadmap-brand-color, #6102d3)\",\n};\n\nconst errorStyle: React.CSSProperties = {\n fontSize: 11,\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n marginTop: 6,\n};\n\nexport const ReportProblemButton: React.FC<Props> = ({\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n}) => {\n const { t, reportProblem } = useMapContext();\n const [status, setStatus] = useState<Status>(\"idle\");\n\n const submit = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (status === \"submitting\" || status === \"done\") return;\n setStatus(\"submitting\");\n try {\n await reportProblem?.({\n type,\n country_code,\n party_id,\n location_id,\n evse_uid,\n });\n setStatus(\"done\");\n } catch {\n setStatus(\"error\");\n }\n };\n\n if (status === \"done\") {\n return (\n <div style={doneStyle}>\n <Check />\n <span>{t(\"tariff.reportThanks\")}</span>\n </div>\n );\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={submit}\n disabled={status === \"submitting\"}\n style={status === \"submitting\" ? submittingStyle : buttonStyle}\n >\n {t(\"tariff.report\")}\n </button>\n {status === \"error\" && (\n <div style={errorStyle}>{t(\"tariff.reportError\")}</div>\n )}\n </>\n );\n};\n\nexport default ReportProblemButton;\n","import React from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport ReportProblemButton from \"./ReportProblemButton\";\n\ninterface Props {\n country_code: string;\n party_id: string;\n location_id: string;\n evse_uid: string;\n}\n\nconst containerStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: 10,\n padding: \"14px 14px\",\n marginTop: 6,\n borderRadius: 8,\n background:\n \"color-mix(in srgb, var(--roadmap-text-color, #2a2a2a) 4%, transparent)\",\n};\n\nconst textStyle: React.CSSProperties = {\n fontSize: 12,\n fontStyle: \"italic\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n};\n\nexport const NoTariff: React.FC<Props> = ({\n country_code,\n party_id,\n location_id,\n evse_uid,\n}) => {\n const { t } = useMapContext();\n return (\n <div style={containerStyle}>\n <div style={textStyle}>{t(\"tariffPriceComponent.noTariff\")}</div>\n <ReportProblemButton\n type=\"missing_tariff\"\n country_code={country_code}\n party_id={party_id}\n location_id={location_id}\n evse_uid={evse_uid}\n />\n </div>\n );\n};\n\nexport default NoTariff;\n","import React from \"react\";\nimport { ChevronRight } from \"../../../components/Icons/Icons\";\nimport { CdrAdditionalCharge, OcpiTariff } from \"../../../types\";\nimport { transformTariff } from \"./Tariff\";\nimport { getActiveTariffElements } from \"../../../utils/activeTariff\";\nimport TariffLine from \"./TariffLine\";\nimport NoTariff from \"./NoTariff\";\n\ninterface Props {\n tariff?: OcpiTariff;\n additionalCharges?: CdrAdditionalCharge[];\n evseId?: string;\n evseUid: string;\n countryCode: string;\n partyId: string;\n locationId: string;\n locationName: string;\n setView: (view: string, args?: any) => void;\n}\n\nconst chevronStyle: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n flex: \"0 0 auto\",\n};\n\nexport const ActiveTariff: React.FC<Props> = ({\n tariff,\n additionalCharges = [],\n evseId,\n evseUid,\n countryCode,\n partyId,\n locationId,\n locationName,\n setView,\n}) => {\n const transformed = tariff ? transformTariff(tariff) : null;\n const { elements: rawElements, currency } =\n getActiveTariffElements(transformed);\n\n const activeElements = rawElements\n .map((el) => ({\n ...el,\n priceComponents: (el.priceComponents || []).filter((pc) => {\n if ((pc.price || 0) > 0) return true;\n if (\n pc.type === \"PARKING_TIME\" &&\n el.restrictions?.maxDuration &&\n (!el.restrictions.minDuration || el.restrictions.minDuration === 0)\n ) {\n return true;\n }\n return false;\n }),\n }))\n .filter((el) => el.priceComponents.length > 0);\n\n const hasActiveTariff = !!transformed && activeElements.length > 0;\n\n if (!hasActiveTariff) {\n return (\n <>\n <NoTariff\n country_code={countryCode}\n party_id={partyId}\n location_id={locationId}\n evse_uid={evseUid}\n />\n {additionalCharges.length > 0 && (\n <TariffLine\n elements={[]}\n currency={currency}\n additionalCharges={additionalCharges}\n />\n )}\n </>\n );\n }\n\n const navigate = () =>\n setView(\"tariffDetails\", {\n tariff,\n additionalCharges,\n locationName,\n evseId,\n evseUid,\n countryCode,\n partyId,\n locationId,\n });\n\n return (\n <TariffLine\n elements={activeElements}\n currency={currency}\n highlight\n additionalCharges={additionalCharges}\n onClick={navigate}\n trailing={\n <span style={chevronStyle}>\n <ChevronRight />\n </span>\n }\n />\n );\n};\n\nexport default ActiveTariff;\n","import React from \"react\";\nimport ConnectorSocket from \"./ConnectorSocket\";\nimport ConnectorPricing from \"./ConnectorPricing\";\nimport ActiveTariff from \"./ActiveTariff\";\nimport {\n CdrAdditionalCharge,\n OcpiConnector,\n OcpiLocation,\n OcpiTariff,\n Tariff as TariffType,\n} from \"../../../types\";\n\ninterface Props {\n connector: OcpiConnector;\n tariffs?: TariffType[];\n cdrAdditionalCharges: CdrAdditionalCharge[];\n location: OcpiLocation;\n evseId?: string;\n evseUid?: string;\n setView: (view: string, args?: any) => void;\n}\n\nexport const Connector: React.FC<Props> = ({\n connector,\n tariffs,\n cdrAdditionalCharges,\n location,\n evseId,\n evseUid,\n setView,\n}) => {\n const tariff = tariffs?.find((tr) => tr.id === connector?.tariff_ids?.[0]);\n\n return (\n <>\n <ConnectorSocket connector={connector} />\n <ConnectorPricing />\n <ActiveTariff\n tariff={tariff as unknown as OcpiTariff}\n additionalCharges={cdrAdditionalCharges}\n evseId={evseId}\n evseUid={evseUid || \"\"}\n countryCode={location.country_code}\n partyId={location.party_id}\n locationId={location.id}\n locationName={location.name}\n setView={setView}\n />\n </>\n );\n};\n\nexport default Connector;\n","import React from \"react\";\nimport EvseHeader from \"./EvseHeader\";\nimport EvseStatus from \"./EvseStatus\";\nimport Connector from \"./Connector\";\nimport { getColorForStatus } from \"../../../utils/location\";\nimport {\n CdrAdditionalCharge,\n OcpiEvse,\n OcpiLocation,\n Tariff as TariffType,\n} from \"../../../types\";\n\ninterface Props {\n evse: OcpiEvse;\n tariffs?: TariffType[];\n cdrAdditionalCharges: CdrAdditionalCharge[];\n location: OcpiLocation;\n setView: (view: string, args?: any) => void;\n}\n\nconst cardStyle: React.CSSProperties = {\n background:\n \"color-mix(in srgb, var(--roadmap-text-color, #2a2a2a) 4%, transparent)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n marginTop: 12,\n};\n\nconst connectorBaseStyle: React.CSSProperties = {\n paddingLeft: 10,\n marginTop: 10,\n};\n\nexport const Evse: React.FC<Props> = ({\n evse,\n tariffs,\n cdrAdditionalCharges,\n location,\n setView,\n}) => {\n const statusColor = getColorForStatus(evse.status);\n const connectorStyle: React.CSSProperties = {\n ...connectorBaseStyle,\n borderLeft: `3px solid ${statusColor}`,\n borderRadius: 2,\n };\n\n return (\n <div style={cardStyle}>\n <EvseHeader evse={evse} />\n <EvseStatus evse={evse} />\n {evse.connectors.map((connector, i) => (\n <div key={`connector-${i}`} style={connectorStyle}>\n <Connector\n connector={connector}\n tariffs={tariffs}\n cdrAdditionalCharges={cdrAdditionalCharges}\n location={location}\n evseId={evse.evse_id}\n evseUid={evse.uid}\n setView={setView}\n />\n </div>\n ))}\n </div>\n );\n};\n\nexport default Evse;\n","import React from \"react\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiDisplayText } from \"../../../types\";\n\ninterface Props {\n directions?: OcpiDisplayText[];\n}\n\nconst containerStyle: React.CSSProperties = {\n fontSize: 12,\n fontStyle: \"italic\",\n lineHeight: 1.5,\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n padding: \"12px 0 12px 12px\",\n margin: \"8px 0\",\n borderLeft:\n \"3px solid color-mix(in srgb, var(--roadmap-text-color, #2a2a2a) 20%, transparent)\",\n};\n\nfunction pickText(\n directions: OcpiDisplayText[],\n language: string,\n): string | undefined {\n if (!directions || directions.length === 0) return undefined;\n const lang = (language || \"\").toLowerCase();\n const match = directions.find((d) => d.language?.toLowerCase() === lang);\n if (match) return match.text;\n const en = directions.find((d) => d.language?.toLowerCase() === \"en\");\n return (en || directions[0])?.text;\n}\n\nexport const Directions: React.FC<Props> = ({ directions }) => {\n const { language } = useMapContext();\n const text = pickText(directions || [], language);\n if (!text) return null;\n return <div style={containerStyle}>{text}</div>;\n};\n\nexport default Directions;\n","import React from \"react\";\nimport styles from \"../locations.module.css\";\nimport LocationHeader from \"./LocationHeader\";\nimport AvailabilitySummary from \"./AvailabilitySummary\";\nimport OperatorSection from \"./OperatorSection\";\nimport OpeningHours from \"./OpeningHours\";\nimport ParkingType from \"./ParkingType\";\nimport ChargingAccessibility from \"./ChargingAccessibility\";\nimport Evse from \"./Evse\";\nimport Directions from \"./Directions\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { OcpiLocation } from \"../../../types\";\n\ninterface Props {\n currentLocation: OcpiLocation;\n setView: (view: string, args?: any) => void;\n}\n\nexport const Location: React.FC<Props> = ({ currentLocation, setView }) => {\n const { options, mapKind } = useMapContext();\n\n return (\n <div className={styles.container}>\n {mapKind === \"cpo\" && (\n <div className={styles.publishingMode}>\n {currentLocation?.publish ? \"Public location\" : \"Private location\"}\n </div>\n )}\n\n <Directions directions={currentLocation.directions} />\n <LocationHeader location={currentLocation} />\n <AvailabilitySummary evses={currentLocation.evses} />\n\n <OperatorSection\n operator={currentLocation.operator}\n suboperator={currentLocation.suboperator || currentLocation.subOperator}\n fallbackOperatorName={\n currentLocation.operator_name || currentLocation.operatorName\n }\n fallbackSuboperatorName={\n currentLocation.suboperator_name || currentLocation.suboperatorName\n }\n />\n\n <OpeningHours\n openingTimes={currentLocation.opening_times}\n chargingWhenClosed={currentLocation.charging_when_closed}\n />\n\n <ParkingType parkingType={currentLocation.parkingType} />\n <ChargingAccessibility accessibility={currentLocation.charging_accessibility} />\n\n {currentLocation.evses?.map((evse) => (\n <Evse\n key={`${evse.evse_id}-${evse.uid}`}\n evse={evse}\n tariffs={currentLocation.tariffs}\n cdrAdditionalCharges={currentLocation.cdrAdditionalCharges || []}\n location={currentLocation}\n setView={setView}\n />\n ))}\n </div>\n );\n};\n\nexport default Location;\n","import React, { useEffect, useState } from \"react\";\nimport styles from \"./locations.module.css\";\nimport LocationPlaceholder from \"../../components/LocationPlaceholder/LocationPlaceholder\";\nimport { ChevronLeft, ChevronRight } from \"../../components/Icons/Icons\";\nimport Debug from \"../../components/Debug/Debug\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport { useStackContext } from \"../../components/Stack/Stack\";\nimport LocationDetailsV1 from \"./LocationDetailsV1\";\nimport Location from \"./v2/Location\";\nimport { OcpiLocation } from \"../../types\";\nimport { atLeast } from \"../../utils/version\";\n\ninterface Props {}\n\nconst Locations: React.FC<Props> = () => {\n const { setView } = useStackContext();\n const { locations, locationsStatus, options } = useMapContext();\n const [locationIndex, setLocationIndex] = useState(0);\n\n useEffect(() => {\n setLocationIndex(0);\n }, [locations]);\n\n const currentLocation = locations[locationIndex];\n\n if (locationsStatus.type === \"loading\" || !currentLocation) {\n return (\n <div className={styles.container}>\n <LocationPlaceholder />\n </div>\n );\n }\n\n const { evses = [], cdrAdditionalCharges } = currentLocation;\n\n const canNext = locationIndex < locations.length - 1;\n const canPrev = locationIndex > 0;\n\n const debugMode = window.location?.search?.includes(\"debug\");\n\n const label = () => {\n switch (options.version) {\n case \"v2\":\n return [currentLocation?.address, currentLocation?.city];\n default:\n //@ts-ignore\n return [currentLocation?.address, currentLocation?.city];\n }\n };\n const isV2 = atLeast(options.version, \"v2\");\n\n return (\n <>\n {debugMode && currentLocation && <Debug location={currentLocation} />}\n <div className={styles.headerContainer}>\n <div className={styles.header}>\n {locations.length > 1 && (\n <div className={styles.pagingation}>\n <span>\n {locationIndex + 1} / {locations.length}\n </span>\n\n <button\n disabled={!canPrev}\n onClick={() => {\n setLocationIndex(Math.max(0, locationIndex - 1));\n }}\n >\n <ChevronLeft />\n </button>\n <button\n disabled={!canNext}\n onClick={() =>\n setLocationIndex(\n Math.min(locations.length - 1, locationIndex + 1),\n )\n }\n >\n <ChevronRight />\n </button>\n </div>\n )}\n {label().filter(Boolean).join(\", \")}\n </div>\n </div>\n {!isV2 && (\n <LocationDetailsV1\n setView={setView}\n cdrAdditionalCharges={cdrAdditionalCharges}\n currentLocation={currentLocation}\n evses={evses}\n />\n )}\n {isV2 && (\n <Location\n setView={setView}\n currentLocation={currentLocation as unknown as OcpiLocation}\n />\n )}\n </>\n );\n};\n\nexport default Locations;\n","import React from \"react\";\n\nimport styles from \"./BackButton.module.css\";\n\nimport { ChevronLeft } from \"../Icons/Icons\";\nimport { useMapContext } from \"../../contexts/Map\";\n\nexport default function BackButton({ onClick = () => {} }) {\n const { t } = useMapContext();\n return (\n <button onClick={onClick} className={styles.backButton}>\n <ChevronLeft />\n {t(\"backButton.backTo\")}\n </button>\n );\n}\n","import React, { useEffect, useState, useTransition } from \"react\";\n\nimport { useStackContext } from \"../../components/Stack/Stack\";\n\nimport BackButton from \"../../components/BackButton/BackButton\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport styles from \"./locations.module.css\";\n\nimport BoltIcon from \"../../assets/bolt-icon.svg\";\n\nexport default function TariffNote() {\n const { t } = useMapContext();\n const { current, setView } = useStackContext();\n const { notes = [], evseId, locationName } = current?.args || {};\n\n return (\n <>\n <div className={styles.headerContainer}>\n <div\n className={styles.header}\n onClick={() => setView(\"locations\")}\n style={{ cursor: \"pointer\" }}\n >\n <BackButton />\n {locationName?.text || locationName}\n </div>\n </div>\n <div className={styles.container}>\n <div className={styles.subheader}>{t(\"tariffNote.subHeader\")}</div>\n\n {evseId && (\n <div className={styles.row}>\n <img className={styles.icon} src={BoltIcon} alt=\"power icon\" />\n <div className={styles.text}>{evseId}</div>\n </div>\n )}\n\n {notes.map((note) => (\n <p className={styles.note} key={note}>\n {note}\n </p>\n ))}\n </div>\n </>\n );\n}\n","import { useStackContext } from \"../../components/Stack/Stack\";\n\nimport BackButton from \"../../components/BackButton/BackButton\";\nimport { useMapContext } from \"../../contexts/Map\";\nimport styles from \"./locations.module.css\";\nimport { Info } from \"../../components/Icons/Icons\";\nimport BoltIcon from \"../../assets/bolt-icon.svg\";\nimport ConnectorTariff from \"../../components/ConnectorTariff/ConnectorTariff\";\nimport TariffV2 from \"./v2/Tariff\";\n\nexport default function DynamicTariffs() {\n const { t } = useMapContext();\n const { current, setView } = useStackContext();\n const { connector, tariff, additionalCharges, locationName, evseId, notes } =\n current?.args || {};\n\n const connectorTariff = tariff || connector?.tariff;\n\n if (!connectorTariff) return null;\n\n return (\n <>\n <div className={styles.headerContainer}>\n <div\n className={styles.header}\n onClick={() => setView(\"locations\")}\n style={{ cursor: \"pointer\" }}\n >\n <BackButton />\n {locationName}\n </div>\n </div>\n <div className={styles.container}>\n <div className={styles.subheader}>{t(\"dynamicTariffs.subHeader\")}</div>\n <div className={styles.row}>\n <img className={styles.icon} src={BoltIcon} alt=\"power icon\" />\n <div className={styles.text}>{evseId}</div>\n </div>\n {tariff && (\n <TariffV2 tariff={tariff} additionalCharges={additionalCharges} />\n )}\n {connector.tariff && (\n <ConnectorTariff tariff={connector.tariff} compact={false} />\n )}\n <div\n className={styles.tariffNoteLink}\n onClick={() => {\n setView(\"tariffNote\", {\n locationName: locationName,\n evseId: evseId,\n notes: notes,\n });\n }}\n >\n <Info /> {t(\"tariffPriceComponent.viewTariff\")}\n </div>\n </div>\n </>\n );\n}\n","import React from \"react\";\nimport { useStackContext } from \"../../../components/Stack/Stack\";\nimport BackButton from \"../../../components/BackButton/BackButton\";\nimport LocationRow from \"../../../components/LocationRow/LocationRow\";\nimport BoltIcon from \"../../../assets/bolt-icon.svg\";\nimport { useMapContext } from \"../../../contexts/Map\";\nimport { transformTariff } from \"./Tariff\";\nimport TariffLine from \"./TariffLine\";\nimport NoTariff from \"./NoTariff\";\nimport { CdrAdditionalCharge, TariffElement } from \"../../../types\";\nimport {\n getSchedule,\n getDynamicTariff,\n isBaseTarif,\n} from \"../../../utils/ocpi\";\nimport styles from \"../locations.module.css\";\n\nconst defaultTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\nconst sectionStyle: React.CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n marginTop: 14,\n};\n\nconst sectionHeaderStyle: React.CSSProperties = {\n fontSize: 12,\n fontWeight: 600,\n textTransform: \"capitalize\",\n lineHeight: 1.4,\n};\n\nconst descriptionStyle: React.CSSProperties = {\n fontSize: 12,\n lineHeight: 1.5,\n color: \"var(--roadmap-text-color, #2a2a2a)\",\n marginTop: 8,\n};\n\nconst metaStyle: React.CSSProperties = {\n fontSize: 11,\n color: \"var(--roadmap-muted-color, #6a6a6a)\",\n marginTop: 6,\n};\n\nfunction formatTime(minutes: number): string {\n const date = new Date(0);\n date.setHours(Math.floor(minutes / 60), minutes % 60, 0, 0);\n return date.toLocaleTimeString(\"nl\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction daysForLocale(language: string): Record<string, string> {\n const { format } = new Intl.DateTimeFormat(language, { weekday: \"long\" });\n return [\n \"SUNDAY\",\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n \"SATURDAY\",\n ].reduce(\n (acc, day, index) => {\n acc[day] = format(new Date(Date.UTC(2023, 9, index + 1)));\n return acc;\n },\n {} as Record<string, string>,\n );\n}\n\nfunction elementHasPaidComponents(el: TariffElement): boolean {\n return (el.priceComponents || []).some((pc) => {\n if ((pc.price || 0) > 0) return true;\n // Keep zero-priced PARKING_TIME with maxDuration — it represents the free parking window.\n if (\n pc.type === \"PARKING_TIME\" &&\n el.restrictions?.maxDuration &&\n (!el.restrictions.minDuration || el.restrictions.minDuration === 0)\n ) {\n return true;\n }\n return false;\n });\n}\n\nfunction pickAltText(\n altTexts: Array<{ language: string; text: string }> | undefined,\n language: string,\n): string | undefined {\n if (!altTexts || altTexts.length === 0) return undefined;\n const match = altTexts.find(\n (a) => a.language?.toLowerCase() === language?.toLowerCase(),\n );\n return (match || altTexts[0])?.text;\n}\n\nfunction formatLastUpdated(iso: string | undefined, language: string): string | undefined {\n if (!iso) return undefined;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return undefined;\n return new Intl.DateTimeFormat(language, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(d);\n}\n\nexport default function TariffDetails() {\n const { t, language } = useMapContext();\n const { current, setView } = useStackContext();\n const {\n tariff,\n additionalCharges,\n locationName,\n evseId,\n evseUid,\n countryCode,\n partyId,\n locationId,\n } = current?.args || {};\n\n if (!tariff) return null;\n const transformed = transformTariff(tariff);\n const reportProps = {\n country_code: countryCode || tariff.country_code || \"\",\n party_id: partyId || tariff.party_id || \"\",\n location_id: locationId || \"\",\n evse_uid: evseUid || \"\",\n };\n\n const description = pickAltText(tariff.tariff_alt_text, language);\n const lastUpdated = formatLastUpdated(tariff.last_updated, language);\n\n const renderHeader = () => (\n <div className={styles.headerContainer}>\n <div\n className={styles.header}\n onClick={() => setView(\"locations\")}\n style={{ cursor: \"pointer\" }}\n >\n <BackButton />\n {locationName}\n </div>\n </div>\n );\n\n if (!transformed) {\n return (\n <>\n {renderHeader()}\n <div className={styles.container}>\n <NoTariff {...reportProps} />\n </div>\n </>\n );\n }\n\n const elements = (transformed.elements || []).filter(\n elementHasPaidComponents,\n );\n const currency = transformed.currency || \"\";\n const charges: CdrAdditionalCharge[] = additionalCharges || [];\n\n const baseElements = elements.filter(isBaseTarif);\n const dynamicTariffs = getDynamicTariff({\n elements,\n limit: 40,\n now: new Date(),\n });\n const scheduledTariffs = dynamicTariffs.length\n ? []\n : getSchedule(elements, defaultTimeZone, new Date());\n\n const isBaseActive = !scheduledTariffs.some((s) => s.isActive);\n const i18nDays = daysForLocale(language);\n\n return (\n <>\n {renderHeader()}\n <div className={styles.container}>\n <div className={styles.subheader}>{t(\"tariff.fullDetailsHeader\")}</div>\n {evseId && (\n <LocationRow\n icon={<img src={BoltIcon} alt=\"power icon\" />}\n text={evseId}\n />\n )}\n\n {description && <div style={descriptionStyle}>{description}</div>}\n {lastUpdated && (\n <div style={metaStyle}>\n {t(\"tariff.lastUpdated\", { date: lastUpdated })}\n </div>\n )}\n\n {baseElements.length > 0 && (\n <div style={sectionStyle}>\n <TariffLine\n elements={baseElements}\n currency={currency}\n highlight={scheduledTariffs.length > 0 && isBaseActive}\n additionalCharges={charges}\n />\n </div>\n )}\n\n {scheduledTariffs.map((schedule) => (\n <div key={schedule.days.join(\"-\")} style={sectionStyle}>\n <div style={sectionHeaderStyle}>\n {schedule.days.map((d) => i18nDays[d]).join(\" – \")}\n </div>\n {schedule.items.map((item, i) => (\n <TariffLine\n key={i}\n elements={item.elements || []}\n currency={currency}\n highlight={!!item.isActive}\n label={\n !item.isFullDay\n ? `${formatTime(item.startTime)} – ${formatTime(item.endTime)}`\n : undefined\n }\n />\n ))}\n </div>\n ))}\n\n {dynamicTariffs.map((dyn, i) => (\n <div key={i} style={sectionStyle}>\n <div style={sectionHeaderStyle}>\n {t(\"tariffPriceComponent.dynamicTariffHeader\", {\n date: new Intl.DateTimeFormat(language, {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n }).format(dyn.date),\n })}\n </div>\n {dyn.items.map((item, j) => (\n <TariffLine\n key={j}\n elements={item.elements || []}\n currency={currency}\n highlight={!!item.isActive}\n label={`${formatTime(item.startTime)} – ${formatTime(item.endTime)}`}\n />\n ))}\n </div>\n ))}\n\n {scheduledTariffs.length === 0 &&\n dynamicTariffs.length === 0 &&\n baseElements.length === 0 && <NoTariff {...reportProps} />}\n </div>\n </>\n );\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='10'%20height='11'%20viewBox='0%200%2010%2011'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M6.48751%205.99758L9.85376%202.63133C10.0484%202.43664%2010.0484%202.1207%209.85376%201.9257L9.07157%201.14351C8.87688%200.948826%208.56095%200.948826%208.36595%201.14351L5.00001%204.51008L1.63376%201.14383C1.43907%200.949138%201.12313%200.949138%200.928135%201.14383L0.14626%201.9257C-0.0484277%202.12039%20-0.0484277%202.43633%200.14626%202.63133L3.51251%205.99758L0.14626%209.36383C-0.0484277%209.55851%20-0.0484277%209.87445%200.14626%2010.0695L0.928447%2010.8516C1.12313%2011.0463%201.43907%2011.0463%201.63407%2010.8516L5.00001%207.48508L8.36626%2010.8513C8.56095%2011.046%208.87688%2011.046%209.07188%2010.8513L9.85407%2010.0691C10.0488%209.87445%2010.0488%209.55851%209.85407%209.36351L6.48751%205.99758Z'%20fill='black'/%3e%3c/svg%3e\"","import React from \"react\";\n\nimport CloseIcon from \"../../assets/close-icon.svg\";\nimport styles from \"./CloseButton.module.css\";\n\nexport default function CloseButton({ onClick }) {\n return (\n <button onClick={onClick} className={styles.closeButton}>\n <img src={CloseIcon} />\n </button>\n );\n}\n","import React, { useState } from \"react\";\n\nimport Locations from \"./Locations\";\nimport TariffNote from \"./TariffNote\";\nimport DynamicTariff from \"./DynamicTariffs\";\nimport TariffDetails from \"./v2/TariffDetails\";\nimport Stack from \"../../components/Stack\";\nimport CloseButton from \"../../components/CloseButton/CloseButton\";\nimport SideBarContainer from \"../../components/SidebarContainer/SidebarContainer\";\nimport { useStackContext } from \"../../components/Stack/Stack\";\n\nexport default function LocationsScreeen() {\n const [view, setView] = useState<string>(\"locations\");\n const { setView: setParentView } = useStackContext();\n\n return (\n <Stack name=\"locations\" currentView={view} onViewChange={setView}>\n <Stack.View name=\"locations\">\n <SideBarContainer>\n <CloseButton onClick={() => setParentView(\"none\")} />\n <Locations />\n </SideBarContainer>\n </Stack.View>\n\n <Stack.View name=\"tariffNote\">\n <SideBarContainer>\n <TariffNote />\n </SideBarContainer>\n </Stack.View>\n <Stack.View name=\"dynamicTariff\">\n <SideBarContainer>\n <DynamicTariff />\n </SideBarContainer>\n </Stack.View>\n <Stack.View name=\"tariffDetails\">\n <SideBarContainer>\n <TariffDetails />\n </SideBarContainer>\n </Stack.View>\n </Stack>\n );\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%20fill='currentColor'%20xmlns='http://www.w3.org/2000/svg'%20%3e%3cpath%20d='M14.4985%200H1.50178C0.169343%200%20-0.502939%201.61659%200.441124%202.56066L5.5%207.62131V13C5.5%2013.4721%205.72228%2013.9167%206.1%2014.25L8.1%2015.7208C9.07728%2016.4038%2010.5%2015.7689%2010.5%2014.5208V7.62131L15.5592%202.56066C16.5013%201.6185%2015.8336%200%2014.4985%200ZM9%207V14.5L7%2013V7L1.5%201.5H14.5L9%207Z'%20fill='currentColor'%20/%3e%3c/svg%3e\"","import React, { useEffect } from \"react\";\n\nimport { useMapContext } from \"./contexts/Map\";\n\nimport Stack from \"./components/Stack\";\n\nimport styles from \"./router.module.css\";\nimport SearchInput from \"./components/SearchInput/SearchInput\";\n\nimport Filters from \"./screens/Filters\";\nimport Locations from \"./screens/Locations\";\n\nimport filterIcon from \"./assets/filter-icon.svg\";\n\nimport CloseButton from \"./components/CloseButton/CloseButton\";\nimport SideBarContainer from \"./components/SidebarContainer/SidebarContainer\";\n\nimport { hasFilters } from \"./utils/filters\";\n\nexport default function Controls() {\n const { locationIds, fetchLocations, filters, isSearching } = useMapContext();\n const [view, setView] = React.useState<string>(\"none\");\n\n useEffect(() => {\n if (locationIds.length > 0) {\n setView(\"locations\");\n }\n }, [locationIds, setView]);\n\n return (\n <div className={styles.container}>\n <div className={styles.controlsContainer}>\n <SearchInput\n onFocus={() => {\n setView(\"none\");\n }}\n />\n\n <div\n className={styles.filterButton}\n onClick={() => {\n setView(\"filters\");\n }}\n >\n {isSearching ?? false ? (\n <div className={styles.spinner}></div>\n ) : (\n <img className={styles.filterIcon} src={filterIcon} />\n )}\n {hasFilters(filters) && !(isSearching ?? false) && (\n <span className={styles.filterCounter}></span>\n )}\n </div>\n </div>\n\n <div className={styles.stackContainer}>\n <Stack\n name=\"router\"\n currentView={view}\n onViewChange={(view) => {\n setView(view);\n }}\n >\n <Stack.View name=\"locations\">\n <Locations />\n </Stack.View>\n <Stack.View name=\"filters\">\n <SideBarContainer>\n <CloseButton onClick={() => setView(\"none\")} />\n <Filters />\n </SideBarContainer>\n </Stack.View>\n </Stack>\n </div>\n </div>\n );\n}\n","import React, { useEffect } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport Boot from \"./Boot\";\nimport { MapProvider } from \"./contexts/Map\";\nimport Map from \"./components/Map/Map\";\nimport AnalyticsOverlay from \"./components/AnalyticsOverlay/AnalyticsOverlay\";\nimport Router from \"./Router\";\nimport { RoadMapOptions } from \"./types\";\nimport { useRef } from \"react\";\n\nexport default function RoadMap(props: RoadMapOptions) {\n if (!props.shadowRoot && props?.theming?.backgroundColor) {\n return <ShadowMapWrapper {...props} />;\n }\n return (\n <MapProvider options={props} language={props.language}>\n <Boot height={props?.height}>\n <Router />\n <AnalyticsOverlay />\n <Map />\n </Boot>\n </MapProvider>\n );\n}\n\n// This wrapper is used to create a shadow root if one is not provided by the end user\nconst ShadowMapWrapper: React.FC<RoadMapOptions> = (props) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<Root | null>(null);\n const shadowRootRef = useRef<ShadowRoot | null>(null);\n const isInitializedRef = useRef<boolean>(false);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || isInitializedRef.current) return;\n\n const shadowRoot = container.attachShadow({ mode: \"open\" });\n shadowRootRef.current = shadowRoot;\n\n // We default to the most recent version of the sdk stylesheet\n let styleHref = `https://mapsdk.road.io/styles.css`;\n if (props.sdkRoot) {\n styleHref = props.sdkRoot + \"/styles.css\";\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.type = \"text/css\";\n link.href = styleHref;\n\n // Append link to shadow root BEFORE rendering\n shadowRoot.appendChild(link);\n\n // Create React root\n const root = createRoot(shadowRoot);\n rootRef.current = root;\n isInitializedRef.current = true;\n\n return () => {\n if (rootRef.current) {\n rootRef.current.unmount();\n rootRef.current = null;\n }\n shadowRootRef.current = null;\n isInitializedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n if (!rootRef.current || !shadowRootRef.current) return;\n const roadMapElement = React.createElement(RoadMap, {\n ...props,\n shadowRoot: shadowRootRef.current,\n });\n rootRef.current.render(roadMapElement);\n }, [props]);\n\n return <div ref={containerRef} style={{ height: \"100%\", width: \"100%\" }} />;\n};\n"],"names":["useOnScreen","ref","wasIntersecting","setWasIntersecting","useState","observer","useMemo","entry","useEffect","getLanguage","lng","language","en","nl","de","fr","it","es","strings","order","versionRank","version","index","atLeast","min","request","url","options","response","e","buildSearchBody","limitToLocationIds","props","mapSearchPath","apiRoot","kind","endpoint","_fetchGeohashes","authorization","precision","_fetchAnalytics","_fetchTariffs","origin","ids","_fetchLocations","status","_reportProblem","type","country_code","party_id","location_id","evse_uid","loadRemoteConfig","prefixes","normaliseStatus","name","prefix","classicPalette","modernPalette","paletteFor","inSessionStatuses","roamingTone","cpoTone","statusTone","roamingClassic","roamingModern","cpoColours","toneColours","toneColour","tone","getStatusColor","labelKeys","getStatusLabelKey","tonePriority","pickMarkerColor","statuses","tones","priority","candidate","getColorForStatus","locationPosition","location","coordinates","roamingOptions","ocppStatuses","ocppOptions","isCpo","getStatusFilterOptions","toggleOption","action","existing","values","value","findStatusFilterOption","option","isStatusFilterActive","selected","toggleStatusFilter","withoutStatusFilter","filters","rest","statusForLocations","defaultCurrency","MapContext","createContext","key","MapProvider","children","setOptions","filterConfiguration","setFilterConfiguration","error","setError","place","setPlace","position","setPosition","setFilters","locationIds","setLocationsIds","locations","setLocations","locationsStatus","setLocationsStatus","isSearching","setIsSearching","searchBounds","setSearchBounds","mapContext","setMapContext","isDebug","t","match","p1","configured","mapKey","mapKind","currency","passThroughSearchOptions","fetchGeohashes","args","fetchAnalytics","fetchLocations","fetchTariffs","reportProblem","onFetchLocations","data","rc","err","theming","shadowRoot","style","isReady","providerValue","useMapContext","context","React","Boot","useContext","useRef","loaded","jsxs","styles","jsx","__awaiter","thisArg","_arguments","P","generator","adopt","resolve","reject","fulfilled","step","rejected","result","getDefaultExportFromCjs","x","fastDeepEqual","equal","a","b","length","keys","isEqual","DEFAULT_ID","LoaderStatus","Loader","apiKey","authReferrerPolicy","channel","client","id","libraries","mapIds","nonce","region","retries","script","fn","_a","_b","params","g","h","k","p","c","l","q","m","d","r","u","f","n","libraryPromises","library","event","delay","cb","instance","getLoader","loader","base32","Geohash","lat","lon","hash","posn","idx","bit","evenBit","geohash","latMin","latMax","lonMin","lonMax","lonMid","latMid","bounds","i","chr","bitN","direction","neighbour","border","lastCh","parent","createOverlay","container","pane","Overlay","point","OverlayView","map","zIndex","div","overlay","createPortal","formatter","formatNumber","num","CustomMarker","onClick","highlight","handleClick","useCallback","styleColor","usablePrice","price","formatters","format","formatEnergyPrice","tickScale","baseTicks","priceTicks","anyLabel","scale","decimals","tick","unitKind","countUnits","counts","count","cluster","pinTone","pinGlyph","ringByTone","textByColour","pinColours","sliceOrder","pinSplit","unit","describePin","isCluster","pinPrice","TAIL","SINGLE","SELECTED","COMPACT","CIRCLE","CIRCLE_SELECTED","STACK_MAX","TAG_GAP","UNKNOWN_PRICE","INK","MUTED","TAG_INK","TAG_BACKGROUND","SHADOW","SHADOW_SOFT","SHADOW_DEEP","pinStylesheet","PinStyles","withAlpha","hex","alpha","tailAnchored","size","centred","conicGradient","split","at","slice","from","Bolt","fill","ratioFontSize","state","digits","Glyph","ring","text","bodyStyle","compact","muted","planned","SinglePin","tag","label","StackedPin","ghost","edge","ClusterCircle","sitesLabel","halo","Pin","priceLabel","body","sameStatuses","left","right","samePrice","mergeBuckets","incoming","byKey","bucket","previous","compactBelowZoom","geoHashZoom","zoomToHashChars","zoom","getNormalizedBounds","zoomLevel","mapSWPoint","mapNEPoint","SWGeohash","geohashSWBounds","latStep","lngStep","neLat","neLng","isSameBounds","bounds1","bounds2","MapMarkers","onMarkerClicked","setData","setZoom","mapConfig","setMapConfig","currentZoomLevel","currentBounds","newZoomLevel","newMapConfig","appendData","newData","ignore","_onMarkerClicked","modernPins","isSelected","item","Fragment","MapWrapper","setMap","mapContainerRef","Map","StatusDot","color","desktopQuery","controlsColumnWidth","edgePadding","rowHeight","useIsDesktop","isDesktop","setIsDesktop","media","onChange","overlayStyle","pillStyle","switchOutline","switchInk","switchTextShadow","offset","switchStyle","switchOptionStyle","switchActiveStyle","bucketStyle","activeBucketStyle","clickableBucketStyle","countStyle","StatusPill","buckets","filterKind","onToggle","next","clickable","active","content","AnalyticsOverlay","analytics","setAnalytics","isLoading","setIsLoading","vocabulary","setVocabulary","enabled","analyticsFiltersKey","analyticsFilters","roamingBuckets","ocppBuckets","available","shown","_extends","_objectWithoutPropertiesLoose","_setPrototypeOf","_inheritsLoose","o","setPrototypeOf","v","w","y","z","A","reactIs_production_min","hasSymbol","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_ASYNC_MODE_TYPE","REACT_CONCURRENT_MODE_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_BLOCK_TYPE","REACT_FUNDAMENTAL_TYPE","REACT_RESPONDER_TYPE","REACT_SCOPE_TYPE","isValidElementType","typeOf","object","$$typeof","$$typeofType","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","hasWarnedAboutDeprecatedIsAsyncMode","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","reactIs_development","reactIsModule","require$$0","require$$1","getOwnPropertySymbols","hasOwnProperty","propIsEnumerable","toObject","val","shouldUseNative","test1","test2","order2","test3","letter","objectAssign","target","source","to","symbols","s","ReactPropTypesSecret","ReactPropTypesSecret_1","has","printWarning","loggedTypeFailures","message","checkPropTypes","typeSpecs","componentName","getStack","typeSpecName","ex","stack","checkPropTypes_1","ReactIs","assign","require$$2","require$$3","require$$4","emptyFunctionThatReturnsNull","factoryWithTypeCheckers","isValidElement","throwOnDirectAccess","ITERATOR_SYMBOL","FAUX_ITERATOR_SYMBOL","getIteratorFn","maybeIterable","iteratorFn","ANONYMOUS","ReactPropTypes","createPrimitiveTypeChecker","createAnyTypeChecker","createArrayOfTypeChecker","createElementTypeChecker","createElementTypeTypeChecker","createInstanceTypeChecker","createNodeChecker","createObjectOfTypeChecker","createEnumTypeChecker","createUnionTypeChecker","createShapeTypeChecker","createStrictShapeTypeChecker","is","PropTypeError","createChainableTypeChecker","validate","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","isRequired","propName","propFullName","secret","cacheKey","chainedCheckType","expectedType","propValue","propType","getPropType","preciseType","getPreciseType","typeChecker","expectedClass","expectedClassName","actualClassName","getClassName","expectedValues","valuesString","arrayOfTypeCheckers","checker","getPostfixForTypeWarning","expectedTypes","checkerResult","expectedTypesMessage","isNode","invalidValidatorError","shapeTypes","allKeys","iterator","isSymbol","emptyFunction","emptyFunctionWithReset","factoryWithThrowingShims","shim","getShim","propTypesModule","hasClass","element","className","addClass","replaceClassName","origClass","classToRemove","removeClass","config","timeoutsShape","PropTypes","classNamesShape","TransitionGroupContext","forceReflow","node","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","_this","parentGroup","appear","initialStatus","_ref","prevState","nextIn","_proto","prevProps","nextStatus","timeout","exit","enter","mounting","ReactDOM","_this2","appearing","_ref2","maybeNode","maybeAppearing","timeouts","enterTimeout","_this3","nextState","callback","_this4","handler","doesNotHaveTimeoutOrListener","_ref3","maybeNextCallback","_this$props","childProps","pt","_len","_key","noop","_addClass","classes","addOneClass","removeOneClass","CSSTransition","_this$resolveArgument","_this$resolveArgument2","_this$resolveArgument3","_this$resolveArgument4","_this$resolveArgument5","_this$resolveArgument6","classNames","isStringClassNames","baseClassName","activeClassName","doneClassName","phase","_this$getClassNames","_this$appliedClasses$","_leaveRenders","_enterRenders","areChildrenDifferent","oldChildren","newChildren","modes","callHook","_element$props","leaveRenders","current","changeState","enterRenders","_ref4","SwitchTransition","mode","_this$state","component","StackView","StackContext","useStackContext","Stack","currentView","onViewChange","elements","createRef","currentRef","setCurrentRef","View","setArgs","contextValue","view","opt","done","SearchInput","onFocus","inputRef","places","autocomplete","CheckboxToggle","checked","isChecked","setIsChecked","onChangeCallback","Range","ticks","convertValue","bgSize","MultiSelect","preferredValues","placeholder","disabled","isOpen","setIsOpen","inputValue","setInputValue","highlightedIndex","setHighlightedIndex","containerRef","preferredSet","preferred","others","filtered","flatItems","selectedOptions","openMenu","closeMenu","selectItem","removeValue","handleInputKeyDown","handleInputBlur","toggleDropdown","renderOption","isLast","SelectField","onBlur","handleChange","selectedValue","ICON_IEC_62196_T2","ICON_IEC_62196_T2_COMBO","ICON_IEC_62196_T1","ICON_IEC_62196_T1_COMBO","ICON_IEC_62196_T3","ICON_IEC_62196_T3A","ICON_SCHUKO","ICON_CHADEMO","ICON_CATARC","connectorIcons","defaultFilter","hasFilters","filter","authMethodCapabilityOptions","powerRanges","useLocalState","initialState","useReducer","currentState","updatedState","FiltersScreen","applyFilters","contextFilters","showPriceFilter","priceLimit","setParentView","showOperatorFilter","lastApplied","Checkbox","operator","capability","LocationPlaceholder","ChevronLeft","ChevronRight","ChevronDown","Clock","Check","Info","SideBarContainer","Debug","evse","connector","StationIcon","BuildingIcon","CarIcon","BoltIcon","PricingIcon","getSocketIcon","connectorPowerTypes","getSocketText","formatConnectorStandard","getStatusLabel","getLocationLabel","getStatusColorFromEvses","evses","getTimezoneOffset","date","timeZone","lang","tzName","part","sign","offsetToMins","formatYMD","year","month","day","acc","tzDate","offMins","startOfDay","oDateTS","sodDateTS","endOfDate","getNextDayOfWeek","dayOfWeek","resultDate","getDay","convertTimeToMinutes","time","hours","minutes","convertToTimeSlot","startTime","endTime","getScheduleItems","items","isDayActive","now","currentTime","scheduleItems","refItem","oldEndTime","toAppend","maxEndTime","prevItem","isBaseTarif","tariffElement","getDynamicTariff","limit","splitByDay","el","curr","formattedItems","restrictions","_startDate","partialRestrictions","isActive","getScheduledTariff","locationTimezone","today","start_date","end_date","day_of_week","startDate","endDate","start","end","omitFields","obj","fields","isSame","aWithoutActive","bWithoutActive","mergeDuplicatesTimeslots","timeslots","cur","isRateBaseTariff","pc","isEdgeNoise","getSchedule","days","baseRateElement","SUNDAY","firstDay","restDays","dayElements","dayTimeslots","prevEntry","prevTimeslots","getConnectorTariffType","connectorTarif","ConnectorPowerType","calculateMaxPower","formatCurrency","getPrice","priceComponent","vat","PriceComponent","stringByType","displayOrder","PriceComponents","elementsByType","sortedElements","aIndex","bIndex","Price","vatAmount","CdrPriceComponent","cdrAdditionalCharge","formatTime","mins","defaultTimeZone","daysForLocale","CdrAdditionalChargeComponent","cdrAdditionalCharges","CdrPrice","ConnectorTariff","timezone","tariff","i18nDays","hasPriceComponents","dynamicTariffs","scheduledTariffs","baseTarifElements","isBaseActive","schedule","dynamicTariff","getNotes","notes","LocationDetailsV1","currentLocation","setView","availableEvse","connectorType","rowStyle","iconSlotStyle","textSlotStyle","hintStyle","chevronSlotStyle","LocationRow","icon","hint","defaultExpanded","expandable","expanded","setExpanded","toggle","LocationHeader","href","AvailabilitySummary","OperatorBlock","role","showRoleLabel","OperatorSection","suboperator","fallbackOperatorName","fallbackSuboperatorName","subRole","opRole","getWeekdayFullLabel","weekday","getTodayWeekday","jsDayToOcpiWeekday","groupRegularHoursByWeekday","regularHours","grouped","formatPeriod","begin","timeToMinutes","jsDay","isInExceptional","periods","isOpenNow","openingTimes","todayWeekday","closing","reopen","reopenWeekday","opening","prevWeekday","nowMinutes","effectiveEnd","wd","getFutureExceptionalPeriods","ordinalSuffix","rem100","formatExceptionalDate","dateStr","formatExceptionalTime","OpeningHours","chargingWhenClosed","futureClosings","futureOpenings","hasRegular","showWeek","dayStyle","dayLabelStyle","dayValueStyle","todayStyle","exceptionalStyle","exceptionalHeaderStyle","footnoteStyle","pill","isToday","ParkingType","parkingType","ChargingAccessibility","accessibility","EvseHeader","EvseStatus","first","maxKw","ConnectorSocket","ConnectorPricing","transformTariff","TariffV2","additionalCharges","hasCongestionPricing","JS_DAY_TO_OCPI","isInTimeWindow","isElementActive","bucketKey","minD","maxD","getActiveTariffElements","byBucket","isBase","elementToPcs","itemsRowStyle","itemStyle","itemHighlightStyle","STRING_BY_TYPE","DISPLAY_ORDER","priceWithVat","isFreeParkingWindow","collectAndSort","skipZero","all","ai","bi","TariffChips","chipStyle","labelKey","total","containerStyle","headerStyle","TariffLine","trailing","interactive","containerWithClick","handleKey","buttonStyle","submittingStyle","doneStyle","errorStyle","ReportProblemButton","setStatus","submit","textStyle","NoTariff","chevronStyle","ActiveTariff","evseId","evseUid","countryCode","partyId","locationId","locationName","transformed","rawElements","activeElements","navigate","Connector","tariffs","tr","cardStyle","connectorBaseStyle","Evse","statusColor","connectorStyle","pickText","directions","Directions","Location","Locations","locationIndex","setLocationIndex","canNext","canPrev","debugMode","isV2","BackButton","TariffNote","note","DynamicTariffs","sectionStyle","sectionHeaderStyle","descriptionStyle","metaStyle","elementHasPaidComponents","pickAltText","altTexts","formatLastUpdated","iso","TariffDetails","reportProps","description","lastUpdated","renderHeader","charges","baseElements","dyn","j","CloseIcon","CloseButton","LocationsScreeen","DynamicTariff","filterIcon","Controls","Filters","RoadMap","ShadowMapWrapper","Router","rootRef","shadowRootRef","isInitializedRef","styleHref","link","root","createRoot","roadMapElement"],"mappings":"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","x_google_ignoreList":[9,11,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45]}