@carbon/ibm-products 1.4.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. package/css/index-full-carbon.css +527 -90
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +9 -3
  4. package/css/index-full-carbon.min.css.map +1 -0
  5. package/css/index-without-carbon-released-only.css +157 -67
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +3 -3
  8. package/css/index-without-carbon-released-only.min.css.map +1 -0
  9. package/css/index-without-carbon.css +468 -84
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +9 -3
  12. package/css/index-without-carbon.min.css.map +1 -0
  13. package/css/index.css +470 -86
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +9 -3
  16. package/css/index.min.css.map +1 -0
  17. package/es/components/ActionSet/ActionSet.js +23 -11
  18. package/es/components/ActionSet/actions.js +25 -17
  19. package/es/components/AddSelect/AddSelect.js +115 -67
  20. package/es/components/AddSelect/AddSelectBreadcrumbs.js +56 -0
  21. package/es/components/AddSelect/AddSelectList.js +94 -0
  22. package/es/components/AddSelect/AddSelectSidebar.js +110 -0
  23. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +5 -2
  24. package/es/components/ButtonMenu/ButtonMenu.js +1 -1
  25. package/es/components/CancelableTextEdit/CancelableTextEdit.js +2 -2
  26. package/es/components/Card/Card.js +6 -4
  27. package/es/components/CreateFullPage/CreateFullPage.js +30 -5
  28. package/es/components/CreateFullPage/CreateFullPageStep.js +40 -32
  29. package/es/components/CreateInfluencer/CreateInfluencer.js +25 -3
  30. package/es/components/CreateTearsheet/CreateTearsheet.js +32 -6
  31. package/es/components/CreateTearsheet/CreateTearsheetStep.js +45 -38
  32. package/es/components/CreateTearsheet/preview-components/MultiStepTearsheet.js +24 -4
  33. package/es/components/CreateTearsheet/preview-components/MultiStepWithIntro.js +8 -6
  34. package/es/components/DataSpreadsheet/DataSpreadsheet.js +154 -0
  35. package/es/components/DataSpreadsheet/generateData.js +47 -0
  36. package/es/components/DataSpreadsheet/index.js +7 -0
  37. package/es/components/EmptyStates/EmptyState.js +1 -1
  38. package/es/components/EmptyStates/EmptyStateContent.js +2 -2
  39. package/es/components/EmptyStates/ErrorEmptyState/ErrorEmptyState.js +1 -1
  40. package/es/components/EmptyStates/NoDataEmptyState/NoDataEmptyState.js +1 -1
  41. package/es/components/EmptyStates/NoTagsEmptyState/NoTagsEmptyState.js +1 -1
  42. package/es/components/EmptyStates/NotFoundEmptyState/NotFoundEmptyState.js +1 -1
  43. package/es/components/EmptyStates/NotificationsEmptyState/NotificationsEmptyState.js +1 -1
  44. package/es/components/EmptyStates/UnauthorizedEmptyState/UnauthorizedEmptyState.js +1 -1
  45. package/es/components/ExportModal/ExportModal.js +39 -12
  46. package/es/components/InlineEdit/InlineEdit.js +250 -80
  47. package/es/components/NotificationsPanel/NotificationsPanel.js +16 -3
  48. package/es/components/PageHeader/PageHeader.js +9 -6
  49. package/es/components/PageHeader/PageHeaderTitle.js +10 -6
  50. package/es/components/SidePanel/SidePanel.js +33 -16
  51. package/es/components/Tearsheet/Tearsheet.js +1 -1
  52. package/es/components/Tearsheet/TearsheetNarrow.js +1 -1
  53. package/es/components/Tearsheet/TearsheetShell.js +4 -5
  54. package/es/components/WebTerminal/WebTerminal.js +1 -1
  55. package/es/components/index.js +2 -1
  56. package/es/global/js/hooks/index.js +1 -0
  57. package/es/global/js/hooks/useCreateComponentStepChange.js +31 -11
  58. package/es/global/js/hooks/useResetCreateComponent.js +7 -4
  59. package/es/global/js/hooks/useRetrieveStepData.js +51 -0
  60. package/es/global/js/package-settings.js +2 -1
  61. package/es/global/js/utils/getScrollbarWidth.js +14 -0
  62. package/es/global/js/utils/lastIndexInArray.js +26 -0
  63. package/es/settings.js +0 -5
  64. package/lib/components/ActionSet/ActionSet.js +23 -11
  65. package/lib/components/ActionSet/actions.js +25 -17
  66. package/lib/components/AddSelect/AddSelect.js +119 -67
  67. package/lib/components/AddSelect/AddSelectBreadcrumbs.js +71 -0
  68. package/lib/components/AddSelect/AddSelectList.js +112 -0
  69. package/lib/components/AddSelect/AddSelectSidebar.js +122 -0
  70. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +5 -2
  71. package/lib/components/ButtonMenu/ButtonMenu.js +1 -1
  72. package/lib/components/CancelableTextEdit/CancelableTextEdit.js +1 -1
  73. package/lib/components/Card/Card.js +6 -4
  74. package/lib/components/CreateFullPage/CreateFullPage.js +29 -4
  75. package/lib/components/CreateFullPage/CreateFullPageStep.js +38 -30
  76. package/lib/components/CreateInfluencer/CreateInfluencer.js +25 -3
  77. package/lib/components/CreateTearsheet/CreateTearsheet.js +31 -5
  78. package/lib/components/CreateTearsheet/CreateTearsheetStep.js +43 -36
  79. package/lib/components/CreateTearsheet/preview-components/MultiStepTearsheet.js +22 -2
  80. package/lib/components/CreateTearsheet/preview-components/MultiStepWithIntro.js +8 -6
  81. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +171 -0
  82. package/lib/components/DataSpreadsheet/generateData.js +58 -0
  83. package/lib/components/DataSpreadsheet/index.js +13 -0
  84. package/lib/components/EmptyStates/EmptyState.js +1 -1
  85. package/lib/components/EmptyStates/EmptyStateContent.js +2 -2
  86. package/lib/components/EmptyStates/ErrorEmptyState/ErrorEmptyState.js +1 -1
  87. package/lib/components/EmptyStates/NoDataEmptyState/NoDataEmptyState.js +1 -1
  88. package/lib/components/EmptyStates/NoTagsEmptyState/NoTagsEmptyState.js +1 -1
  89. package/lib/components/EmptyStates/NotFoundEmptyState/NotFoundEmptyState.js +1 -1
  90. package/lib/components/EmptyStates/NotificationsEmptyState/NotificationsEmptyState.js +1 -1
  91. package/lib/components/EmptyStates/UnauthorizedEmptyState/UnauthorizedEmptyState.js +1 -1
  92. package/lib/components/ExportModal/ExportModal.js +36 -11
  93. package/lib/components/InlineEdit/InlineEdit.js +247 -79
  94. package/lib/components/NotificationsPanel/NotificationsPanel.js +13 -1
  95. package/lib/components/PageHeader/PageHeader.js +9 -6
  96. package/lib/components/PageHeader/PageHeaderTitle.js +10 -6
  97. package/lib/components/SidePanel/SidePanel.js +33 -16
  98. package/lib/components/Tearsheet/Tearsheet.js +1 -1
  99. package/lib/components/Tearsheet/TearsheetNarrow.js +1 -1
  100. package/lib/components/Tearsheet/TearsheetShell.js +3 -4
  101. package/lib/components/WebTerminal/WebTerminal.js +1 -1
  102. package/lib/components/index.js +9 -1
  103. package/lib/global/js/hooks/index.js +8 -0
  104. package/lib/global/js/hooks/useCreateComponentStepChange.js +31 -11
  105. package/lib/global/js/hooks/useResetCreateComponent.js +7 -4
  106. package/lib/global/js/hooks/useRetrieveStepData.js +62 -0
  107. package/lib/global/js/package-settings.js +2 -1
  108. package/lib/global/js/utils/getScrollbarWidth.js +23 -0
  109. package/lib/global/js/utils/lastIndexInArray.js +35 -0
  110. package/lib/settings.js +0 -6
  111. package/package.json +27 -25
  112. package/scss/components/AddSelect/_add-select.scss +59 -5
  113. package/scss/components/BreadcrumbWithOverflow/_index.scss +1 -1
  114. package/scss/components/CancelableTextEdit/_cancelable-text-edit.scss +1 -0
  115. package/scss/components/CancelableTextEdit/_storybook-styles.scss +0 -7
  116. package/scss/components/CreateInfluencer/_create-influencer.scss +4 -4
  117. package/scss/components/CreateTearsheet/_create-tearsheet.scss +2 -2
  118. package/scss/components/CreateTearsheetNarrow/_storybook-styles.scss +0 -6
  119. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +79 -0
  120. package/scss/components/DataSpreadsheet/_index.scss +8 -0
  121. package/scss/components/DataSpreadsheet/_storybook-styles.scss +6 -0
  122. package/scss/components/EditSidePanel/_storybook-styles.scss +0 -8
  123. package/scss/components/InlineEdit/_inline-edit.scss +288 -10
  124. package/scss/components/InlineEdit/_storybook-styles.scss +12 -6
  125. package/scss/components/LoadingBar/_storybook-styles.scss +0 -5
  126. package/scss/components/NotificationsPanel/_notifications-panel.scss +2 -2
  127. package/scss/components/OptionsTile/_storybook-styles.scss +0 -7
  128. package/scss/components/PageHeader/_index.scss +1 -1
  129. package/scss/components/PageHeader/_page-header.scss +4 -1
  130. package/scss/components/ProductiveCard/_productive-card.scss +0 -4
  131. package/scss/components/SidePanel/_side-panel.scss +15 -6
  132. package/scss/components/StatusIcon/_index.scss +1 -1
  133. package/scss/components/StatusIcon/_status-icon.scss +6 -4
  134. package/scss/components/TagSet/_index.scss +1 -1
  135. package/scss/components/UserProfileImage/_index.scss +1 -1
  136. package/scss/components/UserProfileImage/_user-profile-image.scss +2 -2
  137. package/scss/components/WebTerminal/_web-terminal.scss +2 -2
  138. package/scss/components/_index.scss +1 -0
  139. package/scss/global/styles/_project-settings.scss +5 -1
  140. package/es/generated/feature-flags/feature-flags.js +0 -15
  141. package/lib/generated/feature-flags/feature-flags.js +0 -22
  142. package/scss/generated/feature-flags/_feature-flags.scss +0 -19
