@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.
- package/lib/cjs/components/ExpandableText/ExpandableText.d.ts +4 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.js +136 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.mdx +30 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.stories.d.ts +5 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.stories.js +33 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.styles.d.ts +15 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.styles.js +24 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.test.d.ts +1 -0
- package/lib/cjs/components/ExpandableText/ExpandableText.test.js +115 -0
- package/lib/cjs/components/ExpandableText/index.d.ts +1 -0
- package/lib/cjs/components/ExpandableText/index.js +14 -0
- package/lib/cjs/components/Input/Input.styles.js +5 -0
- package/lib/cjs/components/TimeField/TimeField.js +9 -7
- package/lib/cjs/components/TimeField/TimeField.stories.d.ts +1 -0
- package/lib/cjs/components/TimeField/TimeField.stories.js +18 -2
- package/lib/cjs/components/TimeField/TimeField.styles.d.ts +3 -0
- package/lib/cjs/components/TimeField/TimeField.styles.js +3 -0
- package/lib/cjs/components/TimeField/TimeField.test.js +9 -0
- package/lib/cjs/index.d.ts +1 -0
- package/lib/cjs/index.js +8 -0
- package/lib/cjs/styles/variants/variants.js +2 -0
- package/lib/cjs/types/expandableText.d.ts +10 -0
- package/lib/cjs/types/expandableText.js +6 -0
- package/lib/cjs/types/index.d.ts +1 -0
- package/lib/cjs/types/index.js +55 -44
- package/lib/components/ExpandableText/ExpandableText.js +122 -0
- package/lib/components/ExpandableText/ExpandableText.mdx +30 -0
- package/lib/components/ExpandableText/ExpandableText.stories.js +23 -0
- package/lib/components/ExpandableText/ExpandableText.styles.js +16 -0
- package/lib/components/ExpandableText/ExpandableText.test.js +112 -0
- package/lib/components/ExpandableText/index.js +1 -0
- package/lib/components/Input/Input.styles.js +5 -0
- package/lib/components/TimeField/TimeField.js +9 -7
- package/lib/components/TimeField/TimeField.stories.js +15 -0
- package/lib/components/TimeField/TimeField.styles.js +3 -0
- package/lib/components/TimeField/TimeField.test.js +9 -0
- package/lib/index.js +1 -0
- package/lib/styles/variants/variants.js +2 -0
- package/lib/types/expandableText.js +1 -0
- package/lib/types/index.js +1 -0
- package/package.json +1 -1
@@ -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 @@
|
|
1
|
+
export {};
|
@@ -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"));
|
@@ -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>;
|
@@ -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({
|
package/lib/cjs/index.d.ts
CHANGED
@@ -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
|
+
}
|
package/lib/cjs/types/index.d.ts
CHANGED
@@ -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';
|