- Jelly UI v1.1 adalah library web component tanpa dependensi yang menggabungkan kontrol formulir nyata dengan efek fisika soft body yang empuk, menyediakan 40 custom element
- Dipasang dengan satu skrip modul, serta mendukung dark mode, pelacakan otomatis tema sistem operasi, perubahan warna aksen, dan tata letak RTL dari kanan ke kiri
- Tombol menggunakan
<button>native, sementara slider memakai inputrangetersembunyi untuk mempertahankan struktur semantik native bagi operasi keyboard, screen reader, dan partisipasi formulir - Menerapkan animasi taktil seperti ditekan, meregang, riak, dan memantul pada berbagai elemen, mulai dari checkbox dan kolom input hingga toast, tab, dan dialog
- Dengan token warna WCAG AA dan pola ARIA bawaan, Anda dapat membangun antarmuka produk yang aksesibel sambil tetap mempertahankan efek visual yang halus
Instalasi dan tema
- Jelly UI dapat digunakan tanpa dependensi, hanya dengan 40 custom element dan satu tag
<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>adalah penyedia tema yang menerapkan token desain secara terbatas pada subtree di bawahnyamodemendukungauto,light, dandark, sehingga dapat mengikuti pengaturan sistem operasi atau memaksa tema tertentuaccentdapat digunakan untuk menetapkan ulang warna aksen
- Variasi warna umum mencakup
azure,rose,amber,mint,graphite,platinum,white, sementara ukuran umumnya terdiri darismall,medium,large
Tombol dan elemen aksi
<jelly-button>adalah tombol berbentuk kapsul yang memasukkan<button>native sungguhan di dalamnya untuk mendukung keyboard dan screen reader- Dapat mengatur warna, ukuran, bentuk
pillatausquare, status nonaktif, dan tata letak blok
- Dapat mengatur warna, ukuran, bentuk
<jelly-icon-button>adalah tombol persegi atau bundar yang disesuaikan untuk satu ikon- Atribut
labeldigunakan untuk menentukan nama yang dikenali screen reader
- Atribut
Kontrol input formulir
<jelly-checkbox>berpartisipasi dalam formulir, mendukungcheckeddan status tidak tentu (indeterminate), dan saat status berubah, kotak jelly memantul ke atas<jelly-input>adalah kolom input satu baris untuktext,email, danpassword- Saat mendapat fokus, permukaannya terangkat dan border muncul; setiap kali mengetik, riak menyebar dari posisi kursor
- Mendukung
disableddanreadonly
<jelly-label>terhubung ke kontrol melaluifor- Saat diklik, fokus berpindah ke target dan teks label menjadi nama yang aksesibel; status wajib dan ukuran dapat ditentukan
<jelly-otp>adalah input kode sekali pakai yang menyediakan satu kotak untuk setiap digit- Menangani input, backspace, tombol panah, dan paste, serta dapat mengatur panjang, warna, ukuran, dan status nonaktif
<jelly-radio>membentuk grup antar item yang berbaginameyang sama dalam root yang sama- Mendukung
tabindexyang dapat berpindah dan navigasi tombol panah yang mempertimbangkan arah dokumen
- Mendukung
<jelly-radio-group>adalah kontainerradiogroupberlabel untukjelly-radio- Menyediakan legend, tata letak alur horizontal atau vertikal, dan penerusan ukuran ke elemen anak
<jelly-range>adalah slider dua handle untuk memilih rentang nilai minimum dan maksimum- Menerapkan
role="slider", fokus, dan ARIA pada kedua handle; saat diseret, handle jelly akan tertekan
- Menerapkan
<jelly-segmented>adalah track berbentuk kapsul yang berisi pilihan yang saling eksklusif- Indikator pilihan bergerak di antara segmen sambil miring dan meregang seperti pil jelly
<jelly-select>adalah dropdown yang terhubung ke formulir dan menggunakan pola ARIAcombobox/listbox- Trigger dan panel opsi sama-sama tersusun dari permukaan soft body
- Panel terbuka dari field, dan jika ruang di bawah tidak cukup, panel beralih ke atas
<jelly-slider>adalah slider untuk memilih satu nilai- Input
rangenative tersembunyi menangani struktur semantik dan partisipasi formulir, sementara di layar ditampilkan handle jelly yang dapat ditekan
- Input
<jelly-switch>adalah switch yang dapat diseret; handle-nya meregang seperti tetesan cairan, dan warna off/on berganti silang<jelly-textarea>otomatis membesar di antara tinggi minimum dan maksimum sesuai input multi-baris- Permukaannya juga meregang mengikuti tinggi, riak muncul dari posisi kursor saat mengetik, dan mendukung
disabledsertareadonly
- Permukaannya juga meregang mengikuti tinggi, riak muncul dari posisi kursor saat mengetik, dan mendukung
Status dan umpan balik
<jelly-alert>adalah banner yang menyediakan empat tone:info,success,warning,danger, serta tombol tutup opsional<jelly-badge>adalah elemen kecil untuk badge, tag, atau indikator status, yang memantul saat teks berubah- Dapat mengatur bentuk isi atau outline, bentuk pil atau persegi, serta perilaku
livedaninstant
- Dapat mengatur bentuk isi atau outline, bentuk pil atau persegi, serta perilaku
<jelly-progress>adalah progress bar yang bagian depan isiannya bergoyang mengikuti progres- Dalam mode tidak tentu, gumpalan memantul di antara kedua dinding
<jelly-skeleton>adalah placeholder loading yang bergoyang lembut seperti bernapas, bukan berkilau- Mendukung bentuk
line,rect, dancircle
- Mendukung bentuk
<jelly-spinner>menyediakan indikatordotsberbentuk gumpalan lendir yang bergerak di antara tiga titik, serta indikatorblobyang berputar sambil berubah bentuk<jelly-toaster>mengelola notifikasi toast yang muncul dari arah ujung inline lalu menghilang- Umumnya dipanggil dengan helper
jellyToast('Saved!', { tone: 'success' }) - Jika elemen yang ditempatkan diberi
position="bottom", tumpukan notifikasi akan tumbuh ke atas
- Umumnya dipanggil dengan helper
Permukaan konten
<jelly-accordion>mengelompokkan beberapa item<jelly-collapsible>- Dalam mode
single, saat satu item terbuka, item lain menutup dengan efek memantul
- Dalam mode
<jelly-card>adalah kontainer permukaan jelly yang berada di bawah konten- Jika
squishditambahkan, elemen akan berperan sebagai tombol sambil tertekan seperti bantalan lembut
- Jika
<jelly-chip>dapat digunakan sebagai label statis, filter yang dapat di-toggle, atau tag yang dapat dihapus- Mengatur apakah dapat dipilih, status terpilih, dapat dihapus, dan nonaktif
<jelly-collapsible>adalah area buka/tutup yang membuka dan menutup panel dengan efek memantul melalui tombol header- Disusun agar permukaannya yang bergerak, bukan teksnya
<jelly-divider>adalah garis pemisah tipis horizontal, vertikal, atau berlabel<jelly-kbd>adalah keycap jelly yang bisa ditekan- Jika dikaitkan dengan tombol nyata melalui
key, keycap juga akan turun selama tombol tersebut ditekan di mana pun pada halaman
- Jika dikaitkan dengan tombol nyata melalui
Navigasi dan tata letak
<jelly-resizable>adalah grid panel yang ukurannya dapat disesuaikan dengan menyeret divider jelly atau menggunakan keyboard- Mendukung arah
row,vertical, danboth
- Mendukung arah
<jelly-tabs>adalah tampilan tab yang menggunakan struktur semantiktablistsungguhan- Indikator pilihan berbentuk pil jelly bergerak, dan panel tab muncul dengan efek memantul
Overlay
<jelly-dialog>adalah dialog modal yang muncul dengan pantulan seperti jelly- Mengunci halaman dan mengembalikan fokus ke posisi sebelumnya setelah ditutup
- Dapat ditutup dengan tombol Escape, tombol tutup, atau klik latar belakang
<jelly-drawer>adalah floating sheet yang muncul dengan efek pegas, sedikit melewati ujung lalu kembali- Dapat dibuka dari awal atau akhir inline, atau dari bawah
<jelly-popover>adalah panel non-modal yang dibuka dengan klik- Terkunci pada trigger dan tertutup dengan tombol Escape atau klik di luar
- Mendukung penempatan
top,bottom,start, danend
<jelly-tooltip>menampilkan balon teks bertema di atas trigger saat mouse diarahkan atau fokus keyboard diterima- Mendukung empat arah penempatan dan tiga ukuran
1 komentar
Komentar Hacker News
Jendelanya agak tersendat, jadi saya mencoba menggali penyebabnya, dan library ini ternyata menjalankan loop animasi requestAnimationFrame (RAF) setiap 8ms di semua komponen pada halaman sehingga seluruh dokumen digambar ulang
Komentar di atas yang berbunyi “memproses komponen aktif bersama dalam satu frame dan berhenti saat idle” juga terasa seperti dibuat AI.
JellyEnginetidak menghitung animasi jelly hanya saat event pointer terjadi, tetapi menghitung ulang semua komponen aktif di halaman pada setiap frame. Bagi kebanyakan orang, ini akan terlihat seperti implementasi yang membuat orang berkata, “ini tidak seharusnya dilakukan, terlalu berlebihan”Set()aktif dan menghapusnya saat gerakan berhentiSaya setuju komentarnya memang terasa agak asal dibuat AI, tetapi saya tidak menemukan masalah yang jelas pada pendekatannya, dan saat tidak ada apa pun yang terjadi, loop intinya selesai hanya dalam beberapa mikrodetik
Saya suka, tetapi sepertinya tidak sesuai dengan praktik UX standar
Jika mouse dipindahkan ke luar elemen saat masih ditekan, menurut saya itu tidak seharusnya dihitung sebagai klik. Saat ini tombol dihitung sebagai klik, tetapi checkbox tidak, jadi tidak konsisten
Ini sungguh imut, dan saya juga suka bahwa fitur ini secara alami dikurangi di
@media (prefers-reduced-motion: reduce)Namun, di situs demo akan lebih baik jika pengguna bisa menimpanya tanpa mengubah pengaturan sistem, atau setidaknya ada pemberitahuan bahwa animasi tidak ditampilkan
Setiap kali demo keren seperti ini muncul, saya butuh waktu sejenak untuk mengingat pengaturan itu, dan selama itu saya mengklik sambil kecewa, berpikir “apa yang spesial di sini?”
Kalau saya masih muda, saya pasti akan sangat menyukainya, tetapi belakangan ini saya lebih banyak menghabiskan waktu menghapus efek seperti ini lewat stylesheet lokal atau memakai mode gelap dan mode baca. Zaman memang banyak berubah
Akan bagus jika efeknya juga muncul dengan intensitas lemah saat hover. Beberapa kontrol seperti progress bar dan toast tampaknya tidak memiliki efek jelly
Performa halaman demo juga tidak terlalu bagus dan terasa seperti merebut scroll, tetapi secara keseluruhan tetap lucu dan tampaknya cocok untuk UI game
Elemen
Chipseharusnya tetap di tempat saat bertransisi, tetapi ketika diklik ia keluar dari batasnya, dan saya tidak menyukainyaLucu, tetapi kecepatan respons beberapa kontrol terlalu buruk. Jika slider diseret maju-mundur, ia tertinggal jauh dari kursor mouse, padahal seharusnya mengikuti kursor seperti menempel dengan lem
Sebaliknya, kontrol lain seperti
jelly-resizablebergerak dengan baik mengikuti kursor. Kontrol"Placeholder"tampaknya tidak menghilangkan placeholder meskipun diklikSaya penasaran apakah ada yang ingat bahwa sekitar 2007~2010, di situs, blog, dan showcase Paul Neave ada efek jelly serupa di tepi halaman. Waktu itu dibuat dengan Flash
Pada masa itu Paul Neave adalah pahlawan pribadi saya, dan jika ia membaca ini, semoga kabarnya baik
Sulit menemukan sesuatu yang benar-benar bisa disebut efek fisika dalam sistem desain UI ini
Mungkin karena jenis buta warna saya atau pengaturan monitor saya, tetapi merah dan amber terlihat terlalu mirip sehingga saya bahkan tidak bisa membedakan apakah tombolnya sudah ditekan