npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

webapp.ui.lib

v1.0.6

Published

Thư viện component UI cho React 19 + Tailwind CSS 4, hỗ trợ Microsoft Fluent 2 preset và hơn 70+ controls.

Readme

webapp.ui.lib

Bộ thư viện component UI toàn diện, hiệu năng cao và chuẩn hoá dành cho React 19 và Tailwind CSS 4, kết hợp nền tảng Radix UI, hỗ trợ sẵn preset thiết kế Microsoft Fluent 2.

npm version License: MIT React TailwindCSS


Tính Năng Nổi Bật

  • 🚀 Hơn 70+ Components & Controls: Bao phủ đầy đủ từ Forms, Data Table ảo hoá, Masonry thác nước, Cây thư mục, Biểu đồ, đến các Trình xem đa phương tiện nâng cao (Office Word .docx/.doc 97-2003, Excel, PowerPoint .pptx, PDF, Zip, Media, HTML sandbox an toàn, Zoom ảnh) và một số tiện ích khác.
  • 🎨 Đa dạng phong cách & Themes:
    • Hỗ trợ Dark Mode chuẩn xác theo class .dark hoặc hook useTheme().
    • Tích hợp sẵn preset Microsoft Fluent 2 với bo góc mềm mại, đổ bóng Fluent Elevation và màu sắc chuẩn mực.
    • Tùy biến Design Tokens linh hoạt qua CSS layer (wwui-tokens) không lo xung đột.
  • ⚡ Tối ưu dung lượng & Tree-shaking:
    • Xuất bản chuẩn ESM phân tách chunk chi tiết và bản UMD đơn lẻ.
    • Tự động nạp lười (Lazy Loading) các thư viện nặng (SheetJS xlsx, PDF.js, Fabric.js) chỉ khi người dùng mở định dạng tài liệu tương ứng.
  • 🛡️ TypeScript First: Khai báo .d.ts đầy đủ, chuẩn xác, tự động gợi ý props và kiểu dữ liệu.

1. Cài Đặt

Cài đặt từ NPM Registry:

npm install webapp.ui.lib
# hoặc
pnpm add webapp.ui.lib
# hoặc
yarn add webapp.ui.lib

Hoặc cài từ file .tgz (phân phối nội bộ/offline):

npm install ./vendor/webapp.ui.lib-1.0.0.tgz

Yêu cầu môi trường: react và react-dom phiên bản ^19.0.0. Các thư viện phụ thuộc cho types và logic hiển thị (radix-ui, @tanstack/react-table, recharts...) sẽ được npm tự động cài đặt theo dependencies.


2. Bắt Đầu Nhanh (Quick Start)

2.1. Nạp CSS và bọc Provider

Ở file khởi chạy ứng dụng (ví dụ main.tsx hoặc App.tsx), nạp stylesheet và bọc component bằng AppProviders:

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { AppProviders } from "webapp.ui.lib";

// Bắt buộc: Nạp CSS đã biên dịch của thư viện
import "webapp.ui.lib/styles.css";

import App from "./App";

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <AppProviders defaultStyleVariant="fluent">
      <App />
    </AppProviders>
  </StrictMode>
);

AppProviders đã tích hợp sẵn:

  • QueryClientProvider (React Query)
  • TooltipProvider (Tooltip)
  • ThemeProvider (Theme & Fluent 2 Style)
  • GlobalConfirmAlertProvider (Hộp thoại xác nhận toàn cục qua useGlobalConfirmAlert())
  • Toaster (khung hiển thị cho toast từ webapp.ui.lib/ui/use-toast; không phải sonner)

3. Cách Thức Import

Thư viện hỗ trợ 2 hình thức import linh hoạt:

A. Barrel Import (Thuận tiện & Gọn gàng)

Bundler (Vite, Next.js, Rollup) tự động tree-shake nhờ kiến trúc ESM tách file:

import { Button, Input, DataTable, Masonry } from "webapp.ui.lib";

B. Subpath Import (Kiểm soát tuyệt đối kích thước bundle)

import { Button } from "webapp.ui.lib/ui/button";
import { DataTable } from "webapp.ui.lib/ui/data-table/data-table";
import { Masonry } from "webapp.ui.lib/ui/masonry";
import { DocumentViewerControl } from "webapp.ui.lib/ui/document-viewer/index"; // thư mục → thêm /index
import { useDebounce } from "webapp.ui.lib/hooks/use-debounce";
import { cn } from "webapp.ui.lib/lib/utils";

4. Danh Mục Controls & Bảng Tra Cứu

Chi tiết hướng dẫn đầy đủ kèm ví dụ mã nguồn từng control có thể xem tại CONTROLS.md.

