@pingux/astro 2.135.0-alpha.0 → 2.135.0-alpha.2

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 (41) hide show
  1. package/lib/cjs/components/ExpandableText/ExpandableText.d.ts +4 -0
  2. package/lib/cjs/components/ExpandableText/ExpandableText.js +136 -0
  3. package/lib/cjs/components/ExpandableText/ExpandableText.mdx +30 -0
  4. package/lib/cjs/components/ExpandableText/ExpandableText.stories.d.ts +5 -0
  5. package/lib/cjs/components/ExpandableText/ExpandableText.stories.js +33 -0
  6. package/lib/cjs/components/ExpandableText/ExpandableText.styles.d.ts +15 -0
  7. package/lib/cjs/components/ExpandableText/ExpandableText.styles.js +24 -0
  8. package/lib/cjs/components/ExpandableText/ExpandableText.test.d.ts +1 -0
  9. package/lib/cjs/components/ExpandableText/ExpandableText.test.js +115 -0
  10. package/lib/cjs/components/ExpandableText/index.d.ts +1 -0
  11. package/lib/cjs/components/ExpandableText/index.js +14 -0
  12. package/lib/cjs/components/Input/Input.styles.js +5 -0
  13. package/lib/cjs/components/TimeField/TimeField.js +9 -7
  14. package/lib/cjs/components/TimeField/TimeField.stories.d.ts +1 -0
  15. package/lib/cjs/components/TimeField/TimeField.stories.js +18 -2
  16. package/lib/cjs/components/TimeField/TimeField.styles.d.ts +3 -0
  17. package/lib/cjs/components/TimeField/TimeField.styles.js +3 -0
  18. package/lib/cjs/components/TimeField/TimeField.test.js +9 -0
  19. package/lib/cjs/index.d.ts +1 -0
  20. package/lib/cjs/index.js +8 -0
  21. package/lib/cjs/styles/variants/variants.js +2 -0
  22. package/lib/cjs/types/expandableText.d.ts +10 -0
  23. package/lib/cjs/types/expandableText.js +6 -0
  24. package/lib/cjs/types/index.d.ts +1 -0
  25. package/lib/cjs/types/index.js +55 -44
  26. package/lib/components/ExpandableText/ExpandableText.js +122 -0
  27. package/lib/components/ExpandableText/ExpandableText.mdx +30 -0
  28. package/lib/components/ExpandableText/ExpandableText.stories.js +23 -0
  29. package/lib/components/ExpandableText/ExpandableText.styles.js +16 -0
  30. package/lib/components/ExpandableText/ExpandableText.test.js +112 -0
  31. package/lib/components/ExpandableText/index.js +1 -0
  32. package/lib/components/Input/Input.styles.js +5 -0
  33. package/lib/components/TimeField/TimeField.js +9 -7
  34. package/lib/components/TimeField/TimeField.stories.js +15 -0
  35. package/lib/components/TimeField/TimeField.styles.js +3 -0
  36. package/lib/components/TimeField/TimeField.test.js +9 -0
  37. package/lib/index.js +1 -0
  38. package/lib/styles/variants/variants.js +2 -0
  39. package/lib/types/expandableText.js +1 -0
  40. package/lib/types/index.js +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { ExpandableTextProps } from '../../types';
