@sprinklrjs/spaceweb 14.15.1 → 14.16.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 (80) hide show
  1. package/baseui/timepicker/timepicker.js +5 -5
  2. package/baseui/timepicker/types.d.ts +5 -0
  3. package/color-picker/ColorPalette.js +20 -3
  4. package/color-picker/GradientColorPicker.js +4 -1
  5. package/color-picker/Swatch.d.ts +3 -1
  6. package/color-picker/Swatch.js +8 -5
  7. package/color-picker/handleSwatchGroupKeyDown.d.ts +7 -0
  8. package/color-picker/handleSwatchGroupKeyDown.js +43 -0
  9. package/date-picker/DateInput.d.ts +4 -1
  10. package/date-picker/DateInput.js +7 -5
  11. package/date-picker/TimeInput.d.ts +6 -1
  12. package/date-picker/TimeInput.js +2 -2
  13. package/esm/baseui/timepicker/timepicker.js +5 -5
  14. package/esm/baseui/timepicker/types.d.ts +5 -0
  15. package/esm/color-picker/ColorPalette.js +20 -3
  16. package/esm/color-picker/GradientColorPicker.js +4 -1
  17. package/esm/color-picker/Swatch.d.ts +3 -1
  18. package/esm/color-picker/Swatch.js +8 -5
  19. package/esm/color-picker/handleSwatchGroupKeyDown.d.ts +7 -0
  20. package/esm/color-picker/handleSwatchGroupKeyDown.js +39 -0
  21. package/esm/date-picker/DateInput.d.ts +4 -1
  22. package/esm/date-picker/DateInput.js +7 -5
  23. package/esm/date-picker/TimeInput.d.ts +6 -1
  24. package/esm/date-picker/TimeInput.js +2 -2
  25. package/esm/list/divider.js +1 -1
  26. package/esm/list/list-item.js +14 -9
  27. package/esm/locale/en_US.js +5 -0
  28. package/esm/locale/types.d.ts +3 -0
  29. package/esm/menu/useKeyboardNavigation.js +10 -3
  30. package/esm/menu/useStatefulMenu.js +14 -8
  31. package/esm/modal/modal.js +2 -2
  32. package/esm/phone-input/country-select.js +1 -0
  33. package/esm/phone-input/flag-container.d.ts +1 -1
  34. package/esm/phone-input/flag-container.js +4 -4
  35. package/esm/phone-input/locale.d.ts +2 -0
  36. package/esm/phone-input/phone-input.js +4 -2
  37. package/esm/phone-input/types.d.ts +1 -1
  38. package/esm/phone-input/utils.d.ts +3 -0
  39. package/esm/phone-input/utils.js +13 -0
  40. package/esm/select/overlaySelect/hooks/useOverlaySelectOverrides.js +3 -0
  41. package/esm/select/selectMenuAdapter/CollapsibleSelectMenu.js +15 -7
  42. package/esm/select/selectMenuAdapter/NestedSelectMenuAdapter.js +1 -1
  43. package/esm/select/selectMenuAdapter/SelectMenuAdapter.js +8 -6
  44. package/esm/select/styled-component.js +3 -3
  45. package/esm/slider/slider.d.ts +1 -1
  46. package/esm/slider/slider.js +12 -2
  47. package/esm/slider/types.d.ts +3 -0
  48. package/esm/time-range-picker/RangeSelectorContainer.js +1 -1
  49. package/esm/time-range-picker/types.d.ts +1 -0
  50. package/esm/time-zone-picker/types.d.ts +1 -0
  51. package/esm/tooltip/actionable-tooltip.js +2 -1
  52. package/list/divider.js +1 -1
  53. package/list/list-item.js +14 -9
  54. package/locale/en_US.js +5 -0
  55. package/locale/types.d.ts +3 -0
  56. package/menu/useKeyboardNavigation.js +10 -3
  57. package/menu/useStatefulMenu.js +14 -8
  58. package/modal/modal.js +2 -2
  59. package/package.json +2 -4
  60. package/phone-input/country-select.js +1 -0
  61. package/phone-input/flag-container.d.ts +1 -1
  62. package/phone-input/flag-container.js +3 -3
  63. package/phone-input/locale.d.ts +2 -0
  64. package/phone-input/phone-input.js +3 -1
  65. package/phone-input/types.d.ts +1 -1
  66. package/phone-input/utils.d.ts +3 -0
  67. package/phone-input/utils.js +16 -1
  68. package/select/overlaySelect/hooks/useOverlaySelectOverrides.js +3 -0
  69. package/select/selectMenuAdapter/CollapsibleSelectMenu.js +14 -6
  70. package/select/selectMenuAdapter/NestedSelectMenuAdapter.js +1 -1
  71. package/select/selectMenuAdapter/SelectMenuAdapter.js +8 -6
  72. package/select/styled-component.js +3 -3
  73. package/slider/slider.d.ts +1 -1
  74. package/slider/slider.js +12 -2
  75. package/slider/types.d.ts +3 -0
  76. package/time-range-picker/RangeSelectorContainer.js +1 -1
  77. package/time-range-picker/types.d.ts +1 -0
  78. package/time-zone-picker/types.d.ts +1 -0
  79. package/tooltip/actionable-tooltip.js +2 -1
  80. package/tsconfig.build.tsbuildinfo +1 -1
@@ -18,6 +18,7 @@ export type TimezonePickerProps = {
18
18
  modernZonesOnly?: boolean;
19
19
  className?: ClassName;
20
20
  style?: Styles;
21
+ 'aria-label'?: string;
21
22
  };
22
23
  export type TimeRangeListProps = {
23
24
  timeRangePresets: TimeRangePreset[];
@@ -24,6 +24,7 @@ export type TimezonePickerProps = {
24
24
  size?: Size;
25
25
  clearable?: boolean;
26
26
  placeholder?: string;
27
+ 'aria-label'?: string;
27
28
  /**
28
29
  * When true, filters out deprecated timezone abbreviations (e.g., EST, PST, CET)
29
30
  * and shows only modern IANA timezone identifiers (e.g., America/New_York).
@@ -5,6 +5,7 @@ import { Button } from '../button';
5
5
  import { Stack, StackItem } from '../stack';
6
6
  import { Typography } from '../typography';
7
7
  import { StatefulPopover } from '../popover';
8
+ import { ACCESSIBILITY_TYPE } from '../baseui/popover';
8
9
  /** @deprecated */
9
10
  var ActionableTooltip = function (_a) {
10
11
  var action = _a.action, renderFooter = _a.renderFooter, content = _a.content, children = _a.children, restProps = __rest(_a, ["action", "renderFooter", "content", "children"]);
@@ -16,6 +17,6 @@ var ActionableTooltip = function (_a) {
16
17
  return renderPopoverContent(content({ close: close }));
17
18
  }
18
19
  : renderPopoverContent(content);
19
- return (_jsx(StatefulPopover, __assign({ content: el, showArrow: true, autoFocus: false, triggerType: "hover" }, restProps, { children: children })));
20
+ return (_jsx(StatefulPopover, __assign({ content: el, showArrow: true, autoFocus: false, triggerType: "hover", accessibilityType: ACCESSIBILITY_TYPE.tooltip }, restProps, { children: children })));
20
21
  };
21
22
  export default ActionableTooltip;
package/list/divider.js CHANGED
@@ -16,7 +16,7 @@ var Divider = (0, react_1.forwardRef)(function (_a, ref) {
16
16
  'spr-border-primary border-solid border-b-0 border-l-0 border-r-0 mx-0 rounded-0',
17
17
  first ? 'border-t-0 pt-0' : 'border-t',
18
18
  className,
19
- ], role: "presentation" }, propsWithoutContainerAria, subHeaderProps, { ref: ref }, { children: children }))) : ((0, jsx_runtime_1.jsx)(Separator, tslib_1.__assign({ "data-spaceweb": "divider", role: "presentation", className: className }, propsWithoutContainerAria, { ref: ref }, separatorProps)));
19
+ ] }, propsWithoutContainerAria, subHeaderProps, { ref: ref, role: "presentation" }, { children: children }))) : ((0, jsx_runtime_1.jsx)(Separator, tslib_1.__assign({ "data-spaceweb": "divider", className: className }, propsWithoutContainerAria, { ref: ref }, separatorProps, { role: "presentation" })));
20
20
  });
21
21
  Divider.displayName = 'Divider';
22
22
  exports.default = Divider;
package/list/list-item.js CHANGED
@@ -11,8 +11,10 @@ var styled_component_1 = require("./styled-component");
11
11
  var useFocusVisible_1 = require("../hooks/useFocusVisible");
