diff --git a/custom-icons.js b/custom-icons.js new file mode 100644 index 000000000..dbd806f10 --- /dev/null +++ b/custom-icons.js @@ -0,0 +1,47 @@ +import { + ClassicBus, + ClassicGondola, + ClassicModeIcon, + Ferry, + LegIcon, + StandardGondola +} from '@opentripplanner/icons' + +/** + * For more advanced users, you can replicate and customize components and + * observe the change in icons. + * - For LegIcon: https://github.com/opentripplanner/otp-ui/blob/master/packages/icons/src/trimet-leg-icon.js + * - For ModeIcon: https://github.com/opentripplanner/otp-ui/blob/master/packages/icons/src/trimet-mode-icon.js + * The example below shuffles some icons around from what you might normally + * expect for demonstration purposes. + */ + +const CustomTransitIcon = Ferry +const CustomRailIcon = ClassicGondola +const CustomStreetcarIcon = StandardGondola +const CustomBikeRentalIcon = ClassicBus + +export const CustomModeIcon = ({ mode, ...props }) => { + if (!mode) return null + switch (mode.toLowerCase()) { + // Place custom icons for each mode here. + case 'transit': + return + case 'rail': + return + default: + return + } +} + +export const CustomLegIcon = ({ leg, ...props }) => { + if ( + leg.routeLongName && + leg.routeLongName.startsWith('MAX') + ) { + return + } else if (leg.rentedBike) { + return + } + return +} diff --git a/example.js b/example.js index 72f5ac230..3d6530aa6 100644 --- a/example.js +++ b/example.js @@ -1,6 +1,7 @@ // import this polyfill in order to make webapp compatible with IE 11 import 'es6-math' +import {ClassicLegIcon, ClassicModeIcon} from '@opentripplanner/icons' import { createHashHistory } from 'history' import { connectRouter, routerMiddleware } from 'connected-react-router' import React, { Component } from 'react' @@ -9,7 +10,6 @@ import { createStore, combineReducers, applyMiddleware, compose } from 'redux' import { Provider } from 'react-redux' import thunk from 'redux-thunk' import createLogger from 'redux-logger' - // import Bootstrap Grid components for layout import { Navbar, Grid, Row, Col } from 'react-bootstrap' @@ -22,10 +22,23 @@ import { AppMenu, createOtpReducer } from './lib' - // load the OTP configuration import otpConfig from './config.yml' +// Set useCustomIcons to true to override classic icons with the exports from +// custom-icons.js +const useCustomIcons = false + +// Define icon sets for modes. +let MyLegIcon = ClassicLegIcon +let MyModeIcon = ClassicModeIcon + +if (useCustomIcons) { + const CustomIcons = require('./custom-icons') + MyLegIcon = CustomIcons.CustomLegIcon + MyModeIcon = CustomIcons.CustomModeIcon +} + // create an initial query for demo/testing purposes const initialQuery = { from: { @@ -78,7 +91,7 @@ class OtpRRExample extends Component { - + @@ -90,7 +103,12 @@ class OtpRRExample extends Component { /** mobile view **/ const mobileView = ( - )} title={(
OpenTripPlanner
)} /> + } + title={
OpenTripPlanner
} + /> ) /** the main webapp **/ @@ -98,6 +116,7 @@ class OtpRRExample extends Component { ) } diff --git a/lib/components/app/default-main-panel.js b/lib/components/app/default-main-panel.js index ed3de24b6..e200c01ef 100644 --- a/lib/components/app/default-main-panel.js +++ b/lib/components/app/default-main-panel.js @@ -14,10 +14,11 @@ class DefaultMainPanel extends Component { const { activeSearch, currentQuery, - customIcons, itineraryClass, itineraryFooter, + LegIcon, mainPanelContent, + ModeIcon, showUserSettings } = this.props const showPlanTripButton = mainPanelContent === 'EDIT_DATETIME' || @@ -35,7 +36,7 @@ class DefaultMainPanel extends Component { paddingBottom: 15, overflow: 'auto' }}> - + {!activeSearch && !showPlanTripButton && showUserSettings && } @@ -43,7 +44,8 @@ class DefaultMainPanel extends Component { + LegIcon={LegIcon} + /> {showPlanTripButton && diff --git a/lib/components/app/print-layout.js b/lib/components/app/print-layout.js index 724db3ee3..c140345d8 100644 --- a/lib/components/app/print-layout.js +++ b/lib/components/app/print-layout.js @@ -1,4 +1,3 @@ -import { TriMetLegIcon } from '@opentripplanner/icons' import PrintableItinerary from '@opentripplanner/printable-itinerary' import PropTypes from 'prop-types' import React, { Component } from 'react' @@ -14,6 +13,7 @@ import { getActiveItinerary } from '../../util/state' class PrintLayout extends Component { static propTypes = { itinerary: PropTypes.object, + LegIcon: PropTypes.elementType.isRequired, parseQueryString: PropTypes.func } @@ -52,24 +52,8 @@ class PrintLayout extends Component { root.removeAttribute('class') } - /** - * Use one of the customIcons if provided, - * (similar to @opentriplanner/trip-form/ModeIcon) - * otherwise, fall back on TriMetLegIcon. - * TODO: Combine all custom icon rendering in one place. - */ - customLegIcon = icons => { - return function ({leg, props}) { - // Check if there is a custom icon (exact match required). - if (icons && leg.mode in icons) { - return icons[leg.mode] - } - return TriMetLegIcon({leg, props}) - } - } - render () { - const { config, customIcons, itinerary } = this.props + const { config, itinerary, LegIcon } = this.props return (
{/* The header bar, including the Toggle Map and Print buttons */} @@ -99,7 +83,7 @@ class PrintLayout extends Component { diff --git a/lib/components/form/connected-settings-selector-panel.js b/lib/components/form/connected-settings-selector-panel.js index ffa4122e1..6d4f1d030 100644 --- a/lib/components/form/connected-settings-selector-panel.js +++ b/lib/components/form/connected-settings-selector-panel.js @@ -12,13 +12,13 @@ import UserTripSettings from './user-trip-settings' class ConnectedSettingsSelectorPanel extends Component { static propTypes = { - icons: PropTypes.object + ModeIcon: PropTypes.elementType.isRequired } render () { const { config, - icons, + ModeIcon, query, setQueryParam, showUserSettings @@ -30,8 +30,7 @@ class ConnectedSettingsSelectorPanel extends Component { {showUserSettings && }
- + ) } diff --git a/lib/components/form/settings-preview.js b/lib/components/form/settings-preview.js index 337c5d2b6..b39baeda6 100644 --- a/lib/components/form/settings-preview.js +++ b/lib/components/form/settings-preview.js @@ -10,7 +10,6 @@ class SettingsPreview extends Component { caret: PropTypes.string, compressed: PropTypes.bool, editButtonText: PropTypes.element, - icons: PropTypes.object, showCaret: PropTypes.bool, onClick: PropTypes.func, diff --git a/lib/components/form/styled.js b/lib/components/form/styled.js index 0ff6705a9..3d0909694 100644 --- a/lib/components/form/styled.js +++ b/lib/components/form/styled.js @@ -7,139 +7,141 @@ const commonButtonCss = css` -moz-user-select: none; -ms-user-select: none; background: none; + border: 1px solid rgb(187, 187, 187); + border-radius: 3px; font-family: inherit; - user-select: none; + font-size: inherit; + font-weight: inherit; + outline-offset: -2px; + padding: 6px 12px; text-align: center; touch-action: manipulation; + user-select: none; + + &.active { + background-color: rgb(173, 216, 230); + border: 2px solid rgb(0, 0, 0); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + font-weight: 600; + } ` const commonInputCss = css` - background-color: #fff; + background: none; border: 1px solid #ccc; - border-radius: 4px; - box-shadow: inset 0 1px 1px rgba(0,0,0,.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); color: #555; font-family: inherit; + font-weight: inherit; padding: 6px 12px; - transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; - - &:focus { - border-color: #66afe9; - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102,175,233,.6); - outline: 0; - } + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; ` const modeButtonButtonCss = css` ${TripFormClasses.ModeButton.Button} { ${commonButtonCss} - background-color: #fff; - border: 1px solid #ccc; - border-radius: 4px; - color: #333; - font-weight: 400; - font-size: 14px; - line-height: 1.42857143; - outline-offset:-2px; - padding: 6px 12px; - &.active { - background-color: #e6e6e6; - border-color: #adadad; - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - font-weight: 400; - } - &:hover { - background-color: #e6e6e6; - border-color: #adadad; - } - &.active { - background-color: #e6e6e6; - border-color: #adadad; - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - font-weight: 400; - &:hover { - background-color: #d4d4d4; - border-color: #8c8c8c; - } - } } ` export const StyledSettingsSelectorPanel = styled(SettingsSelectorPanel)` + ${modeButtonButtonCss} + ${TripFormClasses.SettingLabel} { - font-weight: 400; - margin-bottom: 0; + color: #808080; + font-size: 14px; + font-weight: 100; + letter-spacing: 1px; + padding-top: 8px; + text-transform: uppercase; } ${TripFormClasses.SettingsHeader} { + color: #333333; font-size: 18px; - margin: 16px 0px; + margin: 16px 0px; } ${TripFormClasses.SettingsSection} { margin-bottom: 16px; } ${TripFormClasses.DropdownSelector} { - margin-bottom:20px; select { ${commonInputCss} + -webkit-appearance: none; + border-radius: 3px; font-size: 14px; height: 34px; - line-height: 1.42857143; + line-height: 1.42857; + margin-bottom: 20px; + + &:focus { + border-color: #66afe9; + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102,175,233,.6); + outline: 0; + } + } + > div:last-child::after { + box-sizing: border-box; + color: #000; + content: "▼"; + font-size: 67%; + pointer-events: none; + position: absolute; + right: 8px; + top: 10px; } } ${TripFormClasses.ModeSelector} { + font-weight: 300; ${TripFormClasses.ModeButton.Button} { - ${commonButtonCss} - border: 1px solid rgb(187, 187, 187); - border-radius: 3px; box-shadow: none; - outline: 0; + outline: none; padding: 3px; - &.active { - background-color: rgb(173, 216, 230); - border: 2px solid rgb(0, 0, 0); - } - } + } ${TripFormClasses.ModeButton.Title} { font-size: 10px; - font-weight: 300; line-height: 12px; padding: 4px 0px 0px; + &.active { font-weight: 600; } - } + } } ${TripFormClasses.ModeSelector.MainRow} { - margin: 0 -10px 18px; - padding: 0 5px; - + box-sizing: border-box; + font-size: 170%; + margin: 0px -10px 18px; + padding: 0px 5px; ${TripFormClasses.ModeButton.Button} { - font-size: 200%; - font-weight: 300; height: 54px; + width: 100%; &.active { font-weight: 600; } } } ${TripFormClasses.ModeSelector.SecondaryRow} { - margin: 0 -10px 10px; + margin: 0px -10px 10px; ${TripFormClasses.ModeButton.Button} { - font-size: 150%; - font-weight: 600; + font-size: 130%; + font-weight: 800; height: 46px; + > svg { + margin: 0 0.20em; + } } } ${TripFormClasses.ModeSelector.TertiaryRow} { - margin: 0 -10px 10px; + font-size: 80%; + font-weight: 300; + margin: 0px -10px 10px; + text-align: center; ${TripFormClasses.ModeButton.Button} { - font-size: 90%; height: 36px; } } - ${TripFormClasses.SubmodeSelector.Row} { + font-size: 12px; > * { padding: 3px 5px 3px 0px; } @@ -147,38 +149,46 @@ export const StyledSettingsSelectorPanel = styled(SettingsSelectorPanel)` padding-right: 0px; } ${TripFormClasses.ModeButton.Button} { - padding: 6px 12px; + height: 35px; } svg, img { margin-left: 0px; } } + ${TripFormClasses.SubmodeSelector} { + ${TripFormClasses.SettingLabel} { + margin-bottom: 0; + } + } ${TripFormClasses.SubmodeSelector.InlineRow} { margin: -3px 0px; - } - - ${TripFormClasses.SubmodeSelector} { - ${modeButtonButtonCss} + svg, + img { + height: 18px; + max-width: 32px; + } } ` export const StyledDateTimeSelector = styled(DateTimeSelector)` - margin: 0 -15px 20px; + margin: 0 -15px 15px; + ${TripFormClasses.DateTimeSelector.DateTimeRow} { - margin-top: 20px; + margin: 20px 0px 15px; + input { + ${commonInputCss} + background-color: #fff; + border: 0; + border-bottom: 1px solid #000; + box-shadow: none; + outline: none; + text-align: center; + } } - - input { - ${commonInputCss} - -webkit-appearance: textfield; - -moz-appearance: textfield; - appearance: textfield; - box-shadow: none; - font-size: 16px; - height: 34px; - text-align: center; /* For legacy browsers. */ + ${TripFormClasses.ModeButton.Button} { + ${commonButtonCss} + font-size: 14px; + height: 35px; } - - ${modeButtonButtonCss} ` diff --git a/lib/components/form/tabbed-form-panel.js b/lib/components/form/tabbed-form-panel.js index c41c5650d..2452eadb4 100644 --- a/lib/components/form/tabbed-form-panel.js +++ b/lib/components/form/tabbed-form-panel.js @@ -12,7 +12,7 @@ import { setMainPanelContent } from '../../actions/ui' class TabbedFormPanel extends Component { static propTypes = { - icons: PropTypes.object + ModeIcon: PropTypes.elementType.isRequired } _onEditDateTimeClick = () => { @@ -28,7 +28,7 @@ class TabbedFormPanel extends Component { _onHideClick = () => this.props.setMainPanelContent(null) render () { - const { icons, mainPanelContent } = this.props + const { ModeIcon, mainPanelContent } = this.props return (
@@ -49,7 +49,7 @@ class TabbedFormPanel extends Component { {(mainPanelContent === 'EDIT_DATETIME' || mainPanelContent === 'EDIT_SETTINGS') && (
{mainPanelContent === 'EDIT_DATETIME' && ()} - {mainPanelContent === 'EDIT_SETTINGS' && ()} + {mainPanelContent === 'EDIT_SETTINGS' && ()}
{(active || expanded) &&
@@ -40,6 +41,7 @@ export default class DefaultItinerary extends NarrativeItinerary { activeStep={activeStep} setActiveLeg={setActiveLeg} setActiveStep={setActiveStep} + LegIcon={LegIcon} /> diff --git a/lib/components/narrative/default/itinerary-details.js b/lib/components/narrative/default/itinerary-details.js index 91537b8b6..337943dcc 100644 --- a/lib/components/narrative/default/itinerary-details.js +++ b/lib/components/narrative/default/itinerary-details.js @@ -7,11 +7,12 @@ import TransitLeg from './transit-leg' export default class ItineraryDetails extends Component { static propTypes = { - itinerary: PropTypes.object + itinerary: PropTypes.object, + LegIcon: PropTypes.elementType.isRequired } render () { - const { itinerary, activeLeg, activeStep, setActiveLeg, setActiveStep } = this.props + const { itinerary, activeLeg, activeStep, LegIcon, setActiveLeg, setActiveStep } = this.props return (
{itinerary.legs.map((leg, index) => { @@ -22,6 +23,7 @@ export default class ItineraryDetails extends Component { index={index} key={index} leg={leg} + LegIcon={LegIcon} setActiveLeg={setActiveLeg} /> : { @@ -26,7 +25,7 @@ export default class ItinerarySummary extends Component { // Add the mode icon blocks.push(
- +
) diff --git a/lib/components/narrative/default/transit-leg.js b/lib/components/narrative/default/transit-leg.js index 543072a97..44b826ecd 100644 --- a/lib/components/narrative/default/transit-leg.js +++ b/lib/components/narrative/default/transit-leg.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types' import React, { Component } from 'react' import Icon from '../icon' -import ModeIcon from '../../icons/mode-icon' import ViewTripButton from '../../viewers/view-trip-button' import ViewStopButton from '../../viewers/view-stop-button' @@ -12,7 +11,8 @@ const { formatDuration, formatTime } = coreUtils.time export default class TransitLeg extends Component { static propTypes = { - itinerary: PropTypes.object + itinerary: PropTypes.object, + LegIcon: PropTypes.elementType.isRequired } constructor (props) { @@ -35,7 +35,7 @@ export default class TransitLeg extends Component { } render () { - const { active, index, leg } = this.props + const { active, index, leg, LegIcon } = this.props const { expanded } = this.state const numStops = leg.to.stopIndex - leg.from.stopIndex - 1 @@ -47,7 +47,7 @@ export default class TransitLeg extends Component { onClick={(e) => this._onLegClick(e, leg, index)} >
- +
diff --git a/lib/components/narrative/line-itin/connected-itinerary-body.js b/lib/components/narrative/line-itin/connected-itinerary-body.js index e4c92a4b6..5d36ac58f 100644 --- a/lib/components/narrative/line-itin/connected-itinerary-body.js +++ b/lib/components/narrative/line-itin/connected-itinerary-body.js @@ -1,9 +1,9 @@ import isEqual from 'lodash.isequal' -import { TriMetLegIcon } from '@opentripplanner/icons' import TransitLegSummary from '@opentripplanner/itinerary-body/lib/defaults/transit-leg-summary' import ItineraryBody from '@opentripplanner/itinerary-body/lib/otp-react-redux/itinerary-body' import LineColumnContent from '@opentripplanner/itinerary-body/lib/otp-react-redux/line-column-content' import PlaceName from '@opentripplanner/itinerary-body/lib/otp-react-redux/place-name' +import { PlaceName as PlaceNameWrapper } from '@opentripplanner/itinerary-body/lib/styled' import RouteDescription from '@opentripplanner/itinerary-body/lib/otp-react-redux/route-description' import React, { Component } from 'react' import { connect } from 'react-redux' @@ -22,6 +22,12 @@ const ItineraryBodyContainer = styled.div` padding: 20px 0px; ` +const StyledItineraryBody = styled(ItineraryBody)` + ${PlaceNameWrapper} { + font-weight: inherit; + } +` + class ConnectedItineraryBody extends Component { /** avoid rerendering if the itinerary to display hasn't changed */ shouldComponentUpdate (nextProps, nextState) { @@ -33,6 +39,7 @@ class ConnectedItineraryBody extends Component { config, diagramVisible, itinerary, + LegIcon, setActiveLeg, setViewedTrip, showLegDiagram @@ -40,11 +47,11 @@ class ConnectedItineraryBody extends Component { return ( - { @@ -83,7 +80,7 @@ export default class ItinerarySummary extends Component { } render () { - const { customIcons, itinerary, timeOptions } = this.props + const { itinerary, LegIcon, timeOptions } = this.props const { centsToString, maxTNCFare, @@ -131,7 +128,7 @@ export default class ItinerarySummary extends Component { }).map((leg, k) => { return ( - {getLegIcon(leg, customIcons)} + {coreUtils.itinerary.isTransit(leg.mode) ? ( diff --git a/lib/components/narrative/line-itin/line-itinerary.js b/lib/components/narrative/line-itin/line-itinerary.js index baf6034bd..d0550d1f0 100644 --- a/lib/components/narrative/line-itin/line-itinerary.js +++ b/lib/components/narrative/line-itin/line-itinerary.js @@ -46,10 +46,10 @@ export default class LineItinerary extends NarrativeItinerary { const { active, companies, - customIcons, expanded, itinerary, itineraryFooter, + LegIcon, showRealtimeAnnotation, onClick, timeFormat @@ -65,16 +65,17 @@ export default class LineItinerary extends NarrativeItinerary { } return ( - + + /> {showRealtimeAnnotation && } {active || expanded - ? + ? : null} {itineraryFooter} diff --git a/lib/components/narrative/narrative-routing-results.js b/lib/components/narrative/narrative-routing-results.js index 204cc245b..f16634d26 100644 --- a/lib/components/narrative/narrative-routing-results.js +++ b/lib/components/narrative/narrative-routing-results.js @@ -11,8 +11,8 @@ import { setMainPanelContent } from '../../actions/ui' class NarrativeRoutingResults extends Component { static propTypes = { - customIcons: PropTypes.object, itineraryClass: PropTypes.func, + LegIcon: PropTypes.elementType.isRequired, routingType: PropTypes.string } @@ -25,14 +25,19 @@ class NarrativeRoutingResults extends Component { } render () { - const { customIcons, error, itineraryClass, itineraryFooter, pending, itineraries, mainPanelContent } = this.props + const { error, itineraryClass, itineraryFooter, LegIcon, pending, itineraries, mainPanelContent } = this.props if (pending) return if (error) return if (mainPanelContent) return null return ( // TODO: If multiple routing types exist, do the check here. - + ) } } diff --git a/lib/util/itinerary.js b/lib/util/itinerary.js index 6a65f5f13..70468dbe5 100644 --- a/lib/util/itinerary.js +++ b/lib/util/itinerary.js @@ -1,33 +1,5 @@ import { latLngBounds } from 'leaflet' import coreUtils from '@opentripplanner/core-utils' -import React from 'react' - -import ModeIcon from '../components/icons/mode-icon' - -/** - * Returns a react element of the desired icon. If customIcons are defined, then - * the icon will be attempted to be used from that lookup of icons. Otherwise, - * a ModeIcon element will be returned. - * - * @param {string} iconId A string with the desired icon ID. This icon can - * include modes or companies or anything that is defined in the customIcons. - * @param {[Map]} customIcons A customized lookup of - * icons. These are defined as part of the implementing webapp. If this lookup - * is not defined, then the ModeIcon class will be used instead. - * @return {React.Element} - */ -export function getIcon (iconId, customIcons) { - // Check if there is a custom icon - if (customIcons && iconId in customIcons) { - return customIcons[iconId] - } - - // Custom icon not available for the given iconId. Use the ModeIcon component - // to show the icon based on the iconId, but always use the default car icon - // for any car-based modes that didn't have custom icon - if (iconId && iconId.startsWith('CAR')) iconId = 'CAR' - return -} export function getLeafletItineraryBounds (itinerary) { return latLngBounds(coreUtils.itinerary.getItineraryBounds(itinerary)) @@ -39,38 +11,3 @@ export function getLeafletItineraryBounds (itinerary) { export function getLeafletLegBounds (leg) { return latLngBounds(coreUtils.itinerary.getLegBounds(leg)) } - -/** - * Return an icon depending on the leg info - * - * @param {Object} leg The leg data of an itinerary in an OTP trip plan result - * @param {[Object]} customIcons If defined for this webapp, the custom icons - * consist of a lookup table of icons to return for a specific icon ID. These - * icons typically show either companies or transport modes, but they could show - * other icons too. See this file in trimet-mod-otp for an example setup: - * https://github.com/ibi-group/trimet-mod-otp/blob/6a32e2142655c4f4d09a3f349b971b7505e2866a/lib/icons/index.js#L24-L55 - */ -export function getLegIcon (leg, customIcons) { - // check if a custom function exists for determining the icon for a leg - if (customIcons && typeof customIcons.customIconForLeg === 'function') { - // function exits, get the icon string lookup. It's possible for there to be - // a custom function that only returns a string for when a leg meets the - // criteria of the custom function - const customIconStr = customIcons.customIconForLeg(leg) - // the customIconStr could be undefined for this leg, but if it is not, then - // immediately return this custom icon for the leg - if (customIconStr) return getIcon(customIconStr, customIcons) - } - let iconStr = leg.mode - if (iconStr === 'CAR' && leg.rentedCar) { - iconStr = leg.from.networks[0] - } else if (iconStr === 'CAR' && leg.tncData) { - iconStr = leg.tncData.company - } else if (iconStr === 'BICYCLE' && leg.rentedBike && leg.from.networks) { - iconStr = leg.from.networks[0] - } else if (iconStr === 'MICROMOBILITY' && leg.rentedVehicle && leg.from.networks) { - iconStr = leg.from.networks[0] - } - - return getIcon(iconStr, customIcons) -} diff --git a/package.json b/package.json index f2ac610dc..8a74f2799 100644 --- a/package.json +++ b/package.json @@ -29,26 +29,26 @@ "dependencies": { "@conveyal/lonlat": "^1.1.0", "@mapbox/polyline": "^0.2.0", - "@opentripplanner/base-map": "^0.0.20", - "@opentripplanner/core-utils": "^0.0.20", - "@opentripplanner/endpoints-overlay": "^0.0.20", - "@opentripplanner/from-to-location-picker": "^0.0.20", - "@opentripplanner/geocoder": "^0.0.20", - "@opentripplanner/humanize-distance": "^0.0.20", - "@opentripplanner/icons": "^0.0.20", - "@opentripplanner/itinerary-body": "^0.0.20", - "@opentripplanner/location-field": "^0.0.20", - "@opentripplanner/location-icon": "^0.0.20", - "@opentripplanner/park-and-ride-overlay": "^0.0.20", - "@opentripplanner/printable-itinerary": "^0.0.20", - "@opentripplanner/route-viewer-overlay": "^0.0.20", - "@opentripplanner/stop-viewer-overlay": "^0.0.20", - "@opentripplanner/stops-overlay": "^0.0.20", - "@opentripplanner/transitive-overlay": "^0.0.20", - "@opentripplanner/trip-details": "^0.0.20", - "@opentripplanner/trip-form": "^0.0.20", - "@opentripplanner/trip-viewer-overlay": "^0.0.20", - "@opentripplanner/vehicle-rental-overlay": "^0.0.20", + "@opentripplanner/base-map": "^0.0.21", + "@opentripplanner/core-utils": "^0.0.21", + "@opentripplanner/endpoints-overlay": "^0.0.21", + "@opentripplanner/from-to-location-picker": "^0.0.21", + "@opentripplanner/geocoder": "^0.0.21", + "@opentripplanner/humanize-distance": "^0.0.21", + "@opentripplanner/icons": "^0.0.21", + "@opentripplanner/itinerary-body": "^0.0.21", + "@opentripplanner/location-field": "^0.0.21", + "@opentripplanner/location-icon": "^0.0.21", + "@opentripplanner/park-and-ride-overlay": "^0.0.21", + "@opentripplanner/printable-itinerary": "^0.0.21", + "@opentripplanner/route-viewer-overlay": "^0.0.21", + "@opentripplanner/stop-viewer-overlay": "^0.0.21", + "@opentripplanner/stops-overlay": "^0.0.21", + "@opentripplanner/transitive-overlay": "^0.0.21", + "@opentripplanner/trip-details": "^0.0.21", + "@opentripplanner/trip-form": "^0.0.21", + "@opentripplanner/trip-viewer-overlay": "^0.0.21", + "@opentripplanner/vehicle-rental-overlay": "^0.0.21", "@turf/along": "^6.0.1", "bootstrap": "^3.3.7", "bowser": "^1.9.3", diff --git a/yarn.lock b/yarn.lock index e2ad479a9..97a5b88ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1331,18 +1331,18 @@ universal-user-agent "^3.0.0" url-template "^2.0.8" -"@opentripplanner/base-map@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/base-map/-/base-map-0.0.20.tgz#35f1b81179080e5b2573a67b9ce9408dde390bd2" - integrity sha512-FR9C93sou4d+3b7wytDsMRZQ/Zeu7ZJGAoQ8WiHlPnCIS/grRTWeihQysK1zga9JAerpBocvIvLc2pF3DyJAIw== +"@opentripplanner/base-map@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/base-map/-/base-map-0.0.21.tgz#5464e0442023c82a158add051389636e15208f27" + integrity sha512-/SHActy1z2GWfsXj6CPyJk33noU30KCALOnRxq69xYazVJw5k6Ih57ku7ZfSdxygmEEQXS/LTGsPvnqdLzkObQ== dependencies: - "@opentripplanner/core-utils" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/core-utils@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-0.0.20.tgz#057914abe4f395cc9bb5468a97b620ad6e46efe4" - integrity sha512-nwUk/FCJ2X68SM8zN53SFGD2x3ooMirJ2JRcA22U2v8hsEU6NywaSiDDvG1/kjC+WWHbHSNLP5VACSnFc7UAWA== +"@opentripplanner/core-utils@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/core-utils/-/core-utils-0.0.21.tgz#89cc5d54a0898132bad463b43e4195028ffa0686" + integrity sha512-wsoRfOMUsLui+8i8savx/5+/m64gyoQF1izJMFtvytnXMVr6gQavjl36pW2xejUg9xkyIjrfEvkO7paCXqQ23w== dependencies: "@mapbox/polyline" "^1.1.0" "@turf/along" "^6.0.1" @@ -1353,172 +1353,172 @@ prop-types "^15.7.2" qs "^6.9.1" -"@opentripplanner/endpoints-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/endpoints-overlay/-/endpoints-overlay-0.0.20.tgz#386835b7ab0fb18d68eb5035ab4984f55717363d" - integrity sha512-1miuJBESWRBXR5TH2EUrUyn/zKeTngcoitWfWUbX322rRv3D6soNd7BdOSqQ1waxKHobqWKC1Tq/Az2RbfZhIg== +"@opentripplanner/endpoints-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/endpoints-overlay/-/endpoints-overlay-0.0.21.tgz#6b709aac4948ee153ef24438af60c75218a56ee7" + integrity sha512-dZtI8RbngE/wzgjvXy8cHolAt1yw0OvoVSjF5pxjoGuFu3j0Oyo23G2/Ls+FbHgr8StBaUovVoMcm7viq50RUA== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/location-icon" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/location-icon" "^0.0.21" prop-types "^15.7.2" styled-icons "^9.1.0" -"@opentripplanner/from-to-location-picker@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/from-to-location-picker/-/from-to-location-picker-0.0.20.tgz#e945a286ae39077b3fbd3ddf1f31cbb38ea4a067" - integrity sha512-b+bLWcDu9y5jYUz078isXGnyhTlO0gSXBTtYoEOsm0Y7RNDIfvrytKDxSKAyPnaRnaftkbsUcXTmUfUTXCw2PQ== +"@opentripplanner/from-to-location-picker@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/from-to-location-picker/-/from-to-location-picker-0.0.21.tgz#0166fc9afbff15e4fb2fa06b85249b2e22994596" + integrity sha512-aaTpm5ZZNetuRdWZCYEqR5ry8ToKAOHA1+PLequAEA8MzMqsz3mlmqroIEQGPW5Ij2ajvUxRqCGIi9j7boaViQ== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/location-icon" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/location-icon" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/geocoder@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/geocoder/-/geocoder-0.0.20.tgz#479eed134f4bb68cde9442c049b2630e5eaa499c" - integrity sha512-EkTLmdrBzw0ABFiOrJCEM6ajK5D2T+KFD3FcTowTi7e1esGWpXzEDb7VvbobMaMhwDCztenv1s0APd9J9o0B0g== +"@opentripplanner/geocoder@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/geocoder/-/geocoder-0.0.21.tgz#3d7532587c0a92a1852daf2b9320930dbe23fe87" + integrity sha512-+ukQNTTYR65b2d3me2LutjaVfiBYdU7Y3QhbE9fDqT429b4b9cCvrIKQjlq2y7TnAKnSoqgf9r9JR0hMi3Q+TA== dependencies: "@conveyal/geocoder-arcgis-geojson" "^0.0.2" "@conveyal/lonlat" "^1.4.0" isomorphic-mapzen-search "^1.4.1" lodash.memoize "^4.1.2" -"@opentripplanner/humanize-distance@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/humanize-distance/-/humanize-distance-0.0.20.tgz#06eab437c92b8eea5d9596957d7fbcc8c2bd4500" - integrity sha512-m+3gpoSDGY13f8WRIx8fSkVi6Qhv23fG3zbY6oymFQ+j5bMPow4f6XJO2nIY+pI0EbipPEKWbpeRwmXZWlWspg== +"@opentripplanner/humanize-distance@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/humanize-distance/-/humanize-distance-0.0.21.tgz#2f7fd209fcaec3d09a8943152c0f36d34982dec4" + integrity sha512-7EO1RcTJ3QXCZkSxaWiV7pglxV/Fb6liUblqEZqvPmHPJq3zZ7u5p5pHD/w1McQyFmCLhCulIPmpke1uZ/+25g== -"@opentripplanner/icons@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/icons/-/icons-0.0.20.tgz#951c75ed093fb9d74e4b4fc7d2af45ced446b856" - integrity sha512-vV81bsB7b3XN8lED3A55Qrjx84lUJyiVY99f13W1oqRlaP1xFIk4MSspg6hHoyanLiZBGp+vdcwWYnKJk4LLtw== +"@opentripplanner/icons@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/icons/-/icons-0.0.21.tgz#fc72c834c6002db81f62a5c5ada22882636b8bc6" + integrity sha512-o41BKUQSbs+H8AJ1FfrlBthxquVtnl8X2GHGVuPyfZCj21nxifD0l7aUrmzzxdCCSgJPvHLuxdq+Nw8QXF6u/g== dependencies: - "@opentripplanner/core-utils" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/itinerary-body@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-0.0.20.tgz#0f24a4ac0ccd4de21451c5255ec673450bc8198c" - integrity sha512-u3MQUg3SAYs5hMHf2sIPZDF8VLHmeWpXaDW33Pi7WJyn5fJ5AYXsdisEwc87+inOoG0zB6d5usTUkB8Ldlx/rA== +"@opentripplanner/itinerary-body@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/itinerary-body/-/itinerary-body-0.0.21.tgz#8a2eeb3146b92803609d84395f137fb187646c78" + integrity sha512-4RcoZpYTDgCA5Kcm2LXQbnC8qkU9jqcEULD+g50fBmuLIqeMarJt7LqsqlvmwPaukv0SuYUBoCnRmFJ4N1n4VA== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/humanize-distance" "^0.0.20" - "@opentripplanner/icons" "^0.0.20" - "@opentripplanner/location-icon" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/humanize-distance" "^0.0.21" + "@opentripplanner/icons" "^0.0.21" + "@opentripplanner/location-icon" "^0.0.21" currency-formatter "^1.5.5" moment "^2.24.0" prop-types "^15.7.2" react-resize-detector "^4.2.1" velocity-react "^1.4.3" -"@opentripplanner/location-field@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-0.0.20.tgz#f2b019bde39dfdb570789afc078e1bb1808941d0" - integrity sha512-+SC9IHpJ49KzvAw03IIH8HlvRcGx9kNGdIdJ6PtGSNCsOd/91/LkfKTdLeI/Z24axWQpdSPM6BhGCyilIoVqfg== +"@opentripplanner/location-field@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/location-field/-/location-field-0.0.21.tgz#8fbe7c020fa151cbf4b05e658a03b9bb5f3f413d" + integrity sha512-DFhGkblCRJhFi3PRCpSAPBhpgh1Vs18JSrXZ4/PrpIOF81LupksmWx3vdlT7+2LZQk56diCKC/qNZKnp8qhgQA== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/geocoder" "^0.0.20" - "@opentripplanner/humanize-distance" "^0.0.20" - "@opentripplanner/location-icon" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/geocoder" "^0.0.21" + "@opentripplanner/humanize-distance" "^0.0.21" + "@opentripplanner/location-icon" "^0.0.21" prop-types "^15.7.2" styled-icons "^9.1.0" throttle-debounce "^2.1.0" -"@opentripplanner/location-icon@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/location-icon/-/location-icon-0.0.20.tgz#8f88522cec37e0c37b051421ba315e2065d464d7" - integrity sha512-TTtoV7s4moNQ++h1TRQhFFTRueRfoNgVnV8fnLhE77T0rf6UXHDhbZNlt1nm/wyHcYF1MbTynQmZmID85V9UMg== +"@opentripplanner/location-icon@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/location-icon/-/location-icon-0.0.21.tgz#296e0a8f1c06abbff03d04167468f04469060638" + integrity sha512-sliDW9jn0wL3oKViJ0GigdS9qfgm89qj5yGR8gd454bp7L1DH/xaZzjc8TxpbAGb4+Z9trhFwWyqkRd3yz5BMg== dependencies: styled-icons "^9.1.0" -"@opentripplanner/park-and-ride-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/park-and-ride-overlay/-/park-and-ride-overlay-0.0.20.tgz#0342a798f9a147143f8821062d477751d6145999" - integrity sha512-SiJMZnhD8mG8771pbryfYa+a8T+UnBoFMocu6SB4S911CnRwoFDnaMNosIH6hVrzZquisBWnrsTdJHRMnCkI3w== +"@opentripplanner/park-and-ride-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/park-and-ride-overlay/-/park-and-ride-overlay-0.0.21.tgz#af8e2d9be92610936ca59919c67a9ca1b1405fa7" + integrity sha512-r8bigQi7ZEmAT5e5KbY0JLyISUs055jlOEEKpjlpnP27EkDnE56pQSbRcCUVz4PGH0uFwEV5b5IJNzxP09UBuQ== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/from-to-location-picker" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/from-to-location-picker" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/printable-itinerary@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/printable-itinerary/-/printable-itinerary-0.0.20.tgz#d48b9f78ba41827d820bc496c0300a7cd2839c64" - integrity sha512-KuZA0Z6S3Nn35uPoZGChlEOjRSmgBmIcG+bdSBscHo5TbdoX3D1WLfGtIYeph7adLnFljSMHIyATvS1d6Hn7Mw== +"@opentripplanner/printable-itinerary@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/printable-itinerary/-/printable-itinerary-0.0.21.tgz#b0fc8bb37d0a209f7524cd7ef14d18539e2c1a71" + integrity sha512-dnPtxjtnP1IT0Ntho+r7Q33o+wEJi6PdagFkVsTaZdVBBzSt1maNTBzDWa7hD9GALV8WrtDZg+HRH5yBP8FDsw== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/humanize-distance" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/humanize-distance" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/route-viewer-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/route-viewer-overlay/-/route-viewer-overlay-0.0.20.tgz#61e9fdbfc248d84b77733a31fbb7c5d5a0c27f1e" - integrity sha512-Vrejj8DFUfLWt/AN8ogepEH+wRlEyfLQosBA5ynEg/xaExSSDaiRA7Ite2CHvpuJfbDKZfTtWLrP6k4Gf0bL/A== +"@opentripplanner/route-viewer-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/route-viewer-overlay/-/route-viewer-overlay-0.0.21.tgz#219689a28e34d715922a8c866bc8c71404be6f79" + integrity sha512-rxRj+dV44b52j9GbGSYbncz6ORtfZOXolJggteCkE5oDxcsr4Wmv6fYlTjyfqhPQlXFS/Rc6w61ztHKXcysE/Q== dependencies: "@mapbox/polyline" "^1.1.0" - "@opentripplanner/core-utils" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/stop-viewer-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/stop-viewer-overlay/-/stop-viewer-overlay-0.0.20.tgz#8448757238081feace0c0d4852fd39247cd795e2" - integrity sha512-UmBs0xLW4/rTOCrasg53vqIZZM/EVNrCDJJmbhGN/y8ZWZpzpWowlpzo2S/qZiSrLhc00+KdluBwRVcnA+Lx4A== +"@opentripplanner/stop-viewer-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/stop-viewer-overlay/-/stop-viewer-overlay-0.0.21.tgz#4ae6a258ed831eb3944a9730f5af14fd0125c779" + integrity sha512-qcRfY6WVDi2hQVz8grXex7hzm86VPpoD1vzV19UCNSW4g0STK+0iRnrIj7wrzZdOIpMS7t92gvE1d7WxhXFTcQ== dependencies: - "@opentripplanner/core-utils" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/stops-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/stops-overlay/-/stops-overlay-0.0.20.tgz#1fcbce27a0d9438616cb861169d4a6ec3d5ea0e9" - integrity sha512-3m7p7eSWYu8mil7qy/DqqK7eOK26ccQEuvbIhur/btyYaKpKYLodIXoO3mH3UarJfTpQzRMdeQ+W3YTobMYgZg== +"@opentripplanner/stops-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/stops-overlay/-/stops-overlay-0.0.21.tgz#ee79b26b1bb6751ec25a33544f85ba416ed21042" + integrity sha512-TPWiRZ7mV+MYu50l0WOkvZfRxjMjaXYL9mruNWG09cx0HuiGObD4o3xtxEmggMoMVjgktyb02G7KOE1OQrKTgA== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/from-to-location-picker" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/from-to-location-picker" "^0.0.21" -"@opentripplanner/transitive-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/transitive-overlay/-/transitive-overlay-0.0.20.tgz#93f30afcd248e1705feac08e0a385683dcdc84fd" - integrity sha512-lOuWjwb6LlhjMRKjSVeNmBjrsdNewwNe3pnLJjpAnWhSTeunLATiv8aYQk8TYGJz2AclSgYYzySgBWHXnF6Pzw== +"@opentripplanner/transitive-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/transitive-overlay/-/transitive-overlay-0.0.21.tgz#ac889766cf6dbb8a4f1ec61316d393088f1f4866" + integrity sha512-+v9qSWE71kL8iv9BL+RJ6GamVUVnotOBIxo4zmN9YuwJSpqsMZCjvUd03Ix5Q2TKGaAKIgCObezDPlu2IJHMfg== dependencies: - "@opentripplanner/core-utils" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" lodash.isequal "^4.5.0" transitive-js "^0.13.0" -"@opentripplanner/trip-details@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/trip-details/-/trip-details-0.0.20.tgz#ef80eee732e24d6c17d771f6f7d9f9d83deb27cd" - integrity sha512-nZDXHyBgghQZAdu2mLg51Lc5M6OraK6Vp5aYesXVa1ARBwug2hr0W2R/N6F4nQmU5SI0RQAN/b5irGplsKnnXw== +"@opentripplanner/trip-details@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/trip-details/-/trip-details-0.0.21.tgz#1eaf85dbaa1688c338e41330f4f30def7a7d1c36" + integrity sha512-vMy+1i/wOl0ZPQDqfWUyl5kjxI9Mv2+NJKl3xylwmUBFQynaGl61vmG4GKRBBNWucPWqQGVKXo8z72qRoLZNZg== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/humanize-distance" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/humanize-distance" "^0.0.21" moment "^2.24.0" prop-types "^15.7.2" styled-icons "^9.1.0" velocity-react "^1.4.3" -"@opentripplanner/trip-form@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/trip-form/-/trip-form-0.0.20.tgz#823e23ef8e332f5aa3fe85306ee65a0bee17f914" - integrity sha512-GZOZj4mCyPWx64OO1klZpsJ0JEggxmG5Qx264fwue9l8pun4D9DuCJFbclw51Tu/vLJ0VUuFZJBlECRCKeussg== +"@opentripplanner/trip-form@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/trip-form/-/trip-form-0.0.21.tgz#5f9deb9ac2bf34d3ce26c19f14392cf3850a999a" + integrity sha512-3MqOAx8L+14vO3Tr+j6YbhctYGHXnxbYyGZONI6OpijlmRINmxCKG7oK/VX+8PjWftqZggEUGW09FUiEUhh/hg== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/icons" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/icons" "^0.0.21" moment "^2.17.1" -"@opentripplanner/trip-viewer-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/trip-viewer-overlay/-/trip-viewer-overlay-0.0.20.tgz#f65ed3527edea2e2304b5e02394b62ac69de7c0e" - integrity sha512-neLU+iO1dTYSXefW00IltdO0vdxtkEJpMG9GiFOUCgVAvLhyHuJca1aofgKZmcsArLhRo7eV2T8YzEHf3EiOCQ== +"@opentripplanner/trip-viewer-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/trip-viewer-overlay/-/trip-viewer-overlay-0.0.21.tgz#9b4515db20ea106c7160ac38773f5cb7f3d651b3" + integrity sha512-YI/tks6QAjA9dGOp6hd7yC/SxIXQ5DvI9T4UewEFIxembXD920wlcF4GF8DFlmB/GPF67m6Qz7rfvrq+qjjKcw== dependencies: "@mapbox/polyline" "^1.1.0" - "@opentripplanner/core-utils" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" prop-types "^15.7.2" -"@opentripplanner/vehicle-rental-overlay@^0.0.20": - version "0.0.20" - resolved "https://registry.yarnpkg.com/@opentripplanner/vehicle-rental-overlay/-/vehicle-rental-overlay-0.0.20.tgz#ef30b97f8c1080497056246a59f371f96efabc11" - integrity sha512-7ujSgc2mG/hZpZEL3DW+v3fIWSBUY3BOxoyqPlE0KhoE805KQi99LMxUYre+ovcEyIhcr0OKGSig0Br0X6banw== +"@opentripplanner/vehicle-rental-overlay@^0.0.21": + version "0.0.21" + resolved "https://registry.yarnpkg.com/@opentripplanner/vehicle-rental-overlay/-/vehicle-rental-overlay-0.0.21.tgz#5dc3396329d46d05c1da6db0dca3e4311b9bfcbb" + integrity sha512-8OY42IwWM+4sA2rmyJRZhE/CnOfmH6HHsqFoYrnhBp/U4U7BKsXpyuZwVr9yYhKZoY8zibj75MYso5R49UUarQ== dependencies: - "@opentripplanner/core-utils" "^0.0.20" - "@opentripplanner/from-to-location-picker" "^0.0.20" + "@opentripplanner/core-utils" "^0.0.21" + "@opentripplanner/from-to-location-picker" "^0.0.21" lodash.memoize "^4.1.2" prop-types "^15.7.2" styled-icons "^9.1.0"