react-taipei-metro
Extensible React Component for SVG Taipei Metro Map. The design is mostly referenced from 曼努 manzoo and the post with some minor modifications.
Install
npm install react-taipei-metro
Example
import React from 'react';
import ReactDOM from 'react-dom';
import MetroMap from 'react-taipei-metro';
class Window extends React.Component {
// Customized your mouse events.
onMouseEnterStation(station, scale) {
console.log('Enter station ' + station.name.en);
}
onMouseLeaveStation(station, scale) {
console.log('Leave station ' + station.name.en);
}
onClickStation(station, scale, e) {
console.log('Station ' + station.name.en + ' clicked.');
}
// You can also render customized svg elements for each station.
renderUserData(station, scale) {
return (<text key={station.id} x={station.center.x} y={station.center.y}
fontSize={10 * scale} fill={this.textColor}
dominantBaseline='middle' textAnchor='middle'>{station.name.en.length}</text>);
}
// See Props for more details.
render() {
return (<MetroMap
width={800} height={900} // The compoent maintains fixed aspect ratio of 8 / 9.
showStationName={true}
onMouseEnterStation={(station, scale) => this.onMouseEnterStation(station, scale)}
onMouseLeaveStation={(station, scale) => this.onMouseLeaveStation(station, scale)}
onClickStation={(station, scale, e) => this.onClickStation(station, scale, e)}
renderUserData={(station, scale) => this.renderUserData(station, scale)} />);
}
}
ReactDOM.render(
<Window />,
document.getElementById('root')
);
Props
Name | Description | Type | Default |
---|---|---|---|
width | Width of component(px) | number | 800 |
height | Height of component(px) | number | 900 |
style | Style of component | object | { } |
bgColor | Background color of component | string | white |
textStyle | Style of station name text | object | { fill: 'black' } |
showStationName | Whether to show station name | bool | true |
showUserData | Whether to show user data | bool | true |
onMouseEnterStation | Event listener when mouse enters a station | func: (station, scale) => { } | - |
onMouseLeaveStation | Event listener when mouse leaves a station | func: (station, scale) => { } | - |
onClickStation | Event listener when mouse clicks on a station | func: (station, scale, e) => { } | - |
renderUseData | Function(s) for rendering user content for each station | func: (station, scale) => JSX or array<func: (station, scale) => JSX> | - |
Function arguments
- station
{
id: 5,
name: { en: 'Yuanshan', zh: '圓山' },
center: { x: 365, y: 373 },
lines: ['R']
}
- scale:
min(props.width / 800, props.height / 900)
Build
npm run build