@vuu-ui/vuu-ui-controls 0.8.55 → 0.8.57

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 (128) hide show
  1. package/cjs/calendar/internal/CalendarNavigation.css.js +1 -1
  2. package/cjs/calendar/internal/CalendarNavigation.js +105 -107
  3. package/cjs/calendar/internal/CalendarNavigation.js.map +1 -1
  4. package/cjs/date-popup/DatePopup.js +1 -3
  5. package/cjs/date-popup/DatePopup.js.map +1 -1
  6. package/cjs/date-popup/useDatePopup.js.map +1 -1
  7. package/cjs/{dropdown/Dropdown.css.js → dropdown-base/DropdownBase.css.js} +1 -1
  8. package/cjs/dropdown-base/DropdownBase.css.js.map +1 -0
  9. package/cjs/{dropdown → dropdown-base}/DropdownBase.js +3 -3
  10. package/cjs/dropdown-base/DropdownBase.js.map +1 -0
  11. package/cjs/dropdown-base/useClickAway.js.map +1 -0
  12. package/cjs/dropdown-base/useDropdownBase.js.map +1 -0
  13. package/cjs/index.js +2 -12
  14. package/cjs/index.js.map +1 -1
  15. package/cjs/instrument-picker/InstrumentPicker.js +1 -3
  16. package/cjs/instrument-picker/InstrumentPicker.js.map +1 -1
  17. package/cjs/instrument-picker/useInstrumentPicker.js.map +1 -1
  18. package/cjs/split-button/SplitButton.css.js +1 -1
  19. package/esm/calendar/internal/CalendarNavigation.css.js +1 -1
  20. package/esm/calendar/internal/CalendarNavigation.js +106 -108
  21. package/esm/calendar/internal/CalendarNavigation.js.map +1 -1
  22. package/esm/date-popup/DatePopup.js +1 -3
  23. package/esm/date-popup/DatePopup.js.map +1 -1
  24. package/esm/date-popup/useDatePopup.js.map +1 -1
  25. package/esm/{dropdown/Dropdown.css.js → dropdown-base/DropdownBase.css.js} +1 -1
  26. package/esm/dropdown-base/DropdownBase.css.js.map +1 -0
  27. package/esm/{dropdown → dropdown-base}/DropdownBase.js +1 -1
  28. package/esm/dropdown-base/DropdownBase.js.map +1 -0
  29. package/esm/dropdown-base/useClickAway.js.map +1 -0
  30. package/esm/dropdown-base/useDropdownBase.js.map +1 -0
  31. package/esm/index.js +2 -7
  32. package/esm/index.js.map +1 -1
  33. package/esm/instrument-picker/InstrumentPicker.js +1 -3
  34. package/esm/instrument-picker/InstrumentPicker.js.map +1 -1
  35. package/esm/instrument-picker/useInstrumentPicker.js.map +1 -1
  36. package/esm/split-button/SplitButton.css.js +1 -1
  37. package/package.json +8 -8
  38. package/types/calendar/internal/CalendarNavigation.d.ts +2 -7
  39. package/types/common-hooks/selectionTypes.d.ts +1 -1
  40. package/types/date-popup/DatePopup.d.ts +1 -1
  41. package/types/date-popup/useDatePopup.d.ts +1 -1
  42. package/types/{dropdown → dropdown-base}/index.d.ts +0 -2
  43. package/types/editable/useEditableText.d.ts +1 -1
  44. package/types/index.d.ts +1 -3
  45. package/types/instrument-picker/InstrumentPicker.d.ts +1 -1
  46. package/types/instrument-picker/useInstrumentPicker.d.ts +2 -2
  47. package/types/instrument-search/useInstrumentSearch.d.ts +1 -1
  48. package/types/list/List.d.ts +2 -2
  49. package/types/list/ListItem.d.ts +1 -1
  50. package/types/list/common-hooks/utils/collection-item-utils.d.ts +1 -1
  51. package/types/overflow-container/useOverflowContainer.d.ts +2 -2
  52. package/types/split-button/useSplitButton.d.ts +3 -3
  53. package/types/tabstrip/useTabstrip.d.ts +5 -5
  54. package/types/toolbar/useToolbar.d.ts +4 -4
  55. package/types/vuu-input/VuuInput.d.ts +2 -2
  56. package/cjs/combo-box/ComboBox.js +0 -191
  57. package/cjs/combo-box/ComboBox.js.map +0 -1
  58. package/cjs/combo-box/useCombobox.js +0 -358
  59. package/cjs/combo-box/useCombobox.js.map +0 -1
  60. package/cjs/dropdown/Dropdown.css.js.map +0 -1
  61. package/cjs/dropdown/Dropdown.js +0 -150
  62. package/cjs/dropdown/Dropdown.js.map +0 -1
  63. package/cjs/dropdown/DropdownBase.js.map +0 -1
  64. package/cjs/dropdown/DropdownButton.css.js +0 -6
  65. package/cjs/dropdown/DropdownButton.css.js.map +0 -1
  66. package/cjs/dropdown/DropdownButton.js +0 -72
  67. package/cjs/dropdown/DropdownButton.js.map +0 -1
  68. package/cjs/dropdown/useClickAway.js.map +0 -1
  69. package/cjs/dropdown/useDropdown.js +0 -115
  70. package/cjs/dropdown/useDropdown.js.map +0 -1
  71. package/cjs/dropdown/useDropdownBase.js.map +0 -1
  72. package/cjs/inputs/Checkbox.css.js +0 -6
  73. package/cjs/inputs/Checkbox.css.js.map +0 -1
  74. package/cjs/inputs/Checkbox.js +0 -32
  75. package/cjs/inputs/Checkbox.js.map +0 -1
  76. package/cjs/inputs/RadioButton.css.js +0 -6
  77. package/cjs/inputs/RadioButton.css.js.map +0 -1
  78. package/cjs/inputs/RadioButton.js +0 -39
  79. package/cjs/inputs/RadioButton.js.map +0 -1
  80. package/cjs/list/ChevronIcon.css.js +0 -6
  81. package/cjs/list/ChevronIcon.css.js.map +0 -1
  82. package/cjs/list/ChevronIcon.js +0 -22
  83. package/cjs/list/ChevronIcon.js.map +0 -1
  84. package/esm/combo-box/ComboBox.js +0 -189
  85. package/esm/combo-box/ComboBox.js.map +0 -1
  86. package/esm/combo-box/useCombobox.js +0 -356
  87. package/esm/combo-box/useCombobox.js.map +0 -1
  88. package/esm/dropdown/Dropdown.css.js.map +0 -1
  89. package/esm/dropdown/Dropdown.js +0 -148
  90. package/esm/dropdown/Dropdown.js.map +0 -1
  91. package/esm/dropdown/DropdownBase.js.map +0 -1
  92. package/esm/dropdown/DropdownButton.css.js +0 -4
  93. package/esm/dropdown/DropdownButton.css.js.map +0 -1
  94. package/esm/dropdown/DropdownButton.js +0 -70
  95. package/esm/dropdown/DropdownButton.js.map +0 -1
  96. package/esm/dropdown/useClickAway.js.map +0 -1
  97. package/esm/dropdown/useDropdown.js +0 -113
  98. package/esm/dropdown/useDropdown.js.map +0 -1
  99. package/esm/dropdown/useDropdownBase.js.map +0 -1
  100. package/esm/inputs/Checkbox.css.js +0 -4
  101. package/esm/inputs/Checkbox.css.js.map +0 -1
  102. package/esm/inputs/Checkbox.js +0 -30
  103. package/esm/inputs/Checkbox.js.map +0 -1
  104. package/esm/inputs/RadioButton.css.js +0 -4
  105. package/esm/inputs/RadioButton.css.js.map +0 -1
  106. package/esm/inputs/RadioButton.js +0 -37
  107. package/esm/inputs/RadioButton.js.map +0 -1
  108. package/esm/list/ChevronIcon.css.js +0 -4
  109. package/esm/list/ChevronIcon.css.js.map +0 -1
  110. package/esm/list/ChevronIcon.js +0 -20
  111. package/esm/list/ChevronIcon.js.map +0 -1
  112. package/types/combo-box/ComboBox.d.ts +0 -24
  113. package/types/combo-box/index.d.ts +0 -1
  114. package/types/combo-box/useCombobox.d.ts +0 -20
  115. package/types/dropdown/Dropdown.d.ts +0 -10
  116. package/types/dropdown/DropdownButton.d.ts +0 -41
  117. package/types/dropdown/useDropdown.d.ts +0 -13
  118. package/types/inputs/Checkbox.d.ts +0 -9
  119. package/types/inputs/RadioButton.d.ts +0 -9
  120. package/types/inputs/index.d.ts +0 -2
  121. /package/cjs/{dropdown → dropdown-base}/useClickAway.js +0 -0
  122. /package/cjs/{dropdown → dropdown-base}/useDropdownBase.js +0 -0
  123. /package/esm/{dropdown → dropdown-base}/useClickAway.js +0 -0
  124. /package/esm/{dropdown → dropdown-base}/useDropdownBase.js +0 -0
  125. /package/types/{dropdown → dropdown-base}/DropdownBase.d.ts +0 -0
  126. /package/types/{dropdown → dropdown-base}/dropdownTypes.d.ts +0 -0
  127. /package/types/{dropdown → dropdown-base}/useClickAway.d.ts +0 -0
  128. /package/types/{dropdown → dropdown-base}/useDropdownBase.d.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var calendarNavigationCss = ".salt-density-medium,\n.salt-density-touch,\n.salt-density-low {\n --calendar-navigation-gap: calc(var(--salt-size-unit) * 0.5);\n}\n\n.salt-density-high {\n --calendar-navigation-gap: 0px;\n}\n\n.saltCalendarNavigation-hideYearDropdown {\n --calendar-navigation-gap: calc(var(--salt-size-unit) * 2);\n}\n\n.saltCalendarNavigation {\n display: grid;\n grid-template-columns: min-content auto auto min-content;\n grid-gap: var(--calendar-navigation-gap);\n align-items: center;\n}\n\n.saltCalendarNavigation-hideYearDropdown {\n grid-template-columns: min-content auto min-content;\n}\n";
3
+ var calendarNavigationCss = ".saltCalendarNavigation {\n display: grid;\n grid-template-columns: min-content auto min-content;\n padding-bottom: var(--salt-spacing-100);\n grid-gap: 0;\n align-items: center;\n height: var(--salt-size-base);\n}\n\n.saltCalendarNavigation-hideYearDropdown {\n grid-template-columns: min-content auto min-content;\n grid-gap: var(--salt-spacing-300);\n}\n\n.saltCalendarNavigation-dropdowns {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: var(--salt-spacing-100);\n}\n";
4
4
 