@@ -27,22 +27,16 @@ var _devtools = require("../../global/js/utils/devtools");
27
27
 
28
28
  var _settings = require("../../settings");
29
29
 
30
- var _ = require("../");
31
-
32
30
  var _carbonComponentsReact = require("carbon-components-react");
33
31
 
34
32
  var _iconsReact = require("@carbon/icons-react");
35
33
 
36
- var _excluded = ["className", "disabled", "editDescription", "id", "inline", "invalid", "invalidText", "labelText", "onChange", "onInput", "onRevert", "revertDescription", "saveDescription", "saveDisabled", "size", "value", "warn", "warnText"];
34
+ var _excluded = ["cancelDescription", "className", "disabled", "editDescription", "editVisibleOnHoverOnly", "id", "invalid", "invalidText", "labelText", "light", "onCancel", "onSave", "onChange", "placeholder", "saveDescription", "size", "value", "warn", "warnText"];
37
35
 
38
36
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
39
37
 
40
38
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
41
39
 
42
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
43
-
44
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
45
-
46
40
  // The block part of our conventional BEM class names (blockClass__E--M).
47
41
  var blockClass = "".concat(_settings.pkg.prefix, "--inline-edit");
48
42
  var componentName = 'InlineEdit'; // NOTE: the component SCSS is not imported here: it is rolled up separately.
