@carbon/react 1.34.1 → 1.35.0-rc.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 (37) hide show
  1. package/es/components/ComposedModal/ComposedModal.d.ts +5 -1
  2. package/es/components/ComposedModal/ComposedModal.js +15 -0
  3. package/es/components/DataTable/DataTable.d.ts +27 -24
  4. package/es/components/DataTableSkeleton/DataTableSkeleton.d.ts +4 -62
  5. package/es/components/DataTableSkeleton/DataTableSkeleton.js +9 -17
  6. package/es/components/Modal/Modal.js +14 -0
  7. package/es/components/MultiSelect/FilterableMultiSelect.js +4 -9
  8. package/es/components/Tabs/Tabs.d.ts +3 -3
  9. package/es/components/Tabs/Tabs.js +2 -2
  10. package/es/components/Tile/Tile.js +11 -8
  11. package/es/components/Tooltip/Tooltip.js +1 -1
  12. package/es/components/UIShell/HeaderMenu.js +22 -3
  13. package/es/components/UIShell/SideNav.d.ts +6 -1
  14. package/es/components/UIShell/SideNav.js +27 -23
  15. package/es/components/UIShell/SideNavLink.js +17 -3
  16. package/es/components/UIShell/SideNavMenu.js +10 -2
  17. package/es/components/UIShell/_utils.js +1 -1
  18. package/es/internal/useNoInteractiveChildren.js +24 -1
  19. package/lib/components/ComposedModal/ComposedModal.d.ts +5 -1
  20. package/lib/components/ComposedModal/ComposedModal.js +15 -0
  21. package/lib/components/DataTable/DataTable.d.ts +27 -24
  22. package/lib/components/DataTableSkeleton/DataTableSkeleton.d.ts +4 -62
  23. package/lib/components/DataTableSkeleton/DataTableSkeleton.js +9 -17
  24. package/lib/components/Modal/Modal.js +14 -0
  25. package/lib/components/MultiSelect/FilterableMultiSelect.js +4 -9
  26. package/lib/components/Tabs/Tabs.d.ts +3 -3
  27. package/lib/components/Tabs/Tabs.js +2 -2
  28. package/lib/components/Tile/Tile.js +10 -7
  29. package/lib/components/Tooltip/Tooltip.js +1 -1
  30. package/lib/components/UIShell/HeaderMenu.js +22 -3
  31. package/lib/components/UIShell/SideNav.d.ts +6 -1
  32. package/lib/components/UIShell/SideNav.js +26 -21
  33. package/lib/components/UIShell/SideNavLink.js +16 -2
  34. package/lib/components/UIShell/SideNavMenu.js +9 -1
  35. package/lib/components/UIShell/_utils.js +1 -1
  36. package/lib/internal/useNoInteractiveChildren.js +24 -0
  37. package/package.json +19 -18
@@ -115,7 +115,7 @@ export interface TabListProps extends DivAttributes {
115
115
  /**
116
116
  * Provide the props that describe the left overflow button
117
117
  */
118
- leftOverflowButtonProps: HTMLAttributes<HTMLButtonElement>;
118
+ leftOverflowButtonProps?: HTMLAttributes<HTMLButtonElement>;
119
119
  /**
120
120
  * Specify whether to use the light component variant
121
121
  */
@@ -123,7 +123,7 @@ export interface TabListProps extends DivAttributes {
123
123
  /**
124
124
  * Provide the props that describe the right overflow button
125
125
  */
126
- rightOverflowButtonProps: HTMLAttributes<HTMLButtonElement>;
126
+ rightOverflowButtonProps?: HTMLAttributes<HTMLButtonElement>;
127
127
  /**
128
128
  * Optionally provide a delay (in milliseconds) passed to the lodash
129
129
  * debounce of the onScroll handler. This will impact the responsiveness
@@ -299,7 +299,7 @@ export interface TabPanelsProps {
299
299
  */
300
300
  children?: ReactNode;
301
301
  }
302
- declare function TabPanels({ children }: TabPanelsProps): JSX.Element[] | null | undefined;
302
+ declare function TabPanels({ children }: TabPanelsProps): JSX.Element;
303
303
  declare namespace TabPanels {
304
304
  var propTypes: {
305
305
  /**
@@ -802,11 +802,11 @@ function TabPanels(_ref8) {
802
802
  let {
803
803
  children
804
804
  } = _ref8;
805
- return React__default["default"].Children.map(children, (child, index) => {
805
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, React__default["default"].Children.map(children, (child, index) => {
806
806
  return /*#__PURE__*/React__default["default"].createElement(TabPanelContext.Provider, {
807
807
  value: index
808
808
  }, child);
809
- });
809
+ }));
810
810
  }
