@ark-ui/react/drawer + Tailwind CSS v4
Ark Drawer
Thành phần ngăn kéo trượt (Drawer / Bottom Sheet) cao cấp hoàn toàn tuân thủ WAI-ARIA Dialog Pattern, được vận hành bởi máy trạng thái Zag.js của Ark UI và hệ thống hiệu ứng CSS Keyframes chuyên biệt cho Zag Presence lifecycle. Hỗ trợ cảm ứng kéo vuốt mượt mà 60fps, bắt dính điểm dừng thông minh (Snap Points), 4 hướng mở linh hoạt (Left, Right, Bottom, Top), tương tác không chặn (Non-Modal), chống trượt cuộn danh sách (Scrollable), vùng cấm kéo (No Drag Area), xếp chồng nền co lún (Indent Background), và tích hợp đầy đủ nút icon đóng tiêu chuẩn.
1. Cơ bản & Bottom Sheet (Basic Usage)
Khởi tạo ngăn kéo cơ bản dạng Bottom Sheet theo cấu trúc chuẩn Ark UI với thanh Grabber, tiêu đề, mô tả và nút CloseTrigger icon X.
Chào mừng đến với Ark Drawer
Ngăn kéo trượt mượt mà dựa trên máy trạng thái Zag.js và Tailwind CSS v4.
Ark Drawer hỗ trợ cử chỉ cảm ứng tự nhiên trên màn hình cảm ứng hoặc chuột. Bạn có thể nhấn giữ thanh grabber hoặc bất cứ đâu trên thân drawer để kéo vuốt xuống và đóng lại.
Tự động tính toán toạ độ dịch chuyển thông qua các biến CSS nội suy
--drawer-translate-y và chuỗi keyframes Zag Presence lifecycle (60fps).Thông báo hệ thống
Phiên bản ChillCMS v2.4 đã sẵn sàng cập nhật.
Cú pháp gọn tích hợp sẵn Backdrop, Header, Grabber, nút icon đóng X và Footer chỉ với vài dòng mã lệnh ngắn gọn.
2. 4 Hướng mở linh hoạt (Swipe Direction)
Hỗ trợ mở ngăn kéo từ cả 4 hướng: Trái (start), Phải (end), Dưới (down) và Trên (up) với hướng vuốt đóng tự động thích ứng.
Menu điều hướng bên trái (Left Drawer)
Thích hợp cho Menu điều hướng chính, danh mục bài viết hoặc thanh tác vụ phụ.
Ngăn kéo được định vị chính xác theo hướng left. Cử chỉ kéo vuốt tự động nhận dạng hướng trượt để đóng lại theo đúng cạnh tương ứng.
side="left" → swipeDirection="start"
Bảng thuộc tính bên phải (Right Drawer)
Thường dùng cho giỏ hàng, bảng thiết lập thuộc tính hoặc thông tin chi tiết.
Ngăn kéo được định vị chính xác theo hướng right. Cử chỉ kéo vuốt tự động nhận dạng hướng trượt để đóng lại theo đúng cạnh tương ứng.
side="right" → swipeDirection="end"
Bảng điều khiển đáy (Bottom Sheet)
Lý tưởng cho thiết bị di động, hộp chọn danh sách hoặc tác vụ chia sẻ.
Ngăn kéo được định vị chính xác theo hướng bottom. Cử chỉ kéo vuốt tự động nhận dạng hướng trượt để đóng lại theo đúng cạnh tương ứng.
side="bottom" → swipeDirection="down"
Ngăn thông báo đỉnh (Top Drawer)
Thích hợp cho thông báo quan trọng, thanh tìm kiếm toàn trang hoặc bộ lọc nhanh.
Ngăn kéo được định vị chính xác theo hướng top. Cử chỉ kéo vuốt tự động nhận dạng hướng trượt để đóng lại theo đúng cạnh tương ứng.
side="top" → swipeDirection="up"
3. Đa mốc dừng vật lý (Snap Points)
Bắt dính các mốc chiều cao cố định hoặc tỉ lệ (25%, 50%, 100%) khi kéo vuốt với cơ chế động lực học Zag mượt mà.
Đa mốc dừng (Snap Points Physics)
Ngăn kéo có 3 mốc dừng ở 25%, 50% và 100% chiều cao màn hình.
Mốc hiện tại:50%(Chỉ số mốc: 1)
Cơ chế vật lý Zag Snap Points
Kéo thanh grabber hoặc thân drawer để chuyển đổi giữa các mốc dừng. Khi người dùng vuốt và thả tay, máy trạng thái Zag tự động tính toán vận tốc giải phóng (velocity threshold) và vị trí hiện thời để bắt dính vào điểm mốc gần nhất.4. Chế độ Modal & Non-Modal (modal={false})
Thiết lập modal={false} cho phép người dùng tự do bấm chuột và tương tác trực tiếp với các phần tử trên trang nền khi drawer đang mở.
Non-Modal Drawer (modal={false})
Cho phép người dùng tương tác bình thường với nút bấm và nội dung trang nền khi drawer đang mở.
Khi đặt modal={false}, con trỏ chuột và bàn phím không bị bẫy (focus trap) bên trong drawer. Bạn có thể nhấn vào nút "Thử nghiệm ở trang nền" bên trên ngay cả khi drawer này đang hiển thị.
Rất phù hợp cho trình phát nhạc thu nhỏ (Mini Player), thanh công cụ soạn thảo, hoặc bảng hỗ trợ song song.
5. Kiểm soát trạng thái mở (Controlled State)
Đồng bộ 2 chiều trạng thái đóng/mở với React state bên ngoài thông qua open và onOpenChange.
Trạng thái state: ĐÓNG (CLOSED)
Trạng thái có kiểm soát (Controlled)
Thuộc tính open và onOpenChange được đồng bộ 2 chiều với React State.
Bạn có thể hoàn toàn kiểm soát việc hiển thị ngăn kéo thông qua prop open và sự kiện onOpenChange.
Điều này rất hữu ích khi bạn cần mở ngăn kéo sau khi hoàn thành một tác vụ bất đồng bộ (Fetch API, upload file) hoặc khi liên kết với URL Search Params.
6. Danh sách cuộn dài (Scrollable Drawer)
Drawer chứa danh sách dài 50 phần tử với cơ chế preventDragOnScroll thông minh, cho phép cuộn nội dung mượt mà và chỉ vuốt đóng khi ở đỉnh.
Scrollable Drawer (Danh sách cuộn dài)
Tự động phân biệt thao tác cuộn danh sách (scroll) và thao tác kéo vuốt đóng (swipe-to-dismiss).
Mục dữ liệu #1
Chi tiết bản ghi số 1 trong danh sách cuộn tự nhiên
Mục dữ liệu #2
Chi tiết bản ghi số 2 trong danh sách cuộn tự nhiên
Mục dữ liệu #3
Chi tiết bản ghi số 3 trong danh sách cuộn tự nhiên
Mục dữ liệu #4
Chi tiết bản ghi số 4 trong danh sách cuộn tự nhiên
Mục dữ liệu #5
Chi tiết bản ghi số 5 trong danh sách cuộn tự nhiên
Mục dữ liệu #6
Chi tiết bản ghi số 6 trong danh sách cuộn tự nhiên
Mục dữ liệu #7
Chi tiết bản ghi số 7 trong danh sách cuộn tự nhiên
Mục dữ liệu #8
Chi tiết bản ghi số 8 trong danh sách cuộn tự nhiên
Mục dữ liệu #9
Chi tiết bản ghi số 9 trong danh sách cuộn tự nhiên
Mục dữ liệu #10
Chi tiết bản ghi số 10 trong danh sách cuộn tự nhiên
Mục dữ liệu #11
Chi tiết bản ghi số 11 trong danh sách cuộn tự nhiên
Mục dữ liệu #12
Chi tiết bản ghi số 12 trong danh sách cuộn tự nhiên
Mục dữ liệu #13
Chi tiết bản ghi số 13 trong danh sách cuộn tự nhiên
Mục dữ liệu #14
Chi tiết bản ghi số 14 trong danh sách cuộn tự nhiên
Mục dữ liệu #15
Chi tiết bản ghi số 15 trong danh sách cuộn tự nhiên
Mục dữ liệu #16
Chi tiết bản ghi số 16 trong danh sách cuộn tự nhiên
Mục dữ liệu #17
Chi tiết bản ghi số 17 trong danh sách cuộn tự nhiên
Mục dữ liệu #18
Chi tiết bản ghi số 18 trong danh sách cuộn tự nhiên
Mục dữ liệu #19
Chi tiết bản ghi số 19 trong danh sách cuộn tự nhiên
Mục dữ liệu #20
Chi tiết bản ghi số 20 trong danh sách cuộn tự nhiên
Mục dữ liệu #21
Chi tiết bản ghi số 21 trong danh sách cuộn tự nhiên
Mục dữ liệu #22
Chi tiết bản ghi số 22 trong danh sách cuộn tự nhiên
Mục dữ liệu #23
Chi tiết bản ghi số 23 trong danh sách cuộn tự nhiên
Mục dữ liệu #24
Chi tiết bản ghi số 24 trong danh sách cuộn tự nhiên
Mục dữ liệu #25
Chi tiết bản ghi số 25 trong danh sách cuộn tự nhiên
Mục dữ liệu #26
Chi tiết bản ghi số 26 trong danh sách cuộn tự nhiên
Mục dữ liệu #27
Chi tiết bản ghi số 27 trong danh sách cuộn tự nhiên
Mục dữ liệu #28
Chi tiết bản ghi số 28 trong danh sách cuộn tự nhiên
Mục dữ liệu #29
Chi tiết bản ghi số 29 trong danh sách cuộn tự nhiên
Mục dữ liệu #30
Chi tiết bản ghi số 30 trong danh sách cuộn tự nhiên
Mục dữ liệu #31
Chi tiết bản ghi số 31 trong danh sách cuộn tự nhiên
Mục dữ liệu #32
Chi tiết bản ghi số 32 trong danh sách cuộn tự nhiên
Mục dữ liệu #33
Chi tiết bản ghi số 33 trong danh sách cuộn tự nhiên
Mục dữ liệu #34
Chi tiết bản ghi số 34 trong danh sách cuộn tự nhiên
Mục dữ liệu #35
Chi tiết bản ghi số 35 trong danh sách cuộn tự nhiên
Mục dữ liệu #36
Chi tiết bản ghi số 36 trong danh sách cuộn tự nhiên
Mục dữ liệu #37
Chi tiết bản ghi số 37 trong danh sách cuộn tự nhiên
Mục dữ liệu #38
Chi tiết bản ghi số 38 trong danh sách cuộn tự nhiên
Mục dữ liệu #39
Chi tiết bản ghi số 39 trong danh sách cuộn tự nhiên
Mục dữ liệu #40
Chi tiết bản ghi số 40 trong danh sách cuộn tự nhiên
Mục dữ liệu #41
Chi tiết bản ghi số 41 trong danh sách cuộn tự nhiên
Mục dữ liệu #42
Chi tiết bản ghi số 42 trong danh sách cuộn tự nhiên
Mục dữ liệu #43
Chi tiết bản ghi số 43 trong danh sách cuộn tự nhiên
Mục dữ liệu #44
Chi tiết bản ghi số 44 trong danh sách cuộn tự nhiên
Mục dữ liệu #45
Chi tiết bản ghi số 45 trong danh sách cuộn tự nhiên
Mục dữ liệu #46
Chi tiết bản ghi số 46 trong danh sách cuộn tự nhiên
Mục dữ liệu #47
Chi tiết bản ghi số 47 trong danh sách cuộn tự nhiên
Mục dữ liệu #48
Chi tiết bản ghi số 48 trong danh sách cuộn tự nhiên
Mục dữ liệu #49
Chi tiết bản ghi số 49 trong danh sách cuộn tự nhiên
Mục dữ liệu #50
Chi tiết bản ghi số 50 trong danh sách cuộn tự nhiên
7. Vùng cấm kéo & Khóa vuốt (Drag Area Options)
Sử dụng data-no-drag để loại trừ vùng tương tác (slider, canvas, bản đồ) và draggable={false} để tắt hoàn toàn thao tác vuốt đóng.
Vùng cấm kéo (No Drag Area)
Áp dụng thuộc tính data-no-drag lên phần tử bất kỳ để vô hiệu hóa thao tác kéo từ phần tử đó.
Bạn có thể kéo vuốt trên thanh grabber hoặc khu vực trống này để đóng ngăn kéo.
Khu vực mang thuộc tính data-no-drag
Hãy thử nhấn giữ chuột hoặc ngón tay và kéo xuống tại đây: Drawer sẽ không phản hồi chuyển động kéo. Thích hợp cho khung vẽ canvas, bản đồ tương tác, slider hoặc bảng vẽ chữ ký.
Không thể kéo vuốt (Non-Draggable)
Thuộc tính draggable={false} trên ArkDrawer.Content khóa hoàn toàn cử chỉ kéo để đóng.
Ngăn kéo này chỉ có thể được đóng lại bằng cách nhấn nút icon X, bấm phím Escape, hoặc bấm vào nút xác nhận ở Footer.
Cấu hình này quan trọng khi drawer chứa biểu mẫu nhập liệu quan trọng, tránh tình trạng người dùng vô tình quẹt tay làm mất dữ liệu đang soạn thảo dở dang.
8. Một Drawer dùng chung nhiều Trigger (Multiple Triggers)
Chia sẻ một Drawer duy nhất giữa nhiều nút Trigger khác nhau bằng thuộc tính value và sự kiện onTriggerValueChange.
Thông tin thành viên
Dùng chung một Drawer duy nhất với nhiều nút Trigger khác nhau.
Chưa chọn thành viên nào.
9. Hiệu ứng thu nhỏ trang nền (Indent Background)
Sử dụng Drawer.Stack kết hợp Drawer.IndentBackground và Drawer.Indent để tạo hiệu ứng co lún trang nền đẳng cấp như iOS.
Khuôn viên thử nghiệm hiệu ứng thu nhỏ (Indent Sandbox)
Khi mở Drawer, lớp vỏ Indent này sẽ tự động co nhỏ lại (scale down) và bo góc mềm mại tạo cảm giác không gian 3 chiều như ứng dụng Apple iOS native.
Thông báo mới nhất
Bạn đã xử lý toàn bộ tác vụ tồn đọng.
Cơ chế ArkDrawer.Indent và ArkDrawer.Stack tính toán tiến trình vuốt (--drawer-swipe-progress) và chiều cao mặt trước để biến đổi tỉ lệ co lùi của trang nền tương ứng với vị trí ngón tay của người dùng.
10. Quản trị bằng useDrawer Hook (RootProvider)
Tách biệt instance máy trạng thái Zag ra ngoài bằng useDrawer() kết hợp ArkDrawer.RootProvider để điều khiển từ xa qua API.
Mở:false|Snap Point:50%
Quản trị bằng useDrawer Hook & RootProvider
Khởi tạo instance máy trạng thái Zag độc lập và điều khiển toàn bộ hành vi từ xa.
Với useDrawer và ArkDrawer.RootProvider, toàn bộ API của máy trạng thái Zag được tách biệt ra ngoài component cây DOM.
Điểm dừng hiện thời (Active snap point): 50%
11. Kích cỡ & Biến thể giao diện (Sizes & Variants)
Lựa chọn kích cỡ từ sm đến full, kết hợp các biến thể bề mặt default, subtle, elevated và hiệu ứng kính mờ glass.
1. Chọn hướng mở (Side):
2. Chọn kích thước (Size):
3. Chọn kiểu giao diện (Variant):
Kích thước: md | Biến thể: default
Được render trên nền mặt phẳng cấp độ floating surface với Tailwind CSS v4.
Biến thể default áp dụng hệ màu tối ưu cho cả chế độ sáng và tối (Light/Dark mode):
- default: Nền surface cơ bản cùng đường viền tiêu chuẩn.
- subtle: Nền surface-raised mềm mại, bóng đổ nhẹ.
- elevated: Nền surface-floating nổi bật với bóng đổ 2xl.
- glass: Hiệu ứng kính mờ thời thượng
backdrop-blur-xlkết hợp đường viền bán trong suốt.
12. Giỏ hàng thương mại điện tử thực tế (Shopping Cart)
Kịch bản giỏ hàng trượt từ bên phải với danh sách sản phẩm, tăng giảm số lượng, tính tổng và nút thanh toán dính đáy.
Giỏ hàng của bạn
4 sản phẩm đang chờ thanh toán
IMG
Áo Hoodie ChillCMS Premium Cotton
Size L / Đen Than
650.000 đ
1
IMG
Bình giữ nhiệt kim loại Ark UI Edition
500ml / Bạc Mờ
640.000 đ
2
IMG
Túi Tote Canvas Lập Trình Viên
Trắng Kem / Logo Thêu
180.000 đ
1
13. Bộ lọc danh mục & Giá nâng cao (Filter Drawer)
Ngăn kéo bộ lọc chuyên sâu dạng Left Drawer cho tìm kiếm danh mục, khoảng giá và các tuỳ chọn trạng thái.
Bộ lọc nâng cao
Thu hẹp kết quả tìm kiếm theo tiêu chí
Chủ đề & Danh mục
Khoảng giá
Tùy chọn khác
14. Ngăn kéo xếp chồng lồng nhau (Nested Stack Drawers)
Mở ngăn kéo cấp 2 đè lên ngăn kéo cấp 1 với quản lý chuỗi tiêu điểm và phím Escape theo thứ tự LIFO tự động.
Quản lý tài khoản
Thiết lập thông tin cá nhân và cài đặt bảo mật nâng cao.
CC
Admin ChillCMS
admin@chillcms.internal
Cài đặt chuyên sâu
Bảo mật 2FA (Cấp 2)
Ngăn kéo xếp chồng (Nested stack drawer).
Ngăn kéo cấp 2 này được mở đè lên ngăn kéo cấp 1. Zag.js tự động quản lý chuỗi tiêu điểm (focus stack) và xử lý sự kiện phím Escape theo thứ tự LIFO (Last-In, First-Out).
Bấm phím Escape hoặc nút đóng để quay lại ngăn kéo cấp 1 trước đó.
15. Vuốt từ mép màn hình (Edge Swipe Area)
Vùng đón nhận cảm ứng ở mép màn hình cho phép người dùng vuốt mở ngăn kéo như trải nghiệm ứng dụng native iOS/Android.
↑ Vuốt từ đây để mở Drawer
Vuốt từ mép màn hình (Edge Swipe)
Mở ngăn kéo ngay cả khi chưa bấm nút trigger
Thành phần ArkDrawer.SwipeArea tạo ra một vùng đón nhận cảm ứng ở mép màn hình (hoặc cạnh container).
Trên các thiết bị di động, tính năng này mang lại cảm giác trải nghiệm bản địa (native app feel) giống hệ điều hành iOS hoặc Android khi người dùng vuốt từ dưới đáy lên để mở bảng điều khiển.