12
12
  var tooltip_1 = require("../tooltip");
13
13
  var useListItemTooltip_1 = tslib_1.__importStar(require("./useListItemTooltip"));
14
+ var utils_1 = require("./utils");
14
15
  var ListItem = React.forwardRef(function (_a, ref) {
15
- var startEnhancer = _a.startEnhancer, children = _a.children, className = _a.className, style = _a.style, _b = _a.alignItems, alignItems = _b === void 0 ? 'center' : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c, endEnhancer = _a.endEnhancer, _d = _a.selected, selected = _d === void 0 ? false : _d, _e = _a.highlighted, highlighted = _e === void 0 ? false : _e, _f = _a.autoFocus, autoFocus = _f === void 0 ? false : _f, _g = _a.button, button = _g === void 0 ? false : _g, _h = _a.overrides, overrides = _h === void 0 ? {} : _h, _j = _a.tabIndex, tabIndex = _j === void 0 ? button ? 0 : undefined : _j, _k = _a.$as, $as = _k === void 0 ? 'li' : _k, onClick = _a.onClick, onKeyDown = _a.onKeyDown, onFocus = _a.onFocus, onBlur = _a.onBlur, _l = _a.tooltipContent, tooltipContent = _l === void 0 ? '' : _l, restProps = tslib_1.__rest(_a, ["startEnhancer", "children", "className", "style", "alignItems", "disabled", "endEnhancer", "selected", "highlighted", "autoFocus", "button", "overrides", "tabIndex", "$as", "onClick", "onKeyDown", "onFocus", "onBlur", "tooltipContent"]);
16
+ var _b, _c;
17
+ var startEnhancer = _a.startEnhancer, children = _a.children, className = _a.className, style = _a.style, _d = _a.alignItems, alignItems = _d === void 0 ? 'center' : _d, _e = _a.disabled, disabled = _e === void 0 ? false : _e, endEnhancer = _a.endEnhancer, _f = _a.selected, selected = _f === void 0 ? false : _f, _g = _a.highlighted, highlighted = _g === void 0 ? false : _g, _h = _a.autoFocus, autoFocus = _h === void 0 ? false : _h, _j = _a.button, button = _j === void 0 ? false : _j, _k = _a.overrides, overrides = _k === void 0 ? {} : _k, _l = _a.tabIndex, tabIndex = _l === void 0 ? button ? 0 : undefined : _l, _m = _a.role, roleProp = _m === void 0 ? 'listitem' : _m, _o = _a.$as, $as = _o === void 0 ? 'li' : _o, onClick = _a.onClick, onKeyDown = _a.onKeyDown, onFocus = _a.onFocus, onBlur = _a.onBlur, _p = _a.tooltipContent, tooltipContent = _p === void 0 ? '' : _p, restProps = tslib_1.__rest(_a, ["startEnhancer", "children", "className", "style", "alignItems", "disabled", "endEnhancer", "selected", "highlighted", "autoFocus", "button", "overrides", "tabIndex", "role", "$as", "onClick", "onKeyDown", "onFocus", "onBlur", "tooltipContent"]);
16
18
  var ownRef = (0, react_1.useRef)(null);
17
19
  var combinedRef = (0, useCombinedRef_1.default)(ref, ownRef);
18
20
  React.useEffect(function () {
@@ -33,10 +35,10 @@ var ListItem = React.forwardRef(function (_a, ref) {
33
35
  onKeyDown(event);
34
36
  }
35
37
  }, [button, disabled, onClick, onKeyDown]);
36
- var _m = tslib_1.__read((0, overrides_1.useOverrides)(overrides.Root, styled_component_1.StyledListItem), 2), Root = _m[0], rootProps = _m[1];
37
- var _o = tslib_1.__read((0, overrides_1.useOverrides)(overrides.ChildContainer, styled_component_1.StyledChildContainer), 2), ChildContainer = _o[0], childContainerProps = _o[1];
38
- var _p = tslib_1.__read((0, overrides_1.useOverrides)(overrides.StartEnhancer, styled_component_1.StyledStartEnhancer), 2), StartEnhancer = _p[0], startEnhancerProps = _p[1];
39
- var _q = tslib_1.__read((0, overrides_1.useOverrides)(overrides.EndEnhancer, styled_component_1.StyledEndEnhancer), 2), EndEnhancer = _q[0], endEnhancerProps = _q[1];
38
+ var _q = tslib_1.__read((0, overrides_1.useOverrides)(overrides.Root, styled_component_1.StyledListItem), 2), Root = _q[0], rootProps = _q[1];
39
+ var _r = tslib_1.__read((0, overrides_1.useOverrides)(overrides.ChildContainer, styled_component_1.StyledChildContainer), 2), ChildContainer = _r[0], childContainerProps = _r[1];
40
+ var _s = tslib_1.__read((0, overrides_1.useOverrides)(overrides.StartEnhancer, styled_component_1.StyledStartEnhancer), 2), StartEnhancer = _s[0], startEnhancerProps = _s[1];
41
+ var _t = tslib_1.__read((0, overrides_1.useOverrides)(overrides.EndEnhancer, styled_component_1.StyledEndEnhancer), 2), EndEnhancer = _t[0], endEnhancerProps = _t[1];
40
42
  var sharedProps = {
41
43
  $withStartEnhancer: !!startEnhancer,
42
44
  $withEndEnhancer: !!endEnhancer,
@@ -49,14 +51,17 @@ var ListItem = React.forwardRef(function (_a, ref) {
49
51
  var renderEnhancer = function (enhancer) {
50
52
  return typeof enhancer === 'function' ? enhancer(sharedProps) : enhancer;
51
53
  };
52
- var _r = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.StatefulTooltip, tooltip_1.Tooltip), 2), Tooltip = _r[0], tooltipProps = _r[1];
54
+ var _u = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.StatefulTooltip, tooltip_1.Tooltip), 2), Tooltip = _u[0], tooltipProps = _u[1];
53
55
  var tooltipControlProps = (0, useListItemTooltip_1.default)({
54
56
  highlighted: highlighted,
55
57
  tooltipHandlers: (0, useListItemTooltip_1.getListItemTooltipHandlers)(tooltipProps),
56
58
  });
57
- var listEl = (
58
- // eslint-disable-next-line jsx-a11y/role-supports-aria-props -- aria-disabled required for disabled button list items
59
- (0, jsx_runtime_1.jsxs)(Root, tslib_1.__assign({ "data-spaceweb": "list-item", role: "listitem", ref: combinedRef, tabIndex: tabIndex, "$as": $as, "aria-disabled": disabled, onClick: disabled ? noop_1.default : onClick, onKeyDown: handleKeyDown, "data-highlighted": highlighted }, sharedProps, restProps, rootProps, useFocusVisibleProps, { style: [style, rootProps === null || rootProps === void 0 ? void 0 : rootProps.style], className: [className, rootProps === null || rootProps === void 0 ? void 0 : rootProps.className] }, { children: [startEnhancer && ((0, jsx_runtime_1.jsx)(StartEnhancer, tslib_1.__assign({}, sharedProps, startEnhancerProps, { children: renderEnhancer(startEnhancer) }))), (0, jsx_runtime_1.jsx)(ChildContainer, tslib_1.__assign({}, sharedProps, childContainerProps, { children: children })), endEnhancer && ((0, jsx_runtime_1.jsx)(EndEnhancer, tslib_1.__assign({}, sharedProps, endEnhancerProps, { children: renderEnhancer(endEnhancer) })))] })));
59
+ var roleCandidate = (_b = rootProps === null || rootProps === void 0 ? void 0 : rootProps.role) !== null && _b !== void 0 ? _b : roleProp;
60
+ var role = typeof roleCandidate === 'string' ? roleCandidate : 'listitem';
61
+ var presentational = (0, utils_1.isPresentationalRole)(role);
62
+ var explicitAriaDisabled = (_c = rootProps === null || rootProps === void 0 ? void 0 : rootProps['aria-disabled']) !== null && _c !== void 0 ? _c : restProps['aria-disabled'];
63
+ var ariaDisabled = presentational ? undefined : explicitAriaDisabled !== null && explicitAriaDisabled !== void 0 ? explicitAriaDisabled : (disabled ? true : undefined);
64
+ var listEl = ((0, jsx_runtime_1.jsxs)(Root, tslib_1.__assign({ "data-spaceweb": "list-item", ref: combinedRef, tabIndex: tabIndex, "$as": $as, onClick: disabled ? noop_1.default : onClick, onKeyDown: handleKeyDown, "data-highlighted": highlighted }, sharedProps, restProps, rootProps, useFocusVisibleProps, { "aria-disabled": ariaDisabled, role: role, style: [style, rootProps === null || rootProps === void 0 ? void 0 : rootProps.style], className: [className, rootProps === null || rootProps === void 0 ? void 0 : rootProps.className] }, { children: [startEnhancer && ((0, jsx_runtime_1.jsx)(StartEnhancer, tslib_1.__assign({}, sharedProps, startEnhancerProps, { children: renderEnhancer(startEnhancer) }))), (0, jsx_runtime_1.jsx)(ChildContainer, tslib_1.__assign({}, sharedProps, childContainerProps, { children: children })), endEnhancer && ((0, jsx_runtime_1.jsx)(EndEnhancer, tslib_1.__assign({}, sharedProps, endEnhancerProps, { children: renderEnhancer(endEnhancer) })))] })));
60
65
  return tooltipContent ? ((0, jsx_runtime_1.jsx)(Tooltip, tslib_1.__assign({ placement: "bottom", showArrow: true, content: tooltipContent, viewportAsBoundary: true }, tooltipProps, tooltipControlProps, { children: listEl }))) : (listEl);
61
66
  });