| Tên Control | Đường dẫn Subpath | Phân Loại | Mô tả tóm tắt | | :--- | :--- | :--- | :--- | | AppProviders | components/provider/app-providers | Provider | Bọc toàn bộ ngữ cảnh app (Theme, Query, Toast, Confirm) | | ThemeProvider, useTheme | components/provider/theme-provider | Provider | Quản lý theme Sáng/Tối và Fluent Style Preset | | GlobalConfirmAlertProvider | ui/global-confirm-alert | Provider | Quản lý hộp thoại xác nhận toàn cục dạng promise qua hook useGlobalConfirmAlert() | | Input | ui/input | Nhập liệu | Ô nhập text cơ bản, có icon trước/sau, clear button | | InputPassword | ui/input-password | Nhập liệu | Ô nhập mật khẩu với nút bật/tắt ẩn hiện | | InputNumber | ui/input-number | Nhập liệu | Ô nhập số kèm định dạng, min/max, step | | InputOTP | ui/input-otp | Nhập liệu | Ô nhập mã xác thực OTP 4-6 số phân ô | | InputGroup | ui/input-group | Nhập liệu | Cụm ghép nối tiền tố/hậu tố/nút bấm với Input | | Textarea | ui/textarea | Nhập liệu | Vùng nhập văn bản nhiều dòng, hỗ trợ auto-resize | | Checkbox | ui/checkbox | Nhập liệu | Hộp kiểm chọn, hỗ trợ indeterminate state | | RadioGroup | ui/radio-group | Nhập liệu | Nhóm chọn 1 tùy chọn duy nhất | | Switch | ui/switch | Nhập liệu | Công tắc bật/tắt dạng toggle | | Slider | ui/slider | Nhập liệu | Thanh trượt chọn giá trị số trong khoảng | | Select, NativeSelect | ui/select, ui/native-select | Nhập liệu | Hộp thoại chọn dropdown đơn/đa giá trị | | SelectSearch | ui/select-search | Nhập liệu | Select kèm ô gõ tìm kiếm nội tuyến nhanh | | AutoComplete | ui/autocomplete | Nhập liệu | Gợi ý tự động khi người dùng gõ phím | | Combobox | ui/combobox.lazy | Nhập liệu | Combobox đa năng tìm kiếm và chọn dữ liệu lớn | | DatePicker, DateTimePicker | ui/date-picker, ui/date-time-picker | Nhập liệu | Chọn ngày/giờ tiếng Việt kèm giao diện lịch | | DateRangePicker | ui/date-range-picker | Nhập liệu | Chọn khoảng ngày (Từ ngày - Đến ngày) với preset tiện lợi | | TimePicker | ui/time-picker | Nhập liệu | Chọn giờ HH:mm:ss / HH:mm, tuỳ chọn "Hôm trước / Hôm sau" | | TimeRangePicker | ui/time-range-picker | Nhập liệu | Chọn khoảng giờ (Bắt đầu - Kết thúc), ca qua đêm tự sang "Hôm sau", hiện thời lượng | | Calendar | ui/calendar | Nhập liệu | Bộ lịch hiển thị theo tháng, hỗ trợ chọn nhiều ngày | | FileUpload | ui/file-upload | Nhập liệu | Vùng kéo thả tải tệp tin, xem trước, giới hạn dung lượng/loại file | | FormControl, Field | ui/form-control, ui/field | Nhập liệu | Bọc input hiển thị nhãn, thông báo lỗi, trợ giúp | | Form, FormItem, useForm | ui/form/index (không có ở root barrel) | Biểu mẫu | Bộ quản lý form với validation rule mạnh mẽ | | Button | ui/button | Nút bấm | Nút bấm chuẩn với nhiều variant (primary, outline, ghost, v.v.) | | ButtonGroup | ui/button-group | Nút bấm | Cụm gom nhóm các nút liền kề nhau | | FloatButton | ui/float-button | Nút bấm | Nút nổi góc màn hình, nhóm popup menu hoặc nút cuộn lên đầu (BackTop) | | Toggle, ToggleGroup | ui/toggle, ui/toggle-group | Nút bấm | Nút bấm giữ trạng thái bật/tắt (căn lề, định dạng) | | useShortcut, Kbd | ui/shortcut, ui/kbd | Nút bấm | Bắt phím tắt và hiển thị nhãn phím trên giao diện | | Breadcrumb | ui/breadcrumb | Điều hướng | Đường dẫn phân cấp trang | | PageHeader | ui/page-header | Điều hướng | Thanh tiêu đề trang chuẩn hóa gồm Title, Description và Actions | | Pagination | ui/pagination | Điều hướng | Thanh phân trang số trang | | Tabs | ui/tabs | Điều hướng | Chuyển đổi nội dung theo tab chuẩn | | ButtonTabs | ui/button-tabs | Điều hướng | Tab dạng nút (3 chế độ: button, segmented, line) | | Sidebar, SidebarNav | ui/sidebar, ui/sidebar-nav | Điều hướng | Khung sườn menu điều hướng bên hông ứng dụng | | NavigationMenu, Menubar | ui/navigation-menu, ui/menubar | Điều hướng | Thanh menu ngang cấp cao cho web app desktop | | DropdownMenu, ContextMenu | ui/dropdown-menu, ui/context-menu | Điều hướng | Menu xổ xuống khi click hoặc click chuột phải | | DataTable | ui/data-table/data-table | Dữ liệu | Bảng dữ liệu TanStack Table ảo hóa, phân trang, sort, filter, chọn dòng | | Masonry | ui/masonry | Bố cục | Bố cục thác nước Pinterest đa cột, responsive, auto-calc, infinite scroll | | ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent | ui/chart | Dữ liệu | Biểu đồ trực quan hóa dữ liệu (Recharts) | | Tree | ui/tree | Dữ liệu | Cây thư mục/danh mục phân cấp đóng mở được | | TreeSelect | ui/tree-select | Nhập liệu | Hộp chọn dropdown hiển thị cây phân cấp, tìm kiếm lọc nhánh, đơn/đa chọn | | Table, TableWrapper | ui/table, ui/table-wrapper | Dữ liệu | Thẻ bảng thuần semantic kèm thanh cuộn responsive | | Card, GenericCardRadio | ui/card, ui/generic-card-radio | Dữ liệu | Thẻ nội dung thông tin, thẻ dạng radio để chọn | | Item, Empty | ui/item, ui/empty | Dữ liệu | Hiển thị item chi tiết hoặc trạng thái không có dữ liệu | | Accordion | ui/accordion | Bố cục | Khung nội dung thu gọn/mở rộng dạng accordion | | Carousel | ui/carousel | Bố cục | Băng chuyền xoay vòng hiển thị hình ảnh/nội dung (Embla Carousel) | | Collapsible | ui/collapsible | Bố cục | Khối đóng/mở nội dung dạng thu gọn đơn giản | | AspectRatio | ui/aspect-ratio | Bố cục | Khung giữ tỉ lệ cố định (16:9, 4:3, 1:1...) | | Separator | ui/separator | Bố cục | Đường kẻ phân chia nội dung ngang hoặc dọc | | ScrollArea | ui/scroll-area | Bố cục | Thanh cuộn tùy biến giao diện mượt mà | | ResizablePanelGroup, ResizablePanel, ResizableHandle | ui/resizable | Bố cục | Bố cục chia ngăn kéo thả thay đổi kích thước linh hoạt | | Alert, AlertDialog | ui/alert, ui/alert-dialog | Phản hồi | Khung cảnh báo và hộp thoại xác nhận thao tác nguy hiểm | | Dialog | ui/dialog | Phản hồi | Cửa sổ popup modal thông tin hoặc form | | Drawer, Sheet | ui/drawer, ui/sheet | Phản hồi | Ngăn kéo trượt từ đáy (Drawer) hoặc từ cạnh hông (Sheet) | | Popover, HoverCard | ui/popover, ui/hover-card | Phản hồi | Khung nổi khi click hoặc rê chuột | | Tooltip | ui/tooltip | Phản hồi | Bong bóng chú thích ngắn gọn | | Badge, Avatar | ui/badge, ui/avatar | Phản hồi | Huy hiệu trạng thái và ảnh đại diện người dùng | | Skeleton, Spinner, Progress| ui/skeleton, ui/spinner, ui/progress| Phản hồi | Trạng thái đang tải dữ liệu và thanh tiến độ | | toast, useToast | ui/use-toast (không có ở root barrel) | Phản hồi | Thông báo toast; khung hiển thị đã gắn sẵn trong AppProviders | | Toaster (sonner) | ui/sonner | Phản hồi | Khung toast của thư viện sonner (khác khung của AppProviders), đi với toast của gói sonner | | DocumentViewerControl | ui/document-viewer/index | Đa phương tiện | Trình xem đa năng Word (.docx, .doc 97-2003), Excel, PowerPoint (.pptx), PDF, Ảnh, Zip, Text, Markdown, HTML Sandbox | | PdfViewer | ui/pdf-viewer.lazy | Đa phương tiện | Trình xem và tương tác PDF chuyên sâu (vẽ chú thích, xoay trang, thumbnail) | | ImagesViewControl | ui/image-view/index | Đa phương tiện | Thư viện ảnh Masonry đa cột, lazy load, blur preview, multi-select | | ImageZoomViewerControl, ImageZoomViewerModal | ui/image-view/index | Đa phương tiện | Cửa sổ zoom pan xem ảnh chi tiết toàn màn hình | | AdvancedSearch | ui/advanced-search | Chuyên dụng | Thanh tìm kiếm nâng cao nhiều trường lọc | | vietnam-lunar | lib/vietnam-lunar | Tiện ích | Bộ chuyển đổi Dương lịch <-> Âm lịch Việt Nam chuẩn mực (+7), tính Can Chi, ngày Julius | | useDebounce, useMediaQuery, useZoomPan, useIntersectionObserver | hooks/<tên-file> (không có ở root barrel) | Hooks | Bộ hooks tiện ích xử lý logic UI thường gặp | | cn | lib/utils | Tiện ích | Tiện ích ghép class CSS thông minh với clsx + tailwind-merge |