5
5
  module.exports = calendarNavigationCss;
6
6
  //# sourceMappingURL=CalendarNavigation.css.js.map
@@ -1,28 +1,16 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
4
5
  var core = require('@salt-ds/core');
5
- var styles = require('@salt-ds/styles');
6
- var window = require('@salt-ds/window');
6
+ var icons = require('@salt-ds/icons');
7
7
  var cx = require('clsx');
8
- var React = require('react');
9
- require('../../dropdown/DropdownBase.js');
10
- require('../../dropdown/DropdownButton.js');
11
- var Dropdown = require('../../dropdown/Dropdown.js');
12
- require('../../common-hooks/collectionProvider.js');
13
- require('../../common-hooks/use-resize-observer.js');
14
- require('@vuu-ui/vuu-utils');
15
- require('../../list/common-hooks/keyUtils.js');
16
- require('../../list/Highlighter.js');
17
- var ListItem = require('../../list/ListItem.js');
18
- require('../../list/List.js');
19
- require('../../drag-drop/DragDropProvider.js');
20
- require('../../drag-drop/Draggable.js');
21
8
  var CalendarContext = require('./CalendarContext.js');
22
9
  var CalendarNavigation$1 = require('./CalendarNavigation.css.js');
23
10
  var date = require('@internationalized/date');
24
- var IconButton = require('../../icon-button/IconButton.js');
25
11
  var utils = require('./utils.js');
12
+ var window = require('@salt-ds/window');
13
+ var styles = require('@salt-ds/styles');
26
14
 
27
15
  const withBaseName = core.makePrefixer("saltCalendarNavigation");
28
16
  function useCalendarNavigation() {
@@ -55,15 +43,13 @@ function useCalendarNavigation() {
55
43
  setVisibleMonth(event, newMonth);
56
44
  }
57
45
  };
58
- const months = utils.monthsForLocale(visibleMonth).map((month) => {
59
- return { value: month, disabled: isOutsideAllowedMonths(month) };
60
- });
61
- const years = [-2, -1, 0, 1, 2].map((delta) => ({ value: visibleMonth.add({ years: delta }) })).filter(({ value }) => !isOutsideAllowedYears(value));
46
+ const months = utils.monthsForLocale(visibleMonth);
47
+ const years = [-2, -1, 0, 1, 2].map((delta) => visibleMonth.add({ years: delta })).filter((year) => !isOutsideAllowedYears(year));
62
48
  const selectedMonth = months.find(
63
- (item) => date.isSameMonth(item.value, visibleMonth)
49
+ (month) => date.isSameMonth(month, visibleMonth)
64
50
  );
65
51
  const selectedYear = years.find(
66
- (item) => date.isSameYear(item.value, visibleMonth)
52
+ (year) => date.isSameYear(year, visibleMonth)
67
53
  );
68
54
  const canNavigatePrevious = !(minDate && isDayVisible(minDate));
69
55
  const canNavigateNext = !(maxDate && isDayVisible(maxDate));
@@ -77,22 +63,31 @@ function useCalendarNavigation() {
77
63
  canNavigateNext,
78
64
  canNavigatePrevious,
79
65
  selectedMonth,
80
- selectedYear
66
+ selectedYear,
67
+ isOutsideAllowedMonths
81
68
  };
82
69
  }
