@sb1/ffe-datepicker-react 100.12.3 → 101.0.0

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.
Files changed (41) hide show
  1. package/es/button/Button.js +4 -5
  2. package/es/calendar/Calendar.js +88 -111
  3. package/es/calendar/ClickableDate.js +20 -41
  4. package/es/calendar/Header.js +13 -14
  5. package/es/calendar/NonClickableDate.js +1 -2
  6. package/es/datelogic/simplecalendar.js +97 -124
  7. package/es/datelogic/simpledate.js +66 -96
  8. package/es/datepicker/Datepicker.js +2 -25
  9. package/es/datepicker/DatepickerComp.js +61 -64
  10. package/es/datepicker/DatepickerContext.js +33 -36
  11. package/es/datepicker/SpinButton.js +8 -32
  12. package/es/datepicker/padZero.js +2 -2
  13. package/es/datepicker/testHelper.js +72 -143
  14. package/es/datepicker/toNumber.js +4 -6
  15. package/es/i18n/i18n.js +3 -3
  16. package/es/input/DateInput.js +3 -26
  17. package/es/types.js +1 -1
  18. package/es/util/dateRangeUtils.js +12 -12
  19. package/es/util/dateUtil.js +2 -2
  20. package/es/util/isIOSSafari.js +4 -4
  21. package/lib/button/Button.js +8 -9
  22. package/lib/calendar/Calendar.js +94 -116
  23. package/lib/calendar/ClickableDate.js +22 -42
  24. package/lib/calendar/Header.js +17 -18
  25. package/lib/calendar/NonClickableDate.js +2 -3
  26. package/lib/datelogic/simplecalendar.js +99 -125
  27. package/lib/datelogic/simpledate.js +67 -96
  28. package/lib/datepicker/Datepicker.js +5 -28
  29. package/lib/datepicker/DatepickerComp.js +74 -77
  30. package/lib/datepicker/DatepickerContext.js +36 -39
  31. package/lib/datepicker/SpinButton.js +10 -34
  32. package/lib/datepicker/padZero.js +2 -2
  33. package/lib/datepicker/testHelper.js +73 -177
  34. package/lib/datepicker/toNumber.js +4 -6
  35. package/lib/i18n/i18n.js +3 -3
  36. package/lib/input/DateInput.js +7 -30
  37. package/lib/types.js +1 -1
  38. package/lib/util/dateRangeUtils.js +14 -14
  39. package/lib/util/dateUtil.js +3 -3
  40. package/lib/util/isIOSSafari.js +4 -4
  41. package/package.json +13 -14
