carbon-react 142.5.0 → 142.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm/components/breadcrumbs/__internal__/breadcrumbs.context.d.ts +6 -0
  2. package/esm/components/breadcrumbs/__internal__/breadcrumbs.context.js +5 -0
  3. package/esm/components/breadcrumbs/breadcrumbs.component.d.ts +2 -0
  4. package/esm/components/breadcrumbs/breadcrumbs.component.js +9 -2
  5. package/esm/components/breadcrumbs/crumb/crumb.component.js +20 -9
  6. package/esm/components/breadcrumbs/crumb/crumb.style.d.ts +6 -8
  7. package/esm/components/breadcrumbs/crumb/crumb.style.js +19 -12
  8. package/esm/components/textarea/textarea.component.d.ts +2 -0
  9. package/esm/components/textarea/textarea.component.js +16 -11
  10. package/esm/components/textarea/textarea.style.d.ts +3 -2
  11. package/esm/components/textarea/textarea.style.js +4 -2
  12. package/lib/components/breadcrumbs/__internal__/breadcrumbs.context.d.ts +6 -0
  13. package/lib/components/breadcrumbs/__internal__/breadcrumbs.context.js +12 -0
  14. package/lib/components/breadcrumbs/breadcrumbs.component.d.ts +2 -0
  15. package/lib/components/breadcrumbs/breadcrumbs.component.js +9 -2
  16. package/lib/components/breadcrumbs/crumb/crumb.component.js +22 -9
  17. package/lib/components/breadcrumbs/crumb/crumb.style.d.ts +6 -8
  18. package/lib/components/breadcrumbs/crumb/crumb.style.js +19 -12
  19. package/lib/components/textarea/textarea.component.d.ts +2 -0
  20. package/lib/components/textarea/textarea.component.js +15 -10
  21. package/lib/components/textarea/textarea.style.d.ts +3 -2
  22. package/lib/components/textarea/textarea.style.js +5 -3
  23. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export declare type BreadcrumbsContextType = {
3
+ isDarkBackground: boolean;
4
+ };
5
+ declare const BreadcrumbsContext: React.Context<BreadcrumbsContextType>;
6
+ export default BreadcrumbsContext;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ const BreadcrumbsContext = /*#__PURE__*/React.createContext({
3
+ isDarkBackground: false
4
+ });
5
+ export default BreadcrumbsContext;
@@ -4,6 +4,8 @@ import { TagProps } from "../../__internal__/utils/helpers/tags";
4
4
  export interface BreadcrumbsProps extends TagProps, SpaceProps {
5
5
  /** Child crumbs to display */
6
6
  children: React.ReactNode;
7
+ /** Sets the colour styling when component is rendered on a dark background */
8
+ isDarkBackground?: boolean;
7
9
  }
8
10
  export declare const Breadcrumbs: React.ForwardRefExoticComponent<BreadcrumbsProps & React.RefAttributes<HTMLElement>>;
9
11
  export default Breadcrumbs;
@@ -4,17 +4,23 @@ import PropTypes from "prop-types";
4
4
  import tagComponent from "../../__internal__/utils/helpers/tags";
5
5
  import StyledBreadcrumbs from "./breadcrumbs.style";
6
6
  import useLocale from "../../hooks/__internal__/useLocale";
7
+ import BreadcrumbsContext from "./__internal__/breadcrumbs.context";
7
8
  const Breadcrumbs = /*#__PURE__*/React.forwardRef(({
8
9
  children,
10
+ isDarkBackground = false,
9
11
  ...rest
10
12
  }, ref) => {
11
13
  const l = useLocale();
12
- return /*#__PURE__*/React.createElement(StyledBreadcrumbs, _extends({
14
+ return /*#__PURE__*/React.createElement(BreadcrumbsContext.Provider, {
15
+ value: {
16
+ isDarkBackground
17
+ }
18
+ }, /*#__PURE__*/React.createElement(StyledBreadcrumbs, _extends({
13
19
  ref: ref,
14
20
  role: "navigation"
15
21
  }, tagComponent("breadcrumbs", rest), {
16
22
  "aria-label": l.breadcrumbs.ariaLabel()
17
- }, rest), /*#__PURE__*/React.createElement("ol", null, children));
23
+ }, rest), /*#__PURE__*/React.createElement("ol", null, children)));
18
24
  });
