@planningcenter/tapestry-react 2.6.2 → 2.8.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 (46) hide show
  1. package/dist/cjs/Button/Button.js +12 -3
  2. package/dist/cjs/Button/Button.test.js +67 -14
  3. package/dist/cjs/Calendar/Calendar.js +30 -25
  4. package/dist/cjs/Combobox/ComboboxInput.js +41 -37
  5. package/dist/cjs/DataTable/DataTable.js +3 -2
  6. package/dist/cjs/DateField/DateField.js +74 -47
  7. package/dist/cjs/DateField/parse.js +106 -0
  8. package/dist/cjs/DateField/parse.test.js +46 -0
  9. package/dist/cjs/DateField/useArrowKeysToNavigateCalendar.js +44 -0
  10. package/dist/cjs/DateField/useEditableDate.js +72 -0
  11. package/dist/cjs/Select/Select.test.js +74 -0
  12. package/dist/cjs/system/colors/colors.js +18 -15
  13. package/dist/esm/Button/Button.js +12 -3
  14. package/dist/esm/Button/Button.test.js +78 -19
  15. package/dist/esm/Calendar/Calendar.js +30 -25
  16. package/dist/esm/Combobox/ComboboxInput.js +40 -37
  17. package/dist/esm/DataTable/DataTable.js +3 -2
  18. package/dist/esm/DateField/DateField.js +75 -48
  19. package/dist/esm/DateField/parse.js +93 -0
  20. package/dist/esm/DateField/parse.test.js +42 -0
  21. package/dist/esm/DateField/useArrowKeysToNavigateCalendar.js +36 -0
  22. package/dist/esm/DateField/useEditableDate.js +62 -0
  23. package/dist/esm/Select/Select.test.js +59 -0
  24. package/dist/esm/system/colors/colors.js +18 -15
  25. package/dist/types/Button/Button.d.ts +1 -1
  26. package/dist/types/DateField/DateField.d.ts +48 -0
  27. package/dist/types/DateField/parse.d.ts +17 -0
  28. package/dist/types/DateField/parse.test.d.ts +1 -0
  29. package/dist/types/DateField/useArrowKeysToNavigateCalendar.d.ts +8 -0
  30. package/dist/types/DateField/useEditableDate.d.ts +25 -0
  31. package/dist/types/Select/Select.test.d.ts +1 -0
  32. package/package.json +5 -6
  33. package/src/Button/Button.test.tsx +39 -1
  34. package/src/Button/Button.tsx +8 -3
  35. package/src/Calendar/Calendar.js +22 -17
  36. package/src/Combobox/ComboboxInput.js +76 -62
  37. package/src/DataTable/DataTable.js +2 -1
  38. package/src/DateField/DateField.mdx +15 -0
  39. package/src/DateField/{DateField.js → DateField.tsx} +96 -52
  40. package/src/DateField/parse.test.ts +76 -0
  41. package/src/DateField/parse.ts +92 -0
  42. package/src/DateField/useArrowKeysToNavigateCalendar.ts +54 -0
  43. package/src/DateField/useEditableDate.ts +81 -0
  44. package/src/Icon/Icon.mdx +12 -11
  45. package/src/Select/Select.test.tsx +58 -0
  46. package/src/system/colors/colors.js +18 -15
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _dateFns = require("date-fns");
4
+
5
+ var _parse = require("./parse");
6
+
7
+ describe('isValidDate', function () {
8
+ var validDates = ['jun 6, 2022', 'June-06-2022', '6-6-2022', '6/6/2022', '06-06-2022', '2022-06-26', // year, month, day
9
+ '2022/6/1' // year, month, day
10
+ ];
11
+ validDates.forEach(function (date) {
12
+ it("returns true for \"" + date + "\"", function () {
13
+ expect((0, _parse.isValidDate)(date)).toBe(true);
14
+ });
15
+ });
16
+ var invalidDates = ['June-06-22', '13-6-2022', 'June 6 2022', '2022/6/1/1', '2022-15-06'];
17
+ invalidDates.forEach(function (date) {
18
+ it("returns false for \"" + date + "\"", function () {
19
+ expect((0, _parse.isValidDate)(date)).toBe(false);
20
+ });
21
+ });
22
+ });
23
+ describe('parseDate', function () {
24
+ var dates = [['January 31, 2022', 'January 31, 2022'], ['jun 9, 2022', 'June 09, 2022'], ['June-09-2022', 'June 09, 2022'], ['6-9-2022', 'June 09, 2022'], ['6/9/2022', 'June 09, 2022'], ['06-09-2022', 'June 09, 2022'], ['2022-06-26', 'June 26, 2022'], ['2022/6/1', 'June 01, 2022', 'MMMM dd, yyyy'], ['15/6/2022', 'June 15, 2022', 'dd/MM/YYYY'], ['1/6/2022', 'June 01, 2022', 'dd MMMM, yyyy'], ['15-aug-2023', 'August 15, 2023', 'dd MMMM, yyyy'], ['15 August, 2023', 'August 15, 2023', 'dd MMMM, yyyy']];
25
+ dates.forEach(function (_ref) {
26
+ var date = _ref[0],
27
+ expected = _ref[1],
28
+ dateFormat = _ref[2];
29
+ it("returns " + expected + " for \"" + date + "\"", function () {
30
+ expect((0, _dateFns.format)((0, _parse.parseDate)({
31
+ date: date,
32
+ format: dateFormat
33
+ }), 'MMMM dd, yyyy')).toEqual(expected);
34
+ });
35
+ });
36
+ });
37
+ describe('parseMonth', function () {
38
+ var months = [['jan', 1], ['feb', 2], ['December', 12], ['2', 2], ['12', 12], ['05', 5]];
39
+ months.forEach(function (_ref2) {
40
+ var month = _ref2[0],
41
+ expected = _ref2[1];
42
+ it("returns " + expected + " for \"" + month + "\"", function () {
43
+ expect((0, _parse.parseMonth)(month)).toBe(expected);
44
+ });
45
+ });
46
+ });
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.useArrowKeysToNavigateCalendar = void 0;
5
+
6
+ var _react = require("react");
7
+
8
+ var useArrowKeysToNavigateCalendar = function useArrowKeysToNavigateCalendar(_ref) {
9
+ var date = _ref.date,
10
+ calendarIsOpen = _ref.calendarIsOpen,
11
+ openCalendar = _ref.openCalendar,
12
+ onChange = _ref.onChange;
13
+ var incrementDate = (0, _react.useCallback)(function (by) {
14
+ if (!date) return;
15
+ var newDate = new Date(date);
16
+ newDate.setDate(newDate.getDate() + by);
17
+ onChange(newDate);
18
+ }, [date, onChange]);
19
+ var handleInputKeyDown = (0, _react.useCallback)(function (event) {
20
+ if (calendarIsOpen) {
21
+ if (event.key === 'ArrowUp') {
22
+ event.preventDefault();
23
+ incrementDate(-7);
24
+ } else if (event.key === 'ArrowDown') {
25
+ event.preventDefault();
26
+ incrementDate(7);
27
+ } else if (event.key === 'ArrowLeft') {
28
+ event.preventDefault();
29
+ incrementDate(-1);
30
+ } else if (event.key === 'ArrowRight') {
31
+ event.preventDefault();
32
+ incrementDate(1);
33
+ }
34
+ } else {
35
+ if (event.key === 'ArrowDown') {
36
+ event.preventDefault();
37
+ openCalendar();
38
+ }
39
+ }
40
+ }, [calendarIsOpen, openCalendar, incrementDate]);
41
+ return handleInputKeyDown;
42
+ };
43
+
44
+ exports.useArrowKeysToNavigateCalendar = useArrowKeysToNavigateCalendar;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.useEditableDate = void 0;
5
+
6
+ var _react = require("react");
7
+
8
+ var _dateFns = require("date-fns");
9
+
10
+ var _parse = require("./parse");
11
+
12
+ var useEditableDate = function useEditableDate(_ref) {
13
+ var date = _ref.date,
14
+ dateFormat = _ref.dateFormat,
15
+ dateValidator = _ref.dateValidator,
16
+ onChange = _ref.onChange;
17
+
18
+ var _useState = (0, _react.useState)(),
19
+ keyBuffer = _useState[0],
20
+ setKeyBuffer = _useState[1];
21
+
22
+ var _useState2 = (0, _react.useState)(false),
23
+ invalidKeyBuffer = _useState2[0],
24
+ setInvalidKeyBuffer = _useState2[1];
25
+
26
+ var formattedDate = (0, _react.useMemo)(function () {
27
+ if (keyBuffer !== undefined) {
28
+ return keyBuffer;
29
+ } else {
30
+ return date ? (0, _dateFns.format)(date, dateFormat) : '';
31
+ }
32
+ }, [date, dateFormat, keyBuffer]);
33
+ var setKeyBufferAndValidate = (0, _react.useCallback)(function (value) {
34
+ setKeyBuffer(value);
35
+
36
+ if (value && !dateValidator((0, _parse.parseDate)({
37
+ date: value,
38
+ format: dateFormat
39
+ }))) {
40
+ setInvalidKeyBuffer(true);
41
+ } else {
42
+ setInvalidKeyBuffer(false);
43
+ }
44
+ }, [dateFormat, dateValidator]);
45
+ var setDate = (0, _react.useCallback)(function (date) {
46
+ var newDate;
47
+
48
+ if (typeof date === 'string') {
49
+ setKeyBufferAndValidate(date);
50
+ newDate = (0, _parse.parseDate)({
51
+ date: date,
52
+ format: dateFormat
53
+ });
54
+ } else {
55
+ setKeyBufferAndValidate(undefined);
56
+ newDate = date;
57
+ }
58
+
59
+ if (dateValidator(newDate) && onChange) onChange(newDate);
60
+ }, [onChange, setKeyBufferAndValidate, dateValidator, dateFormat]);
61
+ var clearKeyBuffer = (0, _react.useCallback)(function () {
62
+ setKeyBufferAndValidate(undefined);
63
+ }, []);
64
+ return {
65
+ formattedDate: formattedDate,
66
+ setDate: setDate,
67
+ clearKeyBuffer: clearKeyBuffer,
68
+ invalidKeyBuffer: invalidKeyBuffer
69
+ };
70
+ };
71
+
72
+ exports.useEditableDate = useEditableDate;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _react = _interopRequireDefault(require("react"));
10
+
11
+ var _react2 = require("@testing-library/react");
12
+
13
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
14
+
15
+ var _ = _interopRequireDefault(require("."));
16
+
17
+ var _ThemeProvider = require("../ThemeProvider/ThemeProvider");
18
+
19
+ var people = [{
20
+ first: 'Charlie',
21
+ last: 'Brown',
22
+ twitter: 'dancounsell',
23
+ active: true
24
+ }, {
25
+ first: 'Charlotte',
26
+ last: 'White',
27
+ twitter: 'mtnmissy',
28
+ active: true
29
+ }, {
30
+ first: 'John',
31
+ last: 'James',
32
+ twitter: 'miller',
33
+ active: false
34
+ }, {
35
+ first: 'Travis',
36
+ last: 'Arnold',
37
+ twitter: 'souporserious',
38
+ active: true
39
+ }];
40
+ var selectMock = jest.fn();
41
+ test('can click to select item from list', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
42
+ return _regenerator["default"].wrap(function _callee$(_context) {
43
+ while (1) {
44
+ switch (_context.prev = _context.next) {
45
+ case 0:
46
+ jest.useFakeTimers();
47
+ (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ThemeProvider.ThemeProvider, null, /*#__PURE__*/_react["default"].createElement(_["default"], {
48
+ onChange: selectMock
49
+ }, people.map(function (p) {
50
+ return /*#__PURE__*/_react["default"].createElement(_["default"].Option, {
51
+ value: p.twitter,
52
+ key: p.twitter
53
+ }, p.first, " ", p.last);
54
+ }))));
55
+
56
+ _userEvent["default"].click(_react2.screen.getByRole('button'));
57
+
58
+ jest.runAllTimers();
59
+
60
+ _userEvent["default"].click(_react2.screen.getByText('Travis Arnold'));
61
+
62
+ expect(selectMock).toHaveBeenCalledWith({
63
+ selectedValue: 'souporserious',
64
+ value: 'souporserious'
65
+ });
66
+ jest.useRealTimers();
67
+
68
+ case 7:
69
+ case "end":
70
+ return _context.stop();
71
+ }
72
+ }
73
+ }, _callee);
74
+ })));
@@ -17,25 +17,28 @@ var palette = {
17
17
  darkest: 'hsl(88, 72%, 20%)'
18
18
  },