5. Tùy Biến Giao Diện & Themes

5.1. Chuyển đổi Theme Sáng / Tối

Sử dụng hook useTheme:

import { useTheme } from "webapp.ui.lib";

function ThemeToggle() {
  const { theme, setTheme } = useTheme();
  return (
    <button onClick={() => setTheme(theme === "dark" ? "light" : "dark")}>
      Chế độ: {theme}
    </button>
  );
}

5.2. Microsoft Fluent 2 Style Preset

Kích hoạt phong cách Microsoft Fluent 2:

  • Cách 1: Qua ThemeProvider / AppProviders:
    <AppProviders defaultStyleVariant="fluent">
      <App />
    </AppProviders>
  • Cách 2: Gán thuộc tính hoặc class HTML:
    <html data-theme-style="fluent">
    <!-- hoặc <body class="theme-fluent"> -->
  • Cách 3: Import trực tiếp preset CSS:
    import "webapp.ui.lib/themes/fluent.css";

5.3. Ghi đè Tokens CSS

Tất cả các biến màu và kích thước của thư viện nằm trong cascade layer @layer wwui-tokens. Bạn có thể ghi đè đơn giản ở bất kỳ file CSS nào của dự án mà không cần !important:

:root {
  --radius: 8px;
  --primary: #0f6cbd;
}