@@ -51,83 +45,248 @@ var componentName = 'InlineEdit'; // NOTE: the component SCSS is not imported he
51
45
  * TODO: A description of the component.
52
46
  */
53
47
 
54
- var InlineEdit = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
55
- var className = _ref.className,
48
+ var InlineEdit = /*#__PURE__*/_react.default.forwardRef(function (_ref, refIn) {
49
+ var _cx, _cx3;
50
+
51
+ var cancelDescription = _ref.cancelDescription,
52
+ className = _ref.className,
56
53
  disabled = _ref.disabled,
57
54
  editDescription = _ref.editDescription,
55
+ editVisibleOnHoverOnly = _ref.editVisibleOnHoverOnly,
58
56
  id = _ref.id,
59
- inline = _ref.inline,
60
57
  invalid = _ref.invalid,
61
58
  invalidText = _ref.invalidText,
62
59
  labelText = _ref.labelText,
60
+ light = _ref.light,
61
+ onCancel = _ref.onCancel,
62
+ onSave = _ref.onSave,
63
63
  onChange = _ref.onChange,
64
- onInput = _ref.onInput,
65
- onRevert = _ref.onRevert,
66
- revertDescription = _ref.revertDescription,
64
+ placeholder = _ref.placeholder,
67
65
  saveDescription = _ref.saveDescription,
68
- saveDisabled = _ref.saveDisabled,
69
66
  size = _ref.size,
70
67
  value = _ref.value,
71
68
  warn = _ref.warn,
72
69
  warnText = _ref.warnText,
73
70
  rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
71
+ var refInput = (0, _react.useRef)(null);
72
+ var localRef = (0, _react.useRef)(null);
73
+ var ref = refIn || localRef;
74
74
 
75
75
  var _useState = (0, _react.useState)(false),
76
76
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
77
77
  editing = _useState2[0],
78
78
  setEditing = _useState2[1];
79
79
 
80
- var handleEdit = function handleEdit() {
81
- return setEditing(function (prev) {
82
- return !prev;
83
- });
80
+ var _useState3 = (0, _react.useState)(value),
81
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
82
+ internalValue = _useState4[0],
83
+ setInternalValue = _useState4[1];
84
+
85
+ var showValidation = invalid || warn;
86
+ var validationText = invalidText || warnText;
87
+ var validationIcon = showValidation ? invalid ? /*#__PURE__*/_react.default.createElement(_iconsReact.WarningFilled16, null) : /*#__PURE__*/_react.default.createElement(_iconsReact.WarningAltFilled16, null) : null;
88
+
89
+ var doSetEditing = function doSetEditing(value) {
90
+ if (value === false) {
91
+ // move scroll to start
92
+ refInput.current.scrollLeft = 0;
93
+ }
94
+
95
+ setEditing(!disabled && value);
84
96
  };
85
97
 
86
- var handleChange = function handleChange(val) {
87
- setEditing(false);
88
- onChange(val);
98
+ var handleEdit = function handleEdit(ev) {
99
+ if (!disabled) {
100
+ var rightOfInput = ev.currentTarget.classList.contains("".concat(blockClass, "__edit")) || ev.target.classList.contains("".concat(blockClass, "__after-input-elements"));
101
+ var leftOfInput = ev.currentTarget = ev.target.classList.contains("".concat(blockClass)); // clicking on the content editable element should not set either of these to true
102
+
103
+ if (rightOfInput || leftOfInput) {
104
+ doSetEditing(true);
105
+ setTimeout(function () {
106
+ refInput.current.focus(); // select all the content
107
+
108
+ document.getSelection().selectAllChildren(refInput.current);
109
+
110
+ if (rightOfInput) {
111
+ document.getSelection().collapseToEnd();
112
+ refInput.current.scrollLeft = 9999; // never going to get there but ensures at end.
113
+ } else {
114
+ document.getSelection().collapseToStart();
115
+ refInput.current.scrollLeft = 0; // scroll to start
116
+ }
117
+ }, 0);
118
+ }
119
+ }
120
+ };
121
+
122
+ var handleFocus = function handleFocus(ev) {
123
+ ev.preventDefault();
124
+
125
+ if (!editing && ev.target.classList.contains("".concat(blockClass, "__input"))) {
126
+ doSetEditing(true);
127
+ }
128
+ };
129
+
130
+ var handleSave = function handleSave() {
131
+ doSetEditing(false);
132
+ document.getSelection().removeAllRanges();
133
+
134
+ if (onSave) {
135
+ onSave(refInput.current.innerText);
136
+ }
89
137
  };
90
138
 
91
- var handleRevert = function handleRevert() {
92
- setEditing(false);
93
- onRevert(value);
139
+ var handleInput = function handleInput() {
140
+ setInternalValue(refInput.current.innerText);
141
+
142
+ if (onChange) {
143
+ onChange(refInput.current.innerText);
144
+ }
145
+ };
146
+
147
+ var handlePaste = function handlePaste(ev) {
148
+ ev.preventDefault(); // Get clipboard as plain text
149
+
150
+ var text = (ev.clipboardData || window.clipboardData).getData('text/plain'); // remove \n
151
+
152
+ var sanitizedText = text.replaceAll(/\n/g, '') // remove carriage returns
153
+ .replaceAll(/\t/g, ' '); // replace tab with two spaces
154
+
155
+ if (document.queryCommandSupported('insertText')) {
156
+ document.execCommand('insertText', false, sanitizedText);
157
+ } else {
158
+ // Insert text at the current position of caret
159
+ var range = document.getSelection().getRangeAt(0);
160
+ range.deleteContents();
161
+ var textNode = document.createTextNode(sanitizedText);
162
+ range.insertNode(textNode); // move selection end of textNode
163
+
164
+ range.selectNodeContents(textNode);
165
+ range.collapse(false); // remove existing range
166
+
167
+ var selection = document.getSelection();
168
+ selection.removeAllRanges(); // set the new range
169
+
170
+ selection.addRange(range);
171
+ }
172
+ };
173
+
174
+ var handleCancel = function handleCancel() {
175
+ refInput.current.innerText = value;
176
+ handleInput(value);
177
+ doSetEditing(false);
178
+ document.getSelection().removeAllRanges();
179
+
180
+ if (onCancel) {
181
+ onCancel(value);
182
+ }
94
183
  };
95
184
 
96
- var stdProps = _objectSpread(_objectSpread({}, rest), {}, {
97
- className: (0, _classnames.default)(blockClass, // Apply the block class to the main HTML element
98
- className, // Apply any supplied class names to the main HTML element.
99
- (0, _defineProperty2.default)({}, "".concat(blockClass, "--editing"), editing)),
100
- id: id,
101
- size: size,
102
- ref: ref
103
- }, (0, _devtools.getDevtoolsProps)(componentName));
104
-
105
- return editing ? /*#__PURE__*/_react.default.createElement(_.CancelableTextEdit, (0, _extends2.default)({}, stdProps, {
106
- hideLabel: true,
107
- inline: inline,
108
- invalid: invalid,
109
- invalidText: invalidText,
110
- labelText: labelText,
111
- onChange: handleChange,
112
- onInput: onInput,
113
- onRevert: handleRevert,
114
- revertDescription: revertDescription,
115
- saveDescription: saveDescription,
116
- saveDisabled: saveDisabled,
117
- value: value,
118
- warn: warn,
119
- warnText: warnText
120
- })) : /*#__PURE__*/_react.default.createElement("div", stdProps, /*#__PURE__*/_react.default.createElement("div", {
121
- className: "".concat(blockClass, "__value")
122
- }, value), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
123
- className: "".concat(blockClass, "__button ").concat(_settings.carbon.prefix, "--btn--md"),
124
- kind: "ghost",
125
- hasIconOnly: true,
126
- iconDescription: editDescription,
127
- onClick: handleEdit,
128
- renderIcon: disabled ? _iconsReact.EditOff16 : _iconsReact.Edit16,
129
- disabled: disabled
130
- }));
185
+ var handleBlur = function handleBlur(ev) {
186
+ if (!ref.current.contains(ev.relatedTarget)) {
187
+ handleSave();
188
+ }
189
+ };
190
+
191
+ var handleKeyDown = function handleKeyDown(ev) {
192
+ if (ev.key === 'Enter') {
193
+ ev.preventDefault();
194
+ refInput.current.blur(); // will cause save
195
+ }
196
+ };
197
+ /*
198
+ The HTML is structured as follows:
199
+ <container>
200
+ <!-- margin left of input to match Carbon -->
201
+ <content-editable>
202
+ <-- margin right of input space for after-input-elements -->
203
+ <after-input-elements>
204
+ </container>
205
+ NOTE:
206
+ - An input is not used as this would not permit a heading tag e.g. <h2>.
207
+ - Some padding is added to the left 16px standard for a Carbon text input
208
+ - The after-input-elements are position absolute with a margin to on the input to reserve space. Using inline-flex
209
+ - does not measure space properly for the input otherwise.
210
+ - The content editable is not expected to change size when buttons are added, to ensure the text does not move space
211
+ is reserved up front for buttons and invalid icon. Mostly this is only noticed if the width of the component is not 100%.
212
+ which can be shown by setting inlineEditFullWidth to false in storybook.
213
+ In making content-editable behave like an input of type text we have to account for.
214
+ - Enforcing a single line
215
+ - Pasting of non-text e.g. html or text with carriage returns
216
+ - The padding and border not hiding typed in text.
217
+ - Placing the cursor at the start or end depending on area clicked (before for left-padding)
218
+ */
219
+
220
+
221
+ var toolbarAnimation = true;
222
+ return (
223
+ /*#__PURE__*/
224
+ // eslint-disable-next-line
225
+ _react.default.createElement("div", {
226
+ className: (0, _classnames.default)(blockClass, // Apply the block class to the main HTML element
227
+ className, // Apply any supplied class names to the main HTML element.
228
+ "".concat(blockClass, "--").concat(size), (_cx = {}, (0, _defineProperty2.default)(_cx, "".concat(blockClass, "--disabled"), disabled), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "--editing"), editing), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "--invalid"), invalid), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "--warn"), warn), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "--light"), light), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "--overflows"), refInput.current && refInput.current.scrollWidth > refInput.current.offsetWidth), _cx)),
229
+ onClick: handleEdit // disabled eslint for click handler
230
+ ,
231
+ onBlur: handleBlur,
232
+ ref: ref
233
+ }, /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, (0, _devtools.getDevtoolsProps)(componentName), {
234
+ id: id,
235
+ size: size,
236
+ className: (0, _classnames.default)("".concat(blockClass, "__input"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__input--empty"), refInput.current && refInput.current.innerText.length === 0)),
237
+ contentEditable: true,
238
+ "aria-label": labelText,
239
+ role: "textbox",
240
+ tabIndex: disabled ? -1 : 0,
241
+ onFocus: handleFocus,
242
+ onInput: handleInput,
243
+ onKeyDown: handleKeyDown,
244
+ onPaste: handlePaste,
245
+ suppressContentEditableWarning: true,
246
+ ref: refInput,
247
+ "data-placeholder": placeholder !== null && placeholder !== void 0 ? placeholder : labelText
248
+ }), value), /*#__PURE__*/_react.default.createElement("div", {
249
+ className: (0, _classnames.default)("".concat(blockClass, "__after-input-elements")) // tabindex -1 fixes blur target test when clicking on after-input-elements background
250
+ ,
251
+ tabIndex: "-1"
252
+ }, /*#__PURE__*/_react.default.createElement("div", {
253
+ className: "".concat(blockClass, "__ellipsis"),
254
+ "aria-hidden": !editing
255
+ }, "\u2026"), /*#__PURE__*/_react.default.createElement("div", {
256
+ className: (0, _classnames.default)("".concat(blockClass, "__toolbar"), (_cx3 = {}, (0, _defineProperty2.default)(_cx3, "".concat(blockClass, "__toolbar--animation"), toolbarAnimation), (0, _defineProperty2.default)(_cx3, "".concat(blockClass, "__toolbar--saveable"), refInput.current && value !== internalValue), _cx3))
257
+ }, showValidation && /*#__PURE__*/_react.default.createElement("div", {
258
+ className: "".concat(blockClass, "__validation-icon")
259
+ }, validationIcon), editing ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
260
+ className: "".concat(blockClass, "__cancel"),
261
+ kind: "ghost",
262
+ hasIconOnly: true,
263
+ iconDescription: cancelDescription,
264
+ onClick: handleCancel,
265
+ renderIcon: _iconsReact.Close16
266
+ }), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
267
+ className: "".concat(blockClass, "__save"),
268
+ kind: "ghost",
269
+ hasIconOnly: true,
270
+ iconDescription: saveDescription,
271
+ onClick: handleSave,
272
+ renderIcon: _iconsReact.Checkmark16,
273
+ disabled: value === internalValue
274
+ })) : /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
275
+ "aria-hidden": "true",
276
+ className: (0, _classnames.default)("".concat(blockClass, "__edit"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__edit--hover-visible"), editVisibleOnHoverOnly)),
277
+ kind: "ghost",
278
+ hasIconOnly: true,
279
+ iconDescription: editDescription,
280
+ onClick: handleEdit,
281
+ renderIcon: disabled ? _iconsReact.EditOff16 : _iconsReact.Edit16,
282
+ disabled: disabled,
283
+ tabIndex: -1
284
+ }))), /*#__PURE__*/_react.default.createElement("div", {
285
+ className: (0, _classnames.default)("".concat(blockClass, "__disabled-cover"))
286
+ }), showValidation && validationText && validationText.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
287
+ className: "".concat(blockClass, "__validation-text ").concat(_settings.carbon.prefix, "--form-requirement")
288
+ }, validationText))
289
+ );
131
290
  }); // Return a placeholder if not released and not enabled by feature flag