@@ -1,83 +1,35 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- var __generator = (this && this.__generator) || function (thisArg, body) {
11
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
- function verb(n) { return function (v) { return step([n, v]); }; }
14
- function step(op) {
15
- if (f) throw new TypeError("Generator is already executing.");
16
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
- if (y = 0, t) op = [op[0] & 2, t.value];
19
- switch (op[0]) {
20
- case 0: case 1: t = op; break;
21
- case 4: _.label++; return { value: op[1], done: false };
22
- case 5: _.label++; y = op[1]; op = [0]; continue;
23
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
- default:
25
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
- if (t[2]) _.ops.pop();
30
- _.trys.pop(); continue;
31
- }
32
- op = body.call(thisArg, _);
33
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
1
+ import { act } from 'react';
2
+ async function simulateTyping(element, text, delay = 100) {
3
+ let _text = text;
4
+ if (text.length === 0) {
5
+ _text = '0';
35
6
  }
36
- };
37
- function simulateTyping(element_1, text_1) {
38
- return __awaiter(this, arguments, void 0, function (element, text, delay) {
39
- var act, _text;
40
- if (delay === void 0) { delay = 100; }
41
- return __generator(this, function (_a) {
42
- switch (_a.label) {
43
- case 0: return [4 /*yield*/, import('@testing-library/react')];
44
- case 1:
45
- act = (_a.sent()).act;
46
- _text = text;
47
- if (text.length === 0) {
48
- _text = '0';
49
- }
50
- return [2 /*return*/, new Promise(function (resolve) {
51
- var index = 0;
52
- function typeCharacter() {
53
- if (index < _text.length) {
54
- var char = _text[index];
55
- var eventOptions_1 = {
56
- key: char,
57
- keyCode: char.charCodeAt(0),
58
- which: char.charCodeAt(0),
59
- bubbles: true,
60
- };
61
- act(function () {
62
- element.dispatchEvent(new KeyboardEvent('keydown', eventOptions_1));
63
- });
64
- index++;
65
- setTimeout(typeCharacter, delay);
66
- }
67
- else {
68
- resolve(); // Resolve the promise when done
69
- }
70
- }
71
- typeCharacter();
72
- })];
7
+ return new Promise(resolve => {
8
+ let index = 0;
9
+ function typeCharacter() {
10
+ if (index < _text.length) {
11
+ const char = _text[index];
12
+ const eventOptions = {
13
+ key: char,
14
+ keyCode: char.charCodeAt(0),
15
+ which: char.charCodeAt(0),
16
+ bubbles: true,
17
+ };
18
+ act(() => {
19
+ element.dispatchEvent(new KeyboardEvent('keydown', eventOptions));
20
+ });
21
+ index++;
22
+ setTimeout(typeCharacter, delay);
73
23
  }
74
- });
24
+ else {
25
+ resolve(); // Resolve the promise when done
26
+ }
27
+ }
28
+ typeCharacter();
75
29
  });
76
30
  }
77
- function leftPad(str, len, ch) {
78
- if (len === void 0) { len = 2; }
79
- if (ch === void 0) { ch = '0'; }
80
- var newStr = str;
31
+ function leftPad(str, len = 2, ch = '0') {
32
+ let newStr = str;
81
33
  while (newStr.length < len) {
82
34
  newStr = ch + newStr;
83
35
  }
@@ -90,71 +42,48 @@ function leftPad(str, len, ch) {
90
42
  * @param index if there are multiple datepicker elements with the same label, you can specify which one you want to get
91
43
  * @returns DatepickerTestHelper
92
44
  */
93
- export function getDatepickerByLabelText(label_1) {
94
- return __awaiter(this, arguments, void 0, function (label, index) {
95
- function getValue(element) {
96
- var _a = Array.from(element.querySelectorAll('[role="spinbutton"]')), dayElement = _a[0], monthElement = _a[1], yearElement = _a[2];
97
- var day = dayElement.getAttribute('aria-valuenow') || '';
98
- var month = monthElement.getAttribute('aria-valuenow') || '';
99
- var year = yearElement.getAttribute('aria-valuenow') || '';
100
- return year !== '' &&
101
- year !== '0' &&
102
- month !== '' &&
103
- month !== '0' &&
104
- day !== '' &&
105
- day !== '0'
106
- ? "".concat(leftPad(day), ".").concat(leftPad(month), ".").concat(year)
107
- : '';
108
- }
109
- function setValue(element, value) {
110
- return __awaiter(this, void 0, void 0, function () {
111
- var act, _a, dayElement, monthElement, yearElement, _b, dayValue, monthValue, yearValue;
112
- return __generator(this, function (_c) {
113
- switch (_c.label) {
114
- case 0: return [4 /*yield*/, import('@testing-library/react')];
115
- case 1:
116
- act = (_c.sent()).act;
117
- _a = Array.from(element.querySelectorAll('[role="spinbutton"]')), dayElement = _a[0], monthElement = _a[1], yearElement = _a[2];
118
- _b = value
119
- ? value.split('.')
120
- : ['0', '0', '0'], dayValue = _b[0], monthValue = _b[1], yearValue = _b[2];
121
- dayValue = dayValue.length === 1 ? "0".concat(dayValue) : dayValue;
122
- monthValue = monthValue.length === 1 ? "0".concat(monthValue) : monthValue;
123
- return [4 /*yield*/, simulateTyping(dayElement, dayValue)];
124
- case 2:
125
- _c.sent();
126
- return [4 /*yield*/, simulateTyping(monthElement, monthValue)];
127
- case 3:
128
- _c.sent();
129
- return [4 /*yield*/, simulateTyping(yearElement, yearValue)];
130
- case 4:
131
- _c.sent();
132
- act(function () { return yearElement.blur(); });
133
- return [2 /*return*/];
134
- }
135
- });
136
- });
137
- }
138
- var screen, elements;
139
- if (index === void 0) { index = 0; }
140
- return __generator(this, function (_a) {
141
- switch (_a.label) {
142
- case 0: return [4 /*yield*/, import('@testing-library/react')];
143
- case 1:
144
- screen = (_a.sent()).screen;
145
- elements = screen
146
- .getAllByText(label)
147
- .map(function (element) {
148
- var _a, _b;
149
- return (_b = (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.querySelector('.ffe-datepicker');
150
- })
151
- .filter(function (element) { return element !== null && element !== undefined; });
152
- return [2 /*return*/, {
153
- element: elements[index],
154
- getValue: function () { return getValue(elements[index]); },
155
- setValue: function (value) { return setValue(elements[index], value); },
156
- }];
157
- }
158
- });
159
- });
45
+ export async function getDatepickerByLabelText(label, index = 0) {
46
+ const elements = Array.from(document.querySelectorAll('*'))
47
+ .filter(el => {
48
+ var _a;
49
+ return el.children.length === 0 &&
50
+ ((_a = el.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === label;
51
+ })
52
+ .map(el => {
53
+ var _a, _b;
54
+ return (_b = (_a = el.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.querySelector('.ffe-datepicker');
55
+ })
56
+ .filter((el) => el !== null && el !== undefined);
57
+ function getValue(element) {
58
+ const [dayElement, monthElement, yearElement] = Array.from(element.querySelectorAll('[role="spinbutton"]'));
59
+ const day = dayElement.getAttribute('aria-valuenow') || '';
60
+ const month = monthElement.getAttribute('aria-valuenow') || '';
61
+ const year = yearElement.getAttribute('aria-valuenow') || '';
62
+ return year !== '' &&
63
+ year !== '0' &&
64
+ month !== '' &&
65
+ month !== '0' &&
66
+ day !== '' &&
67
+ day !== '0'
68
+ ? `${leftPad(day)}.${leftPad(month)}.${year}`
69
+ : '';
70
+ }
71
+ async function setValue(element, value) {
72
+ const [dayElement, monthElement, yearElement] = Array.from(element.querySelectorAll('[role="spinbutton"]'));
73
+ // eslint-disable-next-line prefer-const
74
+ let [dayValue, monthValue, yearValue] = value
75
+ ? value.split('.')
76
+ : ['0', '0', '0'];
77
+ dayValue = dayValue.length === 1 ? `0${dayValue}` : dayValue;
78
+ monthValue = monthValue.length === 1 ? `0${monthValue}` : monthValue;
79
+ await simulateTyping(dayElement, dayValue);
80
+ await simulateTyping(monthElement, monthValue);
81
+ await simulateTyping(yearElement, yearValue);
82
+ act(() => yearElement.blur());
83
+ }
84
+ return {
85
+ element: elements[index],
86
+ getValue: () => getValue(elements[index]),
87
+ setValue: (value) => setValue(elements[index], value),
88
+ };
160
89
  }
@@ -1,8 +1,6 @@
1
- export var toNumber = function (numbers) {
2
- var validNumbers = numbers.filter(function (it) { return typeof it === 'number'; });
1
+ export const toNumber = (numbers) => {
2
+ const validNumbers = numbers.filter(it => typeof it === 'number');
3
3
  return validNumbers
4
- .map(function (it, index) {
5
- return (it !== null && it !== void 0 ? it : 1) * Math.pow(10, validNumbers.length - index - 1);
6
- })
7
- .reduce(function (acc, curr) { return acc + curr; }, 0);
4
+ .map((it, index) => (it !== null && it !== void 0 ? it : 1) * Math.pow(10, validNumbers.length - index - 1))
5
+ .reduce((acc, curr) => acc + curr, 0);
8
6
  };
package/es/i18n/i18n.js CHANGED
@@ -2,7 +2,7 @@ import en from './en';
2
2
  import nn from './nn';
3
3
  import nb from './nb';
4
4
  export default {
5
- nb: nb,
6
- nn: nn,
7
- en: en,
5
+ nb,
6
+ nn,
7
+ en,
8
8
  };
@@ -1,34 +1,11 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __rest = (this && this.__rest) || function (s, e) {
13
- var t = {};
14
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
- t[p] = s[p];
16
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
- t[p[i]] = s[p[i]];
20
- }
21
- return t;
22
- };
23
1
  import React, { useMemo } from 'react';
24
2
  import classNames from 'classnames';
25
3
  import i18n from '../i18n/i18n';
26
4
  import { isIOSSafari } from '../util/isIOSSafari';
27
- export var DateInput = React.forwardRef(function (_a, ref) {
28
- var ariaInvalid = _a.ariaInvalid, value = _a.value, className = _a.className, _b = _a.locale, locale = _b === void 0 ? 'nb' : _b, rest = __rest(_a, ["ariaInvalid", "value", "className", "locale"]);
5
+ export const DateInput = React.forwardRef(({ ariaInvalid, value, className, locale = 'nb', ...rest }, ref) => {
29
6
  // VoiceOver on iOS Safari blocks interaction with date-related inputs.
30
7
  // Using role="textbox" as a workaround on that platform.
31
8
  // https://dev.to/mfranzke/voiceover-bug-on-ios-safari-blocks-date-time-related-inputs-especially-in-react-4f61
32
- var role = useMemo(function () { return (isIOSSafari() ? 'textbox' : undefined); }, []);
33
- return (React.createElement("input", __assign({ type: "date", role: role, "aria-invalid": ariaInvalid, maxLength: 10, ref: ref, "aria-placeholder": i18n[locale].DATE_FORMAT, value: value, className: classNames('ffe-input-field ffe-dateinput__field', className) }, rest)));
9
+ const role = useMemo(() => (isIOSSafari() ? 'textbox' : undefined), []);
10
+ return (React.createElement("input", { type: "date", role: role, "aria-invalid": ariaInvalid, maxLength: 10, ref: ref, "aria-placeholder": i18n[locale].DATE_FORMAT, value: value, className: classNames('ffe-input-field ffe-dateinput__field', className), ...rest }));
34
11
  });
package/es/types.js CHANGED
@@ -1,3 +1,3 @@
1
- export var isMonth = function (thing) {
1
+ export const isMonth = (thing) => {
2
2
  return typeof thing === 'number' && thing >= 1 && thing <= 12;
3
3
  };
@@ -3,10 +3,10 @@ import i18n from '../i18n/i18n';
3
3
  /**
4
4
  * Generates month options for dropdown selection
5
5
  */
6
- export var getMonthOptions = function (locale) {
7
- var months = [];
8
- for (var i = 1; i <= 12; i++) {
9
- var monthKey = "MONTH_".concat(i);
6
+ export const getMonthOptions = (locale) => {
7
+ const months = [];
8
+ for (let i = 1; i <= 12; i++) {
9
+ const monthKey = `MONTH_${i}`;
10
10
  months.push({
11
11
  value: i,
12
12
  label: i18n[locale][monthKey],
@@ -17,27 +17,27 @@ export var getMonthOptions = function (locale) {
17
17
  /**
18
18
  * Generates year options based on min and max dates, or defaults to standard range
19
19
  */
20
- export var getYearOptions = function (minDate, maxDate) {
21
- var currentYear = new Date().getFullYear();
20
+ export const getYearOptions = (minDate, maxDate) => {
21
+ const currentYear = new Date().getFullYear();
22
22
  // Default range: 6 years backward and 2 years forward
23
- var minYear = currentYear - 6;
24
- var maxYear = currentYear + 2;
23
+ let minYear = currentYear - 6;
24
+ let maxYear = currentYear + 2;
25
25
  // Use minDate year if provided
26
26
  if (minDate) {
27
- var minDateObj = getSimpleDateFromString(minDate);
27
+ const minDateObj = getSimpleDateFromString(minDate);
28
28
  if (minDateObj) {
29
29
  minYear = minDateObj.year;
30
30
  }
31
31
  }
32
32
  // Use maxDate year if provided
33
33
  if (maxDate) {
34
- var maxDateObj = getSimpleDateFromString(maxDate);
34
+ const maxDateObj = getSimpleDateFromString(maxDate);
35
35
  if (maxDateObj) {
36
36
  maxYear = maxDateObj.year;
37
37
  }
38
38
  }
39
- var years = [];
40
- for (var i = minYear; i <= maxYear; i++) {
39
+ const years = [];
40
+ for (let i = minYear; i <= maxYear; i++) {
41
41
  years.push({
42
42
  value: i,
43
43
  label: String(i),
@@ -1,5 +1,5 @@
1
1
  import { padZero } from '../datepicker/padZero';
2
- var dateRegex = /^(\d{1,2})(\.| |-|\/)?(\d{0,2})\2?(\d{0,2}(\d{2})?)$/;
2
+ const dateRegex = /^(\d{1,2})(\.| |-|\/)?(\d{0,2})\2?(\d{0,2}(\d{2})?)$/;
3
3
  export function validateDate(date) {
4
4
  return dateRegex.exec(date);
5
5
  }
@@ -8,5 +8,5 @@ export function isDateInputWithTwoDigitYear(value) {
8
8
  return ((_a = validateDate(value)) === null || _a === void 0 ? void 0 : _a[4].length) === 2;
9
9
  }
10
10
  export function getPaddedDateString(day, month, year) {
11
- return "".concat(padZero(day !== null && day !== void 0 ? day : 0), ".").concat(padZero(month !== null && month !== void 0 ? month : 0), ".").concat(year);
11
+ return `${padZero(day !== null && day !== void 0 ? day : 0)}.${padZero(month !== null && month !== void 0 ? month : 0)}.${year}`;
12
12
  }
@@ -8,15 +8,15 @@
8
8
  * be affected by the same bug, but are not detected here since they don't
9
9
  * include "Safari" in the user agent string.
10
10
  */
11
- export var isIOSSafari = function () {
11
+ export const isIOSSafari = () => {
12
12
  if (typeof navigator === 'undefined') {
13
13
  return false;
14
14
  }
15
- var ua = navigator.userAgent;
15
+ const ua = navigator.userAgent;
16
16
  // iPadOS 13+ in desktop mode reports as Macintosh, but can be identified
17
17
  // by having touch points (real Macs have maxTouchPoints === 0).
18
- var isIOS = /iP(ad|hone|od)/.test(ua) ||
18
+ const isIOS = /iP(ad|hone|od)/.test(ua) ||
19
19
  (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1);
20
- var isSafari = !!ua.match(/Safari/) && !ua.match(/CriOS|FxiOS|OPiOS|EdgiOS/);
20
+ const isSafari = !!ua.match(/Safari/) && !ua.match(/CriOS|FxiOS|OPiOS|EdgiOS/);
21
21
  return isIOS && isSafari;
22
22
  };
@@ -4,16 +4,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Button = void 0;
7
- var react_1 = __importDefault(require("react"));
8
- var ffe_icons_react_1 = require("@sb1/ffe-icons-react");
9
- var dateUtil_1 = require("../util/dateUtil");
10
- var i18n_1 = __importDefault(require("../i18n/i18n"));
11
- exports.Button = react_1.default.forwardRef(function (_a, ref) {
12
- var value = _a.value, locale = _a.locale, onClick = _a.onClick;
13
- var buttonLabel = (0, dateUtil_1.validateDate)(value)
14
- ? "".concat(i18n_1.default[locale].CHANGE_DATE, ", ").concat(i18n_1.default[locale].CHOSEN_DATE, " ").concat(value)
7
+ const react_1 = __importDefault(require("react"));
8
+ const ffe_icons_react_1 = require("@sb1/ffe-icons-react");
9
+ const dateUtil_1 = require("../util/dateUtil");
10
+ const i18n_1 = __importDefault(require("../i18n/i18n"));
11
+ exports.Button = react_1.default.forwardRef(({ value, locale, onClick }, ref) => {
12
+ const buttonLabel = (0, dateUtil_1.validateDate)(value)
13
+ ? `${i18n_1.default[locale].CHANGE_DATE}, ${i18n_1.default[locale].CHOSEN_DATE} ${value}`
15
14
  : i18n_1.default[locale].CHOOSE_DATE;
16
- var calendarMonthIcon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0yMTIuMzA5LTEwMC4wMDFxLTMwLjMwOCAwLTUxLjMwOC0yMXQtMjEtNTEuMzA4di01MzUuMzgycTAtMzAuMzA4IDIxLTUxLjMwOHQ1MS4zMDgtMjFoNTUuMzg1di01My44NDdxMC0xMy4xNTMgOC44MDgtMjEuOTYxIDguODA3LTguODA3IDIxLjk2MS04LjgwNyAxMy4xNTMgMCAyMS45NjEgOC44MDcgOC44MDcgOC44MDggOC44MDcgMjEuOTYxdjUzLjg0N2gzMDMuMDc2di01NC42MTZxMC0xMi43NjkgOC42MTUtMjEuMzg0dDIxLjM4NC04LjYxNXExMi43NjkgMCAyMS4zODQgOC42MTUgOC42MTYgOC42MTUgOC42MTYgMjEuMzg0djU0LjYxNmg1NS4zODVxMzAuMzA4IDAgNTEuMzA4IDIxdDIxIDUxLjMwOHY1MzUuMzgycTAgMzAuMzA4LTIxIDUxLjMwOHQtNTEuMzA4IDIxSDIxMi4zMDlabTAtNTkuOTk5aDUzNS4zODJxNC42MTYgMCA4LjQ2My0zLjg0NiAzLjg0Ni0zLjg0NyAzLjg0Ni04LjQ2M3YtMzc1LjM4MkgyMDB2Mzc1LjM4MnEwIDQuNjE2IDMuODQ2IDguNDYzIDMuODQ3IDMuODQ2IDguNDYzIDMuODQ2Wk0yMDAtNjA3LjY5aDU2MHYtMTAwLjAwMXEwLTQuNjE2LTMuODQ2LTguNDYzLTMuODQ3LTMuODQ2LTguNDYzLTMuODQ2SDIxMi4zMDlxLTQuNjE2IDAtOC40NjMgMy44NDYtMy44NDYgMy44NDctMy44NDYgOC40NjN2MTAwLjAwMVptMCAwVi03MjB2MTEyLjMxWm0yODAgMjEwLjc2N3EtMTQuNjkyIDAtMjUuMDM4LTEwLjM0NnQtMTAuMzQ2LTI1LjAzOHEwLTE0LjY5MiAxMC4zNDYtMjUuMDM4VDQ4MC00NjcuNjkxcTE0LjY5MiAwIDI1LjAzOCAxMC4zNDZ0MTAuMzQ2IDI1LjAzOHEwIDE0LjY5Mi0xMC4zNDYgMjUuMDM4VDQ4MC0zOTYuOTIzWm0tMTYwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOFQzMjAtNDY3LjY5MXExNC42OTIgMCAyNS4wMzggMTAuMzQ2dDEwLjM0NiAyNS4wMzhxMCAxNC42OTItMTAuMzQ2IDI1LjAzOFQzMjAtMzk2LjkyM1ptMzIwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOFQ2NDAtNDY3LjY5MXExNC42OTIgMCAyNS4wMzggMTAuMzQ2dDEwLjM0NiAyNS4wMzhxMCAxNC42OTItMTAuMzQ2IDI1LjAzOFQ2NDAtMzk2LjkyM1pNNDgwLTI0MHEtMTQuNjkyIDAtMjUuMDM4LTEwLjM0NnQtMTAuMzQ2LTI1LjAzOHEwLTE0LjY5MiAxMC4zNDYtMjUuMDM4IDEwLjM0Ni0xMC4zNDcgMjUuMDM4LTEwLjM0N3QyNS4wMzggMTAuMzQ3cTEwLjM0NiAxMC4zNDYgMTAuMzQ2IDI1LjAzOHQtMTAuMzQ2IDI1LjAzOFE0OTQuNjkyLTI0MCA0ODAtMjQwWm0tMTYwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOCAxMC4zNDYtMTAuMzQ3IDI1LjAzOC0xMC4zNDd0MjUuMDM4IDEwLjM0N3ExMC4zNDYgMTAuMzQ2IDEwLjM0NiAyNS4wMzh0LTEwLjM0NiAyNS4wMzhRMzM0LjY5Mi0yNDAgMzIwLTI0MFptMzIwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOCAxMC4zNDYtMTAuMzQ3IDI1LjAzOC0xMC4zNDd0MjUuMDM4IDEwLjM0N3ExMC4zNDYgMTAuMzQ2IDEwLjM0NiAyNS4wMzh0LTEwLjM0NiAyNS4wMzhRNjU0LjY5Mi0yNDAgNjQwLTI0MFoiLz48L3N2Zz4=';
15
+ const calendarMonthIcon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0yMTIuMzA5LTEwMC4wMDFxLTMwLjMwOCAwLTUxLjMwOC0yMXQtMjEtNTEuMzA4di01MzUuMzgycTAtMzAuMzA4IDIxLTUxLjMwOHQ1MS4zMDgtMjFoNTUuMzg1di01My44NDdxMC0xMy4xNTMgOC44MDgtMjEuOTYxIDguODA3LTguODA3IDIxLjk2MS04LjgwNyAxMy4xNTMgMCAyMS45NjEgOC44MDcgOC44MDcgOC44MDggOC44MDcgMjEuOTYxdjUzLjg0N2gzMDMuMDc2di01NC42MTZxMC0xMi43NjkgOC42MTUtMjEuMzg0dDIxLjM4NC04LjYxNXExMi43NjkgMCAyMS4zODQgOC42MTUgOC42MTYgOC42MTUgOC42MTYgMjEuMzg0djU0LjYxNmg1NS4zODVxMzAuMzA4IDAgNTEuMzA4IDIxdDIxIDUxLjMwOHY1MzUuMzgycTAgMzAuMzA4LTIxIDUxLjMwOHQtNTEuMzA4IDIxSDIxMi4zMDlabTAtNTkuOTk5aDUzNS4zODJxNC42MTYgMCA4LjQ2My0zLjg0NiAzLjg0Ni0zLjg0NyAzLjg0Ni04LjQ2M3YtMzc1LjM4MkgyMDB2Mzc1LjM4MnEwIDQuNjE2IDMuODQ2IDguNDYzIDMuODQ3IDMuODQ2IDguNDYzIDMuODQ2Wk0yMDAtNjA3LjY5aDU2MHYtMTAwLjAwMXEwLTQuNjE2LTMuODQ2LTguNDYzLTMuODQ3LTMuODQ2LTguNDYzLTMuODQ2SDIxMi4zMDlxLTQuNjE2IDAtOC40NjMgMy44NDYtMy44NDYgMy44NDctMy44NDYgOC40NjN2MTAwLjAwMVptMCAwVi03MjB2MTEyLjMxWm0yODAgMjEwLjc2N3EtMTQuNjkyIDAtMjUuMDM4LTEwLjM0NnQtMTAuMzQ2LTI1LjAzOHEwLTE0LjY5MiAxMC4zNDYtMjUuMDM4VDQ4MC00NjcuNjkxcTE0LjY5MiAwIDI1LjAzOCAxMC4zNDZ0MTAuMzQ2IDI1LjAzOHEwIDE0LjY5Mi0xMC4zNDYgMjUuMDM4VDQ4MC0zOTYuOTIzWm0tMTYwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOFQzMjAtNDY3LjY5MXExNC42OTIgMCAyNS4wMzggMTAuMzQ2dDEwLjM0NiAyNS4wMzhxMCAxNC42OTItMTAuMzQ2IDI1LjAzOFQzMjAtMzk2LjkyM1ptMzIwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOFQ2NDAtNDY3LjY5MXExNC42OTIgMCAyNS4wMzggMTAuMzQ2dDEwLjM0NiAyNS4wMzhxMCAxNC42OTItMTAuMzQ2IDI1LjAzOFQ2NDAtMzk2LjkyM1pNNDgwLTI0MHEtMTQuNjkyIDAtMjUuMDM4LTEwLjM0NnQtMTAuMzQ2LTI1LjAzOHEwLTE0LjY5MiAxMC4zNDYtMjUuMDM4IDEwLjM0Ni0xMC4zNDcgMjUuMDM4LTEwLjM0N3QyNS4wMzggMTAuMzQ3cTEwLjM0NiAxMC4zNDYgMTAuMzQ2IDI1LjAzOHQtMTAuMzQ2IDI1LjAzOFE0OTQuNjkyLTI0MCA0ODAtMjQwWm0tMTYwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOCAxMC4zNDYtMTAuMzQ3IDI1LjAzOC0xMC4zNDd0MjUuMDM4IDEwLjM0N3ExMC4zNDYgMTAuMzQ2IDEwLjM0NiAyNS4wMzh0LTEwLjM0NiAyNS4wMzhRMzM0LjY5Mi0yNDAgMzIwLTI0MFptMzIwIDBxLTE0LjY5MiAwLTI1LjAzOC0xMC4zNDZ0LTEwLjM0Ni0yNS4wMzhxMC0xNC42OTIgMTAuMzQ2LTI1LjAzOCAxMC4zNDYtMTAuMzQ3IDI1LjAzOC0xMC4zNDd0MjUuMDM4IDEwLjM0N3ExMC4zNDYgMTAuMzQ2IDEwLjM0NiAyNS4wMzh0LTEwLjM0NiAyNS4wMzhRNjU0LjY5Mi0yNDAgNjQwLTI0MFoiLz48L3N2Zz4=';
17
16
  return (react_1.default.createElement("button", { "data-testid": "datepicker-open", ref: ref, onClick: onClick, className: "ffe-datepicker__button", "aria-label": buttonLabel, type: "button" },
18
17
  react_1.default.createElement(ffe_icons_react_1.Icon, { ariaLabel: i18n_1.default[locale].CALENDAR_LABEL, fileUrl: calendarMonthIcon, size: "md", className: "ffe-datepicker__icon" })));
19
18
  });