From fa9be8b27789a17baf2a7c9585ed7d3c405a1133 Mon Sep 17 00:00:00 2001 From: Henrik Sundell Date: Wed, 11 Sep 2024 17:58:38 +0300 Subject: [PATCH 1/6] Add entrance and exit info to walk leg --- app/component/itinerary/Legs.js | 4 ++-- app/component/itinerary/WalkLeg.js | 20 ++++++++++++++++++-- app/translations.js | 6 ++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/component/itinerary/Legs.js b/app/component/itinerary/Legs.js index 6a46710ac2..163b90adcb 100644 --- a/app/component/itinerary/Legs.js +++ b/app/component/itinerary/Legs.js @@ -83,7 +83,6 @@ export default class Legs extends React.Component { const { itinerary, fares, showBikeBoardingInformation, relayEnvironment } = this.props; const { waitThreshold } = this.context.config.itinerary; - const compressedLegs = compressLegs(itinerary.legs, true).map(leg => ({ showBikeBoardingInformation, ...leg, @@ -174,7 +173,7 @@ export default class Legs extends React.Component { legs.push(); } else if (isLegOnFoot(leg)) { legs.push( - + {stopCode(leg.from.stop)} , ); @@ -281,6 +280,7 @@ export default class Legs extends React.Component { index={numberOfLegs} leg={compressedLegs[numberOfLegs - 1]} previousLeg={compressedLegs[numberOfLegs - 2]} + nextLeg={compressedLegs[numberOfLegs]} focusAction={this.focus(compressedLegs[numberOfLegs - 1].to)} focusToLeg={this.focusToLeg(compressedLegs[numberOfLegs - 1])} > diff --git a/app/component/itinerary/WalkLeg.js b/app/component/itinerary/WalkLeg.js index e3b652de9b..af705ca0ee 100644 --- a/app/component/itinerary/WalkLeg.js +++ b/app/component/itinerary/WalkLeg.js @@ -22,7 +22,7 @@ import { splitStringToAddressAndPlace } from '../../util/otpStrings'; import VehicleRentalLeg from './VehicleRentalLeg'; function WalkLeg( - { children, focusAction, focusToLeg, index, leg, previousLeg }, + { children, focusAction, focusToLeg, index, leg, previousLeg, nextLeg }, { config, intl }, ) { const distance = displayDistance( @@ -30,7 +30,6 @@ function WalkLeg( config, intl.formatNumber, ); - // const duration = durationToString( leg.mode !== 'WALK' ? 0 : leg.duration * 1000, ); @@ -229,6 +228,15 @@ function WalkLeg( )}
+ {nextLeg?.mode === 'SUBWAY' && ( +
+ + +
+ )}
+ {previousLeg?.mode === 'SUBWAY' && ( +
+ + +
+ )}
@@ -260,11 +274,13 @@ WalkLeg.propTypes = { index: PropTypes.number.isRequired, leg: legShape.isRequired, previousLeg: legShape, + nextLeg: legShape, focusToLeg: PropTypes.func.isRequired, }; WalkLeg.defaultProps = { previousLeg: undefined, + nextLeg: undefined, children: undefined, }; diff --git a/app/translations.js b/app/translations.js index 77379d0da8..bd5d09fa49 100644 --- a/app/translations.js +++ b/app/translations.js @@ -877,6 +877,8 @@ const translations = { 'set-time-earlier-button-label': 'Set travel time to earlier', 'set-time-later-button-label': 'Set travel time to later', 'set-time-now-button-label': 'Set travel time to current', + 'station-entrance': 'Entrance', + 'station-exit': 'Exit', 'time-navigation-buttons': 'Time navigation buttons', 'time-selector-form': 'Edit time', // eslint-disable-next-line sort-keys @@ -2095,6 +2097,8 @@ const translations = { 'set-time-earlier-button-label': 'Aikaista matkustusajankohtaa', 'set-time-later-button-label': 'Myöhäistä matkustusajankohtaa', 'set-time-now-button-label': 'Aseta matkustusajankohdaksi nyt', + 'station-entrance': 'Sisäänkäynti', + 'station-exit': 'Uloskäynti', 'time-navigation-buttons': 'Matkustusajankohdan muokkausnapit', 'time-selector-form': 'Muokkaa Matkustusajankohtaa', // eslint-disable-next-line sort-keys @@ -4956,6 +4960,8 @@ const translations = { 'set-time-earlier-button-label': 'Ställ in restid till tidigare', 'set-time-later-button-label': 'Ställ in restid till senare', 'set-time-now-button-label': 'Ställ in restid till nu', + 'station-entrance': 'Ingång', + 'station-exit': 'Utgång', 'time-navigation-buttons': 'Tidsnavigeringsknappar', 'time-selector-form': 'Redigera tid', // eslint-disable-next-line sort-keys From c2ca6d992148f9120a3591fa3fc5c403ff0d31f7 Mon Sep 17 00:00:00 2001 From: Henrik Sundell Date: Fri, 13 Sep 2024 17:02:57 +0300 Subject: [PATCH 2/6] Add name of subway station door to walk leg --- app/component/itinerary/Itinerary.js | 1 - app/component/itinerary/ItineraryDetails.js | 5 +++ app/component/itinerary/PlanConnection.js | 5 +++ app/component/itinerary/WalkLeg.js | 11 ++++++ app/util/shapes.js | 7 ++++ build/schema.graphql | 2 + static/assets/svg-sprite.default.svg | 44 +++++++++++++++++++++ static/assets/svg-sprite.hsl.svg | 44 +++++++++++++++++++++ 8 files changed, 118 insertions(+), 1 deletion(-) diff --git a/app/component/itinerary/Itinerary.js b/app/component/itinerary/Itinerary.js index af4b12d6f3..3027ed1ff2 100644 --- a/app/component/itinerary/Itinerary.js +++ b/app/component/itinerary/Itinerary.js @@ -89,7 +89,6 @@ export function RouteLeg( const isCallAgency = isCallAgencyPickupType(leg); let routeNumber; const mode = getRouteMode(leg.route); - const getOccupancyStatus = () => { if (hasOneTransitLeg) { return getCapacityForLeg(config, leg); diff --git a/app/component/itinerary/ItineraryDetails.js b/app/component/itinerary/ItineraryDetails.js index 21964b3d44..32f4b3d393 100644 --- a/app/component/itinerary/ItineraryDetails.js +++ b/app/component/itinerary/ItineraryDetails.js @@ -391,6 +391,11 @@ const withRelay = createFragmentContainer( legGeometry { points } + steps { + entrance + lat + lon + } nextLegs( numberOfLegs: 2 originModesWithParentStation: [RAIL] diff --git a/app/component/itinerary/PlanConnection.js b/app/component/itinerary/PlanConnection.js index 191711fe9a..3b2968b248 100644 --- a/app/component/itinerary/PlanConnection.js +++ b/app/component/itinerary/PlanConnection.js @@ -76,6 +76,11 @@ const planConnection = graphql` route { gtfsId } + steps { + entrance + lat + lon + } trip { gtfsId directionId diff --git a/app/component/itinerary/WalkLeg.js b/app/component/itinerary/WalkLeg.js index af705ca0ee..2332d349c9 100644 --- a/app/component/itinerary/WalkLeg.js +++ b/app/component/itinerary/WalkLeg.js @@ -73,6 +73,7 @@ function WalkLeg( defaultMessage: 'scooter', }) : leg.to?.name; + const entranceName = leg.steps?.find(step => step.entrance)?.entrance; return (
@@ -235,6 +236,11 @@ function WalkLeg( defaultMessage="Entrance" /> + {entranceName && entranceName !== 'MAIN_ENTRANCE' && ( + + )}
)}
@@ -260,6 +266,11 @@ function WalkLeg(
+ {entranceName && entranceName !== 'MAIN_ENTRANCE' && ( + + )}
)}
diff --git a/app/util/shapes.js b/app/util/shapes.js index 74614a8b52..a38b7e9d8e 100644 --- a/app/util/shapes.js +++ b/app/util/shapes.js @@ -219,6 +219,13 @@ export const legShape = PropTypes.shape({ trip: tripShape, agency: agencyShape, fare: fareShape, + steps: PropTypes.arrayOf( + PropTypes.shape({ + entrance: PropTypes.string, + lat: PropTypes.number, + lon: PropTypes.number, + }), + ), from: PropTypes.shape({ name: PropTypes.string, stop: stopShape, diff --git a/build/schema.graphql b/build/schema.graphql index 6e1195f590..fa8f91343e 100644 --- a/build/schema.graphql +++ b/build/schema.graphql @@ -2607,6 +2607,8 @@ type step { bogusName: Boolean "The distance in meters that this step takes." distance: Float + "The name of an station entrance" + entrance: String "The elevation profile as a list of { distance, elevation } values." elevationProfile: [elevationProfileComponent] "When exiting a highway or traffic circle, the exit name/number." diff --git a/static/assets/svg-sprite.default.svg b/static/assets/svg-sprite.default.svg index 48df87502b..41fbdd4195 100644 --- a/static/assets/svg-sprite.default.svg +++ b/static/assets/svg-sprite.default.svg @@ -468,6 +468,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/svg-sprite.hsl.svg b/static/assets/svg-sprite.hsl.svg index 3bc295ea46..0cde1135a1 100644 --- a/static/assets/svg-sprite.hsl.svg +++ b/static/assets/svg-sprite.hsl.svg @@ -108,6 +108,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a57debb802d593f4d3ab851043e24e9910f9edd7 Mon Sep 17 00:00:00 2001 From: Henrik Sundell Date: Wed, 16 Oct 2024 15:02:51 +0300 Subject: [PATCH 3/6] Add inside walk leg --- app/component/itinerary/ItineraryDetails.js | 13 ++- app/component/itinerary/PlanConnection.js | 7 +- app/component/itinerary/WalkLeg.js | 19 ++-- app/component/map/ItineraryLine.js | 100 ++++++++++++++++++-- app/component/map/Line.js | 5 + app/component/map/map.scss | 10 ++ sass/themes/default/_theme.scss | 1 + 7 files changed, 133 insertions(+), 22 deletions(-) diff --git a/app/component/itinerary/ItineraryDetails.js b/app/component/itinerary/ItineraryDetails.js index 32f4b3d393..fea063233b 100644 --- a/app/component/itinerary/ItineraryDetails.js +++ b/app/component/itinerary/ItineraryDetails.js @@ -392,10 +392,15 @@ const withRelay = createFragmentContainer( points } steps { - entrance - lat - lon - } + entity { + __typename + ... on Entrance { + code + } + } + lat + lon + } nextLegs( numberOfLegs: 2 originModesWithParentStation: [RAIL] diff --git a/app/component/itinerary/PlanConnection.js b/app/component/itinerary/PlanConnection.js index 3b2968b248..f337aadf71 100644 --- a/app/component/itinerary/PlanConnection.js +++ b/app/component/itinerary/PlanConnection.js @@ -77,7 +77,12 @@ const planConnection = graphql` gtfsId } steps { - entrance + entity { + __typename + ... on Entrance { + code + } + } lat lon } diff --git a/app/component/itinerary/WalkLeg.js b/app/component/itinerary/WalkLeg.js index 2332d349c9..d521779aea 100644 --- a/app/component/itinerary/WalkLeg.js +++ b/app/component/itinerary/WalkLeg.js @@ -73,7 +73,10 @@ function WalkLeg( defaultMessage: 'scooter', }) : leg.to?.name; - const entranceName = leg.steps?.find(step => step.entrance)?.entrance; + const entranceName = leg?.steps?.find( + // eslint-disable-next-line no-underscore-dangle + step => step?.entity?.__typename === 'Entrance' || step?.entity?.code, + )?.entity?.code; return (
@@ -229,12 +232,9 @@ function WalkLeg( )}
- {nextLeg?.mode === 'SUBWAY' && ( + {previousLeg?.mode === 'SUBWAY' && (
- + {entranceName && entranceName !== 'MAIN_ENTRANCE' && (
- {previousLeg?.mode === 'SUBWAY' && ( + {nextLeg?.mode === 'SUBWAY' && (
- + {entranceName && entranceName !== 'MAIN_ENTRANCE' && ( , - ); + if ( + leg.mode === 'WALK' && + (nextLeg?.mode === 'SUBWAY' || previousLeg?.mode === 'SUBWAY') + ) { + const entranceObject = leg?.steps?.find( + // eslint-disable-next-line no-underscore-dangle + step => step?.entity?.__typename === 'Entrance' || step?.entity?.code, + ); + if (entranceObject) { + const entranceCoordinates = [entranceObject.lat, entranceObject.lon]; + + const getDistance = (coord1, coord2) => { + const [lat1, lon1] = coord1; + const [lat2, lon2] = coord2; + return Math.sqrt((lat1 - lat2) ** 2 + (lon1 - lon2) ** 2); + }; + + const entranceIndex = geometry.reduce( + (closestIdx, currentCoord, currentIdx) => { + const currentDistance = getDistance( + entranceCoordinates, + currentCoord, + ); + const closestDistance = getDistance( + entranceCoordinates, + geometry[closestIdx], + ); + return currentDistance < closestDistance + ? currentIdx + : closestIdx; + }, + 0, + ); + + objs.push( + , + ); + objs.push( + , + ); + } else { + objs.push( + , + ); + } + } else { + objs.push( + , + ); + } if ( this.props.showDurationBubble || @@ -257,6 +329,16 @@ export default createFragmentContainer(ItineraryLine, { legGeometry { points } + steps { + entity { + __typename + ... on Entrance { + code + } + } + lat + lon + } transitLeg interlineWithPreviousLeg route { diff --git a/app/component/map/Line.js b/app/component/map/Line.js index 32bee4a443..c5c253841a 100644 --- a/app/component/map/Line.js +++ b/app/component/map/Line.js @@ -99,6 +99,11 @@ export default class Line extends React.Component { if (this.props.mode === 'walk') { legWeight *= 0.8; } + + if (this.props.mode === 'walk-inside') { + legWeight *= 0.8; + } + if (this.props.passive) { haloWeight *= 0.5; legWeight *= 0.5; diff --git a/app/component/map/map.scss b/app/component/map/map.scss index 9ed66118af..7380c5a8d8 100644 --- a/app/component/map/map.scss +++ b/app/component/map/map.scss @@ -1250,6 +1250,16 @@ div.origin-popup { stroke-opacity: 0.5; } +.map-line.walk-inside.leg { + color: #fff; + stroke: round; + stroke-dasharray: 0.1 11; +} + +.leg-halo.walk-inside.map-line { + stroke: $walk-inside-color; +} + /* Fix to default leaflet behavior */ .leaflet-map-pane svg { position: relative; diff --git a/sass/themes/default/_theme.scss b/sass/themes/default/_theme.scss index 746ee791dd..fb5e1ab5bc 100644 --- a/sass/themes/default/_theme.scss +++ b/sass/themes/default/_theme.scss @@ -81,6 +81,7 @@ $bicycle-color: #666; $car-color: #333; $scooter-color: #bababa; $call-agency-color: #666; +$walk-inside-color: #666; /* Fonts */ $font-family: 'Roboto', arial, georgia, serif; From ee1d699342db9181c4747862072a1b5d0edd10fe Mon Sep 17 00:00:00 2001 From: Henrik Sundell Date: Wed, 16 Oct 2024 18:21:04 +0300 Subject: [PATCH 4/6] Remove default names from subway entrances --- app/component/itinerary/WalkLeg.js | 4 ++-- build/schema.graphql | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/component/itinerary/WalkLeg.js b/app/component/itinerary/WalkLeg.js index d521779aea..3abca6d1b1 100644 --- a/app/component/itinerary/WalkLeg.js +++ b/app/component/itinerary/WalkLeg.js @@ -236,7 +236,7 @@ function WalkLeg(
- {entranceName && entranceName !== 'MAIN_ENTRANCE' && ( + {entranceName && ( @@ -269,7 +269,7 @@ function WalkLeg( defaultMessage="Entrance" /> - {entranceName && entranceName !== 'MAIN_ENTRANCE' && ( + {entranceName && ( diff --git a/build/schema.graphql b/build/schema.graphql index fa8f91343e..a904208c1e 100644 --- a/build/schema.graphql +++ b/build/schema.graphql @@ -2590,6 +2590,12 @@ type serviceTimeRange { start: Long } +type Entrance { + code: String +} + +union StepEntity = Entrance + type step { "The cardinal (compass) direction (e.g. north, northeast) taken when engaging this step." absoluteDirection: AbsoluteDirection @@ -2607,8 +2613,6 @@ type step { bogusName: Boolean "The distance in meters that this step takes." distance: Float - "The name of an station entrance" - entrance: String "The elevation profile as a list of { distance, elevation } values." elevationProfile: [elevationProfileComponent] "When exiting a highway or traffic circle, the exit name/number." @@ -2625,6 +2629,7 @@ type step { streetName: String "Is this step walking with a bike?" walkingBike: Boolean + entity: StepEntity } type stopAtDistance implements Node { From f177a79b2f0304a7d9e4713a71e627b10165cbad Mon Sep 17 00:00:00 2001 From: Henrik Sundell Date: Mon, 21 Oct 2024 21:08:17 +0300 Subject: [PATCH 5/6] Fix walk leg line --- app/component/map/ItineraryLine.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/component/map/ItineraryLine.js b/app/component/map/ItineraryLine.js index 151075c2da..377b2db71b 100644 --- a/app/component/map/ItineraryLine.js +++ b/app/component/map/ItineraryLine.js @@ -113,13 +113,21 @@ class ItineraryLine extends React.Component { leg.mode === 'WALK' && (nextLeg?.mode === 'SUBWAY' || previousLeg?.mode === 'SUBWAY') ) { - const entranceObject = leg?.steps?.find( + const entranceObjects = leg?.steps?.filter( // eslint-disable-next-line no-underscore-dangle step => step?.entity?.__typename === 'Entrance' || step?.entity?.code, ); + + // Select the entrance to the outside if there are multiple entrances + const entranceObject = + previousLeg?.mode === 'SUBWAY' + ? entranceObjects[entranceObjects.length - 1] + : entranceObjects[0]; + if (entranceObject) { const entranceCoordinates = [entranceObject.lat, entranceObject.lon]; - + // eslint-disable-next-line no-console + console.log('steps', leg.steps); const getDistance = (coord1, coord2) => { const [lat1, lon1] = coord1; const [lat2, lon2] = coord2; @@ -160,7 +168,7 @@ class ItineraryLine extends React.Component { leg.route && leg.route.color ? `#${leg.route.color}` : null } key={`${this.props.hash}_${i}_${mode}_1`} - geometry={geometry.slice(entranceIndex, -1)} + geometry={geometry.slice(entranceIndex)} mode={nextLeg?.mode === 'SUBWAY' ? 'walk-inside' : 'walk'} passive={this.props.passive} />, From 306d79ec0209e194541162f11694cbff0283386f Mon Sep 17 00:00:00 2001 From: Henrik Sundell Date: Wed, 8 Jan 2025 19:42:24 +0200 Subject: [PATCH 6/6] Fix icons --- app/component/itinerary/ItineraryDetails.js | 2 +- app/component/itinerary/PlanConnection.js | 3 +- app/component/itinerary/WalkLeg.js | 53 +++- app/component/itinerary/itinerary.scss | 32 +- app/component/map/ItineraryLine.js | 8 +- build/schema.graphql | 5 +- static/assets/svg-sprite.hsl.svg | 322 ++++++++++++++++++-- 7 files changed, 385 insertions(+), 40 deletions(-) diff --git a/app/component/itinerary/ItineraryDetails.js b/app/component/itinerary/ItineraryDetails.js index fea063233b..e93fbdc7ca 100644 --- a/app/component/itinerary/ItineraryDetails.js +++ b/app/component/itinerary/ItineraryDetails.js @@ -392,7 +392,7 @@ const withRelay = createFragmentContainer( points } steps { - entity { + feature { __typename ... on Entrance { code diff --git a/app/component/itinerary/PlanConnection.js b/app/component/itinerary/PlanConnection.js index f337aadf71..17913dc7d7 100644 --- a/app/component/itinerary/PlanConnection.js +++ b/app/component/itinerary/PlanConnection.js @@ -77,10 +77,11 @@ const planConnection = graphql` gtfsId } steps { - entity { + feature { __typename ... on Entrance { code + wheelchairAccessible } } lat diff --git a/app/component/itinerary/WalkLeg.js b/app/component/itinerary/WalkLeg.js index 3abca6d1b1..2810d7f5ea 100644 --- a/app/component/itinerary/WalkLeg.js +++ b/app/component/itinerary/WalkLeg.js @@ -75,9 +75,18 @@ function WalkLeg( : leg.to?.name; const entranceName = leg?.steps?.find( // eslint-disable-next-line no-underscore-dangle - step => step?.entity?.__typename === 'Entrance' || step?.entity?.code, - )?.entity?.code; + step => step?.feature?.__typename === 'Entrance' || step?.feature?.code, + )?.feature?.code; + const entranceAccessible = leg?.steps?.find( + // eslint-disable-next-line no-underscore-dangle + step => + // eslint-disable-next-line no-underscore-dangle + step?.feature?.__typename === 'Entrance' || + step?.feature?.wheelchairAccessible, + )?.feature?.wheelchairAccessible; + // eslint-disable-next-line no-console + console.log('entranceAccessible', entranceAccessible); return (
@@ -233,14 +242,26 @@ function WalkLeg(
{previousLeg?.mode === 'SUBWAY' && ( -
- - +
+
+ +
+ {entranceName && ( )} + {entranceAccessible === 'POSSIBLE' && ( + + )}
)}
@@ -263,17 +284,29 @@ function WalkLeg( />
{nextLeg?.mode === 'SUBWAY' && ( -
- +
+ +
+ - {entranceName && ( )} + {entranceAccessible === 'POSSIBLE' && ( + + )}
)}
diff --git a/app/component/itinerary/itinerary.scss b/app/component/itinerary/itinerary.scss index 848b819162..2c9d4c9edb 100644 --- a/app/component/itinerary/itinerary.scss +++ b/app/component/itinerary/itinerary.scss @@ -1997,7 +1997,7 @@ $itinerary-tab-switch-height: 48px; .itinerary-leg-action { border-top: 1px solid #ddd; padding: 1.2em 0; - margin-bottom: 1px; + margin-bottom: 1em; height: 60px; font-size: 0.9375rem; @@ -2020,6 +2020,36 @@ $itinerary-tab-switch-height: 48px; } } + .subway-entrance-info-container { + display: flex; + align-items: center; + height: 24px; + margin-top: 1px; + + .subway-entrance-info-text { + margin-right: 0.2em; + align-items: center; + } + + .icon-container { + display: flex; + } + + .subway-entrance-info-icon-metro { + width: 24px; + height: 100%; + vertical-align: middle; + display: flex; + } + + .subway-entrance-info-icon-code { + width: 24px; + height: 100%; + vertical-align: middle; + display: flex; + } + } + .itinerary-leg-intermediate-stops { margin-top: 12px; padding-bottom: 0; diff --git a/app/component/map/ItineraryLine.js b/app/component/map/ItineraryLine.js index 377b2db71b..3476d216b7 100644 --- a/app/component/map/ItineraryLine.js +++ b/app/component/map/ItineraryLine.js @@ -114,8 +114,9 @@ class ItineraryLine extends React.Component { (nextLeg?.mode === 'SUBWAY' || previousLeg?.mode === 'SUBWAY') ) { const entranceObjects = leg?.steps?.filter( - // eslint-disable-next-line no-underscore-dangle - step => step?.entity?.__typename === 'Entrance' || step?.entity?.code, + step => + // eslint-disable-next-line no-underscore-dangle + step?.feature?.__typename === 'Entrance' || step?.feature?.code, ); // Select the entrance to the outside if there are multiple entrances @@ -338,10 +339,11 @@ export default createFragmentContainer(ItineraryLine, { points } steps { - entity { + feature { __typename ... on Entrance { code + wheelchairAccessible } } lat diff --git a/build/schema.graphql b/build/schema.graphql index a904208c1e..37c8602f19 100644 --- a/build/schema.graphql +++ b/build/schema.graphql @@ -2592,9 +2592,10 @@ type serviceTimeRange { type Entrance { code: String + wheelchairAccessible: Boolean } -union StepEntity = Entrance +union StepFeature = Entrance type step { "The cardinal (compass) direction (e.g. north, northeast) taken when engaging this step." @@ -2629,7 +2630,7 @@ type step { streetName: String "Is this step walking with a bike?" walkingBike: Boolean - entity: StepEntity + feature: StepFeature } type stopAtDistance implements Node { diff --git a/static/assets/svg-sprite.hsl.svg b/static/assets/svg-sprite.hsl.svg index 0cde1135a1..1d30d81885 100644 --- a/static/assets/svg-sprite.hsl.svg +++ b/static/assets/svg-sprite.hsl.svg @@ -108,50 +108,320 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + + - + - - - - + + + + + - - + + - - - - + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1089,6 +1359,14 @@ + + + + + + + +