- Jelly UI v1.1 là thư viện web component không phụ thuộc bên ngoài, kết hợp các điều khiển biểu mẫu thực với hiệu ứng vật lý soft-body mềm dẻo, cung cấp 40 custom element
- Cài đặt bằng một module script duy nhất, hỗ trợ chế độ tối, tự động theo dõi giao diện hệ điều hành, đổi màu nhấn và bố cục RTL viết từ phải sang trái
- Nút dùng
<button>gốc, thanh trượt dùng inputrangeẩn để giữ ngữ nghĩa gốc cho thao tác bàn phím, trình đọc màn hình và tham gia biểu mẫu - Từ checkbox và ô nhập liệu đến toast, tab và dialog, nhiều thành phần được áp dụng hoạt ảnh xúc giác như nhấn xuống, kéo giãn, gợn sóng và nảy bật
- Tích hợp sẵn token màu WCAG AA và mẫu ARIA, cho phép tạo giao diện sản phẩm có khả năng truy cập mà vẫn giữ được hiệu ứng hình ảnh mềm mại
Cài đặt và giao diện
- Jelly UI có thể dùng không cần phụ thuộc, chỉ với 40 custom element và một thẻ
<script type="module"><script type="module" src="https://jelly-ui.com/package.js"></script> <jelly-theme mode="auto"> <jelly-button variant="mint">Publish</jelly-button> </jelly-theme> <jelly-theme>là trình cung cấp giao diện áp dụng token thiết kế giới hạn trong cây conmodehỗ trợauto,light,dark, có thể theo thiết lập hệ điều hành hoặc ép một giao diện cụ thể- Có thể đặt lại màu nhấn bằng
accent
- Các biến thể màu phổ biến gồm
azure,rose,amber,mint,graphite,platinum,white; kích thước chủ yếu làsmall,medium,large
Nút và thành phần hành động
<jelly-button>là nút dạng viên nang có chứa<button>gốc bên trong để hỗ trợ bàn phím và trình đọc màn hình- Có thể thiết lập màu, kích thước, dạng
pillvàsquare, vô hiệu hóa và bố cục block
- Có thể thiết lập màu, kích thước, dạng
<jelly-icon-button>là nút vuông hoặc tròn dành cho một biểu tượng duy nhất- Thuộc tính
labeldùng để chỉ định tên mà trình đọc màn hình sẽ nhận biết
- Thuộc tính
Điều khiển nhập biểu mẫu
<jelly-checkbox>tham gia biểu mẫu, hỗ trợcheckedvà trạng thái không xác định (indeterminate), và hình vuông jelly sẽ bật nảy khi trạng thái thay đổi<jelly-input>là trường nhập một dòng chotext,email,password- Khi nhận focus, bề mặt nổi lên và xuất hiện viền; mỗi lần nhập sẽ lan ra gợn sóng từ vị trí con trỏ
- Hỗ trợ
disabledvàreadonly
<jelly-label>được liên kết với điều khiển bằngfor- Khi nhấp sẽ focus vào mục tiêu, văn bản nhãn trở thành tên truy cập được, và có thể chỉ định trạng thái bắt buộc cùng kích thước
<jelly-otp>là trình nhập mã dùng một lần cung cấp một ô cho mỗi chữ số- Xử lý nhập, backspace, phím mũi tên, dán và có thể đặt độ dài, màu, kích thước, trạng thái vô hiệu hóa
<jelly-radio>tạo nhóm giữa các mục dùng cùngnametrong cùng một gốc- Hỗ trợ điều hướng bằng phím mũi tên có xét
tabindexdi động và hướng tài liệu
- Hỗ trợ điều hướng bằng phím mũi tên có xét
<jelly-radio-group>là vùng chứaradiogroupcó nhãn dành chojelly-radio- Cung cấp chú giải, bố cục dòng ngang/dọc và truyền kích thước xuống phần tử con
<jelly-range>là thanh trượt hai tay cầm để chọn khoảng giá trị tối thiểu và tối đa- Áp dụng
role="slider", focus và ARIA cho cả hai tay cầm; khi kéo, tay cầm jelly sẽ bị nhấn xuống
- Áp dụng
<jelly-segmented>là rãnh dạng viên nang chứa các lựa chọn loại trừ lẫn nhau- Chỉ báo lựa chọn hoạt động như viên thuốc jelly nghiêng và kéo giãn khi di chuyển giữa các đoạn
<jelly-select>là dropdown liên kết biểu mẫu dùng mẫu ARIAcombobox·listbox- Cả trigger lẫn bảng tùy chọn đều được tạo bằng bề mặt soft-body
- Bảng mở ra từ trường và sẽ chuyển lên phía trên nếu phía dưới không đủ chỗ
<jelly-slider>là thanh trượt chọn một giá trị duy nhất- Input
rangegốc ẩn đảm nhiệm ngữ nghĩa và tham gia biểu mẫu, còn trên màn hình hiển thị tay cầm jelly có thể bị nhấn
- Input
<jelly-switch>là công tắc có thể kéo, với tay cầm kéo giãn như giọt lỏng và màu bật/tắt chuyển đổi chéo nhau<jelly-textarea>tự động tăng chiều cao giữa mức tối thiểu và tối đa theo nội dung nhiều dòng- Bề mặt cũng giãn theo chiều cao, khi nhập sẽ có gợn sóng tại vị trí con trỏ, và hỗ trợ
disabledcùngreadonly
- Bề mặt cũng giãn theo chiều cao, khi nhập sẽ có gợn sóng tại vị trí con trỏ, và hỗ trợ
Trạng thái và phản hồi
<jelly-alert>là banner cung cấp bốn tônginfo,success,warning,dangercùng nút đóng tùy chọn<jelly-badge>là phần tử nhỏ dùng cho badge, tag hoặc hiển thị trạng thái; sẽ nảy bật khi văn bản thay đổi- Có thể thiết lập dạng tô đầy/viền ngoài, dạng viên thuốc/hình chữ nhật và hành vi
live,instant
- Có thể thiết lập dạng tô đầy/viền ngoài, dạng viên thuốc/hình chữ nhật và hành vi
<jelly-progress>là thanh tiến trình có phần đầu vùng tô đầy rung lắc theo tiến độ- Ở chế độ không xác định, một khối sẽ nảy qua lại giữa hai mép
<jelly-skeleton>là placeholder tải có chuyển động đung đưa nhẹ như đang thở thay vì hiệu ứng lấp lánh- Hỗ trợ các dạng
line,rect,circle
- Hỗ trợ các dạng
<jelly-spinner>cung cấp chỉ báodotsdạng khối nhớt di chuyển giữa ba điểm và chỉ báoblobxoay trong khi đổi hình<jelly-toaster>quản lý thông báo toast xuất hiện rồi biến mất từ phía cuối inline- Thường được gọi bằng helper
jellyToast('Saved!', { tone: 'success' }) - Khi đặt
position="bottom"cho phần tử bố trí, chồng thông báo sẽ phát triển lên phía trên
- Thường được gọi bằng helper
Bề mặt nội dung
<jelly-accordion>nhóm nhiều mục<jelly-collapsible>lại với nhau- Trong chế độ
single, khi một mục mở ra thì các mục còn lại sẽ đóng lại kiểu nảy bật
- Trong chế độ
<jelly-card>là vùng chứa bề mặt jelly đặt phía dưới nội dung- Thêm
squishsẽ khiến nó bị nhấn như đệm mềm và hoạt động như nút bấm
- Thêm
<jelly-chip>có thể dùng như nhãn tĩnh, bộ lọc chuyển đổi hoặc tag có thể xóa- Có thể thiết lập khả năng chọn, trạng thái được chọn, khả năng xóa và vô hiệu hóa
<jelly-collapsible>là vùng mở/đóng dùng nút tiêu đề để bật mở và đóng panel theo kiểu nảy- Được thiết kế để bề mặt chuyển động, không phải văn bản
<jelly-divider>là đường phân cách mảnh theo chiều ngang, dọc hoặc có nhãn<jelly-kbd>là keycap jelly có thể nhấn thử- Nếu liên kết với phím thực bằng
key, keycap cũng sẽ hạ xuống trong lúc nhấn phím đó ở bất kỳ đâu trên trang
- Nếu liên kết với phím thực bằng
Điều hướng và bố cục
<jelly-resizable>là lưới panel cho phép kéo đường phân cách jelly hoặc dùng bàn phím để đổi kích thước- Hỗ trợ các hướng
row,vertical,both
- Hỗ trợ các hướng
<jelly-tabs>là giao diện tab dùng ngữ nghĩatablistthực- Chỉ báo chọn dạng viên thuốc jelly di chuyển và panel tab xuất hiện với hiệu ứng nảy
Lớp phủ
<jelly-dialog>là hộp thoại modal xuất hiện với độ nảy kiểu jelly- Khóa trang và sau khi đóng sẽ trả focus về vị trí trước đó
- Có thể đóng bằng phím Escape, nút đóng hoặc nhấp nền
<jelly-drawer>là floating sheet xuất hiện với hiệu ứng lò xo hơi vượt quá rồi quay lại từ mép- Có thể mở từ đầu/cuối inline hoặc từ bên dưới
<jelly-popover>là panel không modal mở bằng thao tác nhấp- Được neo vào trigger và đóng bằng phím Escape hoặc nhấp ra ngoài
- Hỗ trợ các vị trí
top,bottom,start,end
<jelly-tooltip>hiển thị bong bóng giao diện mềm có áp dụng theme phía trên trigger khi rê chuột hoặc nhận focus bằng bàn phím- Hỗ trợ bố trí bốn hướng và ba kích thước
1 bình luận
Ý kiến trên Hacker News
Cửa sổ hơi giật nên tôi đã đào sâu tìm nguyên nhân; thư viện này chạy vòng lặp animation requestAnimationFrame (RAF) mỗi 8ms trên tất cả component của trang và khiến toàn bộ tài liệu được vẽ lại
Chú thích ở trên nói “xử lý các component đang hoạt động cùng nhau trong một frame và dừng khi nhàn rỗi” cũng có vẻ do AI tạo.
JellyEnginekhông chỉ tính toán animation thạch khi có sự kiện con trỏ, mà tính toán lại mọi component đang hoạt động trên trang ở mỗi frame. Với người bình thường nhìn vào thì đây là kiểu triển khai khiến họ nói “không nên làm thế này, quá tay rồi”Set()đang hoạt động và loại bỏ chúng khi chuyển động dừng lạiTôi đồng ý là chú thích hơi giống AI tạo đại, nhưng không thấy vấn đề rõ ràng trong chính cách tiếp cận; khi không có thao tác nào, vòng lặp lõi kết thúc chỉ trong vài micro giây
Tôi thích, nhưng có vẻ không phù hợp với thực hành UX tiêu chuẩn
Theo tôi, nếu đang nhấn giữ rồi di chuột ra ngoài phần tử thì không nên được tính là click. Hiện tại button thì bị tính là click, còn checkbox thì không, nên thiếu nhất quán
Thật sự dễ thương, và tôi cũng thích việc nó tự nhiên giảm bớt tính năng trong
@media (prefers-reduced-motion: reduce)Tuy vậy, trên trang demo sẽ tốt hơn nếu người dùng có thể ghi đè tùy chọn này mà không cần đổi cài đặt hệ thống, hoặc ít nhất có thông báo rằng animation không được hiển thị
Mỗi lần có một demo thú vị như thế này, tôi lại mất một lúc mới nhớ ra cài đặt đó; trong lúc đó thì cứ bấm với vẻ thất vọng, nghĩ “có gì đặc biệt đâu?”
Nếu còn trẻ thì chắc tôi đã rất thích, nhưng dạo này tôi dành nhiều thời gian hơn để loại bỏ các hiệu ứng kiểu này bằng stylesheet cục bộ hoặc dùng dark mode và reader mode. Thời thế thay đổi nhiều thật
Sẽ hay hơn nếu hiệu ứng cũng xuất hiện với cường độ nhẹ khi hover chuột. Có vẻ một số control như thanh tiến trình và toast không có hiệu ứng thạch
Hiệu năng của trang demo cũng không tốt lắm và có cảm giác như nó chặn/cuỗm thao tác cuộn, nhưng nhìn chung khá dễ thương và có vẻ hợp với UI game
Phần tử
Chipnên chuyển đổi trong khi vẫn ở nguyên vị trí, nhưng khi click thì nó văng ra ngoài biên, nên tôi không thíchDễ thương, nhưng độ phản hồi của một số control quá tệ. Khi kéo slider qua lại, nó tụt lại rất xa sau con trỏ chuột; lẽ ra phải bám theo con trỏ như được dán keo
Ngược lại, các control khác như
jelly-resizablelại bám con trỏ khá tốt. Control"Placeholder"có vẻ không làm biến mất placeholder khi clickKhông biết có ai còn nhớ trên website, blog và showcase của Paul Neave khoảng giai đoạn 2007–2010 từng có hiệu ứng thạch tương tự ở viền trang không. Khi đó được triển khai bằng Flash
Thời ấy Paul Neave là một người hùng cá nhân của tôi; nếu anh ấy đọc được dòng này thì mong anh vẫn khỏe
Tôi rất khó tìm thấy bất cứ thứ gì có thể gọi là hiệu ứng vật lý trong hệ thống thiết kế UI này
Có thể là do dạng rối loạn sắc giác của tôi hoặc do thiết lập màn hình, nhưng màu đỏ và màu hổ phách quá giống nhau đến mức tôi thậm chí không phân biệt được mình đã nhấn button hay chưa