19
19
  warning: {
20
- lighter: 'hsl(60, 99%, 90%)',
21
- light: 'hsl(56, 97%, 74%)',
22
- base: 'hsl(50, 94%, 56%)',
23
- dark: 'hsl(48, 93%, 48%)',
24
- darker: 'hsl(42, 90%, 30%)'
20
+ lightest: 'hsl(42, 87%, 97%)',
21
+ lighter: 'hsl(42, 87%, 94%)',
22
+ light: 'hsl(42, 87%, 90%)',
23
+ base: 'hsl(42, 84%, 63%)',
24
+ dark: 'hsl(42, 84%, 55%)',
25
+ darker: 'hsl(42, 84%, 49%)'
25
26
  },
26
27
  error: {
27
- lighter: 'hsl(7, 60%, 90%)',
28
- light: 'hsl(7, 72%, 76%)',
29
- base: 'hsl(7, 78%, 64%)',
30
- dark: 'hsl(7, 80%, 52%)',
31
- darker: 'hsl(7, 86%, 30%)'
28
+ lightest: 'hsl(7, 60%, 97%)',
29
+ lighter: 'hsl(9, 59%, 93%)',
30
+ light: 'hsl(8, 60%, 85%)',
31
+ base: 'hsl(8, 60%, 47%)',
32
+ dark: 'hsl(8, 60%, 45%)',
33
+ darker: 'hsl(9, 61%, 43%)'
32
34
  },
