Skip to content

Commit 06c7f27

Browse files
authored
feat(Text): add maxLines prop (#5018)
closes #5017
1 parent dc23fff commit 06c7f27

File tree

3 files changed

+49
-9
lines changed

3 files changed

+49
-9
lines changed

packages/main/src/components/Text/Text.cy.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,35 @@ describe('Text', () => {
3131
.should('have.css', 'overflow', 'hidden');
3232
});
3333

34+
it('maxLines', () => {
35+
cy.mount(
36+
<Text data-testid="text" style={{ width: '300px' }}>
37+
{longText}
38+
</Text>
39+
);
40+
cy.findByTestId('text').invoke('outerHeight').should('equal', 240);
41+
42+
cy.mount(
43+
<Text data-testid="text" style={{ width: '300px' }} maxLines={0}>
44+
{longText}
45+
</Text>
46+
);
47+
cy.findByTestId('text').invoke('outerHeight').should('equal', 240);
48+
cy.mount(
49+
<Text data-testid="text" style={{ width: '300px' }} maxLines={1}>
50+
{longText}
51+
</Text>
52+
);
53+
cy.findByTestId('text').invoke('outerHeight').should('equal', 16);
54+
cy.mount(
55+
<Text data-testid="text" style={{ width: '300px' }} maxLines={4}>
56+
{longText}
57+
</Text>
58+
);
59+
cy.findByTestId('text').invoke('outerHeight').should('equal', 64);
60+
});
61+
3462
cypressPassThroughTestsFactory(Text);
3563
});
64+
65+
const longText = `If "renderWhitespace" is set to true, there will be thirteen white spaces after this sentence. Lorem ipsum dolor st amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat`;

packages/main/src/components/Text/Text.jss.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,11 @@ export const TextStyles = {
2828
'&$renderWhitespace': {
2929
whiteSpace: 'pre'
3030
}
31+
},
32+
maxLines: {
33+
display: '-webkit-box',
34+
WebkitBoxOrient: 'vertical',
35+
overflow: 'hidden',
36+
WebkitLineClamp: 'var(--_ui5wcr_maxLines)'
3137
}
3238
};

packages/main/src/components/Text/index.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { clsx } from 'clsx';
2-
import type { ReactNode } from 'react';
2+
import type { CSSProperties, ReactNode } from 'react';
33
import React, { forwardRef } from 'react';
44
import { createUseStyles } from 'react-jss';
55
import type { CommonProps } from '../../interfaces/index.js';
@@ -18,6 +18,10 @@ export interface TextPropTypes extends CommonProps {
1818
* Defines whether the text wraps when there is not enough space.
1919
*/
2020
wrapping?: boolean;
21+
/**
22+
* Limits the number of lines for wrapping texts.
23+
*/
24+
maxLines?: number;
2125
}
2226

2327
const useStyles = createUseStyles(TextStyles, { name: 'Text' });
@@ -26,28 +30,28 @@ const useStyles = createUseStyles(TextStyles, { name: 'Text' });
2630
* <br />__Note:__ Line breaks will always be visualized except when the wrapping property is set to false. In addition, tabs and whitespace can be preserved by setting the renderWhitespace property to true.
2731
*/
2832
const Text = forwardRef<HTMLSpanElement, TextPropTypes>((props, ref) => {
29-
const { children, renderWhitespace, wrapping, className, style, slot, ...rest } = props;
30-
33+
const { children, renderWhitespace, wrapping = true, className, style, maxLines, ...rest } = props;
3134
const classes = useStyles();
3235
const classNameString = clsx(
3336
classes.text,
3437
wrapping === false && classes.noWrap,
3538
renderWhitespace && classes.renderWhitespace,
39+
typeof maxLines === 'number' && classes.maxLines,
3640
className
3741
);
3842

3943
return (
40-
<span ref={ref} style={style} className={classNameString} slot={slot} {...rest}>
44+
<span
45+
ref={ref}
46+
style={{ '--_ui5wcr_maxLines': typeof maxLines === 'number' ? maxLines : undefined, ...style } as CSSProperties}
47+
className={classNameString}
48+
{...rest}
49+
>
4150
{children}
4251
</span>
4352
);
4453
});
4554

46-
Text.defaultProps = {
47-
renderWhitespace: false,
48-
wrapping: true
49-
};
50-
5155
Text.displayName = 'Text';
5256

5357
export { Text };

0 commit comments

Comments
 (0)