83
- const ListItemWithTooltip = ({
84
- item,
85
- label,
86
- ...props
87
- }) => /* @__PURE__ */ jsxRuntime.jsx(
88
- core.Tooltip,
89
- {
90
- placement: "right",
91
- disabled: !item?.disabled,
92
- content: "This month is out of range",
93
- children: /* @__PURE__ */ jsxRuntime.jsx(ListItem.ListItem, { ...props, children: label })
94
- }
95
- );
70
+ const OptionWithTooltip = ({
71
+ value,
72
+ children,
73
+ disabled,
74
+ tooltipContent
75
+ }) => {
76
+ const { activeState, openState } = core.useListControlContext();
77
+ const open = activeState?.value === value;
78
+ return /* @__PURE__ */ jsxRuntime.jsx(
79
+ core.Tooltip,
80
+ {
81
+ placement: "right",
82
+ open: open && openState,
83
+ disabled: !disabled,
84
+ content: tooltipContent,
85
+ enterDelay: 0,
86
+ leaveDelay: 0,
87
+ children: /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value, disabled, children })
88
+ }
89
+ );
90
+ };
96
91
  const CalendarNavigation = React.forwardRef(function CalendarNavigation2(props, ref) {
97
92
  const {
98
93
  className,
@@ -103,7 +98,7 @@ const CalendarNavigation = React.forwardRef(function CalendarNavigation2(props,
103
98
  } = props;
104
99
  const targetWindow = window.useWindow();
105
100
  styles.useComponentCssInjection({
106
- testId: "salt-calendar-month",
101
+ testId: "salt-calendar-navigation",
107
102
  css: CalendarNavigation$1,
108
103
  window: targetWindow
109
104
  });
@@ -117,7 +112,8 @@ const CalendarNavigation = React.forwardRef(function CalendarNavigation2(props,
117
112
  canNavigatePrevious,
118
113
  visibleMonth,
119
114
  selectedMonth,
120
- selectedYear
115
+ selectedYear,
116
+ isOutsideAllowedMonths
121
117
  } = useCalendarNavigation();
122
118
  const handleNavigatePrevious = (event) => {
123
119
  moveToPreviousMonth(event);
@@ -126,35 +122,16 @@ const CalendarNavigation = React.forwardRef(function CalendarNavigation2(props,
126
122
  moveToNextMonth(event);
127
123
  };
128
124
  const handleMonthSelect = (event, month) => {
129
- if (month && event) {
130
- moveToMonth(event, month.value);
131
- }
125
+ moveToMonth(event, month[0]);
132
126
  };
133
127
  const handleYearSelect = (event, year) => {
134
- if (year && event) {
135
- moveToMonth(event, year.value);
136
- }
128
+ moveToMonth(event, year[0]);
137
129
  };
138
- const monthDropdownId = core.useId(MonthDropdownProps?.id) || "";
139
- const monthDropdownLabelledBy = cx.clsx(
140
- MonthDropdownProps?.["aria-labelledby"],
141
- // TODO need a prop on Dropdown to allow buttonId to be passed, should not make assumptions about internal
142
- // id assignment like this
143
- `${monthDropdownId}-control`
144
- );
145
- const yearDropdownId = core.useId(YearDropdownProps?.id) || "";
146
- const yearDropdownLabelledBy = cx.clsx(
147
- YearDropdownProps?.["aria-labelledby"],
148
- `${yearDropdownId}-control`
149
- );
150
- const defaultItemToMonth = (date) => {
151
- if (hideYearDropdown) {
152
- return utils.formatDate(date.value, { month: "long" });
153
- }
154
- return utils.formatDate(date.value, { month: "short" });
130
+ const formatMonth = (date) => {
131
+ return !date ? "" : utils.formatDate(date, { month: hideYearDropdown ? "long" : "short" });
155
132
  };
156
- const defaultItemToYear = (date) => {
157
- return utils.formatDate(date.value, { year: "numeric" });
133
+ const formatYear = (date) => {
134
+ return !date ? "" : utils.formatDate(date, { year: "numeric" });
158
135
  };
159
136
  return /* @__PURE__ */ jsxRuntime.jsxs(
160
137
  "div",
@@ -173,70 +150,91 @@ const CalendarNavigation = React.forwardRef(function CalendarNavigation2(props,
173
150
  placement: "top",
174
151
  disabled: canNavigatePrevious,
175
152
  content: "Past dates are out of range",
153
+ enterDelay: 0,
154
+ leaveDelay: 0,
176
155
  children: /* @__PURE__ */ jsxRuntime.jsx(
177
- IconButton.IconButton,
156
+ core.Button,
178
157
  {
179
- "aria-label": `Previous Month, ${utils.formatDate(
180
- visibleMonth.subtract({ months: 1 })
181
- )}`,
182
158
  disabled: !canNavigatePrevious,
183
- icon: "chevron-left",
184
159
  variant: "secondary",
185
160
  onClick: handleNavigatePrevious,
186
- className: withBaseName("previousButton"),
187
- focusableWhenDisabled: true
161
+ focusableWhenDisabled: true,
162
+ children: /* @__PURE__ */ jsxRuntime.jsx(
163
+ icons.ChevronLeftIcon,
164
+ {
165
+ "aria-label": `Previous Month, ${utils.formatDate(
166
+ visibleMonth.subtract({ months: 1 })
167
+ )}`
168
+ }
169
+ )
188
170
  }
189
171
  )
190
172
  }
191
173
  ),
192
- /* @__PURE__ */ jsxRuntime.jsx(
193
- Dropdown.Dropdown,
194
- {
195
- source: months,
196
- id: monthDropdownId,
197
- "aria-labelledby": monthDropdownLabelledBy,
198
- "aria-label": "Month Dropdown",
199
- ...MonthDropdownProps,
200
- ListItem: ListItemWithTooltip,
201
- selected: selectedMonth,
202
- itemToString: defaultItemToMonth,
203
- onSelectionChange: handleMonthSelect,
204
- fullWidth: true
205
- }
206
- ),
207
- !hideYearDropdown && /* @__PURE__ */ jsxRuntime.jsx(
208
- Dropdown.Dropdown,
209
- {
210
- source: years,
211
- id: yearDropdownId,
212
- "aria-labelledby": yearDropdownLabelledBy,
213
- "aria-label": "Year Dropdown",
214
- ...YearDropdownProps,
215
- ListItem: ListItemWithTooltip,
216
- selected: selectedYear,
217
- onSelectionChange: handleYearSelect,
218
- itemToString: defaultItemToYear,
219
- fullWidth: true
220
- }
221
- ),
174
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: withBaseName("dropdowns"), children: [
175
+ /* @__PURE__ */ jsxRuntime.jsx(
176
+ core.Dropdown,
177
+ {
178
+ "aria-label": "Month Dropdown",
179
+ selected: selectedMonth ? [selectedMonth] : [],
180
+ value: formatMonth(selectedMonth),
181
+ onSelectionChange: handleMonthSelect,
182
+ ...MonthDropdownProps,
183
+ children: months.map((month) => /* @__PURE__ */ jsxRuntime.jsx(
184
+ OptionWithTooltip,
185
+ {
186
+ value: month,
187
+ disabled: isOutsideAllowedMonths(month),
188
+ tooltipContent: "This month is out of range",
189
+ children: formatMonth(month)
190
+ },
191
+ formatMonth(month)
192
+ ))
193
+ }
194
+ ),
195
+ !hideYearDropdown && /* @__PURE__ */ jsxRuntime.jsx(
196
+ core.Dropdown,
197
+ {
198
+ "aria-label": "Year Dropdown",
199
+ selected: selectedYear ? [selectedYear] : [],
200
+ value: formatYear(selectedYear),
201
+ onSelectionChange: handleYearSelect,
202
+ ...YearDropdownProps,
203
+ children: years.map((year) => /* @__PURE__ */ jsxRuntime.jsx(
204
+ OptionWithTooltip,
205
+ {
206
+ value: year,
207
+ tooltipContent: "This year is out of range",
208
+ children: formatYear(year)
209
+ },
210
+ formatYear(year)
211
+ ))
212
+ }
213
+ )
214
+ ] }),
222
215
  /* @__PURE__ */ jsxRuntime.jsx(
223
216
  core.Tooltip,
224
217
  {
225
218
  placement: "top",
226
219
  disabled: canNavigateNext,
227
220
  content: "Future dates are out of range",
221
+ enterDelay: 0,
222
+ leaveDelay: 0,
228
223
  children: /* @__PURE__ */ jsxRuntime.jsx(
229
- IconButton.IconButton,
224
+ core.Button,
230
225
  {
231
- "aria-label": `Next Month, ${utils.formatDate(
232
- visibleMonth.add({ months: 1 })
233
- )}`,
234
226
  disabled: !canNavigateNext,
235
- icon: "chevron-right",
236
227
  variant: "secondary",
237
228
  onClick: handleNavigateNext,
238
- className: withBaseName("nextButton"),
239
- focusableWhenDisabled: true
229
+ focusableWhenDisabled: true,
230
+ children: /* @__PURE__ */ jsxRuntime.jsx(
231
+ icons.ChevronRightIcon,
232
+ {
233
+ "aria-label": `Next Month, ${utils.formatDate(
234
+ visibleMonth.add({ months: 1 })
235
+ )}`
236
+ }
237
+ )
240
238
  }
241
239
  )
242
240
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarNavigation.js","sources":["../../../src/calendar/internal/CalendarNavigation.tsx"],"sourcesContent":["import { ButtonProps, makePrefixer, Tooltip, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n ComponentPropsWithRef,\n forwardRef,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport { Dropdown, DropdownProps } from \"../../dropdown\";\nimport { ListItem, ListItemType } from \"../../list\";\nimport { useCalendarContext } from \"./CalendarContext\";\n\nimport calendarNavigationCss from \"./CalendarNavigation.css\";\n\nimport { DateValue, isSameMonth, isSameYear } from \"@internationalized/date\";\nimport { SingleSelectionHandler } from \"../../common-hooks\";\nimport { IconButton } from \"../../icon-button\";\nimport { formatDate, monthDiff, monthsForLocale } from \"./utils\";\n\ntype DropdownItem = {\n value: DateValue;\n disabled?: boolean;\n};\n\ntype dateDropdownProps = DropdownProps<DropdownItem>;\n\nexport interface CalendarNavigationProps extends ComponentPropsWithRef<\"div\"> {\n MonthDropdownProps?: dateDropdownProps;\n YearDropdownProps?: dateDropdownProps;\n onMonthSelect?: dateDropdownProps[\"onChange\"];\n onYearSelect?: dateDropdownProps[\"onChange\"];\n onNavigateNext?: ButtonProps[\"onClick\"];\n onNavigatePrevious?: ButtonProps[\"onClick\"];\n hideYearDropdown?: boolean;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarNavigation\");\n\nfunction useCalendarNavigation() {\n const {\n state: { visibleMonth, minDate, maxDate },\n helpers: {\n setVisibleMonth,\n isDayVisible,\n isOutsideAllowedYears,\n isOutsideAllowedMonths,\n },\n } = useCalendarContext();\n\n const moveToNextMonth = (event: SyntheticEvent) => {\n setVisibleMonth(event, visibleMonth.add({ months: 1 }));\n };\n\n const moveToPreviousMonth = (event: SyntheticEvent) => {\n setVisibleMonth(event, visibleMonth.subtract({ months: 1 }));\n };\n\n const moveToMonth = (event: SyntheticEvent, month: DateValue) => {\n let newMonth = month;\n\n if (!isOutsideAllowedYears(newMonth)) {\n if (isOutsideAllowedMonths(newMonth)) {\n // If month is navigable we should move to the closest navigable month\n const navigableMonths = monthsForLocale(visibleMonth).filter(\n (n) => !isOutsideAllowedMonths(n)\n );\n newMonth = navigableMonths.reduce((closestMonth, currentMonth) =>\n Math.abs(monthDiff(currentMonth, newMonth)) <\n Math.abs(monthDiff(closestMonth, newMonth))\n ? currentMonth\n : closestMonth\n );\n }\n setVisibleMonth(event, newMonth);\n }\n };\n\n const months = monthsForLocale(visibleMonth).map((month) => {\n return { value: month, disabled: isOutsideAllowedMonths(month) };\n });\n\n const years = [-2, -1, 0, 1, 2]\n .map((delta) => ({ value: visibleMonth.add({ years: delta }) }))\n .filter(({ value }) => !isOutsideAllowedYears(value));\n\n const selectedMonth = months.find((item: DropdownItem) =>\n isSameMonth(item.value, visibleMonth)\n );\n const selectedYear = years.find((item: DropdownItem) =>\n isSameYear(item.value, visibleMonth)\n );\n\n const canNavigatePrevious = !(minDate && isDayVisible(minDate));\n const canNavigateNext = !(maxDate && isDayVisible(maxDate));\n\n return {\n moveToNextMonth,\n moveToPreviousMonth,\n moveToMonth,\n visibleMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n };\n}\n\nconst ListItemWithTooltip: ListItemType<DropdownItem> = ({\n item,\n label,\n ...props\n}) => (\n <Tooltip\n placement=\"right\"\n disabled={!item?.disabled}\n content=\"This month is out of range\"\n >\n <ListItem {...props}>{label}</ListItem>\n </Tooltip>\n);\n\nexport const CalendarNavigation = forwardRef<\n HTMLDivElement,\n CalendarNavigationProps\n>(function CalendarNavigation(props, ref) {\n const {\n className,\n MonthDropdownProps,\n YearDropdownProps,\n hideYearDropdown,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-month\",\n css: calendarNavigationCss,\n window: targetWindow,\n });\n\n const {\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n visibleMonth,\n selectedMonth,\n selectedYear,\n } = useCalendarNavigation();\n\n const handleNavigatePrevious: MouseEventHandler<HTMLButtonElement> = (\n event\n ) => {\n moveToPreviousMonth(event);\n };\n\n const handleNavigateNext: MouseEventHandler<HTMLButtonElement> = (event) => {\n moveToNextMonth(event);\n };\n\n const handleMonthSelect: SingleSelectionHandler<DropdownItem> = (\n event,\n month\n ) => {\n if (month && event) {\n moveToMonth(event, month.value);\n }\n };\n\n const handleYearSelect: SingleSelectionHandler<DropdownItem> = (\n event,\n year\n ) => {\n if (year && event) {\n moveToMonth(event, year.value);\n }\n };\n\n const monthDropdownId = useId(MonthDropdownProps?.id) || \"\";\n const monthDropdownLabelledBy = clsx(\n MonthDropdownProps?.[\"aria-labelledby\"],\n // TODO need a prop on Dropdown to allow buttonId to be passed, should not make assumptions about internal\n // id assignment like this\n `${monthDropdownId}-control`\n );\n\n const yearDropdownId = useId(YearDropdownProps?.id) || \"\";\n const yearDropdownLabelledBy = clsx(\n YearDropdownProps?.[\"aria-labelledby\"],\n `${yearDropdownId}-control`\n );\n\n const defaultItemToMonth = (date: DropdownItem) => {\n if (hideYearDropdown) {\n return formatDate(date.value, { month: \"long\" });\n }\n return formatDate(date.value, { month: \"short\" });\n };\n\n const defaultItemToYear = (date: DropdownItem) => {\n return formatDate(date.value, { year: \"numeric\" });\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"hideYearDropdown\")]: hideYearDropdown },\n className\n )}\n ref={ref}\n {...rest}\n >\n <Tooltip\n placement=\"top\"\n disabled={canNavigatePrevious}\n content=\"Past dates are out of range\"\n >\n <IconButton\n aria-label={`Previous Month, ${formatDate(\n visibleMonth.subtract({ months: 1 })\n )}`}\n disabled={!canNavigatePrevious}\n icon=\"chevron-left\"\n variant=\"secondary\"\n onClick={handleNavigatePrevious}\n className={withBaseName(\"previousButton\")}\n focusableWhenDisabled={true}\n />\n </Tooltip>\n <Dropdown<DropdownItem>\n source={months}\n id={monthDropdownId}\n aria-labelledby={monthDropdownLabelledBy}\n aria-label=\"Month Dropdown\"\n {...MonthDropdownProps}\n ListItem={ListItemWithTooltip}\n selected={selectedMonth}\n itemToString={defaultItemToMonth}\n onSelectionChange={handleMonthSelect}\n fullWidth\n />\n {!hideYearDropdown && (\n <Dropdown<DropdownItem>\n source={years}\n id={yearDropdownId}\n aria-labelledby={yearDropdownLabelledBy}\n aria-label=\"Year Dropdown\"\n {...YearDropdownProps}\n ListItem={ListItemWithTooltip}\n selected={selectedYear}\n onSelectionChange={handleYearSelect}\n itemToString={defaultItemToYear}\n fullWidth\n />\n )}\n <Tooltip\n placement=\"top\"\n disabled={canNavigateNext}\n content=\"Future dates are out of range\"\n >\n <IconButton\n aria-label={`Next Month, ${formatDate(\n visibleMonth.add({ months: 1 })\n )}`}\n disabled={!canNavigateNext}\n icon=\"chevron-right\"\n variant=\"secondary\"\n onClick={handleNavigateNext}\n className={withBaseName(\"nextButton\")}\n focusableWhenDisabled={true}\n />\n </Tooltip>\n </div>\n );\n});\n"],"names":["makePrefixer","useCalendarContext","monthsForLocale","monthDiff","isSameMonth","isSameYear","jsx","Tooltip","ListItem","forwardRef","CalendarNavigation","useWindow","useComponentCssInjection","calendarNavigationCss","useId","clsx","formatDate","jsxs","IconButton","Dropdown"],"mappings":"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"}
1
+ {"version":3,"file":"CalendarNavigation.js","sources":["../../../src/calendar/internal/CalendarNavigation.tsx"],"sourcesContent":["import {\n ComponentPropsWithRef,\n forwardRef,\n MouseEventHandler,\n SyntheticEvent,\n} from \"react\";\nimport {\n Button,\n ButtonProps,\n makePrefixer,\n Tooltip,\n Dropdown,\n DropdownProps,\n Option,\n OptionProps,\n useListControlContext,\n} from \"@salt-ds/core\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\n\nimport { useCalendarContext } from \"./CalendarContext\";\n\nimport calendarNavigationCss from \"./CalendarNavigation.css\";\nimport { DateValue, isSameMonth, isSameYear } from \"@internationalized/date\";\nimport { formatDate, monthDiff, monthsForLocale } from \"./utils\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\n\ntype dateDropdownProps = DropdownProps<DateValue>;\n\nexport interface CalendarNavigationProps extends ComponentPropsWithRef<\"div\"> {\n MonthDropdownProps?: dateDropdownProps;\n YearDropdownProps?: dateDropdownProps;\n onMonthSelect?: dateDropdownProps[\"onChange\"];\n onYearSelect?: dateDropdownProps[\"onChange\"];\n onNavigateNext?: ButtonProps[\"onClick\"];\n onNavigatePrevious?: ButtonProps[\"onClick\"];\n hideYearDropdown?: boolean;\n}\n\ninterface OptionWithTooltipProps extends OptionProps {\n value: DateValue;\n tooltipContent: string;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarNavigation\");\n\nfunction useCalendarNavigation() {\n const {\n state: { visibleMonth, minDate, maxDate },\n helpers: {\n setVisibleMonth,\n isDayVisible,\n isOutsideAllowedYears,\n isOutsideAllowedMonths,\n },\n } = useCalendarContext();\n\n const moveToNextMonth = (event: SyntheticEvent) => {\n setVisibleMonth(event, visibleMonth.add({ months: 1 }));\n };\n\n const moveToPreviousMonth = (event: SyntheticEvent) => {\n setVisibleMonth(event, visibleMonth.subtract({ months: 1 }));\n };\n\n const moveToMonth = (event: SyntheticEvent, month: DateValue) => {\n let newMonth = month;\n\n if (!isOutsideAllowedYears(newMonth)) {\n if (isOutsideAllowedMonths(newMonth)) {\n // If month is navigable we should move to the closest navigable month\n const navigableMonths = monthsForLocale(visibleMonth).filter(\n (n) => !isOutsideAllowedMonths(n)\n );\n newMonth = navigableMonths.reduce((closestMonth, currentMonth) =>\n Math.abs(monthDiff(currentMonth, newMonth)) <\n Math.abs(monthDiff(closestMonth, newMonth))\n ? currentMonth\n : closestMonth\n );\n }\n setVisibleMonth(event, newMonth);\n }\n };\n\n const months: DateValue[] = monthsForLocale(visibleMonth);\n\n const years: DateValue[] = [-2, -1, 0, 1, 2]\n .map((delta) => visibleMonth.add({ years: delta }))\n .filter((year) => !isOutsideAllowedYears(year));\n\n const selectedMonth: DateValue | undefined = months.find((month: DateValue) =>\n isSameMonth(month, visibleMonth)\n );\n const selectedYear: DateValue | undefined = years.find((year: DateValue) =>\n isSameYear(year, visibleMonth)\n );\n\n const canNavigatePrevious = !(minDate && isDayVisible(minDate));\n const canNavigateNext = !(maxDate && isDayVisible(maxDate));\n\n return {\n moveToNextMonth,\n moveToPreviousMonth,\n moveToMonth,\n visibleMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n };\n}\n\nconst OptionWithTooltip = ({\n value,\n children,\n disabled,\n tooltipContent,\n}: OptionWithTooltipProps) => {\n const { activeState, openState } = useListControlContext();\n const open = activeState?.value === value;\n\n return (\n <Tooltip\n placement=\"right\"\n open={open && openState}\n disabled={!disabled}\n content={tooltipContent}\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Option value={value} disabled={disabled}>\n {children}\n </Option>\n </Tooltip>\n );\n};\n\nexport const CalendarNavigation = forwardRef<\n HTMLDivElement,\n CalendarNavigationProps\n>(function CalendarNavigation(props, ref) {\n const {\n className,\n MonthDropdownProps,\n YearDropdownProps,\n hideYearDropdown,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-navigation\",\n css: calendarNavigationCss,\n window: targetWindow,\n });\n\n const {\n moveToPreviousMonth,\n moveToNextMonth,\n moveToMonth,\n months,\n years,\n canNavigateNext,\n canNavigatePrevious,\n visibleMonth,\n selectedMonth,\n selectedYear,\n isOutsideAllowedMonths,\n } = useCalendarNavigation();\n\n const handleNavigatePrevious: MouseEventHandler<HTMLButtonElement> = (\n event\n ) => {\n moveToPreviousMonth(event);\n };\n\n const handleNavigateNext: MouseEventHandler<HTMLButtonElement> = (event) => {\n moveToNextMonth(event);\n };\n\n const handleMonthSelect = (event: SyntheticEvent, month: DateValue[]) => {\n moveToMonth(event, month[0]);\n };\n\n const handleYearSelect = (event: SyntheticEvent, year: DateValue[]) => {\n moveToMonth(event, year[0]);\n };\n\n const formatMonth = (date?: DateValue) => {\n return !date\n ? \"\"\n : formatDate(date, { month: hideYearDropdown ? \"long\" : \"short\" });\n };\n\n const formatYear = (date?: DateValue) => {\n return !date ? \"\" : formatDate(date, { year: \"numeric\" });\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n { [withBaseName(\"hideYearDropdown\")]: hideYearDropdown },\n className\n )}\n ref={ref}\n {...rest}\n >\n <Tooltip\n placement=\"top\"\n disabled={canNavigatePrevious}\n content=\"Past dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n disabled={!canNavigatePrevious}\n variant=\"secondary\"\n onClick={handleNavigatePrevious}\n focusableWhenDisabled={true}\n >\n <ChevronLeftIcon\n aria-label={`Previous Month, ${formatDate(\n visibleMonth.subtract({ months: 1 })\n )}`}\n />\n </Button>\n </Tooltip>\n <div className={withBaseName(\"dropdowns\")}>\n <Dropdown\n aria-label=\"Month Dropdown\"\n selected={selectedMonth ? [selectedMonth] : []}\n value={formatMonth(selectedMonth)}\n onSelectionChange={handleMonthSelect}\n {...MonthDropdownProps}\n >\n {months.map((month) => (\n <OptionWithTooltip\n key={formatMonth(month)}\n value={month}\n disabled={isOutsideAllowedMonths(month)}\n tooltipContent=\"This month is out of range\"\n >\n {formatMonth(month)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n {!hideYearDropdown && (\n <Dropdown\n aria-label=\"Year Dropdown\"\n selected={selectedYear ? [selectedYear] : []}\n value={formatYear(selectedYear)}\n onSelectionChange={handleYearSelect}\n {...YearDropdownProps}\n >\n {years.map((year) => (\n <OptionWithTooltip\n key={formatYear(year)}\n value={year}\n tooltipContent=\"This year is out of range\"\n >\n {formatYear(year)}\n </OptionWithTooltip>\n ))}\n </Dropdown>\n )}\n </div>\n <Tooltip\n placement=\"top\"\n disabled={canNavigateNext}\n content=\"Future dates are out of range\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n >\n <Button\n disabled={!canNavigateNext}\n variant=\"secondary\"\n onClick={handleNavigateNext}\n focusableWhenDisabled={true}\n >\n <ChevronRightIcon\n aria-label={`Next Month, ${formatDate(\n visibleMonth.add({ months: 1 })\n )}`}\n />\n </Button>\n </Tooltip>\n </div>\n );\n});\n"],"names":["makePrefixer","useCalendarContext","monthsForLocale","monthDiff","isSameMonth","isSameYear","useListControlContext","jsx","Tooltip","Option","forwardRef","CalendarNavigation","useWindow","useComponentCssInjection","calendarNavigationCss","formatDate","jsxs","clsx","Button","ChevronLeftIcon","Dropdown","ChevronRightIcon"],"mappings":"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"}
@@ -9,9 +9,7 @@ var Calendar = require('../calendar/Calendar.js');
9
9
  require('../calendar/internal/CalendarContext.js');
10
10
  require('../calendar/internal/utils.js');
11
11
  require('../calendar/useSelection.js');
12
- var DropdownBase = require('../dropdown/DropdownBase.js');
13
- require('../dropdown/DropdownButton.js');
14
- require('../dropdown/Dropdown.js');
12
+ var DropdownBase = require('../dropdown-base/DropdownBase.js');
15
13
  require('../common-hooks/collectionProvider.js');
16
14
  require('../common-hooks/use-resize-observer.js');
17
15
  require('@vuu-ui/vuu-utils');
@@ -1 +1 @@
1
- {"version":3,"file":"DatePopup.js","sources":["../../src/date-popup/DatePopup.tsx"],"sourcesContent":["import {\n DateValue,\n getLocalTimeZone,\n today as getTodayDate,\n} from \"@internationalized/date\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { forwardRef, HTMLAttributes } from \"react\";\nimport { Calendar, CalendarProps } from \"../calendar\";\nimport { DropdownBase, DropdownCloseHandler } from \"../dropdown\";\nimport { IconButton } from \"../icon-button\";\nimport { useDatePopup } from \"./useDatePopup\";\n\nconst classBase = \"vuuDatePopup\";\n\nexport interface DatePopupProps\n extends Pick<CalendarProps, \"selectionVariant\">,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"onKeyDown\"> {\n \"data-embedded\"?: boolean;\n selectedDate?: DateValue;\n onPopupClose?: DropdownCloseHandler;\n onPopupOpen?: () => void;\n onChange: (date: DateValue) => void;\n}\n\nconst tz = getLocalTimeZone();\nconst today = getTodayDate(tz);\n\nexport const DatePopup = forwardRef<HTMLButtonElement, DatePopupProps>(\n function DatePopup(\n {\n selectedDate,\n onChange,\n onPopupClose,\n onPopupOpen,\n selectionVariant,\n \"data-embedded\": dataEmbedded,\n ...htmlAttributes\n },\n forwardedRef\n ) {\n const {\n calendarRef,\n date,\n isOpen,\n onSelectedDateChange,\n onVisibleMonthChange,\n handleOpenChange,\n triggererRef,\n visibleMonth,\n } = useDatePopup({\n onChange,\n onPopupClose,\n onPopupOpen,\n selectedDate: selectedDate || today,\n selectionVariant,\n });\n\n return (\n <DropdownBase\n {...htmlAttributes}\n className={classBase}\n isOpen={isOpen}\n placement=\"below\"\n onOpenChange={handleOpenChange}\n >\n <IconButton\n data-embedded={dataEmbedded}\n icon=\"date\"\n ref={useForkRef(forwardedRef, triggererRef)}\n variant=\"secondary\"\n className={cx({ \"saltButton-active\": isOpen })}\n />\n <Calendar\n visibleMonth={visibleMonth}\n ref={calendarRef}\n selectedDate={date}\n selectionVariant=\"default\"\n onSelectedDateChange={onSelectedDateChange}\n onVisibleMonthChange={onVisibleMonthChange}\n className={`${classBase}-calendar`}\n />\n </DropdownBase>\n );\n }\n);\n"],"names":["getLocalTimeZone","getTodayDate","forwardRef","DatePopup","useDatePopup","jsxs","DropdownBase","jsx","IconButton","useForkRef","Calendar"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,SAAY,GAAA,cAAA,CAAA;AAYlB,MAAM,KAAKA,qBAAiB,EAAA,CAAA;AAC5B,MAAM,KAAA,GAAQC,WAAa,EAAE,CAAA,CAAA;AAEtB,MAAM,SAAY,GAAAC,gBAAA;AAAA,EACvB,SAASC,UACP,CAAA;AAAA,IACE,YAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAiB,EAAA,YAAA;AAAA,IACjB,GAAG,cAAA;AAAA,KAEL,YACA,EAAA;AACA,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,QACEC,yBAAa,CAAA;AAAA,MACf,QAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAc,YAAgB,IAAA,KAAA;AAAA,MAC9B,gBAAA;AAAA,KACD,CAAA,CAAA;AAED,IACE,uBAAAC,eAAA;AAAA,MAACC,yBAAA;AAAA,MAAA;AAAA,QACE,GAAG,cAAA;AAAA,QACJ,SAAW,EAAA,SAAA;AAAA,QACX,MAAA;AAAA,QACA,SAAU,EAAA,OAAA;AAAA,QACV,YAAc,EAAA,gBAAA;AAAA,QAEd,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAACC,qBAAA;AAAA,YAAA;AAAA,cACC,eAAe,EAAA,YAAA;AAAA,cACf,IAAK,EAAA,MAAA;AAAA,cACL,GAAA,EAAKC,eAAW,CAAA,YAAA,EAAc,YAAY,CAAA;AAAA,cAC1C,OAAQ,EAAA,WAAA;AAAA,cACR,SAAW,EAAA,EAAA,CAAG,EAAE,mBAAA,EAAqB,QAAQ,CAAA;AAAA,aAAA;AAAA,WAC/C;AAAA,0BACAF,cAAA;AAAA,YAACG,iBAAA;AAAA,YAAA;AAAA,cACC,YAAA;AAAA,cACA,GAAK,EAAA,WAAA;AAAA,cACL,YAAc,EAAA,IAAA;AAAA,cACd,gBAAiB,EAAA,SAAA;AAAA,cACjB,oBAAA;AAAA,cACA,oBAAA;AAAA,cACA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,aAAA;AAAA,WACzB;AAAA,SAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AACF;;;;"}
1
+ {"version":3,"file":"DatePopup.js","sources":["../../src/date-popup/DatePopup.tsx"],"sourcesContent":["import {\n DateValue,\n getLocalTimeZone,\n today as getTodayDate,\n} from \"@internationalized/date\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { forwardRef, HTMLAttributes } from \"react\";\nimport { Calendar, CalendarProps } from \"../calendar\";\nimport { DropdownBase, DropdownCloseHandler } from \"../dropdown-base\";\nimport { IconButton } from \"../icon-button\";\nimport { useDatePopup } from \"./useDatePopup\";\n\nconst classBase = \"vuuDatePopup\";\n\nexport interface DatePopupProps\n extends Pick<CalendarProps, \"selectionVariant\">,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"onKeyDown\"> {\n \"data-embedded\"?: boolean;\n selectedDate?: DateValue;\n onPopupClose?: DropdownCloseHandler;\n onPopupOpen?: () => void;\n onChange: (date: DateValue) => void;\n}\n\nconst tz = getLocalTimeZone();\nconst today = getTodayDate(tz);\n\nexport const DatePopup = forwardRef<HTMLButtonElement, DatePopupProps>(\n function DatePopup(\n {\n selectedDate,\n onChange,\n onPopupClose,\n onPopupOpen,\n selectionVariant,\n \"data-embedded\": dataEmbedded,\n ...htmlAttributes\n },\n forwardedRef\n ) {\n const {\n calendarRef,\n date,\n isOpen,\n onSelectedDateChange,\n onVisibleMonthChange,\n handleOpenChange,\n triggererRef,\n visibleMonth,\n } = useDatePopup({\n onChange,\n onPopupClose,\n onPopupOpen,\n selectedDate: selectedDate || today,\n selectionVariant,\n });\n\n return (\n <DropdownBase\n {...htmlAttributes}\n className={classBase}\n isOpen={isOpen}\n placement=\"below\"\n onOpenChange={handleOpenChange}\n >\n <IconButton\n data-embedded={dataEmbedded}\n icon=\"date\"\n ref={useForkRef(forwardedRef, triggererRef)}\n variant=\"secondary\"\n className={cx({ \"saltButton-active\": isOpen })}\n />\n <Calendar\n visibleMonth={visibleMonth}\n ref={calendarRef}\n selectedDate={date}\n selectionVariant=\"default\"\n onSelectedDateChange={onSelectedDateChange}\n onVisibleMonthChange={onVisibleMonthChange}\n className={`${classBase}-calendar`}\n />\n </DropdownBase>\n );\n }\n);\n"],"names":["getLocalTimeZone","getTodayDate","forwardRef","DatePopup","useDatePopup","jsxs","DropdownBase","jsx","IconButton","useForkRef","Calendar"],"mappings":";;;;;;;;;;;;;;;;;;;;AAaA,MAAM,SAAY,GAAA,cAAA,CAAA;AAYlB,MAAM,KAAKA,qBAAiB,EAAA,CAAA;AAC5B,MAAM,KAAA,GAAQC,WAAa,EAAE,CAAA,CAAA;AAEtB,MAAM,SAAY,GAAAC,gBAAA;AAAA,EACvB,SAASC,UACP,CAAA;AAAA,IACE,YAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAiB,EAAA,YAAA;AAAA,IACjB,GAAG,cAAA;AAAA,KAEL,YACA,EAAA;AACA,IAAM,MAAA;AAAA,MACJ,WAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,QACEC,yBAAa,CAAA;AAAA,MACf,QAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAc,YAAgB,IAAA,KAAA;AAAA,MAC9B,gBAAA;AAAA,KACD,CAAA,CAAA;AAED,IACE,uBAAAC,eAAA;AAAA,MAACC,yBAAA;AAAA,MAAA;AAAA,QACE,GAAG,cAAA;AAAA,QACJ,SAAW,EAAA,SAAA;AAAA,QACX,MAAA;AAAA,QACA,SAAU,EAAA,OAAA;AAAA,QACV,YAAc,EAAA,gBAAA;AAAA,QAEd,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAACC,qBAAA;AAAA,YAAA;AAAA,cACC,eAAe,EAAA,YAAA;AAAA,cACf,IAAK,EAAA,MAAA;AAAA,cACL,GAAA,EAAKC,eAAW,CAAA,YAAA,EAAc,YAAY,CAAA;AAAA,cAC1C,OAAQ,EAAA,WAAA;AAAA,cACR,SAAW,EAAA,EAAA,CAAG,EAAE,mBAAA,EAAqB,QAAQ,CAAA;AAAA,aAAA;AAAA,WAC/C;AAAA,0BACAF,cAAA;AAAA,YAACG,iBAAA;AAAA,YAAA;AAAA,cACC,YAAA;AAAA,cACA,GAAK,EAAA,WAAA;AAAA,cACL,YAAc,EAAA,IAAA;AAAA,cACd,gBAAiB,EAAA,SAAA;AAAA,cACjB,oBAAA;AAAA,cACA,oBAAA;AAAA,cACA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,aAAA;AAAA,WACzB;AAAA,SAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDatePopup.js","sources":["../../src/date-popup/useDatePopup.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { OpenChangeHandler } from \"../dropdown\";\nimport { DateValue } from \"@internationalized/date\";\nimport { DatePopupProps } from \"./DatePopup\";\n\nconst SELECTED_DAY =\n \".saltCalendarDay-selected:not(.saltCalendarDay-outOfRange)\";\n\ntype WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };\n\nexport interface DatePopupHookProps\n extends Pick<DatePopupProps, \"onPopupClose\" | \"onPopupOpen\">,\n WithRequired<DatePopupProps, \"onChange\" | \"selectedDate\"> {}\n\nexport const useDatePopup = ({\n onChange,\n onPopupClose,\n onPopupOpen,\n selectedDate,\n}: // selectionVariant,\nDatePopupHookProps) => {\n const [date, setDate] = useState<DateValue>(selectedDate);\n const [, forceUpdate] = useState({});\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const triggererRef = useRef<HTMLButtonElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n const visibleMonthRef = useRef<DateValue>(selectedDate);\n const setVisibleMonth = useMemo(() => {\n const setValue = (v: DateValue) => {\n if (v.toString() !== visibleMonthRef.current.toString()) {\n visibleMonthRef.current = v;\n forceUpdate({});\n }\n };\n setValue(selectedDate);\n return setValue;\n }, [selectedDate]);\n\n const handleOpenChange = useCallback<OpenChangeHandler>(\n (open, reason) => {\n setIsOpen(open);\n if (open) {\n onPopupOpen?.();\n requestAnimationFrame(() => {\n const el = calendarRef.current?.querySelector(\n SELECTED_DAY\n ) as HTMLElement;\n el?.focus();\n });\n } else {\n if (reason !== \"Tab\") {\n triggererRef.current?.focus();\n }\n onPopupClose?.(reason);\n }\n },\n [onPopupClose, onPopupOpen]\n );\n\n const handleDateSelection = useCallback(\n (e, date) => {\n setDate(date);\n console.log(date.toString());\n visibleMonthRef.current = date;\n handleOpenChange(false, \"select\");\n onChange(date);\n },\n [handleOpenChange, onChange]\n );\n\n const handleVisibleMonthChange = useCallback(\n (e, date) => {\n setVisibleMonth(date);\n },\n [setVisibleMonth]\n );\n\n return {\n calendarRef,\n date,\n handleOpenChange: handleOpenChange,\n isOpen,\n onSelectedDateChange: handleDateSelection,\n onVisibleMonthChange: handleVisibleMonthChange,\n triggererRef,\n visibleMonth: visibleMonthRef.current,\n };\n};\n"],"names":["useState","useRef","useMemo","useCallback","date"],"mappings":"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"}
1
+ {"version":3,"file":"useDatePopup.js","sources":["../../src/date-popup/useDatePopup.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { OpenChangeHandler } from \"../dropdown-base\";\nimport { DateValue } from \"@internationalized/date\";\nimport { DatePopupProps } from \"./DatePopup\";\n\nconst SELECTED_DAY =\n \".saltCalendarDay-selected:not(.saltCalendarDay-outOfRange)\";\n\ntype WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] };\n\nexport interface DatePopupHookProps\n extends Pick<DatePopupProps, \"onPopupClose\" | \"onPopupOpen\">,\n WithRequired<DatePopupProps, \"onChange\" | \"selectedDate\"> {}\n\nexport const useDatePopup = ({\n onChange,\n onPopupClose,\n onPopupOpen,\n selectedDate,\n}: // selectionVariant,\nDatePopupHookProps) => {\n const [date, setDate] = useState<DateValue>(selectedDate);\n const [, forceUpdate] = useState({});\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const triggererRef = useRef<HTMLButtonElement>(null);\n const calendarRef = useRef<HTMLDivElement>(null);\n\n const visibleMonthRef = useRef<DateValue>(selectedDate);\n const setVisibleMonth = useMemo(() => {\n const setValue = (v: DateValue) => {\n if (v.toString() !== visibleMonthRef.current.toString()) {\n visibleMonthRef.current = v;\n forceUpdate({});\n }\n };\n setValue(selectedDate);\n return setValue;\n }, [selectedDate]);\n\n const handleOpenChange = useCallback<OpenChangeHandler>(\n (open, reason) => {\n setIsOpen(open);\n if (open) {\n onPopupOpen?.();\n requestAnimationFrame(() => {\n const el = calendarRef.current?.querySelector(\n SELECTED_DAY\n ) as HTMLElement;\n el?.focus();\n });\n } else {\n if (reason !== \"Tab\") {\n triggererRef.current?.focus();\n }\n onPopupClose?.(reason);\n }\n },\n [onPopupClose, onPopupOpen]\n );\n\n const handleDateSelection = useCallback(\n (e, date) => {\n setDate(date);\n console.log(date.toString());\n visibleMonthRef.current = date;\n handleOpenChange(false, \"select\");\n onChange(date);\n },\n [handleOpenChange, onChange]\n );\n\n const handleVisibleMonthChange = useCallback(\n (e, date) => {\n setVisibleMonth(date);\n },\n [setVisibleMonth]\n );\n\n return {\n calendarRef,\n date,\n handleOpenChange: handleOpenChange,\n isOpen,\n onSelectedDateChange: handleDateSelection,\n onVisibleMonthChange: handleVisibleMonthChange,\n triggererRef,\n visibleMonth: visibleMonthRef.current,\n };\n};\n"],"names":["useState","useRef","useMemo","useCallback","date"],"mappings":";;;;AAKA,MAAM,YACJ,GAAA,4DAAA,CAAA;AAQK,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AACF,CACuB,KAAA;AACrB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAoB,YAAY,CAAA,CAAA;AACxD,EAAA,MAAM,GAAG,WAAW,CAAI,GAAAA,cAAA,CAAS,EAAE,CAAA,CAAA;AACnC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAkB,KAAK,CAAA,CAAA;AACnD,EAAM,MAAA,YAAA,GAAeC,aAA0B,IAAI,CAAA,CAAA;AACnD,EAAM,MAAA,WAAA,GAAcA,aAAuB,IAAI,CAAA,CAAA;AAE/C,EAAM,MAAA,eAAA,GAAkBA,aAAkB,YAAY,CAAA,CAAA;AACtD,EAAM,MAAA,eAAA,GAAkBC,cAAQ,MAAM;AACpC,IAAM,MAAA,QAAA,GAAW,CAAC,CAAiB,KAAA;AACjC,MAAA,IAAI,EAAE,QAAS,EAAA,KAAM,eAAgB,CAAA,OAAA,CAAQ,UAAY,EAAA;AACvD,QAAA,eAAA,CAAgB,OAAU,GAAA,CAAA,CAAA;AAC1B,QAAA,WAAA,CAAY,EAAE,CAAA,CAAA;AAAA,OAChB;AAAA,KACF,CAAA;AACA,IAAA,QAAA,CAAS,YAAY,CAAA,CAAA;AACrB,IAAO,OAAA,QAAA,CAAA;AAAA,GACT,EAAG,CAAC,YAAY,CAAC,CAAA,CAAA;AAEjB,EAAA,MAAM,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CAAC,MAAM,MAAW,KAAA;AAChB,MAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AACd,MAAA,IAAI,IAAM,EAAA;AACR,QAAc,WAAA,IAAA,CAAA;AACd,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAM,MAAA,EAAA,GAAK,YAAY,OAAS,EAAA,aAAA;AAAA,YAC9B,YAAA;AAAA,WACF,CAAA;AACA,UAAA,EAAA,EAAI,KAAM,EAAA,CAAA;AAAA,SACX,CAAA,CAAA;AAAA,OACI,MAAA;AACL,QAAA,IAAI,WAAW,KAAO,EAAA;AACpB,UAAA,YAAA,CAAa,SAAS,KAAM,EAAA,CAAA;AAAA,SAC9B;AACA,QAAA,YAAA,GAAe,MAAM,CAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAAA,IACA,CAAC,cAAc,WAAW,CAAA;AAAA,GAC5B,CAAA;AAEA,EAAA,MAAM,mBAAsB,GAAAA,iBAAA;AAAA,IAC1B,CAAC,GAAGC,KAAS,KAAA;AACX,MAAA,OAAA,CAAQA,KAAI,CAAA,CAAA;AACZ,MAAQ,OAAA,CAAA,GAAA,CAAIA,KAAK,CAAA,QAAA,EAAU,CAAA,CAAA;AAC3B,MAAA,eAAA,CAAgB,OAAUA,GAAAA,KAAAA,CAAAA;AAC1B,MAAA,gBAAA,CAAiB,OAAO,QAAQ,CAAA,CAAA;AAChC,MAAA,QAAA,CAASA,KAAI,CAAA,CAAA;AAAA,KACf;AAAA,IACA,CAAC,kBAAkB,QAAQ,CAAA;AAAA,GAC7B,CAAA;AAEA,EAAA,MAAM,wBAA2B,GAAAD,iBAAA;AAAA,IAC/B,CAAC,GAAGC,KAAS,KAAA;AACX,MAAA,eAAA,CAAgBA,KAAI,CAAA,CAAA;AAAA,KACtB;AAAA,IACA,CAAC,eAAe,CAAA;AAAA,GAClB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,IAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,oBAAsB,EAAA,mBAAA;AAAA,IACtB,oBAAsB,EAAA,wBAAA;AAAA,IACtB,YAAA;AAAA,IACA,cAAc,eAAgB,CAAA,OAAA;AAAA,GAChC,CAAA;AACF;;;;"}
@@ -3,4 +3,4 @@
3
3
  var dropdownBaseCss = ".vuuDropdown {\n --saltIcon-margin: 2px 0 0 8px;\n --saltButton-height: var(--vuuDropdown-height);\n --saltButton-width : var(--vuuDropdown-width);\n\n line-height: 0;\n position: relative;\n\n}\n\n.vuuDropdownButton.saltButton-secondary {\n --saltButton-background: var(--salt-editable-background);\n --saltButton-color: var(--salt-editable-foreground);\n --saltButton-borderStyle: solid;\n --saltButton-borderColor: var(--salt-editable-borderColor);\n --saltButton-borderWidth: 1px;\n}\n\n.vuuDropdown-fullWidth {\n width: 100%;\n}\n\n.vuuDropdown-popup {\n background: var(--salt-container-primary-background);\n z-index: calc(var(--salt-zIndex-flyover) - 1);\n}\n\n.vuuDropdown-popup-component {\n --vuuList-borderStyle: none;\n}\n";
4
4
 
5
5
  module.exports = dropdownBaseCss;
6
- //# sourceMappingURL=Dropdown.css.js.map
6
+ //# sourceMappingURL=DropdownBase.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownBase.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -10,11 +10,11 @@ var window = require('@salt-ds/window');
10
10
  var React = require('react');
11
11
  var forwardCallbackProps = require('../utils/forwardCallbackProps.js');
12
12
  var useDropdownBase = require('./useDropdownBase.js');
13
- var Dropdown = require('./Dropdown.css.js');
13
+ var DropdownBase$1 = require('./DropdownBase.css.js');
14
14
 
15
15
  const classBase = "vuuDropdown";
16
16
  const DropdownBase = React.forwardRef(
17
- function Dropdown$1({
17
+ function Dropdown({
18
18
  PopupProps,
19
19
  "aria-labelledby": ariaLabelledByProp,
20
20
  children,
@@ -36,7 +36,7 @@ const DropdownBase = React.forwardRef(
36
36
  const targetWindow = window.useWindow();
37
37
  styles.useComponentCssInjection({
38
38
  testId: "vuu-dropdown-base",
39
- css: Dropdown,
39
+ css: DropdownBase$1,
40
40
  window: targetWindow
41
41
  });
42
42
  const rootRef = React.useRef(null);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropdownBase.js","sources":["../../src/dropdown-base/DropdownBase.tsx"],"sourcesContent":["import { PopupComponent as Popup, Portal } from \"@vuu-ui/vuu-popups\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport { useForkRef } from \"@salt-ds/core\";\nimport cx from \"clsx\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { Children, cloneElement, forwardRef, useRef } from \"react\";\nimport { forwardCallbackProps } from \"../utils\";\nimport { DropdownBaseProps } from \"./dropdownTypes\";\nimport { useDropdownBase } from \"./useDropdownBase\";\n\nimport dropdownBaseCss from \"./DropdownBase.css\";\n\n// Any component may be passed as our trigger or popup component.\n// Define the common props that we will act on, if present,\n// so we can type them.\nexport type MaybeChildProps = {\n className?: string;\n id?: string;\n role?: string;\n width: number | string;\n};\n\nconst classBase = \"vuuDropdown\";\n\nexport const DropdownBase = forwardRef<HTMLDivElement, DropdownBaseProps>(\n function Dropdown(\n {\n PopupProps,\n \"aria-labelledby\": ariaLabelledByProp,\n children,\n className: classNameProp,\n defaultIsOpen,\n disabled,\n fullWidth,\n id: idProp,\n isOpen: isOpenProp,\n onKeyDown,\n onOpenChange,\n openKeys,\n openOnFocus,\n placement = \"below-full-width\",\n popupWidth,\n width,\n ...htmlAttributes\n },\n forwardedRef\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-dropdown-base\",\n css: dropdownBaseCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const className = cx(classBase, classNameProp, {\n [`${classBase}-fullWidth`]: fullWidth,\n [`${classBase}-disabled`]: disabled,\n });\n const [trigger, popupComponent] = Children.toArray(\n children\n ) as JSX.Element[];\n const id = useId(idProp);\n\n const { componentProps, isOpen, popupComponentRef, triggerProps } =\n useDropdownBase({\n ariaLabelledBy: ariaLabelledByProp,\n defaultIsOpen,\n disabled,\n fullWidth,\n id,\n isOpen: isOpenProp,\n onOpenChange,\n onKeyDown,\n openKeys,\n openOnFocus,\n popupComponent,\n popupWidth,\n rootRef,\n width,\n });\n\n const getTriggerComponent = () => {\n const {\n id: defaultId,\n role: defaultRole,\n ...restTriggerProps\n } = triggerProps;\n\n const {\n id = defaultId,\n role = defaultRole,\n ...ownProps\n } = trigger.props as MaybeChildProps;\n\n return cloneElement(\n trigger,\n forwardCallbackProps(ownProps, {\n ...restTriggerProps,\n id,\n role,\n })\n );\n };\n\n const getPopupComponent = () => {\n const { id: defaultId, width, ...restComponentProps } = componentProps;\n const {\n className,\n id = defaultId,\n width: ownWidth,\n ...ownProps\n } = popupComponent.props as MaybeChildProps;\n\n return cloneElement(popupComponent, {\n ...ownProps,\n ...restComponentProps,\n className: cx(className, `${classBase}-popup-component`),\n id,\n ref: popupComponentRef,\n width: placement.endsWith(\"full-width\") ? \"auto\" : ownWidth ?? width,\n });\n };\n\n const ref = useForkRef(rootRef, forwardedRef);\n\n return (\n <div {...htmlAttributes} className={className} id={idProp} ref={ref}>\n {getTriggerComponent()}\n {isOpen && (\n <Portal>\n <Popup\n {...PopupProps}\n anchorElement={rootRef}\n placement={placement}\n >\n {getPopupComponent()}\n </Popup>\n </Portal>\n )}\n </div>\n );\n }\n);\n"],"names":["forwardRef","useWindow","useComponentCssInjection","dropdownBaseCss","useRef","Children","useId","useDropdownBase","id","cloneElement","forwardCallbackProps","width","className","useForkRef","Portal","jsx","Popup"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClickAway.js","sources":["../../src/dropdown-base/useClickAway.ts"],"sourcesContent":["import { queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { CloseReason } from \"./dropdownTypes\";\n\nexport type ClickawayHook = (props: {\n popperRef: RefObject<HTMLElement>;\n rootRef: RefObject<HTMLElement>;\n isOpen: boolean;\n onClose: (reason: CloseReason) => void;\n}) => void;\n\ntype MouseEventHandler = (e: MouseEvent) => void;\ntype KeyboardEventHandler = (e: KeyboardEvent) => void;\n\nconst NO_HANDLERS: [MouseEventHandler?, KeyboardEventHandler?] = [];\n\nexport const targetWithinSubPopup = (\n source: HTMLElement | null,\n target: HTMLElement\n) => {\n if (source === null) {\n return false;\n }\n\n const sourcePortal = queryClosest(source, \".vuuPortal\");\n const targetPortal = queryClosest(target, \".vuuPortal\");\n\n if (sourcePortal && targetPortal) {\n // If we have two portals, this can only be a popup launched from a popup.\n // There will be a relationship, described by aria attributes.\n const targetWithId = targetPortal.querySelector(\"[id]\");\n const targetOwner = sourcePortal.querySelector(\n `[aria-owns=\"${targetWithId?.id}\"]`\n );\n return targetOwner !== null;\n }\n\n return false;\n};\n\nexport const useClickAway: ClickawayHook = ({\n popperRef,\n rootRef,\n isOpen,\n onClose,\n}) => {\n //TODO usePropBackedRef\n const openRef = useRef(isOpen);\n useEffect(() => {\n openRef.current = isOpen;\n }, [isOpen]);\n\n useEffect(() => {\n const [clickHandler, escapeKeyHandler] = isOpen\n ? [\n (evt: MouseEvent) => {\n console.log(\"click away\");\n const targetElement = evt.target as HTMLElement;\n if (\n !popperRef.current?.contains(targetElement) &&\n !rootRef.current?.contains(targetElement)\n ) {\n if (!targetWithinSubPopup(popperRef.current, targetElement)) {\n onClose(\"click-away\");\n }\n }\n },\n (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n if (openRef.current) {\n onClose(\"Escape\");\n e.stopPropagation();\n }\n }\n },\n ]\n : NO_HANDLERS;\n\n if (clickHandler && escapeKeyHandler) {\n document.body.addEventListener(\"mousedown\", clickHandler, true);\n document.body.addEventListener(\"keydown\", escapeKeyHandler, true);\n }\n\n return () => {\n if (clickHandler && escapeKeyHandler) {\n document.body.removeEventListener(\"mousedown\", clickHandler, true);\n document.body.removeEventListener(\"keydown\", escapeKeyHandler, true);\n }\n };\n }, [isOpen, onClose, popperRef, rootRef]);\n};\n"],"names":["queryClosest","useRef","useEffect"],"mappings":";;;;;AAcA,MAAM,cAA2D,EAAC,CAAA;AAErD,MAAA,oBAAA,GAAuB,CAClC,MAAA,EACA,MACG,KAAA;AACH,EAAA,IAAI,WAAW,IAAM,EAAA;AACnB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,YAAA,GAAeA,qBAAa,CAAA,MAAA,EAAQ,YAAY,CAAA,CAAA;AACtD,EAAM,MAAA,YAAA,GAAeA,qBAAa,CAAA,MAAA,EAAQ,YAAY,CAAA,CAAA;AAEtD,EAAA,IAAI,gBAAgB,YAAc,EAAA;AAGhC,IAAM,MAAA,YAAA,GAAe,YAAa,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AACtD,IAAA,MAAM,cAAc,YAAa,CAAA,aAAA;AAAA,MAC/B,CAAA,YAAA,EAAe,cAAc,EAAE,CAAA,EAAA,CAAA;AAAA,KACjC,CAAA;AACA,IAAA,OAAO,WAAgB,KAAA,IAAA,CAAA;AAAA,GACzB;AAEA,EAAO,OAAA,KAAA,CAAA;AACT,EAAA;AAEO,MAAM,eAA8B,CAAC;AAAA,EAC1C,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AACF,CAAM,KAAA;AAEJ,EAAM,MAAA,OAAA,GAAUC,aAAO,MAAM,CAAA,CAAA;AAC7B,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAU,GAAA,MAAA,CAAA;AAAA,GACpB,EAAG,CAAC,MAAM,CAAC,CAAA,CAAA;AAEX,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,CAAC,YAAA,EAAc,gBAAgB,CAAA,GAAI,MACrC,GAAA;AAAA,MACE,CAAC,GAAoB,KAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,YAAY,CAAA,CAAA;AACxB,QAAA,MAAM,gBAAgB,GAAI,CAAA,MAAA,CAAA;AAC1B,QACE,IAAA,CAAC,SAAU,CAAA,OAAA,EAAS,QAAS,CAAA,aAAa,CAC1C,IAAA,CAAC,OAAQ,CAAA,OAAA,EAAS,QAAS,CAAA,aAAa,CACxC,EAAA;AACA,UAAA,IAAI,CAAC,oBAAA,CAAqB,SAAU,CAAA,OAAA,EAAS,aAAa,CAAG,EAAA;AAC3D,YAAA,OAAA,CAAQ,YAAY,CAAA,CAAA;AAAA,WACtB;AAAA,SACF;AAAA,OACF;AAAA,MACA,CAAC,CAAqB,KAAA;AACpB,QAAI,IAAA,CAAA,CAAE,QAAQ,QAAU,EAAA;AACtB,UAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,YAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAChB,YAAA,CAAA,CAAE,eAAgB,EAAA,CAAA;AAAA,WACpB;AAAA,SACF;AAAA,OACF;AAAA,KAEF,GAAA,WAAA,CAAA;AAEJ,IAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACpC,MAAA,QAAA,CAAS,IAAK,CAAA,gBAAA,CAAiB,WAAa,EAAA,YAAA,EAAc,IAAI,CAAA,CAAA;AAC9D,MAAA,QAAA,CAAS,IAAK,CAAA,gBAAA,CAAiB,SAAW,EAAA,gBAAA,EAAkB,IAAI,CAAA,CAAA;AAAA,KAClE;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,gBAAgB,gBAAkB,EAAA;AACpC,QAAA,QAAA,CAAS,IAAK,CAAA,mBAAA,CAAoB,WAAa,EAAA,YAAA,EAAc,IAAI,CAAA,CAAA;AACjE,QAAA,QAAA,CAAS,IAAK,CAAA,mBAAA,CAAoB,SAAW,EAAA,gBAAA,EAAkB,IAAI,CAAA,CAAA;AAAA,OACrE;AAAA,KACF,CAAA;AAAA,KACC,CAAC,MAAA,EAAQ,OAAS,EAAA,SAAA,EAAW,OAAO,CAAC,CAAA,CAAA;AAC1C;;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDropdownBase.js","sources":["../../src/dropdown-base/useDropdownBase.ts"],"sourcesContent":["import { useControlled, useForkRef } from \"@salt-ds/core\";\nimport {\n FocusEventHandler,\n KeyboardEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { measurements, useResizeObserver, WidthOnly } from \"../common-hooks\";\nimport {\n CloseReason,\n DropdownHookProps,\n DropdownHookResult,\n DropdownOpenKey,\n} from \"./dropdownTypes\";\nimport { useClickAway, targetWithinSubPopup } from \"./useClickAway\";\n\nconst NO_OBSERVER: string[] = [];\n\nexport const useDropdownBase = ({\n defaultIsOpen,\n disabled,\n // TODO check how we're using fullWidth, do we need a separate value for the popup component\n fullWidth: fullWidthProp,\n id,\n isOpen: isOpenProp,\n onOpenChange,\n onKeyDown: onKeyDownProp,\n openKeys = [\"Enter\", \"ArrowDown\", \" \"],\n openOnFocus,\n popupComponent,\n popupWidth: popupWidthProp,\n rootRef,\n width,\n}: DropdownHookProps): DropdownHookResult => {\n const justFocused = useRef<number | null>(null);\n const popperRef = useRef<HTMLElement | null>(null);\n\n const [isOpen, setIsOpen] = useControlled({\n controlled: isOpenProp,\n default: Boolean(defaultIsOpen),\n name: \"useDropdown\",\n state: \"isOpen\",\n });\n const [popup, setPopup] = useState<measurements>({\n width: popupWidthProp ?? width ?? 0,\n });\n\n const showDropdown = useCallback(() => {\n setIsOpen(true);\n onOpenChange?.(true);\n }, [onOpenChange, setIsOpen]);\n\n const hideDropdown = useCallback(\n (reason: CloseReason) => {\n console.log(`hide dropdown ${reason}`);\n setIsOpen(false);\n onOpenChange?.(false, reason);\n },\n [onOpenChange, setIsOpen]\n );\n\n // Focus is not usually applied to the popped up component, we\n // manipulate active descendant whilst keeping focus in the\n // trigger. Some component, like Calendar ARE focussed, as they\n // have more complicated navigation. In these cases, we need to\n // listen for focus out.\n const handleComponentFocusOut = useCallback(\n (evt: FocusEvent) => {\n const target = evt.relatedTarget as HTMLElement;\n if (target === null) {\n // if component sets focus on a timeout (as calendar does when\n // transitioning month) wait before testing\n requestAnimationFrame(() => {\n if (!popperRef.current?.contains(document.activeElement)) {\n hideDropdown(\"Tab\");\n }\n });\n } else if (!popperRef.current?.contains(target)) {\n if (!targetWithinSubPopup(popperRef.current, target)) {\n hideDropdown(\"Tab\");\n }\n }\n },\n [hideDropdown]\n );\n\n const popperCallbackRef = useCallback(\n (element: HTMLElement | null) => {\n if (element) {\n element.addEventListener(\"focusout\", handleComponentFocusOut);\n } else if (popperRef.current) {\n popperRef.current.removeEventListener(\n \"focusout\",\n handleComponentFocusOut\n );\n }\n popperRef.current = element;\n },\n [handleComponentFocusOut]\n );\n\n useClickAway({\n popperRef,\n rootRef,\n isOpen,\n onClose: hideDropdown,\n });\n\n const handleTriggerFocus = useCallback(() => {\n if (!disabled) {\n if (openOnFocus) {\n setIsOpen(true);\n onOpenChange?.(true);\n // Suppress response to click if click was the cause of focus\n justFocused.current = window.setTimeout(() => {\n justFocused.current = null;\n }, 1000);\n }\n }\n }, [disabled, onOpenChange, openOnFocus, setIsOpen]);\n\n const handleTriggerToggle = useCallback(\n (e: MouseEvent) => {\n // Do not trigger menu open for 'Enter' and 'SPACE' key as they're handled in `handleKeyDown`\n if (\n [\"Enter\", \" \"].indexOf(\n (e as unknown as KeyboardEvent<HTMLDivElement>).key\n ) === -1\n ) {\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n onOpenChange?.(newIsOpen);\n }\n },\n [isOpen, setIsOpen, onOpenChange]\n );\n\n const handleKeydown = useCallback(\n (evt: KeyboardEvent<HTMLElement>) => {\n if (/* evt.key === \"Tab\" || */ evt.key === \"Escape\" && isOpen) {\n // No preventDefault for Tab, but if we've handled Escape, we should own it\n if (evt.key === \"Escape\") {\n evt.stopPropagation();\n evt.preventDefault();\n }\n hideDropdown(evt.key);\n } else if (openKeys.includes(evt.key as DropdownOpenKey) && !isOpen) {\n evt.preventDefault();\n showDropdown();\n } else {\n onKeyDownProp?.(evt);\n }\n },\n [hideDropdown, isOpen, onKeyDownProp, openKeys, showDropdown]\n );\n\n const handleBlur = useCallback<FocusEventHandler<HTMLElement>>(\n (evt) => {\n if (isOpen) {\n if (popperRef.current?.contains(evt.relatedTarget)) {\n // ignore\n } else {\n hideDropdown(\"blur\");\n }\n }\n },\n [hideDropdown, isOpen]\n );\n\n const fullWidth = fullWidthProp ?? false;\n const measurements = fullWidth ? WidthOnly : NO_OBSERVER;\n useResizeObserver(rootRef, measurements, setPopup, fullWidth);\n\n const componentId = `${id}-dropdown`;\n\n // TODO do we use aria-popup - valid values are menu, disloag, grid, tree, listbox\n const triggerProps = {\n \"aria-expanded\": isOpen,\n \"aria-owns\": isOpen ? componentId : undefined,\n id: `${id}-control`,\n onClick: disabled || openOnFocus ? undefined : handleTriggerToggle,\n onFocus: handleTriggerFocus,\n role: \"listbox\",\n onBlur: handleBlur,\n onKeyDown: disabled ? undefined : handleKeydown,\n style: { width: fullWidth ? undefined : width },\n };\n\n const dropdownComponentProps = {\n id: componentId,\n width: popup.width,\n };\n\n const popupComponentRef = useForkRef(popperCallbackRef, popupComponent.ref);\n\n return {\n componentProps: dropdownComponentProps,\n popupComponentRef,\n isOpen,\n label: \"Dropdown Button\",\n triggerProps,\n };\n};\n"],"names":["useRef","useControlled","useState","useCallback","targetWithinSubPopup","useClickAway","measurements","WidthOnly","useResizeObserver","useForkRef"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -4,7 +4,6 @@ var Calendar = require('./calendar/Calendar.js');
4
4
  var useCalendarDay = require('./calendar/useCalendarDay.js');
5
5
  var useCalendar = require('./calendar/useCalendar.js');
6
6
  var useSelection = require('./calendar/useSelection.js');
7
- var ComboBox = require('./combo-box/ComboBox.js');
8
7
  var collectionProvider = require('./common-hooks/collectionProvider.js');
9
8
  var itemToString = require('./common-hooks/itemToString.js');
10
9
  var useCollectionItems = require('./common-hooks/useCollectionItems.js');
@@ -22,18 +21,14 @@ var useDragDrop = require('./drag-drop/useDragDrop.js');
22
21
  var dropTargetUtils = require('./drag-drop/drop-target-utils.js');
23
22
  var useGlobalDragDrop = require('./drag-drop/useGlobalDragDrop.js');
24
23
  var DatePopup = require('./date-popup/DatePopup.js');
25
- var DropdownBase = require('./dropdown/DropdownBase.js');
26
- var DropdownButton = require('./dropdown/DropdownButton.js');
27
- var Dropdown = require('./dropdown/Dropdown.js');
28
- var useDropdownBase = require('./dropdown/useDropdownBase.js');
24
+ var DropdownBase = require('./dropdown-base/DropdownBase.js');
25
+ var useDropdownBase = require('./dropdown-base/useDropdownBase.js');
29
26
  var editableUtils = require('./editable/editable-utils.js');
30
27
  var useEditableText = require('./editable/useEditableText.js');
31
28
  var EditableLabel = require('./editable-label/EditableLabel.js');
32
29
  var ExpandoInput = require('./expando-input/ExpandoInput.js');
33
30
  var Icon = require('./icon-button/Icon.js');
34
31
  var IconButton = require('./icon-button/IconButton.js');
35
- var Checkbox = require('./inputs/Checkbox.js');
36
- var RadioButton = require('./inputs/RadioButton.js');
37
32
  var InstrumentPicker = require('./instrument-picker/InstrumentPicker.js');
38
33
  var InstrumentSearch = require('./instrument-search/InstrumentSearch.js');
39
34
  var keyUtils = require('./list/common-hooks/keyUtils.js');
@@ -80,7 +75,6 @@ exports.useCalendarDay = useCalendarDay.useCalendarDay;
80
75
  exports.useCalendar = useCalendar.useCalendar;
81
76
  exports.useSelectionCalendar = useSelection.useSelectionCalendar;
82
77
  exports.useSelectionDay = useSelection.useSelectionDay;
83
- exports.ComboBox = ComboBox.ComboBox;
84
78
  exports.CollectionContext = collectionProvider.CollectionContext;
85
79
  exports.CollectionProvider = collectionProvider.CollectionProvider;
86
80
  exports.useCollection = collectionProvider.useCollection;
@@ -127,8 +121,6 @@ exports.removeDraggedItem = dropTargetUtils.removeDraggedItem;
127
121
  exports.useGlobalDragDrop = useGlobalDragDrop.useGlobalDragDrop;
128
122
  exports.DatePopup = DatePopup.DatePopup;
129
123
  exports.DropdownBase = DropdownBase.DropdownBase;
130
- exports.DropdownButton = DropdownButton.DropdownButton;
131
- exports.Dropdown = Dropdown.Dropdown;
132
124
  exports.useDropdownBase = useDropdownBase.useDropdownBase;
133
125
  exports.buildValidationChecker = editableUtils.buildValidationChecker;
134
126
  exports.WarnCommit = useEditableText.WarnCommit;
@@ -138,8 +130,6 @@ exports.NullEditAPI = EditableLabel.NullEditAPI;
138
130
  exports.ExpandoInput = ExpandoInput.ExpandoInput;
139
131
  exports.Icon = Icon.Icon;
140
132
  exports.IconButton = IconButton.IconButton;
141
- exports.Checkbox = Checkbox.Checkbox;
142
- exports.RadioButton = RadioButton.RadioButton;
143
133
  exports.InstrumentPicker = InstrumentPicker.InstrumentPicker;
144
134
  exports.InstrumentSearch = InstrumentSearch.InstrumentSearch;
145
135
  exports.ArrowDown = keyUtils.ArrowDown;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -7,9 +7,7 @@ var core = require('@salt-ds/core');
7
7
  var styles = require('@salt-ds/styles');
8
8
  var window = require('@salt-ds/window');
9
9
  var React = require('react');
10
- var DropdownBase = require('../dropdown/DropdownBase.js');
11
- require('../dropdown/DropdownButton.js');
12
- require('../dropdown/Dropdown.js');
10
+ var DropdownBase = require('../dropdown-base/DropdownBase.js');
13
11
  require('../common-hooks/collectionProvider.js');
14
12
  require('../common-hooks/use-resize-observer.js');
15
13
  var SearchCell = require('./SearchCell.js');