33
35
  success: {
34
- lighter: 'hsl(96, 24%, 92%)',
35
- light: 'hsl(96, 32%, 76%)',
36
- base: 'hsl(96, 40%, 58%)',
37
- dark: 'hsl(96, 44%, 50%)',
38
- darker: 'hsl(96, 60%, 20%)'
36
+ lightest: 'hsl(93, 53%, 97%)',
37
+ lighter: 'hsl(95, 50%, 91%)',
38
+ light: 'hsl(86, 91%, 35%)',
39
+ base: 'hsl(86, 91%, 27%)',
40
+ dark: 'hsl(86, 91%, 25%)',
41
+ darker: 'hsl(86, 91%, 23%)'
39
42
  },
40
43
  red: ['hsl(8, 73%, 96%)', 'hsl(8, 74%, 92%)', 'hsl(8, 75%, 88%)', 'hsl(8, 76%, 68%)', 'hsl(8, 77%, 60%)', 'hsl(8, 78%, 56%)', 'hsl(8, 79%, 52%)', 'hsl(8, 80%, 48%)', 'hsl(8, 81%, 40%)', 'hsl(8, 82%, 30%)'],
41
44
  blue: ['hsl(197, 56%, 92%)', 'hsl(197, 56%, 88%)', 'hsl(197, 56%, 72%)', 'hsl(197, 56%, 64%)', 'hsl(197, 56%, 52%)', 'hsl(197, 56%, 44%)', 'hsl(197, 56%, 40%)', 'hsl(197, 56%, 32%)', 'hsl(197, 56%, 24%)', 'hsl(197, 56%, 20%)'],
