@carbon/react 1.34.1 → 1.35.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.
- package/es/components/ComposedModal/ComposedModal.d.ts +5 -1
- package/es/components/ComposedModal/ComposedModal.js +15 -0
- package/es/components/DataTable/DataTable.d.ts +27 -24
- package/es/components/DataTableSkeleton/DataTableSkeleton.d.ts +4 -62
- package/es/components/DataTableSkeleton/DataTableSkeleton.js +9 -17
- package/es/components/Modal/Modal.js +14 -0
- package/es/components/MultiSelect/FilterableMultiSelect.js +4 -9
- package/es/components/Select/Select.js +9 -1
- package/es/components/Tabs/Tabs.d.ts +3 -3
- package/es/components/Tabs/Tabs.js +2 -2
- package/es/components/Tile/Tile.js +11 -8
- package/es/components/Tooltip/Tooltip.js +1 -1
- package/es/components/UIShell/HeaderMenu.js +22 -3
- package/es/components/UIShell/SideNav.d.ts +6 -1
- package/es/components/UIShell/SideNav.js +27 -23
- package/es/components/UIShell/SideNavLink.js +17 -3
- package/es/components/UIShell/SideNavMenu.js +10 -2
- package/es/components/UIShell/_utils.js +1 -1
- package/es/internal/useNoInteractiveChildren.js +24 -1
- package/lib/components/ComposedModal/ComposedModal.d.ts +5 -1
- package/lib/components/ComposedModal/ComposedModal.js +15 -0
- package/lib/components/DataTable/DataTable.d.ts +27 -24
- package/lib/components/DataTableSkeleton/DataTableSkeleton.d.ts +4 -62
- package/lib/components/DataTableSkeleton/DataTableSkeleton.js +9 -17
- package/lib/components/Modal/Modal.js +14 -0
- package/lib/components/MultiSelect/FilterableMultiSelect.js +4 -9
- package/lib/components/Select/Select.js +9 -1
- package/lib/components/Tabs/Tabs.d.ts +3 -3
- package/lib/components/Tabs/Tabs.js +2 -2
- package/lib/components/Tile/Tile.js +10 -7
- package/lib/components/Tooltip/Tooltip.js +1 -1
- package/lib/components/UIShell/HeaderMenu.js +22 -3
- package/lib/components/UIShell/SideNav.d.ts +6 -1
- package/lib/components/UIShell/SideNav.js +26 -21
- package/lib/components/UIShell/SideNavLink.js +16 -2
- package/lib/components/UIShell/SideNavMenu.js +9 -1
- package/lib/components/UIShell/_utils.js +1 -1
- package/lib/internal/useNoInteractiveChildren.js +24 -0
- package/package.json +19 -18
|
@@ -44,8 +44,6 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
|
44
44
|
|
|
45
45
|
const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(function FilterableMultiSelect(_ref, ref) {
|
|
46
46
|
let {
|
|
47
|
-
['aria-label']: ariaLabel,
|
|
48
|
-
ariaLabel: deprecatedAriaLabel,
|
|
49
47
|
className: containerClassName,
|
|
50
48
|
compareItems,
|
|
51
49
|
direction,
|
|
@@ -324,9 +322,7 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
|
|
|
324
322
|
setInputValue('');
|
|
325
323
|
}
|
|
326
324
|
});
|
|
327
|
-
const menuProps = getMenuProps({
|
|
328
|
-
'aria-label': ariaLabel
|
|
329
|
-
}, {
|
|
325
|
+
const menuProps = getMenuProps({}, {
|
|
330
326
|
suppressRefError: true
|
|
331
327
|
});
|
|
332
328
|
const handleFocus = evt => {
|
|
@@ -341,7 +337,6 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
|
|
|
341
337
|
}, titleText ? /*#__PURE__*/React__default["default"].createElement("label", _rollupPluginBabelHelpers["extends"]({
|
|
342
338
|
className: titleClasses
|
|
343
339
|
}, labelProps), titleText) : null, /*#__PURE__*/React__default["default"].createElement(index["default"], {
|
|
344
|
-
"aria-label": deprecatedAriaLabel || ariaLabel,
|
|
345
340
|
onFocus: isFluid ? handleFocus : null,
|
|
346
341
|
onBlur: isFluid ? handleFocus : null,
|
|
347
342
|
className: className,
|
|
@@ -431,14 +426,15 @@ const FilterableMultiSelect = /*#__PURE__*/React__default["default"].forwardRef(
|
|
|
431
426
|
});
|
|
432
427
|
FilterableMultiSelect.propTypes = {
|
|
433
428
|
/**
|
|
429
|
+
* Deprecated, aria-label is no longer needed
|
|
434
430
|
* Specify a label to be read by screen readers on the container node
|
|
435
431
|
*/
|
|
436
|
-
['aria-label']: PropTypes__default["default"].string,
|
|
432
|
+
['aria-label']: deprecate["default"](PropTypes__default["default"].string, 'ariaLabel / aria-label props are no longer required for FilterableMultiSelect'),
|
|
437
433
|
/**
|
|
438
434
|
* Deprecated, please use `aria-label` instead.
|
|
439
435
|
* Specify a label to be read by screen readers on the container note.
|
|
440
436
|
*/
|
|
441
|
-
ariaLabel: deprecate["default"](PropTypes__default["default"].string, '
|
|
437
|
+
ariaLabel: deprecate["default"](PropTypes__default["default"].string, 'ariaLabel / aria-label props are no longer required for FilterableMultiSelect'),
|
|
442
438
|
/**
|
|
443
439
|
* Specify the direction of the multiselect dropdown. Can be either top or bottom.
|
|
444
440
|
*/
|
|
@@ -551,7 +547,6 @@ FilterableMultiSelect.propTypes = {
|
|
|
551
547
|
warnText: PropTypes__default["default"].node
|
|
552
548
|
};
|
|
553
549
|
FilterableMultiSelect.defaultProps = {
|
|
554
|
-
['aria-label']: 'Choose an item',
|
|
555
550
|
compareItems: sorting.defaultCompareItems,
|
|
556
551
|
direction: 'bottom',
|
|
557
552
|
disabled: false,
|
|
@@ -19,6 +19,7 @@ var usePrefix = require('../../internal/usePrefix.js');
|
|
|
19
19
|
require('../FluidForm/FluidForm.js');
|
|
20
20
|
var FormContext = require('../FluidForm/FormContext.js');
|
|
21
21
|
var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
|
|
22
|
+
var events = require('../../tools/events.js');
|
|
22
23
|
|
|
23
24
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
24
25
|
|
|
@@ -47,6 +48,7 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
|
|
|
47
48
|
size,
|
|
48
49
|
warn = false,
|
|
49
50
|
warnText,
|
|
51
|
+
onChange,
|
|
50
52
|
...other
|
|
51
53
|
} = _ref;
|
|
52
54
|
const prefix = usePrefix.usePrefix();
|
|
@@ -54,6 +56,7 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
|
|
|
54
56
|
isFluid
|
|
55
57
|
} = React.useContext(FormContext.FormContext);
|
|
56
58
|
const [isFocused, setIsFocused] = React.useState(false);
|
|
59
|
+
const [title, setTitle] = React.useState('');
|
|
57
60
|
const {
|
|
58
61
|
current: selectInstanceId
|
|
59
62
|
} = React.useRef(getInstanceId());
|
|
@@ -106,6 +109,9 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
|
|
|
106
109
|
const handleFocus = evt => {
|
|
107
110
|
setIsFocused(evt.type === 'focus' ? true : false);
|
|
108
111
|
};
|
|
112
|
+
const handleChange = evt => {
|
|
113
|
+
setTitle(evt?.target?.value);
|
|
114
|
+
};
|
|
109
115
|
const readOnlyEventHandlers = {
|
|
110
116
|
onMouseDown: evt => {
|
|
111
117
|
// NOTE: does not prevent click
|
|
@@ -129,7 +135,9 @@ const Select = /*#__PURE__*/React__default["default"].forwardRef(function Select
|
|
|
129
135
|
className: inputClasses,
|
|
130
136
|
disabled: disabled || undefined,
|
|
131
137
|
"aria-invalid": invalid || undefined,
|
|
132
|
-
"aria-readonly": readOnly || undefined
|
|
138
|
+
"aria-readonly": readOnly || undefined,
|
|
139
|
+
title: title,
|
|
140
|
+
onChange: events.composeEventHandlers([onChange, handleChange])
|
|
133
141
|
}, readOnlyEventHandlers, {
|
|
134
142
|
ref: ref
|
|
135
143
|
}), children), /*#__PURE__*/React__default["default"].createElement(iconsReact.ChevronDown, {
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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":
|
|
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
|
-
|
|
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
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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(
|
|
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.
|
|
4
|
+
"version": "1.35.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.
|
|
48
|
-
"@carbon/icons-react": "^11.
|
|
49
|
-
"@carbon/layout": "^11.
|
|
50
|
-
"@carbon/styles": "^1.
|
|
48
|
+
"@carbon/feature-flags": "^0.16.0",
|
|
49
|
+
"@carbon/icons-react": "^11.24.0",
|
|
50
|
+
"@carbon/layout": "^11.18.0",
|
|
51
|
+
"@carbon/styles": "^1.35.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.
|
|
79
|
+
"@carbon/themes": "^11.23.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
|
|
84
|
-
"@storybook/addon-actions": "^7.0
|
|
85
|
-
"@storybook/addon-docs": "^7.0
|
|
86
|
-
"@storybook/addon-essentials": "^7.0
|
|
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
|
|
90
|
-
"@storybook/react": "^7.0
|
|
91
|
-
"@storybook/react-webpack5": "^7.0
|
|
92
|
-
"@storybook/theming": "^7.0
|
|
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": "^
|
|
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
|
|
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": "
|
|
141
|
+
"gitHead": "f9ac32a70a209100bb30ed41edc39c596eae7956"
|
|
141
142
|
}
|