19
25
  if (process.env.NODE_ENV !== "production") {
20
26
  Breadcrumbs.propTypes = {
@@ -22,6 +28,7 @@ if (process.env.NODE_ENV !== "production") {
22
28
  "data-component": PropTypes.string,
23
29
  "data-element": PropTypes.string,
24
30
  "data-role": PropTypes.string,
31
+ "isDarkBackground": PropTypes.bool,
25
32
  "m": PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf([null]), PropTypes.number, PropTypes.shape({
26
33
  "__@toStringTag": PropTypes.string.isRequired,
27
34
  "description": PropTypes.string,
@@ -1,22 +1,33 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
- import React from "react";
2
+ import React, { useContext } from "react";
3
3
  import PropTypes from "prop-types";
4
4
  import tagComponent from "../../../__internal__/utils/helpers/tags";
5
5
  import { StyledCrumb, Divider } from "./crumb.style";
6
+ import BreadcrumbsContext from "../__internal__/breadcrumbs.context";
6
7
  const Crumb = /*#__PURE__*/React.forwardRef(({
7
8
  href,
8
9
  isCurrent,
9
10
  children,
10
11
  onClick,
11
12
  ...rest
12
- }, ref) => /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(StyledCrumb, _extends({
13
- ref: ref,
14
- isCurrent: isCurrent,
15
- "aria-current": isCurrent ? "page" : undefined
16
- }, tagComponent("crumb", rest), rest, !isCurrent && {
17
- href,
18
- onClick
19
- }), children), !isCurrent && /*#__PURE__*/React.createElement(Divider, null)));
13
+ }, ref) => {
14
+ const {
15
+ isDarkBackground
16
+ } = useContext(BreadcrumbsContext);
17
+ return /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(StyledCrumb, _extends({
18
+ ref: ref,
19
+ isCurrent: isCurrent,
20
+ "aria-current": isCurrent ? "page" : undefined,
21
+ isDarkBackground: isDarkBackground
22
+ }, tagComponent("crumb", rest), rest, !isCurrent && {
23
+ href,
24
+ onClick
25
+ }), children), !isCurrent && /*#__PURE__*/React.createElement(Divider, {
26
+ "data-role": "crumb-divider",
27
+ "aria-hidden": "true",
28
+ isDarkBackground: isDarkBackground
29
+ }));
30
+ });
20
31
  if (process.env.NODE_ENV !== "production") {
21
32
  Crumb.propTypes = {
22
33
  "aria-activedescendant": PropTypes.string,
@@ -2,17 +2,15 @@
2
2
  import { LinkProps } from "../../link";
3
3
  interface StyleCrumbProps extends LinkProps {
4
4
  isCurrent?: boolean;
5
+ isDarkBackground: boolean;
5
6
  }
6
7
  export declare const StyledCrumb: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<LinkProps & import("react").RefAttributes<HTMLButtonElement | HTMLLinkElement>>, any, StyleCrumbProps, never>;
7
- export declare const Divider: import("styled-components").StyledComponent<"span", any, {
8
- children: "/";
9
- "aria-hidden": "true";
10
- }, "aria-hidden" | "children">;
8
+ interface DividerProps {
9
+ isDarkBackground: boolean;
10
+ }
11
+ export declare const Divider: import("styled-components").StyledComponent<"span", any, DividerProps, never>;
11
12
  declare const _default: {
12
13
  StyledCrumb: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<LinkProps & import("react").RefAttributes<HTMLButtonElement | HTMLLinkElement>>, any, StyleCrumbProps, never>;
13
- Divider: import("styled-components").StyledComponent<"span", any, {
14
- children: "/";
15
- "aria-hidden": "true";
16
- }, "aria-hidden" | "children">;
14
+ Divider: import("styled-components").StyledComponent<"span", any, DividerProps, never>;
17
15
  };
18
16
  export default _default;
@@ -1,31 +1,38 @@
1
1
  import styled, { css } from "styled-components";
2
2
  import Link from "../../link";
3
+ const getCurrentCrumbColor = isDarkBackground => {
4
+ return isDarkBackground ? "var(--colorsUtilityYang100)" : "var(--colorsUtilityYin090)";
5
+ };
3
6
  export const StyledCrumb = styled(Link)`
4
7
  font: var(--typographyLinkTextM);
5
8
  ${({
6
- isCurrent
9
+ isCurrent,
10
+ isDarkBackground
7
11
  }) => isCurrent && css`
8
12
  a {
9
- color: var(--colorsUtilityYin090);
13
+ color: ${getCurrentCrumbColor(isDarkBackground)};
10
14
  text-decoration: none;
11
15
  font: var(--typographyBreadcrumbCurrentPageM);
12
- cursor: text;
13
16
  :hover {
14
- color: var(--colorsUtilityYin090);
17
+ color: ${getCurrentCrumbColor(isDarkBackground)};
15
18
  text-decoration: none;
16
19
  cursor: text;
17
20
  }
18
21
  }
19
22
  `}
20
23
  `;
21
- export const Divider = styled.span.attrs({
22
- children: "/",
23
- "aria-hidden": "true"
24
- })`
25
- margin: 0px var(--spacing050) 0px var(--spacing100);
26
- line-height: 16px;
27
- font: var(--typographyBreadcrumbSeparatorM);
28
- color: var(--colorsUtilityYin055);
24
+ export const Divider = styled.span`
25
+ ::after {
26
+ content: "/";
27
+ margin: 0px var(--spacing050) 0px var(--spacing100);
28
+ line-height: 16px;
29
+ font: var(--typographyBreadcrumbSeparatorM);
30
+ ${({
31
+ isDarkBackground
32
+ }) => css`
33
+ color: ${isDarkBackground ? "var(--colorsUtilityYang100)" : "var(--colorsUtilityYin055)"};
34
+ `}
35
+ }
29
36
  `;
30
37
  export default {
31
38
  StyledCrumb,
@@ -102,6 +102,8 @@ export interface TextareaProps extends ValidationProps, MarginProps, Omit<Common
102
102
  borderRadius?: BorderRadiusType | BorderRadiusType[];
103
103
  /** Hides the borders for the component. Please note that validation and focus styling will still be applied */
104
104
  hideBorders?: boolean;
105
+ /** Specify the minimum height */
106
+ minHeight?: number;
105
107
  }
106
108
  export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
107
109
  export { Textarea as OriginalTextarea };
@@ -8,7 +8,7 @@ import Input from "../../__internal__/input/input.component";
8
8
  import { InputBehaviour } from "../../__internal__/input-behaviour";
9
9
  import InputIconToggle from "../../__internal__/input-icon-toggle";
10
10
  import guid from "../../__internal__/utils/helpers/guid";
11
- import StyledTextarea, { MIN_HEIGHT } from "./textarea.style";
11
+ import StyledTextarea, { DEFAULT_MIN_HEIGHT } from "./textarea.style";
12
12
  import { TooltipProvider } from "../../__internal__/tooltip-provider";
13
13
  import useInputAccessibility from "../../hooks/__internal__/useInputAccessibility";
14
14
  import NewValidationContext from "../carbon-provider/__internal__/new-validation.context";
@@ -60,11 +60,13 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
60
60
  hideBorders = false,
61
61
  required,
62
62
  isOptional,
63
+ minHeight = DEFAULT_MIN_HEIGHT,
63
64
  ...rest
64
65
  }, ref) => {
65
66
  const {
66
67
  validationRedesignOptIn
67
68
  } = useContext(NewValidationContext);
69
+ const [textareaMinHeight, setTextareaMinHeight] = useState(DEFAULT_MIN_HEIGHT);
68
70
  const computeLabelPropValues = prop => validationRedesignOptIn ? undefined : prop;
69
71
  const {
70
72
  current: id
@@ -105,10 +107,9 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
105
107
  console.warn("The `borderRadius` prop in `Textarea` component only supports up to 4 values.");
106
108
  warnBorderRadiusArrayTooLarge = true;
107
109
  }
108
- const minHeight = useRef(MIN_HEIGHT);
109
- const expandTextarea = () => {
110
+ const expandTextarea = useCallback(() => {
110
111
  const textarea = internalRef.current;
111
- if (textarea?.scrollHeight && textarea?.scrollHeight > minHeight.current) {
112
+ if (textarea?.scrollHeight && textarea?.scrollHeight > textareaMinHeight) {
112
113
  // need to reset scroll position of the nearest parent which scrolls
113
114
  let scrollElement = textarea;
114
115
  while (scrollElement && !scrollElement?.scrollTop) {
@@ -117,12 +118,12 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
117
118
  const scrollPosition = scrollElement?.scrollTop;
118
119
  textarea.style.height = "0px";
119
120
  // Set the height so all content is shown
120
- textarea.style.height = `${Math.max(textarea.scrollHeight, minHeight.current)}px`;
121
+ textarea.style.height = `${Math.max(textarea.scrollHeight, textareaMinHeight)}px`;
121
122
  if (scrollElement && scrollPosition) {
122
123
  scrollElement.scrollTop = scrollPosition;
123
124
  }
124
125
  }
125
- };
126
+ }, [textareaMinHeight]);
126
127
  const {
127
128
  labelId,
128
129
  validationId,
@@ -140,9 +141,11 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
140
141
  const [characterCount, visuallyHiddenHintId] = useCharacterCount(value, characterLimit, characterCountAriaLive);
141
142
  useEffect(() => {
142
143
  if (rows) {
143
- minHeight.current = internalRef?.current?.scrollHeight || 0;
144
+ setTextareaMinHeight(internalRef?.current?.scrollHeight || 0);
145
+ } else {
146
+ setTextareaMinHeight(minHeight > DEFAULT_MIN_HEIGHT ? minHeight : DEFAULT_MIN_HEIGHT);
144
147
  }
145
- }, [rows]);
148
+ }, [minHeight, rows]);
146
149
  useEffect(() => {
147
150
  if (expandable) {
148
151
  expandTextarea();
@@ -151,7 +154,7 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
151
154
  useEffect(() => {
152
155
  if (expandable) {
153
156
  window.addEventListener("resize", expandTextarea);
154
- minHeight.current = internalRef?.current?.clientHeight || 0;
157
+ setTextareaMinHeight(internalRef?.current?.clientHeight || 0);
155
158
  // need to also run expandTextarea when the Sage UI font completes loading, to prevent strange scroll
156
159
  // behaviour when it only loads after the component is rendered
157
160
  document.fonts?.addEventListener("loadingdone", expandTextarea);
@@ -162,7 +165,7 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
162
165
  document.fonts?.removeEventListener("loadingdone", expandTextarea);
163
166
  }
164
167
  };
165
- }, [expandable]);
168
+ }, [expandTextarea, expandable]);
166
169
  const hasIconInside = !!(inputIcon || validationId && !validationOnLabel);
167
170
  const hintId = useRef(guid());
168
171
  const inputHintId = inputHint ? hintId.current : undefined;
@@ -216,7 +219,8 @@ const Textarea = /*#__PURE__*/React.forwardRef(({
216
219
  "data-component": dataComponent,
217
220
  "data-role": dataRole,
218
221
  "data-element": dataElement,
219
- hasIcon: hasIconInside
222
+ hasIcon: hasIconInside,
223
+ minHeight: textareaMinHeight
220
224
  }, marginProps), /*#__PURE__*/React.createElement(FormField, {
221
225
  fieldHelp: computeLabelPropValues(fieldHelp),
222
226
  fieldHelpId: fieldHelpId,
@@ -475,6 +479,7 @@ if (process.env.NODE_ENV !== "production") {
475
479
  "valueOf": PropTypes.func.isRequired
476
480
  }), PropTypes.string]),
477
481
  "min": PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
482
+ "minHeight": PropTypes.number,
478
483
  "minLength": PropTypes.number,
479
484
  "ml": PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf([null]), PropTypes.number, PropTypes.shape({
480
485
  "__@toStringTag": PropTypes.string.isRequired,
@@ -1,5 +1,6 @@
1
- export declare const MIN_HEIGHT = 64;
2
- export interface StyledTextAreaProps {
1
+ import { TextareaProps } from "./textarea.component";
2
+ export declare const DEFAULT_MIN_HEIGHT = 64;
3
+ export interface StyledTextAreaProps extends Pick<TextareaProps, "minHeight"> {
3
4
  /** When true, label is placed in line an input */
4
5
  labelInline?: boolean;
5
6
  /** When true, adjusts padding for icon */
@@ -4,14 +4,16 @@ import StyledInput from "../../__internal__/input/input.style";
4
4
  import { StyledLabelContainer } from "../../__internal__/label/label.style";
5
5
  import InputIconToggleStyle from "../../__internal__/input-icon-toggle/input-icon-toggle.style";
6
6
  import BaseTheme from "../../style/themes/base";
7
- export const MIN_HEIGHT = 64;
7
+ export const DEFAULT_MIN_HEIGHT = 64;
8
8
  const StyledTextarea = styled.div`
9
9
  ${margin};
10
10
 
11
11
  ${StyledInput} {
12
12
  box-sizing: border-box;
13
13
  resize: none;
14
- min-height: ${MIN_HEIGHT}px;
14
+ ${({
15
+ minHeight
16
+ }) => `min-height: ${minHeight || DEFAULT_MIN_HEIGHT}px;`}
15
17
  padding: var(--spacing150) var(--spacing200);
16
18
 
17
19
  ${({
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export declare type BreadcrumbsContextType = {
3
+ isDarkBackground: boolean;
4
+ };
5
+ declare const BreadcrumbsContext: React.Context<BreadcrumbsContextType>;
6
+ export default BreadcrumbsContext;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ const BreadcrumbsContext = /*#__PURE__*/_react.default.createContext({
10
+ isDarkBackground: false
11
+ });
12
+ var _default = exports.default = BreadcrumbsContext;
@@ -4,6 +4,8 @@ import { TagProps } from "../../__internal__/utils/helpers/tags";
4
4
  export interface BreadcrumbsProps extends TagProps, SpaceProps {
5
5
  /** Child crumbs to display */
6
6
  children: React.ReactNode;
7
+ /** Sets the colour styling when component is rendered on a dark background */
8
+ isDarkBackground?: boolean;
7
9
  }
8
10
  export declare const Breadcrumbs: React.ForwardRefExoticComponent<BreadcrumbsProps & React.RefAttributes<HTMLElement>>;
9
11
  export default Breadcrumbs;
@@ -9,19 +9,25 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _tags = _interopRequireDefault(require("../../__internal__/utils/helpers/tags"));
10
10
  var _breadcrumbs = _interopRequireDefault(require("./breadcrumbs.style"));
11
11
  var _useLocale = _interopRequireDefault(require("../../hooks/__internal__/useLocale"));
12
+ var _breadcrumbs2 = _interopRequireDefault(require("./__internal__/breadcrumbs.context"));
12
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
14
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
14
15
  const Breadcrumbs = exports.Breadcrumbs = /*#__PURE__*/_react.default.forwardRef(({
15
16
  children,
17
+ isDarkBackground = false,
16
18
  ...rest
17
19
  }, ref) => {
18
20
  const l = (0, _useLocale.default)();
19
- return /*#__PURE__*/_react.default.createElement(_breadcrumbs.default, _extends({
21
+ return /*#__PURE__*/_react.default.createElement(_breadcrumbs2.default.Provider, {
22
+ value: {
23
+ isDarkBackground
24
+ }
25
+ }, /*#__PURE__*/_react.default.createElement(_breadcrumbs.default, _extends({
20
26
  ref: ref,
21
27
  role: "navigation"
22
28
  }, (0, _tags.default)("breadcrumbs", rest), {
23
29
  "aria-label": l.breadcrumbs.ariaLabel()
24
- }, rest), /*#__PURE__*/_react.default.createElement("ol", null, children));
30
+ }, rest), /*#__PURE__*/_react.default.createElement("ol", null, children)));
25
31
  });
26
32
  if (process.env.NODE_ENV !== "production") {
27
33
  Breadcrumbs.propTypes = {
@@ -29,6 +35,7 @@ if (process.env.NODE_ENV !== "production") {
29
35
  "data-component": _propTypes.default.string,
30
36
  "data-element": _propTypes.default.string,
31
37
  "data-role": _propTypes.default.string,
38
+ "isDarkBackground": _propTypes.default.bool,
32
39
  "m": _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf([null]), _propTypes.default.number, _propTypes.default.shape({
33
40
  "__@toStringTag": _propTypes.default.string.isRequired,
34
41
  "description": _propTypes.default.string,
@@ -4,11 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _react = _interopRequireDefault(require("react"));
7
+ var _react = _interopRequireWildcard(require("react"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _tags = _interopRequireDefault(require("../../../__internal__/utils/helpers/tags"));
10
10
  var _crumb = require("./crumb.style");
11
+ var _breadcrumbs = _interopRequireDefault(require("../__internal__/breadcrumbs.context"));
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
15
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
13
16
  const Crumb = /*#__PURE__*/_react.default.forwardRef(({
14
17
  href,
@@ -16,14 +19,24 @@ const Crumb = /*#__PURE__*/_react.default.forwardRef(({
16
19
  children,
17
20
  onClick,
18
21
  ...rest
19
- }, ref) => /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement(_crumb.StyledCrumb, _extends({
20
- ref: ref,
21
- isCurrent: isCurrent,
22
- "aria-current": isCurrent ? "page" : undefined
23
- }, (0, _tags.default)("crumb", rest), rest, !isCurrent && {
24
- href,
25
- onClick
26
- }), children), !isCurrent && /*#__PURE__*/_react.default.createElement(_crumb.Divider, null)));
22
+ }, ref) => {
23
+ const {
24
+ isDarkBackground
25
+ } = (0, _react.useContext)(_breadcrumbs.default);
26
+ return /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement(_crumb.StyledCrumb, _extends({
27
+ ref: ref,
28
+ isCurrent: isCurrent,
29
+ "aria-current": isCurrent ? "page" : undefined,
30
+ isDarkBackground: isDarkBackground
31
+ }, (0, _tags.default)("crumb", rest), rest, !isCurrent && {
32
+ href,
33
+ onClick
34
+ }), children), !isCurrent && /*#__PURE__*/_react.default.createElement(_crumb.Divider, {
35
+ "data-role": "crumb-divider",
36
+ "aria-hidden": "true",
37
+ isDarkBackground: isDarkBackground
38
+ }));
39
+ });
27
40
  if (process.env.NODE_ENV !== "production") {
28
41
  Crumb.propTypes = {
29
42
  "aria-activedescendant": _propTypes.default.string,
@@ -2,17 +2,15 @@
2
2
  import { LinkProps } from "../../link";
3
3
  interface StyleCrumbProps extends LinkProps {
4
4
  isCurrent?: boolean;
5
+ isDarkBackground: boolean;
5
6
  }
6
7
  export declare const StyledCrumb: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<LinkProps & import("react").RefAttributes<HTMLButtonElement | HTMLLinkElement>>, any, StyleCrumbProps, never>;
7
- export declare const Divider: import("styled-components").StyledComponent<"span", any, {
8
- children: "/";
9
- "aria-hidden": "true";
10
- }, "aria-hidden" | "children">;
8
+ interface DividerProps {
9
+ isDarkBackground: boolean;
10
+ }
11
+ export declare const Divider: import("styled-components").StyledComponent<"span", any, DividerProps, never>;
11
12
  declare const _default: {
12
13
  StyledCrumb: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<LinkProps & import("react").RefAttributes<HTMLButtonElement | HTMLLinkElement>>, any, StyleCrumbProps, never>;
13
- Divider: import("styled-components").StyledComponent<"span", any, {
14
- children: "/";
15
- "aria-hidden": "true";
16
- }, "aria-hidden" | "children">;
14
+ Divider: import("styled-components").StyledComponent<"span", any, DividerProps, never>;
17
15
  };
18
16
  export default _default;
@@ -9,32 +9,39 @@ var _link = _interopRequireDefault(require("../../link"));
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
10
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
11
11
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
+ const getCurrentCrumbColor = isDarkBackground => {
13
+ return isDarkBackground ? "var(--colorsUtilityYang100)" : "var(--colorsUtilityYin090)";
14
+ };
12
15
  const StyledCrumb = exports.StyledCrumb = (0, _styledComponents.default)(_link.default)`
13
16
  font: var(--typographyLinkTextM);
14
17
  ${({
15
- isCurrent
18
+ isCurrent,
19
+ isDarkBackground
16
20
  }) => isCurrent && (0, _styledComponents.css)`
17
21
  a {
18
- color: var(--colorsUtilityYin090);
22
+ color: ${getCurrentCrumbColor(isDarkBackground)};
19
23
  text-decoration: none;
20
24
  font: var(--typographyBreadcrumbCurrentPageM);
21
- cursor: text;
22
25
  :hover {
23
- color: var(--colorsUtilityYin090);
26
+ color: ${getCurrentCrumbColor(isDarkBackground)};
24
27
  text-decoration: none;
25
28
  cursor: text;
26
29
  }
27
30
  }
28
31
  `}
29
32
  `;
30
- const Divider = exports.Divider = _styledComponents.default.span.attrs({
31
- children: "/",
32
- "aria-hidden": "true"
33
- })`
34
- margin: 0px var(--spacing050) 0px var(--spacing100);
35
- line-height: 16px;
36
- font: var(--typographyBreadcrumbSeparatorM);
37
- color: var(--colorsUtilityYin055);
33
+ const Divider = exports.Divider = _styledComponents.default.span`
34
+ ::after {
35
+ content: "/";
36
+ margin: 0px var(--spacing050) 0px var(--spacing100);
37
+ line-height: 16px;
38
+ font: var(--typographyBreadcrumbSeparatorM);
39
+ ${({
40
+ isDarkBackground
41
+ }) => (0, _styledComponents.css)`
42
+ color: ${isDarkBackground ? "var(--colorsUtilityYang100)" : "var(--colorsUtilityYin055)"};
43
+ `}
44
+ }
38
45
  `;
39
46
  var _default = exports.default = {
40
47
  StyledCrumb,
@@ -102,6 +102,8 @@ export interface TextareaProps extends ValidationProps, MarginProps, Omit<Common
102
102
  borderRadius?: BorderRadiusType | BorderRadiusType[];
103
103
  /** Hides the borders for the component. Please note that validation and focus styling will still be applied */
104
104
  hideBorders?: boolean;
105
+ /** Specify the minimum height */
106
+ minHeight?: number;
105
107
  }
106
108
  export declare const Textarea: React.ForwardRefExoticComponent<TextareaProps & React.RefAttributes<HTMLTextAreaElement>>;
107
109
  export { Textarea as OriginalTextarea };
@@ -69,11 +69,13 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
69
69
  hideBorders = false,
70
70
  required,
71
71
  isOptional,
72
+ minHeight = _textarea.DEFAULT_MIN_HEIGHT,
72
73
  ...rest
73
74
  }, ref) => {
74
75
  const {
75
76
  validationRedesignOptIn
76
77
  } = (0, _react.useContext)(_newValidation.default);
78
+ const [textareaMinHeight, setTextareaMinHeight] = (0, _react.useState)(_textarea.DEFAULT_MIN_HEIGHT);
77
79
  const computeLabelPropValues = prop => validationRedesignOptIn ? undefined : prop;
78
80
  const {
79
81
  current: id
@@ -114,10 +116,9 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
114
116
  console.warn("The `borderRadius` prop in `Textarea` component only supports up to 4 values.");
115
117
  warnBorderRadiusArrayTooLarge = true;
116
118
  }
117
- const minHeight = (0, _react.useRef)(_textarea.MIN_HEIGHT);
118
- const expandTextarea = () => {
119
+ const expandTextarea = (0, _react.useCallback)(() => {
119
120
  const textarea = internalRef.current;
120
- if (textarea?.scrollHeight && textarea?.scrollHeight > minHeight.current) {
121
+ if (textarea?.scrollHeight && textarea?.scrollHeight > textareaMinHeight) {
121
122
  // need to reset scroll position of the nearest parent which scrolls
122
123
  let scrollElement = textarea;
123
124
  while (scrollElement && !scrollElement?.scrollTop) {
@@ -126,12 +127,12 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
126
127
  const scrollPosition = scrollElement?.scrollTop;
127
128
  textarea.style.height = "0px";
128
129
  // Set the height so all content is shown
129
- textarea.style.height = `${Math.max(textarea.scrollHeight, minHeight.current)}px`;
130
+ textarea.style.height = `${Math.max(textarea.scrollHeight, textareaMinHeight)}px`;
130
131
  if (scrollElement && scrollPosition) {
131
132
  scrollElement.scrollTop = scrollPosition;
132
133
  }
133
134
  }
134
- };
135
+ }, [textareaMinHeight]);
135
136
  const {
136
137
  labelId,
137
138
  validationId,
@@ -149,9 +150,11 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
149
150
  const [characterCount, visuallyHiddenHintId] = (0, _useCharacterCount.default)(value, characterLimit, characterCountAriaLive);
150
151
  (0, _react.useEffect)(() => {
151
152
  if (rows) {
152
- minHeight.current = internalRef?.current?.scrollHeight || 0;
153
+ setTextareaMinHeight(internalRef?.current?.scrollHeight || 0);
154
+ } else {
155
+ setTextareaMinHeight(minHeight > _textarea.DEFAULT_MIN_HEIGHT ? minHeight : _textarea.DEFAULT_MIN_HEIGHT);
153
156
  }
154
- }, [rows]);
157
+ }, [minHeight, rows]);
155
158
  (0, _react.useEffect)(() => {
156
159
  if (expandable) {
157
160
  expandTextarea();
@@ -160,7 +163,7 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
160
163
  (0, _react.useEffect)(() => {
161
164
  if (expandable) {
162
165
  window.addEventListener("resize", expandTextarea);
163
- minHeight.current = internalRef?.current?.clientHeight || 0;
166
+ setTextareaMinHeight(internalRef?.current?.clientHeight || 0);
164
167
  // need to also run expandTextarea when the Sage UI font completes loading, to prevent strange scroll
165
168
  // behaviour when it only loads after the component is rendered
166
169
  document.fonts?.addEventListener("loadingdone", expandTextarea);
@@ -171,7 +174,7 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
171
174
  document.fonts?.removeEventListener("loadingdone", expandTextarea);
172
175
  }
173
176
  };
174
- }, [expandable]);
177
+ }, [expandTextarea, expandable]);
175
178
  const hasIconInside = !!(inputIcon || validationId && !validationOnLabel);
176
179
  const hintId = (0, _react.useRef)((0, _guid.default)());
177
180
  const inputHintId = inputHint ? hintId.current : undefined;
@@ -225,7 +228,8 @@ const Textarea = exports.OriginalTextarea = exports.Textarea = /*#__PURE__*/_rea
225
228
  "data-component": dataComponent,
226
229
  "data-role": dataRole,
227
230
  "data-element": dataElement,
228
- hasIcon: hasIconInside
231
+ hasIcon: hasIconInside,
232
+ minHeight: textareaMinHeight
229
233
  }, marginProps), /*#__PURE__*/_react.default.createElement(_formField.default, {
230
234
  fieldHelp: computeLabelPropValues(fieldHelp),
231
235
  fieldHelpId: fieldHelpId,
@@ -484,6 +488,7 @@ if (process.env.NODE_ENV !== "production") {
484
488
  "valueOf": _propTypes.default.func.isRequired
485
489
  }), _propTypes.default.string]),
486
490
  "min": _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
491
+ "minHeight": _propTypes.default.number,
487
492
  "minLength": _propTypes.default.number,
488
493
  "ml": _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf([null]), _propTypes.default.number, _propTypes.default.shape({
489
494
  "__@toStringTag": _propTypes.default.string.isRequired,
@@ -1,5 +1,6 @@
1
- export declare const MIN_HEIGHT = 64;
2
- export interface StyledTextAreaProps {
1
+ import { TextareaProps } from "./textarea.component";
2
+ export declare const DEFAULT_MIN_HEIGHT = 64;
3
+ export interface StyledTextAreaProps extends Pick<TextareaProps, "minHeight"> {
3
4
  /** When true, label is placed in line an input */
4
5
  labelInline?: boolean;
5
6
  /** When true, adjusts padding for icon */
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.MIN_HEIGHT = void 0;
6
+ exports.default = exports.DEFAULT_MIN_HEIGHT = void 0;
7
7
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
8
8
  var _styledSystem = require("styled-system");
9
9
  var _input = _interopRequireDefault(require("../../__internal__/input/input.style"));
@@ -13,14 +13,16 @@ var _base = _interopRequireDefault(require("../../style/themes/base"));
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
- const MIN_HEIGHT = exports.MIN_HEIGHT = 64;
16
+ const DEFAULT_MIN_HEIGHT = exports.DEFAULT_MIN_HEIGHT = 64;
17
17
  const StyledTextarea = _styledComponents.default.div`
18
18
  ${_styledSystem.margin};
19
19
 
20
20
  ${_input.default} {
21
21
  box-sizing: border-box;
22
22
  resize: none;
23
- min-height: ${MIN_HEIGHT}px;
23
+ ${({
24
+ minHeight
25
+ }) => `min-height: ${minHeight || DEFAULT_MIN_HEIGHT}px;`}
24
26
  padding: var(--spacing150) var(--spacing200);
25
27
 
26
28
  ${({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "142.5.0",
3
+ "version": "142.6.0",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "files": [
6
6
  "lib",