@@ -168,13 +168,22 @@ export function Button(_ref) {
168
168
  if (iconRight) {
169
169
  iconRight['color'] = 'transparent';
170
170
  }
171
- } // don't allow interacting with button when disabled
172
-
171
+ }
173
172
 
174
173
  if (disabled) {
174
+ buttonProps.opacity = 0.65;
175
175
  buttonProps['aria-disabled'] = true;
176
176
  buttonProps.cursor = 'not-allowed';
177
- buttonProps.opacity = 0.65;
177
+
178
+ buttonProps.onClick = function (event) {
179
+ return event.preventDefault();
180
+ };
181
+
182
+ buttonProps.onKeyDown = function (event) {
183
+ if (event.key === 'Enter' || event.key === ' ') {
184
+ event.preventDefault();
185
+ }
186
+ };
178
187
  } // don't apply hover/active styles or events when disabled or spinner is present
179
188
 
180
189
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render, fireEvent } from '@testing-library/react';
2
+ import { render, fireEvent, createEvent } from '@testing-library/react';
3
3
  import { Button } from './Button';
4
4
 
5
5
  var _ref = /*#__PURE__*/React.createElement(Button, null);
@@ -23,48 +23,107 @@ it("should render as <button> with type=\"submit\"", function () {
23
23
  var button = container.querySelector('button');
24
24
  expect(button.getAttribute('type')).toEqual('submit');
25
25
  });
