@digitransit-component/digitransit-component-datetimepicker 6.0.8 → 6.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -21
- package/index.cjs +7 -0
- package/lib/{index.js → index.cjs} +2 -2
- package/lib/index.cjs.map +1 -0
- package/lib/index.development.cjs +2 -0
- package/package.json +14 -10
- package/index.js +0 -7
- package/lib/index.development.js +0 -2
- package/lib/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,21 +8,26 @@ This component renders an input to choose a date and time. Renders separate inpu
|
|
|
8
8
|
|
|
9
9
|
### Parameters
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
11
|
+
* `props` **[Object][1]**
|
|
12
|
+
|
|
13
|
+
* `props.realtime` **[boolean][2]** Determine if selected time should be updated in realtime when 'now' is selected.
|
|
14
|
+
* `props.initialArriveBy` **[boolean][2]** Initial value for arriveBy. Determines if picker is in arrival mode (true) or departure mode (false). Correct value is kept in component state even if this is not updated. Changing this will also trigger change in the component.
|
|
15
|
+
* `props.initialTimestamp` **[Number][3]** Initial value for selected time. Unix timestamp in seconds. Updating this will change timepicker value but the correct value is kept in component state even if this is not updated.
|
|
16
|
+
* `props.onDepartureClick` **[function][4]** Called with (time) when "departure" button is clicked. time is current input value in seconds
|
|
17
|
+
* `props.onArrivalClick` **[function][4]** Called with (time) when "arrival" button is clicked. time is current input value in seconds
|
|
18
|
+
* `props.onTimeChange` **[function][4]** Called with (time, arriveBy) when time input changes. time is number timestamp in seconds, arriveBy is boolean
|
|
19
|
+
* `props.onDateChange` **[function][4]** Called with (time, arriveBy) when date input changes. time is number timestamp in seconds, arriveBy is boolean
|
|
20
|
+
* `props.onNowClick` **[function][4]** Called when "depart now" button is clicked. time is current input value in seconds
|
|
21
|
+
* `props.embedWhenClosed` **[node][5]** JSX element to render in the corner when input is closed
|
|
22
|
+
* `props.embedWhenOpen` **[node][5]** JSX element to render when input is open
|
|
23
|
+
* `props.lang` **[string][6]** Language selection. Default 'en'
|
|
24
|
+
* `props.serviceTimeRange` **[number][3]** Determine number of days shown in timepicker. Optional. default is 30.
|
|
25
|
+
* `props.onOpen` **[function][4]** Determine what to do when timepicker is open. Optional. no default implementation.
|
|
26
|
+
* `props.onClose` **[function][4]** Determine what to do when timepicker is closed. Optional. no default implementation.
|
|
27
|
+
* `props.openPicker` **[function][4]** Determine if timepicker should be open in intial render. Optional. Default is undefined.
|
|
28
|
+
* `props.color`
|
|
29
|
+
* `props.timeZone`
|
|
30
|
+
* `props.fontWeights`
|
|
26
31
|
|
|
27
32
|
### Examples
|
|
28
33
|
|
|
@@ -38,6 +43,7 @@ This component renders an input to choose a date and time. Renders separate inpu
|
|
|
38
43
|
onArrivalClick={(time) => changeUrl(time, undefined)}
|
|
39
44
|
embedWhenClosed={<button />}
|
|
40
45
|
lang={'en'}
|
|
46
|
+
serviceTimeRange={15}
|
|
41
47
|
/>
|
|
42
48
|
```
|
|
43
49
|
|
|
@@ -52,11 +58,6 @@ This component renders an input to choose a date and time. Renders separate inpu
|
|
|
52
58
|
[5]: https://developer.mozilla.org/docs/Web/API/Node/nextSibling
|
|
53
59
|
|
|
54
60
|
[6]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String
|
|
55
|
-
|
|
56
|
-
<!-- This file is automatically generated. Please don't edit it directly:
|
|
57
|
-
if you find an error, edit the source file (likely index.js), and re-run
|
|
58
|
-
./scripts/generate-readmes in the digitransit-component project. -->
|
|
59
|
-
|
|
60
61
|
---
|
|
61
62
|
|
|
62
63
|
This module is part of the Digitransit-ui project. It is maintained in the
|
|
@@ -71,7 +72,7 @@ Install this module individually:
|
|
|
71
72
|
$ npm install @digitransit-component/digitransit-component-datetimepicker
|
|
72
73
|
```
|
|
73
74
|
|
|
74
|
-
Or install
|
|
75
|
+
Or install `@digitransit-component/digitransit-component`, which bundles every digitransit-component module:
|
|
75
76
|
|
|
76
77
|
```sh
|
|
77
78
|
$ npm install @digitransit-component/digitransit-component
|
package/index.cjs
ADDED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("prop-types"),require("react"),require("react-i18next"),require("luxon"),require("lodash/debounce"),require("lodash/uniqueId"),require("@digitransit-component/digitransit-component-icon"),require("react-select"),require("classnames"),require("react-modal"),require("downshift"),require("i18next")):"function"==typeof define&&define.amd?define(["exports","prop-types","react","react-i18next","luxon","lodash/debounce","lodash/uniqueId","@digitransit-component/digitransit-component-icon","react-select","classnames","react-modal","downshift","i18next"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@digitransit-component/digitransit-component-datetimepicker"]={},e.PropTypes,e.React,e.reactI18next,e.luxon,e.debounce,e.uniqueId,e.Icon,e.Select,e.cx,e.ReactModal,e.downshift,e.i18next)}(this,function(e,t,n,i,l,o,a,s,r,d,c,u,p){"use strict";function _(e){return e&&e.__esModule?e:{default:e}}var m=_(t),b=_(n),f=_(o),y=_(a),g=_(s),h=_(r),x=_(d),v=_(c);function k(e){let t=e;return 3===t.length&&t.split("").every(e=>Number.isInteger(Number(e)))&&(t=Number(t.slice(0,2))<=23?`${t.slice(0,2)}:${t[2]}`:`${t[0]}:${t.slice(1)}`),t}const w=(e,t)=>{const n=!Number.isNaN(e)&&e>=0&&e<=23,i=2===t.length?!Number.isNaN(t)&&Number(t)>=0&&Number(t<=59):!Number.isNaN(t)&&Number(t)>=0&&Number(t<=5);return n&&i};function N(e){if(e.split(":").length>2)return!1;if(e.length<=2)return!0;if(3===e.length){let t,n;if(e.includes(":"))[t,n]=e.split(":");else{if(!e.startsWith("0")){const i=e.split("");return 1===Number(i[0])||2===Number(i[0])&&Number(i[1]<=3)?[t,n]=[i[0].concat(i[1]),i[2]]:[t,n]=[i[0],i[1].concat(i[2])],w(t,n)}if(t=e.substring(0,e.length-1),n=e.substring(e.length-1||0),Number(n)>5)return!1}return w(t,n)}if(5===e.length||4===e.length){const t=e.split(":"),n=t[0],i=t[1];return!(e.startsWith("0")&&1===i.length&&Number(i)>5)&&w(n,i)}return!0}const E=(e,t)=>{const n=e.trim();if(null!==n.match(/^[0-9]{1,2}(\.|:)[0-9]{2}$/)){const e=n.includes(".")?".":":",i=n.split(e),o=Number(i[0]),a=!Number.isNaN(o)&&o>=0&&o<=23,s=Number(i[1]);if(!(!Number.isNaN(s)&&s>=0&&s<=59)||!a)return null;return l.DateTime.fromMillis(t).set({hour:o,minute:s,second:0,millisecond:0}).valueOf()}return null};var C={"sr-only":"styles_sr-only__-RF2k","dt-datetimepicker":"styles_dt-datetimepicker__lxoIv",hidden:"styles_hidden__wu5e2","datetimepicker-open-container":"styles_datetimepicker-open-container__bpaWY","top-row-container":"styles_top-row-container__CkzlY",closed:"styles_closed__tu-GM","time-icon":"styles_time-icon__-brVP","dropdown-icon":"styles_dropdown-icon__18ELr","close-icon":"styles_close-icon__Y-fPy","label-open":"styles_label-open__Tn-Io",textbutton:"styles_textbutton__WqXW2",active:"styles_active__bVP5t","combobox-left":"styles_combobox-left__D1SkD","combobox-right":"styles_combobox-right__nmiuA","departure-or-arrival-container":"styles_departure-or-arrival-container__H5DSE","radio-textbutton-label":"styles_radio-textbutton-label__BpMvP","first-radio":"styles_first-radio__t-EvH","radio-textbutton":"styles_radio-textbutton__IUovC","departure-now-button":"styles_departure-now-button__ABsuy","open-button":"styles_open-button__QeJ4p","close-button":"styles_close-button__I7Glg","right-edge":"styles_right-edge__i8zbY","combobox-container":"styles_combobox-container__xgaZ9","combobox-icon":"styles_combobox-icon__s8Fqp","date-input-icon":"styles_date-input-icon__kdVNt","time-input-icon":"styles_time-input-icon__4xP1Q","datetimepicker-select-container":"styles_datetimepicker-select-container__ggz2q","picker-container":"styles_picker-container__HPTN-","combobox-mobile-container":"styles_combobox-mobile-container__3gI5Z","mobile-modal-overlay":"styles_mobile-modal-overlay__-zbAR","mobile-modal-content":"styles_mobile-modal-content__b--yj","top-row":"styles_top-row__8DzJH","modal-title":"styles_modal-title__q8WAY","tab-row":"styles_tab-row__3wAQu","radio-tab-label":"styles_radio-tab-label__ZrHjD","input-row":"styles_input-row__skosN","input-container":"styles_input-container__QAZEP","time-input-mobile":"styles_time-input-mobile__Sh0gP","mobile-input-display":"styles_mobile-input-display__qPsdI","mobile-input-hidden":"styles_mobile-input-hidden__56Q1p",container:"styles_container__QYfyS",suggestion:"styles_suggestion__MApuW",suggestionHighlighted:"styles_suggestionHighlighted__-KI4M",suggestionsContainerOpen:"styles_suggestionsContainerOpen__hHnwr",input:"styles_input__sYlZv","buttons-row":"styles_buttons-row__mfbQC","ready-button":"styles_ready-button__BPMPX"};function I({value:e,onChange:t,getDisplay:o,timeChoices:a,id:s,label:r,icon:d,disableTyping:c,timeZone:u,datePicker:p,translationSettings:_}){l.Settings.defaultZone=u;const[m]=i.useTranslation(),[f,y]=n.useState(o(e)),[g,v]=n.useState(!1),[w,I]=n.useState(!0),[q,D]=n.useState(!1);n.useEffect(()=>{y(o(e)),p||D(!1)},[e]);const T=e=>{const n=Number(e);try{l.DateTime.fromMillis(n)}catch(e){return}t(n)};const A=a.map(e=>({value:e.toString(),label:o(e)})),P=p?A:A.filter(e=>e.label.split(":")[1]%15==0),S=P.length>0?P?.reduce((t,n)=>Math.abs(e-t.value)<Math.abs(e-n.value)?t:n):void 0,z=`${s}-input`,R=`${s}-label`,$=m("invalid-input",_);return b.default.createElement("label",{className:C["combobox-container"],htmlFor:z},b.default.createElement("span",{className:C["sr-only"],id:R},r," ",f),d,b.default.createElement(h.default,{"aria-labelledby":R,ariaLiveMessages:{guidance:e=>void 0===e.isDisabled&&q?$:".",onChange:()=>"",onFilter:()=>"",onFocus:({context:e,label:t})=>"menu"===e?t:""},options:A,inputId:z,onChange:t=>{const n=l.DateTime.fromMillis(e).toFormat("HH:mm"),i=E(f,e);if(g)return null!==i?(n!==f&&t.value===e?T(i):T(t.value),v(!1)):(t.value!==e?T(t.value):y(o(e)),v(!1)),void(p||D(!1));p||D(!1),T(t.value)},components:{IndicatorsContainer:()=>null},className:x.default(C["datetimepicker-select-container"],q&&"datetimepicker-invalid-input"),classNamePrefix:"datetimepicker-select",onInputChange:(e,{action:t})=>{if("menu-close"===t?I(!0):w&&I(!1),!(c||e&&!function(e){if(e.length<f?.length){const t=N(e);return D(!t),!0}if(/[a-zA-Z§ÄäÖö.-\s]/g.test(e))return!1;const t=N(e.length>5?e.slice(0,-1):e);return D(!t),e.length<=5}(e))&&"input-change"===t){const t=k(e);y(t),v(!0)}},inputValue:!c&&f,value:S,noOptionsMessage:()=>"",filterOption:(e,t)=>{if(p)return!0;const n=5===t.length||4===t.length&&1===t.split(":")[0].length,i=e.label.split(":")[1]%15==0,l=1===t.split(":")[1]?.length;if(w&&i)return!0;if(l){const n=1===t.split(":")[0].length?"0".concat(t.split(":")[0]):t.split(":")[0],i=t.split(":")[1],l=e.label.split(":")[0],o=e.label.split(":")[1];if(n===l){const e=10*Number(i),t=Number(o)-e;return t>=0&&t<=9}}return n&&!w?4===t.length?"0".concat(t)===e.label:t===e.label:!!i&&((e,t)=>{const n=t.length<=2?t:t.split(":")[0],i=/^([0-1]?[0-9]|2[0-3])$/.test(n),l=1===n.length?"0".concat(t):t;return!i||e.label.split(":")[0]===l.split(":")[0]})(e,t)},controlShouldRenderValue:c,tabSelectsValue:!1,placeholder:"",onFocus:e=>{c||e.target.select()},onBlur:()=>{if(g){const t=E(f,e);null!==t?(T(t),v(!1)):(y(o(e)),v(!1))}p||D(!1)},onKeyDown:e=>{["ArrowDown","ArrowUp"].includes(e.key)&&v(!1)},isSearchable:!c}))}function q(){const e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)}!function(e,t){void 0===t&&(t={});var n=t.insertAt;if("undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===n&&i.firstChild?i.insertBefore(l,i.firstChild):i.appendChild(l),l.styleSheet?l.styleSheet.cssText=e:l.appendChild(document.createTextNode(e))}}(".styles_sr-only__-RF2k:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_dt-datetimepicker__lxoIv {\n border: none;\n padding: 0;\n margin: 0;\n font-size: 15px;\n font-weight: var(--font-weight-medium);\n}\n.styles_dt-datetimepicker__lxoIv button,\n.styles_dt-datetimepicker__lxoIv label {\n font-size: 1em;\n font-weight: inherit;\n}\n.styles_dt-datetimepicker__lxoIv label button {\n cursor: pointer;\n font-family: inherit;\n}\n.styles_dt-datetimepicker__lxoIv .styles_hidden__wu5e2 {\n display: none;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-open-container__bpaWY {\n background-color: #f2f5f7;\n border-radius: 5px;\n padding: 15px;\n margin: 9px 0 9px 0;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n min-height: 36px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY.styles_closed__tu-GM {\n margin: 4px 0 6px 18px;\n}\n@media screen and (max-width: 319px) {\n .styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY {\n margin-left: 14px;\n }\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_time-icon__-brVP svg {\n width: 18px;\n height: 19px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_dropdown-icon__18ELr {\n margin-left: 9px;\n position: relative;\n top: 1px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_dropdown-icon__18ELr svg {\n width: 14px;\n height: 10px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_close-icon__Y-fPy svg {\n width: 12px;\n height: 12px;\n border-radius: 1px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_close-icon__Y-fPy svg path {\n stroke-width: 30;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY label {\n cursor: pointer;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY label.styles_label-open__Tn-Io {\n align-items: flex-start;\n display: flex;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY button,\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY label {\n font-size: 1em;\n letter-spacing: -0.5px;\n line-height: 1;\n}\n.styles_dt-datetimepicker__lxoIv .styles_textbutton__WqXW2 {\n margin-left: 9px;\n background: none;\n border: none;\n color: #666;\n}\n@media screen and (min-width: 768px) {\n .styles_dt-datetimepicker__lxoIv .styles_textbutton__WqXW2 {\n margin-left: 14px;\n }\n}\n.styles_dt-datetimepicker__lxoIv .styles_textbutton__WqXW2.styles_active__bVP5t {\n color: var(--color);\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-left__D1SkD {\n position: relative;\n margin-right: 4px;\n width: 63%;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-right__nmiuA {\n position: relative;\n margin-left: 4px;\n width: 37%;\n}\n.styles_dt-datetimepicker__lxoIv .styles_departure-or-arrival-container__H5DSE {\n height: calc(1rem + 20px);\n background-color: #ddd;\n border-radius: 8px;\n display: flex;\n width: calc(5px + 13em);\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP {\n color: #333;\n margin: 2px;\n background: none;\n border-radius: 6px;\n padding: 9px 0;\n width: 50%;\n cursor: pointer;\n height: calc(1rem + 16px);\n text-align: center;\n font-weight: 400;\n font-size: 15px;\n line-height: 18px;\n letter-spacing: -0.03em;\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP.styles_active__bVP5t {\n font-weight: 500;\n background: white;\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP:focus-within {\n /* First apply outline that is used in Edge and Firefox */\n outline: 1px dotted #212121;\n /* Then override outline for webkit browsers like Chrome, this has no effect on other browsers */\n outline: 5px auto -webkit-focus-ring-color; /* stylelint-disable-line declaration-block-no-duplicate-properties */\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP.styles_first-radio__t-EvH {\n margin: 0;\n display: flex;\n align-items: flex-start;\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton__IUovC {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_departure-now-button__ABsuy {\n font-family: inherit;\n letter-spacing: -0.02em;\n height: calc(1rem + 18px);\n color: var(--color);\n padding: 8px 0;\n width: 6.6875rem;\n background: white;\n border: 1px solid #888;\n border-radius: 30px;\n margin-left: 11px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_open-button__QeJ4p {\n display: flex;\n margin-bottom: 0;\n margin-top: 1px;\n padding: 2px 0 2px 0;\n}\n.styles_dt-datetimepicker__lxoIv button.styles_close-button__I7Glg {\n transition: transform 0.2s;\n position: relative;\n top: -14px;\n right: -8px;\n border: 0;\n font-weight: normal;\n background: none;\n color: var(--color);\n padding: 0;\n line-height: normal;\n}\n.styles_dt-datetimepicker__lxoIv button.styles_close-button__I7Glg:hover {\n transform: scale(1.2);\n}\n.styles_dt-datetimepicker__lxoIv .styles_right-edge__i8zbY {\n margin-left: auto;\n margin-right: 0;\n position: relative;\n top: -2px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-container__xgaZ9 {\n cursor: pointer;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp {\n color: var(--color);\n height: 40px;\n position: absolute;\n z-index: 7;\n pointer-events: none;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_date-input-icon__kdVNt {\n display: flex;\n align-items: center;\n padding: 0;\n margin-left: 14px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_date-input-icon__kdVNt svg {\n width: 20px;\n height: 18px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_time-input-icon__4xP1Q {\n display: flex;\n align-items: center;\n padding: 0;\n margin-left: 8px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_time-input-icon__4xP1Q svg {\n margin-top: 1px;\n width: 22px;\n height: 22px;\n}\n.styles_dt-datetimepicker__lxoIv .datetimepicker-invalid-input input {\n color: #f00 !important;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q {\n position: relative;\n height: 40px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__control {\n cursor: inherit;\n height: 40px;\n border: 1px solid #888;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__value-container {\n padding: 0;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__single-value {\n margin: 0 0 0 47px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__input {\n background: inherit;\n position: relative;\n margin-left: 40px;\n margin-top: -4px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__input input {\n opacity: 1 !important;\n background: inherit;\n box-shadow: none;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.33;\n letter-spacing: -0.5px;\n color: #333;\n font-family: inherit;\n font-size: 15px;\n font-weight: var(--font-weight-medium);\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__input input:focus {\n box-shadow: none;\n outline: none;\n border: none;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu {\n z-index: 19;\n padding: 0;\n background: #fff;\n max-height: 250px;\n border-radius: 5px;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.06);\n border: 1px rgba(0, 0, 0, 0.1) solid;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list {\n max-height: 250px;\n padding: 0;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list .datetimepicker-select__option {\n height: 50px;\n border-top: 1px solid #ddd;\n padding: 13px 0 0 12px;\n letter-spacing: -0.6px;\n color: #333;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list .datetimepicker-select__option--is-selected {\n background: inherit;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list .datetimepicker-select__option--is-focused {\n background: #dfe5e8;\n}\n.styles_dt-datetimepicker__lxoIv .styles_picker-container__HPTN- {\n margin: 14px 0 0 0;\n display: flex;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-mobile-container__3gI5Z {\n flex-grow: 1;\n}\n\n.styles_mobile-modal-overlay__-zbAR {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.6);\n z-index: 10001;\n}\n\n.styles_mobile-modal-content__b--yj {\n font-family: inherit;\n background: white;\n width: 89%;\n position: absolute;\n left: 5.5%;\n padding: 31px 20px 33px 20px;\n top: 80px;\n border-radius: 5px;\n}\n.styles_mobile-modal-content__b--yj .styles_top-row__8DzJH {\n display: flex;\n justify-content: space-between;\n margin-bottom: 21px;\n}\n.styles_mobile-modal-content__b--yj .styles_top-row__8DzJH .styles_modal-title__q8WAY {\n font-weight: var(--font-weight-medium);\n font-size: 20px;\n line-height: 18px;\n letter-spacing: -0.5px;\n color: #333;\n padding: 6px 0 0 8px;\n}\n.styles_mobile-modal-content__b--yj .styles_top-row__8DzJH .styles_departure-now-button__ABsuy {\n background-color: white;\n font-family: inherit;\n padding: 5px 15px;\n border: 1px solid #888;\n border-radius: 50px;\n font-weight: var(--font-weight-medium);\n font-size: 15px;\n line-height: 18px;\n letter-spacing: -0.02em;\n color: var(--color);\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu {\n display: flex;\n border: 2px solid #ddd;\n border-radius: 5px;\n margin-bottom: 16px;\n background-color: #ddd;\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu .styles_radio-tab-label__ZrHjD {\n padding: 9px 0;\n font-size: 15px;\n line-height: 18px;\n letter-spacing: -0.5px;\n border-radius: 3px;\n font-weight: normal;\n width: 50%;\n text-align: center;\n color: #333;\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu .styles_radio-tab-label__ZrHjD.styles_active__bVP5t {\n font-weight: var(--font-weight-medium);\n background-color: #fff;\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu .styles_radio-textbutton__IUovC {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN {\n display: flex;\n margin-bottom: 25px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN label:first-child {\n flex-basis: 60%;\n margin-right: 10px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN label:nth-child(2) {\n flex-basis: 40%;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP {\n border: 1px solid #888;\n border-radius: 5px;\n display: flex;\n align-items: center;\n height: 40px;\n line-height: 1.5;\n font-size: 100%;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP:focus-within {\n background: rgba(0, 122, 201, 0.06);\n border: 2px solid var(--color);\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_combobox-icon__s8Fqp {\n height: 18px;\n font-size: 18px;\n padding: 0 0 0 10px;\n border: none;\n position: relative;\n top: 3px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_combobox-icon__s8Fqp.styles_time-input-icon__4xP1Q > svg {\n height: 20px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_combobox-icon__s8Fqp.styles_date-input-icon__kdVNt > svg {\n height: 20px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .mobile-datetimepicker-invalid-input {\n color: #f00 !important;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_time-input-mobile__Sh0gP {\n font-family: inherit;\n box-shadow: none;\n font-size: 18px;\n letter-spacing: -0.5px;\n line-height: 20px;\n font-weight: var(--font-weight-medium);\n border: none;\n outline: none;\n background: none;\n width: 54px;\n margin-left: 10px;\n color: #333;\n height: 1.5265rem;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-display__qPsdI {\n position: relative;\n left: 10px;\n border: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-display__qPsdI:focus {\n outline: none;\n box-shadow: none;\n background: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-display__qPsdI {\n background: inherit;\n box-shadow: none;\n font-family: inherit;\n font-weight: var(--font-weight-medium);\n font-stretch: normal;\n font-style: normal;\n font-size: 16px;\n line-height: 1.33;\n letter-spacing: -0.5px;\n color: #333;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-hidden__56Q1p {\n font-size: 16px;\n margin-bottom: 12px;\n height: 0;\n width: 0;\n background: inherit;\n color: transparent;\n outline: none;\n box-shadow: none;\n border: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-hidden__56Q1p:focus {\n outline: none;\n box-shadow: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS {\n position: absolute;\n width: calc((100% - 50px) * 0.6);\n height: 25px;\n font-size: 15px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestion__MApuW {\n list-style: none;\n font-size: 16px;\n font-style: normal;\n font-weight: normal;\n line-height: 49px;\n height: 50px;\n margin: 0;\n padding: 0 0 0 16px;\n color: rgba(0, 0, 0, 0.87);\n background: white;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestionHighlighted__-KI4M {\n background: #dfe5e8;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestionsContainerOpen__hHnwr {\n position: absolute;\n z-index: 19;\n max-height: 250px;\n overflow-x: hidden;\n overflow-y: scroll;\n border-radius: 5px;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.06);\n border: 1px rgba(0, 0, 0, 0.1) solid;\n top: 42px;\n left: -2px;\n width: 100%;\n font-size: 16px;\n line-height: 1;\n color: rgba(0, 0, 0, 0.87);\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestionsContainerOpen__hHnwr ul {\n padding: 0;\n margin: 0;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_input__sYlZv {\n color: black;\n box-shadow: none;\n border: none;\n background: none;\n font-size: 16px;\n font-weight: var(--font-weight-medium);\n height: 25px;\n display: inline-block;\n font-family: inherit;\n line-height: 1.33;\n padding-left: 46px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_input__sYlZv:focus {\n outline: none;\n border: none;\n background: none;\n}\n.styles_mobile-modal-content__b--yj .styles_buttons-row__mfbQC {\n display: flex;\n flex-direction: column;\n font-size: 16px;\n font-weight: var(--font-weight-medium);\n}\n.styles_mobile-modal-content__b--yj .styles_buttons-row__mfbQC button {\n background-color: white;\n font-family: inherit;\n font-weight: var(--font-weight-medium);\n font-size: 16px;\n letter-spacing: -0.02em;\n width: 100%;\n border-radius: 50px;\n height: 40px;\n color: var(--color);\n border: 1px solid #888;\n}\n.styles_mobile-modal-content__b--yj .styles_buttons-row__mfbQC button.styles_ready-button__BPMPX {\n color: white;\n background-color: var(--color);\n border: none;\n margin-bottom: 10px;\n}"),"production"!==process.env.NODE_ENV&&(I.propTypes={value:m.default.number.isRequired,onChange:m.default.func.isRequired,getDisplay:m.default.func.isRequired,timeChoices:m.default.arrayOf(m.default.number).isRequired,id:m.default.string.isRequired,label:m.default.node.isRequired,icon:m.default.node.isRequired,disableTyping:m.default.bool,timeZone:m.default.string,datePicker:m.default.bool,translationSettings:m.default.shape({lng:m.default.string.isRequired})}),I.defaultProps={disableTyping:!1,timeZone:"Europe/Helsinki",datePicker:!1,translationSettings:{lng:"fi"}};const D=({value:e,dateChoices:t,id:n,getDisplay:i,onChange:l,labelId:o,inputId:a})=>{const s=t.map(e=>({value:e,label:i(e)})),r=s.find(t=>t.value===e)||s[0]||null,{isOpen:d,getToggleButtonProps:c,getMenuProps:p,getItemProps:_,highlightedIndex:m}=u.useSelect({selectedItem:r,items:s,itemToString:e=>e?.label??"",onSelectedItemChange:({selectedItem:e})=>{e&&l(e.value)},id:n});return b.default.createElement("div",{className:C.container},b.default.createElement("div",c({"aria-labelledby":o,id:a}),b.default.createElement("div",{className:C.input},r.label)),b.default.createElement("div",{className:x.default(C.suggestionsContainerOpen,!d&&"hidden")},b.default.createElement("ul",p(),d&&s.map((e,t)=>b.default.createElement("li",Object.assign({key:e.value,className:x.default(C.suggestion,t===m&&C.suggestionHighlighted)},_({index:t})),b.default.createElement("span",null,e.label))))))};function T({value:e,getDisplay:t,onChange:n,itemCount:i,startTime:o,id:a,label:s,icon:r,timeZone:d}){l.Settings.defaultZone=d;const c=Array(i).fill().map((e,t)=>l.DateTime.fromMillis(o).plus({days:t}).toMillis()),u=!(navigator.userAgent.toLowerCase().indexOf("android")>-1),p=`${a}-label`,_=`${a}-input`;return b.default.createElement("label",{className:C["input-container"],htmlFor:_},b.default.createElement("span",null,r),b.default.createElement("span",{className:C["sr-only"],id:p},s),u?b.default.createElement("select",{id:_,className:C["mobile-input-display"],onChange:e=>n(Number(e.target.value)),value:e},c.map(e=>b.default.createElement("option",{key:e,value:e},t(e)))):b.default.createElement(D,{value:e,dateChoices:c,id:a,getDisplay:t,onChange:n,labelId:p,inputId:_}))}function A({value:e,getDisplay:t,onChange:i,id:o,label:a,icon:s,timeZone:r}){const[d,c]=n.useState(t(e)),[u,p]=n.useState(!0);l.Settings.defaultZone=r;const _=`${o}-input`,m=`${o}-label`,f=!u;return b.default.createElement("label",{className:C["input-container"],htmlFor:_},b.default.createElement("span",null,s),b.default.createElement("span",{className:C["sr-only"],id:m},a),b.default.createElement("input",{id:_,inputMode:"numeric",type:"text",maxLength:"6",className:x.default(C["time-input-mobile"],f&&"mobile-datetimepicker-invalid-input"),value:d,onFocus:e=>{e.target.setSelectionRange(0,0)},onChange:t=>{let n=t.target.value.replace(".",":");const l=N(n);if(p(l),n.match(/[0-9]{3}:[0-9]{2}/)&&n.slice(1)===d&&(n=n.charAt(0)),n.length>5)return;const o=k(n);c(o);const a=E(o,e);a&&i(a)}}))}function P({departureOrArrival:e,onNowClick:t,lang:o,color:a,timeZone:s,onSubmit:r,onCancel:d,timestamp:c,getTimeDisplay:u,dateSelectItemCount:p,getDateDisplay:_,fontWeights:m,onAfterClose:f}){l.Settings.defaultZone=s;const[h]=i.useTranslation(),x={lng:o},[k,w]=n.useState(c),[N,E]=n.useState(e);const[I]=n.useState(y.default("datetimepicker-")),q=l.DateTime.now().startOf("day").set({hour:l.DateTime.fromMillis(k).hour,minute:l.DateTime.fromMillis(k).minute}).toMillis();return b.default.createElement(v.default,{appElement:document?document.querySelector("#app"):void 0,isOpen:!0,className:C["mobile-modal-content"],overlayClassName:C["mobile-modal-overlay"],onAfterClose:f},b.default.createElement("div",{id:"digitransit-mobile-datetime",style:{"--color":`${a}`,"--font-weight-medium":m.medium}},b.default.createElement("div",{className:C["top-row"]},b.default.createElement("h3",{className:C["modal-title"]},h("choose-time",x)),b.default.createElement("button",{type:"button",className:C["departure-now-button"],onClick:t},h("departure-now",x))),b.default.createElement("div",{className:C["tab-row"]},b.default.createElement("label",{htmlFor:`${I}-modal-departure`,className:`${C["radio-tab-label"]}\n ${C["departure"===N?"active":void 0]}`},h("departure",x),b.default.createElement("input",{id:`${I}-modal-departure`,name:"departureOrArrival",type:"radio",value:"departure",className:C["radio-textbutton"],onChange:()=>{E("departure")},checked:"departure"===N})),b.default.createElement("label",{htmlFor:`${I}-modal-arrival`,className:`${C["radio-tab-label"]}\n ${C["arrival"===N?"active":void 0]}`},h("arrival",x),b.default.createElement("input",{id:`${I}-modal-arrival`,name:"departureOrArrival",type:"radio",value:"arrival",className:C["radio-textbutton"],onChange:()=>{E("arrival")},checked:"arrival"===N}))),b.default.createElement("div",{className:C["input-row"]},b.default.createElement(T,{value:k,getDisplay:_,onChange:w,itemCount:p,startTime:q,id:`${I}-date`,label:h("date",x),icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["date-input-icon"]}`},b.default.createElement(g.default,{img:"calendar",color:a})),timeZone:s}),b.default.createElement(A,{value:k,getDisplay:u,onChange:w,id:`${I}-time`,label:h("time",x),icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["time-input-icon"]}`},b.default.createElement(g.default,{img:"time",color:a})),timeZone:s})),b.default.createElement("div",{className:C["buttons-row"]},b.default.createElement("button",{type:"button",className:C["ready-button"],onClick:()=>r(k,N)},h("ready",x)),b.default.createElement("button",{type:"button",className:C["cancel-button"],onClick:d},h("cancel",x)))))}function S({timestamp:e,onTimeChange:t,onDateChange:o,departureOrArrival:a,onNowClick:s,onDepartureClick:r,onArrivalClick:d,embedWhenClosed:c,embedWhenOpen:u,lang:p,color:_,timeZone:m,onModalSubmit:f,fontWeights:h,serviceTimeRange:x,onOpen:v,onClose:k,openPicker:w}){l.Settings.defaultZone=m;const[N]=i.useTranslation(),[E,D]=n.useState(w||!1),[T,A]=n.useState(e||l.DateTime.now().toMillis()),[S,z]=n.useState(null),[R]=n.useState(y.default("datetimepicker-")),[$]=n.useState(q()&&function(){if("undefined"==typeof window||null===window)return!1;const e=document.createElement("input");return e.type="date","date"===e.type&&(e.type="time","time"===e.type)}()),Z=n.useRef(),M=n.useRef(),j=n.useRef(),O={lng:p};n.useEffect(()=>{l.Settings.defaultLocale=p},[p]);const Q=null===e;n.useEffect(()=>{Q?A(l.DateTime.now().toMillis()):(S&&(clearInterval(S),z(null)),A(e))},[e]),n.useEffect(()=>{if(!Q)return;S&&clearInterval(S);const e=setInterval(()=>{const t=l.DateTime.now();l.DateTime.fromMillis(T).hasSame(t,"minute")||(clearInterval(e),z(null),A(t.toMillis()))},5e3);return z(e),()=>clearInterval(e)},[T]);const W=e=>{const t=l.DateTime.fromMillis(e),n=l.DateTime.now();let i;return t.hasSame(n,"day")?(i=N("today",O),i=`${i.charAt(0).toUpperCase()}${i.slice(1)}`):t.hasSame(n.plus({days:1}),"day")?(i=N("tomorrow",O),i=`${i.charAt(0).toUpperCase()}${i.slice(1)}`):i=t.toFormat("ccc d.L."),i},H=e=>l.DateTime.fromMillis(e).toFormat("HH:mm"),[Y,F]=n.useMemo(()=>{const t=l.DateTime.fromMillis(e||l.DateTime.now().toMillis()),n=t.startOf("day").toMillis(),i=q();let o=[],a=t.startOf("day");for(;a.hasSame(n,"day");)o.push(a.valueOf()),a=i?a.plus({minutes:15}):a.plus({minutes:1});if(null===e){const e=3e5,t=Math.ceil(T/e)*e,n=Array(7).fill().map((n,i)=>t+i*e),i=o.map(e=>T-e).findIndex(e=>e<=0);o.splice(i,0,...n),o=Array.from(new Set(o))}const s=l.DateTime.now().startOf("day").set({hour:t.hour,minute:t.minute});return[o,Array(x).fill().map((e,t)=>s.plus({days:t}).toMillis())]},[e]);function V(){j.current&&(j.current.innerHTML=N("accessible-closed",O),setTimeout(()=>{j.current.innerHTML=null},100))}const L=()=>{D(!1),V(),k&&k()},B=()=>{L(),s()};return b.default.createElement("fieldset",{className:C["dt-datetimepicker"],id:`${R}-root`,style:{"--color":`${_}`,"--font-weight-medium":h.medium}},b.default.createElement("legend",{className:C["sr-only"]},N("accessible-title",O)),b.default.createElement("span",{className:C["sr-only"]},N("accessible-update-instructions",O)),b.default.createElement("div",{className:E?`${C.hidden} datetimepicker-top-row`:`${C["top-row-container"]} ${C.closed} datetimepicker-top-row`},b.default.createElement("label",{className:C["label-open"],htmlFor:`${R}-open`},b.default.createElement("span",{className:C["time-icon"]},b.default.createElement(g.default,{img:"time",color:_})),b.default.createElement("span",{className:C["sr-only"]},N("accessible-open",O)),b.default.createElement("span",{role:"alert",className:C["sr-only"],ref:j}),b.default.createElement("button",{id:`${R}-open`,type:"button",className:`${C.textbutton} ${C.active} ${C["open-button"]}`,"aria-controls":`${R}-root`,"aria-expanded":"false",onClick:()=>{D(!0),j.current&&(j.current.innerHTML=N("accessible-opened",O),setTimeout(()=>{j.current.innerHTML=null},100)),v&&v()},ref:Z},(()=>{if(Q&&"departure"===a)return b.default.createElement("span",null,N("departure-now",O));const e=W(T),t=H(T),n=N("departure"===a?"departure":"arrival",O),i=l.DateTime.now().hasSame(l.DateTime.fromMillis(T),"day"),o=l.DateTime.now().plus({days:1}).hasSame(l.DateTime.fromMillis(T),"day");return i?b.default.createElement("span",null,`${n} ${t}`):o?b.default.createElement("span",null,`${n} ${e.toLowerCase()} ${t}`):b.default.createElement("span",null,`${n} ${e} ${t}`)})(),b.default.createElement("span",{className:C["dropdown-icon"]},b.default.createElement(g.default,{img:"arrow-dropdown",color:_})))),b.default.createElement("span",{className:C["right-edge"]},c)),b.default.createElement("div",null),$?E&&b.default.createElement(P,{departureOrArrival:a,onNowClick:B,lang:p,color:_,onSubmit:(e,t)=>{f(e,t),D(!1),V()},onCancel:L,onAfterClose:()=>requestAnimationFrame(()=>{Z.current?.focus()}),getTimeDisplay:H,timeZone:m,timestamp:T,getDateDisplay:W,dateSelectItemCount:x,getDisplay:H,fontWeights:h}):b.default.createElement(b.default.Fragment,null,b.default.createElement("div",{className:`${C["datetimepicker-open-container"]} ${E?"":C.hidden}`},b.default.createElement("div",{className:E?`${C["top-row-container"]} datetimepicker-top-row`:`${C.hidden} datetimepicker-top-row`}," ",b.default.createElement("span",{role:"alert",className:C["sr-only"],ref:j}),b.default.createElement("span",null),b.default.createElement("span",{className:C["departure-or-arrival-container"]},b.default.createElement("label",{htmlFor:`${R}-departure`,className:`${C["radio-textbutton-label"]}\n ${C["departure"===a?"active":void 0]}`},N("departure",O),b.default.createElement("input",{id:`${R}-departure`,name:"departureOrArrival",type:"radio",value:"departure",className:C["radio-textbutton"],onChange:()=>{r()},checked:"departure"===a})),b.default.createElement("label",{htmlFor:`${R}-arrival`,className:`${C["radio-textbutton-label"]}\n ${C["arrival"===a?"active":void 0]}`},N("arrival",O),b.default.createElement("input",{id:`${R}-arrival`,name:"departureOrArrival",type:"radio",value:"arrival",className:C["radio-textbutton"],onChange:()=>{d()},checked:"arrival"===a}))),b.default.createElement("button",{id:`${R}-now`,type:"button",className:C["departure-now-button"],onClick:B,ref:M},N("departure-now",O)),b.default.createElement("span",{className:C["right-edge"]},b.default.createElement("button",{type:"button",className:C["close-button"],"aria-controls":`${R}-root`,"aria-expanded":"true",onClick:L},b.default.createElement("span",{className:C["close-icon"]},b.default.createElement(g.default,{img:"close",color:_})),b.default.createElement("span",{className:C["sr-only"]},N("accessible-close",O))))),b.default.createElement("div",{className:E?`${C["picker-container"]}`:`${C.hidden} datetimepicker-top-row`},b.default.createElement("span",{className:C["combobox-left"]},b.default.createElement(I,{value:T,onChange:e=>{o(e)},getDisplay:W,timeChoices:F,validate:()=>null,icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["date-input-icon"]}`},b.default.createElement(g.default,{img:"calendar",color:_})),id:`${R}-date`,label:N("date",O),disableTyping:!0,timeZone:m,datePicker:!0})),b.default.createElement("span",{className:C["combobox-right"]},b.default.createElement(I,{value:T,onChange:e=>{t(e)},getDisplay:H,timeChoices:Y,icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["time-input-icon"]}`},b.default.createElement(g.default,{img:"time",color:_})),id:`${R}-time`,label:N("time",O),timeZone:m,translationSettings:O})))),b.default.createElement("span",{className:E?"":C.hidden},u)))}"production"!==process.env.NODE_ENV&&(D.propTypes={value:m.default.number.isRequired,dateChoices:m.default.arrayOf(m.default.number).isRequired,id:m.default.string.isRequired,getDisplay:m.default.func.isRequired,onChange:m.default.func.isRequired,labelId:m.default.string.isRequired,inputId:m.default.string.isRequired}),"production"!==process.env.NODE_ENV&&(T.propTypes={value:m.default.number.isRequired,getDisplay:m.default.func.isRequired,onChange:m.default.func.isRequired,itemCount:m.default.number.isRequired,startTime:m.default.number.isRequired,id:m.default.string.isRequired,label:m.default.string.isRequired,icon:m.default.node,timeZone:m.default.string}),T.defaultProps={icon:null,timeZone:"Europe/Helsinki"},"production"!==process.env.NODE_ENV&&(A.propTypes={value:m.default.number.isRequired,getDisplay:m.default.func.isRequired,onChange:m.default.func.isRequired,id:m.default.string.isRequired,label:m.default.string.isRequired,icon:m.default.node,timeZone:m.default.string}),A.defaultProps={icon:null,timeZone:"Europe/Helsinki"},l.Settings.defaultLocale="en","production"!==process.env.NODE_ENV&&(P.propTypes={timeZone:m.default.string,departureOrArrival:m.default.oneOf(["departure","arrival"]).isRequired,onNowClick:m.default.func.isRequired,lang:m.default.string.isRequired,color:m.default.string,onSubmit:m.default.func.isRequired,onCancel:m.default.func.isRequired,onAfterClose:m.default.func.isRequired,timestamp:m.default.number.isRequired,getTimeDisplay:m.default.func.isRequired,dateSelectItemCount:m.default.number.isRequired,getDateDisplay:m.default.func.isRequired,fontWeights:m.default.shape({medium:m.default.number.isRequired}).isRequired}),P.defaultProps={color:"#007ac9",timeZone:"Europe/Helsinki"},l.Settings.defaultLocale="en","production"!==process.env.NODE_ENV&&(S.propTypes={timestamp:m.default.number,timeZone:m.default.string,onTimeChange:m.default.func.isRequired,onDateChange:m.default.func.isRequired,departureOrArrival:m.default.oneOf(["departure","arrival"]).isRequired,onNowClick:m.default.func.isRequired,onDepartureClick:m.default.func.isRequired,onArrivalClick:m.default.func.isRequired,embedWhenClosed:m.default.node,embedWhenOpen:m.default.node,lang:m.default.string.isRequired,color:m.default.string,onModalSubmit:m.default.func.isRequired,fontWeights:m.default.shape({medium:m.default.number.isRequired}).isRequired,serviceTimeRange:m.default.number.isRequired,onOpen:m.default.func,onClose:m.default.func,openPicker:m.default.bool}),S.defaultProps={timestamp:null,embedWhenClosed:null,embedWhenOpen:null,color:"#007ac9",timeZone:"Europe/Helsinki",onOpen:null,onClose:null,openPicker:void 0};const z=p.createInstance({fallbackLng:"fi",resources:{de:{translation:{today:"Heute",tomorrow:"Morgen","accessible-close":"Schließe die Auswahl","accessible-closed":"Auswahl geschlossen","accessible-open":"Öffne die Auswahl","accessible-opened":"Auswahl geöffnet","accessible-title":"Datum und Uhrzeitauswahl",arrival:"Ankunft",date:"Datum",departure:"Abfahrt","departure-now":"Abfahrt jetzt","choose-time":"Zeit wählen",ready:"Fertig",time:"Zeit",cancel:"Abbrechen"}},en:{translation:{today:"Today",tomorrow:"Tomorrow","accessible-close":"Close the picker","accessible-closed":"Timepicker closed","accessible-open":"Open the picker","accessible-opened":"Timepicker opened","accessible-title":"Date and timepicker","accessible-update-instructions":"Changing time parameters will trigger a new search.",arrival:"Arrival",date:"Date",departure:"Departure","departure-now":"Leaving now",time:"Time","choose-time":"Choose time",ready:"Ready",cancel:"Cancel","invalid-input":"The time you entered is invalid"}},fi:{translation:{today:"Tänään",tomorrow:"Huomenna","accessible-close":"Sulje valitsin","accessible-closed":"Valitsin suljettu","accessible-open":"Avaa valitsin","accessible-opened":"Valitsin avattu","accessible-title":"Aika- ja päivämäärävalitsin","accessible-update-instructions":"Aikavalintojen muuttaminen laukaisee uuden haun.",arrival:"Perillä",date:"Päivä",departure:"Lähtöaika","departure-now":"Lähtö nyt",time:"Aika","choose-time":"Valitse aika",ready:"Valmis",cancel:"Peruuta","invalid-input":"Syöttämäsi aika on virheellinen"}},pl:{translation:{today:"Dziś",tomorrow:"Jutro","accessible-close":"Zamknij wybornik","accessible-closed":"Zamknięto wybornik","accessible-open":"Otwórz wybornik","accessible-opened":"Otwarto wybornik","accessible-title":"Wybór daty i godziny","accessible-update-instructions":"Zmiana wybranej godziny wywoła nowe wyszukiwanie.",arrival:"Przyjazd",date:"Data",departure:"Wyjazd","departure-now":"Wyjeżdżam teraz",time:"Godzina","choose-time":"Wybierz godzinę",ready:"Gotowe",cancel:"Anuluj","invalid-input":"Wprowadzona godzina jest nieprawidłowa"}},sv:{translation:{today:"I dag",tomorrow:"I morgon","accessible-close":"Stäng väljaren","accessible-closed":"Väljaren stängde","accessible-open":"Öppna väljaren","accessible-opened":"Väljaren öppnade","accessible-title":"Tid- och datumväljaren","accessible-update-instructions":"Om du ändrar tiderna, startas en ny sökning automatiskt.",arrival:"Anländer",date:"Datum",departure:"Avgångstid","departure-now":"Avgår nu",time:"Tid","choose-time":"Välj tid",ready:"Färdig",cancel:"Avbryt","invalid-input":"Tiden du angav är felaktig"}}},defaultNS:"translation",react:{useSuspense:!0}});function R({realtime:e,initialArriveBy:t,initialTimestamp:o,onDepartureClick:a,onArrivalClick:s,onTimeChange:r,onDateChange:d,onNowClick:c,embedWhenClosed:u,embedWhenOpen:p,lang:_,color:m,timeZone:y,fontWeights:g,serviceTimeRange:h,onOpen:x,onClose:v,openPicker:k}){l.Settings.defaultLocale=_,l.Settings.defaultZone=y;const w=e?null:l.DateTime.now().toMillis(),[N,E]=n.useState(o?1e3*o:w),[C,I]=n.useState(!0===t?"arrival":"departure");n.useEffect(()=>{const e=null===N&&void 0===o,n=null===N||void 0===o,i=Math.round(N/1e3)===o;!e&&(n||!i)&&E(void 0===o?null:1e3*o),!t==("arrival"===C)&&I(!0===t?"arrival":"departure")},[o,t]);const q=f.default(e=>{if(null===e)return E(l.DateTime.now().toMillis()),void r(l.DateTime.now().toUnixInteger(),"arrival"===C);E(e),r(Math.round(e/1e3),"arrival"===C)},10),D=f.default(e=>{if(null===e)return E(l.DateTime.now().toMillis()),void d(l.DateTime.now().toUnixInteger(),"arrival"===C);E(e),d(Math.round(e/1e3),"arrival"===C)},10);return b.default.createElement(i.I18nextProvider,{i18n:z},b.default.createElement(S,{timestamp:N,onTimeChange:q,onDateChange:D,departureOrArrival:C,onNowClick:()=>{I("departure");const t=e?null:l.DateTime.now().toMillis();E(t),c(Math.round(t/1e3))},onDepartureClick:()=>{let e=!1,t=N;if(null===N){const n=l.DateTime.now().toMillis();E(n),t=n,e=!0}"departure"!==C&&(I("departure"),e=!0),e&&a(Math.round(t/1e3))},onArrivalClick:()=>{let e=!1,t=N;if(null===N){const n=l.DateTime.now().toMillis();E(n),t=n,e=!0}"arrival"!==C&&(I("arrival"),e=!0),e&&s(Math.round(t/1e3))},embedWhenClosed:u,embedWhenOpen:p,lang:_,color:m,timeZone:y,onModalSubmit:(e,t)=>{E(e),I(t),r(Math.round(e/1e3),"arrival"===t,!0)},fontWeights:g,serviceTimeRange:h,onOpen:x,onClose:v,openPicker:k}))}z.init(),"production"!==process.env.NODE_ENV&&(R.propTypes={realtime:m.default.bool,initialTimestamp:m.default.number,initialArriveBy:m.default.bool,onDepartureClick:m.default.func.isRequired,onArrivalClick:m.default.func.isRequired,onTimeChange:m.default.func.isRequired,onDateChange:m.default.func.isRequired,onNowClick:m.default.func.isRequired,embedWhenClosed:m.default.node,embedWhenOpen:m.default.node,lang:m.default.string,color:m.default.string,timeZone:m.default.string,fontWeights:m.default.shape({medium:m.default.number}),serviceTimeRange:m.default.number,onOpen:m.default.func,onClose:m.default.func,openPicker:m.default.bool}),R.defaultProps={realtime:!1,initialArriveBy:void 0,initialTimestamp:void 0,embedWhenClosed:null,embedWhenOpen:null,lang:"en",color:"#007ac9",timeZone:"Europe/Helsinki",fontWeights:{medium:500},onOpen:null,onClose:null,openPicker:void 0,serviceTimeRange:30},e.default=R,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
2
|
-
//# sourceMappingURL=index.
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("prop-types"),require("react"),require("react-i18next"),require("luxon"),require("lodash/debounce"),require("lodash/uniqueId"),require("@digitransit-component/digitransit-component-icon"),require("react-select"),require("classnames"),require("react-modal"),require("downshift"),require("i18next")):"function"==typeof define&&define.amd?define(["exports","prop-types","react","react-i18next","luxon","lodash/debounce","lodash/uniqueId","@digitransit-component/digitransit-component-icon","react-select","classnames","react-modal","downshift","i18next"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@digitransit-component/digitransit-component-datetimepicker"]={},e.PropTypes,e.React,e.reactI18next,e.luxon,e.debounce,e.uniqueId,e.Icon,e.Select,e.cx,e.ReactModal,e.downshift,e.i18next)}(this,function(e,t,n,i,l,o,a,s,r,d,c,u,p){"use strict";function _(e){return e&&e.__esModule?e:{default:e}}var m=_(t),b=_(n),f=_(o),y=_(a),g=_(s),h=_(r),x=_(d),v=_(c);function k(e){let t=e;return 3===t.length&&t.split("").every(e=>Number.isInteger(Number(e)))&&(t=Number(t.slice(0,2))<=23?`${t.slice(0,2)}:${t[2]}`:`${t[0]}:${t.slice(1)}`),t}const w=(e,t)=>{const n=!Number.isNaN(e)&&e>=0&&e<=23,i=2===t.length?!Number.isNaN(t)&&Number(t)>=0&&Number(t<=59):!Number.isNaN(t)&&Number(t)>=0&&Number(t<=5);return n&&i};function N(e){if(e.split(":").length>2)return!1;if(e.length<=2)return!0;if(3===e.length){let t,n;if(e.includes(":"))[t,n]=e.split(":");else{if(!e.startsWith("0")){const i=e.split("");return 1===Number(i[0])||2===Number(i[0])&&Number(i[1]<=3)?[t,n]=[i[0].concat(i[1]),i[2]]:[t,n]=[i[0],i[1].concat(i[2])],w(t,n)}if(t=e.substring(0,e.length-1),n=e.substring(e.length-1||0),Number(n)>5)return!1}return w(t,n)}if(5===e.length||4===e.length){const t=e.split(":"),n=t[0],i=t[1];return!(e.startsWith("0")&&1===i.length&&Number(i)>5)&&w(n,i)}return!0}const E=(e,t)=>{const n=e.trim();if(null!==n.match(/^[0-9]{1,2}(\.|:)[0-9]{2}$/)){const e=n.includes(".")?".":":",i=n.split(e),o=Number(i[0]),a=!Number.isNaN(o)&&o>=0&&o<=23,s=Number(i[1]);if(!(!Number.isNaN(s)&&s>=0&&s<=59)||!a)return null;return l.DateTime.fromMillis(t).set({hour:o,minute:s,second:0,millisecond:0}).valueOf()}return null};var C={"sr-only":"styles_sr-only__-RF2k","dt-datetimepicker":"styles_dt-datetimepicker__lxoIv",hidden:"styles_hidden__wu5e2","datetimepicker-open-container":"styles_datetimepicker-open-container__bpaWY","top-row-container":"styles_top-row-container__CkzlY",closed:"styles_closed__tu-GM","time-icon":"styles_time-icon__-brVP","dropdown-icon":"styles_dropdown-icon__18ELr","close-icon":"styles_close-icon__Y-fPy","label-open":"styles_label-open__Tn-Io",textbutton:"styles_textbutton__WqXW2",active:"styles_active__bVP5t","combobox-left":"styles_combobox-left__D1SkD","combobox-right":"styles_combobox-right__nmiuA","departure-or-arrival-container":"styles_departure-or-arrival-container__H5DSE","radio-textbutton-label":"styles_radio-textbutton-label__BpMvP","first-radio":"styles_first-radio__t-EvH","radio-textbutton":"styles_radio-textbutton__IUovC","departure-now-button":"styles_departure-now-button__ABsuy","open-button":"styles_open-button__QeJ4p","close-button":"styles_close-button__I7Glg","right-edge":"styles_right-edge__i8zbY","combobox-container":"styles_combobox-container__xgaZ9","combobox-icon":"styles_combobox-icon__s8Fqp","date-input-icon":"styles_date-input-icon__kdVNt","time-input-icon":"styles_time-input-icon__4xP1Q","datetimepicker-select-container":"styles_datetimepicker-select-container__ggz2q","picker-container":"styles_picker-container__HPTN-","combobox-mobile-container":"styles_combobox-mobile-container__3gI5Z","mobile-modal-overlay":"styles_mobile-modal-overlay__-zbAR","mobile-modal-content":"styles_mobile-modal-content__b--yj","top-row":"styles_top-row__8DzJH","modal-title":"styles_modal-title__q8WAY","tab-row":"styles_tab-row__3wAQu","radio-tab-label":"styles_radio-tab-label__ZrHjD","input-row":"styles_input-row__skosN","input-container":"styles_input-container__QAZEP","time-input-mobile":"styles_time-input-mobile__Sh0gP","mobile-input-display":"styles_mobile-input-display__qPsdI","mobile-input-hidden":"styles_mobile-input-hidden__56Q1p",container:"styles_container__QYfyS",suggestion:"styles_suggestion__MApuW",suggestionHighlighted:"styles_suggestionHighlighted__-KI4M",suggestionsContainerOpen:"styles_suggestionsContainerOpen__hHnwr",input:"styles_input__sYlZv","buttons-row":"styles_buttons-row__mfbQC","ready-button":"styles_ready-button__BPMPX"};function I({value:e,onChange:t,getDisplay:o,timeChoices:a,id:s,label:r,icon:d,disableTyping:c,timeZone:u,datePicker:p,translationSettings:_}){l.Settings.defaultZone=u;const[m]=i.useTranslation(),[f,y]=n.useState(o(e)),[g,v]=n.useState(!1),[w,I]=n.useState(!0),[q,D]=n.useState(!1);n.useEffect(()=>{y(o(e)),p||D(!1)},[e]);const T=e=>{const n=Number(e);try{l.DateTime.fromMillis(n)}catch(e){return}t(n)};const A=a.map(e=>({value:e.toString(),label:o(e)})),P=p?A:A.filter(e=>e.label.split(":")[1]%15==0),S=P.length>0?P?.reduce((t,n)=>Math.abs(e-t.value)<Math.abs(e-n.value)?t:n):void 0,z=`${s}-input`,R=`${s}-label`,$=m("invalid-input",_);return b.default.createElement("label",{className:C["combobox-container"],htmlFor:z},b.default.createElement("span",{className:C["sr-only"],id:R},r," ",f),d,b.default.createElement(h.default,{"aria-labelledby":R,ariaLiveMessages:{guidance:e=>void 0===e.isDisabled&&q?$:".",onChange:()=>"",onFilter:()=>"",onFocus:({context:e,label:t})=>"menu"===e?t:""},options:A,inputId:z,onChange:t=>{const n=l.DateTime.fromMillis(e).toFormat("HH:mm"),i=E(f,e);if(g)return null!==i?(n!==f&&t.value===e?T(i):T(t.value),v(!1)):(t.value!==e?T(t.value):y(o(e)),v(!1)),void(p||D(!1));p||D(!1),T(t.value)},components:{IndicatorsContainer:()=>null},className:x.default(C["datetimepicker-select-container"],q&&"datetimepicker-invalid-input"),classNamePrefix:"datetimepicker-select",onInputChange:(e,{action:t})=>{if("menu-close"===t?I(!0):w&&I(!1),!(c||e&&!function(e){if(e.length<f?.length){const t=N(e);return D(!t),!0}if(/[a-zA-Z§ÄäÖö.-\s]/g.test(e))return!1;const t=N(e.length>5?e.slice(0,-1):e);return D(!t),e.length<=5}(e))&&"input-change"===t){const t=k(e);y(t),v(!0)}},inputValue:!c&&f,value:S,noOptionsMessage:()=>"",filterOption:(e,t)=>{if(p)return!0;const n=5===t.length||4===t.length&&1===t.split(":")[0].length,i=e.label.split(":")[1]%15==0,l=1===t.split(":")[1]?.length;if(w&&i)return!0;if(l){const n=1===t.split(":")[0].length?"0".concat(t.split(":")[0]):t.split(":")[0],i=t.split(":")[1],l=e.label.split(":")[0],o=e.label.split(":")[1];if(n===l){const e=10*Number(i),t=Number(o)-e;return t>=0&&t<=9}}return n&&!w?4===t.length?"0".concat(t)===e.label:t===e.label:!!i&&((e,t)=>{const n=t.length<=2?t:t.split(":")[0],i=/^([0-1]?[0-9]|2[0-3])$/.test(n),l=1===n.length?"0".concat(t):t;return!i||e.label.split(":")[0]===l.split(":")[0]})(e,t)},controlShouldRenderValue:c,tabSelectsValue:!1,placeholder:"",onFocus:e=>{c||e.target.select()},onBlur:()=>{if(g){const t=E(f,e);null!==t?(T(t),v(!1)):(y(o(e)),v(!1))}p||D(!1)},onKeyDown:e=>{["ArrowDown","ArrowUp"].includes(e.key)&&v(!1)},isSearchable:!c}))}function q(){const e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)}!function(e,t){void 0===t&&(t={});var n=t.insertAt;if("undefined"!=typeof document){var i=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===n&&i.firstChild?i.insertBefore(l,i.firstChild):i.appendChild(l),l.styleSheet?l.styleSheet.cssText=e:l.appendChild(document.createTextNode(e))}}(".styles_sr-only__-RF2k:not(:focus, :active) {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n\n.styles_dt-datetimepicker__lxoIv {\n border: none;\n padding: 0;\n margin: 0;\n font-size: 15px;\n font-weight: var(--font-weight-medium);\n}\n.styles_dt-datetimepicker__lxoIv button,\n.styles_dt-datetimepicker__lxoIv label {\n font-size: 1em;\n font-weight: inherit;\n}\n.styles_dt-datetimepicker__lxoIv label button {\n cursor: pointer;\n font-family: inherit;\n}\n.styles_dt-datetimepicker__lxoIv .styles_hidden__wu5e2 {\n display: none;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-open-container__bpaWY {\n background-color: #f2f5f7;\n border-radius: 5px;\n padding: 15px;\n margin: 9px 0 9px 0;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n min-height: 36px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY.styles_closed__tu-GM {\n margin: 4px 0 6px 18px;\n}\n@media screen and (max-width: 319px) {\n .styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY {\n margin-left: 14px;\n }\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_time-icon__-brVP svg {\n width: 18px;\n height: 19px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_dropdown-icon__18ELr {\n margin-left: 9px;\n position: relative;\n top: 1px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_dropdown-icon__18ELr svg {\n width: 14px;\n height: 10px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_close-icon__Y-fPy svg {\n width: 12px;\n height: 12px;\n border-radius: 1px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY .styles_close-icon__Y-fPy svg path {\n stroke-width: 30;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY label {\n cursor: pointer;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY label.styles_label-open__Tn-Io {\n align-items: flex-start;\n display: flex;\n}\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY button,\n.styles_dt-datetimepicker__lxoIv .styles_top-row-container__CkzlY label {\n font-size: 1em;\n letter-spacing: -0.5px;\n line-height: 1;\n}\n.styles_dt-datetimepicker__lxoIv .styles_textbutton__WqXW2 {\n margin-left: 9px;\n background: none;\n border: none;\n color: #666;\n}\n@media screen and (min-width: 768px) {\n .styles_dt-datetimepicker__lxoIv .styles_textbutton__WqXW2 {\n margin-left: 14px;\n }\n}\n.styles_dt-datetimepicker__lxoIv .styles_textbutton__WqXW2.styles_active__bVP5t {\n color: var(--color);\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-left__D1SkD {\n position: relative;\n margin-right: 4px;\n width: 63%;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-right__nmiuA {\n position: relative;\n margin-left: 4px;\n width: 37%;\n}\n.styles_dt-datetimepicker__lxoIv .styles_departure-or-arrival-container__H5DSE {\n height: calc(1rem + 20px);\n background-color: #ddd;\n border-radius: 8px;\n display: flex;\n width: calc(5px + 13em);\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP {\n color: #333;\n margin: 2px;\n background: none;\n border-radius: 6px;\n padding: 9px 0;\n width: 50%;\n cursor: pointer;\n height: calc(1rem + 16px);\n text-align: center;\n font-weight: 400;\n font-size: 15px;\n line-height: 18px;\n letter-spacing: -0.03em;\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP.styles_active__bVP5t {\n font-weight: 500;\n background: white;\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP:focus-within {\n /* First apply outline that is used in Edge and Firefox */\n outline: 1px dotted #212121;\n /* Then override outline for webkit browsers like Chrome, this has no effect on other browsers */\n outline: 5px auto -webkit-focus-ring-color; /* stylelint-disable-line declaration-block-no-duplicate-properties */\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton-label__BpMvP.styles_first-radio__t-EvH {\n margin: 0;\n display: flex;\n align-items: flex-start;\n}\n.styles_dt-datetimepicker__lxoIv .styles_radio-textbutton__IUovC {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_departure-now-button__ABsuy {\n font-family: inherit;\n letter-spacing: -0.02em;\n height: calc(1rem + 18px);\n color: var(--color);\n padding: 8px 0;\n width: 6.6875rem;\n background: white;\n border: 1px solid #888;\n border-radius: 30px;\n margin-left: 11px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_open-button__QeJ4p {\n display: flex;\n margin-bottom: 0;\n margin-top: 1px;\n padding: 2px 0 2px 0;\n}\n.styles_dt-datetimepicker__lxoIv button.styles_close-button__I7Glg {\n transition: transform 0.2s;\n position: relative;\n top: -14px;\n right: -8px;\n border: 0;\n font-weight: normal;\n background: none;\n color: var(--color);\n padding: 0;\n line-height: normal;\n}\n.styles_dt-datetimepicker__lxoIv button.styles_close-button__I7Glg:hover {\n transform: scale(1.2);\n}\n.styles_dt-datetimepicker__lxoIv .styles_right-edge__i8zbY {\n margin-left: auto;\n margin-right: 0;\n position: relative;\n top: -2px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-container__xgaZ9 {\n cursor: pointer;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp {\n color: var(--color);\n height: 40px;\n position: absolute;\n z-index: 7;\n pointer-events: none;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_date-input-icon__kdVNt {\n display: flex;\n align-items: center;\n padding: 0;\n margin-left: 14px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_date-input-icon__kdVNt svg {\n width: 20px;\n height: 18px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_time-input-icon__4xP1Q {\n display: flex;\n align-items: center;\n padding: 0;\n margin-left: 8px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-icon__s8Fqp.styles_time-input-icon__4xP1Q svg {\n margin-top: 1px;\n width: 22px;\n height: 22px;\n}\n.styles_dt-datetimepicker__lxoIv .datetimepicker-invalid-input input {\n color: #f00 !important;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q {\n position: relative;\n height: 40px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__control {\n cursor: inherit;\n height: 40px;\n border: 1px solid #888;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__value-container {\n padding: 0;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__single-value {\n margin: 0 0 0 47px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__input {\n background: inherit;\n position: relative;\n margin-left: 40px;\n margin-top: -4px;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__input input {\n opacity: 1 !important;\n background: inherit;\n box-shadow: none;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.33;\n letter-spacing: -0.5px;\n color: #333;\n font-family: inherit;\n font-size: 15px;\n font-weight: var(--font-weight-medium);\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__input input:focus {\n box-shadow: none;\n outline: none;\n border: none;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu {\n z-index: 19;\n padding: 0;\n background: #fff;\n max-height: 250px;\n border-radius: 5px;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.06);\n border: 1px rgba(0, 0, 0, 0.1) solid;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list {\n max-height: 250px;\n padding: 0;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list .datetimepicker-select__option {\n height: 50px;\n border-top: 1px solid #ddd;\n padding: 13px 0 0 12px;\n letter-spacing: -0.6px;\n color: #333;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list .datetimepicker-select__option--is-selected {\n background: inherit;\n}\n.styles_dt-datetimepicker__lxoIv .styles_datetimepicker-select-container__ggz2q .datetimepicker-select__menu .datetimepicker-select__menu-list .datetimepicker-select__option--is-focused {\n background: #dfe5e8;\n}\n.styles_dt-datetimepicker__lxoIv .styles_picker-container__HPTN- {\n margin: 14px 0 0 0;\n display: flex;\n}\n.styles_dt-datetimepicker__lxoIv .styles_combobox-mobile-container__3gI5Z {\n flex-grow: 1;\n}\n\n.styles_mobile-modal-overlay__-zbAR {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.6);\n z-index: 10001;\n}\n\n.styles_mobile-modal-content__b--yj {\n font-family: inherit;\n background: white;\n width: 89%;\n position: absolute;\n left: 5.5%;\n padding: 31px 20px 33px 20px;\n top: 80px;\n border-radius: 5px;\n}\n.styles_mobile-modal-content__b--yj .styles_top-row__8DzJH {\n display: flex;\n justify-content: space-between;\n margin-bottom: 21px;\n}\n.styles_mobile-modal-content__b--yj .styles_top-row__8DzJH .styles_modal-title__q8WAY {\n font-weight: var(--font-weight-medium);\n font-size: 20px;\n line-height: 18px;\n letter-spacing: -0.5px;\n color: #333;\n padding: 6px 0 0 8px;\n}\n.styles_mobile-modal-content__b--yj .styles_top-row__8DzJH .styles_departure-now-button__ABsuy {\n background-color: white;\n font-family: inherit;\n padding: 5px 15px;\n border: 1px solid #888;\n border-radius: 50px;\n font-weight: var(--font-weight-medium);\n font-size: 15px;\n line-height: 18px;\n letter-spacing: -0.02em;\n color: var(--color);\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu {\n display: flex;\n border: 2px solid #ddd;\n border-radius: 5px;\n margin-bottom: 16px;\n background-color: #ddd;\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu .styles_radio-tab-label__ZrHjD {\n padding: 9px 0;\n font-size: 15px;\n line-height: 18px;\n letter-spacing: -0.5px;\n border-radius: 3px;\n font-weight: normal;\n width: 50%;\n text-align: center;\n color: #333;\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu .styles_radio-tab-label__ZrHjD.styles_active__bVP5t {\n font-weight: var(--font-weight-medium);\n background-color: #fff;\n}\n.styles_mobile-modal-content__b--yj .styles_tab-row__3wAQu .styles_radio-textbutton__IUovC {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN {\n display: flex;\n margin-bottom: 25px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN label:first-child {\n flex-basis: 60%;\n margin-right: 10px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN label:nth-child(2) {\n flex-basis: 40%;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP {\n border: 1px solid #888;\n border-radius: 5px;\n display: flex;\n align-items: center;\n height: 40px;\n line-height: 1.5;\n font-size: 100%;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP:focus-within {\n background: rgba(0, 122, 201, 0.06);\n border: 2px solid var(--color);\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_combobox-icon__s8Fqp {\n height: 18px;\n font-size: 18px;\n padding: 0 0 0 10px;\n border: none;\n position: relative;\n top: 3px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_combobox-icon__s8Fqp.styles_time-input-icon__4xP1Q > svg {\n height: 20px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_combobox-icon__s8Fqp.styles_date-input-icon__kdVNt > svg {\n height: 20px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .mobile-datetimepicker-invalid-input {\n color: #f00 !important;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_time-input-mobile__Sh0gP {\n font-family: inherit;\n box-shadow: none;\n font-size: 18px;\n letter-spacing: -0.5px;\n line-height: 20px;\n font-weight: var(--font-weight-medium);\n border: none;\n outline: none;\n background: none;\n width: 54px;\n margin-left: 10px;\n color: #333;\n height: 1.5265rem;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-display__qPsdI {\n position: relative;\n left: 10px;\n border: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-display__qPsdI:focus {\n outline: none;\n box-shadow: none;\n background: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-display__qPsdI {\n background: inherit;\n box-shadow: none;\n font-family: inherit;\n font-weight: var(--font-weight-medium);\n font-stretch: normal;\n font-style: normal;\n font-size: 16px;\n line-height: 1.33;\n letter-spacing: -0.5px;\n color: #333;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-hidden__56Q1p {\n font-size: 16px;\n margin-bottom: 12px;\n height: 0;\n width: 0;\n background: inherit;\n color: transparent;\n outline: none;\n box-shadow: none;\n border: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_mobile-input-hidden__56Q1p:focus {\n outline: none;\n box-shadow: none;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS {\n position: absolute;\n width: calc((100% - 50px) * 0.6);\n height: 25px;\n font-size: 15px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestion__MApuW {\n list-style: none;\n font-size: 16px;\n font-style: normal;\n font-weight: normal;\n line-height: 49px;\n height: 50px;\n margin: 0;\n padding: 0 0 0 16px;\n color: rgba(0, 0, 0, 0.87);\n background: white;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestionHighlighted__-KI4M {\n background: #dfe5e8;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestionsContainerOpen__hHnwr {\n position: absolute;\n z-index: 19;\n max-height: 250px;\n overflow-x: hidden;\n overflow-y: scroll;\n border-radius: 5px;\n box-shadow: 0 2px 0 0 rgba(0, 0, 0, 0.06);\n border: 1px rgba(0, 0, 0, 0.1) solid;\n top: 42px;\n left: -2px;\n width: 100%;\n font-size: 16px;\n line-height: 1;\n color: rgba(0, 0, 0, 0.87);\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_suggestionsContainerOpen__hHnwr ul {\n padding: 0;\n margin: 0;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_input__sYlZv {\n color: black;\n box-shadow: none;\n border: none;\n background: none;\n font-size: 16px;\n font-weight: var(--font-weight-medium);\n height: 25px;\n display: inline-block;\n font-family: inherit;\n line-height: 1.33;\n padding-left: 46px;\n}\n.styles_mobile-modal-content__b--yj .styles_input-row__skosN .styles_input-container__QAZEP .styles_container__QYfyS .styles_input__sYlZv:focus {\n outline: none;\n border: none;\n background: none;\n}\n.styles_mobile-modal-content__b--yj .styles_buttons-row__mfbQC {\n display: flex;\n flex-direction: column;\n font-size: 16px;\n font-weight: var(--font-weight-medium);\n}\n.styles_mobile-modal-content__b--yj .styles_buttons-row__mfbQC button {\n background-color: white;\n font-family: inherit;\n font-weight: var(--font-weight-medium);\n font-size: 16px;\n letter-spacing: -0.02em;\n width: 100%;\n border-radius: 50px;\n height: 40px;\n color: var(--color);\n border: 1px solid #888;\n}\n.styles_mobile-modal-content__b--yj .styles_buttons-row__mfbQC button.styles_ready-button__BPMPX {\n color: white;\n background-color: var(--color);\n border: none;\n margin-bottom: 10px;\n}"),"production"!==process.env.NODE_ENV&&(I.propTypes={value:m.default.number.isRequired,onChange:m.default.func.isRequired,getDisplay:m.default.func.isRequired,timeChoices:m.default.arrayOf(m.default.number).isRequired,id:m.default.string.isRequired,label:m.default.node.isRequired,icon:m.default.node.isRequired,disableTyping:m.default.bool,timeZone:m.default.string,datePicker:m.default.bool,translationSettings:m.default.shape({lng:m.default.string.isRequired})}),I.defaultProps={disableTyping:!1,timeZone:"Europe/Helsinki",datePicker:!1,translationSettings:{lng:"fi"}};const D=({value:e,dateChoices:t,id:n,getDisplay:i,onChange:l,labelId:o,inputId:a})=>{const s=t.map(e=>({value:e,label:i(e)})),r=s.find(t=>t.value===e)||s[0]||null,{isOpen:d,getToggleButtonProps:c,getMenuProps:p,getItemProps:_,highlightedIndex:m}=u.useSelect({selectedItem:r,items:s,itemToString:e=>e?.label??"",onSelectedItemChange:({selectedItem:e})=>{e&&l(e.value)},id:n});return b.default.createElement("div",{className:C.container},b.default.createElement("div",c({"aria-labelledby":o,id:a}),b.default.createElement("div",{className:C.input},r.label)),b.default.createElement("div",{className:x.default(C.suggestionsContainerOpen,!d&&"hidden")},b.default.createElement("ul",p(),d&&s.map((e,t)=>b.default.createElement("li",Object.assign({key:e.value,className:x.default(C.suggestion,t===m&&C.suggestionHighlighted)},_({index:t})),b.default.createElement("span",null,e.label))))))};function T({value:e,getDisplay:t,onChange:n,itemCount:i,startTime:o,id:a,label:s,icon:r,timeZone:d}){l.Settings.defaultZone=d;const c=Array(i).fill().map((e,t)=>l.DateTime.fromMillis(o).plus({days:t}).toMillis()),u=!(navigator.userAgent.toLowerCase().indexOf("android")>-1),p=`${a}-label`,_=`${a}-input`;return b.default.createElement("label",{className:C["input-container"],htmlFor:_},b.default.createElement("span",null,r),b.default.createElement("span",{className:C["sr-only"],id:p},s),u?b.default.createElement("select",{id:_,className:C["mobile-input-display"],onChange:e=>n(Number(e.target.value)),value:e},c.map(e=>b.default.createElement("option",{key:e,value:e},t(e)))):b.default.createElement(D,{value:e,dateChoices:c,id:a,getDisplay:t,onChange:n,labelId:p,inputId:_}))}function A({value:e,getDisplay:t,onChange:i,id:o,label:a,icon:s,timeZone:r}){const[d,c]=n.useState(t(e)),[u,p]=n.useState(!0);l.Settings.defaultZone=r;const _=`${o}-input`,m=`${o}-label`,f=!u;return b.default.createElement("label",{className:C["input-container"],htmlFor:_},b.default.createElement("span",null,s),b.default.createElement("span",{className:C["sr-only"],id:m},a),b.default.createElement("input",{id:_,inputMode:"numeric",type:"text",maxLength:"6",className:x.default(C["time-input-mobile"],f&&"mobile-datetimepicker-invalid-input"),value:d,onFocus:e=>{e.target.setSelectionRange(0,0)},onChange:t=>{let n=t.target.value.replace(".",":");const l=N(n);if(p(l),n.match(/[0-9]{3}:[0-9]{2}/)&&n.slice(1)===d&&(n=n.charAt(0)),n.length>5)return;const o=k(n);c(o);const a=E(o,e);a&&i(a)}}))}function P({departureOrArrival:e,onNowClick:t,lang:o,color:a,timeZone:s,onSubmit:r,onCancel:d,timestamp:c,getTimeDisplay:u,dateSelectItemCount:p,getDateDisplay:_,fontWeights:m,onAfterClose:f}){l.Settings.defaultZone=s;const[h]=i.useTranslation(),x={lng:o},[k,w]=n.useState(c),[N,E]=n.useState(e);const[I]=n.useState(y.default("datetimepicker-")),q=l.DateTime.now().startOf("day").set({hour:l.DateTime.fromMillis(k).hour,minute:l.DateTime.fromMillis(k).minute}).toMillis();return b.default.createElement(v.default,{appElement:document?document.querySelector("#app"):void 0,isOpen:!0,className:C["mobile-modal-content"],overlayClassName:C["mobile-modal-overlay"],onAfterClose:f},b.default.createElement("div",{id:"digitransit-mobile-datetime",style:{"--color":`${a}`,"--font-weight-medium":m.medium}},b.default.createElement("div",{className:C["top-row"]},b.default.createElement("h3",{className:C["modal-title"]},h("choose-time",x)),b.default.createElement("button",{type:"button",className:C["departure-now-button"],onClick:t},h("departure-now",x))),b.default.createElement("div",{className:C["tab-row"]},b.default.createElement("label",{htmlFor:`${I}-modal-departure`,className:`${C["radio-tab-label"]}\n ${C["departure"===N?"active":void 0]}`},h("departure",x),b.default.createElement("input",{id:`${I}-modal-departure`,name:"departureOrArrival",type:"radio",value:"departure",className:C["radio-textbutton"],onChange:()=>{E("departure")},checked:"departure"===N})),b.default.createElement("label",{htmlFor:`${I}-modal-arrival`,className:`${C["radio-tab-label"]}\n ${C["arrival"===N?"active":void 0]}`},h("arrival",x),b.default.createElement("input",{id:`${I}-modal-arrival`,name:"departureOrArrival",type:"radio",value:"arrival",className:C["radio-textbutton"],onChange:()=>{E("arrival")},checked:"arrival"===N}))),b.default.createElement("div",{className:C["input-row"]},b.default.createElement(T,{value:k,getDisplay:_,onChange:w,itemCount:p,startTime:q,id:`${I}-date`,label:h("date",x),icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["date-input-icon"]}`},b.default.createElement(g.default,{img:"calendar",color:a})),timeZone:s}),b.default.createElement(A,{value:k,getDisplay:u,onChange:w,id:`${I}-time`,label:h("time",x),icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["time-input-icon"]}`},b.default.createElement(g.default,{img:"time",color:a})),timeZone:s})),b.default.createElement("div",{className:C["buttons-row"]},b.default.createElement("button",{type:"button",className:C["ready-button"],onClick:()=>r(k,N)},h("ready",x)),b.default.createElement("button",{type:"button",className:C["cancel-button"],onClick:d},h("cancel",x)))))}function S({timestamp:e,onTimeChange:t,onDateChange:o,departureOrArrival:a,onNowClick:s,onDepartureClick:r,onArrivalClick:d,embedWhenClosed:c,embedWhenOpen:u,lang:p,color:_,timeZone:m,onModalSubmit:f,fontWeights:h,serviceTimeRange:x,onOpen:v,onClose:k,openPicker:w}){l.Settings.defaultZone=m;const[N]=i.useTranslation(),[E,D]=n.useState(w||!1),[T,A]=n.useState(e||l.DateTime.now().toMillis()),[S,z]=n.useState(null),[R]=n.useState(y.default("datetimepicker-")),[$]=n.useState(q()&&function(){if("undefined"==typeof window||null===window)return!1;const e=document.createElement("input");return e.type="date","date"===e.type&&(e.type="time","time"===e.type)}()),Z=n.useRef(),M=n.useRef(),j=n.useRef(),O={lng:p};n.useEffect(()=>{l.Settings.defaultLocale=p},[p]);const Q=null===e;n.useEffect(()=>{Q?A(l.DateTime.now().toMillis()):(S&&(clearInterval(S),z(null)),A(e))},[e]),n.useEffect(()=>{if(!Q)return;S&&clearInterval(S);const e=setInterval(()=>{const t=l.DateTime.now();l.DateTime.fromMillis(T).hasSame(t,"minute")||(clearInterval(e),z(null),A(t.toMillis()))},5e3);return z(e),()=>clearInterval(e)},[T]);const W=e=>{const t=l.DateTime.fromMillis(e),n=l.DateTime.now();let i;return t.hasSame(n,"day")?(i=N("today",O),i=`${i.charAt(0).toUpperCase()}${i.slice(1)}`):t.hasSame(n.plus({days:1}),"day")?(i=N("tomorrow",O),i=`${i.charAt(0).toUpperCase()}${i.slice(1)}`):i=t.toFormat("ccc d.L."),i},H=e=>l.DateTime.fromMillis(e).toFormat("HH:mm"),[Y,F]=n.useMemo(()=>{const t=l.DateTime.fromMillis(e||l.DateTime.now().toMillis()),n=t.startOf("day").toMillis(),i=q();let o=[],a=t.startOf("day");for(;a.hasSame(n,"day");)o.push(a.valueOf()),a=i?a.plus({minutes:15}):a.plus({minutes:1});if(null===e){const e=3e5,t=Math.ceil(T/e)*e,n=Array(7).fill().map((n,i)=>t+i*e),i=o.map(e=>T-e).findIndex(e=>e<=0);o.splice(i,0,...n),o=Array.from(new Set(o))}const s=l.DateTime.now().startOf("day").set({hour:t.hour,minute:t.minute});return[o,Array(x).fill().map((e,t)=>s.plus({days:t}).toMillis())]},[e]);function V(){j.current&&(j.current.innerHTML=N("accessible-closed",O),setTimeout(()=>{j.current&&(j.current.innerHTML=null)},100))}const L=()=>{D(!1),V(),k&&k()},B=()=>{L(),s()};return b.default.createElement("fieldset",{className:C["dt-datetimepicker"],id:`${R}-root`,style:{"--color":`${_}`,"--font-weight-medium":h.medium}},b.default.createElement("legend",{className:C["sr-only"]},N("accessible-title",O)),b.default.createElement("span",{className:C["sr-only"]},N("accessible-update-instructions",O)),b.default.createElement("div",{className:E?`${C.hidden} datetimepicker-top-row`:`${C["top-row-container"]} ${C.closed} datetimepicker-top-row`},b.default.createElement("label",{className:C["label-open"],htmlFor:`${R}-open`},b.default.createElement("span",{className:C["time-icon"]},b.default.createElement(g.default,{img:"time",color:_})),b.default.createElement("span",{className:C["sr-only"]},N("accessible-open",O)),b.default.createElement("span",{role:"alert",className:C["sr-only"],ref:j}),b.default.createElement("button",{id:`${R}-open`,type:"button",className:`${C.textbutton} ${C.active} ${C["open-button"]}`,"aria-controls":`${R}-root`,"aria-expanded":"false",onClick:()=>{D(!0),j.current&&(j.current.innerHTML=N("accessible-opened",O),setTimeout(()=>{j.current&&(j.current.innerHTML=null)},100)),v&&v()},ref:Z},(()=>{if(Q&&"departure"===a)return b.default.createElement("span",null,N("departure-now",O));const e=W(T),t=H(T),n=N("departure"===a?"departure":"arrival",O),i=l.DateTime.now().hasSame(l.DateTime.fromMillis(T),"day"),o=l.DateTime.now().plus({days:1}).hasSame(l.DateTime.fromMillis(T),"day");return i?b.default.createElement("span",null,`${n} ${t}`):o?b.default.createElement("span",null,`${n} ${e.toLowerCase()} ${t}`):b.default.createElement("span",null,`${n} ${e} ${t}`)})(),b.default.createElement("span",{className:C["dropdown-icon"]},b.default.createElement(g.default,{img:"arrow-dropdown",color:_})))),b.default.createElement("span",{className:C["right-edge"]},c)),b.default.createElement("div",null),$?E&&b.default.createElement(P,{departureOrArrival:a,onNowClick:B,lang:p,color:_,onSubmit:(e,t)=>{f(e,t),D(!1),V()},onCancel:L,onAfterClose:()=>requestAnimationFrame(()=>{Z.current?.focus()}),getTimeDisplay:H,timeZone:m,timestamp:T,getDateDisplay:W,dateSelectItemCount:x,getDisplay:H,fontWeights:h}):b.default.createElement(b.default.Fragment,null,b.default.createElement("div",{className:`${C["datetimepicker-open-container"]} ${E?"":C.hidden}`},b.default.createElement("div",{className:E?`${C["top-row-container"]} datetimepicker-top-row`:`${C.hidden} datetimepicker-top-row`}," ",b.default.createElement("span",{role:"alert",className:C["sr-only"],ref:j}),b.default.createElement("span",null),b.default.createElement("span",{className:C["departure-or-arrival-container"]},b.default.createElement("label",{htmlFor:`${R}-departure`,className:`${C["radio-textbutton-label"]}\n ${C["departure"===a?"active":void 0]}`},N("departure",O),b.default.createElement("input",{id:`${R}-departure`,name:"departureOrArrival",type:"radio",value:"departure",className:C["radio-textbutton"],onChange:()=>{r()},checked:"departure"===a})),b.default.createElement("label",{htmlFor:`${R}-arrival`,className:`${C["radio-textbutton-label"]}\n ${C["arrival"===a?"active":void 0]}`},N("arrival",O),b.default.createElement("input",{id:`${R}-arrival`,name:"departureOrArrival",type:"radio",value:"arrival",className:C["radio-textbutton"],onChange:()=>{d()},checked:"arrival"===a}))),b.default.createElement("button",{id:`${R}-now`,type:"button",className:C["departure-now-button"],onClick:B,ref:M},N("departure-now",O)),b.default.createElement("span",{className:C["right-edge"]},b.default.createElement("button",{type:"button",className:C["close-button"],"aria-controls":`${R}-root`,"aria-expanded":"true",onClick:L},b.default.createElement("span",{className:C["close-icon"]},b.default.createElement(g.default,{img:"close",color:_})),b.default.createElement("span",{className:C["sr-only"]},N("accessible-close",O))))),b.default.createElement("div",{className:E?`${C["picker-container"]}`:`${C.hidden} datetimepicker-top-row`},b.default.createElement("span",{className:C["combobox-left"]},b.default.createElement(I,{value:T,onChange:e=>{o(e)},getDisplay:W,timeChoices:F,validate:()=>null,icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["date-input-icon"]}`},b.default.createElement(g.default,{img:"calendar",color:_})),id:`${R}-date`,label:N("date",O),disableTyping:!0,timeZone:m,datePicker:!0})),b.default.createElement("span",{className:C["combobox-right"]},b.default.createElement(I,{value:T,onChange:e=>{t(e)},getDisplay:H,timeChoices:Y,icon:b.default.createElement("span",{className:`${C["combobox-icon"]} ${C["time-input-icon"]}`},b.default.createElement(g.default,{img:"time",color:_})),id:`${R}-time`,label:N("time",O),timeZone:m,translationSettings:O})))),b.default.createElement("span",{className:E?"":C.hidden},u)))}"production"!==process.env.NODE_ENV&&(D.propTypes={value:m.default.number.isRequired,dateChoices:m.default.arrayOf(m.default.number).isRequired,id:m.default.string.isRequired,getDisplay:m.default.func.isRequired,onChange:m.default.func.isRequired,labelId:m.default.string.isRequired,inputId:m.default.string.isRequired}),"production"!==process.env.NODE_ENV&&(T.propTypes={value:m.default.number.isRequired,getDisplay:m.default.func.isRequired,onChange:m.default.func.isRequired,itemCount:m.default.number.isRequired,startTime:m.default.number.isRequired,id:m.default.string.isRequired,label:m.default.string.isRequired,icon:m.default.node,timeZone:m.default.string}),T.defaultProps={icon:null,timeZone:"Europe/Helsinki"},"production"!==process.env.NODE_ENV&&(A.propTypes={value:m.default.number.isRequired,getDisplay:m.default.func.isRequired,onChange:m.default.func.isRequired,id:m.default.string.isRequired,label:m.default.string.isRequired,icon:m.default.node,timeZone:m.default.string}),A.defaultProps={icon:null,timeZone:"Europe/Helsinki"},l.Settings.defaultLocale="en","production"!==process.env.NODE_ENV&&(P.propTypes={timeZone:m.default.string,departureOrArrival:m.default.oneOf(["departure","arrival"]).isRequired,onNowClick:m.default.func.isRequired,lang:m.default.string.isRequired,color:m.default.string,onSubmit:m.default.func.isRequired,onCancel:m.default.func.isRequired,onAfterClose:m.default.func.isRequired,timestamp:m.default.number.isRequired,getTimeDisplay:m.default.func.isRequired,dateSelectItemCount:m.default.number.isRequired,getDateDisplay:m.default.func.isRequired,fontWeights:m.default.shape({medium:m.default.number.isRequired}).isRequired}),P.defaultProps={color:"#007ac9",timeZone:"Europe/Helsinki"},l.Settings.defaultLocale="en","production"!==process.env.NODE_ENV&&(S.propTypes={timestamp:m.default.number,timeZone:m.default.string,onTimeChange:m.default.func.isRequired,onDateChange:m.default.func.isRequired,departureOrArrival:m.default.oneOf(["departure","arrival"]).isRequired,onNowClick:m.default.func.isRequired,onDepartureClick:m.default.func.isRequired,onArrivalClick:m.default.func.isRequired,embedWhenClosed:m.default.node,embedWhenOpen:m.default.node,lang:m.default.string.isRequired,color:m.default.string,onModalSubmit:m.default.func.isRequired,fontWeights:m.default.shape({medium:m.default.number.isRequired}).isRequired,serviceTimeRange:m.default.number.isRequired,onOpen:m.default.func,onClose:m.default.func,openPicker:m.default.bool}),S.defaultProps={timestamp:null,embedWhenClosed:null,embedWhenOpen:null,color:"#007ac9",timeZone:"Europe/Helsinki",onOpen:null,onClose:null,openPicker:void 0};const z=p.createInstance({fallbackLng:"fi",resources:{de:{translation:{"accessible-close":"Schließe die Auswahl","accessible-closed":"Auswahl geschlossen","accessible-open":"Öffne die Auswahl","accessible-opened":"Auswahl geöffnet","accessible-title":"Datum und Uhrzeitauswahl",arrival:"Ankunft",cancel:"Abbrechen","choose-time":"Zeit wählen",date:"Datum",departure:"Abfahrt","departure-now":"Abfahrt jetzt",ready:"Fertig",time:"Zeit",today:"Heute",tomorrow:"Morgen"}},en:{translation:{"accessible-close":"Close the picker","accessible-closed":"Timepicker closed","accessible-open":"Open the picker","accessible-opened":"Timepicker opened","accessible-title":"Date and timepicker","accessible-update-instructions":"Changing time parameters will trigger a new search.",arrival:"Arrival",cancel:"Cancel","choose-time":"Choose time",date:"Date",departure:"Departure","departure-now":"Leaving now","invalid-input":"The time you entered is invalid",ready:"Ready",time:"Time",today:"Today",tomorrow:"Tomorrow"}},fi:{translation:{"accessible-close":"Sulje valitsin","accessible-closed":"Valitsin suljettu","accessible-open":"Avaa valitsin","accessible-opened":"Valitsin avattu","accessible-title":"Aika- ja päivämäärävalitsin","accessible-update-instructions":"Aikavalintojen muuttaminen laukaisee uuden haun.",arrival:"Perillä",cancel:"Peruuta","choose-time":"Valitse aika",date:"Päivä",departure:"Lähtöaika","departure-now":"Lähtö nyt","invalid-input":"Syöttämäsi aika on virheellinen",ready:"Valmis",time:"Aika",today:"Tänään",tomorrow:"Huomenna"}},pl:{translation:{"accessible-close":"Zamknij wybornik","accessible-closed":"Zamknięto wybornik","accessible-open":"Otwórz wybornik","accessible-opened":"Otwarto wybornik","accessible-title":"Wybór daty i godziny","accessible-update-instructions":"Zmiana wybranej godziny wywoła nowe wyszukiwanie.",arrival:"Przyjazd",cancel:"Anuluj","choose-time":"Wybierz godzinę",date:"Data",departure:"Wyjazd","departure-now":"Wyjeżdżam teraz","invalid-input":"Wprowadzona godzina jest nieprawidłowa",ready:"Gotowe",time:"Godzina",today:"Dziś",tomorrow:"Jutro"}},sv:{translation:{"accessible-close":"Stäng väljaren","accessible-closed":"Väljaren stängde","accessible-open":"Öppna väljaren","accessible-opened":"Väljaren öppnade","accessible-title":"Tid- och datumväljaren","accessible-update-instructions":"Om du ändrar tiderna, startas en ny sökning automatiskt.",arrival:"Anländer",cancel:"Avbryt","choose-time":"Välj tid",date:"Datum",departure:"Avgångstid","departure-now":"Avgår nu","invalid-input":"Tiden du angav är felaktig",ready:"Färdig",time:"Tid",today:"I dag",tomorrow:"I morgon"}}},defaultNS:"translation",react:{useSuspense:!0}});function R({realtime:e,initialArriveBy:t,initialTimestamp:o,onDepartureClick:a,onArrivalClick:s,onTimeChange:r,onDateChange:d,onNowClick:c,embedWhenClosed:u,embedWhenOpen:p,lang:_,color:m,timeZone:y,fontWeights:g,serviceTimeRange:h,onOpen:x,onClose:v,openPicker:k}){l.Settings.defaultLocale=_,l.Settings.defaultZone=y;const w=e?null:l.DateTime.now().toMillis(),[N,E]=n.useState(o?1e3*o:w),[C,I]=n.useState(!0===t?"arrival":"departure");n.useEffect(()=>{const e=null===N&&void 0===o,n=null===N||void 0===o,i=Math.round(N/1e3)===o;!e&&(n||!i)&&E(void 0===o?null:1e3*o),!t==("arrival"===C)&&I(!0===t?"arrival":"departure")},[o,t]);const q=f.default(e=>{if(null===e)return E(l.DateTime.now().toMillis()),void r(l.DateTime.now().toUnixInteger(),"arrival"===C);E(e),r(Math.round(e/1e3),"arrival"===C)},10),D=f.default(e=>{if(null===e)return E(l.DateTime.now().toMillis()),void d(l.DateTime.now().toUnixInteger(),"arrival"===C);E(e),d(Math.round(e/1e3),"arrival"===C)},10);return b.default.createElement(i.I18nextProvider,{i18n:z},b.default.createElement(S,{timestamp:N,onTimeChange:q,onDateChange:D,departureOrArrival:C,onNowClick:()=>{I("departure");const t=e?null:l.DateTime.now().toMillis();E(t),c(Math.round(t/1e3))},onDepartureClick:()=>{let e=!1,t=N;if(null===N){const n=l.DateTime.now().toMillis();E(n),t=n,e=!0}"departure"!==C&&(I("departure"),e=!0),e&&a(Math.round(t/1e3))},onArrivalClick:()=>{let e=!1,t=N;if(null===N){const n=l.DateTime.now().toMillis();E(n),t=n,e=!0}"arrival"!==C&&(I("arrival"),e=!0),e&&s(Math.round(t/1e3))},embedWhenClosed:u,embedWhenOpen:p,lang:_,color:m,timeZone:y,onModalSubmit:(e,t)=>{E(e),I(t),r(Math.round(e/1e3),"arrival"===t,!0)},fontWeights:g,serviceTimeRange:h,onOpen:x,onClose:v,openPicker:k}))}z.init(),"production"!==process.env.NODE_ENV&&(R.propTypes={realtime:m.default.bool,initialTimestamp:m.default.number,initialArriveBy:m.default.bool,onDepartureClick:m.default.func.isRequired,onArrivalClick:m.default.func.isRequired,onTimeChange:m.default.func.isRequired,onDateChange:m.default.func.isRequired,onNowClick:m.default.func.isRequired,embedWhenClosed:m.default.node,embedWhenOpen:m.default.node,lang:m.default.string,color:m.default.string,timeZone:m.default.string,fontWeights:m.default.shape({medium:m.default.number}),serviceTimeRange:m.default.number,onOpen:m.default.func,onClose:m.default.func,openPicker:m.default.bool}),R.defaultProps={realtime:!1,initialArriveBy:void 0,initialTimestamp:void 0,embedWhenClosed:null,embedWhenOpen:null,lang:"en",color:"#007ac9",timeZone:"Europe/Helsinki",fontWeights:{medium:500},onOpen:null,onClose:null,openPicker:void 0,serviceTimeRange:30},e.default=R,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/helpers/utils.js","../src/helpers/DesktopDatetimepicker.js","../src/helpers/mobileDetection.js","../../../../node_modules/style-inject/dist/style-inject.es.js","../src/helpers/MobileDatepicker.js","../src/helpers/MobileTimepicker.js","../src/helpers/MobilePickerModal.js","../src/helpers/Datetimepicker.js","../src/helpers/dateTimeInputIsSupported.js","../src/helpers/translations.js","../src/helpers/i18n.js","../src/index.js"],"sourcesContent":["import { DateTime } from 'luxon';\n\n/**\n * Handle typing time and adding necessary :\n *\n * @param {string} typedValue\n *\n * @return {string}\n */\nexport function parseTypedTime(typedValue) {\n let actualValue = typedValue;\n if (\n actualValue.length === 3 &&\n actualValue.split('').every(n => Number.isInteger(Number(n)))\n ) {\n // add ':' if user types three numbers in a row\n if (Number(actualValue.slice(0, 2)) <= 23) {\n actualValue = `${actualValue.slice(0, 2)}:${actualValue[2]}`;\n } else {\n actualValue = `${actualValue[0]}:${actualValue.slice(1)}`;\n }\n }\n return actualValue;\n}\n\nconst validateClock = (hours, minutes) => {\n const hoursValid = !Number.isNaN(hours) && hours >= 0 && hours <= 23;\n const minutesLen = minutes.length;\n const minutesValid =\n minutesLen === 2\n ? !Number.isNaN(minutes) && Number(minutes) >= 0 && Number(minutes <= 59)\n : !Number.isNaN(minutes) && Number(minutes) >= 0 && Number(minutes <= 5);\n return hoursValid && minutesValid;\n};\n\nexport function validateInput(inputValue) {\n // We don't accept seconds in the input\n if (inputValue.split(':').length > 2) {\n return false;\n }\n if (inputValue.length <= 2) {\n // Too many options, don't validate\n return true;\n }\n if (inputValue.length === 3) {\n let hours;\n let minutes;\n if (inputValue.includes(':')) {\n [hours, minutes] = inputValue.split(':');\n } else if (inputValue.startsWith('0')) {\n hours = inputValue.substring(0, inputValue.length - 1);\n minutes = inputValue.substring(inputValue.length - 1 || 0);\n if (Number(minutes) > 5) {\n return false;\n }\n } else {\n // This is how basically moment handles string formatting.\n // If the first letter of the string is 1, then rest are minutes.\n // if the first letter is 2, then if second letter is 0,1,2 or 3, then second letter is hour, else rest are minutes\n // else, first letter is hour, rest of them are minutes.\n const values = inputValue.split('');\n if (Number(values[0]) === 1) {\n [hours, minutes] = [values[0].concat(values[1]), values[2]];\n } else if (Number(values[0]) === 2) {\n if (Number(values[1] <= 3)) {\n [hours, minutes] = [values[0].concat(values[1]), values[2]];\n } else {\n [hours, minutes] = [values[0], values[1].concat(values[2])];\n }\n } else {\n [hours, minutes] = [values[0], values[1].concat(values[2])];\n }\n return validateClock(hours, minutes);\n }\n return validateClock(hours, minutes);\n }\n if (inputValue.length === 5 || inputValue.length === 4) {\n const values = inputValue.split(':');\n const hours = values[0];\n const minutes = values[1];\n if (\n inputValue.startsWith('0') &&\n minutes.length === 1 &&\n Number(minutes) > 5\n ) {\n return false;\n }\n\n return validateClock(hours, minutes);\n }\n return true;\n}\n\nexport const getTs = (inputValue, currentTimestamp) => {\n const trimmed = inputValue.trim();\n if (trimmed.match(/^[0-9]{1,2}(\\.|:)[0-9]{2}$/) !== null) {\n const splitter = trimmed.includes('.') ? '.' : ':';\n const values = trimmed.split(splitter);\n const hours = Number(values[0]);\n const hoursValid = !Number.isNaN(hours) && hours >= 0 && hours <= 23;\n const minutes = Number(values[1]);\n const minutesValid =\n !Number.isNaN(minutes) && minutes >= 0 && minutes <= 59;\n if (!minutesValid || !hoursValid) {\n return null;\n }\n const newStamp = DateTime.fromMillis(currentTimestamp)\n .set({\n hour: hours,\n minute: minutes,\n second: 0,\n millisecond: 0,\n })\n .valueOf();\n return newStamp;\n }\n return null;\n};\n\nexport default { parseTypedTime, validateInput, getTs };\n","import PropTypes from 'prop-types';\nimport React, { useState, useEffect } from 'react';\nimport { DateTime, Settings } from 'luxon';\nimport { useTranslation } from 'react-i18next';\nimport Select from 'react-select';\nimport cx from 'classnames';\nimport { parseTypedTime, validateInput, getTs } from './utils';\nimport styles from './styles.scss';\n\n/**\n * Component to display a date or time input on desktop.\n *\n * @param {Object} props\n * @param {Number} props.value Currently selected time. Unix timestamp in milliseconds\n * @param {function} props.onChange This is called with new timestamp when input is changed\n * @param {function} props.getDisplay Function to get a string representation from a timestamp\n * @param {array} props.timeChoices Array of timestamps to choose from\n * @param {string} id Id prefix for labels and aria attributes. Should be unique in page\n * @param {string} label Text to show as input label\n * @param {node} icon JSX for icon to show in input\n * @param {boolean} disableTyping Set to true to disable typing in the input\n * @param {boolean} datePicker Is the picker DatePicker or TimePicker\n *\n * @example\n * <DesktopDatetimepicker\n * value={1590133823000}\n * onChange={timestamp => update(timestamp)}\n * getDisplay={timestamp => formatTime(timestamp)}\n * timeChoices={[1590133823000]}\n * id=\"timeinput\"\n * icon=\"<Icon />\"\n * disableTyping={false} // can be omitted if not true\n * datePicker={true} // can be omitted if not true\n */\nfunction DesktopDatetimepicker({\n value,\n onChange,\n getDisplay,\n timeChoices,\n id,\n label,\n icon,\n disableTyping,\n timeZone,\n datePicker,\n translationSettings,\n}) {\n Settings.defaultZone = timeZone;\n const [t] = useTranslation();\n const [displayValue, changeDisplayValue] = useState(getDisplay(value));\n const [typing, setTyping] = useState(false);\n const [showAllOptions, setShowAllOptions] = useState(true);\n const [invalidInput, setinvalidInput] = useState(false);\n useEffect(() => {\n changeDisplayValue(getDisplay(value));\n if (!datePicker) {\n setinvalidInput(false);\n }\n }, [value]);\n\n // newValue is string\n const handleTimestamp = newValue => {\n const asNumber = Number(newValue);\n try {\n DateTime.fromMillis(asNumber);\n } catch (e) {\n // If the value is not a valid timestamp, we don't change it\n return;\n }\n onChange(asNumber);\n };\n function isinvalidInput(str) {\n const regex = /[a-zA-Z§ÄäÖö.-\\s]/g;\n if (str.length < displayValue?.length) {\n const valid = validateInput(str);\n setinvalidInput(!valid);\n\n return true;\n }\n if (regex.test(str)) {\n return false;\n }\n const time = str.length > 5 ? str.slice(0, -1) : str;\n const valid = validateInput(time);\n setinvalidInput(!valid);\n return str.length <= 5;\n }\n const onInputChange = (newValue, { action }) => {\n if (action === 'menu-close') {\n setShowAllOptions(true);\n } else if (showAllOptions) {\n setShowAllOptions(false);\n }\n if (disableTyping || (newValue && !isinvalidInput(newValue))) {\n return;\n }\n if (action === 'input-change') {\n const validated = parseTypedTime(newValue);\n changeDisplayValue(validated);\n setTyping(true);\n }\n };\n const options = timeChoices.map(time => {\n return { value: time.toString(), label: getDisplay(time) };\n });\n\n // Time picker has a list of minutes, instead of 15 minutes. We need to filter those out\n // so closest option will show up in the list.\n const closestOptions = datePicker\n ? options\n : options.filter(o => o.label.split(':')[1] % 15 === 0);\n const closestOption =\n closestOptions.length > 0\n ? closestOptions?.reduce((a, b) =>\n Math.abs(value - a.value) < Math.abs(value - b.value) ? a : b,\n )\n : undefined;\n const inputId = `${id}-input`;\n const labelId = `${id}-label`;\n const filterOptions = (option, input) => {\n const hour = input.length <= 2 ? input : input.split(':')[0];\n const isValidHour = /^([0-1]?[0-9]|2[0-3])$/.test(hour);\n const comp = hour.length === 1 ? '0'.concat(input) : input;\n return isValidHour\n ? option.label.split(':')[0] === comp.split(':')[0]\n : true;\n };\n const ariaError = t('invalid-input', translationSettings);\n return (\n <label className={styles['combobox-container']} htmlFor={inputId}>\n <span className={styles['sr-only']} id={labelId}>\n {label} {displayValue}\n </span>\n {icon}\n <Select\n aria-labelledby={labelId}\n ariaLiveMessages={{\n guidance: context => {\n // When user types invalid value, isDisabled becomes undefined instead of false\n if (context.isDisabled === undefined && invalidInput) {\n return ariaError;\n }\n return '.'; // this can't be empty for some reason\n },\n onChange: () => {\n return '';\n },\n onFilter: () => {\n return '';\n },\n onFocus: ({ context, label: itemLabel }) => {\n if (context === 'menu') {\n return itemLabel;\n }\n return '';\n },\n }}\n options={options}\n inputId={inputId}\n onChange={time => {\n const currentTime = DateTime.fromMillis(value).toFormat('HH:mm');\n const ts = getTs(displayValue, value);\n if (typing) {\n if (ts !== null) {\n if (currentTime !== displayValue && time.value === value) {\n handleTimestamp(ts);\n } else {\n handleTimestamp(time.value);\n }\n setTyping(false);\n } else {\n if (time.value !== value) {\n handleTimestamp(time.value);\n } else {\n // reset value\n changeDisplayValue(getDisplay(value));\n }\n setTyping(false);\n }\n if (!datePicker) {\n setinvalidInput(false);\n }\n return;\n }\n if (!datePicker) {\n setinvalidInput(false);\n }\n handleTimestamp(time.value);\n }}\n components={{\n IndicatorsContainer: () => null,\n }}\n className={cx(\n styles['datetimepicker-select-container'],\n invalidInput ? 'datetimepicker-invalid-input' : '',\n )}\n classNamePrefix=\"datetimepicker-select\"\n onInputChange={onInputChange}\n inputValue={!disableTyping && displayValue}\n value={closestOption}\n noOptionsMessage={() => {\n return '';\n }}\n filterOption={(option, input) => {\n if (datePicker) {\n return true;\n }\n const completeInput =\n input.length === 5 ||\n (input.length === 4 && input.split(':')[0].length === 1);\n const isMod15 = option.label.split(':')[1] % 15 === 0;\n const minuteInput = input.split(':')[1]?.length === 1;\n\n if (showAllOptions && isMod15) {\n return true;\n }\n if (minuteInput) {\n const inputH =\n input.split(':')[0].length === 1\n ? '0'.concat(input.split(':')[0])\n : input.split(':')[0];\n const inputM = input.split(':')[1];\n const optH = option.label.split(':')[0];\n const optM = option.label.split(':')[1];\n if (inputH === optH) {\n const time = Number(inputM) * 10;\n const total = Number(optM) - time;\n if (total >= 0 && total <= 9) {\n return true;\n }\n return false;\n }\n }\n if (completeInput && !showAllOptions) {\n return input.length === 4\n ? '0'.concat(input) === option.label\n : input === option.label;\n }\n if (isMod15) {\n return filterOptions(option, input);\n }\n\n return false;\n }}\n controlShouldRenderValue={disableTyping}\n tabSelectsValue={false}\n placeholder=\"\"\n onFocus={e => {\n if (!disableTyping) {\n e.target.select();\n }\n }}\n onBlur={() => {\n // removing focus also locks in value\n if (typing) {\n const validated = getTs(displayValue, value);\n if (validated !== null) {\n handleTimestamp(validated);\n setTyping(false);\n } else {\n changeDisplayValue(getDisplay(value));\n setTyping(false);\n }\n }\n if (!datePicker) {\n setinvalidInput(false);\n }\n }}\n onKeyDown={e => {\n if (['ArrowDown', 'ArrowUp'].includes(e.key)) {\n setTyping(false);\n }\n }}\n isSearchable={!disableTyping}\n />\n </label>\n );\n}\nDesktopDatetimepicker.propTypes = {\n value: PropTypes.number.isRequired,\n onChange: PropTypes.func.isRequired,\n getDisplay: PropTypes.func.isRequired,\n timeChoices: PropTypes.arrayOf(PropTypes.number).isRequired,\n id: PropTypes.string.isRequired,\n label: PropTypes.node.isRequired,\n icon: PropTypes.node.isRequired,\n disableTyping: PropTypes.bool,\n timeZone: PropTypes.string,\n datePicker: PropTypes.bool,\n translationSettings: PropTypes.shape({ lng: PropTypes.string.isRequired }),\n};\n\nDesktopDatetimepicker.defaultProps = {\n disableTyping: false,\n timeZone: 'Europe/Helsinki',\n datePicker: false,\n translationSettings: { lng: 'fi' },\n};\n\nexport default DesktopDatetimepicker;\n","/**\n * Detect if user is on a mobile device by parsing userAgent. This is not 100% reliable but close enough.\n *\n * @return {boolean}\n */\nfunction isMobile() {\n const userAgent = navigator.userAgent || navigator.vendor || window.opera;\n const mobile =\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(\n userAgent,\n );\n return mobile;\n}\n\n/**\n * Detect if user is on an android device. Not 100% reliable.\n */\nfunction isAndroid() {\n const userAgent = navigator.userAgent.toLowerCase();\n return userAgent.indexOf('android') > -1;\n}\n\nexport { isMobile, isAndroid };\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { DateTime, Settings } from 'luxon';\nimport { useSelect } from 'downshift';\nimport cx from 'classnames';\nimport styles from './styles.scss';\nimport { isAndroid } from './mobileDetection';\n\nconst AndroidSelect = ({\n value,\n dateChoices,\n id,\n getDisplay,\n onChange,\n labelId,\n inputId,\n}) => {\n const items = dateChoices.map(date => ({\n value: date,\n label: getDisplay(date),\n }));\n const selectedItem =\n items.find(option => option.value === value) || items[0] || null;\n const {\n isOpen,\n getToggleButtonProps,\n getMenuProps,\n getItemProps,\n highlightedIndex,\n } = useSelect({\n selectedItem,\n items,\n itemToString: item => item?.label ?? '',\n onSelectedItemChange: ({ selectedItem: nextSelectedItem }) => {\n if (nextSelectedItem) {\n onChange(nextSelectedItem.value);\n }\n },\n id,\n });\n\n return (\n <div className={styles.container}>\n <div\n {...getToggleButtonProps({ 'aria-labelledby': labelId, id: inputId })}\n >\n <div className={styles.input}>{selectedItem.label}</div>\n </div>\n <div\n className={cx([styles.suggestionsContainerOpen, !isOpen && 'hidden'])}\n >\n <ul {...getMenuProps()}>\n {isOpen &&\n items.map((option, index) => (\n <li\n key={option.value}\n className={cx([\n styles.suggestion,\n index === highlightedIndex && styles.suggestionHighlighted,\n ])}\n {...getItemProps({ index })}\n >\n <span>{option.label}</span>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n};\n\nAndroidSelect.propTypes = {\n value: PropTypes.number.isRequired,\n dateChoices: PropTypes.arrayOf(PropTypes.number).isRequired,\n id: PropTypes.string.isRequired,\n getDisplay: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n labelId: PropTypes.string.isRequired,\n inputId: PropTypes.string.isRequired,\n};\n\n/**\n * Component to display a date input on mobile\n */\nfunction MobileDatepicker({\n value,\n getDisplay,\n onChange,\n itemCount,\n startTime,\n id,\n label,\n icon,\n timeZone,\n}) {\n Settings.defaultZone = timeZone;\n const dateChoices = Array(itemCount)\n .fill()\n .map((_, i) => DateTime.fromMillis(startTime).plus({ days: i }).toMillis());\n const nativeInput = !isAndroid();\n const labelId = `${id}-label`;\n const inputId = `${id}-input`;\n\n return (\n <label className={styles['input-container']} htmlFor={inputId}>\n <span>{icon}</span>\n <span className={styles['sr-only']} id={labelId}>\n {label}\n </span>\n {nativeInput ? (\n <select\n id={inputId}\n className={styles['mobile-input-display']}\n onChange={e => onChange(Number(e.target.value))}\n value={value}\n >\n {dateChoices.map(date => {\n return (\n <option key={date} value={date}>\n {getDisplay(date)}\n </option>\n );\n })}\n </select>\n ) : (\n <AndroidSelect\n {...{\n value,\n dateChoices,\n id,\n getDisplay,\n onChange,\n labelId,\n inputId,\n }}\n />\n )}\n </label>\n );\n}\nMobileDatepicker.propTypes = {\n value: PropTypes.number.isRequired,\n getDisplay: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n itemCount: PropTypes.number.isRequired,\n startTime: PropTypes.number.isRequired,\n id: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n icon: PropTypes.node,\n timeZone: PropTypes.string,\n};\n\nMobileDatepicker.defaultProps = {\n icon: null,\n timeZone: 'Europe/Helsinki',\n};\n\nexport default MobileDatepicker;\n","import PropTypes from 'prop-types';\nimport React, { useState } from 'react';\nimport { Settings } from 'luxon';\nimport cx from 'classnames';\nimport styles from './styles.scss';\nimport { parseTypedTime, getTs, validateInput } from './utils';\n\n/**\n * Component to display a time input on mobile\n */\nfunction MobileTimepicker({\n value,\n getDisplay,\n onChange,\n id,\n label,\n icon,\n timeZone,\n}) {\n const [inputValue, changeInputValue] = useState(getDisplay(value));\n const [isValidInput, setValidInput] = useState(true);\n Settings.defaultZone = timeZone;\n const inputId = `${id}-input`;\n const labelId = `${id}-label`;\n const showError = !isValidInput;\n return (\n <label className={styles['input-container']} htmlFor={inputId}>\n <span>{icon}</span>\n <span className={styles['sr-only']} id={labelId}>\n {label}\n </span>\n <input\n id={inputId}\n inputMode=\"numeric\"\n type=\"text\"\n maxLength=\"6\"\n className={cx(\n styles['time-input-mobile'],\n showError ? 'mobile-datetimepicker-invalid-input' : '',\n )}\n value={inputValue}\n onFocus={e => {\n e.target.setSelectionRange(0, 0); // set caret to start of input\n }}\n onChange={event => {\n let newValue = event.target.value.replace('.', ':');\n\n const valid = validateInput(newValue);\n setValidInput(valid);\n if (\n // number typed as first char => clear rest of the input\n newValue.match(/[0-9]{3}:[0-9]{2}/) &&\n newValue.slice(1) === inputValue\n ) {\n newValue = newValue.charAt(0);\n }\n if (newValue.length > 5) {\n return;\n }\n const actual = parseTypedTime(newValue);\n changeInputValue(actual);\n const timestamp = getTs(actual, value);\n if (timestamp) {\n onChange(timestamp);\n }\n }}\n />\n </label>\n );\n}\nMobileTimepicker.propTypes = {\n value: PropTypes.number.isRequired,\n getDisplay: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n id: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n icon: PropTypes.node,\n timeZone: PropTypes.string,\n};\n\nMobileTimepicker.defaultProps = {\n icon: null,\n timeZone: 'Europe/Helsinki',\n};\n\nexport default MobileTimepicker;\n","import PropTypes from 'prop-types';\nimport React, { useState } from 'react';\nimport { DateTime, Settings } from 'luxon';\nimport { useTranslation } from 'react-i18next';\nimport uniqueId from 'lodash/uniqueId';\nimport Modal from 'react-modal';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport MobileDatepicker from './MobileDatepicker';\nimport MobileTimepicker from './MobileTimepicker';\nimport styles from './styles.scss';\n\nSettings.defaultLocale = 'en';\n\n/**\n * @param {object} props\n * @param {'arrival'|'departure'} props.departureOrArrival Whether the picker is for arrival or departure time\n * @param {function} props.onNowClick Called when the \"Now\" button is clicked\n * @param {string} props.lang Language code for translations\n * @param {string} props.color Color for the component, used in styles\n * @param {string} props.timeZone Time zone to use for date and time calculations\n * @param {function} props.onSubmit Called when the user submits the selected date and time\n * @param {function} props.onCancel called when the user cancels the selection\n * @param {number} props.timestamp Initial timestamp to display in the picker\n * @param {function} props.getTimeDisplay Called to get the display string for a given timestamp\n * @param {number} props.dateSelectItemCount Determines how many date options are shown in the date picker\n * @param {function} props.getDateDisplay Called to get the display string for a given date\n * @param {object} props.fontWeights Font weights used in the component styles\n * @returns {JSX.Element}\n */\nfunction MobilePickerModal({\n departureOrArrival,\n onNowClick,\n lang,\n color,\n timeZone,\n onSubmit,\n onCancel,\n timestamp,\n getTimeDisplay,\n dateSelectItemCount,\n getDateDisplay,\n fontWeights,\n onAfterClose,\n}) {\n Settings.defaultZone = timeZone;\n const [t] = useTranslation();\n const translationSettings = { lng: lang };\n\n const [displayTimestamp, changeTimestamp] = useState(timestamp);\n\n const [departureOrArrivalCurrent, changeDepartureOrArrival] =\n useState(departureOrArrival);\n\n function onArrivalClick() {\n changeDepartureOrArrival('arrival');\n }\n\n function onDepartureClick() {\n changeDepartureOrArrival('departure');\n }\n\n // for input labels\n const [htmlId] = useState(uniqueId('datetimepicker-'));\n const dateSelectStartTime = DateTime.now()\n .startOf('day')\n .set({\n hour: DateTime.fromMillis(displayTimestamp).hour,\n minute: DateTime.fromMillis(displayTimestamp).minute,\n })\n .toMillis();\n\n return (\n <Modal\n appElement={document ? document.querySelector('#app') : undefined}\n isOpen\n className={styles['mobile-modal-content']}\n overlayClassName={styles['mobile-modal-overlay']}\n onAfterClose={onAfterClose}\n >\n <div\n id=\"digitransit-mobile-datetime\"\n style={{\n '--color': `${color}`,\n '--font-weight-medium': fontWeights.medium,\n }}\n >\n <div className={styles['top-row']}>\n <h3 className={styles['modal-title']}>\n {t('choose-time', translationSettings)}\n </h3>\n <button\n type=\"button\"\n className={styles['departure-now-button']}\n onClick={onNowClick}\n >\n {t('departure-now', translationSettings)}\n </button>\n </div>\n <div className={styles['tab-row']}>\n <label\n htmlFor={`${htmlId}-modal-departure`}\n className={`${styles['radio-tab-label']}\n ${\n styles[\n departureOrArrivalCurrent === 'departure'\n ? 'active'\n : undefined\n ]\n }`}\n >\n {t('departure', translationSettings)}\n <input\n id={`${htmlId}-modal-departure`}\n name=\"departureOrArrival\"\n type=\"radio\"\n value=\"departure\"\n className={styles['radio-textbutton']}\n onChange={() => {\n onDepartureClick();\n }}\n checked={departureOrArrivalCurrent === 'departure'}\n />\n </label>\n <label\n htmlFor={`${htmlId}-modal-arrival`}\n className={`${styles['radio-tab-label']}\n ${\n styles[\n departureOrArrivalCurrent === 'arrival'\n ? 'active'\n : undefined\n ]\n }`}\n >\n {t('arrival', translationSettings)}\n <input\n id={`${htmlId}-modal-arrival`}\n name=\"departureOrArrival\"\n type=\"radio\"\n value=\"arrival\"\n className={styles['radio-textbutton']}\n onChange={() => {\n onArrivalClick();\n }}\n checked={departureOrArrivalCurrent === 'arrival'}\n />\n </label>\n </div>\n <div className={styles['input-row']}>\n <MobileDatepicker\n value={displayTimestamp}\n getDisplay={getDateDisplay}\n onChange={changeTimestamp}\n itemCount={dateSelectItemCount}\n startTime={dateSelectStartTime}\n id={`${htmlId}-date`}\n label={t('date', translationSettings)}\n icon={\n <span\n className={`${styles['combobox-icon']} ${styles['date-input-icon']}`}\n >\n <Icon img=\"calendar\" color={color} />\n </span>\n }\n timeZone={timeZone}\n />\n <MobileTimepicker\n value={displayTimestamp}\n getDisplay={getTimeDisplay}\n onChange={changeTimestamp}\n id={`${htmlId}-time`}\n label={t('time', translationSettings)}\n icon={\n <span\n className={`${styles['combobox-icon']} ${styles['time-input-icon']}`}\n >\n <Icon img=\"time\" color={color} />\n </span>\n }\n timeZone={timeZone}\n />\n </div>\n <div className={styles['buttons-row']}>\n <button\n type=\"button\"\n className={styles['ready-button']}\n onClick={() =>\n onSubmit(displayTimestamp, departureOrArrivalCurrent)\n }\n >\n {t('ready', translationSettings)}\n </button>\n <button\n type=\"button\"\n className={styles['cancel-button']}\n onClick={onCancel}\n >\n {t('cancel', translationSettings)}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n\nMobilePickerModal.propTypes = {\n timeZone: PropTypes.string,\n departureOrArrival: PropTypes.oneOf(['departure', 'arrival']).isRequired,\n onNowClick: PropTypes.func.isRequired,\n lang: PropTypes.string.isRequired,\n color: PropTypes.string,\n onSubmit: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n onAfterClose: PropTypes.func.isRequired,\n timestamp: PropTypes.number.isRequired,\n getTimeDisplay: PropTypes.func.isRequired,\n dateSelectItemCount: PropTypes.number.isRequired,\n getDateDisplay: PropTypes.func.isRequired,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number.isRequired,\n }).isRequired,\n};\n\nMobilePickerModal.defaultProps = {\n color: '#007ac9',\n timeZone: 'Europe/Helsinki',\n};\n\nexport default MobilePickerModal;\n","import PropTypes from 'prop-types';\nimport React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { DateTime, Settings } from 'luxon';\nimport uniqueId from 'lodash/uniqueId';\nimport { useTranslation } from 'react-i18next';\nimport Icon from '@digitransit-component/digitransit-component-icon';\nimport DesktopDatetimepicker from './DesktopDatetimepicker';\nimport styles from './styles.scss';\nimport { isMobile } from './mobileDetection';\nimport dateTimeInputIsSupported from './dateTimeInputIsSupported';\nimport MobilePickerModal from './MobilePickerModal';\n\nSettings.defaultLocale = 'en';\n\n/**\n * This component renders combobox style inputs for selecting date and time. This is a controlled component, timestamp is the current value of both inputs.\n * @param {Object} props\n *\n * @param {Number} props.timestamp Currently selected time as a unix timestamp in milliseconds. Set to null to signify that \"now\" is selected. Displayed time is updated in realtime when set to null\n * @param {function} props.onTimeChange Called with new timestamp when time input changes\n * @param {function} props.onDateChange Called with new timestamp when date input changes\n * @param {'arrival'|'departure'} props.departureOrArrival Determine if input is set to choose departure or arrival time\n * @param {function} props.onNowClick Called when \"depart now\" button is clicked\n * @param {function} props.onDepartureClick Called when \"departure\" button is clicked\n * @param {function} props.onArrivalClick Called when \"arrival\" button is clicked\n * @param {node} props.embedWhenClosed JSX element to render in the corner when input is closed\n * @param {node} props.embedWhenOpen JSX element to render when input is open\n * @param {string} props.lang Language selection\n * @param {number} props.serviceTimeRange Determine number of days shown in timepicker. Optional. default is 30.\n * @param {function} props.onOpen Determine what to do when timepicker is open. Optional. no default implementation.\n * @param {function} props.onClose Determine what to do when timepicker is closed. Optional. no default implementation.\n * @param {function} props.openPicker Determine if timepicker should be open in intial render. Optional. Default is undefined.\n *\n *\n * @example\n * <Datetimepicker\n * timestamp={1590133823000}\n * onTimeChange={(newTimestamp) => update(newTimestamp)}\n * onDateChange={(newTimestamp) => update(newTimestamp)}\n * departureOrArrival={'departure'}\n * onNowClick={() => setTimestampToNull()}\n * onDepartureClick={() => departureClicked()}\n * onArrivalClick={() => arrivalClicked()}\n * embedWhenClosed={<button />}\n * lang={'en'}\n * serviceTimeRange={15}\n * />\n */\nfunction Datetimepicker({\n timestamp,\n onTimeChange,\n onDateChange,\n departureOrArrival,\n onNowClick,\n onDepartureClick,\n onArrivalClick,\n embedWhenClosed,\n embedWhenOpen,\n lang,\n color,\n timeZone,\n onModalSubmit,\n fontWeights,\n serviceTimeRange,\n onOpen,\n onClose,\n openPicker,\n}) {\n Settings.defaultZone = timeZone;\n const [t] = useTranslation();\n const [isOpen, changeOpen] = useState(openPicker || false);\n const [displayTimestamp, changeDisplayTimestamp] = useState(\n timestamp || DateTime.now().toMillis(),\n );\n // timer for updating displayTimestamp in real time\n const [timerId, setTimer] = useState(null);\n // for input labels\n const [htmlId] = useState(uniqueId('datetimepicker-'));\n const [useMobileInputs] = useState(isMobile() && dateTimeInputIsSupported());\n const openPickerRef = useRef();\n const inputRef = useRef();\n const alertRef = useRef();\n\n const translationSettings = { lng: lang };\n\n useEffect(() => {\n Settings.defaultLocale = lang;\n }, [lang]);\n\n const nowSelected = timestamp === null;\n useEffect(() => {\n if (nowSelected) {\n changeDisplayTimestamp(DateTime.now().toMillis());\n } else {\n // clear timer\n if (timerId) {\n clearInterval(timerId);\n setTimer(null);\n }\n changeDisplayTimestamp(timestamp);\n }\n }, [timestamp]);\n\n // set timer to update displayTimestamp when minute changes if nowSelected\n useEffect(() => {\n if (!nowSelected) {\n return undefined;\n }\n if (timerId) {\n clearInterval(timerId);\n }\n const newId = setInterval(() => {\n const now = DateTime.now();\n const sameMinute = DateTime.fromMillis(displayTimestamp).hasSame(\n now,\n 'minute',\n );\n if (!sameMinute) {\n clearInterval(newId);\n setTimer(null);\n changeDisplayTimestamp(now.toMillis());\n }\n }, 5000);\n setTimer(newId);\n return () => clearInterval(newId);\n }, [displayTimestamp]);\n\n /**\n * @param {number} date Date in milliseconds since unix epoch\n * @returns {string} formatted date\n */\n const getDateDisplay = date => {\n const time = DateTime.fromMillis(date);\n const now = DateTime.now();\n let formatted;\n if (time.hasSame(now, 'day')) {\n formatted = t('today', translationSettings);\n formatted = `${formatted.charAt(0).toUpperCase()}${formatted.slice(1)}`;\n } else if (time.hasSame(now.plus({ days: 1 }), 'day')) {\n formatted = t('tomorrow', translationSettings);\n formatted = `${formatted.charAt(0).toUpperCase()}${formatted.slice(1)}`;\n } else {\n formatted = time.toFormat('ccc d.L.');\n }\n return formatted;\n };\n\n // param time is timestamp\n const getTimeDisplay = time => {\n return DateTime.fromMillis(time).toFormat('HH:mm');\n };\n\n // compute choices only when timestamp changes instead of every render\n const [timeChoices, dateChoices] = useMemo(() => {\n const selectedMoment = DateTime.fromMillis(\n timestamp || DateTime.now().toMillis(),\n );\n const timeSelectStartTime = selectedMoment.startOf('day').toMillis();\n const isMobileCurrently = isMobile();\n let newTimeChoices = [];\n let current = selectedMoment.startOf('day');\n while (current.hasSame(timeSelectStartTime, 'day')) {\n newTimeChoices.push(current.valueOf());\n if (isMobileCurrently) {\n current = current.plus({ minutes: 15 });\n } else {\n current = current.plus({ minutes: 1 });\n }\n }\n if (timestamp === null) {\n // if time is set to now\n // add times in 5 min intervals for next 30 mins\n const fiveMinutes = 1000 * 60 * 5;\n const nextFiveMin =\n Math.ceil(displayTimestamp / fiveMinutes) * fiveMinutes;\n const timesToAdd = Array(7)\n .fill()\n .map((_, i) => nextFiveMin + i * fiveMinutes);\n const closestIndexAfter = newTimeChoices\n .map(time => displayTimestamp - time)\n .findIndex(time => time <= 0);\n newTimeChoices.splice(closestIndexAfter, 0, ...timesToAdd);\n newTimeChoices = Array.from(new Set(newTimeChoices)); // remove duplicates\n }\n const dateSelectStartTime = DateTime.now().startOf('day').set({\n hour: selectedMoment.hour,\n minute: selectedMoment.minute,\n });\n const newDateChoices = Array(serviceTimeRange)\n .fill()\n .map((_, i) => dateSelectStartTime.plus({ days: i }).toMillis());\n return [newTimeChoices, newDateChoices];\n }, [timestamp]);\n\n function showScreenreaderCloseAlert() {\n if (alertRef.current) {\n alertRef.current.innerHTML = t('accessible-closed', translationSettings);\n setTimeout(() => {\n // The component may have unmounted (clearing the ref) before this\n // fires - don't crash in that case.\n if (alertRef.current) {\n alertRef.current.innerHTML = null;\n }\n }, 100);\n }\n }\n\n function showScreenreaderOpenAlert() {\n if (alertRef.current) {\n alertRef.current.innerHTML = t('accessible-opened', translationSettings);\n setTimeout(() => {\n // The component may have unmounted (clearing the ref) before this\n // fires - don't crash in that case.\n if (alertRef.current) {\n alertRef.current.innerHTML = null;\n }\n }, 100);\n }\n }\n\n const handleClose = () => {\n changeOpen(false);\n showScreenreaderCloseAlert();\n if (onClose) {\n onClose();\n }\n };\n\n const handleNowClick = () => {\n handleClose();\n onNowClick();\n };\n\n function renderOpen() {\n if (useMobileInputs) {\n return (\n isOpen && (\n <MobilePickerModal\n departureOrArrival={departureOrArrival}\n onNowClick={handleNowClick}\n lang={lang}\n color={color}\n onSubmit={(newTimestamp, newDepartureOrArrival) => {\n onModalSubmit(newTimestamp, newDepartureOrArrival);\n changeOpen(false);\n showScreenreaderCloseAlert();\n }}\n onCancel={handleClose}\n onAfterClose={() =>\n requestAnimationFrame(() => {\n openPickerRef.current?.focus();\n })\n }\n getTimeDisplay={getTimeDisplay}\n timeZone={timeZone}\n timestamp={displayTimestamp}\n getDateDisplay={getDateDisplay}\n dateSelectItemCount={serviceTimeRange}\n getDisplay={getTimeDisplay}\n fontWeights={fontWeights}\n />\n )\n );\n }\n return (\n <>\n <div\n className={`${styles['datetimepicker-open-container']} ${\n !isOpen ? styles.hidden : ''\n }`}\n >\n <div\n className={\n isOpen\n ? `${styles['top-row-container']} datetimepicker-top-row`\n : `${styles.hidden} datetimepicker-top-row`\n }\n >\n {' '}\n <span role=\"alert\" className={styles['sr-only']} ref={alertRef} />\n <span />\n {/* This empty span prevents a weird focus bug on chrome */}\n <span className={styles['departure-or-arrival-container']}>\n <label\n htmlFor={`${htmlId}-departure`}\n className={`${styles['radio-textbutton-label']}\n ${\n styles[\n departureOrArrival === 'departure' ? 'active' : undefined\n ]\n }`}\n >\n {t('departure', translationSettings)}\n <input\n id={`${htmlId}-departure`}\n name=\"departureOrArrival\"\n type=\"radio\"\n value=\"departure\"\n className={styles['radio-textbutton']}\n onChange={() => {\n onDepartureClick();\n }}\n checked={departureOrArrival === 'departure'}\n />\n </label>\n <label\n htmlFor={`${htmlId}-arrival`}\n className={`${styles['radio-textbutton-label']}\n ${\n styles[\n departureOrArrival === 'arrival' ? 'active' : undefined\n ]\n }`}\n >\n {t('arrival', translationSettings)}\n <input\n id={`${htmlId}-arrival`}\n name=\"departureOrArrival\"\n type=\"radio\"\n value=\"arrival\"\n className={styles['radio-textbutton']}\n onChange={() => {\n onArrivalClick();\n }}\n checked={departureOrArrival === 'arrival'}\n />\n </label>\n </span>\n <button\n id={`${htmlId}-now`}\n type=\"button\"\n className={styles['departure-now-button']}\n onClick={handleNowClick}\n ref={inputRef}\n >\n {t('departure-now', translationSettings)}\n </button>\n <span className={styles['right-edge']}>\n <button\n type=\"button\"\n className={styles['close-button']}\n aria-controls={`${htmlId}-root`}\n aria-expanded=\"true\"\n onClick={handleClose}\n >\n <span className={styles['close-icon']}>\n <Icon img=\"close\" color={color} />\n </span>\n <span className={styles['sr-only']}>\n {t('accessible-close', translationSettings)}\n </span>\n </button>\n </span>\n </div>\n <div\n className={\n isOpen\n ? `${styles['picker-container']}`\n : `${styles.hidden} datetimepicker-top-row`\n }\n >\n <span className={styles['combobox-left']}>\n <DesktopDatetimepicker\n value={displayTimestamp}\n onChange={newValue => {\n onDateChange(newValue);\n }}\n getDisplay={getDateDisplay}\n timeChoices={dateChoices}\n validate={() => null}\n icon={\n <span\n className={`${styles['combobox-icon']} ${styles['date-input-icon']}`}\n >\n <Icon img=\"calendar\" color={color} />\n </span>\n }\n id={`${htmlId}-date`}\n label={t('date', translationSettings)}\n disableTyping\n timeZone={timeZone}\n datePicker\n />\n </span>\n <span className={styles['combobox-right']}>\n <DesktopDatetimepicker\n value={displayTimestamp}\n onChange={newValue => {\n onTimeChange(newValue);\n }}\n getDisplay={getTimeDisplay}\n timeChoices={timeChoices}\n icon={\n <span\n className={`${styles['combobox-icon']} ${styles['time-input-icon']}`}\n >\n <Icon img=\"time\" color={color} />\n </span>\n }\n id={`${htmlId}-time`}\n label={t('time', translationSettings)}\n timeZone={timeZone}\n translationSettings={translationSettings}\n />\n </span>\n </div>\n </div>\n <span className={isOpen ? '' : styles.hidden}>{embedWhenOpen}</span>\n </>\n );\n }\n\n const formatToprowSummary = () => {\n if (nowSelected && departureOrArrival === 'departure') {\n return <span>{t('departure-now', translationSettings)}</span>;\n }\n const dateDisplay = getDateDisplay(displayTimestamp);\n const timeDisplay = getTimeDisplay(displayTimestamp);\n const summary = t(\n departureOrArrival === 'departure' ? 'departure' : 'arrival',\n translationSettings,\n );\n const isToday = DateTime.now().hasSame(\n DateTime.fromMillis(displayTimestamp),\n 'day',\n );\n const isTomorrow = DateTime.now()\n .plus({ days: 1 })\n .hasSame(DateTime.fromMillis(displayTimestamp), 'day');\n if (isToday) {\n return <span>{`${summary} ${timeDisplay}`}</span>;\n }\n if (isTomorrow) {\n return (\n <span>{`${summary} ${dateDisplay.toLowerCase()} ${timeDisplay}`}</span>\n );\n }\n return <span>{`${summary} ${dateDisplay} ${timeDisplay}`}</span>;\n };\n\n return (\n <fieldset\n className={styles['dt-datetimepicker']}\n id={`${htmlId}-root`}\n style={{\n '--color': `${color}`,\n '--font-weight-medium': fontWeights.medium,\n }}\n >\n <legend className={styles['sr-only']}>\n {t('accessible-title', translationSettings)}\n </legend>\n <span className={styles['sr-only']}>\n {t('accessible-update-instructions', translationSettings)}\n </span>\n <div\n className={\n !isOpen\n ? `${styles['top-row-container']} ${styles.closed} datetimepicker-top-row`\n : `${styles.hidden} datetimepicker-top-row`\n }\n >\n <label className={styles['label-open']} htmlFor={`${htmlId}-open`}>\n <span className={styles['time-icon']}>\n <Icon img=\"time\" color={color} />\n </span>\n <span className={styles['sr-only']}>\n {t('accessible-open', translationSettings)}\n </span>\n <span role=\"alert\" className={styles['sr-only']} ref={alertRef} />\n <button\n id={`${htmlId}-open`}\n type=\"button\"\n className={`${styles.textbutton} ${styles.active} ${styles['open-button']}`}\n aria-controls={`${htmlId}-root`}\n aria-expanded=\"false\"\n onClick={() => {\n changeOpen(true);\n showScreenreaderOpenAlert();\n if (onOpen) {\n onOpen();\n }\n }}\n ref={openPickerRef}\n >\n {formatToprowSummary()}\n <span className={styles['dropdown-icon']}>\n <Icon img=\"arrow-dropdown\" color={color} />\n </span>\n </button>\n </label>\n <span className={styles['right-edge']}>{embedWhenClosed}</span>\n </div>\n <div />\n {renderOpen()}\n </fieldset>\n );\n}\n\nDatetimepicker.propTypes = {\n timestamp: PropTypes.number,\n timeZone: PropTypes.string,\n onTimeChange: PropTypes.func.isRequired,\n onDateChange: PropTypes.func.isRequired,\n departureOrArrival: PropTypes.oneOf(['departure', 'arrival']).isRequired,\n onNowClick: PropTypes.func.isRequired,\n onDepartureClick: PropTypes.func.isRequired,\n onArrivalClick: PropTypes.func.isRequired,\n embedWhenClosed: PropTypes.node,\n embedWhenOpen: PropTypes.node,\n lang: PropTypes.string.isRequired,\n color: PropTypes.string,\n onModalSubmit: PropTypes.func.isRequired,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number.isRequired,\n }).isRequired,\n serviceTimeRange: PropTypes.number.isRequired,\n onOpen: PropTypes.func,\n onClose: PropTypes.func,\n openPicker: PropTypes.bool,\n};\n\nDatetimepicker.defaultProps = {\n timestamp: null,\n embedWhenClosed: null,\n embedWhenOpen: null,\n color: '#007ac9',\n timeZone: 'Europe/Helsinki',\n onOpen: null,\n onClose: null,\n openPicker: undefined,\n};\n\nexport default Datetimepicker;\n","/**\n * Detect if input type=\"date\" and type=\"time\" are supported in by the browser\n *\n * @return {boolean}\n */\nfunction dateTimeInputIsSupported() {\n if (typeof window === 'undefined' || window === null) {\n return false;\n }\n const elem = document.createElement('input');\n elem.type = 'date';\n if (elem.type !== 'date') {\n return false;\n }\n elem.type = 'time';\n if (elem.type !== 'time') {\n return false;\n }\n return true;\n}\n\nexport default dateTimeInputIsSupported;\n","/* eslint sort-keys: \"error\" */\nconst translations = {\n de: {\n translation: {\n 'accessible-close': 'Schließe die Auswahl',\n 'accessible-closed': 'Auswahl geschlossen',\n 'accessible-open': 'Öffne die Auswahl',\n 'accessible-opened': 'Auswahl geöffnet',\n 'accessible-title': 'Datum und Uhrzeitauswahl',\n arrival: 'Ankunft',\n cancel: 'Abbrechen',\n 'choose-time': 'Zeit wählen',\n date: 'Datum',\n departure: 'Abfahrt',\n 'departure-now': 'Abfahrt jetzt',\n ready: 'Fertig',\n time: 'Zeit',\n today: 'Heute',\n tomorrow: 'Morgen',\n },\n },\n en: {\n translation: {\n 'accessible-close': 'Close the picker',\n 'accessible-closed': 'Timepicker closed',\n 'accessible-open': 'Open the picker',\n 'accessible-opened': 'Timepicker opened',\n 'accessible-title': 'Date and timepicker',\n 'accessible-update-instructions':\n 'Changing time parameters will trigger a new search.',\n arrival: 'Arrival',\n cancel: 'Cancel',\n 'choose-time': 'Choose time',\n date: 'Date',\n departure: 'Departure',\n 'departure-now': 'Leaving now',\n 'invalid-input': 'The time you entered is invalid',\n ready: 'Ready',\n time: 'Time',\n today: 'Today',\n tomorrow: 'Tomorrow',\n },\n },\n fi: {\n translation: {\n 'accessible-close': 'Sulje valitsin',\n 'accessible-closed': 'Valitsin suljettu',\n 'accessible-open': 'Avaa valitsin',\n 'accessible-opened': 'Valitsin avattu',\n 'accessible-title': 'Aika- ja päivämäärävalitsin',\n 'accessible-update-instructions':\n 'Aikavalintojen muuttaminen laukaisee uuden haun.',\n arrival: 'Perillä',\n cancel: 'Peruuta',\n 'choose-time': 'Valitse aika',\n date: 'Päivä',\n departure: 'Lähtöaika',\n 'departure-now': 'Lähtö nyt',\n 'invalid-input': 'Syöttämäsi aika on virheellinen',\n ready: 'Valmis',\n time: 'Aika',\n today: 'Tänään',\n tomorrow: 'Huomenna',\n },\n },\n pl: {\n translation: {\n 'accessible-close': 'Zamknij wybornik',\n 'accessible-closed': 'Zamknięto wybornik',\n 'accessible-open': 'Otwórz wybornik',\n 'accessible-opened': 'Otwarto wybornik',\n 'accessible-title': 'Wybór daty i godziny',\n 'accessible-update-instructions':\n 'Zmiana wybranej godziny wywoła nowe wyszukiwanie.',\n arrival: 'Przyjazd',\n cancel: 'Anuluj',\n 'choose-time': 'Wybierz godzinę',\n date: 'Data',\n departure: 'Wyjazd',\n 'departure-now': 'Wyjeżdżam teraz',\n 'invalid-input': 'Wprowadzona godzina jest nieprawidłowa',\n ready: 'Gotowe',\n time: 'Godzina',\n today: 'Dziś',\n tomorrow: 'Jutro',\n },\n },\n sv: {\n translation: {\n 'accessible-close': 'Stäng väljaren',\n 'accessible-closed': 'Väljaren stängde',\n 'accessible-open': 'Öppna väljaren',\n 'accessible-opened': 'Väljaren öppnade',\n 'accessible-title': 'Tid- och datumväljaren',\n 'accessible-update-instructions':\n 'Om du ändrar tiderna, startas en ny sökning automatiskt.',\n arrival: 'Anländer',\n cancel: 'Avbryt',\n 'choose-time': 'Välj tid',\n date: 'Datum',\n departure: 'Avgångstid',\n 'departure-now': 'Avgår nu',\n 'invalid-input': 'Tiden du angav är felaktig',\n ready: 'Färdig',\n time: 'Tid',\n today: 'I dag',\n tomorrow: 'I morgon',\n },\n },\n};\n\nexport default translations;\n","import { createInstance } from 'i18next';\nimport translations from './translations';\n\nconst i18n = createInstance({\n fallbackLng: 'fi',\n // debug: true,\n resources: translations,\n defaultNS: 'translation',\n react: {\n useSuspense: true,\n },\n});\n\ni18n.init();\n\nexport default i18n;\n","import PropTypes from 'prop-types';\nimport React, { useState, useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport { Settings, DateTime } from 'luxon';\nimport debounce from 'lodash/debounce';\nimport Datetimepicker from './helpers/Datetimepicker';\nimport i18n from './helpers/i18n';\n\n/**\n * This component renders an input to choose a date and time. Renders separate input fields for date and time selection. Values for timestamp and arriveBy correspond to Digitransit query params time and arriveBy. This component will display a native date input on mobile and a custom one for desktop. Mobile detection is done by parsing user agent.\n *\n * @alias Datetimepicker\n *\n * @param {Object} props\n *\n * @param {boolean} props.realtime Determine if selected time should be updated in realtime when 'now' is selected.\n * @param {Number} props.initialTimestamp Initial value for selected time. Unix timestamp in seconds. Updating this will change timepicker value but the correct value is kept in component state even if this is not updated.\n * @param {boolean} props.initialArriveBy Initial value for arriveBy. Determines if picker is in arrival mode (true) or departure mode (false). Correct value is kept in component state even if this is not updated. Changing this will also trigger change in the component.\n * @param {function} props.onTimeChange Called with (time, arriveBy) when time input changes. time is number timestamp in seconds, arriveBy is boolean\n * @param {function} props.onDateChange Called with (time, arriveBy) when date input changes. time is number timestamp in seconds, arriveBy is boolean\n * @param {function} props.onNowClick Called when \"depart now\" button is clicked. time is current input value in seconds\n * @param {function} props.onDepartureClick Called with (time) when \"departure\" button is clicked. time is current input value in seconds\n * @param {function} props.onArrivalClick Called with (time) when \"arrival\" button is clicked. time is current input value in seconds\n * @param {node} props.embedWhenClosed JSX element to render in the corner when input is closed\n * @param {node} props.embedWhenOpen JSX element to render when input is open\n * @param {string} props.lang Language selection. Default 'en'\n * @param {number} props.serviceTimeRange Determine number of days shown in timepicker. Optional. default is 30.\n * @param {function} props.onOpen Determine what to do when timepicker is open. Optional. no default implementation.\n * @param {function} props.onClose Determine what to do when timepicker is closed. Optional. no default implementation.\n * @param {function} props.openPicker Determine if timepicker should be open in intial render. Optional. Default is undefined.\n * @example\n * <Datetimepicker\n * realtime={true}\n * initialTimestamp={1590133823}\n * initialArriveBy={false}\n * onTimeChange={(time, arriveBy) => changeUrl(time, arriveBy)}\n * onDateChange={(time, arriveBy) => changeUrl(time, arriveBy)}\n * onNowClick={(time) => changeUrl(undefined, undefined)}\n * onDepartureClick={(time) => changeUrl(time, 'true')}\n * onArrivalClick={(time) => changeUrl(time, undefined)}\n * embedWhenClosed={<button />}\n * lang={'en'}\n * serviceTimeRange={15}\n * />\n */\nfunction DatetimepickerStateContainer({\n realtime,\n initialArriveBy,\n initialTimestamp,\n onDepartureClick,\n onArrivalClick,\n onTimeChange,\n onDateChange,\n onNowClick,\n embedWhenClosed,\n embedWhenOpen,\n lang,\n color,\n timeZone,\n fontWeights,\n serviceTimeRange,\n onOpen,\n onClose,\n openPicker,\n}) {\n Settings.defaultLocale = lang;\n Settings.defaultZone = timeZone;\n const initialNow = realtime ? null : DateTime.now().toMillis();\n const [timestamp, changeTimestampState] = useState(\n initialTimestamp ? initialTimestamp * 1000 : initialNow,\n );\n const [departureOrArrival, changeDepartureOrArrival] = useState(\n initialArriveBy === true ? 'arrival' : 'departure',\n );\n\n // update state if props change\n useEffect(() => {\n const bothNull = timestamp === null && initialTimestamp === undefined;\n const oneNull = timestamp === null || initialTimestamp === undefined;\n const sameTime = Math.round(timestamp / 1000) === initialTimestamp;\n const timestampChanged = !bothNull && (oneNull || !sameTime);\n if (timestampChanged) {\n if (initialTimestamp === undefined) {\n changeTimestampState(null);\n } else {\n changeTimestampState(initialTimestamp * 1000);\n }\n }\n if (!initialArriveBy === (departureOrArrival === 'arrival')) {\n changeDepartureOrArrival(\n initialArriveBy === true ? 'arrival' : 'departure',\n );\n }\n }, [initialTimestamp, initialArriveBy]);\n\n const timeChanged = debounce(newTime => {\n if (newTime === null) {\n changeTimestampState(DateTime.now().toMillis());\n onTimeChange(\n DateTime.now().toUnixInteger(),\n departureOrArrival === 'arrival',\n );\n return;\n }\n changeTimestampState(newTime);\n onTimeChange(Math.round(newTime / 1000), departureOrArrival === 'arrival');\n }, 10);\n\n const dateChanged = debounce(newDate => {\n if (newDate === null) {\n changeTimestampState(DateTime.now().toMillis());\n onDateChange(\n DateTime.now().toUnixInteger(),\n departureOrArrival === 'arrival',\n );\n return;\n }\n changeTimestampState(newDate);\n onDateChange(Math.round(newDate / 1000), departureOrArrival === 'arrival');\n }, 10);\n\n const nowClicked = () => {\n changeDepartureOrArrival('departure');\n const newTimestamp = realtime ? null : DateTime.now().toMillis();\n changeTimestampState(newTimestamp);\n onNowClick(Math.round(newTimestamp / 1000));\n };\n\n const departureClicked = () => {\n let changed = false;\n let newTime = timestamp;\n if (timestamp === null) {\n const now = DateTime.now().toMillis();\n changeTimestampState(now);\n newTime = now;\n changed = true;\n }\n if (departureOrArrival !== 'departure') {\n changeDepartureOrArrival('departure');\n changed = true;\n }\n if (changed) {\n onDepartureClick(Math.round(newTime / 1000));\n }\n };\n\n const arrivalClicked = () => {\n let changed = false;\n let newTime = timestamp;\n if (timestamp === null) {\n const now = DateTime.now().toMillis();\n changeTimestampState(now);\n newTime = now;\n changed = true;\n }\n if (departureOrArrival !== 'arrival') {\n changeDepartureOrArrival('arrival');\n changed = true;\n }\n if (changed) {\n onArrivalClick(Math.round(newTime / 1000));\n }\n };\n const onModalSubmit = (time, mode) => {\n changeTimestampState(time);\n changeDepartureOrArrival(mode);\n onTimeChange(Math.round(time / 1000), mode === 'arrival', true);\n };\n\n return (\n <I18nextProvider i18n={i18n}>\n <Datetimepicker\n timestamp={timestamp}\n onTimeChange={timeChanged}\n onDateChange={dateChanged}\n departureOrArrival={departureOrArrival}\n onNowClick={nowClicked}\n onDepartureClick={departureClicked}\n onArrivalClick={arrivalClicked}\n embedWhenClosed={embedWhenClosed}\n embedWhenOpen={embedWhenOpen}\n lang={lang}\n color={color}\n timeZone={timeZone}\n onModalSubmit={onModalSubmit}\n fontWeights={fontWeights}\n serviceTimeRange={serviceTimeRange}\n onOpen={onOpen}\n onClose={onClose}\n openPicker={openPicker}\n />\n </I18nextProvider>\n );\n}\n\nDatetimepickerStateContainer.propTypes = {\n realtime: PropTypes.bool,\n initialTimestamp: PropTypes.number,\n initialArriveBy: PropTypes.bool,\n onDepartureClick: PropTypes.func.isRequired,\n onArrivalClick: PropTypes.func.isRequired,\n onTimeChange: PropTypes.func.isRequired,\n onDateChange: PropTypes.func.isRequired,\n onNowClick: PropTypes.func.isRequired,\n embedWhenClosed: PropTypes.node,\n embedWhenOpen: PropTypes.node,\n lang: PropTypes.string,\n color: PropTypes.string,\n timeZone: PropTypes.string,\n fontWeights: PropTypes.shape({\n medium: PropTypes.number,\n }),\n serviceTimeRange: PropTypes.number,\n onOpen: PropTypes.func,\n onClose: PropTypes.func,\n openPicker: PropTypes.bool,\n};\n\nDatetimepickerStateContainer.defaultProps = {\n realtime: false,\n initialArriveBy: undefined,\n initialTimestamp: undefined,\n embedWhenClosed: null,\n embedWhenOpen: null,\n lang: 'en',\n color: '#007ac9',\n timeZone: 'Europe/Helsinki',\n fontWeights: {\n medium: 500,\n },\n onOpen: null,\n onClose: null,\n openPicker: undefined,\n serviceTimeRange: 30,\n};\n\nexport default DatetimepickerStateContainer;\n"],"names":["parseTypedTime","typedValue","actualValue","length","split","every","n","Number","isInteger","slice","validateClock","hours","minutes","hoursValid","isNaN","minutesValid","validateInput","inputValue","includes","startsWith","values","concat","substring","getTs","currentTimestamp","trimmed","trim","match","splitter","DateTime","fromMillis","set","hour","minute","second","millisecond","valueOf","DesktopDatetimepicker","value","onChange","getDisplay","timeChoices","id","label","icon","disableTyping","timeZone","datePicker","translationSettings","Settings","defaultZone","t","useTranslation","displayValue","changeDisplayValue","useState","typing","setTyping","showAllOptions","setShowAllOptions","invalidInput","setinvalidInput","useEffect","handleTimestamp","newValue","asNumber","e","options","map","time","toString","closestOptions","filter","o","closestOption","reduce","a","b","Math","abs","undefined","inputId","labelId","ariaError","React","createElement","className","styles","htmlFor","Select","ariaLiveMessages","guidance","context","isDisabled","onFilter","onFocus","itemLabel","currentTime","toFormat","ts","components","IndicatorsContainer","cx","classNamePrefix","onInputChange","action","str","valid","test","isinvalidInput","validated","noOptionsMessage","filterOption","option","input","completeInput","isMod15","minuteInput","inputH","inputM","optH","optM","total","filterOptions","isValidHour","comp","controlShouldRenderValue","tabSelectsValue","placeholder","target","select","onBlur","onKeyDown","key","isSearchable","isMobile","userAgent","navigator","vendor","window","opera","css","ref","insertAt","document","head","getElementsByTagName","style","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","process","env","NODE_ENV","propTypes","PropTypes","number","isRequired","func","arrayOf","string","node","bool","shape","lng","defaultProps","AndroidSelect","dateChoices","items","date","selectedItem","find","isOpen","getToggleButtonProps","getMenuProps","getItemProps","highlightedIndex","useSelect","itemToString","item","onSelectedItemChange","nextSelectedItem","container","suggestionsContainerOpen","index","Object","assign","suggestion","suggestionHighlighted","MobileDatepicker","itemCount","startTime","Array","fill","_","i","plus","days","toMillis","nativeInput","toLowerCase","indexOf","MobileTimepicker","changeInputValue","isValidInput","setValidInput","showError","inputMode","maxLength","setSelectionRange","event","replace","charAt","actual","timestamp","MobilePickerModal","departureOrArrival","onNowClick","lang","color","onSubmit","onCancel","getTimeDisplay","dateSelectItemCount","getDateDisplay","fontWeights","onAfterClose","displayTimestamp","changeTimestamp","departureOrArrivalCurrent","changeDepartureOrArrival","htmlId","uniqueId","dateSelectStartTime","now","startOf","Modal","appElement","querySelector","overlayClassName","medium","onClick","name","checked","Icon","img","Datetimepicker","onTimeChange","onDateChange","onDepartureClick","onArrivalClick","embedWhenClosed","embedWhenOpen","onModalSubmit","serviceTimeRange","onOpen","onClose","openPicker","changeOpen","changeDisplayTimestamp","timerId","setTimer","useMobileInputs","elem","dateTimeInputIsSupported","openPickerRef","useRef","inputRef","alertRef","defaultLocale","nowSelected","clearInterval","newId","setInterval","hasSame","formatted","toUpperCase","useMemo","selectedMoment","timeSelectStartTime","isMobileCurrently","newTimeChoices","current","push","fiveMinutes","nextFiveMin","ceil","timesToAdd","closestIndexAfter","findIndex","splice","from","Set","showScreenreaderCloseAlert","innerHTML","setTimeout","handleClose","handleNowClick","hidden","closed","role","textbutton","active","formatToprowSummary","dateDisplay","timeDisplay","summary","isToday","isTomorrow","newTimestamp","newDepartureOrArrival","requestAnimationFrame","focus","Fragment","validate","oneOf","i18n","createInstance","fallbackLng","resources","de","translation","arrival","cancel","departure","ready","today","tomorrow","en","fi","pl","sv","defaultNS","react","useSuspense","DatetimepickerStateContainer","realtime","initialArriveBy","initialTimestamp","initialNow","changeTimestampState","bothNull","oneNull","sameTime","round","timeChanged","debounce","newTime","toUnixInteger","dateChanged","newDate","I18nextProvider","nowClicked","departureClicked","changed","arrivalClicked","mode","init"],"mappings":"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","x_google_ignoreList":[3]}
|