Kredit
Dari mana composable di sini berasal, dan kewajiban lisensi yang menyertainya.
Composable di registry ini ditulis dari nol dengan Vue. Tidak ada satu baris pun kode React di dalamnya, dan tidak ada paket React yang ikut terpasang.
Yang tidak ditulis dari nol adalah keputusan desainnya: nama fungsinya, nama opsinya, bentuk nilai yang dikembalikan, dan perilaku yang dijanjikan tiap composable. Semua itu diambil dari pustaka yang sudah lebih dulu ada. Karena itulah useCounter di sini menerima { min, max } dan bukan { batasBawah, batasAtas } — supaya orang yang sudah tahu bentuknya tidak perlu belajar ulang.
Meminjam bentuk API dari karya berlisensi MIT menjadikan hasilnya karya turunan, dan MIT meminta satu hal sebagai gantinya: pemberitahuan hak ciptanya ikut disertakan. Halaman ini dan berkas LICENSE adalah tempat kewajiban itu dipenuhi.
Halaman ini khusus composable. Rantai lisensi seluruh registry — komponen, block, dan varian — ada di Kredit.
Rantainya
Sumber langsungnya satu:
shadcn-hooks — MIT, Copyright (c) 2025 Brendan Dash. Dari sinilah katalognya, pengelompokannya, nama tiap composable, serta bentuk opsi dan nilai kembaliannya berasal.
Sebagian bentuk itu berasal lebih jauh ke hulu, dan shadcn-hooks mencantumkannya di halaman masing-masing. Ketiganya MIT:
| Hulu | Composable yang bentuknya berasal dari sana |
|---|---|
| ahooks | useBoolean, useClickAway, useControllableValue, useCreation, useDebounce, useDebounceFn, useDebounceEffect, useEventListener, useHover, useInViewport, useInterval, useMemoizedFn, useMount, useNetwork, usePrevious, useResetState, useTextSelection, useThrottle, useThrottleFn, useThrottleEffect, useTimeout, useUnmount, useUpdate, useUpdateEffect, useWhyDidYouUpdate |
| usehooks-ts | useClickAnyWhere, useIsomorphicLayoutEffect, useScrollLock |
| react-use | useCustomCompareEffect, useDeepCompareEffect, useDeepCompareLayoutEffect |
Dua belas nama di tabel itu tidak dikirim berkasnya — halamannya menunjuk padanan bawaan Vue. Namanya tetap dicantumkan di sini karena katalog dan halamannya tetap berutang pada sumbernya, terpasang atau tidak.
Sisa composable di registry ini tidak punya jejak hulu di luar shadcn-hooks sendiri.
Rantai lengkapnya, dari hulu ke hilir:
ahooks / usehooks-ts / react-use (MIT) → shadcn-hooks (MIT) → Kliping (MIT)
Registry komponen Kliping punya rantainya sendiri — shadcn/ui → shadcn-vue → Kliping — dan itu sudah tercatat di LICENSE sejak awal.
Yang berubah dalam perjalanan
Meminjam bentuk API bukan berarti meminjam isinya. Sebagian besar composable di sini justru berbeda jauh dari asalnya, dan bedanya bukan gaya penulisan:
Lima belas hook tidak dikirim sama sekali. useLatest, useMemoizedFn, useCreation, useMount, useUpdateEffect dan kawan-kawannya menyelesaikan masalah yang tidak pernah ada di Vue: badan komponen yang dijalankan ulang tiap kali state berubah. setup() berjalan sekali. Halamannya tetap ada — supaya polanya bisa dicari dan ditemukan — tapi isinya menunjuk padanan bawaan Vue-nya, bukan perintah pemasangan. Lihat Pengenalan untuk daftarnya.
Pembersihannya lewat scope, bukan lewat komponen. Tiap pendengar, pengamat, dan timer dilepas di onScopeDispose(). Yang di sumbernya bergantung pada siklus hidup komponen, di sini bergantung pada effectScope — jadi composable yang dipanggil dari composable lain, atau dari scope lepas, tetap bersih.
Argumennya menerima MaybeRefOrGetter. Nilai, ref, atau getter sama-sama diterima dan dibaca lewat toValue(). Ini bentuk yang tidak punya padanan di sumbernya, dan yang membuat composable-nya terasa seperti bagian dari Vue.
Nol dependensi. useDebounceFn dan useThrottleFn di hulu membungkus es-toolkit; di sini keduanya ditulis sendiri.
Kalau Anda pemilik salah satu karya di atas
Kalau ada atribusi yang kurang tepat atau kurang lengkap di halaman ini, bukalah issue — akan diperbaiki.