friendly-truncation
Version:
A React component for elegantly truncating text content with a fade effect
275 lines (220 loc) • 8.52 kB
Markdown
# Friendly Truncation
A React component for elegantly truncating text content with a blur effect and tooltip display. This component provides a beautiful user experience for handling excessive text by implementing a gradual blur effect at the truncation point and offering a floating tooltip with the full content on hover.
## Latest Updates (v1.0.7)
- Updated peer dependencies to specifically target React 18
- Improved React 18 compatibility in FriendlyTruncationV2
- Enhanced handling of React elements as children
- Fixed "Objects are not valid as a React child" error
- Better tooltip content extraction from different types of children
- Improved CSS structure for more reliable truncation
## Components
This library offers two components with different approaches to text truncation:
1. **FriendlyTruncation**: A full-featured component with custom tooltip and expandable content.
2. **FriendlyTruncationV2**: A lightweight component using CSS properties and native browser tooltips.
## Features
- **Fixed Height Container**: Container maintains its original height when truncating content
- **Blur Effect**: Text content fades out with a blur effect at the truncation point
- **Tooltip on Hover**: Shows the full content in a floating tooltip (like HTML title attribute but more elegant)
- **Expand on Click**: Adds a "Read more"/"Show less" toggle button (optional)
- **Line-based Truncation**: Truncate after a specific number of lines
- **Height-based Truncation**: Truncate after a specific height in pixels
- **Custom Ellipsis**: Customize the truncation indicator text
- **Tooltip Positioning**: Control where the tooltip appears (top, bottom, left, right)
- **Supports Rich Content**: Works with HTML/JSX content, not just plain text
- **Fully Customizable**: Styling can be customized via CSS
- **Accessible**: Keyboard navigable and screen reader friendly
## Installation
```bash
npm install friendly-truncation
# or
yarn add friendly-truncation
```
## Usage
### FriendlyTruncation (Full-featured component)
```jsx
import { FriendlyTruncation } from 'friendly-truncation';
import 'friendly-truncation/dist/friendly-truncation.css';
function App() {
return (
<div className="container">
<h2>Basic Tooltip Example</h2>
<FriendlyTruncation maxHeight={100}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nullam at justo vel nunc volutpat sollicitudin.
Cras consectetur, libero non pharetra finibus, odio nulla vehicula tellus...
</FriendlyTruncation>
<h2>Custom Tooltip Position</h2>
<FriendlyTruncation
maxHeight={80}
tooltipPlacement="right"
tooltipMaxWidth={300}
ellipsis="[More]"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
</FriendlyTruncation>
<h2>Line-based Truncation</h2>
<FriendlyTruncation lines={3}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
</FriendlyTruncation>
<h2>Click to Expand (No Tooltip)</h2>
<FriendlyTruncation
maxHeight={80}
expandOnHover={false}
expandOnClick={true}
readMoreText="Show full text"
showLessText="Collapse"
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
</FriendlyTruncation>
</div>
);
}
```
### FriendlyTruncationV2 (Lightweight component)
```jsx
import { FriendlyTruncationV2 } from 'friendly-truncation';
import 'friendly-truncation/dist/styles.css'; // Import the styles
function App() {
return (
<div className="container">
<h2>Basic Example</h2>
<FriendlyTruncationV2 lines={3}>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nullam at justo vel nunc volutpat sollicitudin.
Cras consectetur, libero non pharetra finibus, odio nulla vehicula tellus...
</FriendlyTruncationV2>
<h2>Custom Styling</h2>
<FriendlyTruncationV2
lines={2}
lineHeight="1.8em"
backgroundColor="#f5f5f5"
style={{
padding: '15px',
borderRadius: '8px',
border: '1px solid #ddd'
}}
>
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
</FriendlyTruncationV2>
<h2>With HTML Content</h2>
<FriendlyTruncationV2
lines={4}
title="Custom tooltip title"
>
<div>
<p><strong>This is a paragraph with HTML formatting.</strong></p>
<p>It contains <em>multiple elements</em> and will still be properly truncated.</p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
<li>List item 3</li>
</ul>
</div>
</FriendlyTruncationV2>
</div>
);
}
```
## Props
### FriendlyTruncation Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `children` | ReactNode | (required) | The content to be truncated |
| `maxHeight` | number | 100 | Maximum height in pixels before truncation occurs |
| `lines` | number | undefined | Number of lines to show before truncation (takes precedence over maxHeight) |
| `ellipsis` | string | '...' | Text displayed at the end of truncated content |
| `expandOnHover` | boolean | true | Whether to show tooltip with full content on hover |
| `expandOnClick` | boolean | false | Whether to allow expanding/collapsing on click |
| `readMoreText` | string | 'Read more' | Text for the expand button |
| `showLessText` | string | 'Show less' | Text for the collapse button |
| `className` | string | '' | Additional CSS class name for styling |
| `tooltipMaxWidth` | number | 400 | Maximum width of the tooltip in pixels |
| `tooltipPlacement` | 'top' \| 'bottom' \| 'left' \| 'right' | 'top' | Position of the tooltip |
### FriendlyTruncationV2 Props
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `children` | ReactNode | (required) | The content to be truncated |
| `lines` | number | 3 | Number of lines to show before truncation |
| `lineHeight` | string | '1.5em' | Line height for the text content |
| `backgroundColor` | string | 'white' | Background color for the truncation gradient |
| `className` | string | '' | Additional CSS class name for styling |
| `title` | string | '' | Title attribute for the container (shows as browser tooltip on hover) |
| `style` | CSSProperties | {} | Additional inline styles |
## Customization
### FriendlyTruncation Customization
You can customize the appearance by overriding the CSS variables or classes:
```css
.friendly-truncation {
/* Custom styles */
}
.blur-overlay {
/* Customize the blur effect */
background: linear-gradient(
to bottom,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, 0.7) 50%,
rgba(255, 255, 255, 1) 100%
);
backdrop-filter: blur(2px); /* Adjust blur amount */
}
.content-tooltip {
/* Customize the tooltip */
background-color: #f9f9f9;
border: 1px solid #ddd;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.ellipsis {
/* Customize the ellipsis indicator */
color: #0066cc;
font-weight: bold;
}
```
### FriendlyTruncationV2 Customization
FriendlyTruncationV2 uses CSS custom properties that you can override:
```css
.friendly-truncation-v2 {
/* Override CSS custom properties */
--truncate-bg-color: #f5f5f5;
--truncate-line-height: 1.8em;
--truncate-lines: 2;
/* Additional styling */
padding: 15px;
border-radius: 8px;
border: 1px solid #ddd;
}
/* Customize the fade-out gradient */
.friendly-truncation-v2::after {
background: linear-gradient(
to bottom,
rgba(245, 245, 245, 0) 0%,
rgba(245, 245, 245, 0.9) 80%,
rgba(245, 245, 245, 1) 100%
);
}
```
## Accessibility
- The component is fully keyboard navigable when using the `expandOnClick` option
- ARIA attributes are appropriately set for screen readers
- Focus states are styled for keyboard users
## Browser Support
- Supports all modern browsers (Chrome, Firefox, Safari, Edge)
- IE11 is not supported
## Development
This project was created with Vite and React TypeScript template. To set up the development environment:
```bash
# Install dependencies
npm install
# Start the development server
npm run dev
# Build the library
npm run build
# Build and preview the demo
npm run preview
# Build only the demo
npm run build:demo
```
## License
MIT
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
```