@carbon/react 1.26.1 → 1.27.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/Checkbox/Checkbox.d.ts +20 -0
- package/es/components/Checkbox/Checkbox.js +58 -4
- package/es/components/CheckboxGroup/CheckboxGroup.js +119 -0
- package/es/components/ComboBox/ComboBox.js +11 -2
- package/es/components/ContentSwitcher/ContentSwitcher.js +9 -4
- package/es/components/Copy/Copy.js +1 -1
- package/es/components/DataTable/DataTable.js +44 -2
- package/es/components/DataTable/Table.js +1 -2
- package/es/components/DataTable/TableCell.js +1 -2
- package/es/components/DataTable/TableExpandRow.js +1 -2
- package/es/components/DataTable/TableExpandedRow.js +1 -2
- package/es/components/DataTable/TableHead.js +1 -2
- package/es/components/DataTable/TableHeader.js +1 -2
- package/es/components/DataTable/TableRow.js +1 -2
- package/es/components/DataTable/TableSelectAll.js +1 -2
- package/es/components/DataTable/TableSelectRow.js +1 -2
- package/es/components/DataTable/TableToolbar.js +2 -3
- package/es/components/DataTable/TableToolbarAction.js +1 -2
- package/es/components/DataTable/TableToolbarContent.js +1 -2
- package/es/components/DataTable/TableToolbarMenu.js +1 -2
- package/es/components/DataTable/index.d.ts +29 -0
- package/es/components/DataTable/index.js +70 -0
- package/es/components/DatePicker/DatePicker.js +25 -3
- package/es/components/DatePicker/plugins/fixEventsPlugin.js +15 -1
- package/es/components/DatePickerInput/DatePickerInput.js +7 -2
- package/es/components/Dropdown/Dropdown.js +16 -4
- package/es/components/ErrorBoundary/ErrorBoundary.js +1 -1
- package/es/components/FileUploader/FileUploader.js +1 -1
- package/es/components/FluidDatePicker/FluidDatePicker.js +9 -2
- package/es/components/IconButton/index.js +19 -5
- package/es/components/Modal/Modal.js +4 -2
- package/es/components/ModalWrapper/ModalWrapper.js +1 -1
- package/es/components/MultiSelect/FilterableMultiSelect.js +9 -1
- package/es/components/MultiSelect/MultiSelect.js +2 -1
- package/es/components/NumberInput/NumberInput.js +10 -2
- package/es/components/ProgressBar/ProgressBar.js +3 -0
- package/es/components/RadioButtonGroup/RadioButtonGroup.js +2 -1
- package/es/components/RadioTile/RadioTile.js +1 -1
- package/es/components/Select/Select.d.ts +1 -1
- package/es/components/Select/Select.js +10 -1
- package/es/components/StructuredList/StructuredList.js +2 -1
- package/es/components/Switch/IconSwitch.js +174 -0
- package/es/components/Tabs/Tabs.js +29 -17
- package/es/components/TextArea/TextArea.js +16 -1
- package/es/components/TextInput/ControlledPasswordInput.js +11 -2
- package/es/components/TextInput/PasswordInput.js +4 -1
- package/es/components/TextInput/index.js +0 -3
- package/es/components/TextInput/util.js +15 -2
- package/es/components/Tile/Tile.js +6 -4
- package/es/components/Toggle/Toggle.Skeleton.d.ts +58 -0
- package/es/components/Toggle/Toggle.Skeleton.js +1 -1
- package/es/components/ToggleSmall/ToggleSmall.Skeleton.js +1 -1
- package/es/components/Tooltip/Tooltip.d.ts +1 -1
- package/es/components/UIShell/HeaderMenu.js +1 -1
- package/es/index.d.ts +1 -0
- package/es/index.js +4 -1
- package/lib/components/Checkbox/Checkbox.d.ts +20 -0
- package/lib/components/Checkbox/Checkbox.js +58 -4
- package/lib/components/CheckboxGroup/CheckboxGroup.js +129 -0
- package/lib/components/ComboBox/ComboBox.js +10 -1
- package/lib/components/ContentSwitcher/ContentSwitcher.js +9 -4
- package/lib/components/Copy/Copy.js +1 -1
- package/lib/components/DataTable/DataTable.js +48 -6
- package/lib/components/DataTable/Table.js +1 -2
- package/lib/components/DataTable/TableCell.js +1 -2
- package/lib/components/DataTable/TableExpandRow.js +1 -2
- package/lib/components/DataTable/TableExpandedRow.js +1 -2
- package/lib/components/DataTable/TableHead.js +1 -2
- package/lib/components/DataTable/TableHeader.js +1 -2
- package/lib/components/DataTable/TableRow.js +1 -2
- package/lib/components/DataTable/TableSelectAll.js +1 -2
- package/lib/components/DataTable/TableSelectRow.js +1 -2
- package/lib/components/DataTable/TableToolbar.js +1 -2
- package/lib/components/DataTable/TableToolbarAction.js +1 -2
- package/lib/components/DataTable/TableToolbarContent.js +1 -2
- package/lib/components/DataTable/TableToolbarMenu.js +1 -2
- package/lib/components/DataTable/index.d.ts +29 -0
- package/lib/components/DataTable/index.js +76 -0
- package/lib/components/DatePicker/DatePicker.js +25 -3
- package/lib/components/DatePicker/plugins/fixEventsPlugin.js +15 -1
- package/lib/components/DatePickerInput/DatePickerInput.js +7 -2
- package/lib/components/Dropdown/Dropdown.js +15 -3
- package/lib/components/FluidDatePicker/FluidDatePicker.js +9 -2
- package/lib/components/IconButton/index.js +19 -5
- package/lib/components/Modal/Modal.js +4 -2
- package/lib/components/MultiSelect/FilterableMultiSelect.js +8 -0
- package/lib/components/MultiSelect/MultiSelect.js +2 -1
- package/lib/components/NumberInput/NumberInput.js +10 -2
- package/lib/components/ProgressBar/ProgressBar.js +3 -0
- package/lib/components/RadioButtonGroup/RadioButtonGroup.js +2 -1
- package/lib/components/RadioTile/RadioTile.js +1 -1
- package/lib/components/Select/Select.d.ts +1 -1
- package/lib/components/Select/Select.js +9 -0
- package/lib/components/StructuredList/StructuredList.js +2 -1
- package/lib/components/Switch/IconSwitch.js +184 -0
- package/lib/components/Tabs/Tabs.js +29 -17
- package/lib/components/TextArea/TextArea.js +16 -1
- package/lib/components/TextInput/ControlledPasswordInput.js +10 -1
- package/lib/components/TextInput/PasswordInput.js +4 -1
- package/lib/components/TextInput/index.js +0 -3
- package/lib/components/TextInput/util.js +15 -2
- package/lib/components/Tile/Tile.js +6 -4
- package/lib/components/Toggle/Toggle.Skeleton.d.ts +58 -0
- package/lib/components/Toggle/Toggle.Skeleton.js +1 -1
- package/lib/components/Tooltip/Tooltip.d.ts +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +6 -1
- package/package.json +12 -12
|
@@ -141,12 +141,13 @@ function StructuredListRow(props) {
|
|
|
141
141
|
setHasFocusWithin = _useState2[1];
|
|
142
142
|
|
|
143
143
|
var id = useId.useId('grid-input');
|
|
144
|
+
var selectedRow = React__default["default"].useContext(GridSelectedRowStateContext);
|
|
144
145
|
var setSelectedRow = React__default["default"].useContext(GridSelectedRowDispatchContext);
|
|
145
146
|
var prefix = usePrefix.usePrefix();
|
|
146
147
|
var value = {
|
|
147
148
|
id: id
|
|
148
149
|
};
|
|
149
|
-
var classes = cx__default["default"]("".concat(prefix, "--structured-list-row"), className, (_classNames2 = {}, _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--structured-list-row--header-row"), head), _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--structured-list-row--focused-within"), hasFocusWithin), _classNames2));
|
|
150
|
+
var classes = cx__default["default"]("".concat(prefix, "--structured-list-row"), className, (_classNames2 = {}, _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--structured-list-row--header-row"), head), _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--structured-list-row--focused-within"), hasFocusWithin), _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--structured-list-row--selected"), selectedRow === id), _classNames2));
|
|
150
151
|
return head ? /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
|
|
151
152
|
role: "row"
|
|
152
153
|
}, other, {
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
11
|
+
|
|
12
|
+
var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
|
|
13
|
+
var PropTypes = require('prop-types');
|
|
14
|
+
var React = require('react');
|
|
15
|
+
var cx = require('classnames');
|
|
16
|
+
var index = require('../IconButton/index.js');
|
|
17
|
+
var usePrefix = require('../../internal/usePrefix.js');
|
|
18
|
+
|
|
19
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
20
|
+
|
|
21
|
+
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
|
|
22
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
23
|
+
var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
|
|
24
|
+
|
|
25
|
+
var _excluded = ["align", "children", "className", "disabled", "enterDelayMs", "index", "leaveDelayMs", "name", "onClick", "onKeyDown", "selected", "size", "text"];
|
|
26
|
+
|
|
27
|
+
var noopFn = function noopFn() {};
|
|
28
|
+
|
|
29
|
+
var IconSwitch = /*#__PURE__*/React__default["default"].forwardRef(function Switch(props, tabRef) {
|
|
30
|
+
var _classNames2;
|
|
31
|
+
|
|
32
|
+
var align = props.align,
|
|
33
|
+
children = props.children,
|
|
34
|
+
className = props.className,
|
|
35
|
+
disabled = props.disabled,
|
|
36
|
+
enterDelayMs = props.enterDelayMs,
|
|
37
|
+
index$1 = props.index,
|
|
38
|
+
_props$leaveDelayMs = props.leaveDelayMs,
|
|
39
|
+
leaveDelayMs = _props$leaveDelayMs === void 0 ? 0 : _props$leaveDelayMs,
|
|
40
|
+
name = props.name,
|
|
41
|
+
_props$onClick = props.onClick,
|
|
42
|
+
onClick = _props$onClick === void 0 ? noopFn : _props$onClick,
|
|
43
|
+
_props$onKeyDown = props.onKeyDown,
|
|
44
|
+
onKeyDown = _props$onKeyDown === void 0 ? noopFn : _props$onKeyDown,
|
|
45
|
+
_props$selected = props.selected,
|
|
46
|
+
selected = _props$selected === void 0 ? false : _props$selected,
|
|
47
|
+
size = props.size,
|
|
48
|
+
text = props.text,
|
|
49
|
+
other = _rollupPluginBabelHelpers.objectWithoutProperties(props, _excluded);
|
|
50
|
+
|
|
51
|
+
var prefix = usePrefix.usePrefix();
|
|
52
|
+
|
|
53
|
+
var _useState = React.useState(false),
|
|
54
|
+
_useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2),
|
|
55
|
+
isHovered = _useState2[0],
|
|
56
|
+
setIsHovered = _useState2[1];
|
|
57
|
+
|
|
58
|
+
var handleClick = function handleClick(e) {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
onClick({
|
|
61
|
+
index: index$1,
|
|
62
|
+
name: name,
|
|
63
|
+
text: text
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
var handleKeyDown = function handleKeyDown(event) {
|
|
68
|
+
var key = event.key || event.which;
|
|
69
|
+
onKeyDown({
|
|
70
|
+
index: index$1,
|
|
71
|
+
name: name,
|
|
72
|
+
text: text,
|
|
73
|
+
key: key
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
var handleMouseEnter = function handleMouseEnter() {
|
|
78
|
+
setIsHovered(true);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
var handleMouseLeave = function handleMouseLeave() {
|
|
82
|
+
setIsHovered(false);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
var classes = cx__default["default"](className, "".concat(prefix, "--content-switcher-btn"), _rollupPluginBabelHelpers.defineProperty({}, "".concat(prefix, "--content-switcher--selected"), selected));
|
|
86
|
+
var iconButtonClasses = cx__default["default"]("".concat(prefix, "--content-switcher-popover__wrapper"), (_classNames2 = {}, _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--content-switcher-popover--selected"), selected), _rollupPluginBabelHelpers.defineProperty(_classNames2, "".concat(prefix, "--content-switcher-popover--disabled"), disabled), _classNames2));
|
|
87
|
+
var commonProps = {
|
|
88
|
+
onClick: handleClick,
|
|
89
|
+
onKeyDown: handleKeyDown,
|
|
90
|
+
className: classes,
|
|
91
|
+
disabled: disabled,
|
|
92
|
+
align: align,
|
|
93
|
+
enterDelayMs: enterDelayMs,
|
|
94
|
+
leaveDelayMs: leaveDelayMs,
|
|
95
|
+
size: size
|
|
96
|
+
};
|
|
97
|
+
return /*#__PURE__*/React__default["default"].createElement(index.IconButton, _rollupPluginBabelHelpers["extends"]({
|
|
98
|
+
label: text,
|
|
99
|
+
type: "button",
|
|
100
|
+
ref: tabRef,
|
|
101
|
+
role: "tab",
|
|
102
|
+
tabIndex: selected || isHovered ? 0 : -1,
|
|
103
|
+
onMouseEnter: handleMouseEnter,
|
|
104
|
+
onMouseLeave: handleMouseLeave,
|
|
105
|
+
onFocus: handleMouseEnter,
|
|
106
|
+
onBlur: handleMouseLeave,
|
|
107
|
+
"aria-selected": selected,
|
|
108
|
+
"aria-label": text,
|
|
109
|
+
wrapperClasses: iconButtonClasses
|
|
110
|
+
}, other, commonProps), children);
|
|
111
|
+
});
|
|
112
|
+
IconSwitch.displayName = 'IconSwitch';
|
|
113
|
+
IconSwitch.propTypes = {
|
|
114
|
+
/**
|
|
115
|
+
* Specify how the trigger should align with the tooltip
|
|
116
|
+
*/
|
|
117
|
+
align: PropTypes__default["default"].oneOf(['top', 'top-left', 'top-right', 'bottom', 'bottom-left', 'bottom-right', 'left', 'right']),
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Provide child elements to be rendered inside of the Switch
|
|
121
|
+
*/
|
|
122
|
+
children: PropTypes__default["default"].node,
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Specify an optional className to be added to your Switch
|
|
126
|
+
*/
|
|
127
|
+
className: PropTypes__default["default"].string,
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Specify whether or not the Switch should be disabled
|
|
131
|
+
*/
|
|
132
|
+
disabled: PropTypes__default["default"].bool,
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Specify the duration in milliseconds to delay before displaying the tooltip
|
|
136
|
+
*/
|
|
137
|
+
enterDelayMs: PropTypes__default["default"].number,
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The index of your Switch in your ContentSwitcher that is used for event handlers.
|
|
141
|
+
* Reserved for usage in ContentSwitcher
|
|
142
|
+
*/
|
|
143
|
+
index: PropTypes__default["default"].number,
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Specify the duration in milliseconds to delay before hiding the tooltip
|
|
147
|
+
*/
|
|
148
|
+
leaveDelayMs: PropTypes__default["default"].number,
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Provide the name of your Switch that is used for event handlers
|
|
152
|
+
*/
|
|
153
|
+
name: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].number]),
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* A handler that is invoked when a user clicks on the control.
|
|
157
|
+
* Reserved for usage in ContentSwitcher
|
|
158
|
+
*/
|
|
159
|
+
onClick: PropTypes__default["default"].func,
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* A handler that is invoked on the key down event for the control.
|
|
163
|
+
* Reserved for usage in ContentSwitcher
|
|
164
|
+
*/
|
|
165
|
+
onKeyDown: PropTypes__default["default"].func,
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Whether your Switch is selected. Reserved for usage in ContentSwitcher
|
|
169
|
+
*/
|
|
170
|
+
selected: PropTypes__default["default"].bool,
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Passed in from `ContentSwitcher` to render icon-only variant
|
|
174
|
+
*/
|
|
175
|
+
size: PropTypes__default["default"].oneOf(['sm', 'md', 'lg']),
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Provide the visible text displayed by the Tooltip
|
|
179
|
+
*/
|
|
180
|
+
text: PropTypes__default["default"].string
|
|
181
|
+
};
|
|
182
|
+
var IconSwitch$1 = IconSwitch;
|
|
183
|
+
|
|
184
|
+
exports["default"] = IconSwitch$1;
|
|
@@ -39,7 +39,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
|
39
39
|
var _ChevronLeft, _ChevronRight;
|
|
40
40
|
|
|
41
41
|
var _excluded = ["activation", "aria-label", "children", "className", "contained", "iconSize", "leftOverflowButtonProps", "light", "rightOverflowButtonProps", "scrollDebounceWait", "scrollIntoView"],
|
|
42
|
-
_excluded2 = ["as", "children", "className", "disabled", "onClick", "onKeyDown", "secondaryLabel", "
|
|
42
|
+
_excluded2 = ["as", "children", "className", "disabled", "onClick", "onKeyDown", "secondaryLabel", "renderIcon"],
|
|
43
43
|
_excluded3 = ["children", "className", "defaultOpen", "enterDelayMs", "leaveDelayMs", "label"],
|
|
44
44
|
_excluded4 = ["children", "className"];
|
|
45
45
|
|
|
@@ -336,12 +336,14 @@ function TabList(_ref2) {
|
|
|
336
336
|
onKeyDown: onKeyDown
|
|
337
337
|
}), React__default["default"].Children.map(children, function (child, index) {
|
|
338
338
|
return /*#__PURE__*/React__default["default"].createElement(TabContext.Provider, {
|
|
339
|
-
value:
|
|
339
|
+
value: {
|
|
340
|
+
index: index,
|
|
341
|
+
hasSecondaryLabel: hasSecondaryLabelTabs
|
|
342
|
+
}
|
|
340
343
|
}, /*#__PURE__*/React__default["default"].cloneElement(child, {
|
|
341
344
|
ref: function ref(node) {
|
|
342
345
|
tabs.current[index] = node;
|
|
343
|
-
}
|
|
344
|
-
hasSecondaryLabel: hasSecondaryLabelTabs
|
|
346
|
+
}
|
|
345
347
|
}));
|
|
346
348
|
})), /*#__PURE__*/React__default["default"].createElement("button", _rollupPluginBabelHelpers["extends"]({
|
|
347
349
|
"aria-hidden": "true",
|
|
@@ -467,7 +469,7 @@ var Tab = /*#__PURE__*/React__default["default"].forwardRef(function Tab(_ref5,
|
|
|
467
469
|
_onClick = _ref5.onClick,
|
|
468
470
|
onKeyDown = _ref5.onKeyDown,
|
|
469
471
|
secondaryLabel = _ref5.secondaryLabel,
|
|
470
|
-
|
|
472
|
+
Icon = _ref5.renderIcon,
|
|
471
473
|
rest = _rollupPluginBabelHelpers.objectWithoutProperties(_ref5, _excluded2);
|
|
472
474
|
|
|
473
475
|
var prefix = usePrefix.usePrefix();
|
|
@@ -477,7 +479,10 @@ var Tab = /*#__PURE__*/React__default["default"].forwardRef(function Tab(_ref5,
|
|
|
477
479
|
setSelectedIndex = _React$useContext2.setSelectedIndex,
|
|
478
480
|
baseId = _React$useContext2.baseId;
|
|
479
481
|
|
|
480
|
-
var
|
|
482
|
+
var _React$useContext3 = React__default["default"].useContext(TabContext),
|
|
483
|
+
index = _React$useContext3.index,
|
|
484
|
+
hasSecondaryLabel = _React$useContext3.hasSecondaryLabel;
|
|
485
|
+
|
|
481
486
|
var id = "".concat(baseId, "-tab-").concat(index);
|
|
482
487
|
var panelId = "".concat(baseId, "-tabpanel-").concat(index);
|
|
483
488
|
var className = cx__default["default"]("".concat(prefix, "--tabs__nav-item"), "".concat(prefix, "--tabs__nav-link"), customClassName, (_cx4 = {}, _rollupPluginBabelHelpers.defineProperty(_cx4, "".concat(prefix, "--tabs__nav-item--selected"), selectedIndex === index), _rollupPluginBabelHelpers.defineProperty(_cx4, "".concat(prefix, "--tabs__nav-item--disabled"), disabled), _cx4));
|
|
@@ -504,9 +509,15 @@ var Tab = /*#__PURE__*/React__default["default"].forwardRef(function Tab(_ref5,
|
|
|
504
509
|
onKeyDown: onKeyDown,
|
|
505
510
|
tabIndex: selectedIndex === index ? '0' : '-1',
|
|
506
511
|
type: "button"
|
|
507
|
-
}), /*#__PURE__*/React__default["default"].createElement("
|
|
512
|
+
}), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
513
|
+
className: "".concat(prefix, "--tabs__nav-item-label-wrapper")
|
|
514
|
+
}, /*#__PURE__*/React__default["default"].createElement("span", {
|
|
508
515
|
className: "".concat(prefix, "--tabs__nav-item-label")
|
|
509
|
-
}, children),
|
|
516
|
+
}, children), Icon && /*#__PURE__*/React__default["default"].createElement("div", {
|
|
517
|
+
className: "".concat(prefix, "--tabs__nav-item--icon")
|
|
518
|
+
}, /*#__PURE__*/React__default["default"].createElement(Icon, {
|
|
519
|
+
size: 16
|
|
520
|
+
}))), hasSecondaryLabel && /*#__PURE__*/React__default["default"].createElement("div", {
|
|
510
521
|
className: "".concat(prefix, "--tabs__nav-item-secondary-label")
|
|
511
522
|
}, secondaryLabel));
|
|
512
523
|
});
|
|
@@ -531,11 +542,6 @@ Tab.propTypes = {
|
|
|
531
542
|
*/
|
|
532
543
|
disabled: PropTypes__default["default"].bool,
|
|
533
544
|
|
|
534
|
-
/*
|
|
535
|
-
* Internal use only, determines wether a tab should render as a secondary label tab
|
|
536
|
-
**/
|
|
537
|
-
hasSecondaryLabel: PropTypes__default["default"].bool,
|
|
538
|
-
|
|
539
545
|
/**
|
|
540
546
|
* Provide a handler that is invoked when a user clicks on the control
|
|
541
547
|
*/
|
|
@@ -553,6 +559,12 @@ Tab.propTypes = {
|
|
|
553
559
|
**/
|
|
554
560
|
renderButton: PropTypes__default["default"].func,
|
|
555
561
|
|
|
562
|
+
/**
|
|
563
|
+
* Optional prop to render an icon next to the label.
|
|
564
|
+
* Can be a React component class
|
|
565
|
+
*/
|
|
566
|
+
renderIcon: PropTypes__default["default"].oneOfType([PropTypes__default["default"].func, PropTypes__default["default"].object]),
|
|
567
|
+
|
|
556
568
|
/*
|
|
557
569
|
* An optional label to render under the primary tab label.
|
|
558
570
|
/* This prop is only useful for conained tabs
|
|
@@ -570,7 +582,7 @@ var IconTab = /*#__PURE__*/React__default["default"].forwardRef(function IconTab
|
|
|
570
582
|
rest = _rollupPluginBabelHelpers.objectWithoutProperties(_ref6, _excluded3);
|
|
571
583
|
|
|
572
584
|
var prefix = usePrefix.usePrefix();
|
|
573
|
-
var classNames = cx__default["default"]("".concat(prefix, "--tabs__nav-item--icon"), customClassName);
|
|
585
|
+
var classNames = cx__default["default"]("".concat(prefix, "--tabs__nav-item--icon-only"), customClassName);
|
|
574
586
|
return /*#__PURE__*/React__default["default"].createElement(Tooltip.Tooltip, {
|
|
575
587
|
align: "bottom",
|
|
576
588
|
defaultOpen: defaultOpen,
|
|
@@ -636,9 +648,9 @@ var TabPanel = /*#__PURE__*/React__default["default"].forwardRef(function TabPan
|
|
|
636
648
|
interactiveContent = _useState10[0],
|
|
637
649
|
setInteractiveContent = _useState10[1];
|
|
638
650
|
|
|
639
|
-
var _React$
|
|
640
|
-
selectedIndex = _React$
|
|
641
|
-
baseId = _React$
|
|
651
|
+
var _React$useContext4 = React__default["default"].useContext(TabsContext),
|
|
652
|
+
selectedIndex = _React$useContext4.selectedIndex,
|
|
653
|
+
baseId = _React$useContext4.baseId;
|
|
642
654
|
|
|
643
655
|
var index = React__default["default"].useContext(TabPanelContext);
|
|
644
656
|
var id = "".concat(baseId, "-tabpanel-").concat(index);
|
|
@@ -22,6 +22,7 @@ var FormContext = require('../FluidForm/FormContext.js');
|
|
|
22
22
|
var useAnnouncer = require('../../internal/useAnnouncer.js');
|
|
23
23
|
var useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
|
|
24
24
|
var useMergedRefs = require('../../internal/useMergedRefs.js');
|
|
25
|
+
var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
|
|
25
26
|
|
|
26
27
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
27
28
|
|
|
@@ -30,6 +31,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
|
30
31
|
var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
|
|
31
32
|
|
|
32
33
|
var _excluded = ["className", "id", "labelText", "hideLabel", "onChange", "onClick", "invalid", "invalidText", "helperText", "light", "placeholder", "enableCounter", "maxCount", "warn", "warnText"];
|
|
34
|
+
var getInstanceId = setupGetInstanceId["default"]();
|
|
33
35
|
var TextArea = /*#__PURE__*/React__default["default"].forwardRef(function (props, forwardRef) {
|
|
34
36
|
var _classNames, _classNames4, _classNames5;
|
|
35
37
|
|
|
@@ -66,6 +68,9 @@ var TextArea = /*#__PURE__*/React__default["default"].forwardRef(function (props
|
|
|
66
68
|
textCount = _useState2[0],
|
|
67
69
|
setTextCount = _useState2[1];
|
|
68
70
|
|
|
71
|
+
var _useRef = React.useRef(getInstanceId()),
|
|
72
|
+
textAreaInstanceId = _useRef.current;
|
|
73
|
+
|
|
69
74
|
var textareaProps = {
|
|
70
75
|
id: id,
|
|
71
76
|
onChange: function onChange(evt) {
|
|
@@ -99,7 +104,9 @@ var TextArea = /*#__PURE__*/React__default["default"].forwardRef(function (props
|
|
|
99
104
|
className: counterClasses
|
|
100
105
|
}, "".concat(textCount, "/").concat(maxCount)) : null;
|
|
101
106
|
var helperTextClasses = cx__default["default"]("".concat(prefix, "--form__helper-text"), _rollupPluginBabelHelpers.defineProperty({}, "".concat(prefix, "--form__helper-text--disabled"), other.disabled));
|
|
107
|
+
var helperId = !helperText ? undefined : "text-area-helper-text-".concat(textAreaInstanceId);
|
|
102
108
|
var helper = helperText ? /*#__PURE__*/React__default["default"].createElement("div", {
|
|
109
|
+
id: helperId,
|
|
103
110
|
className: helperTextClasses
|
|
104
111
|
}, helperText) : null;
|
|
105
112
|
var errorId = id + '-error-msg';
|
|
@@ -127,11 +134,19 @@ var TextArea = /*#__PURE__*/React__default["default"].forwardRef(function (props
|
|
|
127
134
|
textareaRef.current.style.width = "100%";
|
|
128
135
|
}
|
|
129
136
|
}, [other.cols]);
|
|
137
|
+
var ariaDescribedBy;
|
|
138
|
+
|
|
139
|
+
if (invalid) {
|
|
140
|
+
ariaDescribedBy = errorId;
|
|
141
|
+
} else if (!invalid && !warn && !isFluid && helperText) {
|
|
142
|
+
ariaDescribedBy = helperId;
|
|
143
|
+
}
|
|
144
|
+
|
|
130
145
|
var input = /*#__PURE__*/React__default["default"].createElement("textarea", _rollupPluginBabelHelpers["extends"]({}, other, textareaProps, {
|
|
131
146
|
placeholder: placeholder,
|
|
132
147
|
className: textareaClasses,
|
|
133
148
|
"aria-invalid": invalid,
|
|
134
|
-
"aria-describedby":
|
|
149
|
+
"aria-describedby": ariaDescribedBy,
|
|
135
150
|
disabled: other.disabled,
|
|
136
151
|
readOnly: other.readOnly,
|
|
137
152
|
ref: ref
|
|
@@ -18,6 +18,7 @@ var util = require('./util.js');
|
|
|
18
18
|
var warning = require('../../internal/warning.js');
|
|
19
19
|
var deprecate = require('../../prop-types/deprecate.js');
|
|
20
20
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
21
|
+
var setupGetInstanceId = require('../../tools/setupGetInstanceId.js');
|
|
21
22
|
|
|
22
23
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
23
24
|
|
|
@@ -26,6 +27,7 @@ var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
|
|
|
26
27
|
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
|
|
27
28
|
|
|
28
29
|
var _excluded = ["labelText", "className", "id", "placeholder", "onChange", "onClick", "hideLabel", "invalid", "invalidText", "helperText", "light", "type", "togglePasswordVisibility", "tooltipPosition", "tooltipAlignment", "hidePasswordLabel", "showPasswordLabel", "size"];
|
|
30
|
+
var getInstanceId = setupGetInstanceId["default"]();
|
|
29
31
|
var didWarnAboutDeprecation = false;
|
|
30
32
|
var ControlledPasswordInput = /*#__PURE__*/React__default["default"].forwardRef(function ControlledPasswordInput(_ref, ref) {
|
|
31
33
|
var _classNames, _classNames2, _classNames4;
|
|
@@ -57,6 +59,9 @@ var ControlledPasswordInput = /*#__PURE__*/React__default["default"].forwardRef(
|
|
|
57
59
|
|
|
58
60
|
var prefix = usePrefix.usePrefix();
|
|
59
61
|
|
|
62
|
+
var _useRef = React.useRef(getInstanceId()),
|
|
63
|
+
controlledPasswordInstanceId = _useRef.current;
|
|
64
|
+
|
|
60
65
|
if (process.env.NODE_ENV !== "production") {
|
|
61
66
|
process.env.NODE_ENV !== "production" ? warning.warning(didWarnAboutDeprecation, '`<TextInput.ControlledPasswordInput>` has been deprecated in favor of `<TextInput.PasswordInput />` and will be removed in the next major release of `carbon-components-react`') : void 0;
|
|
62
67
|
didWarnAboutDeprecation = true;
|
|
@@ -100,10 +105,13 @@ var ControlledPasswordInput = /*#__PURE__*/React__default["default"].forwardRef(
|
|
|
100
105
|
className: "".concat(prefix, "--icon-visibility-on")
|
|
101
106
|
});
|
|
102
107
|
var passwordVisibilityToggleClasses = cx__default["default"]("".concat(prefix, "--text-input--password__visibility__toggle"), "".concat(prefix, "--btn"), "".concat(prefix, "--btn--icon-only"), "".concat(prefix, "--tooltip__trigger"), "".concat(prefix, "--tooltip--a11y"), (_classNames4 = {}, _rollupPluginBabelHelpers.defineProperty(_classNames4, "".concat(prefix, "--tooltip--").concat(tooltipPosition), tooltipPosition), _rollupPluginBabelHelpers.defineProperty(_classNames4, "".concat(prefix, "--tooltip--align-").concat(tooltipAlignment), tooltipAlignment), _classNames4));
|
|
108
|
+
var helperId = !helperText ? undefined : "controlled-password-helper-text-".concat(controlledPasswordInstanceId);
|
|
103
109
|
var input = /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("input", _rollupPluginBabelHelpers["extends"]({}, util.textInputProps({
|
|
104
110
|
invalid: invalid,
|
|
105
111
|
sharedTextInputProps: sharedTextInputProps,
|
|
106
|
-
invalidId: errorId
|
|
112
|
+
invalidId: errorId,
|
|
113
|
+
hasHelper: !error && helperText,
|
|
114
|
+
helperId: helperId
|
|
107
115
|
}), {
|
|
108
116
|
"data-toggle-password-visibility": type === 'password'
|
|
109
117
|
})), /*#__PURE__*/React__default["default"].createElement("button", {
|
|
@@ -114,6 +122,7 @@ var ControlledPasswordInput = /*#__PURE__*/React__default["default"].forwardRef(
|
|
|
114
122
|
className: "".concat(prefix, "--assistive-text")
|
|
115
123
|
}, passwordIsVisible ? hidePasswordLabel : showPasswordLabel), passwordVisibilityIcon));
|
|
116
124
|
var helper = helperText ? /*#__PURE__*/React__default["default"].createElement("div", {
|
|
125
|
+
id: helperId,
|
|
117
126
|
className: helperTextClasses
|
|
118
127
|
}, helperText) : null;
|
|
119
128
|
return /*#__PURE__*/React__default["default"].createElement("div", {
|
|
@@ -122,6 +122,7 @@ var PasswordInput = /*#__PURE__*/React__default["default"].forwardRef(function P
|
|
|
122
122
|
className: labelClasses
|
|
123
123
|
}, labelText) : null;
|
|
124
124
|
var helper = helperText ? /*#__PURE__*/React__default["default"].createElement("div", {
|
|
125
|
+
id: normalizedProps.helperId,
|
|
125
126
|
className: helperTextClasses
|
|
126
127
|
}, helperText) : null;
|
|
127
128
|
var passwordIsVisible = inputType === 'text';
|
|
@@ -136,7 +137,9 @@ var PasswordInput = /*#__PURE__*/React__default["default"].forwardRef(function P
|
|
|
136
137
|
invalid: normalizedProps.invalid,
|
|
137
138
|
invalidId: normalizedProps.invalidId,
|
|
138
139
|
warn: normalizedProps.warn,
|
|
139
|
-
warnId: normalizedProps.warnId
|
|
140
|
+
warnId: normalizedProps.warnId,
|
|
141
|
+
hasHelper: Boolean(helperText && !isFluid && (inline || !inline && !normalizedProps.validation)),
|
|
142
|
+
helperId: normalizedProps.helperId
|
|
140
143
|
}), {
|
|
141
144
|
disabled: disabled,
|
|
142
145
|
"data-toggle-password-visibility": inputType === 'password'
|
|
@@ -15,9 +15,6 @@ var PasswordInput = require('./PasswordInput.js');
|
|
|
15
15
|
var TextInput = require('./TextInput.js');
|
|
16
16
|
var TextInput_Skeleton = require('./TextInput.Skeleton.js');
|
|
17
17
|
|
|
18
|
-
TextInput["default"].ControlledPasswordInput = ControlledPasswordInput["default"];
|
|
19
|
-
TextInput["default"].PasswordInput = PasswordInput["default"];
|
|
20
|
-
|
|
21
18
|
if (process.env.NODE_ENV !== "production") {
|
|
22
19
|
deprecateFieldOnObject.deprecateFieldOnObject(TextInput["default"], 'ControlledPasswordInput', ControlledPasswordInput["default"]);
|
|
23
20
|
deprecateFieldOnObject.deprecateFieldOnObject(TextInput["default"], 'PasswordInput', PasswordInput["default"]);
|
|
@@ -25,13 +25,26 @@ var warnProps = function warnProps(warnId) {
|
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
var helperProps = function helperProps(helperId) {
|
|
29
|
+
return {
|
|
30
|
+
'aria-describedby': helperId
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* @param {{sharedTextInputProps: object, invalid?: boolean, invalidId?: string, warn?: boolean, warnId?: string, hasHelper?: boolean, helperId?: string}} config
|
|
35
|
+
* @returns {object}
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
|
|
28
39
|
var textInputProps = function textInputProps(_ref) {
|
|
29
40
|
var sharedTextInputProps = _ref.sharedTextInputProps,
|
|
30
41
|
invalid = _ref.invalid,
|
|
31
42
|
invalidId = _ref.invalidId,
|
|
32
43
|
warn = _ref.warn,
|
|
33
|
-
warnId = _ref.warnId
|
|
34
|
-
|
|
44
|
+
warnId = _ref.warnId,
|
|
45
|
+
hasHelper = _ref.hasHelper,
|
|
46
|
+
helperId = _ref.helperId;
|
|
47
|
+
return _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, sharedTextInputProps), invalid ? invalidProps(invalidId) : {}), warn ? warnProps(warnId) : {}), hasHelper ? helperProps(helperId) : {});
|
|
35
48
|
};
|
|
36
49
|
|
|
37
50
|
exports.textInputProps = textInputProps;
|
|
@@ -20,6 +20,7 @@ var events = require('../../tools/events.js');
|
|
|
20
20
|
var usePrefix = require('../../internal/usePrefix.js');
|
|
21
21
|
var useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
|
|
22
22
|
var useNoInteractiveChildren = require('../../internal/useNoInteractiveChildren.js');
|
|
23
|
+
var useMergedRefs = require('../../internal/useMergedRefs.js');
|
|
23
24
|
var match = require('../../internal/keyboard/match.js');
|
|
24
25
|
var keys = require('../../internal/keyboard/keys.js');
|
|
25
26
|
|
|
@@ -328,7 +329,7 @@ SelectableTile.propTypes = {
|
|
|
328
329
|
*/
|
|
329
330
|
value: PropTypes__default["default"].oneOfType([PropTypes__default["default"].string, PropTypes__default["default"].number]).isRequired
|
|
330
331
|
};
|
|
331
|
-
function ExpandableTile(_ref4) {
|
|
332
|
+
var ExpandableTile = /*#__PURE__*/React__default["default"].forwardRef(function ExpandableTile(_ref4, forwardRef) {
|
|
332
333
|
var _cx4, _cx5;
|
|
333
334
|
|
|
334
335
|
var tabIndex = _ref4.tabIndex,
|
|
@@ -386,6 +387,7 @@ function ExpandableTile(_ref4) {
|
|
|
386
387
|
var tileContent = React.useRef(null);
|
|
387
388
|
var tile = React.useRef(null);
|
|
388
389
|
var prefix = usePrefix.usePrefix();
|
|
390
|
+
var ref = useMergedRefs.useMergedRefs([forwardRef, tile]);
|
|
389
391
|
|
|
390
392
|
if (expanded !== prevExpanded) {
|
|
391
393
|
setIsExpanded(expanded);
|
|
@@ -473,7 +475,7 @@ function ExpandableTile(_ref4) {
|
|
|
473
475
|
};
|
|
474
476
|
}, []);
|
|
475
477
|
return interactive ? /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
|
|
476
|
-
ref:
|
|
478
|
+
ref: ref,
|
|
477
479
|
className: interactiveClassNames,
|
|
478
480
|
"aria-expanded": isExpanded
|
|
479
481
|
}, rest), /*#__PURE__*/React__default["default"].createElement("div", {
|
|
@@ -493,7 +495,7 @@ function ExpandableTile(_ref4) {
|
|
|
493
495
|
className: "".concat(prefix, "--tile-content")
|
|
494
496
|
}, childrenAsArray[1]))) : /*#__PURE__*/React__default["default"].createElement("button", _rollupPluginBabelHelpers["extends"]({
|
|
495
497
|
type: "button",
|
|
496
|
-
ref:
|
|
498
|
+
ref: ref,
|
|
497
499
|
className: classNames,
|
|
498
500
|
"aria-expanded": isExpanded,
|
|
499
501
|
title: isExpanded ? tileExpandedIconText : tileCollapsedIconText
|
|
@@ -512,7 +514,7 @@ function ExpandableTile(_ref4) {
|
|
|
512
514
|
ref: belowTheFold,
|
|
513
515
|
className: "".concat(prefix, "--tile-content")
|
|
514
516
|
}, childrenAsArray[1])));
|
|
515
|
-
}
|
|
517
|
+
});
|
|
516
518
|
ExpandableTile.propTypes = {
|
|
517
519
|
/**
|
|
518
520
|
* The child nodes.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
import PropTypes from 'prop-types';
|
|
8
|
+
import React from 'react';
|
|
9
|
+
type ToggleSkeletonProps = {
|
|
10
|
+
'aria-label': string;
|
|
11
|
+
/**
|
|
12
|
+
* Specify an optional className to add to the form item wrapper.
|
|
13
|
+
*/
|
|
14
|
+
className?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Provide an id that unique represents the underlying `<input>`
|
|
17
|
+
*/
|
|
18
|
+
id?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Provide the text that will be read by a screen reader when visiting this
|
|
21
|
+
* control
|
|
22
|
+
* `aria-label` is always required but will be null if `labelText` is also
|
|
23
|
+
* provided
|
|
24
|
+
*/
|
|
25
|
+
labelText?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Specify the size of the Toggle. Currently only supports 'sm' or 'md' (default)
|
|
28
|
+
*/
|
|
29
|
+
size?: 'sm' | 'md';
|
|
30
|
+
} & React.HTMLAttributes<HTMLDivElement>;
|
|
31
|
+
declare class ToggleSkeleton extends React.Component<ToggleSkeletonProps> {
|
|
32
|
+
static propTypes: {
|
|
33
|
+
"aria-label": PropTypes.Validator<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Specify an optional className to add to the form item wrapper.
|
|
36
|
+
*/
|
|
37
|
+
className: PropTypes.Requireable<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Provide an id that unique represents the underlying `<input>`
|
|
40
|
+
*/
|
|
41
|
+
id: PropTypes.Requireable<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Provide the text that will be read by a screen reader when visiting this
|
|
44
|
+
* control
|
|
45
|
+
* `aria-label` is always required but will be undefined if `labelText` is also
|
|
46
|
+
* provided
|
|
47
|
+
*/
|
|
48
|
+
labelText: PropTypes.Requireable<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Specify the size of the Toggle. Currently only supports 'sm' or 'md' (default)
|
|
51
|
+
*/
|
|
52
|
+
size: PropTypes.Requireable<string>;
|
|
53
|
+
};
|
|
54
|
+
static defaultProps: Partial<ToggleSkeletonProps>;
|
|
55
|
+
render(): JSX.Element;
|
|
56
|
+
}
|
|
57
|
+
export default ToggleSkeleton;
|
|
58
|
+
export { ToggleSkeleton };
|
|
@@ -60,7 +60,7 @@ var ToggleSkeleton = /*#__PURE__*/function (_React$Component) {
|
|
|
60
60
|
}), /*#__PURE__*/React__default["default"].createElement("label", {
|
|
61
61
|
className: "".concat(prefix, "--toggle-input__label"),
|
|
62
62
|
htmlFor: id,
|
|
63
|
-
"aria-label": labelText ?
|
|
63
|
+
"aria-label": labelText ? undefined : _this.props['aria-label']
|
|
64
64
|
}, labelText ? _div || (_div = /*#__PURE__*/React__default["default"].createElement("div", null, labelText)) : null, /*#__PURE__*/React__default["default"].createElement("span", {
|
|
65
65
|
className: "".concat(prefix, "--toggle__switch")
|
|
66
66
|
}, /*#__PURE__*/React__default["default"].createElement("span", {
|
|
@@ -22,7 +22,7 @@ interface TooltipBaseProps {
|
|
|
22
22
|
*/
|
|
23
23
|
className?: string;
|
|
24
24
|
/**
|
|
25
|
-
* Determines
|
|
25
|
+
* Determines whether the tooltip should close when inner content is activated (click, Enter or Space)
|
|
26
26
|
*/
|
|
27
27
|
closeOnActivation?: boolean;
|
|
28
28
|
/**
|
package/lib/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from './components/Breadcrumb';
|
|
|
12
12
|
export * from './components/Button';
|
|
13
13
|
export * from './components/ButtonSet';
|
|
14
14
|
export * from './components/Checkbox';
|
|
15
|
+
export * from './components/CheckboxGroup';
|
|
15
16
|
export * from './components/ClassPrefix';
|
|
16
17
|
export * from './components/CodeSnippet';
|
|
17
18
|
export * from './components/ComboBox';
|