Yugen UI

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.

✓ Xuống dòng
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ị
Cập nhật hôm qua
✕ Cắt không cần thiết
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ị
Cập nhật hôm qua
{/* 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.

truncate

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ị

line-clamp-2

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ị

<Text truncate wrap={false} block>
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ị
flex + min-w-0
Hop-dong-dich-vu-thiet-ke-giao-dien-Yugen-UI-phien-ban-cuoi-cung-da-ky.pdf
Persona (tự cắt)
Nguyễn Hoàng Bảo Ngọc AnhTrưởng nhóm Trải nghiệm người dùng và Nghiên cứu
{/* 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 tabIndex cho đoạn văn chỉ để có tooltip — hãy cho xuống dòng hoặc mở trang chi tiết.
  • title là 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.

Không cắt nhãn chính của nút

“Xoá vĩnh…” hay “Gửi cho người…” biến một hành động rõ ràng thành câu đố. Nút có whitespace-nowrap và chiều rộng tối thiểu để nhãn luôn trọn vẹn.

✓ Rút gọn câu chữ hoặc dùng icon + tooltip
✕ Cắt nhãn để vừa chỗ
Nên
  • Để chữ xuống dòng theo mặc định; dùng wrap-break-word cho chuỗi dài không dấu cách.
  • Khi phải cắt: truncate / line-clamp-* + min-w-0 trên phần tử flex.
  • Cho xem toàn văn bằng Tooltip trên phần tử focus được, hoặc trang chi tiết.
  • Nhãn nút 1–3 từ; thiếu chỗ thì chuyển hành động phụ vào menu “…”.
Không nên
  • Không cắt nhãn chính của Button, MenuItem quan trọng hay tiêu đề trang.
  • Không dựa vào title làm cách duy nhất để xem toàn văn.
  • Không thêm tabIndex vào văn bản tĩnh chỉ để gắn tooltip.
  • Không cắt số liệu (số tiền, ngày) — người dùng sẽ hiểu sai.