Style improvements for mobile

This commit is contained in:
vjrj 2018-01-19 11:04:14 +01:00
parent c79f8b5f8b
commit cd16f45d8e
28 changed files with 345 additions and 120 deletions

1
.gitignore vendored
View file

@ -6,3 +6,4 @@ settings-development.json
private/GeoLite2-City.mmdb* private/GeoLite2-City.mmdb*
npm-debug.log npm-debug.log
**/.sass-cache **/.sass-cache
.deploy/

View file

@ -247,12 +247,12 @@
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.25" inkscape:zoom="0.25"
inkscape:cx="-324.9908" inkscape:cx="-324.9908"
inkscape:cy="1157.3585" inkscape:cy="997.3585"
inkscape:document-units="mm" inkscape:document-units="mm"
inkscape:current-layer="layer1" inkscape:current-layer="g22554-45"
showgrid="false" showgrid="false"
inkscape:window-width="1920" inkscape:window-width="1920"
inkscape:window-height="1016" inkscape:window-height="983"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="867" inkscape:window-y="867"
inkscape:window-maximized="1" /> inkscape:window-maximized="1" />
@ -484,18 +484,82 @@
<flowRoot <flowRoot
xml:space="preserve" xml:space="preserve"
id="flowRoot8482" id="flowRoot8482"
style="font-style:normal;font-weight:normal;font-size:192px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;" style="font-style:normal;font-weight:normal;font-size:192px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none"
transform="matrix(0.26458333,0,0,0.26458333,433.29892,-64.826953)" transform="matrix(0.26458333,0,0,0.26458333,433.29892,-64.826953)"
inkscape:export-filename="/mnt/md1/proyectos/dev/todos-contra-el-fuego-web/public/remove-marker.png" inkscape:export-filename="/mnt/md1/proyectos/dev/todos-contra-el-fuego-web/public/remove-marker.png"
inkscape:export-xdpi="14.000002" inkscape:export-xdpi="14.000002"
inkscape:export-ydpi="14.000002"><flowRegion inkscape:export-ydpi="14.000002"><flowRegion
id="flowRegion8484" id="flowRegion8484"
style="font-size:192px;fill:#ff0000;"><rect style="font-size:192px;fill:#ff0000"><rect
id="rect8486" id="rect8486"
width="476.79202" width="476.79202"
height="367.69553" height="367.69553"
x="-1499.0664" x="-1499.0664"
y="-142.19131" y="-142.19131"
style="font-size:192px;fill:#ff0000;" /></flowRegion><flowPara style="font-size:192px;fill:#ff0000" /></flowRegion><flowPara
id="flowPara8488"></flowPara></flowRoot> </g> id="flowPara8488"></flowPara></flowRoot> <g
id="g22554-45"
transform="rotate(-104.78334,-231.82318,51.6182)"
inkscape:export-filename="/mnt/md1/proyectos/dev/todos-contra-el-fuego-web/public/fire-marker.png"
inkscape:export-xdpi="4.0856881"
inkscape:export-ydpi="4.0856881">
<g
id="g8559">
<g
inkscape:export-ydpi="4.0856881"
inkscape:export-xdpi="4.0856881"
inkscape:export-filename="/mnt/md1/proyectos/dev/todos-contra-el-fuego-web/public/fire-marker.png"
transform="rotate(-144.74008,-66.772616,119.34544)"
id="g22554-2">
<path
sodipodi:nodetypes="cszzcczasc"
inkscape:connector-curvature="0"
id="path5329-8"
d="m -25.638382,38.048346 c 11.566313,13.887908 17.1215844,22.244854 13.751242,33.868326 -2.465387,8.50265 -8.895424,18.626534 -18.100172,25.532106 -9.204776,6.905572 -20.549951,13.517692 -24.263404,17.728802 -3.71348,4.21108 -9.835779,11.6046 -10.976769,21.82688 -2.725208,24.7073 15.038044,45.63926 39.702238,48.35952 11.289242,1.2311 26.6324564,-5.2645 34.2331684,-10.31973 C 16.308659,169.98901 28.520768,152.76263 31.570884,138.81099 35.854436,119.21732 35.065926,96.385127 23.626002,79.16853 12.946123,63.095807 3.8673424,50.775037 -25.638382,38.048346 Z"
style="fill:#d41300;fill-opacity:1;stroke:none;stroke-width:10.58333302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cszzcczcsc"
inkscape:connector-curvature="0"
id="path5331-30"
d="m -7.5198746,101.09834 c 4.018254,8.70077 3.821166,14.69136 0.49964,20.18233 -2.429696,4.01667 -7.1125824,8.31964 -12.7749834,10.59336 -5.662401,2.27373 -12.38086,4.1034 -14.860826,5.75067 -2.479966,1.64727 -6.630512,4.59399 -8.617877,9.67322 -4.786736,12.28103 1.27127,26.11038 13.530846,30.8887 5.613373,2.17993 11.515354,2.13146 17.442629,-0.0849 5.9272234,-2.21636 14.0405914,-9.44377 18.0234704,-15.42084 6.3490206,-9.59829 8.9531296,-23.76395 5.4565016,-34.15229 -3.2643496,-9.69812 -4.6224286,-12.3603 -18.6994006,-27.43025 z"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:10.58333302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
inkscape:export-ydpi="4.0856881"
inkscape:export-xdpi="4.0856881"
inkscape:export-filename="/mnt/md1/proyectos/dev/todos-contra-el-fuego-web/public/fire-marker.png"
transform="rotate(96.689458,-75.070103,121.00438)"
id="g22554-5">
<path
sodipodi:nodetypes="cszzcczasc"
inkscape:connector-curvature="0"
id="path5329-4"
d="m -25.638382,38.048346 c 11.566313,13.887908 17.1215844,22.244854 13.751242,33.868326 -2.465387,8.50265 -8.895424,18.626534 -18.100172,25.532106 -9.204776,6.905572 -20.549951,13.517692 -24.263404,17.728802 -3.71348,4.21108 -9.835779,11.6046 -10.976769,21.82688 -2.725208,24.7073 15.038044,45.63926 39.702238,48.35952 11.289242,1.2311 26.6324564,-5.2645 34.2331684,-10.31973 C 16.308659,169.98901 28.520768,152.76263 31.570884,138.81099 35.854436,119.21732 35.065926,96.385127 23.626002,79.16853 12.946123,63.095807 3.8673424,50.775037 -25.638382,38.048346 Z"
style="fill:#d41300;fill-opacity:1;stroke:none;stroke-width:10.58333302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="cszzcczcsc"
inkscape:connector-curvature="0"
id="path5331-9"
d="m -7.5198746,101.09834 c 4.018254,8.70077 3.821166,14.69136 0.49964,20.18233 -2.429696,4.01667 -7.1125824,8.31964 -12.7749834,10.59336 -5.662401,2.27373 -12.38086,4.1034 -14.860826,5.75067 -2.479966,1.64727 -6.630512,4.59399 -8.617877,9.67322 -4.786736,12.28103 1.27127,26.11038 13.530846,30.8887 5.613373,2.17993 11.515354,2.13146 17.442629,-0.0849 5.9272234,-2.21636 14.0405914,-9.44377 18.0234704,-15.42084 6.3490206,-9.59829 8.9531296,-23.76395 5.4565016,-34.15229 -3.2643496,-9.69812 -4.6224286,-12.3603 -18.6994006,-27.43025 z"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:10.58333302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
transform="rotate(-22.690691,-35.704234,120.074)"
id="g8542">
<path
style="fill:#d41300;fill-opacity:1;stroke:none;stroke-width:10.58333302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -25.638382,38.048346 c 11.566313,13.887908 17.1215844,22.244854 13.751242,33.868326 -2.465387,8.50265 -8.895424,18.626534 -18.100172,25.532106 -9.204776,6.905572 -20.549951,13.517692 -24.263404,17.728802 -3.71348,4.21108 -9.835779,11.6046 -10.976769,21.82688 -2.725208,24.7073 15.038044,45.63926 39.702238,48.35952 11.289242,1.2311 26.6324564,-5.2645 34.2331684,-10.31973 C 16.308659,169.98901 28.520768,152.76263 31.570884,138.81099 35.854436,119.21732 35.065926,96.385127 23.626002,79.16853 12.946123,63.095807 3.8673424,50.775037 -25.638382,38.048346 Z"
id="path5329-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cszzcczasc" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:10.58333302;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m -7.5198746,101.09834 c 4.018254,8.70077 3.821166,14.69136 0.49964,20.18233 -2.429696,4.01667 -7.1125824,8.31964 -12.7749834,10.59336 -5.662401,2.27373 -12.38086,4.1034 -14.860826,5.75067 -2.479966,1.64727 -6.630512,4.59399 -8.617877,9.67322 -4.786736,12.28103 1.27127,26.11038 13.530846,30.8887 5.613373,2.17993 11.515354,2.13146 17.442629,-0.0849 5.9272234,-2.21636 14.0405914,-9.44377 18.0234704,-15.42084 6.3490206,-9.59829 8.9531296,-23.76395 5.4565016,-34.15229 -3.2643496,-9.69812 -4.6224286,-12.3603 -18.6994006,-27.43025 z"
id="path5331-35"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cszzcczcsc" />
</g>
</g>
</g>
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Before After
Before After

