mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import type {CSSProperties} from 'react';
|
|
import styled from '@emotion/styled';
|
|
|
|
type Props = {
|
|
children: React.ReactNode;
|
|
className?: string;
|
|
['data-test-id']?: string;
|
|
/**
|
|
* Change which side of the text is elided.
|
|
* Default: 'right'
|
|
*
|
|
* BROWSER COMPAT:
|
|
* When set to `left` the intention is for something like: `...xample.com/foo/`
|
|
* In Chrome & Firefox this is what happens.
|
|
*
|
|
* In Safari (July 2022) you will see this instead: `...https://example.co`.
|
|
*
|
|
* See: https://stackoverflow.com/a/24800788
|
|
*/
|
|
ellipsisDirection?: 'left' | 'right';
|
|
isParagraph?: boolean;
|
|
style?: CSSProperties;
|
|
};
|
|
|
|
const TextOverflow = styled(
|
|
({
|
|
children,
|
|
className,
|
|
ellipsisDirection,
|
|
isParagraph,
|
|
['data-test-id']: dataTestId,
|
|
style,
|
|
}: Props) => {
|
|
const Component = isParagraph ? 'p' : 'div';
|
|
if (ellipsisDirection === 'left') {
|
|
return (
|
|
<Component className={className} style={style} data-test-id={dataTestId}>
|
|
<bdi>{children}</bdi>
|
|
</Component>
|
|
);
|
|
}
|
|
return (
|
|
<Component className={className} style={style} data-test-id={dataTestId}>
|
|
{children}
|
|
</Component>
|
|
);
|
|
}
|
|
)`
|
|
${p => p.theme.overflowEllipsis}
|
|
${p =>
|
|
p.ellipsisDirection === 'left' &&
|
|
`
|
|
direction: rtl;
|
|
text-align: left;
|
|
`};
|
|
width: auto;
|
|
line-height: 1.2;
|
|
`;
|
|
|
|
TextOverflow.defaultProps = {
|
|
ellipsisDirection: 'right',
|
|
isParagraph: false,
|
|
};
|
|
|
|
export default TextOverflow;
|