62
67
  ListItem.displayName = 'ListItem';
package/locale/en_US.js CHANGED
@@ -46,6 +46,9 @@ exports.DEFAULT_LOCALE = {
46
46
  dateInputLabel: 'Date',
47
47
  timePickerLabel: 'Time',
48
48
  calendarButtonAriaLabel: 'Open Calendar',
49
+ dateInputDayAriaLabel: 'Day',
50
+ dateInputMonthAriaLabel: 'Month',
51
+ dateInputYearAriaLabel: 'Year',
49
52
  },
50
53
  datePicker: {
51
54
  ariaLabelCalendar: 'Calendar.',
@@ -118,6 +121,8 @@ exports.DEFAULT_LOCALE = {
118
121
  countrySelectPlaceholder: 'Search',
119
122
  inputAriaLabel: 'Please enter a phone number without the country dial code.',
120
123
  flagContainerAriaLabel: 'Press the enter key to navigate country select dropdown. Press the up or down arrow key to interact with the dropdown and select a country. Press the escape button to close the dropdown.',
124
+ flagContainerSelectedAriaLabel: '${countryName} ${dialCode} selected.',
125
+ inputSelectedDialCodeAriaLabel: '${dialCode} selected.',
121
126
  },
122
127
  menu: {
123
128
  nestedMenuItemAriaDescription: 'You are currently at an item that opens a nested menu. Press right arrow or spacebar to enter that element and left arrow or escape to return.',
package/locale/types.d.ts CHANGED
@@ -23,6 +23,9 @@ export type Locale = {
23
23
  dateInputLabel: string;
24
24
  timePickerLabel: string;
25
25
  calendarButtonAriaLabel: string;
26
+ dateInputDayAriaLabel: string;
27
+ dateInputMonthAriaLabel: string;
28
+ dateInputYearAriaLabel: string;
26
29
  };
27
30
  menu: {
28
31
  nestedMenuItemAriaDescription: string;
@@ -42,10 +42,14 @@ var useKeyboardNavigation = function (_a) {
42
42
  _setHighlightedItem(item);
43
43
  setListItemFocusVisible(showFocusVisibleStyles);
44
44
  }, []);
45
- // highlight first item in the list if prevHighlighted item is no longer in dom
45
+ // Re-target highlight when the previous item has left the DOM or is no longer highlightable
46
+ // (filter, unmount, disabled). If nothing is highlightable, clear so aria-activedescendant
47
+ // is not left pointing at a detached or disabled id.
46
48
  (0, react_1.useLayoutEffect)(function () {
47
- var isHighlightedItemInDom = ownerDocument === null || ownerDocument === void 0 ? void 0 : ownerDocument.body.contains(highlightedItem);
48
- if (disableAutoHighlight || isHighlightedItemInDom || !navigationEnabled || !listItemsContainerRef) {
49
+ var shouldKeepHighlight = Boolean(highlightedItem) &&
50
+ Boolean(ownerDocument === null || ownerDocument === void 0 ? void 0 : ownerDocument.body.contains(highlightedItem)) &&
51
+ (0, helpers_1.canHighlightItem)(highlightedItem);
52
+ if (disableAutoHighlight || shouldKeepHighlight || !navigationEnabled || !listItemsContainerRef) {
49
53
  return;
50
54
  }
51
55
  var firstHighlightableItem = (0, helpers_1.getFirstHighlightableElement)(listItemsContainerRef).firstHighlightableItem;
@@ -56,6 +60,9 @@ var useKeyboardNavigation = function (_a) {
56
60
  }
57
61
  setHighlightedItem(firstHighlightableItem, showFocusRing);
58
62
  }
63
+ else {
64
+ setHighlightedItem(null);
65
+ }
59
66
  // eslint-disable-next-line react-hooks/exhaustive-deps -- run this hook only when children changes
60
67
  }, [children]);
61
68
  (0, react_1.useEffect)(function () {
@@ -51,18 +51,24 @@ var useStatefulMenu = function (_a) {
51
51
  (_a = onHighlightedItemChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onHighlightedItemChangeRef, highlightedItem);
52
52
  }, [highlightedItem, onHighlightedItemChangeRef]);
53
53
  (0, react_1.useEffect)(function () {
54
- var activeElement;
55
- // set aria-activedescendant to current focused element whenever highlighted item changes
56
- if (navigationEnabled && (highlightedItem === null || highlightedItem === void 0 ? void 0 : highlightedItem.id) && document.activeElement) {
57
- activeElement = document.activeElement;
58
- activeElement.setAttribute('aria-activedescendant', highlightedItem.id);
54
+ if (!navigationEnabled || !(highlightedItem === null || highlightedItem === void 0 ? void 0 : highlightedItem.id) || !highlightedItem.isConnected) {
55
+ return undefined;
56
+ }
57
+ var ownerDocument = highlightedItem.ownerDocument;
58
+ // menus keep focus on the list, so fall back to the focused element. Never use body.
59
+ var activeElement = ownerDocument.activeElement instanceof HTMLElement ? ownerDocument.activeElement : null;
60
+ var host = keyboardFocusRestoreTarget !== null && keyboardFocusRestoreTarget !== void 0 ? keyboardFocusRestoreTarget : activeElement;
61
+ if (!host || host === ownerDocument.body) {
62
+ return undefined;
59
63
  }
64
+ var highlightedItemId = highlightedItem.id;
65
+ host.setAttribute('aria-activedescendant', highlightedItemId);
60
66
  return function () {
61
- if (activeElement) {
62
- activeElement.removeAttribute('aria-activedescendant');
67
+ if (host.getAttribute('aria-activedescendant') === highlightedItemId) {
68
+ host.removeAttribute('aria-activedescendant');
63
69
  }
64
70
  };
65
- }, [navigationEnabled, highlightedItem]);
71
+ }, [navigationEnabled, highlightedItem, keyboardFocusRestoreTarget]);
66
72
  return {
67
73
  highlightedItem: highlightedItem,
68
74
  setHighlightedItem: setHighlightedItem,
package/modal/modal.js CHANGED
@@ -70,8 +70,8 @@ var Modal = function (_a) {
70
70
  return {};
71
71
  }, [size, px2rem]);
72
72
  var dialogA11yProps = (0, react_1.useMemo)(function () { return ({
73
- 'aria-label': ariaLabel,
74
- 'aria-labelledby': ariaLabelledBy || headerTitleId,
73
+ 'aria-label': ariaLabelledBy ? undefined : ariaLabel,
74
+ 'aria-labelledby': ariaLabelledBy || (ariaLabel ? undefined : headerTitleId),
75
75
  }); }, [ariaLabel, ariaLabelledBy, headerTitleId]);
76
76
  var _overrides = (0, react_1.useMemo)(function () {
77
77
  return (0, overrides_2.mergeOverrides)({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sprinklrjs/spaceweb",
3
- "version": "14.15.1",
3
+ "version": "14.16.0",
4
4
  "description": "Components for SpaceWeb",
5
5
  "main": "index.js",
6
6
  "module": "./esm/index.js",
@@ -81,7 +81,6 @@
81
81
  "@testing-library/react-hooks": "^7.0.1",
82
82
  "@testing-library/user-event": "^13.2.1",
83
83
  "@types/jest": "^26.0.24",
84
- "@types/jest-axe": "^3.5.9",
85
84
  "@types/lodash": "^4.14.149",
86
85
  "@types/react-is": "^17.0.2",
87
86
  "@vvo/tzdb": "^6.158.0",
@@ -93,7 +92,6 @@
93
92
  "enzyme-adapter-react-16": "^1.15.2",
94
93
  "glob": "^7.1.6",
95
94
  "jest": "^26.5.2",
96
- "jest-axe": "^5.0.1",
97
95
  "mq-polyfill": "^1.1.8",
98
96
  "postcss": "^7.0.27",
99
97
  "postcss-js": "^2.0.3",
@@ -102,7 +100,7 @@
102
100
  "typescript": "~5.0.0"
103
101
  },
104
102
  "peerDependencies": {
105
- "@sprinklrjs/spaceweb-themes": "14.15.1",
103
+ "@sprinklrjs/spaceweb-themes": "14.16.0",
106
104
  "react": ">=17.0.2 <19.0.0",
107
105
  "react-dom": ">=17.0.2 <19.0.0"
108
106
  }
@@ -85,6 +85,7 @@ var CountrySelect = function (props) {
85
85
  size: size,
86
86
  disabled: disabled,
87
87
  value: value,
88
+ mapIsoToLabel: mapIsoToLabel,
88
89
  overrides: (0, pick_1.default)(overrides, ['FlagContainer']),
89
90
  };
90
91
  return ((0, jsx_runtime_1.jsx)(Select, tslib_1.__assign({ type: "overlay", options: countries !== null && countries !== void 0 ? countries : constants_1.COUNTRY_SELECT_OPTIONS, value: [value.country], onChange: function (params) {
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- declare const FlagContainer: import("react").ForwardRefExoticComponent<Pick<import("./types").CountrySelectContainerProps, "value" | "size" | "disabled"> & {
2
+ declare const FlagContainer: import("react").ForwardRefExoticComponent<Pick<import("./types").CountrySelectContainerProps, "value" | "size" | "disabled" | "mapIsoToLabel"> & {
3
3
  overrides?: Pick<import("./types").PhoneInputOverrides, "FlagContainer"> | undefined;
4
4
  } & import("react").RefAttributes<HTMLButtonElement>>;
5
5
  export default FlagContainer;
@@ -11,15 +11,15 @@ var helpers_1 = require("../helpers");
11
11
  var cvaConfigs_1 = require("./cvaConfigs");
12
12
  var styled_components_1 = require("./styled-components");
13
13
  var FlagContainer = (0, react_1.forwardRef)(function (props, ref) {
14
- var inputSize = props.size, country = props.value.country, overrides = props.overrides, rest = tslib_1.__rest(props, ["size", "value", "overrides"]);
14
+ var inputSize = props.size, country = props.value.country, mapIsoToLabel = props.mapIsoToLabel, overrides = props.overrides, rest = tslib_1.__rest(props, ["size", "value", "mapIsoToLabel", "overrides"]);
15
15
  var iso = country.id;
16
16
  var locale = (0, locale_1.useLocale)();
17
17
  var sharedProps = (0, helpers_1.add$props)({ iso: iso, inputSize: inputSize });
18
18
  var _a = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.FlagContainer, button_1.Button), 2), Button = _a[0], buttonProps = _a[1];
19
- return ((0, jsx_runtime_1.jsx)(Button, tslib_1.__assign({ "aria-label": locale.phoneInput.flagContainerAriaLabel, variant: "minimal", size: "xxxs", type: "button", className: [
19
+ return ((0, jsx_runtime_1.jsx)(Button, tslib_1.__assign({ "aria-label": (0, utils_1.getFlagContainerAriaLabel)(locale.phoneInput, country, mapIsoToLabel), variant: "minimal", size: "xxxs", type: "button", className: [
20
20
  'min-w-0 spr-ui-05 px-2 py-0.5 text-16 rounded-4 mr-0',
21
21
  cvaConfigs_1.flagContainerCVA,
22
- // @ts-ignore -- CSS-in-JS -- TS2345: Argument of type '(_: StyleUtils, { $zIndex }: any) => { zIndex: any; ...
22
+ // @ts-expect-error -- ClassName does not include CSSStylesStyleFn (TS2345)
23
23
  styled_components_1.getFlagContainerOverrides,
24
24
  ], "data-iso": iso, ref: ref }, sharedProps, buttonProps, rest, { children: (0, utils_1.iso2FlagEmoji)(iso) })));
25
25
  });
@@ -2,4 +2,6 @@ export type PhoneInputLocale = {
2
2
  countrySelectPlaceholder: string;
3
3
  inputAriaLabel: string;
4
4
  flagContainerAriaLabel: string;
5
+ flagContainerSelectedAriaLabel: string;
6
+ inputSelectedDialCodeAriaLabel: string;
5
7
  };
@@ -56,7 +56,9 @@ var PhoneInput = function (props) {
56
56
  },
57
57
  }, overrides);
58
58
  var _d = tslib_1.__read((0, overrides_1.useOverrides)(mergedOverrides === null || mergedOverrides === void 0 ? void 0 : mergedOverrides.Input, input_1.Input), 2), Input = _d[0], inputProps = _d[1];
59
- return ((0, jsx_runtime_1.jsx)(Input, tslib_1.__assign({ "aria-label": locale.phoneInput.inputAriaLabel, size: size, variant: variant, intent: intent, disabled: disabled, onChange: function (e) {
59
+ return ((0, jsx_runtime_1.jsx)(Input, tslib_1.__assign({ "aria-label": value.country
60
+ ? (0, utils_1.getPhoneInputAriaLabel)(locale.phoneInput, value.country.dialCode)
61
+ : locale.phoneInput.inputAriaLabel, size: size, variant: variant, intent: intent, disabled: disabled, onChange: function (e) {
60
62
  var number = (0, utils_1.sanitize)(e.currentTarget.value);
61
63
  if (onChange) {
62
64
  onChange(tslib_1.__assign(tslib_1.__assign({}, value), { phoneNumber: number }));
@@ -67,7 +67,7 @@ export type CountrySelectContainerProps = Required<Pick<PhoneInputProps, 'size'
67
67
  export type CountrySelectProps = Omit<CountrySelectContainerProps, 'overrides'> & {
68
68
  overrides?: Pick<PhoneInputOverrides, 'CountrySelect' | 'FlagContainer'>;
69
69
  };
70
- export type FlagContainerProps = Pick<CountrySelectContainerProps, 'size' | 'disabled' | 'value'> & {
70
+ export type FlagContainerProps = Pick<CountrySelectContainerProps, 'size' | 'disabled' | 'value' | 'mapIsoToLabel'> & {
71
71
  overrides?: Pick<PhoneInputOverrides, 'FlagContainer'>;
72
72
  };
73
73
  export type DialCodeProps = Omit<CountrySelectContainerProps, 'overrides'> & {
@@ -1,5 +1,6 @@
1
1
  import type { Value as ValueT } from '../select/types';
2
2
  import type { Value, Country, CustomCountryLabel } from './types';
3
+ import type { PhoneInputLocale } from './locale';
3
4
  export declare const iso2FlagEmoji: (iso: string) => string | undefined;
4
5
  export declare const sanitize: (value?: string) => string;
5
6
  export declare const getPhoneNumberWithCountryDialCode: (value: Value) => string | undefined;
@@ -35,3 +36,5 @@ export declare const getCountryLabelParts: ({ label, nativeName, nativeLang }: C
35
36
  * visible text is flattened into `primaryName` so display stays correct without invalid markup.
36
37
  */
37
38
  export declare const resolveCountryLabelParts: (country: Country, mapIsoToLabel?: ((iso: string) => string | CustomCountryLabel) | undefined) => CountryLabelParts;
39
+ export declare const getFlagContainerAriaLabel: (locale: PhoneInputLocale, country: Country, mapIsoToLabel?: ((iso: string) => string | CustomCountryLabel) | undefined) => string;
40
+ export declare const getPhoneInputAriaLabel: (locale: PhoneInputLocale, dialCode: string) => string;
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveCountryLabelParts = exports.getCountryLabelParts = exports.getDefaultValue = exports.countrySelectFilterOptions = exports.getPhoneNumberWithCountryDialCode = exports.sanitize = exports.iso2FlagEmoji = void 0;
3
+ exports.getPhoneInputAriaLabel = exports.getFlagContainerAriaLabel = exports.resolveCountryLabelParts = exports.getCountryLabelParts = exports.getDefaultValue = exports.countrySelectFilterOptions = exports.getPhoneNumberWithCountryDialCode = exports.sanitize = exports.iso2FlagEmoji = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var isEmpty_1 = tslib_1.__importDefault(require("lodash/isEmpty"));
6
6
  var default_filter_options_1 = require("../select/utils/default-filter-options");
7
+ var i18n_interpolation_1 = tslib_1.__importDefault(require("../baseui/helpers/i18n-interpolation"));
7
8
  var constants_1 = require("./constants");
8
9
  var default_props_1 = require("./default-props");
9
10
  var iso2FlagEmoji = function (iso) {
@@ -89,3 +90,17 @@ var resolveCountryLabelParts = function (country, mapIsoToLabel) {
89
90
  };
90
91
  };
91
92
  exports.resolveCountryLabelParts = resolveCountryLabelParts;
93
+ var getFlagContainerAriaLabel = function (locale, country, mapIsoToLabel) {
94
+ var primaryName = (0, exports.resolveCountryLabelParts)(country, mapIsoToLabel).primaryName;
95
+ var selected = (0, i18n_interpolation_1.default)(locale.flagContainerSelectedAriaLabel, {
96
+ countryName: primaryName,
97
+ dialCode: country.dialCode,
98
+ });
99
+ return "".concat(selected, " ").concat(locale.flagContainerAriaLabel);
100
+ };
101
+ exports.getFlagContainerAriaLabel = getFlagContainerAriaLabel;
102
+ var getPhoneInputAriaLabel = function (locale, dialCode) {
103
+ var selected = (0, i18n_interpolation_1.default)(locale.inputSelectedDialCodeAriaLabel, { dialCode: dialCode });
104
+ return "".concat(locale.inputAriaLabel, " ").concat(selected);
105
+ };
106
+ exports.getPhoneInputAriaLabel = getPhoneInputAriaLabel;
@@ -129,6 +129,7 @@ var useOverlaySelectOverrides = function (props) {
129
129
  }, [closePopover, onChange, closeOnSelect]);
130
130
  var _h = (0, useStickyElement_1.default)(), isSticky = _h.isSticky, setStickySentinelRef = _h.setStickySentinelRef;
131
131
  var _j = useSearchContainerHeight(), containerHeight = _j.containerHeight, setContainerElement = _j.setContainerElement;
132
+ var ariaLabel = props['aria-label'];
132
133
  var memoizedOverrides = (0, react_1.useMemo)(function () { return ({
133
134
  // BaseSelect wil render this Popover component with DropdownContainer as content and ControlContainer as children/target
134
135
  Popover: {
@@ -155,6 +156,7 @@ var useOverlaySelectOverrides = function (props) {
155
156
  'aria-expanded': popoverOpen,
156
157
  'aria-autocomplete': 'list',
157
158
  'aria-haspopup': 'listbox',
159
+ 'aria-label': ariaLabel,
158
160
  overrides: {
159
161
  After: isLoading ? SelectLoader : function () { return null; },
160
162
  ClearIcon: {
@@ -244,6 +246,7 @@ var useOverlaySelectOverrides = function (props) {
244
246
  scrollContainer,
245
247
  scrollElement,
246
248
  popoverOpen,
249
+ ariaLabel,
247
250
  ]);
248
251
  var overrides = (0, react_1.useMemo)(function () { return (0, overrides_1.mergeOverrides)(memoizedOverrides, (0, omit_1.default)(props.overrides, overridesToOmit)); }, [memoizedOverrides, props.overrides]);
249
252
  return {
@@ -143,7 +143,7 @@ var CollapsibleSelectMenu = function (_a) {
143
143
  // https://ui5.sap.com/#/entity/sap.m.MultiComboBox/sample/sap.m.sample.MultiComboBoxSelectAll
144
144
  role: "checkbox", className: ['m-2', baseuiMenuItemProps === null || baseuiMenuItemProps === void 0 ? void 0 : baseuiMenuItemProps.className] }), "select-all-option")) : null, groupConfig.map(function (_group, index) {
145
145
  var _a;
146
- var _b, _c;
146
+ var _b, _c, _d;
147
147
  var groupId = _group.id, groupLabel = _group.label;
148
148
  var itemsInGroup = groupedItems[groupId];
149
149
  var group = _group;
@@ -161,12 +161,20 @@ var CollapsibleSelectMenu = function (_a) {
161
161
  _a[constants_2.GROUP_SELECT_ALL_ID] = true,
162
162
  _a.selected = groupSelectAllSelected,
163
163
  _a);
164
- return ((0, jsx_runtime_1.jsxs)(Collapsible, tslib_1.__assign({ className: index === 0 && selectAllItem ? 'border-t-1 border-solid spr-border-primary' : '', group: group, expanded: disableWhenSelectAllChecked && globalSelectAllSelected ? false : groupId === expandedGroupId, disabled: disableWhenSelectAllChecked && globalSelectAllSelected, onClick: handleOnClick }, { children: [(0, jsx_runtime_1.jsx)(hidden_element_1.HiddenElement, tslib_1.__assign({ id: menuDescriptionId !== null && menuDescriptionId !== void 0 ? menuDescriptionId : '' }, { children: "".concat(groupLabel, " ").concat(locale.groupExpandedSuffix) })), (0, isEmpty_1.default)(itemsInGroup) ? ((0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ "aria-live": "polite", "aria-atomic": true, msg: noResultsMsg, noResultsConfig: noResultsConfig, "aria-disabled": true, "$groupId": groupId }, noResultsProps))) : ((0, jsx_runtime_1.jsxs)(MenuComponent, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, disableAutoHighlight: isRootSelectAllHighlighted, keyboardFocusRestoreTarget: inputElement, tabIndex: -1, selectOnTab: selectOnTab, getActionsElement: getActionsElement }, menuProps, { role: "listbox", id: listboxId, virtual: virtual, className: ['overflow-auto max-h-50 pt-0', menuProps === null || menuProps === void 0 ? void 0 : menuProps.className], onScroll: function (e) {
164
+ var menuChildren = (0, isEmpty_1.default)(itemsInGroup)
165
+ ? [
166
+ (0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ msg: noResultsMsg, noResultsConfig: noResultsConfig, "$groupId": groupId }, noResultsProps), "no-results"),
167
+ ]
168
+ : tslib_1.__spreadArray([
169
+ shouldDisplayGroupSelectAll ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: groupSelectAllItem, "data-testid": "".concat(group.label, "-group-select-all"), selected: groupSelectAllSelected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": groupSelectAllItem, button: true, disabled: group.count <= countDisabledOptions, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), "select-all-option")) : null,
170
+ clearAsOptionItem ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: clearAsOptionItem, selected: false, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": clearAsOptionItem, button: true, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), "clear-option")) : null
171
+ ], tslib_1.__read(itemsInGroup.map(function (item) {
172
+ var selected = selectedValuesSet.has(item[valueKey]);
173
+ return ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: item, selected: selected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": item, button: true, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), item.isCreatable ? 'creatable-option' : item[valueKey]));
174
+ })), false).filter(Boolean);
175
+ return ((0, jsx_runtime_1.jsxs)(Collapsible, tslib_1.__assign({ className: index === 0 && selectAllItem ? 'border-t-1 border-solid spr-border-primary' : '', group: group, expanded: disableWhenSelectAllChecked && globalSelectAllSelected ? false : groupId === expandedGroupId, disabled: disableWhenSelectAllChecked && globalSelectAllSelected, onClick: handleOnClick }, { children: [(0, jsx_runtime_1.jsx)(hidden_element_1.HiddenElement, tslib_1.__assign({ id: menuDescriptionId !== null && menuDescriptionId !== void 0 ? menuDescriptionId : '' }, { children: "".concat(groupLabel, " ").concat(locale.groupExpandedSuffix) })), (0, jsx_runtime_1.jsx)(MenuComponent, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, disableAutoHighlight: isRootSelectAllHighlighted, keyboardFocusRestoreTarget: inputElement, tabIndex: -1, selectOnTab: selectOnTab, getActionsElement: getActionsElement }, menuProps, { role: "listbox", id: listboxId, "aria-label": (_d = menuProps === null || menuProps === void 0 ? void 0 : menuProps['aria-label']) !== null && _d !== void 0 ? _d : groupLabel, virtual: virtual && !(0, isEmpty_1.default)(itemsInGroup), className: ['overflow-auto max-h-50 pt-0', menuProps === null || menuProps === void 0 ? void 0 : menuProps.className], onScroll: function (e) {
165
176
  $onPaginate === null || $onPaginate === void 0 ? void 0 : $onPaginate(e, groupId);
166
- }, onHighlightedItemChange: handleOnHighlightedItemChange, ref: menuRef }, { children: [shouldDisplayGroupSelectAll ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: groupSelectAllItem, "data-testid": "".concat(group.label, "-group-select-all"), selected: groupSelectAllSelected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": groupSelectAllItem, button: true, disabled: group.count <= countDisabledOptions, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), "select-all-option")) : null, clearAsOptionItem ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: clearAsOptionItem, selected: false, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": clearAsOptionItem, button: true, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), "clear-option")) : null, itemsInGroup.map(function (item) {
167
- var selected = selectedValuesSet.has(item[valueKey]);
168
- return ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: item, selected: selected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": item, button: true, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), item.isCreatable ? 'creatable-option' : item[valueKey]));
169
- })] })))] }), groupId));
177
+ }, onHighlightedItemChange: handleOnHighlightedItemChange, ref: menuRef }, { children: menuChildren }))] }), groupId));
170
178
  })] })));
171
179
  };
172
180
  exports.CollapsibleSelectMenu = CollapsibleSelectMenu;
@@ -81,6 +81,6 @@ var NestedSelectMenuAdapter = function (props) {
81
81
  }
82
82
  return null;
83
83
  };
84
- return totalCount ? ((0, jsx_runtime_1.jsx)(MenuOverriden, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, keyboardFocusRestoreTarget: inputElement, "$multi": multi, captureScroll: captureScroll, tabIndex: -1, "aria-label": "Menu", role: "listbox", getActionsElement: getActionsElement }, baseuiMenuListProps, { id: listboxId, virtual: virtual, overscanCount: overscanCount, items: props.items.__ungrouped, itemRenderer: itemRenderer }, menuProps, { getItemLabel: getItemLabel !== null && getItemLabel !== void 0 ? getItemLabel : defaultItemLabel }))) : ((0, jsx_runtime_1.jsx)(menu_1.Menu, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, keyboardFocusRestoreTarget: inputElement, tabIndex: -1, "aria-label": "Menu", role: "listbox", getActionsElement: getActionsElement, id: listboxId }, { children: (0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ "aria-live": "polite", "aria-atomic": true, msg: noResultsMsg, noResultsConfig: noResultsConfig, "aria-disabled": true }, noResultsProps)) })));
84
+ return totalCount ? ((0, jsx_runtime_1.jsx)(MenuOverriden, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, keyboardFocusRestoreTarget: inputElement, "$multi": multi, captureScroll: captureScroll, tabIndex: -1, "aria-label": "Menu", role: "listbox", getActionsElement: getActionsElement }, baseuiMenuListProps, { id: listboxId, virtual: virtual, overscanCount: overscanCount, items: props.items.__ungrouped, itemRenderer: itemRenderer }, menuProps, { getItemLabel: getItemLabel !== null && getItemLabel !== void 0 ? getItemLabel : defaultItemLabel }))) : ((0, jsx_runtime_1.jsx)(menu_1.Menu, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, keyboardFocusRestoreTarget: inputElement, tabIndex: -1, "aria-label": "Menu", role: "listbox", getActionsElement: getActionsElement, id: listboxId }, { children: (0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ msg: noResultsMsg, noResultsConfig: noResultsConfig }, noResultsProps)) })));
85
85
  };