26
+
27
+ var _ref3 = /*#__PURE__*/React.createElement(Button, {
28
+ disabled: true
29
+ });
30
+
31
+ it("if \"disabled\" prop is provided, set \"aria-disabled\" attribute", function () {
32
+ var _render3 = render(_ref3),
33
+ container = _render3.container;
34
+
35
+ var button = container.querySelector('button');
36
+ expect(button.getAttribute("aria-disabled")).toEqual("true");
37
+ expect(button.disabled).toBe(false);
38
+ });
39
+
40
+ var _ref4 = /*#__PURE__*/React.createElement(Button, {
41
+ disabled: true
42
+ });
43
+
44
+ it("if \"disabled\" prop is provided, prevent \"Click\" event from firing", function () {
45
+ var _render4 = render(_ref4),
46
+ container = _render4.container;
47
+
48
+ var button = container.querySelector('button');
49
+ var clickEvent = createEvent.click(button);
50
+ fireEvent(button, clickEvent);
51
+ expect(clickEvent.defaultPrevented).toBe(true);
52
+ });
53
+
54
+ var _ref5 = /*#__PURE__*/React.createElement(Button, {
55
+ disabled: true
56
+ });
57
+
58
+ it("if \"disabled\" prop is provided, prevent keyDown \"Enter\" event from firing", function () {
59
+ var _render5 = render(_ref5),
60
+ container = _render5.container;
61
+
62
+ var button = container.querySelector('button');
63
+ var keyDownEvent = createEvent.keyDown(button, {
64
+ key: 'Enter'
65
+ });
66
+ fireEvent(button, keyDownEvent);
67
+ expect(keyDownEvent.defaultPrevented).toBe(true);
68
+ });
69
+
70
+ var _ref6 = /*#__PURE__*/React.createElement(Button, {
71
+ disabled: true
72
+ });
73
+
74
+ it("if \"disabled\" prop is provided, prevent keyDown \"Space\" event from firing", function () {
75
+ var _render6 = render(_ref6),
76
+ container = _render6.container;
77
+
78
+ var button = container.querySelector('button');
79
+ var keyDownEvent = createEvent.keyDown(button, {
80
+ key: ' '
81
+ });
82
+ fireEvent(button, keyDownEvent);
83
+ expect(keyDownEvent.defaultPrevented).toBe(true);
84
+ });
26
85
  it("should render title", function () {
27
86
  var title = 'Hello';
28
87
 
29
- var _render3 = render( /*#__PURE__*/React.createElement(Button, {
88
+ var _render7 = render( /*#__PURE__*/React.createElement(Button, {
30
89
  title: title
31
90
  })),
32
- getByText = _render3.getByText;
91
+ getByText = _render7.getByText;
33
92
 
34
93
  getByText(title);
35
94
  });
36
95
 
37
- var _ref3 = /*#__PURE__*/React.createElement(Button, {
96
+ var _ref7 = /*#__PURE__*/React.createElement(Button, {
38
97
  to: "#"
39
98
  });
40
99
 
41
100
  it("should render <a> without a type if \"to\" is provided", function () {
42
- var _render4 = render(_ref3),
43
- container = _render4.container;
101
+ var _render8 = render(_ref7),
102
+ container = _render8.container;
44
103
 
45
104
  var button = container.querySelector('a');
46
105
  expect(button.getAttribute('type')).toBeNull();
47
106
  });
48
107
 
49
- var _ref4 = /*#__PURE__*/React.createElement(Button, {
108
+ var _ref8 = /*#__PURE__*/React.createElement(Button, {
50
109
  href: "#"
51
110
  });
52
111
 
53
112
  it("should render <a> without a type if \"href\" is provided", function () {
54
- var _render5 = render(_ref4),
55
- container = _render5.container;
113
+ var _render9 = render(_ref8),
114
+ container = _render9.container;
56
115
 
57
116
  var button = container.querySelector('a');
58
117
  expect(button.getAttribute('type')).toBeNull();
59
118
  });
60
119
 
61
- var _ref5 = /*#__PURE__*/React.createElement(Button, {
120
+ var _ref9 = /*#__PURE__*/React.createElement(Button, {
62
121
  to: "#"
63
122
  });
64
123
 
65
124
  it("should render <a> with \"href\" if \"to\" is specifed", function () {
66
- var _render6 = render(_ref5),
67
- container = _render6.container;
125
+ var _render10 = render(_ref9),
126
+ container = _render10.container;
68
127
 
69
128
  var button = container.querySelector('a');
70
129
  expect(button.getAttribute('href')).toEqual('#');
@@ -72,12 +131,12 @@ it("should render <a> with \"href\" if \"to\" is specifed", function () {
72
131
  it("should render href and external link values", function () {
73
132
  var title = 'Hello';
74
133
 
75
- var _render7 = render( /*#__PURE__*/React.createElement(Button, {
134
+ var _render11 = render( /*#__PURE__*/React.createElement(Button, {
76
135
  external: true,
77
136
  title: title,
78
137
  to: "https://www.planningcenter.com"
79
138
  })),
80
- getByText = _render7.getByText;
139
+ getByText = _render11.getByText;
81
140
 
82
141
  var button = getByText(title);
83
142
  expect(button.getAttribute('href')).toEqual('https://www.planningcenter.com');
@@ -87,20 +146,20 @@ it("should render href and external link values", function () {
87
146
  it("should call onClick when clicked or Enter or Space key is pressed", function () {
88
147
  var onClick = jest.fn();
89
148
 
90
- var _render8 = render( /*#__PURE__*/React.createElement(Button, {
149
+ var _render12 = render( /*#__PURE__*/React.createElement(Button, {
91
150
  onClick: onClick
92
151
  })),
93
- container = _render8.container;
152
+ container = _render12.container;
94
153
 
95
154
  fireEvent.click(container.firstChild);
96
155
  expect(onClick).toHaveBeenCalledTimes(1);
97
156
  });
98
157
 
99
- var _ref6 = /*#__PURE__*/React.createElement(Button, null);
158
+ var _ref10 = /*#__PURE__*/React.createElement(Button, null);
100
159
 
101
160
  it("should not call onClick when Enter or Space key is pressed and onClick isn't present", function () {
102
- var _render9 = render(_ref6),
103
- container = _render9.container;
161
+ var _render13 = render(_ref10),
162
+ container = _render13.container;
104
163
 
105
164
  fireEvent.keyDown(container.firstChild, {
106
165
  key: 'Enter'
@@ -141,35 +141,37 @@ var Calendar = /*#__PURE__*/forwardRef(function (_ref, calendarRef) {
141
141
  axis: "horizontal",
142
142
  spacing: 0.5
143
143
  }, /*#__PURE__*/React.createElement(Box, {
144
- as: "button",
145
144
  "aria-label": isMonthsView ? 'Choose dates' : 'Choose month',
146
- padding: 0.25,
147
- fontSize: headerFontSize,
148
- lineHeight: 3,
149
- radius: 3,
150
- cursor: "pointer",
145
+ as: "button",
151
146
  backgroundColor: hover ? 'highlight' : 'transparent',
147
+ cursor: "pointer",
148
+ fontSize: headerFontSize,
152
149
  hover: {
153
150
  backgroundColor: 'highlightSecondary'
154
151
  },
152
+ lineHeight: 3,
155
153
  onClick: function onClick() {
156
154
  setCurrentView(isMonthsView ? 'calendar' : 'months');
157
- }
158
- }, format(currentDate, 'MMMM')), /*#__PURE__*/React.createElement(Box, {
159
- as: "button",
160
- "aria-label": isYearsView ? 'Choose dates' : 'Choose year',
155
+ },
161
156
  padding: 0.25,
162
- fontSize: headerFontSize,
163
- lineHeight: 3,
164
157
  radius: 3,
165
- cursor: "pointer",
158
+ tabIndex: -1
159
+ }, format(currentDate, 'MMMM')), /*#__PURE__*/React.createElement(Box, {
160
+ "aria-label": isYearsView ? 'Choose dates' : 'Choose year',
161
+ as: "button",
166
162
  backgroundColor: hover ? 'highlight' : 'transparent',
163
+ cursor: "pointer",
164
+ fontSize: headerFontSize,
167
165
  hover: {
168
166
  backgroundColor: 'highlightSecondary'
169
167
  },
168
+ lineHeight: 3,
170
169
  onClick: function onClick() {
171
170
  setCurrentView(isYearsView ? 'calendar' : 'years');
172
- }
171
+ },
172
+ padding: 0.25,
173
+ radius: 3,
174
+ tabIndex: -1
173
175
  }, currentYear)), /*#__PURE__*/React.createElement(Group, {
174
176
  marginRight: 0.5,
175
177
  childProps: {
@@ -177,35 +179,38 @@ var Calendar = /*#__PURE__*/forwardRef(function (_ref, calendarRef) {
177
179
  size: buttonSize
178
180
  }
179
181
  }, /*#__PURE__*/React.createElement(Button, {
180
- title: "Previous month",
182
+ disabled: isYearsView ? currentYear <= minYear : isSameMonth(currentDate, minDate),
181
183
  icon: {
182
184
  name: 'general.leftChevron',
183
- size: "xxs"
185
+ size: 'xxs'
184
186
  },
185
- disabled: isYearsView ? currentYear <= minYear : isSameMonth(currentDate, minDate),
186
187
  onClick: function onClick() {
187
188
  return navigateCalendar(-1);
188
- }
189
- }), /*#__PURE__*/React.createElement(Button, {
190
- tooltip: {
191
- title: 'Today'
192
189
  },
190
+ tabIndex: -1,
191
+ title: "Previous month"
192
+ }), /*#__PURE__*/React.createElement(Button, {
193
193
  icon: {
194
194
  name: 'tapestry.radio1'
195
195
  },
196
196
  onClick: function onClick() {
197
197
  return setDate(TODAY, true);
198
+ },
199
+ tabIndex: -1,
200
+ tooltip: {
201
+ title: 'Today'
198
202
  }
199
203
  }), /*#__PURE__*/React.createElement(Button, {
200
- title: "Next month",
204
+ disabled: isYearsView ? currentYear >= maxYear : isSameMonth(currentDate, maxDate),
201
205
  icon: {
202
206
  name: 'general.rightChevron',
203
- size: "xxs"
207
+ size: 'xxs'
204
208
  },
205
- disabled: isYearsView ? currentYear >= maxYear : isSameMonth(currentDate, maxDate),
206
209
  onClick: function onClick() {
207
210
  return navigateCalendar(1);
208
- }
211
+ },
212
+ tabIndex: -1,
213
+ title: "Next month"
209
214
  }))), isMonthsView && /*#__PURE__*/React.createElement(StackView, {
210
215
  axis: "horizontal",
211
216
  width: cellSize * 7,
@@ -3,6 +3,7 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
3
3
  import React, { forwardRef, useCallback, useImperativeHandle, useRef, useContext, useEffect } from 'react';
4
4
  import Input from '../Input';
5
5
  import ItemListContext from '../ItemList/ItemListContext';
6
+ import { ItemListController } from '../ItemList';
6
7
  import { useThemeProps } from '../system';
7
8
 
8
9
  function ComboboxInput(props, ref) {
@@ -42,13 +43,11 @@ function ComboboxInput(props, ref) {
42
43
  };
43
44
  });
44
45
  var itemList = useContext(ItemListContext);
45
- var highlightedItemId = itemList.highlightedItemId,
46
- id = itemList.id;
47
46
  useEffect(function () {
48
47
  setTimeout(function () {
49
48
  itemList.setHighlightedIndex(0);
50
49
  });
51
- }, [itemList.items]);
50
+ }, [itemList]);
52
51
  var handleKeyDown = useCallback(function (e) {
53
52
  if (e.key === 'ArrowUp') {
54
53
  e.preventDefault();
@@ -76,45 +75,49 @@ function ComboboxInput(props, ref) {
76
75
  if (onClose && e.key === 'Tab') {
77
76
  onClose();
78
77
  }
79
- });
78
+ }, [itemList, onClose, onKeyDown]);
80
79
  var handleDocumentKeyDown = useCallback(function (e) {
81
80
  if (onClear && e.key === 'Escape') {
82
81
  onClear();
83
82
  }
83
+ }, [onClear]);
84
+ return /*#__PURE__*/React.createElement(ItemListController, null, function (itemList) {
85
+ var highlightedItemId = itemList.highlightedItemId,
86
+ id = itemList.id;
87
+ return /*#__PURE__*/React.createElement(Input.InputBox, _extends({
88
+ innerRef: innerRef,
89
+ size: size,
90
+ disabled: disabled,
91
+ isLoading: isLoading,
92
+ onClear: onClear
93
+ }, restProps, {
94
+ grow: 1
95
+ }), /*#__PURE__*/React.createElement(Input.InputField, {
96
+ innerRef: function innerRef(node) {
97
+ inputNode.current = node;
98
+ },
99
+ grow: 1,
100
+ role: "combobox",
101
+ autoComplete: "off",
102
+ "aria-autocomplete": "list",
103
+ "aria-controls": id,
104
+ "aria-expanded": isOpen,
105
+ "aria-activedescendant": highlightedItemId,
106
+ autoFocus: autoFocus,
107
+ type: type,
108
+ name: name,
109
+ disabled: disabled,
110
+ readOnly: readOnly,
111
+ placeholder: placeholder,
112
+ defaultValue: defaultValue,
113
+ value: value,
114
+ onChange: onChange,
115
+ onFocus: onFocus,
116
+ onBlur: onBlur,
117
+ onKeyDown: handleKeyDown,
118
+ onKeyUp: onKeyUp
119
+ }));
84
120
  });
85
- return /*#__PURE__*/React.createElement(Input.InputBox, _extends({
86
- innerRef: innerRef,
87
- size: size,
88
- disabled: disabled,
89
- isLoading: isLoading,
90
- onClear: onClear
91
- }, restProps, {
92
- grow: 1
93
- }), /*#__PURE__*/React.createElement(Input.InputField, {
94
- innerRef: function innerRef(node) {
95
- inputNode.current = node;
96
- },
97
- grow: 1,
98
- role: "combobox",
99
- autoComplete: "off",
100
- "aria-autocomplete": "list",
101
- "aria-controls": id,
102
- "aria-expanded": isOpen,
103
- "aria-activedescendant": highlightedItemId,
104
- autoFocus: autoFocus,
105
- type: type,
106
- name: name,
107
- disabled: disabled,
108
- readOnly: readOnly,
109
- placeholder: placeholder,
110
- defaultValue: defaultValue,
111
- value: value,
112
- onChange: onChange,
113
- onFocus: onFocus,
114
- onBlur: onBlur,
115
- onKeyDown: handleKeyDown,
116
- onKeyUp: onKeyUp
117
- }));
118
121
  }
119
122
 
120
123
  ComboboxInput = /*#__PURE__*/forwardRef(ComboboxInput);