@yukimoto/use-clamp-text
Version:
This package provide a custome hook that can limit the text in the container in specified line number.
73 lines (61 loc) • 4.18 kB
Markdown
Custom react hook that clamp multiline text to a specified line number. Can optionally specify trailing spaces.
Fix some bugs and use cleaner implementation. Modified from:
- https://github.com/drenther/use-clamp-text/blob/main/src/index.ts
- https://github.com/zoltantothcom/react-clamp-lines/blob/master/src/index.js
```bash
npm i @yukimoto/use-clamp-text
```
```tsx
const component = () => {
const {
longEnoughToClamp,
textContainerRef,
addOnsContainerRef,
wrapperContainerRef,
clamped,
clampedText,
toggleClamp,
} = useClampText<{
WrapperContainer: HTMLDivElement;
TextContainer: HTMLSpanElement;
AddonsContainer: HTMLButtonElement;
}>({
originalText: 'some potentially really long text...',
lines: 2, // At most how many lines
endSpaceNumber: 4, // how many trailing space,
unitSpaceChar: '*', // single trailing space should be the width of this char
debounceTime: 100, // in miliseconds
});
return (
<div ref={wrapperContainerRef}>
<span ref={textContainerRef}>{clampedText}</span>
{longEnoughToClamp ? (
<button ref={addOnsContainerRef} onClick={toggleClamp}>
{clamped ? '...show more' : '...show less'}
</button>
) : null}
</div>
);
};
```
| property | type | required | default | description |
| --------------- | -------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------- |
| originalText | `string` | `false` | `''` | Text you wish to clamp. |
| lines | `number` | `false` | `2` | Number of visible lines when collapsed. |
| debounceTime | `number` | `false` | `300` | How many time in miliseconds before the clamp action will be triggered when window resizes. |
| minSpaceCharNum | `number` | `false` | `0` | The minium trailing space number, will make the process of adding space to the end of the addons component more efficient. |
| unitSpaceChar | `string` | `false` | `'.'` | The width of single trailing space, pass a char for the measurement of width. |
| endSpaceNumber | `number` | `false` | `0` | How many trailing spaces. Each of them will be the width of `unitSpaceChar`. |
| property | type | description |
| --------------------------------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------ |
| longEnoughtToClamp | `boolean` | Whether the `originalText` is longer enough to exceeds the given `line` number by it self. |
| clampedText | `string` | The string to be rendered. |
| clamped | `boolean` | A state indicating whether the text should be clamped if long enough. |
| toggleClamp | `() => void` | A callback which togger the `clamped` state. |
| wrapperContainerRef, textContainerRef, addOnsContainerRef | `React.RefObject<E extends HTMLElement>` | Ref for corresponding containers. |