86
86
  exports.default = NestedSelectMenuAdapter;
@@ -61,24 +61,26 @@ var SelectMenuAdapter = function (props) {
61
61
  }); }, [mergedOverrides.ListItemText, mergedOverrides.MenuItem, mergedOverrides.Checkbox]);
62
62
  var currentCount = 0;
63
63
  var totalCount = (0, utils_1.normalizeOptions)(groupedItems).length;
64
- var itemsToRender = (0, flatten_1.default)(Object.keys(removeUngroupedIfEmpty(groupedItems)).map(function (itemGroup, index) {
64
+ var optionItems = (0, flatten_1.default)(Object.keys(removeUngroupedIfEmpty(groupedItems)).map(function (itemGroup, index) {
65
65
  var itemsInGroup = groupedItems[itemGroup];
66
66
  var menuItems = itemsInGroup.flatMap(function (item) {
67
67
  currentCount += 1;
68
68
  var selected = selectedValuesSet.has(item[valueKey]) || (item[types_1.SELECT_ALL_ID] && selectAllSelected);
69
69
  var selectMenuItem = ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: item, selected: selected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": item, "aria-posinset": currentCount, "aria-setsize": totalCount }, baseuiMenuItemProps), item.isCreatable ? 'creatable-option' : "".concat(item[valueKey], "-").concat(item.__optgroup)));
70
70
  return item[types_1.SELECT_ALL_ID]
71
- ? [selectMenuItem, (0, jsx_runtime_1.jsx)(DividerOverriden, tslib_1.__assign({ "$item": item }, dividerProps), "divider-select-all")]
71
+ ? [
72
+ selectMenuItem,
73
+ (0, jsx_runtime_1.jsx)(DividerOverriden, tslib_1.__assign({ "$item": item }, dividerProps, { role: "presentation" }), "divider-select-all"),
74
+ ]
72
75
  : selectMenuItem;
73
76
  });
74
77
  if (itemGroup !== constants_1.UNGROUPED_ID) {
75
- menuItems.unshift((0, jsx_runtime_1.jsx)(DividerOverriden, tslib_1.__assign({ first: index === 0 }, dividerProps, { children: (0, jsx_runtime_1.jsx)(typography_1.Typography, tslib_1.__assign({ variant: "body-xs", weight: "semibold", className: "spr-text-tertiary" }, { children: itemGroup })) }), "divider-".concat(itemGroup)));
78
+ menuItems.unshift((0, jsx_runtime_1.jsx)(DividerOverriden, tslib_1.__assign({ first: index === 0 }, dividerProps, { role: "presentation" }, { children: (0, jsx_runtime_1.jsx)(typography_1.Typography, tslib_1.__assign({ variant: "body-xs", weight: "semibold", className: "spr-text-tertiary" }, { children: itemGroup })) }), "divider-".concat(itemGroup)));
76
79
  }
77
80
  return menuItems;
78
81
  }));
79
- if ((0, isEmpty_1.default)(itemsToRender)) {
80
- itemsToRender = ((0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ "aria-live": "polite", "aria-atomic": true, msg: noResultsMsg, noResultsConfig: noResultsConfig, "aria-disabled": true }, noResultsProps)));
81
- }
82
+ var hasOptions = !(0, isEmpty_1.default)(optionItems);
83
+ var itemsToRender = hasOptions ? (optionItems) : ((0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ msg: noResultsMsg, noResultsConfig: noResultsConfig }, noResultsProps)));
82
84
  return (
83
85
  // focusWhenNavigationEnabled false, or else it will remove focus from select input
84
86
  (0, jsx_runtime_1.jsx)(MenuOverriden, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, keyboardFocusRestoreTarget: inputElement, "$multi": multi, captureScroll: captureScroll, tabIndex: -1, "aria-label": "Menu", role: "listbox", getActionsElement: getActionsElement }, baseuiMenuListProps, { id: listboxId, virtual: virtual, overscanCount: overscanCount, selectOnTab: selectOnTab }, menuProps, { children: itemsToRender })));
