Cắt chữ (truncation)
Ưu tiên cho chữ xuống dòng; chỉ cắt khi bố cục buộc phải vậy — và khi cắt, luôn có cách xem toàn bộ nội dung.
Ưu tiên xuống dòng
Chữ bị cắt là nội dung bị giấu: người phóng to màn hình, bản dịch dài hơn (tiếng Việt thường dài hơn tiếng Anh 20–30%) và người dùng cảm ứng là những người mất nhiều nhất.
{/* Mặc định: để chữ xuống dòng; wrap-break-word cho chuỗi dài không có khoảng trắng */}
<Card className="w-72">
<CardHeader
image={<Document20Regular />}
header={<span className="wrap-break-word">Báo cáo tổng hợp doanh thu và chi phí vận hành quý 3…</span>}
description="Cập nhật hôm qua"
/>
</Card>Cắt chỉ hợp lý khi có một ràng buộc thật: hàng trong bảng hoặc danh sách cần cao đều, thanh điều hướng, tab, breadcrumb, chip trong ô nhập, tên tệp trong khung cố định.
Cách cắt
Ba công cụ, cùng một điều kiện: phần tử phải có chiều rộng giới hạn.
Báo cáo tổng hợp doanh thu và chi phí vận hành quý 3 năm 2026 — bản trình hội đồng quản trị
Báo cáo tổng hợp doanh thu và chi phí vận hành quý 3 năm 2026 — bản trình hội đồng quản trị
{/* Một dòng: cần một chiều rộng giới hạn; trong flex, phần tử cha phải có min-w-0 */}
<p className="truncate">…</p>
{/* Nhiều dòng */}
<p className="line-clamp-2">…</p>
{/* Component Text */}
<Text truncate wrap={false} block>…</Text>
{/* Trong flex: thiếu min-w-0 thì truncate không có tác dụng */}
<div className="flex items-center gap-2">
<Document20Regular className="shrink-0" />
<span className="min-w-0 flex-1 truncate">…</span>
</div>Component có sẵn chế độ cắt: TableCellLayout truncate, Persona, MenuItem (nhãn dài), giá trị của Dropdown, Tag. Trình đọc màn hình vẫn đọc toàn văn — cắt chỉ ảnh hưởng người nhìn.
Cho xem toàn văn
Mỗi chuỗi bị cắt cần một đường tới nội dung đầy đủ, dùng được bằng chuột, bàn phím và cảm ứng.
Rê chuột hoặc Tab tới từng link — chỉ link bị cắt mới hiện tooltip.
import * as React from "react";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui";
/** Link chỉ hiện tooltip toàn văn khi chữ thật sự bị cắt. */
export function TruncatedLink({ href, children }: { href: string; children: string }) {
const ref = React.useRef<HTMLAnchorElement>(null);
const [open, setOpen] = React.useState(false);
const isTruncated = () => {
const el = ref.current;
return !!el && el.scrollWidth > el.clientWidth;
};
return (
<Tooltip open={open} onOpenChange={(next) => setOpen(next && isTruncated())}>
<TooltipTrigger asChild>
<a ref={ref} href={href} className="block min-w-0 truncate text-link hover:underline">
{children}
</a>
</TooltipTrigger>
<TooltipContent className="max-w-80 break-all">{children}</TooltipContent>
</Tooltip>
);
}- Đặt tooltip lên phần tử vốn đã focus được (link, nút, ô của bảng có tương tác). Đừng thêm
tabIndexcho đoạn văn chỉ để có tooltip — hãy cho xuống dòng hoặc mở trang chi tiết. titlelà phương án tối thiểu: chỉ hiện khi rê chuột, không dùng được bằng bàn phím hay cảm ứng.- Ở bảng và danh sách, trang chi tiết hoặc panel mở rộng là nơi hiển thị toàn văn tốt nhất.