811
811
  TabPanels.propTypes = {
812
812
  /**
@@ -22,6 +22,7 @@ var useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
22
22
  var useNoInteractiveChildren = require('../../internal/useNoInteractiveChildren.js');
23
23
  var useMergedRefs = require('../../internal/useMergedRefs.js');
24
24
  var index = require('../FeatureFlags/index.js');
25
+ var useId = require('../../internal/useId.js');
25
26
  var match = require('../../internal/keyboard/match.js');
26
27
  var keys = require('../../internal/keyboard/keys.js');
27
28
 
@@ -385,10 +386,10 @@ const ExpandableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
385
386
  if (!aboveTheFold.current || !belowTheFold.current) {
386
387
  return;
387
388
  }
388
- if (!useNoInteractiveChildren.getInteractiveContent(belowTheFold.current)) {
389
- setInteractive(false);
390
- return;
391
- } else if (!useNoInteractiveChildren.getInteractiveContent(aboveTheFold.current)) {
389
+
390
+ // Interactive elements or elements that are given a role should be treated
391
+ // the same because elements with a role can not be rendered inside a `button`
392
+ if (!useNoInteractiveChildren.getInteractiveContent(belowTheFold.current) && !useNoInteractiveChildren.getRoleContent(belowTheFold.current) && !useNoInteractiveChildren.getInteractiveContent(aboveTheFold.current) && !useNoInteractiveChildren.getRoleContent(aboveTheFold.current)) {
392
393
  setInteractive(false);
393
394
  }
394
395
  }, []);
@@ -413,11 +414,11 @@ const ExpandableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
413
414
  resizeObserver.observe(aboveTheFold.current);
414
415
  return () => resizeObserver.disconnect();
415
416
  }, []);
417
+ const belowTheFoldId = useId.useId('expandable-tile-interactive');
416
418
  return interactive ? /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
417
419
  // @ts-expect-error: Needlesly strict & deep typing for the element type
418
420
  ref: ref,
419
- className: interactiveClassNames,
420
- "aria-expanded": isExpanded
421
+ className: interactiveClassNames
421
422
  }, rest), /*#__PURE__*/React__default["default"].createElement("div", {
422
423
  ref: tileContent
423
424
  }, /*#__PURE__*/React__default["default"].createElement("div", {
@@ -426,13 +427,15 @@ const ExpandableTile = /*#__PURE__*/React__default["default"].forwardRef(functio
426
427
  }, childrenAsArray[0]), /*#__PURE__*/React__default["default"].createElement("button", {
427
428
  type: "button",
428
429
  "aria-expanded": isExpanded,
430
+ "aria-controls": belowTheFoldId,
429
431
  onKeyUp: events.composeEventHandlers([onKeyUp, handleKeyUp]),
430
432
  onClick: events.composeEventHandlers([onClick, handleClick]),
431
433
  "aria-label": isExpanded ? tileExpandedIconText : tileCollapsedIconText,
432
434
  className: chevronInteractiveClassNames
433
435
  }, _ChevronDown || (_ChevronDown = /*#__PURE__*/React__default["default"].createElement(iconsReact.ChevronDown, null))), /*#__PURE__*/React__default["default"].createElement("div", {
434
436
  ref: belowTheFold,
435
- className: `${prefix}--tile-content`
437
+ className: `${prefix}--tile-content`,
438
+ id: belowTheFoldId
436
439
  }, childrenAsArray[1]))) : /*#__PURE__*/React__default["default"].createElement("button", _rollupPluginBabelHelpers["extends"]({
437
440
  type: "button"
438
441
  // @ts-expect-error: Needlesly strict & deep typing for the element type
@@ -110,7 +110,7 @@ function Tooltip(_ref) {
110
110
  ...triggerProps,
111
111
  ...getChildEventHandlers(child.props)
112
112
  }) : null), /*#__PURE__*/React__default["default"].createElement(index.PopoverContent, {
113
- "aria-hidden": "true",
113
+ "aria-hidden": open ? 'false' : 'true',
114
114
  className: `${prefix}--tooltip-content`,
115
115
  id: id,
116
116
  ref: tooltipRef,
@@ -17,6 +17,7 @@ var PropTypes = require('prop-types');
17
17
  var AriaPropTypes = require('../../prop-types/AriaPropTypes.js');
18
18
  var usePrefix = require('../../internal/usePrefix.js');
19
19
  var deprecate = require('../../prop-types/deprecate.js');
20
+ var events = require('../../tools/events.js');
20
21
  var match = require('../../internal/keyboard/match.js');
21
22
  var keys = require('../../internal/keyboard/keys.js');
22
23
 
@@ -152,6 +153,9 @@ class HeaderMenu extends React__default["default"].Component {
152
153
  menuLinkName,
153
154
  focusRef,
154
155
  // eslint-disable-line no-unused-vars
156
+ onBlur,
157
+ onClick,
158
+ onKeyDown,
155
159
  ...rest
156
160
  } = this.props;
157
161
  const hasActiveChildren = React__default["default"].Children.toArray(children).some(child => child.props.isActive || child.props.isCurrentPage);
@@ -181,9 +185,9 @@ class HeaderMenu extends React__default["default"].Component {
181
185
  // - href can be set to javascript:void(0), ideally this will be a button
182
186
  return /*#__PURE__*/React__default["default"].createElement("li", _rollupPluginBabelHelpers["extends"]({}, rest, {
183
187
  className: itemClassName,
184
- onKeyDown: this.handleMenuClose,
185
- onClick: this.handleOnClick,
186
- onBlur: this.handleOnBlur
188
+ onKeyDown: events.composeEventHandlers([onKeyDown, this.handleMenuClose]),
189
+ onClick: events.composeEventHandlers([onClick, this.handleOnClick]),
190
+ onBlur: events.composeEventHandlers([onBlur, this.handleOnBlur])
187
191
  }), /*#__PURE__*/React__default["default"].createElement("a", _rollupPluginBabelHelpers["extends"]({
188
192
  // eslint-disable-line jsx-a11y/role-supports-aria-props,jsx-a11y/anchor-is-valid
189
193
  "aria-haspopup": "menu" // eslint-disable-line jsx-a11y/aria-proptypes
@@ -228,6 +232,21 @@ _rollupPluginBabelHelpers.defineProperty(HeaderMenu, "propTypes", {
228
232
  * Provide a label for the link text
229
233
  */
230
234
  menuLinkName: PropTypes__default["default"].string.isRequired,
235
+ /**
236
+ * Optionally provide an onBlur handler that is called when the underlying
237
+ * button fires it's onblur event
238
+ */
239
+ onBlur: PropTypes__default["default"].func,
240
+ /**
241
+ * Optionally provide an onClick handler that is called when the underlying
242
+ * button fires it's onclick event
243
+ */
244
+ onClick: PropTypes__default["default"].func,
245
+ /**
246
+ * Optionally provide an onKeyDown handler that is called when the underlying
247
+ * button fires it's onkeydown event
248
+ */
249
+ onKeyDown: PropTypes__default["default"].func,
231
250
  /**
232
251
  * Optional component to render instead of string
233
252
  */
@@ -19,6 +19,11 @@ interface SideNavProps extends ComponentProps<'nav'> {
19
19
  onOverlayClick?: MouseEventHandler<HTMLDivElement> | undefined;
20
20
  onSideNavBlur?: () => void | undefined;
21
21
  enterDelayMs?: number;
22
+ inert?: boolean;
22
23
  }
23
- declare const SideNav: React.ForwardRefExoticComponent<Pick<SideNavProps, "children" | "slot" | "style" | "title" | "className" | "dir" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "onToggle" | "key" | "id" | "aria-controls" | "aria-expanded" | "onClick" | "onAnimationEnd" | "onKeyDown" | "contentEditable" | "contextMenu" | "draggable" | "hidden" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "href" | "expanded" | "enterDelayMs" | "defaultExpanded" | "addFocusListeners" | "isChildOfHeader" | "isFixedNav" | "isRail" | "isPersistent" | "addMouseListeners" | "onOverlayClick" | "onSideNavBlur"> & React.RefAttributes<HTMLElement>>;
24
+ interface SideNavContextData {
25
+ isRail?: boolean | undefined;
26
+ }
27
+ export declare const SideNavContext: React.Context<SideNavContextData>;
28
+ declare const SideNav: React.ForwardRefExoticComponent<Pick<SideNavProps, "children" | "slot" | "style" | "title" | "className" | "dir" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "onToggle" | "key" | "id" | "aria-controls" | "aria-expanded" | "onClick" | "onAnimationEnd" | "onKeyDown" | "contentEditable" | "contextMenu" | "draggable" | "hidden" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "href" | "expanded" | "enterDelayMs" | "defaultExpanded" | "addFocusListeners" | "isChildOfHeader" | "isFixedNav" | "isRail" | "isPersistent" | "addMouseListeners" | "onOverlayClick" | "onSideNavBlur" | "inert"> & React.RefAttributes<HTMLElement>>;
24
29
  export default SideNav;
@@ -30,6 +30,7 @@ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
30
30
 
31
31
  // TO-DO: comment back in when footer is added for rails
32
32
  // import SideNavFooter from './SideNavFooter';
33
+ const SideNavContext = /*#__PURE__*/React.createContext({});
33
34
  function SideNavRenderFunction(_ref, ref) {
34
35
  let {
35
36
  expanded: expandedProp,
@@ -98,27 +99,25 @@ function SideNavRenderFunction(_ref, ref) {
98
99
  });
99
100
  let childrenToRender = children;
100
101
 
101
- // if a rail, pass the expansion state as a prop, so children can update themselves to match
102
- if (isRail) {
103
- childrenToRender = React__default["default"].Children.map(children, child => {
104
- // if we are controlled, check for if we have hovered over or the expanded state, else just use the expanded state (uncontrolled)
105
- const currentExpansionState = controlled ? expandedViaHoverState || expanded : expanded;
106
- if ( /*#__PURE__*/React.isValidElement(child)) {
107
- const childJsxElement = child;
108
- // avoid spreading `isSideNavExpanded` to non-Carbon UI Shell children
109
- return /*#__PURE__*/React__default["default"].cloneElement(childJsxElement, {
110
- ...(_utils.CARBON_SIDENAV_ITEMS.includes(childJsxElement.type?.displayName ?? childJsxElement.type?.name) ? {
111
- isSideNavExpanded: currentExpansionState
112
- } : {})
113
- });
114
- }
115
- return child;
116
- });
117
- }
102
+ // Pass the expansion state as a prop, so children can update themselves to match
103
+ childrenToRender = React__default["default"].Children.map(children, child => {
104
+ // if we are controlled, check for if we have hovered over or the expanded state, else just use the expanded state (uncontrolled)
105
+ const currentExpansionState = controlled ? expandedViaHoverState || expanded : expanded;
106
+ if ( /*#__PURE__*/React.isValidElement(child)) {
107
+ const childJsxElement = child;
108
+ // avoid spreading `isSideNavExpanded` to non-Carbon UI Shell children
109
+ return /*#__PURE__*/React__default["default"].cloneElement(childJsxElement, {
110
+ ...(_utils.CARBON_SIDENAV_ITEMS.includes(childJsxElement.type?.displayName ?? childJsxElement.type?.name) ? {
111
+ isSideNavExpanded: currentExpansionState
112
+ } : {})
113
+ });
114
+ }
115
+ return child;
116
+ });
118
117
  const eventHandlers = {};
119
118
  if (addFocusListeners) {
120
119
  eventHandlers.onFocus = event => {
121
- if (!event.currentTarget.contains(event.relatedTarget)) {
120
+ if (!event.currentTarget.contains(event.relatedTarget) && isRail) {
122
121
  handleToggle(event, true);
123
122
  }
124
123
  };
@@ -126,7 +125,7 @@ function SideNavRenderFunction(_ref, ref) {
126
125
  if (!event.currentTarget.contains(event.relatedTarget)) {
127
126
  handleToggle(event, false);
128
127
  }
129
- if (!event.currentTarget.contains(event.relatedTarget) && expanded) {
128
+ if (!event.currentTarget.contains(event.relatedTarget) && expanded && !isFixedNav) {
130
129
  if (onSideNavBlur) {
131
130
  onSideNavBlur();
132
131
  }
@@ -163,7 +162,11 @@ function SideNavRenderFunction(_ref, ref) {
163
162
  sideNavRef.current.focus();
164
163
  }
165
164
  });
166
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, isFixedNav ? null :
165
+ return /*#__PURE__*/React__default["default"].createElement(SideNavContext.Provider, {
166
+ value: {
167
+ isRail
168
+ }
169
+ }, isFixedNav ? null :
167
170
  /*#__PURE__*/
168
171
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
169
172
  React__default["default"].createElement("div", {
@@ -172,7 +175,8 @@ function SideNavRenderFunction(_ref, ref) {
172
175
  }), /*#__PURE__*/React__default["default"].createElement("nav", _rollupPluginBabelHelpers["extends"]({
173
176
  tabIndex: -1,
174
177
  ref: navRef,
175
- className: `${prefix}--side-nav__navigation ${className}`
178
+ className: `${prefix}--side-nav__navigation ${className}`,
179
+ inert: !isRail && (expanded ? undefined : -1)
176
180
  }, accessibilityLabel, eventHandlers, other), childrenToRender));
177
181
  }
178
182
  const SideNav = /*#__PURE__*/React__default["default"].forwardRef(SideNavRenderFunction);
@@ -259,4 +263,5 @@ SideNav.propTypes = {
259
263
 
260
264
  var SideNav$1 = SideNav;
261
265
 
266
+ exports.SideNavContext = SideNavContext;
262
267
  exports["default"] = SideNav$1;
@@ -18,6 +18,7 @@ var SideNavIcon = require('./SideNavIcon.js');
18
18
  var SideNavItem = require('./SideNavItem.js');
19
19
  var SideNavLinkText = require('./SideNavLinkText.js');
20
20
  var usePrefix = require('../../internal/usePrefix.js');
21
+ var SideNav = require('./SideNav.js');
21
22
 
22
23
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
23
24
 
@@ -31,9 +32,12 @@ const SideNavLink = /*#__PURE__*/React__default["default"].forwardRef(function S
31
32
  className: customClassName,
32
33
  renderIcon: IconElement,
33
34
  isActive,
35
+ isSideNavExpanded,
34
36
  large = false,
37
+ tabIndex,
35
38
  ...rest
36
39
  } = _ref;
40
+ const isRail = React.useContext(SideNav.SideNavContext);
37
41
  const prefix = usePrefix.usePrefix();
38
42
  const className = cx__default["default"]({
39
43
  [`${prefix}--side-nav__link`]: true,
@@ -44,7 +48,8 @@ const SideNavLink = /*#__PURE__*/React__default["default"].forwardRef(function S
44
48
  large: large
45
49
  }, /*#__PURE__*/React__default["default"].createElement(Link["default"], _rollupPluginBabelHelpers["extends"]({}, rest, {
46
50
  className: className,
47
- ref: ref
51
+ ref: ref,
52
+ tabIndex: tabIndex === undefined ? !isSideNavExpanded && !isRail ? -1 : 0 : tabIndex
48
53
  }), IconElement && /*#__PURE__*/React__default["default"].createElement(SideNavIcon["default"], {
49
54
  small: true
50
55
  }, /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement(SideNavLinkText["default"], null, children)));
@@ -64,6 +69,11 @@ SideNavLink.propTypes = {
64
69
  * Specify whether the link is the current page
65
70
  */
66
71
  isActive: PropTypes__default["default"].bool,
72
+ /**
73
+ * Property to indicate if the side nav container is open (or not). Use to
74
+ * keep local state and styling in step with the SideNav expansion state.
75
+ */
76
+ isSideNavExpanded: PropTypes__default["default"].bool,
67
77
  /**
68
78
  * Specify if this is a large variation of the SideNavLink
69
79
  */
@@ -71,7 +81,11 @@ SideNavLink.propTypes = {
71
81
  /**
72
82
  * Provide an icon to render in the side navigation link. Should be a React class.
73
83
  */
74
- renderIcon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].object])
84
+ renderIcon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].object]),
85
+ /**
86
+ * Optional prop to specify the tabIndex of the button. If undefined, it will be applied default validation
87
+ */
88
+ tabIndex: PropTypes__default["default"].number
75
89
  };
76
90
  var SideNavLink$1 = SideNavLink;
77
91
 
@@ -15,6 +15,7 @@ var PropTypes = require('prop-types');
15
15
  var React = require('react');
16
16
  var SideNavIcon = require('./SideNavIcon.js');
17
17
  var usePrefix = require('../../internal/usePrefix.js');
18
+ var SideNav = require('./SideNav.js');
18
19
  var match = require('../../internal/keyboard/match.js');
19
20
  var keys = require('../../internal/keyboard/keys.js');
20
21
 
@@ -34,8 +35,10 @@ const SideNavMenu = /*#__PURE__*/React__default["default"].forwardRef(function S
34
35
  large = false,
35
36
  renderIcon: IconElement,
36
37
  isSideNavExpanded,
38
+ tabIndex,
37
39
  title
38
40
  } = props;
41
+ const isRail = React.useContext(SideNav.SideNavContext);
39
42
  const prefix = usePrefix.usePrefix();
40
43
  const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);
41
44
  const [prevExpanded, setPrevExpanded] = React.useState(defaultExpanded);
@@ -70,7 +73,8 @@ const SideNavMenu = /*#__PURE__*/React__default["default"].forwardRef(function S
70
73
  setIsExpanded(!isExpanded);
71
74
  },
72
75
  ref: ref,
73
- type: "button"
76
+ type: "button",
77
+ tabIndex: tabIndex === undefined ? !isSideNavExpanded && !isRail ? -1 : 0 : tabIndex
74
78
  }, IconElement && /*#__PURE__*/React__default["default"].createElement(SideNavIcon["default"], null, /*#__PURE__*/React__default["default"].createElement(IconElement, null)), /*#__PURE__*/React__default["default"].createElement("span", {
75
79
  className: `${prefix}--side-nav__submenu-title`,
76
80
  title: title
@@ -118,6 +122,10 @@ SideNavMenu.propTypes = {
118
122
  * Pass in a custom icon to render next to the `SideNavMenu` title
119
123
  */
120
124
  renderIcon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].object]),
125
+ /**
126
+ * Optional prop to specify the tabIndex of the button. If undefined, it will be applied default validation
127
+ */
128
+ tabIndex: PropTypes__default["default"].number,
121
129
  /**
122
130
  * Provide the text for the overall menu name
123
131
  */
@@ -9,6 +9,6 @@
9
9
 
10
10
  Object.defineProperty(exports, '__esModule', { value: true });
11
11
 
12
- const CARBON_SIDENAV_ITEMS = ['SideNavFooter', 'SideNavHeader', 'SideNavItems', 'SideNavMenu'];
12
+ const CARBON_SIDENAV_ITEMS = ['SideNavFooter', 'SideNavHeader', 'SideNavItems', 'SideNavMenu', 'SideNavLink'];
13
13
 
14
14
  exports.CARBON_SIDENAV_ITEMS = CARBON_SIDENAV_ITEMS;
@@ -47,6 +47,29 @@ function getInteractiveContent(node) {
47
47
  return null;
48
48
  }
49
49
 
50
+ /**
51
+ * Determines if a given DOM node has a role, or has itself a role.
52
+ * It returns the node with a role if one is found
53
+ *
54
+ * @param {HTMLElement} node
55
+ * @returns {HTMLElement}
56
+ */
57
+ function getRoleContent(node) {
58
+ if (!node || !node.childNodes) {
59
+ return null;
60
+ }
61
+ if (node?.getAttribute?.('role') && node.getAttribute('role') !== '') {
62
+ return node;
63
+ }
64
+ for (const childNode of node.childNodes) {
65
+ const roleNode = getRoleContent(childNode);
66
+ if (roleNode) {
67
+ return roleNode;
68
+ }
69
+ }
70
+ return null;
71
+ }
72
+
50
73
  /**
51
74
  * Determines if the given element is focusable, or not
52
75
  *
@@ -76,4 +99,5 @@ function isFocusable(element) {
76
99
  }
77
100
 
78
101
  exports.getInteractiveContent = getInteractiveContent;
102
+ exports.getRoleContent = getRoleContent;
79
103
  exports.useNoInteractiveChildren = useNoInteractiveChildren;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@carbon/react",
3
3
  "description": "React components for the Carbon Design System",
4
- "version": "1.34.1",
4
+ "version": "1.35.0-rc.0",
5
5
  "license": "Apache-2.0",
6
6
  "main": "lib/index.js",
7
7
  "module": "es/index.js",
@@ -28,7 +28,8 @@
28
28
  "react"
29
29
  ],
30
30
  "publishConfig": {
31
- "access": "public"
31
+ "access": "public",
32
+ "provenance": true
32
33
  },
33
34
  "scripts": {
34
35
  "build": "yarn clean && node tasks/build-styles.js && node tasks/build.js",
@@ -44,10 +45,10 @@
44
45
  },
45
46
  "dependencies": {
46
47
  "@babel/runtime": "^7.18.3",
47
- "@carbon/feature-flags": "^0.15.0",
48
- "@carbon/icons-react": "^11.23.1",
49
- "@carbon/layout": "^11.17.1",
50
- "@carbon/styles": "^1.34.1",
48
+ "@carbon/feature-flags": "^0.16.0-rc.0",
49
+ "@carbon/icons-react": "^11.24.0-rc.0",
50
+ "@carbon/layout": "^11.18.0-rc.0",
51
+ "@carbon/styles": "^1.35.0-rc.0",
51
52
  "@carbon/telemetry": "0.1.0",
52
53
  "classnames": "2.3.2",
53
54
  "copy-to-clipboard": "^3.3.1",
@@ -75,21 +76,21 @@
75
76
  "@babel/preset-react": "^7.22.3",
76
77
  "@babel/preset-typescript": "^7.21.5",
77
78
  "@carbon/test-utils": "^10.30.0",
78
- "@carbon/themes": "^11.22.1",
79
+ "@carbon/themes": "^11.23.0-rc.0",
79
80
  "@rollup/plugin-babel": "^6.0.0",
80
81
  "@rollup/plugin-commonjs": "^25.0.0",
81
82
  "@rollup/plugin-node-resolve": "^15.0.0",
82
83
  "@rollup/plugin-typescript": "^11.0.0",
83
- "@storybook/addon-a11y": "^7.0.23",
84
- "@storybook/addon-actions": "^7.0.23",
85
- "@storybook/addon-docs": "^7.0.23",
86
- "@storybook/addon-essentials": "^7.0.23",
84
+ "@storybook/addon-a11y": "^7.1.0",
85
+ "@storybook/addon-actions": "^7.1.0",
86
+ "@storybook/addon-docs": "^7.1.0",
87
+ "@storybook/addon-essentials": "^7.1.0",
87
88
  "@storybook/addon-knobs": "^7.0.2",
88
89
  "@storybook/addon-notes": "^5.3.21",
89
- "@storybook/addon-storysource": "^7.0.23",
90
- "@storybook/react": "^7.0.23",
91
- "@storybook/react-webpack5": "^7.0.23",
92
- "@storybook/theming": "^7.0.23",
90
+ "@storybook/addon-storysource": "^7.1.0",
91
+ "@storybook/react": "^7.1.0",
92
+ "@storybook/react-webpack5": "^7.1.0",
93
+ "@storybook/theming": "^7.1.0",
93
94
  "@types/react-is": "~18.2.0",
94
95
  "autoprefixer": "^10.4.0",
95
96
  "babel-loader": "^9.0.0",
@@ -101,7 +102,7 @@
101
102
  "css-loader": "^6.5.1",
102
103
  "enquirer": "^2.3.6",
103
104
  "fast-glob": "^3.2.7",
104
- "fs-extra": "^10.0.0",
105
+ "fs-extra": "^11.0.0",
105
106
  "html-webpack-plugin": "^5.5.0",
106
107
  "mini-css-extract-plugin": "^2.4.5",
107
108
  "postcss": "^8.4.5",
@@ -118,7 +119,7 @@
118
119
  "rtlcss": "^4.0.0",
119
120
  "sass": "^1.51.0",
120
121
  "sass-loader": "^13.0.0",
121
- "storybook": "^7.0.23",
122
+ "storybook": "^7.1.0",
122
123
  "storybook-readme": "^5.0.9",
123
124
  "stream-browserify": "^3.0.0",
124
125
  "style-loader": "^3.3.1",
@@ -137,5 +138,5 @@
137
138
  "**/*.scss",
138
139
  "**/*.css"
139
140
  ],
140
- "gitHead": "22b28f5d05e6caa4565e4e84308abcf2fd977aec"
141
+ "gitHead": "39f36c63d5cb77a525e0a82f0e565b8d6ef658e9"
141
142
  }