3
+ declare const ExpandableText: React.ForwardRefExoticComponent<ExpandableTextProps & React.RefAttributes<HTMLDivElement>>;
4
+ export default ExpandableText;
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
+ var _WeakMap = require("@babel/runtime-corejs3/core-js-stable/weak-map");
5
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor");
7
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
8
+ _Object$defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ exports["default"] = void 0;
12
+ var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-float"));
13
+ var _trim = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/trim"));
14
+ var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
15
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
16
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
17
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
18
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
19
+ var _react = _interopRequireWildcard(require("react"));
20
+ var _utils = require("@react-aria/utils");
21
+ var _uuid = require("uuid");
22
+ var _index = require("../../index");
23
+ var _react2 = require("@emotion/react");
24
+ var _excluded = ["children", "maxLines", "buttonProps"];
25
+ 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); }
26
+ 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; }
27
+ var ExpandableText = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
28
+ var children = props.children,
29
+ maxLines = props.maxLines,
30
+ buttonProps = props.buttonProps,
31
+ others = (0, _objectWithoutProperties2["default"])(props, _excluded);
32
+ var textContent = typeof children === 'string' ? children : '';
33
+ var _useState = (0, _react.useState)(false),
34
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
35
+ isExpanded = _useState2[0],
36
+ setIsExpanded = _useState2[1];
37
+ var _useState3 = (0, _react.useState)(false),
38
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
39
+ isTruncated = _useState4[0],
40
+ setIsTruncated = _useState4[1];
41
+ var _useState5 = (0, _react.useState)(textContent),
42
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
43
+ visibleText = _useState6[0],
44
+ setVisibleText = _useState6[1];
45
+ var containerRef = (0, _react.useRef)(null);
46
+ var hiddenContainerRef = (0, _react.useRef)(null);
47
+ var prevWidthRef = (0, _react.useRef)(window.innerWidth);
48
+ var truncateToLines = function truncateToLines() {
49
+ var _containerRef$current;
50
+ // get line height and calculate the number of lines
51
+ var container = hiddenContainerRef.current;
52
+ if (!container) return 0;
53
+ container.style.width = "".concat(((_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.offsetWidth) || 0, "px");
54
+ container.innerText = textContent;
55
+ var lineHeight = (0, _parseFloat2["default"])(getComputedStyle(container).lineHeight);
56
+ var fullTextLines = Math.round(container.offsetHeight / lineHeight);
57
+ if (fullTextLines <= maxLines) {
58
+ setVisibleText(textContent);
59
+ setIsTruncated(false);
60
+ return undefined;
61
+ }
62
+
63
+ // using binary search to find the maximum text that fits within maxLines
64
+ var suffix = '... View More';
65
+ var start = 0;
66
+ var end = textContent.length;
67
+ var truncatedText = '';
68
+ while (start < end) {
69
+ var _context, _context2;
70
+ var mid = Math.floor((start + end) / 2);
71
+ var candidateText = (0, _trim["default"])(_context = (0, _slice["default"])(textContent).call(textContent, 0, mid)).call(_context);
72
+ var candidate = (0, _concat["default"])(_context2 = "".concat(candidateText)).call(_context2, suffix);
73
+ container.innerText = candidate;
74
+ var lines = Math.round(container.offsetHeight / lineHeight);
75
+ if (lines <= maxLines) {
76
+ truncatedText = candidateText;
77
+ start = mid + 1;
78
+ } else {
79
+ end = mid;
80
+ }
81
+ }
82
+ setVisibleText("".concat(truncatedText, "...") || textContent);
83
+ setIsTruncated(true);
84
+ return undefined;
85
+ };
86
+ var onResize = (0, _react.useCallback)(function () {
87
+ if (!isExpanded) {
88
+ truncateToLines();
89
+ }
90
+ // Reset the expansion state if the width has changed
91
+ if (window.innerWidth !== prevWidthRef.current) {
92
+ prevWidthRef.current = window.innerWidth;
93
+ setIsExpanded(false);
94
+ }
95
+ }, [isExpanded]);
96
+ (0, _utils.useResizeObserver)({
97
+ ref: containerRef,
98
+ onResize: onResize
99
+ });
100
+
101
+ /* istanbul ignore next */
102
+ (0, _utils.useLayoutEffect)(function () {
103
+ if (isExpanded) {
104
+ setVisibleText(textContent);
105
+ } else {
106
+ truncateToLines();
107
+ }
108
+ }, [isExpanded, textContent]);
109
+ var toggleExpanded = function toggleExpanded() {
110
+ return setIsExpanded(!isExpanded);
111
+ };
112
+ var textId = (0, _uuid.v4)();
113
+ return (0, _react2.jsx)(_index.Box, {
114
+ ref: ref
115
+ }, (0, _react2.jsx)("div", {
116
+ ref: containerRef
117
+ }, (0, _react2.jsx)(_index.Text, (0, _extends2["default"])({
118
+ variant: "variants.expandableText.text",
119
+ id: textId
120
+ }, others), visibleText, ' '), isTruncated && (0, _react2.jsx)(_index.Button, (0, _extends2["default"])({
121
+ onPress: toggleExpanded,
122
+ "aria-expanded": isExpanded,
123
+ "aria-controls": textId,
124
+ variant: "link",
125
+ sx: {
126
+ display: 'inline-block',
127
+ whiteSpace: 'nowrap',
128
+ ml: 1
129
+ }
130
+ }, buttonProps), isExpanded ? 'View Less' : 'View More')), (0, _react2.jsx)(_index.Box, {
131
+ ref: hiddenContainerRef,
132
+ variant: "expandableText.hiddenContainer"
133
+ }));
134
+ });
135
+ var _default = ExpandableText;
136
+ exports["default"] = _default;
@@ -0,0 +1,30 @@
1
+ import { Meta } from '@storybook/addon-docs';
2
+
3
+ <Meta title="Components/ExpandableText/ExpandableText" />
4
+
5
+ # ExpandableText
6
+
7
+ ExpandableText is used to manage long texts by truncating them based on max lines.
8
+ It allows collapse and expand the text to view in full.
9
+
10
+ ### Required components
11
+
12
+ This component can be used independently and does not require additional components.
13
+
14
+ ### Accessibility
15
+
16
+ #### Keyboard Navigation
17
+
18
+ These keys provide additional functionality to the component.
19
+
20
+ | Keys | Functions |
21
+ | ---- | --------- |
22
+ | Space or Enter | Selects the button. |
23
+ | Tab | Focuses the button and follows the page tab sequence. |
24
+
25
+
26
+ #### Screen readers
27
+
28
+ This component uses the following attributes to assist screen readers:
29
+ - The trigger button uses the **`aria-expanded`** attribute to indicate when the content expands and collapses.
30
+ - The button uses, **`aria-controls`** which references the iD of the collapsible region.
@@ -0,0 +1,5 @@
1
+ import { StoryFn } from '@storybook/react';
2
+ import { ExpandableTextProps } from '../../types';
3
+ declare const _default: import("@storybook/types").ComponentAnnotations<import("@storybook/react/dist/types-0a347bb9").R, import("@storybook/types").Args>;
4
+ export default _default;
5
+ export declare const Default: StoryFn<ExpandableTextProps>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = exports.Default = void 0;
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _storybookDocsLayout = _interopRequireDefault(require("../../../.storybook/storybookDocsLayout"));
11
+ var _index = require("../../index");
12
+ var _ExpandableText = _interopRequireDefault(require("./ExpandableText.mdx"));
13
+ var _react2 = require("@emotion/react");
14
+ var _default = {
15
+ title: 'Experimental/ ExpandableText',
16
+ component: _index.ExpandableText,
17
+ parameters: {
18
+ docs: {
19
+ page: function page() {
20
+ return (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_ExpandableText["default"], null), (0, _react2.jsx)(_storybookDocsLayout["default"], null));
21
+ }
22
+ },
23
+ codesandbox: false
24
+ }
25
+ };
26
+ exports["default"] = _default;
27
+ var Default = function Default(args) {
28
+ return (0, _react2.jsx)(_index.ExpandableText, {
29
+ maxLines: 5,
30
+ "data-testid": "test-field"
31
+ }, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
32
+ };
33
+ exports.Default = Default;
@@ -0,0 +1,15 @@
1
+ declare const _default: {
2
+ text: {
3
+ display: string;
4
+ };
5
+ hiddenContainer: {
6
+ visibility: string;
7
+ position: string;
8
+ p: number;
9
+ m: number;
10
+ border: number;
11
+ whiteSpace: string;
12
+ wordBreak: string;
13
+ };
14
+ };
15
+ export default _default;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var text = {
9
+ display: 'inline'
10
+ };
11
+ var hiddenContainer = {
12
+ visibility: 'hidden',
13
+ position: 'absolute',
14
+ p: 0,
15
+ m: 0,
16
+ border: 0,
17
+ whiteSpace: 'normal',
18
+ wordBreak: 'break-word'
19
+ };
20
+ var _default = {
21
+ text: text,
22
+ hiddenContainer: hiddenContainer
23
+ };
24
+ exports["default"] = _default;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
4
+ var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _react2 = require("@testing-library/react");
8
+ var _testWrapper = require("../../utils/testUtils/testWrapper");
9
+ var _universalComponentTest = require("../../utils/testUtils/universalComponentTest");
10
+ var _ExpandableText = _interopRequireDefault(require("./ExpandableText"));
11
+ var _react3 = require("@emotion/react");
12
+ jest.mock('use-resize-observer', function () {
13
+ return jest.fn(function () {
14
+ return {
15
+ ref: jest.fn(),
16
+ // a stub ref callback
17
+ width: 300 // pretend container is 300px wide
18
+ };
19
+ });
20
+ });
21
+
22
+ var children = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';
23
+ var testId = 'test-text';
24
+ var defaultProps = {
25
+ 'data-testid': testId,
26
+ // children,
27
+ maxLines: 2
28
+ };
29
+ var getComponent = function getComponent() {
30
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
31
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
32
+ _ref$renderFn = _ref.renderFn,
33
+ renderFn = _ref$renderFn === void 0 ? _testWrapper.render : _ref$renderFn;
34
+ return renderFn((0, _react3.jsx)(_ExpandableText["default"], (0, _extends2["default"])({}, defaultProps, props), children));
35
+ };
36
+
37
+ // Needs to be added to each components test file
38
+ (0, _universalComponentTest.universalComponentTests)({
39
+ renderComponent: function renderComponent(props) {
40
+ return (0, _react3.jsx)(_ExpandableText["default"], (0, _extends2["default"])({}, defaultProps, props));
41
+ }
42
+ });
43
+ describe('ExpandableText', function () {
44
+ it('renders children', function () {
45
+ (0, _defineProperty["default"])(HTMLElement.prototype, 'offsetHeight', {
46
+ configurable: true,
47
+ get: function get() {
48
+ var text = this.innerText || '';
49
+ var lineHeight = 20;
50
+ var lines = Math.ceil(text.length / 50);
51
+ return lines * lineHeight;
52
+ }
53
+ });
54
+ (0, _defineProperty["default"])(window, 'getComputedStyle', {
55
+ value: function value() {
56
+ return {
57
+ lineHeight: '20px'
58
+ };
59
+ }
60
+ });
61
+ getComponent();
62
+ var button = _testWrapper.screen.getByRole('button');
63
+ expect(button).toHaveTextContent(/View More/i);
64
+ _react2.fireEvent.click(button);
65
+ var expandableText = _testWrapper.screen.getByText(children);
66
+ expect(expandableText).toBeInTheDocument();
67
+ expect(expandableText).toHaveAttribute('data-testid', testId);
68
+ });
69
+ it('expands and collapses text on button click', function () {
70
+ (0, _defineProperty["default"])(HTMLElement.prototype, 'offsetHeight', {
71
+ configurable: true,
72
+ get: function get() {
73
+ var text = this.innerText || '';
74
+ var lineHeight = 20;
75
+ var lines = Math.ceil(text.length / 50);
76
+ return lines * lineHeight;
77
+ }
78
+ });
79
+ (0, _defineProperty["default"])(window, 'getComputedStyle', {
80
+ value: function value() {
81
+ return {
82
+ lineHeight: '20px'
83
+ };
84
+ }
85
+ });
86
+ getComponent();
87
+ var button = _testWrapper.screen.getByRole('button');
88
+ expect(button).toHaveTextContent(/View More/i);
89
+ _react2.fireEvent.click(button);
90
+ expect(button).toHaveTextContent(/View Less/i);
91
+ _react2.fireEvent.click(_testWrapper.screen.getByRole('button'));
92
+ expect(button).toHaveTextContent(/View More/i);
93
+ });
94
+ it('it rests the expansion state when resized', function () {
95
+ getComponent();
96
+ var button = _testWrapper.screen.getByRole('button');
97
+ _react2.fireEvent.click(button);
98
+ expect(button).toHaveTextContent(/View Less/i);
99
+ var originalInnerWidth = window.innerWidth;
100
+ window.innerWidth = originalInnerWidth + 100;
101
+ (0, _react2.fireEvent)(window, new Event('resize'));
102
+ expect(button).toHaveTextContent(/View More/i);
103
+ window.innerWidth = originalInnerWidth;
104
+ });
105
+ it('truncates the text on resize when button is not expanded', function () {
106
+ getComponent();
107
+ var button = _testWrapper.screen.getByRole('button');
108
+ expect(button).toHaveTextContent(/View More/i);
109
+ var originalInnerWidth = window.innerWidth;
110
+ window.innerWidth = originalInnerWidth + 100;
111
+ (0, _react2.fireEvent)(window, new Event('resize'));
112
+ expect(button).toHaveTextContent(/View More/i);
113
+ window.innerWidth = originalInnerWidth;
114
+ });
115
+ });
@@ -0,0 +1 @@
1
+ export { default } from './ExpandableText';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ _Object$defineProperty(exports, "default", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _ExpandableText["default"];
12
+ }
13
+ });
14
+ var _ExpandableText = _interopRequireDefault(require("./ExpandableText"));
@@ -142,6 +142,11 @@ input.fieldControlWrapper = (_input$fieldControlWr = {
142
142
  opacity: 0.5
143
143
  }
144
144
  },