132
291
 
133
292
 
@@ -140,6 +299,11 @@ InlineEdit.displayName = componentName; // The types and DocGen commentary for t
140
299
  // See https://www.npmjs.com/package/prop-types#usage.
141
300
 
142
301
  InlineEdit.propTypes = {
302
+ /**
303
+ * label for cancel button
304
+ */
305
+ cancelDescription: _propTypes.default.string.isRequired,
306
+
143
307
  /**
144
308
  * Provide an optional class to be applied to the containing node.
145
309
  */
@@ -156,16 +320,15 @@ InlineEdit.propTypes = {
156
320
  editDescription: _propTypes.default.string.isRequired,
157
321
 
158
322
  /**
159
- * ID for inline edit
323
+ * In some scenarios the edit icon only needs to be shown on hover. These cases are where continual visibility of
324
+ * the edit icon is redundant. E.g. a spreadsheet a property panel.
160
325
  */
161
- id: _propTypes.default.string,
162
-
163
- /* TODO: add types and DocGen for all props. */
326
+ editVisibleOnHoverOnly: _propTypes.default.bool,
164
327
 
165
328
  /**
166
- * inline variant
167
- */
168
- inline: _propTypes.default.bool,
329
+ * ID for inline edit
330
+ */
331
+ id: _propTypes.default.string,
169
332
 
170
333
  /**
171
334
  * set invalid state for input
@@ -183,34 +346,38 @@ InlineEdit.propTypes = {
183
346
  labelText: _propTypes.default.string,
184
347
 
185
348
  /**
186
- * method called on change event
349
+ * change background to light version (mimic React TextInput)
187
350
  */
188
- onChange: _propTypes.default.func,
351
+ light: _propTypes.default.bool,
189
352
 
190
353
  /**
191
- * method called on input event
354
+ * method called on cancel event
192
355
  */
193
- onInput: _propTypes.default.func,
356
+ onCancel: _propTypes.default.func,
194
357
 
195
358
  /**
196
- * method called on revert event
359
+ * method called on input event (it's a React thing onChange behaves like on input).
360
+ *
361
+ * NOTE: caller to handle invalid/warn states and associated text
197
362
  */
198
- onRevert: _propTypes.default.func,
363
+ onChange: _propTypes.default.func,
199
364
 
200
365
  /**
201
- * label for revert button
366
+ * method called on change event
367
+ *
368
+ * NOTE: caller to handle invalid/warn states and associated text
202
369
  */
203
- revertDescription: _propTypes.default.string.isRequired,
370
+ onSave: _propTypes.default.func,
204
371
 
205
372
  /**
206
- * label for save button
373
+ * placeholder for text input
207
374
  */
208
- saveDescription: _propTypes.default.string.isRequired,
375
+ placeholder: _propTypes.default.string,
209
376
 
210
377
  /**
211
- * disabled state of the save button
378
+ * label for save button
212
379
  */
213
- saveDisabled: _propTypes.default.bool,
380
+ saveDescription: _propTypes.default.string.isRequired,
214
381
 
215
382
  /**
216
383
  * vertical size of control
@@ -237,6 +404,7 @@ InlineEdit.propTypes = {
237
404
  // component needs to make a choice or assumption when a prop is not supplied.
238
405
 
239
406
  InlineEdit.defaultProps = {
240
- /* TODO: add defaults for relevant props. */
407
+ light: true,
408
+ // defaults to true to reflect design
241
409
  size: 'md'
242
410
  };
@@ -95,6 +95,12 @@ var NotificationsPanel = /*#__PURE__*/_react.default.forwardRef(function (_ref,
95
95
  allNotifications = _useState4[0],
96
96
  setAllNotifications = _useState4[1];
97
97
 
98
+ var previousState = (0, _hooks.usePreviousValue)({
99
+ open: open
100
+ });
101
+ var reducedMotion = window && window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : {
102
+ matches: true
103
+ };
98
104
  (0, _react.useEffect)(function () {
99
105
  // Set the notifications passed to the state within this component
100
106
  setAllNotifications(data);
@@ -114,6 +120,12 @@ var NotificationsPanel = /*#__PURE__*/_react.default.forwardRef(function (_ref,
114
120
  !open && setRender(false);
115
121
  };
116
122
 
123
+ (0, _react.useEffect)(function () {
124
+ if (!open && previousState !== null && previousState !== void 0 && previousState.open && reducedMotion.matches) {
125
+ setRender(false);
126
+ }
127
+ }, [open, reducedMotion.matches, previousState === null || previousState === void 0 ? void 0 : previousState.open]);
128
+
117
129
  var sortChronologically = function sortChronologically(arr) {
118
130
  if (!arr || arr && !arr.length) {
119
131
  return;
@@ -253,7 +265,7 @@ var NotificationsPanel = /*#__PURE__*/_react.default.forwardRef(function (_ref,
253
265
  id: blockClass,
254
266
  className: (0, _classnames.default)(blockClass, className, "".concat(blockClass, "__container")),
255
267
  style: {
256
- animation: "".concat(open ? 'fadeIn 250ms' : 'fadeOut 250ms')
268
+ animation: !reducedMotion.matches ? "".concat(open ? 'fade-in 250ms' : 'fade-out 250ms') : null
257
269
  },
258
270
  onAnimationEnd: onAnimationEnd,
259
271
  ref: ref || notificationPanelRef
@@ -391,16 +391,17 @@ var PageHeader = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
391
391
  }, /*#__PURE__*/_react.default.createElement("div", {
392
392
  className: "".concat(_PageHeaderUtils.blockClass, "__non-navigation-row-content")
393
393
  }, hasBreadcrumbRow ? /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Row, {
394
- className: (0, _classnames.default)("".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row"), (_cx2 = {}, (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--next-to-tabs"), nextToTabsCheck()), (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--has-breadcrumbs"), breadcrumbs), (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--has-action-bar"), hasActionBar || widthIsNarrow), (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__has-page-actions-without-action-bar"), !hasActionBar && !widthIsNarrow && pageActions), _cx2))
394
+ className: (0, _classnames.default)("".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row"), (_cx2 = {}, (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--next-to-tabs"), nextToTabsCheck()), (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--has-breadcrumbs"), breadcrumbs || breadcrumbItemForTitle), (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--has-action-bar"), hasActionBar || widthIsNarrow), (0, _defineProperty2.default)(_cx2, "".concat(_PageHeaderUtils.blockClass, "__has-page-actions-without-action-bar"), !hasActionBar && !widthIsNarrow && pageActions), _cx2))
395
395
  }, /*#__PURE__*/_react.default.createElement("div", {
396
396
  className: "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-row--container")
397
397
  }, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Column, {
398
398
  className: (0, _classnames.default)("".concat(_PageHeaderUtils.blockClass, "__breadcrumb-column"), (0, _defineProperty2.default)({}, "".concat(_PageHeaderUtils.blockClass, "__breadcrumb-column--background"), !!breadcrumbs || hasActionBar || widthIsNarrow))
399
- }, breadcrumbs ? /*#__PURE__*/_react.default.createElement(_BreadcrumbWithOverflow.BreadcrumbWithOverflow, {
399
+ }, breadcrumbs || breadcrumbItemForTitle ? /*#__PURE__*/_react.default.createElement(_BreadcrumbWithOverflow.BreadcrumbWithOverflow, {
400
400
  className: "".concat(_PageHeaderUtils.blockClass, "__breadcrumb"),
401
401
  noTrailingSlash: !!title,
402
402
  overflowAriaLabel: breadcrumbOverflowAriaLabel,
403
- breadcrumbs: breadcrumbs ? breadcrumbItemForTitle ? breadcrumbs.concat(breadcrumbItemForTitle) : breadcrumbs : null
403
+ breadcrumbs: breadcrumbs && breadcrumbItemForTitle ? breadcrumbs.concat(breadcrumbItemForTitle) : breadcrumbItemForTitle ? [breadcrumbItemForTitle] : breadcrumbs // breadcrumbs may be null or undefined
404
+
404
405
  }) : null), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Column, {
405
406
  className: (0, _classnames.default)(["".concat(_PageHeaderUtils.blockClass, "__action-bar-column ").concat(_PageHeaderUtils.blockClass, "__action-bar-column--background"), (_ref7 = {}, (0, _defineProperty2.default)(_ref7, "".concat(_PageHeaderUtils.blockClass, "__action-bar-column--has-page-actions"), pageActions), (0, _defineProperty2.default)(_ref7, "".concat(_PageHeaderUtils.blockClass, "__action-bar-column--influenced-by-collapse-button"), spaceForCollapseButton), _ref7)])
406
407
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -799,9 +800,10 @@ PageHeader.propTypes = _objectSpread({
799
800
  * - text: title string
800
801
  * - icon: optional icon
801
802
  * - loading: boolean shows loading indicator if true
802
- * - onChange: function to process edits only supply if in place edit is desired
803
+ * - onChange: function to process the live value (React change === HTML Input)
804
+ * - onSave: function to process a confirmed change
803
805
  * - editableLabel: label for edit required if onChange supplied
804
- * - revertDescription: label for edit revert button
806
+ * - cancelDescription: label for edit cancel button
805
807
  * - saveDescription: label for edit save button
806
808
  * - Object containing user defined contents. These must fit within the area defined for the title in both main part of the header and the breadcrumb.
807
809
  * - content: title or name of current location shown in main part of page header
@@ -819,7 +821,8 @@ PageHeader.propTypes = _objectSpread({
819
821
  id: _propTypes.default.string,
820
822
  // .isRequired.if(inlineEditRequired),
821
823
  onChange: _propTypes.default.func,
822
- revertDescription: _propTypes.default.string,
824
+ onSave: _propTypes.default.func,
825
+ cancelDescription: _propTypes.default.string,
823
826
  //.isRequired.if(inlineEditRequired),
824
827
  saveDescription: _propTypes.default.string //.isRequired.if(inlineEditRequired),
825
828
  // Update docgen if changed
@@ -23,7 +23,7 @@ var _carbonComponentsReact = require("carbon-components-react");
23
23
 
24
24
  var _ = require("../");
25
25
 
26
- var _excluded = ["text", "content", "loading", "icon", "asText", "onChange", "editDescription", "editableLabel", "revertDescription", "saveDescription"];
26
+ var _excluded = ["text", "content", "loading", "icon", "asText", "onChange", "onSave", "editDescription", "editableLabel", "revertDescription", "saveDescription"];
27
27
 
28
28
  /**
29
29
  *
@@ -43,13 +43,14 @@ var PageHeaderTitle = function PageHeaderTitle(_ref) {
43
43
  icon = title.icon,
44
44
  asText = title.asText,
45
45
  onChange = title.onChange,
46
+ onSave = title.onSave,
46
47
  editDescription = title.editDescription,
47
48
  editableLabel = title.editableLabel,
48
49
  revertDescription = title.revertDescription,
49
50
  saveDescription = title.saveDescription,
50
51
  rest = (0, _objectWithoutProperties2.default)(title, _excluded);
51
52
  var titleText;
52
- var isEditable = !!onChange;
53
+ var isEditable = !!onSave;
53
54
 
54
55
  if (text || !content) {
55
56
  if (text === undefined && typeof title === 'string') {
@@ -67,6 +68,7 @@ var PageHeaderTitle = function PageHeaderTitle(_ref) {
67
68
  value: text,
68
69
  editDescription: editDescription,
69
70
  onChange: onChange,
71
+ onSave: onSave,
70
72
  labelText: editableLabel,
71
73
  revertDescription: revertDescription,
72
74
  saveDescription: saveDescription
@@ -87,8 +89,8 @@ var PageHeaderTitle = function PageHeaderTitle(_ref) {
87
89
  exports.PageHeaderTitle = PageHeaderTitle;
88
90
 
89
91
  var inlineEditRequired = function inlineEditRequired(_ref2) {
90
- var onChange = _ref2.onChange;
91
- return !!onChange;
92
+ var onSave = _ref2.onSave;
93
+ return !!onSave;
92
94
  };
93
95
 
94
96
  exports.inlineEditRequired = inlineEditRequired;
@@ -110,9 +112,10 @@ PageHeaderTitle.propTypes = {
110
112
  * - text: title string
111
113
  * - icon: optional icon
112
114
  * - loading: boolean shows loading indicator if true
113
- * - onChange: function to process edits only supply if in place edit is desired
115
+ * - onChange: function to process the live value (React change === HTML Input)
116
+ * - onSave: function to process a confirmed change
114
117
  * - editDescription: description for edit button
115
- * - editableLabel: label for edit required if onChange supplied
118
+ * - editableLabel: label for edit required if onSave supplied
116
119
  * - revertDescription: description for edit revert button
117
120
  * - saveDescription: description for edit save button
118
121
  * - Object containing user defined contents. These must fit within the area defined for the title in both main part of the header and the breadcrumb.
@@ -130,6 +133,7 @@ PageHeaderTitle.propTypes = {
130
133
  editableLabel: _propTypes.default.string.isRequired.if(inlineEditRequired),
131
134
  id: _propTypes.default.string.isRequired.if(inlineEditRequired),
132
135
  onChange: _propTypes.default.func,
136
+ onSave: _propTypes.default.func,
133
137
  revertDescription: _propTypes.default.string.isRequired.if(inlineEditRequired),
134
138
  saveDescription: _propTypes.default.string.isRequired.if(inlineEditRequired) // Update docgen if changed
135
139