.dark {
  --primary: #2886de;
}

6. Bản Phân Phối UMD (Thẻ <script>)

Nếu cần nhúng nhanh qua thẻ script truyền thống:

  • File UMD: dist/umd/webapp.ui.lib.umd.cjs (đã nhúng sẵn toàn bộ CSS bên trong JS).
  • Yêu cầu các biến toàn cục: window.React, window.ReactDOM, window.jsxRuntime.
  • Biến toàn cục lộ ra: window.WWAppUI.

7. Giấy Phép & Bản Quyền (License & Compliance)

  • Mã nguồn thư viện: Phát hành theo giấy phép tự do MIT License (Copyright (c) 2026 minhvb). Cho phép sử dụng tự do trong cả dự án mã nguồn mở và thương mại (commercial).
  • Thư viện bên thứ ba: Danh sách chi tiết toàn bộ các thành phần mã nguồn mở bên thứ ba cùng văn bản bản quyền tương ứng được lưu trữ đầy đủ tại THIRD_PARTY_LICENSES.txt.
  • Âm lịch Việt Nam: Module vietnam-lunar được viết độc lập, tính trực tiếp từ công thức thiên văn của Jean Meeus (Astronomical Algorithms, 2nd ed.) và đa thức ΔT của Espenak & Meeus (NASA); phát hành theo MIT cùng thư viện.
  • Trình đọc PowerPoint (.pptx) & Word cũ (.doc): Sử dụng thư viện giải nén fflate (MIT) và thư viện Compound File Binary CFB từ xlsx (Apache-2.0), logic phân tích tài liệu được viết độc lập bằng TypeScript thuần tuân theo tài liệu đặc tả mở của Microsoft.

Ghi nhận: TS. Hồ Ngọc Đức và amlich.js

Module vietnam-lunar tham khảo các bài viết về âm lịch Việt Nam cùng chương trình amlich.js của TS. Hồ Ngọc Đức: đây là tài liệu đã giúp phổ biến cách hiểu luật lịch âm dương Việt Nam theo hướng tính toán thiên văn, và chỉ ra những điểm khiến lịch Việt Nam khác lịch Trung Quốc (múi giờ +7, các năm Tết lệch ngày như 1985, 2007, 2030).

  • Phần tham khảo: các quy tắc lập lịch - mùng 1 là ngày có điểm sóc theo giờ địa phương, tháng chứa Đông chí là tháng 11, tháng nhuận là tháng đầu tiên không có trung khí - cùng cách đặt vấn đề "tính lịch từ vị trí Mặt Trời và Mặt Trăng". Đây là những quy ước chung của lịch âm dương mà các bài viết của TS. Hồ Ngọc Đức trình bày rõ ràng, dễ tiếp cận bằng tiếng Việt.

Xin trân trọng cảm ơn TS. Hồ Ngọc Đức vì những đóng góp cho việc tra cứu và tính toán âm lịch Việt Nam.