@@ -5,8 +5,7 @@ var tslib_1 = require("tslib");
5
5
  var jsx_runtime_1 = require("react/jsx-runtime");
6
6
  var react_1 = require("react");
7
7
  var locale_1 = require("../locale");
8
- var box_1 = require("../box");
9
- var menu_item_1 = tslib_1.__importDefault(require("../menu/menu-item"));
8
+ var list_item_1 = tslib_1.__importDefault(require("../list/list-item"));
10
9
  var style_1 = require("../style");
11
10
  var themeHelpers_1 = require("../helpers/themeHelpers");
12
11
  var hidden_element_1 = require("./utils/hidden-element");
@@ -20,7 +19,8 @@ var NoResults = (0, react_1.forwardRef)(function (_a, ref) {
20
19
  var msg = _a.msg, noResultsConfig = _a.noResultsConfig, props = tslib_1.__rest(_a, ["msg", "noResultsConfig"]);
21
20
  var locale = (0, locale_1.useLocale)();
22
21
  var noResultsId = (0, SelectIdsContext_1.useSelectIds)().noResultsId;
23
- return ((0, jsx_runtime_1.jsx)(menu_item_1.default, tslib_1.__assign({ button: false, hideInlineActions: true, ref: ref }, props, { children: noResultsConfig ? ((0, jsx_runtime_1.jsx)(no_results_message_1.NoResultsMessage, tslib_1.__assign({}, noResultsConfig, { id: noResultsId }))) : ((0, jsx_runtime_1.jsx)(box_1.Box, tslib_1.__assign({ id: noResultsId }, { children: msg || locale.select.noResultsMsg }))) })));
22
+ var message = msg || locale.select.noResultsMsg;
23
+ return ((0, jsx_runtime_1.jsx)(list_item_1.default, tslib_1.__assign({ ref: ref, button: false, id: noResultsId, role: "option", "aria-live": "polite", "aria-atomic": true, "aria-selected": false, "aria-disabled": !(noResultsConfig === null || noResultsConfig === void 0 ? void 0 : noResultsConfig.onButtonClick) }, props, { children: noResultsConfig ? (0, jsx_runtime_1.jsx)(no_results_message_1.NoResultsMessage, tslib_1.__assign({}, noResultsConfig)) : message })));
24
24
  });