View file

@ -50,7 +50,7 @@ i18nOpts.react = {
nsMode: 'default' */ nsMode: 'default' */
}; };
const sendMissing = false; const sendMissing = true;
if (sendMissing && !Meteor.isProduction) { if (sendMissing && !Meteor.isProduction) {
i18nOpts.sendMissing = true; i18nOpts.sendMissing = true;
i18nOpts.sendMissingTo = 'fallback'; i18nOpts.sendMissingTo = 'fallback';

View file

@ -1,11 +1,17 @@
@import '../../stylesheets/mixins';
.dist-slider { .dist-slider {
width: 400px; width: 400px;
margin: 30px; margin: 30px;
} }
@media only screen and (max-width: 400px) { @include breakpoint(mobile) {
.dist-slider { .dist-slider {
width: 200px; width: 100%;
margin: 10px; margin: 10px;
} }
.rc-slider {
margin: 0 0 0 -10px;
}
} }

View file

@ -31,4 +31,4 @@ const Footer = (props) => {
Footer.propTypes = {}; Footer.propTypes = {};
export default translate([], { wait: true })(Footer) export default translate([], { wait: true })(Footer);

View file

@ -72,3 +72,9 @@ body {
-webkit-transform: rotate(-180deg); -webkit-transform: rotate(-180deg);
transform: rotate(-180deg); transform: rotate(-180deg);
} }
@include breakpoint(mobile) {
.Footer, .Footer p {
font-size: 14px;
}
}

View file

@ -12,12 +12,12 @@ const propTypes = {
href: PropTypes.string, href: PropTypes.string,
onClick: PropTypes.func, onClick: PropTypes.func,
onSelect: PropTypes.func, onSelect: PropTypes.func,
eventKey: PropTypes.any, eventKey: PropTypes.any
}; };
const defaultProps = { const defaultProps = {
active: false, active: false,
disabled: false, disabled: false
}; };
class NavItem extends React.Component { class NavItem extends React.Component {
@ -38,7 +38,9 @@ class NavItem extends React.Component {
} }
render() { render() {
const { active, disabled, onClick, className, anchorClassName, style, ...props } = const {
active, disabled, onClick, className, anchorClassName, style, ...props
} =
this.props; this.props;
delete props.onSelect; delete props.onSelect;
@ -58,13 +60,15 @@ class NavItem extends React.Component {
return ( return (
<li <li
role="presentation" role="presentation"
data-toggle="collapse"
data-target=".navbar-collapse.show"
className={classNames(className, { active, disabled })} className={classNames(className, { active, disabled })}
style={style} style={style}
> >
<SafeAnchor <SafeAnchor
{...props} {...props}
disabled={disabled} disabled={disabled}
className={anchorClassName} className={anchorClassName}
onClick={createChainedFunction(onClick, this.handleClick)} onClick={createChainedFunction(onClick, this.handleClick)}
/> />
</li> </li>

View file

@ -17,7 +17,9 @@ const Navigation = props => (
{/* https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Navbar.js */} {/* https://github.com/react-bootstrap/react-bootstrap/blob/master/src/Navbar.js */}
<Navbar.Header> <Navbar.Header>
<Navbar.Brand> <Navbar.Brand>
<Link to="/">{props.t('AppNameFull')}</Link> <Link to="/" className={window.location.pathname === '/' ? 'hide-brand' : ''} >
{props.t('AppNameFull')}
</Link>
</Navbar.Brand> </Navbar.Brand>
{/* <Navbar.Toggle/> */} {/* <Navbar.Toggle/> */}
<button className="sr-only navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <button className="sr-only navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
@ -54,6 +56,7 @@ Navigation.defaultProps = {
}; };
Navigation.propTypes = { Navigation.propTypes = {
t: PropTypes.func.isRequired,
authenticated: PropTypes.bool.isRequired authenticated: PropTypes.bool.isRequired
}; };

View file

@ -1,3 +1,5 @@
@import '../../stylesheets/mixins';
.navbar { .navbar {
border-radius: 0; border-radius: 0;
border-left: none; border-left: none;
@ -27,14 +29,20 @@ a.nav-link:hover {
padding: 0.3rem 0rem; padding: 0.3rem 0rem;
} }
a.navbar-brand { a.navbar-brand {
font-size: 26px; font-size: 26px;
} }
@media (max-width: 480px) { @include breakpoint(mobile) {
a.navbar-brand { a.navbar-brand {
font-size: 16px; font-size: 18px;
padding: 15px 3px; padding: 15px 3px 15px 15px;
} }
.navbar-nav .nav-link {
padding-left: 5px;
}
}
.hide-brand {
opacity: 0;
} }

View file

@ -162,9 +162,9 @@ class SelectionMap extends Component {
return ( return (
<div> <div>
{ this.isValidState() && { this.isValidState() &&
<div className="leaflet-container"> <Fragment>
<Map <Map
/* className="sidebar-map" */ className="selectionmap-leaflet-container"
center={this.state.center} center={this.state.center}
zoom={this.state.zoom} zoom={this.state.zoom}
ref={(map) => { ref={(map) => {
@ -251,7 +251,7 @@ class SelectionMap extends Component {
</ButtonGroup> </ButtonGroup>
</Control> </Control>
</Map> </Map>
</div> </Fragment>
} }
</div> </div>
); );

View file

@ -1,21 +1,23 @@
.leaflet-container { @import '../../stylesheets/mixins';
.selectionmap-leaflet-container {
height: 100%; height: 100%;
min-height: 60vh; min-height: 60vh;
width: 100%; width: 100%;
min-width: 75vw; /* min-width: 75vw; */
display: flex; display: flex;
margin: 30px auto; margin: 20px auto;
} }
div.leaflet-container { div.selectionmap-leaflet-container {
position: relative; position: relative;
margin: 0; margin: 0;
} }
@media only screen and (max-width: 400px) { @include breakpoint(mobile) {
.leaflet-container { .selectionmap-leaflet-container {
height: 400px; height: 80%;
width: 85vw; min-width: 90vw;
} }
} }

View file

@ -0,0 +1,6 @@
import isMobile from 'ismobilejs';
// https://github.com/ReactTraining/react-router/issues/184
export const isHomeAndMobile = (window.location.pathname === '/' && isMobile.any);
export const isNotHomeAndMobile = !isHomeAndMobile;
export const isAnyMobile = isMobile.any;

View file

@ -55,7 +55,7 @@ const App = props => (
<div className="App"> <div className="App">
<Navigation {...props} /> <Navigation {...props} />
<ReSendEmail {...props} /> <ReSendEmail {...props} />
<Grid> {/* bsClass="previously-container-but-disabled" > */} <Grid>
<Switch> <Switch>
<Route exact name="index" path="/" component={Index} /> <Route exact name="index" path="/" component={Index} />
{/* <Authenticated exact path="/documents" component={Documents} {...props} /> {/* <Authenticated exact path="/documents" component={Documents} {...props} />

View file

@ -2,7 +2,6 @@
/* eslint-disable react/jsx-indent-props */ /* eslint-disable react/jsx-indent-props */
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { withTracker } from 'meteor/react-meteor-data';
import { Row, Col } from 'react-bootstrap'; import { Row, Col } from 'react-bootstrap';
import { translate } from 'react-i18next'; import { translate } from 'react-i18next';
import DistanceSlider from '/imports/ui/components/DistanceSlider/DistanceSlider'; import DistanceSlider from '/imports/ui/components/DistanceSlider/DistanceSlider';
@ -10,6 +9,7 @@ import SelectionMap, { action } from '/imports/ui/components/SelectionMap/Select
import Gkeys from '/imports/startup/client/Gkeys'; import Gkeys from '/imports/startup/client/Gkeys';
import CenterInMyPosition from '/imports/ui/components/CenterInMyPosition/CenterInMyPosition.js'; import CenterInMyPosition from '/imports/ui/components/CenterInMyPosition/CenterInMyPosition.js';
import SubsAutocomplete from './SubsAutocomplete'; import SubsAutocomplete from './SubsAutocomplete';
import { isNotHomeAndMobile } from '/imports/ui/components/Utils/isMobile';
class FireSubscription extends React.Component { class FireSubscription extends React.Component {
constructor(props) { constructor(props) {
@ -73,6 +73,7 @@ class FireSubscription extends React.Component {
return ( return (
<div> <div>
<Row> <Row>
{isNotHomeAndMobile &&
<Col xs={12} sm={12} md={6} lg={6} > <Col xs={12} sm={12} md={6} lg={6} >
<div> <div>
<SubsAutocomplete <SubsAutocomplete
@ -80,12 +81,14 @@ class FireSubscription extends React.Component {
onChange={value => this.onAutocompleteChange(value)} onChange={value => this.onAutocompleteChange(value)}
/> />
</div> </div>
</Col> </Col> }
<Col xs={12} sm={12} md={6} lg={6} > <Col xs={12} sm={12} md={6} lg={6} >
<DistanceSlider onChange={value => this.onSliderChange(value)} /> <DistanceSlider onChange={value => this.onSliderChange(value)} />
{isNotHomeAndMobile &&
<Row className="center-in-my-pos"> <Row className="center-in-my-pos">
<CenterInMyPosition onClick={viewport => this.centerOnUserLocation(viewport)} /> <CenterInMyPosition onClick={viewport => this.centerOnUserLocation(viewport)} />
</Row> </Row>
}
</Col> </Col>
</Row> </Row>
<Row className="align-items-center justify-content-center"> <Row className="align-items-center justify-content-center">

View file

@ -74,7 +74,7 @@ class Fire extends React.Component {
{' '} {' '}
{t('Por ejemplo:')} {t('Por ejemplo:')}
<ul> <ul>
<li>{t('si conoces esta zona y cómo acceder a el fuego (esto puede de ser de ayuda para apagarlo si sigue activo o para investigarlo en un futuro)')}</li> <li>{t('si conoces esta zona y cómo acceder al fuego (esto puede de ser de ayuda para apagarlo si sigue activo o para investigarlo en un futuro)')}</li>
<li>{t('si conoces el motivo por el que comenzó el fuego')}</li> <li>{t('si conoces el motivo por el que comenzó el fuego')}</li>
<li>{t('si quieres denunciar algún tipo de ilegalidad, incluso anónimamente')}</li> <li>{t('si quieres denunciar algún tipo de ilegalidad, incluso anónimamente')}</li>
<li>{t('o cualquier otra información')}</li> <li>{t('o cualquier otra información')}</li>

View file

@ -1,3 +1,6 @@
@import '../../stylesheets/colors';
@import '../../stylesheets/mixins';
.fire-leaflet-container { .fire-leaflet-container {
min-height: 30vh; min-height: 30vh;
min-width: 40vw; min-width: 40vw;
@ -8,19 +11,18 @@
} }
.ViewFire > h4.page-header { .ViewFire > h4.page-header {
line-height: 1.5em; line-height: 1.3em;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.leaflet-container { .fire-leaflet-container {
width: 100%; width: 100%;
} }
} }
.comments-info { .comments-info {
font-size: 14px; font-size: 14px;
color: #818182; color: $light;
/* display: inline-flex; */ /* display: inline-flex; */
/* background-color: #fefefe; /* background-color: #fefefe;
border-color: #fdfdfe; border-color: #fdfdfe;

View file

@ -24,6 +24,7 @@ import Loading from '/imports/ui/components/Loading/Loading';
import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires'; import ActiveFiresCollection from '/imports/api/ActiveFires/ActiveFires';
import FireAlertsCollection from '/imports/api/FireAlerts/FireAlerts'; import FireAlertsCollection from '/imports/api/FireAlerts/FireAlerts';
import UserSubsToFiresCollection from '/imports/api/Subscriptions/Subscriptions'; import UserSubsToFiresCollection from '/imports/api/Subscriptions/Subscriptions';
import { isNotHomeAndMobile } from '/imports/ui/components/Utils/isMobile';
import './FiresMap.scss'; import './FiresMap.scss';
@ -136,15 +137,18 @@ class FiresMap extends React.Component {
<h4 className="page-header"><Trans parent="span">Fuegos activos</Trans></h4> <h4 className="page-header"><Trans parent="span">Fuegos activos</Trans></h4>
<Row> <Row>
<Col xs={12} sm={6} md={6} lg={6} > <Col xs={12} sm={6} md={6} lg={6} >
<p> <p className="firesmap-legend">
{ this.props.activefires.length === 0 ? { this.props.activefires.length === 0 ?
<Trans parent="span" i18nKey="noActiveFireInMapCount">No hay fuegos activos en esta zona del mapa. Hay un total de <strong>{{ countTotal: this.props.activefirestotal }}</strong> fuegos activos detectados en todo el mundo.</Trans> : <Trans parent="span" i18nKey="noActiveFireInMapCount">No hay fuegos activos en esta zona del mapa. Hay un total de <strong>{{ countTotal: this.props.activefirestotal }}</strong> fuegos activos detectados en todo el mundo.</Trans> :
<Trans parent="span" i18nKey="activeFireInMapCount">En rojo, <strong>{{ count: this.props.activefires.length }}</strong> fuegos activos en el mapa. Hay un total de <strong>{{ countTotal: this.props.activefirestotal }}</strong> fuegos activos detectados en todo el mundo por la NASA.</Trans> <Trans parent="span" i18nKey="activeFireInMapCount">En rojo, <strong>{{ count: this.props.activefires.length }}</strong> fuegos activos en el mapa. Hay un total de <strong>{{ countTotal: this.props.activefirestotal }}</strong> fuegos activos detectados en todo el mundo por la NASA.</Trans>
} }
</p> </p>
<p><Trans parent="span" i18nKey="activeNeigFireInMapCount">En naranja, los fuegos notificados por nuestros usuarios/as recientemente.</Trans></p> {isNotHomeAndMobile &&
<p className="firesmap-legend"><Trans parent="span" i18nKey="activeNeigFireInMapCount">En naranja, los fuegos notificados por nuestros usuarios/as recientemente.</Trans></p> }
</Col> </Col>
<Col xs={12} sm={6} md={6} lg={6}> <Col xs={12} sm={6} md={6} lg={6}>
{isNotHomeAndMobile &&
<Fragment>
<Checkbox inline={false} defaultChecked={this.state.showSubsUnion} onClick={e => this.setShowSubsUnion(e.target.checked)}> <Checkbox inline={false} defaultChecked={this.state.showSubsUnion} onClick={e => this.setShowSubsUnion(e.target.checked)}>
<Trans className="mark-checkbox" parent="span">Resaltar en verde el área vigilada por nuestros usuarios/as</Trans>&nbsp;(*) <Trans className="mark-checkbox" parent="span">Resaltar en verde el área vigilada por nuestros usuarios/as</Trans>&nbsp;(*)
</Checkbox> </Checkbox>
@ -153,7 +157,8 @@ class FiresMap extends React.Component {
<Trans className="mark-checkbox" parent="span">Resaltar los fuegos con un marcador</Trans> <Trans className="mark-checkbox" parent="span">Resaltar los fuegos con un marcador</Trans>
</Checkbox>} </Checkbox>}
<CenterInMyPosition onClick={viewport => this.centerOnUserLocation(viewport)} /> <CenterInMyPosition onClick={viewport => this.centerOnUserLocation(viewport)} />
<p> </Fragment>}
<p className="firesmap-note">
<em>{ this.state.viewport.zoom >= MAXZOOMREACTIVE ? <em>{ this.state.viewport.zoom >= MAXZOOMREACTIVE ?
<Trans>Los fuegos activos se actualizan en tiempo real.</Trans> : <Trans>Los fuegos activos se actualizan en tiempo real.</Trans> :
<Trans>Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.</Trans> <Trans>Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.</Trans>
@ -162,48 +167,49 @@ class FiresMap extends React.Component {
</p> </p>
</Col> </Col>
</Row> </Row>
{/* https://github.com/CliffCloud/Leaflet.Sleep */}
<Map
ref={(map) => {
this.fireMap = map;
this.handleLeafletLoad(map);
}}
className="firesmap-leaflet-container"
animate
minZoom={5}
preferCanvas
onClick={this.onClickReset}
viewport={this.state.viewport}
onViewportChanged={this.onViewportChanged}
sleep={window.location.pathname === '/'}
sleepTime={10750}
wakeTime={750}
sleepNote
hoverToWake
wakeMessage={this.props.t('Pulsa para activar')}
sleepOpacity={0.6}
>
{/* http://wiki.openstreetmap.org/wiki/Tile_servers */}
{!this.props.loading &&
<Fragment>
<FireList
fires={this.props.activefires}
scale={this.state.viewport.zoom >= MAXZOOM}
useMarkers={this.state.useMarkers}
nasa
/>
<FireList
fires={this.props.firealerts}
scale={false}
useMarkers={this.state.useMarkers}
nasa={false}
/>
</Fragment> }
<DefMapLayers />
</Map>
<Row> <Row>
{/* https://github.com/CliffCloud/Leaflet.Sleep */} <Col xs={12} sm={12} md={12} lg={12}>
<Map <p className="firesmap-footnote"><span style={{ paddingRight: '5px' }}>(*)</span><Trans i18nKey="mapPrivacy" parent="span"><em>Para preservar la privacidad de nuestros usuarios/as, los datos reflejados están aleatoriamente alterados y son solo orientativos.</em></Trans></p>
ref={(map) => { </Col>
this.fireMap = map;
this.handleLeafletLoad(map);
}}
animate
minZoom={5}
preferCanvas
onClick={this.onClickReset}
viewport={this.state.viewport}
onViewportChanged={this.onViewportChanged}
sleep={window.location.pathname === '/'}
sleepTime={10750}
wakeTime={750}
sleepNote
hoverToWake
wakeMessage={this.props.t('Pulsa para activar')}
sleepOpacity={0.6}
>
{/* http://wiki.openstreetmap.org/wiki/Tile_servers */}
{!this.props.loading &&
<Fragment>
<FireList
fires={this.props.activefires}
scale={this.state.viewport.zoom >= MAXZOOM}
useMarkers={this.state.useMarkers}
nasa
/>
<FireList
fires={this.props.firealerts}
scale={false}
useMarkers={this.state.useMarkers}
nasa={false}
/>
</Fragment> }
<DefMapLayers />
</Map>
</Row>
<Row>
<p><span style={{ paddingRight: '5px' }}>(*)</span><Trans i18nKey="mapPrivacy" parent="span"><em>Para preservar la privacidad de nuestros usuarios/as, los datos reflejados están aleatoriamente alterados y son solo orientativos.</em></Trans></p>
</Row> </Row>
</div> </div>
); );

View file

@ -1,12 +1,23 @@
@import '../../stylesheets/mixins';
@import '../../stylesheets/colors';
/* https://github.com/PaulLeCam/react-leaflet/issues/108 */ /* https://github.com/PaulLeCam/react-leaflet/issues/108 */
.leaflet-container { .firesmap-leaflet-container {
height: 100%; height: 100%;
min-height: 60vh; min-height: 60vh;
width: 100%; width: 100%;
min-width: 75vw; /* min-width: 75vw; */
display: flex; display: flex;
margin: 30px auto; margin: 20px auto;
}
@include breakpoint(mobile) {
.firesmap-leaflet-container {
height: 80%;
min-width: 85vw;
margin: 10px auto;
}
} }
.Loading { .Loading {
@ -22,13 +33,6 @@
stroke: grey; stroke: grey;
} }
@media only screen and (max-width: 400px) {
.leaflet-container {
height: 400px;
width: 85vw;
}
}
.mark-checkbox { .mark-checkbox {
margin-left: 5px; margin-left: 5px;
} }
@ -37,7 +41,21 @@
background-image: url(/images/layers.png); background-image: url(/images/layers.png);
} }
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(/images/layers.png);
background-size: 26px 26px;
}
.glyphicon .glyphicon-thumbs-up { .glyphicon .glyphicon-thumbs-up {
} }
.firesmap-legend {
font-size: 16px;
}
.firesmap-note,
.firesmap-footnote {
font-size: 14px;
color: $light;
}

View file

@ -1,3 +1,4 @@
@import '../../stylesheets/mixins';
@import '../../stylesheets/colors'; @import '../../stylesheets/colors';
.carousel-item { .carousel-item {
@ -29,6 +30,12 @@
text-shadow: 2px 2px 1px #280B0B; text-shadow: 2px 2px 1px #280B0B;
} }
@include breakpoint(mobile) {
.carousel-caption > h3 {
font-size: 2.0rem;
}
}
.py-5 > .container > { .py-5 > .container > {
div > h1 { div > h1 {
color: #280B0B; color: #280B0B;
@ -38,15 +45,35 @@
} }
p { p {
padding-top: 10px; padding-top: 10px;
font-size: 1.5em; font-size: 1.7em;
} }
} }
@include breakpoint(mobile) {
.py-5 > .container > {
p {
font-size: 1.2em;
}
}
.pt-5, .py-5 {
padding-top: 1rem !important;
}
.moto {
margin-top: 5px;
margin-left: 5px;
}
.sectionTESTINGGGGG { // don't scroll sections in mobiles
overflow: visible !important;
}
}
.slide-2-icon { .slide-2-icon {
border-radius: 50%; border-radius: 50%;
position: relative; position: relative;
width: 30%; width: 30%;
top: 25%;
left: 35%; left: 35%;
border: 14px solid #FFF; border: 14px solid #FFF;
opacity: .5; opacity: .5;
@ -72,6 +99,20 @@
text-shadow: 1px 1px #280B0B; text-shadow: 1px 1px #280B0B;
} }
@include breakpoint(mobile) {
.slide-1-icon:before,
.slide-2-icon:before,
.slide-3-icon:before,
.slide-4-icon:before {
font-size: 100px;
}
.slide-3-icon:before,
.slide-4-icon:before {
top: -50px;
}
}
.slide-1-icon:before { .slide-1-icon:before {
content: ""; content: "";
} }
@ -124,7 +165,7 @@
.full-width { .full-width {
position: relative; position: relative;
width: 100vw; width: 100vw;
margin-left: calc(-50vw + 50% - 8px); margin-left: calc(-50vw + 50%);
position: relative; position: relative;
/* /*
width: 100vw; width: 100vw;

View file

@ -12,6 +12,7 @@ import ReactResizeDetector from 'react-resize-detector';
import _ from 'lodash'; import _ from 'lodash';
import { ScrollToTopOnMount, SectionsContainer, Section } from 'react-fullpage'; import { ScrollToTopOnMount, SectionsContainer, Section } from 'react-fullpage';
import 'html5-device-mockups/dist/device-mockups.min.css'; import 'html5-device-mockups/dist/device-mockups.min.css';
import { isAnyMobile } from '/imports/ui/components/Utils/isMobile';
import SubscriptionEditor from '/imports/ui/components/SubscriptionEditor/SubscriptionEditor'; import SubscriptionEditor from '/imports/ui/components/SubscriptionEditor/SubscriptionEditor';
import FiresMap from '../FiresMap/FiresMap'; import FiresMap from '../FiresMap/FiresMap';
@ -58,12 +59,12 @@ class Index extends Component {
// https://github.com/subtirelumihail/react-fullpage // https://github.com/subtirelumihail/react-fullpage
const fullPageOptions = { const fullPageOptions = {
activeClass: 'active', // the class that is appended to the sections links activeClass: 'active', // the class that is appended to the sections links
anchors: ['home', 'crowdsourcing', 'platforms', 'participe', 'fires'], // the anchors for each sections anchors: ['home', 'crowdsourcing', 'participe', 'fires', 'platforms'], // the anchors for each sections
arrowNavigation: true, // use arrow keys (true after development) arrowNavigation: true, // use arrow keys (true after development)
className: 'section-container', // the class name for the section container className: 'section-container', // the class name for the section container
delay: 1000, // the scroll animation speed delay: 1000, // the scroll animation speed
navigation: true, // use dots navigation navigation: true, // !isMobile, // use dots navigation
scrollBar: false, // use the browser default scrollbar scrollBar: isAnyMobile, // use the browser default scrollbar
sectionClassName: 'section', // the section class name sectionClassName: 'section', // the section class name
sectionPaddingTop: '0', // the section top padding sectionPaddingTop: '0', // the section top padding
sectionPaddingBottom: '0', // the section bottom padding sectionPaddingBottom: '0', // the section bottom padding
@ -84,6 +85,7 @@ class Index extends Component {
className="carousel slide" className="carousel slide"
ref={(ref) => { this.slides = ref; }} ref={(ref) => { this.slides = ref; }}
> >
{/* for dev: data-interval=false */}
<ol className="carousel-indicators"> <ol className="carousel-indicators">
<li data-target="#carouselExampleIndicators" data-slide-to="0" className="active" /> <li data-target="#carouselExampleIndicators" data-slide-to="0" className="active" />
<li data-target="#carouselExampleIndicators" data-slide-to="1" /> <li data-target="#carouselExampleIndicators" data-slide-to="1" />
@ -95,7 +97,7 @@ class Index extends Component {
<div className="carousel-item carousel-item-1 active"> <div className="carousel-item carousel-item-1 active">
<div className="slide-1-icon" /> <div className="slide-1-icon" />
<div className="carousel-caption"> <div className="carousel-caption">
<h3><i className="fa fa-map-pointer" aria-hidden="true" />Elige un lugar</h3> <h3><i className="fa fa-map-pointer" aria-hidden="true" /><Trans>Elige un lugar</Trans></h3>
<p /> <p />
</div> </div>
</div> </div>
@ -103,7 +105,7 @@ class Index extends Component {
<div className="carousel-item carousel-item-2"> <div className="carousel-item carousel-item-2">
<div className="slide-2-icon" /> <div className="slide-2-icon" />
<div className="carousel-caption"> <div className="carousel-caption">
<h3><i className="fa fa-dot-circle-o" aria-hidden="true" />Elige un radio de vigilancia</h3> <h3><i className="fa fa-dot-circle-o" aria-hidden="true" /><Trans>Elige un radio de vigilancia</Trans></h3>
<p /> <p />
</div> </div>
</div> </div>
@ -111,7 +113,7 @@ class Index extends Component {
<div className="carousel-item carousel-item-3"> <div className="carousel-item carousel-item-3">
<div className="slide-3-icon" /> <div className="slide-3-icon" />
<div className="carousel-caption"> <div className="carousel-caption">
<h3><i className="fa fa-podcast" aria-hidden="true" />Recibe alertas de fuegos en esa zona</h3> <h3><i className="fa fa-podcast" aria-hidden="true" /><Trans>Recibe alertas de fuegos en esa zona</Trans></h3>
<p /> <p />
</div> </div>
</div> </div>
@ -119,18 +121,18 @@ class Index extends Component {
<div className="carousel-item carousel-item-4"> <div className="carousel-item carousel-item-4">
<div className="slide-4-icon" /> <div className="slide-4-icon" />
<div className="carousel-caption"> <div className="carousel-caption">
<h3><i className="fa fa-bell-o" aria-hidden="true" />Alerta cuando hay un fuego</h3> <h3><i className="fa fa-bell-o" aria-hidden="true" /><Trans>Alerta cuando hay un fuego</Trans></h3>
<p /> <p />
</div> </div>
</div> </div>
</div> </div>
<a className="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev"> <a className="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev">
<span className="carousel-control-prev-icon" aria-hidden="true" /> <span className="carousel-control-prev-icon" aria-hidden="true" />
<span className="sr-only">Previous</span> <span className="sr-only"><Trans>Anterior</Trans></span>
</a> </a>
<a className="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next"> <a className="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next">
<span className="carousel-control-next-icon" aria-hidden="true" /> <span className="carousel-control-next-icon" aria-hidden="true" />
<span className="sr-only">Next</span> <span className="sr-only"><Trans>Siguiente</Trans></span>
</a> </a>
</div> </div>
</header> </header>
@ -139,7 +141,7 @@ class Index extends Component {
<div className="scale__container--js"> <div className="scale__container--js">
<h1 id="tcefh1" className="scale--js">{this.props.t('AppName')}</h1> <h1 id="tcefh1" className="scale--js">{this.props.t('AppName')}</h1>
</div> </div>
<p>Siempre alerta a los fuegos en nuestro vecindario</p> <p className="moto"><Trans>Siempre alerta a los fuegos en nuestro vecindario</Trans></p>
{/* <Link className="participe-btn btn btn-lg btn-warning" role="button" to="/#platforms">{this.props.t('Participa')}</Link> */} {/* <Link className="participe-btn btn btn-lg btn-warning" role="button" to="/#platforms">{this.props.t('Participa')}</Link> */}
</div> </div>
</section> </section>
@ -149,7 +151,7 @@ class Index extends Component {
<div className="container"> <div className="container">
<div className="row"> <div className="row">
<div className="col-md-8 mx-auto"> <div className="col-md-8 mx-auto">
<h2 className="section-heading">Colaboración masiva contra los incendios</h2> <h2 className="section-heading"><Trans>Colaboración masiva contra los incendios</Trans></h2>
<p><Trans>Imágenes capturadas por los satélites de la NASA muestran el humo de grandes incendios que se extienden sobre el Océano Pacífico. La actividad del fuego está delineada en rojo.</Trans></p> <p><Trans>Imágenes capturadas por los satélites de la NASA muestran el humo de grandes incendios que se extienden sobre el Océano Pacífico. La actividad del fuego está delineada en rojo.</Trans></p>
</div> </div>
</div> </div>
@ -207,8 +209,8 @@ class Index extends Component {
<div className="col-lg-6"> <div className="col-lg-6">
<div className="feature-item"> <div className="feature-item">
<i className="icon-envelope-open text-primary" /> <i className="icon-envelope-open text-primary" />
<h3><Trans>Correo electronico</Trans></h3> <h3><Trans>Notificaciones</Trans></h3>
<p className="text-muted"><Trans>Recibe nuestras notificaciones de fuegos por correo</Trans></p> <p className="text-muted"><Trans>Recibe nuestras notificaciones de fuegos por correo o en tu navegador</Trans></p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -97,6 +97,7 @@ class Signup extends React.Component {
<Col xs={12} sm={6} md={5} lg={4}> <Col xs={12} sm={6} md={5} lg={4}>
<h4 className="page-header">{t('Registrarse')}</h4> <h4 className="page-header">{t('Registrarse')}</h4>
<Row> <Row>
{ false && // disabled
<Col xs={12}> <Col xs={12}>
<button <button
className="btn btn-block btn-raised btn-primary OAuthLoginButtonDis OAuthLoginButton-telegram" className="btn btn-block btn-raised btn-primary OAuthLoginButtonDis OAuthLoginButton-telegram"
@ -105,7 +106,7 @@ class Signup extends React.Component {
> >
<span><Icon icon="telegram" /> {t('Iniciar sesión con Telegram')}</span> <span><Icon icon="telegram" /> {t('Iniciar sesión con Telegram')}</span>
</button> </button>
</Col> </Col> }
<Col xs={12}> <Col xs={12}>
<OAuthLoginButtons <OAuthLoginButtons
services={['telegram', 'google']} services={['telegram', 'google']}

View file

@ -48,3 +48,5 @@ $success: $todos-palette2;
$info: $todos-palette3; $info: $todos-palette3;
$warning: $todos-palette4; $warning: $todos-palette4;
$danger: #d9534f; $danger: #d9534f;
$light: #818182;

View file

@ -1,3 +1,6 @@
@import './mixins';
@import './colors';
a, a:hover { a, a:hover {
color: $todos-palette5; color: $todos-palette5;
} }
@ -9,3 +12,13 @@ a, a:hover {
h4.page-header { h4.page-header {
line-height: 2em; line-height: 2em;
} }
@include breakpoint(mobile) {
h4.page-header {
line-height: 1.3em;
}
}
.page-header {
margin-top: 25px;
}

View file

@ -7,6 +7,9 @@
@media (min-width: 768px) { @content; } @media (min-width: 768px) { @content; }
} @else if $point == handheld-large { } @else if $point == handheld-large {
@media (min-width: 480px) { @content; } @media (min-width: 480px) { @content; }
} @else if $point == mobile {
// vjrj
@media (max-width: 480px) { @content; }
} @else { } @else {
@media (min-width: $point) { @content; } @media (min-width: $point) { @content; }
} }

View file

@ -1,3 +1,5 @@
@import './mixins';
/*! /*!
* Start Bootstrap - New Age v4.0.0-beta.2 (https://startbootstrap.com/template-overviews/new-age) * Start Bootstrap - New Age v4.0.0-beta.2 (https://startbootstrap.com/template-overviews/new-age)
* Copyright 2013-2017 Start Bootstrap * Copyright 2013-2017 Start Bootstrap
@ -61,6 +63,15 @@ div.section.crowd h2 {
div.section.crowd h2 { div.section.crowd h2 {
font-size: 70px; } } font-size: 70px; } }
@include breakpoint(mobile) {
div.section.crowd p {
padding-left: 10px;
padding-right: 10px;
}
div.section.crowd h2 {
font-size: 35px; } }
div.section.platf .div.section-heading { div.section.platf .div.section-heading {
margin-bottom: 100px; } margin-bottom: 100px; }
div.section.platf .div.section-heading h2 { div.section.platf .div.section-heading h2 {

5
package-lock.json generated
View file

@ -5428,6 +5428,11 @@
"version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
}, },
"ismobilejs": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-0.4.1.tgz",
"integrity": "sha1-Gl8SbHD+05yT2jgPpiy65XI+fcI="
},
"isobject": { "isobject": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",

View file

@ -28,6 +28,7 @@
"immutability-helper": "^2.5.1", "immutability-helper": "^2.5.1",
"indexof": "0.0.1", "indexof": "0.0.1",
"iron": "^5.0.4", "iron": "^5.0.4",
"ismobilejs": "^0.4.1",
"jquery": "^2.2.4", "jquery": "^2.2.4",
"jquery-validation": "^1.17.0", "jquery-validation": "^1.17.0",
"juice": "^4.2.2", "juice": "^4.2.2",

View file

@ -165,8 +165,6 @@
"Somos muchos ojos": "Somos muchos ojos", "Somos muchos ojos": "Somos muchos ojos",
"Usamos diferentes fuentes de datos para notificarte de fuegos activos en tus zonas de interés": "Usamos diferentes fuentes de datos para notificarte de fuegos activos en tus zonas de interés", "Usamos diferentes fuentes de datos para notificarte de fuegos activos en tus zonas de interés": "Usamos diferentes fuentes de datos para notificarte de fuegos activos en tus zonas de interés",
"Usa nuestro bot de Telegram para estar al tanto de los fuegos en tus área": "Usa nuestro bot de Telegram para estar al tanto de los fuegos en tus área", "Usa nuestro bot de Telegram para estar al tanto de los fuegos en tus área": "Usa nuestro bot de Telegram para estar al tanto de los fuegos en tus área",
"Correo electronico": "Correo electronico",
"Recibe nuestras notificaciones de fuegos por correo": "Recibe nuestras notificaciones de fuegos por correo",
"Otros dispositivos": "Otros dispositivos", "Otros dispositivos": "Otros dispositivos",
"support-us-home": "Estamos desarrollando nuestras herramientas para otros dispositivos. Puedes <1>contribuir a hacerlo posible.</1>", "support-us-home": "Estamos desarrollando nuestras herramientas para otros dispositivos. Puedes <1>contribuir a hacerlo posible.</1>",
"Software Libre": "Software Libre", "Software Libre": "Software Libre",
@ -202,5 +200,24 @@
"añadir comentarios": "añadir comentarios", "añadir comentarios": "añadir comentarios",
"puntuar comentarios": "puntuar comentarios", "puntuar comentarios": "puntuar comentarios",
"responder": "responder", "responder": "responder",
"Más comentarios": "Más comentarios" "Más comentarios": "Más comentarios",
"Elige un lugar": "Elige un lugar",
"Elige un radio de vigilancia": "Elige un radio de vigilancia",
"Recibe alertas de fuegos en esa zona": "Recibe alertas de fuegos en esa zona",
"Alerta cuando hay un fuego": "Alerta cuando hay un fuego",
"Anterior": "Anterior",
"Siguiente": "Siguiente",
"Siempre alerta a los fuegos en nuestro vecindario": "Siempre alerta a los fuegos en nuestro vecindario",
"Información adicional sobre fuego detectado en {{where}} el {{when}}": "Información adicional sobre fuego detectado en {{where}} el {{when}}",
"Coordenadas:": "Coordenadas:",
"Fuego detectado por satélites de la NASA {{when}}": "Fuego detectado por satélites de la NASA {{when}}",
"Puedes añadir un comentario si tienes información adicional sobre este fuego.": "Puedes añadir un comentario si tienes información adicional sobre este fuego.",
"Por ejemplo:": "Por ejemplo:",
"si conoces esta zona y cómo acceder al fuego (esto puede de ser de ayuda para apagarlo si sigue activo o para investigarlo en un futuro)": "si conoces esta zona y cómo acceder al fuego (esto puede de ser de ayuda para apagarlo si sigue activo o para investigarlo en un futuro)",
"si conoces el motivo por el que comenzó el fuego": "si conoces el motivo por el que comenzó el fuego",
"si quieres denunciar algún tipo de ilegalidad, incluso anónimamente": "si quieres denunciar algún tipo de ilegalidad, incluso anónimamente",
"o cualquier otra información": "o cualquier otra información",
"Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.": "Haga zoom en una zona de su interés si quiere que los fuegos se actualicen en tiempo real.",
"Notificaciones": "Notificaciones",
"Recibe nuestras notificaciones de fuegos por correo o en tu navegador": "Recibe nuestras notificaciones de fuegos por correo o en tu navegador"
} }