145
+ '&.is-invalid': {
146
+ '&:after': {
147
+ bg: 'critical.bright'
148
+ }
149
+ },
145
150
  '&.is-read-only': {
146
151
  '> input': {
147
152
  backgroundColor: 'accent.95',
@@ -59,19 +59,21 @@ var TimeField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
59
59
  var state = (0, _datepicker2.useTimeFieldState)(_objectSpread(_objectSpread(_objectSpread({}, props), parsedTimes), {}, {
60
60
  locale: locale
61
61
  }));
62
- var _useStatusClasses = (0, _hooks.useStatusClasses)(className, {
63
- isDisabled: isDisabled,
64
- isReadOnly: isReadOnly,
65
- is24Hour: props.hourCycle === 24
66
- }),
67
- classNames = _useStatusClasses.classNames;
68
62
  var _useTimeField = (0, _datepicker.useTimeField)(_objectSpread(_objectSpread({}, props), parsedTimes), state, fieldRef),
69
- fieldProps = _useTimeField.fieldProps;
63
+ fieldProps = _useTimeField.fieldProps,
64
+ isInvalid = _useTimeField.isInvalid;
70
65
  var _useField = (0, _hooks.useField)(_objectSpread(_objectSpread({}, others), {}, {
71
66
  value: (state === null || state === void 0 || (_state$value = state.value) === null || _state$value === void 0 ? void 0 : _state$value.toString()) || ''
72
67
  })),
73
68
  fieldContainerProps = _useField.fieldContainerProps,
74
69
  fieldLabelProps = _useField.fieldLabelProps;
70
+ var _useStatusClasses = (0, _hooks.useStatusClasses)(className, {
71
+ isDisabled: isDisabled,
72
+ isReadOnly: isReadOnly,
73
+ isInvalid: isInvalid,
74
+ is24Hour: props.hourCycle === 24
75
+ }),
76
+ classNames = _useStatusClasses.classNames;
75
77
  return (0, _react2.jsx)(_index.Box, (0, _extends2["default"])({
76
78
  variant: "forms.input.fieldContainer"
77
79
  }, fieldContainerProps, {
@@ -9,3 +9,4 @@ export declare const Disabled: StoryFn<TimeFieldProps>;
9
9
  export declare const ReadOnly: StoryFn<TimeFieldProps>;
10
10
  export declare const Required: StoryFn<TimeFieldProps>;
11
11
  export declare const WithLabel: StoryFn<TimeFieldProps>;
12
+ export declare const Invalid: StoryFn<TimeFieldProps>;
@@ -8,7 +8,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
8
8
  _Object$defineProperty(exports, "__esModule", {
9
9
  value: true
10
10
  });
11
- exports["default"] = exports.WithLabel = exports.Required = exports.ReadOnly = exports.Disabled = exports.DefaultValue = exports.Default = exports.Controlled = void 0;
11
+ exports["default"] = exports.WithLabel = exports.Required = exports.ReadOnly = exports.Invalid = exports.Disabled = exports.DefaultValue = exports.Default = exports.Controlled = void 0;
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
13
13
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
14
14
  var _react = _interopRequireWildcard(require("react"));
@@ -98,4 +98,20 @@ var WithLabel = function WithLabel(args) {
98
98
  "aria-label": "timefield-default"
99
99
  }));
100
100
  };
101
- exports.WithLabel = WithLabel;
101
+ exports.WithLabel = WithLabel;
102
+ var Invalid = function Invalid() {
103
+ var _useState3 = (0, _react.useState)('02:30'),
104
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
105
+ time = _useState4[0],
106
+ setTime = _useState4[1];
107
+ var onChangeHandler = function onChangeHandler(value) {
108
+ return setTime(value.toString());
109
+ };
110
+ return (0, _react2.jsx)(_index.TimeField, {
111
+ "aria-label": "timefield-default",
112
+ value: time,
113
+ onChange: onChangeHandler,
114
+ isInvalid: true
115
+ });
116
+ };
117
+ exports.Invalid = Invalid;
@@ -19,6 +19,9 @@ declare const _default: {
19
19
  '&.is-24-hour': {
20
20
  minWidth: string;
21
21
  };
22
+ '&.is-invalid': {
23
+ borderColor: string;
24
+ };
22
25
  grid?: import("theme-ui").StylePropertyValue<import("csstype").Property.Grid | undefined>;
23
26
  accentColor?: import("theme-ui").StylePropertyValue<import("csstype").Property.AccentColor | undefined>;
24
27
  alignContent?: import("theme-ui").StylePropertyValue<import("csstype").Property.AlignContent | undefined>;
@@ -31,6 +31,9 @@ var inputField = _objectSpread(_objectSpread({}, _Input.input), {}, {
31
31
  },
32
32
  '&.is-24-hour': {
33
33
  minWidth: '0px'
34
+ },
35
+ '&.is-invalid': {
36
+ borderColor: 'critical.bright'
34
37
  }
35
38
  });
36
39
  var segment = {
@@ -93,6 +93,15 @@ test('renders TimeField component with isReadOnly', function () {
93
93
  expect(segment).toHaveAttribute('aria-readonly', 'true');
94
94
  });
95
95
  });
96
+ test('renders TimeField component with isInvalid', function () {
97
+ getComponent({
98
+ isInvalid: true
99
+ });
100
+ var timeSegments = _testWrapper.screen.getAllByRole('spinbutton');
101
+ (0, _forEach["default"])(timeSegments).call(timeSegments, function (segment) {
102
+ expect(segment).toHaveAttribute('aria-invalid', 'true');
103
+ });
104
+ });
96
105
  test('should handle autofocus when deleting segments from left to right', function () {
97
106
  var defaultValue = new _date.Time(12, 30);
98
107
  getComponent({
@@ -76,6 +76,7 @@ export { default as DatePicker } from './components/DatePicker';
76
76
  export { default as DateField } from './components/DatePicker/DateField';
77
77
  export { default as EditButton } from './components/EditButton';
78
78
  export { default as EnvironmentBreadcrumb } from './components/EnvironmentBreadcrumb';
79
+ export { default as ExpandableText } from './components/ExpandableText';
79
80
  export { default as FieldHelperText } from './components/FieldHelperText';
80
81
  export * from './components/FieldHelperText';
81
82
  export { default as FileInputField } from './components/FileInputField';
package/lib/cjs/index.js CHANGED
@@ -67,6 +67,7 @@ var _exportNames = {
67
67
  DateField: true,
68
68
  EditButton: true,
69
69
  EnvironmentBreadcrumb: true,
70
+ ExpandableText: true,
70
71
  FieldHelperText: true,
71
72
  FileInputField: true,
72
73
  Footer: true,
@@ -455,6 +456,12 @@ _Object$defineProperty(exports, "ErrorCalloutBadge", {
455
456
  return _ErrorCalloutBadge["default"];
456
457
  }
457
458
  });
459
+ _Object$defineProperty(exports, "ExpandableText", {
460
+ enumerable: true,
461
+ get: function get() {
462
+ return _ExpandableText["default"];
463
+ }
464
+ });
458
465
  _Object$defineProperty(exports, "FieldHelperText", {
459
466
  enumerable: true,
460
467
  get: function get() {
@@ -1439,6 +1446,7 @@ var _DatePicker = _interopRequireDefault(require("./components/DatePicker"));
1439
1446
  var _DateField = _interopRequireDefault(require("./components/DatePicker/DateField"));
1440
1447
  var _EditButton = _interopRequireDefault(require("./components/EditButton"));
1441
1448
  var _EnvironmentBreadcrumb = _interopRequireDefault(require("./components/EnvironmentBreadcrumb"));
1449
+ var _ExpandableText = _interopRequireDefault(require("./components/ExpandableText"));
1442
1450
  var _FieldHelperText = _interopRequireWildcard(require("./components/FieldHelperText"));
1443
1451
  _forEachInstanceProperty(_context24 = _Object$keys(_FieldHelperText)).call(_context24, function (key) {
1444
1452
  if (key === "default" || key === "__esModule") return;
@@ -30,6 +30,7 @@ var _CollapsiblePanel = _interopRequireDefault(require("../../components/Collaps
30
30
  var _CopyText = _interopRequireDefault(require("../../components/CopyText/CopyText.styles"));
31
31
  var _DataTable = _interopRequireDefault(require("../../components/DataTable/DataTable.styles"));
32
32
  var _EnvironmentalBreadcrumb = _interopRequireDefault(require("../../components/EnvironmentBreadcrumb/EnvironmentalBreadcrumb.styles"));
33
+ var _ExpandableText = _interopRequireDefault(require("../../components/ExpandableText/ExpandableText.styles"));
33
34
  var _FieldHelperText = _interopRequireDefault(require("../../components/FieldHelperText/FieldHelperText.styles"));
34
35
  var _Footer = _interopRequireDefault(require("../../components/Footer/Footer.styles"));
35
36
  var _GridList = _interopRequireDefault(require("../../components/GridList/GridList.styles"));
@@ -87,6 +88,7 @@ var _default = _objectSpread(_objectSpread({
87
88
  copyText: _CopyText["default"],
88
89
  dataTable: _DataTable["default"],
89
90
  environmentBreadcrumb: _EnvironmentalBreadcrumb["default"],
91
+ expandableText: _ExpandableText["default"],
90
92
  fieldHelperText: _FieldHelperText["default"],
91
93
  footer: _Footer["default"],
92
94
  gridList: _GridList["default"],
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { TestingAttributes } from './shared/test';
3
+ import { ButtonProps } from './button';
4
+ import { TextProps } from './text';
5
+ export interface ExpandableTextProps extends TestingAttributes, TextProps {
6
+ maxLines: number;
7
+ className?: string;
8
+ children?: React.ReactNode;
9
+ buttonProps?: ButtonProps;
10
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
@@ -15,6 +15,7 @@ export * from './colorField';
15
15
  export * from './copyText';
16
16
  export * from './dataTable';
17
17
  export * from './environmentBreadcrumb';
18
+ export * from './expandableText';
18
19
  export * from './fieldHelperText';
19
20
  export * from './footer';
20
21
  export * from './grid';