25
25
  exports.NoResults = NoResults;
26
26
  exports.StyledInputContainer = (0, style_1.styled)('div', cvaConfigs_1.inputContainerCVA,
@@ -1,7 +1,7 @@
1
1
  import type { ReactElement } from 'react';
2
2
  import type { SliderProps } from './types';
3
3
  declare const Slider: {
4
- ({ overrides, disabled, marks, onChange, onFinalChange, min: propMin, max: propMax, step, persistentThumb, valueToLabel, value: propProvidedValue, intent, className, style, getMarkLabel, markLabel, primaryIntentColor, secondaryIntentColor, trackColors, thumbColors, }: SliderProps): ReactElement;
4
+ ({ overrides, disabled, marks, onChange, onFinalChange, min: propMin, max: propMax, step, persistentThumb, valueToLabel, value: propProvidedValue, intent, className, style, getMarkLabel, markLabel, primaryIntentColor, secondaryIntentColor, trackColors, thumbColors, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, }: SliderProps): ReactElement;
5
5
  __standard: string;
6
6
  };
7
7
  export default Slider;
package/slider/slider.js CHANGED
@@ -24,7 +24,7 @@ var defaultMarkLabel = function (_a) {
24
24
  return "".concat(($min || 0) + $markIndex * $step);
25
25
  };
26
26
  var Slider = function (_a) {
27
- var _b = _a.overrides, overrides = _b === void 0 ? {} : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c, _d = _a.marks, marks = _d === void 0 ? false : _d, _e = _a.onChange, onChange = _e === void 0 ? noop_1.default : _e, _f = _a.onFinalChange, onFinalChange = _f === void 0 ? noop_1.default : _f, _g = _a.min, propMin = _g === void 0 ? 0 : _g, _h = _a.max, propMax = _h === void 0 ? 100 : _h, _j = _a.step, step = _j === void 0 ? 1 : _j, _k = _a.persistentThumb, persistentThumb = _k === void 0 ? false : _k, _l = _a.valueToLabel, valueToLabel = _l === void 0 ? function (label) { return label; } : _l, propProvidedValue = _a.value, _m = _a.intent, intent = _m === void 0 ? 'default' : _m, className = _a.className, style = _a.style, _o = _a.getMarkLabel, getMarkLabel = _o === void 0 ? defaultMarkLabel : _o, markLabel = _a.markLabel, primaryIntentColor = _a.primaryIntentColor, secondaryIntentColor = _a.secondaryIntentColor, trackColors = _a.trackColors, thumbColors = _a.thumbColors;
27
+ var _b = _a.overrides, overrides = _b === void 0 ? {} : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c, _d = _a.marks, marks = _d === void 0 ? false : _d, _e = _a.onChange, onChange = _e === void 0 ? noop_1.default : _e, _f = _a.onFinalChange, onFinalChange = _f === void 0 ? noop_1.default : _f, _g = _a.min, propMin = _g === void 0 ? 0 : _g, _h = _a.max, propMax = _h === void 0 ? 100 : _h, _j = _a.step, step = _j === void 0 ? 1 : _j, _k = _a.persistentThumb, persistentThumb = _k === void 0 ? false : _k, _l = _a.valueToLabel, valueToLabel = _l === void 0 ? function (label) { return label; } : _l, propProvidedValue = _a.value, _m = _a.intent, intent = _m === void 0 ? 'default' : _m, className = _a.className, style = _a.style, _o = _a.getMarkLabel, getMarkLabel = _o === void 0 ? defaultMarkLabel : _o, markLabel = _a.markLabel, primaryIntentColor = _a.primaryIntentColor, secondaryIntentColor = _a.secondaryIntentColor, trackColors = _a.trackColors, thumbColors = _a.thumbColors, ariaLabel = _a["aria-label"], ariaLabelledBy = _a["aria-labelledby"], ariaDescribedBy = _a["aria-describedby"];
28
28
  var _p = tslib_1.__read((0, react_1.useState)(-1), 2), hoveredThumbIndex = _p[0], setHoveredThumbIndex = _p[1];
29
29
  var hasMounted = (0, useHasMounted_1.useHasMounted)();
30
30
  var _q = tslib_1.__read((0, react_1.useState)(false), 2), isFocusVisible = _q[0], setIsFocusVisible = _q[1];
@@ -98,7 +98,17 @@ var Slider = function (_a) {
98
98
  // In SSR, Thumbs are not properly positioned, hence hiding thumbs on server render.
99
99
  // Refer https://github.com/tajo/react-range/issues/67#issuecomment-591703422
100
100
  // Thumb is made ClientOnly to avoid Hydration mismatch error
101
- return ((0, jsx_runtime_1.jsxs)(Thumb, tslib_1.__assign({}, props, { "data-thumbIndex": index, onMouseEnter: function () { return setHoveredThumbIndex(index); }, onMouseLeave: function () { return setHoveredThumbIndex(-1); }, "$thumbIndex": index, "$isDragged": isDragged, style: tslib_1.__assign(tslib_1.__assign({ '--sw-bg-color': value.length > 2 ? thumbColors[index] : primaryIntentColor !== null && primaryIntentColor !== void 0 ? primaryIntentColor : (0, intentHelper_1.intentColor)(styleUtils, sharedProps), '--sw-bg-color-hover': value.length > 2
101
+ var thumbLabel;
102
+ if (ariaLabel == null) {
103
+ thumbLabel = undefined;
104
+ }
105
+ else if (value.length > 1) {
106
+ thumbLabel = "".concat(ariaLabel, " ").concat(index + 1);
107
+ }
108
+ else {
109
+ thumbLabel = ariaLabel;
110
+ }
111
+ return ((0, jsx_runtime_1.jsxs)(Thumb, tslib_1.__assign({}, props, (thumbLabel ? { 'aria-label': thumbLabel } : {}), (ariaLabelledBy ? { 'aria-labelledby': ariaLabelledBy } : {}), (ariaDescribedBy ? { 'aria-describedby': ariaDescribedBy } : {}), { "data-thumbIndex": index, onMouseEnter: function () { return setHoveredThumbIndex(index); }, onMouseLeave: function () { return setHoveredThumbIndex(-1); }, "$thumbIndex": index, "$isDragged": isDragged, style: tslib_1.__assign(tslib_1.__assign({ '--sw-bg-color': value.length > 2 ? thumbColors[index] : primaryIntentColor !== null && primaryIntentColor !== void 0 ? primaryIntentColor : (0, intentHelper_1.intentColor)(styleUtils, sharedProps), '--sw-bg-color-hover': value.length > 2
102
112
  ? thumbColors[index]
103
113
  : primaryIntentColor !== null && primaryIntentColor !== void 0 ? primaryIntentColor : (0, intentHelper_1.intentColor)(styleUtils, sharedProps, theme.spr.interactiveHover), '--sw-shadow': isFocusVisible && focusedThumbIndex === index
104
114
  ? "0 0 0 3px ".concat(theme.spr.focus01)
package/slider/types.d.ts CHANGED
@@ -14,6 +14,9 @@ type GetMarkLabelFn = (props: SharedProps & {
14
14
  $markIndex: number;
15
15
  }) => React.ReactNode;
16
16
  type CommonSliderProps = {
17
+ 'aria-label'?: string;
18
+ 'aria-labelledby'?: string;
19
+ 'aria-describedby'?: string;
17
20
  /** @deprecated */
18
21
  intent?: Intent;
19
22
  markLabel?: boolean;
@@ -116,7 +116,7 @@ var RangeSelectorContainer = function (_a) {
116
116
  fill: theme.spr.clrRed,
117
117
  });
118
118
  } }), (0, jsx_runtime_1.jsx)(typography_1.Typography, tslib_1.__assign({ className: "my-0", variant: "bs3" }, { children: errMsg }))] }))) : null;
119
- return ((0, jsx_runtime_1.jsxs)(box_1.Box, tslib_1.__assign({ className: "spr-ui-01 rounded-8" }, { children: [(0, jsx_runtime_1.jsxs)(Header, tslib_1.__assign({ "$setTimezone": setTimezone, "$onClose": props.onClose }, headerProps, { children: [(0, jsx_runtime_1.jsx)(HeaderBeforeEnhancer, tslib_1.__assign({ variant: "heading-7", "$as": "span", className: "flex items-center" }, headerBeforeEnhancerProps, { children: locale.timeRangePicker.headerLabel })), disableTimezone ? null : ((0, jsx_runtime_1.jsx)(TimezonePicker, tslib_1.__assign({ setTimezone: setTimezone, timezone: timezone, timezoneOptions: timezoneOptions }, timezonePickerProps, { className: ['w-0 grow max-w-md', timezonePickerProps === null || timezonePickerProps === void 0 ? void 0 : timezonePickerProps.className] })))] })), (0, jsx_runtime_1.jsx)(RangeSelector, tslib_1.__assign({ overrides: props.overrides, timeSelect: props.timeSelect, timeRangePresets: timeRangePresets, timezone: timezone, timeRange: timeRange, preset: preset, onChange: onDateChange, adapter: adapter, peekNextMonth: props.peekNextMonth, excludeDates: props.excludeDates, filterDate: props.filterDate, minDate: minDate, maxDate: maxDate, formatString: props.formatString, locale: props.locale, fixedHeight: props.fixedHeight, monthsShown: monthsShown, hidePresetSearch: hidePresetSearch, footerContent: (0, jsx_runtime_1.jsx)(Footer, tslib_1.__assign({ "$hasError": hasError, "$onSubmit": handleSubmit, "$onClose": props.onClose }, footerProps, { className: ['px-6 py-3 mt-2', footerProps.className] }, { children: (0, jsx_runtime_1.jsxs)(box_1.Box, tslib_1.__assign({ className: "justify-between w-0 grow flex" }, { children: [(0, jsx_runtime_1.jsx)(FooterBeforeEnhancer, tslib_1.__assign({}, footerBeforeEnhancerProps)), (0, jsx_runtime_1.jsxs)(stack_1.Stack, tslib_1.__assign({ direction: monthsShown === 1 ? 'vertical' : 'horizontal', gap: 3, className: monthsShown !== 1 ? 'items-center' : undefined, style: { maxWidth: 'fit-content' } }, { children: [monthsShown === 1 ? null : errorEl, (0, jsx_runtime_1.jsxs)(stack_1.StackItem, tslib_1.__assign({ className: "flex self-end" }, { children: [(footerProps === null || footerProps === void 0 ? void 0 : footerProps.showClearButton) ? ((0, jsx_runtime_1.jsx)(button_1.Button, tslib_1.__assign({ size: "xs", onClick: footerProps.handleClearBtnClick, variant: "secondary", "data-testid": "clear", disabled: timeRange.length === 0 }, { children: locale.timeRangePicker.clearBtnLabel }))) : ((0, jsx_runtime_1.jsx)(button_1.Button, tslib_1.__assign({ size: "xs", onClick: props.onClose, variant: "secondary", "data-testid": "cancel" }, { children: locale.timeRangePicker.cancelBtnLabel }))), (0, jsx_runtime_1.jsx)(button_1.Button, tslib_1.__assign({ size: "xs", className: "ml-3", onClick: handleSubmit, disabled: hasError, "data-testid": "save" }, { children: locale.timeRangePicker.saveBtnLabel }))] })), monthsShown === 1 ? errorEl : null] }))] })) })) }, rangeSelectorProps))] })));
119
+ return ((0, jsx_runtime_1.jsxs)(box_1.Box, tslib_1.__assign({ className: "spr-ui-01 rounded-8" }, { children: [(0, jsx_runtime_1.jsxs)(Header, tslib_1.__assign({ "$setTimezone": setTimezone, "$onClose": props.onClose }, headerProps, { children: [(0, jsx_runtime_1.jsx)(HeaderBeforeEnhancer, tslib_1.__assign({ variant: "heading-7", "$as": "span", className: "flex items-center" }, headerBeforeEnhancerProps, { children: locale.timeRangePicker.headerLabel })), disableTimezone ? null : ((0, jsx_runtime_1.jsx)(TimezonePicker, tslib_1.__assign({ setTimezone: setTimezone, timezone: timezone, timezoneOptions: timezoneOptions }, timezonePickerProps, { "aria-label": locale.timeRangePicker.timezoneLabel, className: ['w-0 grow max-w-md', timezonePickerProps === null || timezonePickerProps === void 0 ? void 0 : timezonePickerProps.className] })))] })), (0, jsx_runtime_1.jsx)(RangeSelector, tslib_1.__assign({ overrides: props.overrides, timeSelect: props.timeSelect, timeRangePresets: timeRangePresets, timezone: timezone, timeRange: timeRange, preset: preset, onChange: onDateChange, adapter: adapter, peekNextMonth: props.peekNextMonth, excludeDates: props.excludeDates, filterDate: props.filterDate, minDate: minDate, maxDate: maxDate, formatString: props.formatString, locale: props.locale, fixedHeight: props.fixedHeight, monthsShown: monthsShown, hidePresetSearch: hidePresetSearch, footerContent: (0, jsx_runtime_1.jsx)(Footer, tslib_1.__assign({ "$hasError": hasError, "$onSubmit": handleSubmit, "$onClose": props.onClose }, footerProps, { className: ['px-6 py-3 mt-2', footerProps.className] }, { children: (0, jsx_runtime_1.jsxs)(box_1.Box, tslib_1.__assign({ className: "justify-between w-0 grow flex" }, { children: [(0, jsx_runtime_1.jsx)(FooterBeforeEnhancer, tslib_1.__assign({}, footerBeforeEnhancerProps)), (0, jsx_runtime_1.jsxs)(stack_1.Stack, tslib_1.__assign({ direction: monthsShown === 1 ? 'vertical' : 'horizontal', gap: 3, className: monthsShown !== 1 ? 'items-center' : undefined, style: { maxWidth: 'fit-content' } }, { children: [monthsShown === 1 ? null : errorEl, (0, jsx_runtime_1.jsxs)(stack_1.StackItem, tslib_1.__assign({ className: "flex self-end" }, { children: [(footerProps === null || footerProps === void 0 ? void 0 : footerProps.showClearButton) ? ((0, jsx_runtime_1.jsx)(button_1.Button, tslib_1.__assign({ size: "xs", onClick: footerProps.handleClearBtnClick, variant: "secondary", "data-testid": "clear", disabled: timeRange.length === 0 }, { children: locale.timeRangePicker.clearBtnLabel }))) : ((0, jsx_runtime_1.jsx)(button_1.Button, tslib_1.__assign({ size: "xs", onClick: props.onClose, variant: "secondary", "data-testid": "cancel" }, { children: locale.timeRangePicker.cancelBtnLabel }))), (0, jsx_runtime_1.jsx)(button_1.Button, tslib_1.__assign({ size: "xs", className: "ml-3", onClick: handleSubmit, disabled: hasError, "data-testid": "save" }, { children: locale.timeRangePicker.saveBtnLabel }))] })), monthsShown === 1 ? errorEl : null] }))] })) })) }, rangeSelectorProps))] })));
120
120
  };
121
121
  RangeSelectorContainer.displayName = 'RangeSelectorContainer';
122
122
  exports.default = RangeSelectorContainer;
@@ -18,6 +18,7 @@ export type TimezonePickerProps = {
18
18
  modernZonesOnly?: boolean;
19
19
  className?: ClassName;
20
20
  style?: Styles;
21
+ 'aria-label'?: string;
21
22
  };
22
23
  export type TimeRangeListProps = {
23
24
  timeRangePresets: TimeRangePreset[];
@@ -24,6 +24,7 @@ export type TimezonePickerProps = {
24
24
  size?: Size;
25
25
  clearable?: boolean;
26
26
  placeholder?: string;
27
+ 'aria-label'?: string;
27
28
  /**
28
29
  * When true, filters out deprecated timezone abbreviations (e.g., EST, PST, CET)
29
30
  * and shows only modern IANA timezone identifiers (e.g., America/New_York).