{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "TungShadcn", "homepage": "https://react-19.octung112.workers.dev", "items": [ { "name": "copy", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-slot" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/copy.tsx", "type": "registry:component", "target": "components/ui/copy.tsx" } ] }, { "name": "copy-button", "author": "hihahihahoho", "dependencies": [ "lucide-react", "sonner" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/copy.json", "https://react-19.octung112.workers.dev/r/button.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/copy-button.tsx", "type": "registry:component", "target": "components/ui/copy-button.tsx" } ] }, { "name": "sticky", "author": "hihahihahoho", "title": "Sticky", "description": "Detect when sticky positioned elements become stuck using IntersectionObserver with sentinel pattern", "dependencies": [ "@radix-ui/react-slot" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/compose-refs.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/sticky.tsx", "type": "registry:component", "target": "components/ui/sticky.tsx" } ] }, { "name": "utils-plus", "author": "hihahihahoho", "type": "registry:lib", "homepage": "https://react-19.octung112.workers.dev/r/utils-plus.json", "files": [ { "path": "src/lib/utils-plus.ts", "type": "registry:lib", "target": "lib/utils-plus.ts" } ] }, { "name": "zod", "author": "hihahihahoho", "dependencies": [ "date-fns", "zod" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/const.json", "https://react-19.octung112.workers.dev/r/file-size.json" ], "type": "registry:lib", "files": [ { "path": "src/lib/zod.ts", "type": "registry:lib", "target": "lib/zod.ts" }, { "path": "src/lib/const.ts", "type": "registry:lib", "target": "lib/const.ts" }, { "path": "src/lib/file-size.ts", "type": "registry:lib", "target": "lib/file-size.ts" } ] }, { "name": "transliterate-vietnamese", "author": "hihahihahoho", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/transliterate-vietnamese.ts", "type": "registry:lib", "target": "lib/transliterate-vietnamese.ts" } ] }, { "name": "locale-date", "author": "hihahihahoho", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/locale-date.ts", "type": "registry:lib", "target": "lib/locale-date.ts" } ] }, { "name": "get-node-text", "author": "hihahihahoho", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/get-node-text.ts", "type": "registry:lib", "target": "lib/get-node-text.ts" } ] }, { "name": "fuzzy-search", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/transliterate-vietnamese.json" ], "type": "registry:lib", "files": [ { "path": "src/lib/fuzzy-search.ts", "type": "registry:lib", "target": "lib/fuzzy-search.ts" }, { "path": "src/lib/transliterate-vietnamese.ts", "type": "registry:lib", "target": "lib/transliterate-vietnamese.ts" } ] }, { "name": "file-size", "author": "hihahihahoho", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/file-size.ts", "type": "registry:lib", "target": "lib/file-size.ts" } ] }, { "name": "const", "author": "hihahihahoho", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/const.ts", "type": "registry:lib", "target": "lib/const.ts" } ] }, { "name": "button", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-slot", "class-variance-authority" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/button.tsx", "type": "registry:component", "target": "components/ui/button.tsx" } ] }, { "name": "password-validator", "author": "hihahihahoho", "dependencies": [ "lucide-react", "zod" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/password-validator.tsx", "type": "registry:component", "target": "components/ui/password-validator.tsx" } ] }, { "name": "calendar-range", "author": "hihahihahoho", "dependencies": [ "react-day-picker", "lucide-react", "date-fns" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/calendar.json", "https://react-19.octung112.workers.dev/r/date-time-input.json", "separator", "https://react-19.octung112.workers.dev/r/use-media-query.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/calendar/calendar-range.tsx", "type": "registry:component", "target": "components/ui/calendar/calendar-range.tsx" } ] }, { "name": "calendar", "author": "hihahihahoho", "dependencies": [ "react-day-picker", "lucide-react", "date-fns" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/select.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/calendar/calendar.tsx", "type": "registry:component", "target": "components/ui/calendar/calendar.tsx" }, { "path": "src/components/ui/calendar/calendar.css", "type": "registry:file", "target": "components/ui/calendar/calendar.css" } ] }, { "name": "context-menu", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-context-menu", "lucide-react" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/context-menu.tsx", "type": "registry:component", "target": "components/ui/context-menu.tsx" } ] }, { "name": "data-row", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/data-row.tsx", "type": "registry:component", "target": "components/ui/data-row.tsx" } ] }, { "name": "alert", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/alert.tsx", "type": "registry:component", "target": "components/ui/alert.tsx" } ] }, { "name": "tabs-core", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-tabs", "class-variance-authority", "motion" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/use-scroll-into-view.json", "https://react-19.octung112.workers.dev/r/use-wheel-scroll.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/tabs/tabs-core.tsx", "type": "registry:component", "target": "src/components/ui/tabs/tabs-core.tsx" } ] }, { "name": "tabs", "author": "hihahihahoho", "registryDependencies": [ "https://react-19.octung112.workers.dev/r/tabs-core.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/tabs/tabs.tsx", "type": "registry:component", "target": "src/components/ui/tabs/tabs.tsx" }, { "path": "src/components/ui/tabs/tabs-core.tsx", "type": "registry:component", "target": "src/components/ui/tabs/tabs-core.tsx" } ] }, { "name": "tabs-line", "author": "hihahihahoho", "registryDependencies": [ "https://react-19.octung112.workers.dev/r/tabs-core.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/tabs/tabs-line.tsx", "type": "registry:component", "target": "src/components/ui/tabs/tabs-line.tsx" }, { "path": "src/components/ui/tabs/tabs-core.tsx", "type": "registry:component", "target": "src/components/ui/tabs/tabs-core.tsx" } ] }, { "name": "circle-progress", "author": "hihahihahoho", "dependencies": [ "class-variance-authority" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/circle-progress.tsx", "type": "registry:component", "target": "components/ui/circle-progress.tsx" } ] }, { "name": "typography", "author": "hihahihahoho", "dependencies": [ "class-variance-authority" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/typography.tsx", "type": "registry:component", "target": "components/ui/typography.tsx" } ] }, { "name": "sonner", "author": "hihahihahoho", "dependencies": [ "sonner" ], "type": "registry:component", "files": [ { "path": "src/components/ui/sonner.tsx", "type": "registry:component", "target": "components/ui/sonner.tsx" }, { "path": "src/components/ui/button.tsx", "type": "registry:component", "target": "components/ui/button.tsx" } ] }, { "name": "scroll-area", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-scroll-area" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/compose-refs.json", "https://react-19.octung112.workers.dev/r/use-scroll-position.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/scroll-area.tsx", "type": "registry:component", "target": "components/ui/scroll-area.tsx" } ] }, { "name": "photoswipe", "author": "hihahihahoho", "title": "PhotoSwipe Gallery", "description": "Responsive lightbox gallery with zoom, swipe, and video/PDF support", "dependencies": [ "photoswipe", "react-photoswipe-gallery" ], "registryDependencies": [ "skeleton" ], "type": "registry:component", "css": { "@import \"./styles/photoswipe.css\"": {} }, "files": [ { "path": "src/components/ui/photoswipe.tsx", "type": "registry:component", "target": "components/ui/photoswipe.tsx" }, { "path": "src/styles/photoswipe.css", "type": "registry:file", "target": "styles/photoswipe.css" } ] }, { "name": "pagination", "author": "hihahihahoho", "dependencies": [ "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/use-media-query.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/pagination.tsx", "type": "registry:component", "target": "components/ui/pagination.tsx" }, { "path": "src/components/ui/button.tsx", "type": "registry:component", "target": "components/ui/button.tsx" } ] }, { "name": "glass-icon", "author": "hihahihahoho", "dependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/glass-icon.tsx", "type": "registry:component", "target": "components/ui/glass-icon.tsx" } ] }, { "name": "empty-state", "author": "hihahihahoho", "dependencies": [ "lucide-react" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/empty-state.tsx", "type": "registry:component", "target": "components/ui/empty-state.tsx" } ] }, { "name": "drawer", "author": "hihahihahoho", "dependencies": [ "vaul" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/drawer.tsx", "type": "registry:component", "target": "components/ui/drawer.tsx" } ] }, { "name": "responsive-popover", "author": "hihahihahoho", "title": "Responsive Popover", "description": "A responsive popover that switches between Popover (desktop) and Drawer (mobile)", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/drawer.json", "popover", "https://react-19.octung112.workers.dev/r/use-media-query.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/responsive-popover.tsx", "type": "registry:component", "target": "components/ui/responsive-popover.tsx" } ] }, { "name": "dialog", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-dialog" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/dialog.tsx", "type": "registry:component", "target": "components/ui/dialog.tsx" } ] }, { "name": "custom-icons", "author": "hihahihahoho", "dependencies": [], "type": "registry:component", "files": [ { "path": "src/components/ui/custom-icons.tsx", "type": "registry:component", "target": "components/ui/custom-icons.tsx" } ] }, { "name": "command", "author": "hihahihahoho", "dependencies": [ "cmdk" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/transliterate-vietnamese.json", "https://react-19.octung112.workers.dev/r/command-primitive-input.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/command.tsx", "type": "registry:component", "target": "components/ui/command.tsx" }, { "path": "src/components/ui/dialog.tsx", "type": "registry:component", "target": "components/ui/dialog.tsx" } ] }, { "name": "avatar", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-avatar", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/avatar.tsx", "type": "registry:component", "target": "components/ui/avatar.tsx" } ] }, { "name": "input", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/compose-refs.json", "https://react-19.octung112.workers.dev/r/get-node-text.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/input/input.tsx", "type": "registry:component", "target": "components/ui/input/input.tsx" }, { "path": "src/components/ui/input/input-form.tsx", "type": "registry:component", "target": "components/ui/input/input-form.tsx" } ] }, { "name": "signature-pad", "author": "hihahihahoho", "title": "Signature Pad", "description": "A smooth signature drawing component based on signature_pad library with form integration and undo/redo support.", "dependencies": [ "signature_pad", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "button-group", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils", "https://react-19.octung112.workers.dev/r/compose-refs.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/signature-pad/signature-pad.tsx", "type": "registry:component", "target": "components/ui/signature-pad/signature-pad.tsx" }, { "path": "src/components/ui/signature-pad/signature-pad-form.tsx", "type": "registry:component", "target": "components/ui/signature-pad/signature-pad-form.tsx" } ] }, { "name": "input-otp", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "input-otp" ], "type": "registry:component", "files": [ { "path": "src/components/ui/input-otp-form.tsx", "type": "registry:component", "target": "components/ui/input-otp-form.tsx" } ] }, { "name": "slider", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-slider" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/slider.tsx", "type": "registry:component", "target": "components/ui/slider.tsx" }, { "path": "src/components/ui/slider-form.tsx", "type": "registry:component", "target": "components/ui/slider-form.tsx" } ] }, { "name": "input-number", "author": "hihahihahoho", "dependencies": [ "@maskito/core", "@maskito/kit", "@maskito/react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/compose-refs.json", "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/input/input-number.tsx", "type": "registry:component", "target": "components/ui/input/input-number.tsx" }, { "path": "src/components/ui/input/input-number-form.tsx", "type": "registry:component", "target": "components/ui/input/input-number-form.tsx" } ] }, { "name": "input-tag", "author": "hihahihahoho", "dependencies": [ "@radix-ui/rect", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/avatar.json", "https://react-19.octung112.workers.dev/r/badge.json", "https://react-19.octung112.workers.dev/r/command.json", "https://react-19.octung112.workers.dev/r/form.json", "popover", "tooltip", "https://react-19.octung112.workers.dev/r/select.json", "https://react-19.octung112.workers.dev/r/select-command.json", "https://react-19.octung112.workers.dev/r/use-history-state.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json", "https://react-19.octung112.workers.dev/r/compose-refs.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/input/input-tag.tsx", "type": "registry:component", "target": "components/ui/input/input-tag.tsx" }, { "path": "src/components/ui/input/input-tag-form.tsx", "type": "registry:component", "target": "components/ui/input/input-tag-form.tsx" }, { "path": "src/components/ui/input/input.tsx", "type": "registry:component", "target": "components/ui/input/input.tsx" } ] }, { "name": "input-auto-complete", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/command.json", "https://react-19.octung112.workers.dev/r/form.json", "popover", "https://react-19.octung112.workers.dev/r/select-command.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils", "https://react-19.octung112.workers.dev/r/compose-refs.json", "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/transliterate-vietnamese.json", "https://react-19.octung112.workers.dev/r/utils-plus.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/input/input-auto-complete.tsx", "type": "registry:component", "target": "components/ui/input/input-auto-complete.tsx" }, { "path": "src/components/ui/input/input-auto-complete-form.tsx", "type": "registry:component", "target": "components/ui/input/input-auto-complete-form.tsx" } ] }, { "name": "command-primitive-input", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/command.json", "utils", "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/transliterate-vietnamese.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/input/command-primitive-input.tsx", "type": "registry:component", "target": "components/ui/input/command-primitive-input.tsx" } ] }, { "name": "textarea", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/utils-plus.json", "https://react-19.octung112.workers.dev/r/use-autosize-textarea.json", "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/circle-progress.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/textarea/textarea.tsx", "type": "registry:component", "target": "components/ui/textarea/textarea.tsx" }, { "path": "src/components/ui/textarea/textarea-form.tsx", "type": "registry:component", "target": "components/ui/textarea/textarea-form.tsx" } ] }, { "name": "form", "author": "hihahihahoho", "dependencies": [ "@hookform/resolvers", "react-hook-form", "zod", "@radix-ui/react-slot", "class-variance-authority" ], "registryDependencies": [ "label", "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/custom-icons.json", "utils", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "https://react-19.octung112.workers.dev/r/zod.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/form/form.tsx", "type": "registry:component", "target": "components/ui/form/form.tsx" } ] }, { "name": "zod-schema-context", "author": "hihahihahoho", "dependencies": [ "zod" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/zod.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/form/zod-schema-context.tsx", "type": "registry:component", "target": "components/ui/form/zod-schema-context.tsx" } ] }, { "name": "alert-dialog", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-alert-dialog" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/use-alert-dialog.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/alert-dialog/alert-dialog.tsx", "type": "registry:component", "target": "components/ui/alert-dialog/alert-dialog.tsx" }, { "path": "src/components/ui/alert-dialog/alert-dialog-container.tsx", "type": "registry:component", "target": "components/ui/alert-dialog/alert-dialog-container.tsx" } ] }, { "name": "alert-dialog-container", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/alert-dialog.json", "utils", "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/use-alert-dialog.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/alert-dialog/alert-dialog-container.tsx", "type": "registry:component", "target": "components/ui/alert-dialog/alert-dialog-container.tsx" }, { "path": "src/components/ui/alert-dialog/alert-dialog.tsx", "type": "registry:component", "target": "components/ui/alert-dialog/alert-dialog.tsx" } ] }, { "name": "use-scroll", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/use-is-mounted.json" ], "type": "registry:hook", "files": [ { "path": "src/hooks/use-scroll.ts", "type": "registry:hook", "target": "hooks/use-scroll.ts" } ] }, { "name": "use-media-query", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-media-query.tsx", "type": "registry:hook", "target": "hooks/use-media-query.tsx" } ] }, { "name": "use-file-upload", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/sonner.json", "https://react-19.octung112.workers.dev/r/const.json" ], "type": "registry:hook", "files": [ { "path": "src/hooks/use-file-upload.ts", "type": "registry:hook", "target": "hooks/use-file-upload.ts" } ] }, { "name": "use-is-mounted", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-is-mounted.ts", "type": "registry:hook", "target": "hooks/use-is-mounted.ts" } ] }, { "name": "use-resize-observer", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-resize-observer.ts", "type": "registry:hook", "target": "hooks/use-resize-observer.ts" }, { "path": "src/hooks/use-is-mounted.ts", "type": "registry:hook", "target": "hooks/use-is-mounted.ts" } ] }, { "name": "use-scroll-position", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-scroll-position.ts", "type": "registry:hook", "target": "hooks/use-scroll-position.ts" } ] }, { "name": "use-scroll-into-view", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-scroll-into-view.ts", "type": "registry:hook", "target": "hooks/use-scroll-into-view.ts" } ] }, { "name": "compose-refs", "author": "hihahihahoho", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/compose-refs.ts", "type": "registry:lib", "target": "lib/compose-refs.ts" } ] }, { "name": "use-date-locale-config", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/locale-date.json" ], "type": "registry:hook", "files": [ { "path": "src/hooks/use-date-locale-config.ts", "type": "registry:hook", "target": "hooks/use-date-locale-config.ts" } ] }, { "name": "use-history-state", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-history-state.ts", "type": "registry:hook", "target": "hooks/use-history-state.ts" } ] }, { "name": "use-wheel-scroll", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-wheel-scroll.ts", "type": "registry:hook", "target": "hooks/use-wheel-scroll.ts" } ] }, { "name": "use-toast", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-toast.ts", "type": "registry:hook", "target": "hooks/use-toast.ts" } ] }, { "name": "use-sync-scroll", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-sync-scroll.ts", "type": "registry:hook", "target": "hooks/use-sync-scroll.ts" } ] }, { "name": "use-mobile", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-mobile.tsx", "type": "registry:hook", "target": "hooks/use-mobile.tsx" } ] }, { "name": "use-is-display-none", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-is-display-none.ts", "type": "registry:hook", "target": "hooks/use-is-display-none.ts" } ] }, { "name": "use-alert-dialog", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-alert-dialog.ts", "type": "registry:hook", "target": "hooks/use-alert-dialog.ts" } ] }, { "name": "use-autosize-textarea", "author": "hihahihahoho", "dependencies": [], "type": "registry:hook", "files": [ { "path": "src/hooks/use-autosize-textarea.tsx", "type": "registry:hook", "target": "hooks/use-autosize-textarea.tsx" } ] }, { "name": "date-time-input", "author": "hihahihahoho", "dependencies": [ "date-fns" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/use-date-locale-config.json", "https://react-19.octung112.workers.dev/r/locale-date.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/date-time-input/date-time-input.tsx", "type": "registry:component", "target": "components/ui/date-time-input/date-time-input.tsx" }, { "path": "src/components/ui/date-time-input/date-time-input-group.tsx", "type": "registry:component", "target": "components/ui/date-time-input/date-time-input-group.tsx" } ] }, { "name": "date-time-input-group", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/date-time-input.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/date-time-input/date-time-input-group.tsx", "type": "registry:component", "target": "components/ui/date-time-input/date-time-input-group.tsx" } ] }, { "name": "select-interface", "author": "hihahihahoho", "title": "Select Interface", "description": "TypeScript interface definitions for select components", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/badge.json", "https://react-19.octung112.workers.dev/r/command.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/select/select-interface.ts", "type": "registry:component", "target": "components/ui/select/select-interface.ts" } ] }, { "name": "select-command", "author": "hihahihahoho", "title": "Select Command", "description": "Command-based select dropdown component with search and keyboard navigation", "dependencies": [ "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/avatar.json", "https://react-19.octung112.workers.dev/r/badge.json", "https://react-19.octung112.workers.dev/r/command.json", "https://react-19.octung112.workers.dev/r/checkbox.json", "separator", "https://react-19.octung112.workers.dev/r/select-interface.json", "utils", "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/transliterate-vietnamese.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/select/select-command.tsx", "type": "registry:component", "target": "components/ui/select/select-command.tsx" } ] }, { "name": "select-command-virtualize", "author": "hihahihahoho", "title": "Select Command Virtualize", "description": "Virtualized version of select command for handling large lists efficiently", "dependencies": [ "lucide-react", "virtua" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/badge.json", "https://react-19.octung112.workers.dev/r/command.json", "https://react-19.octung112.workers.dev/r/fuzzy-search.json", "https://react-19.octung112.workers.dev/r/get-node-text.json", "https://react-19.octung112.workers.dev/r/select-command.json", "https://react-19.octung112.workers.dev/r/select-interface.json", "separator", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/select/select-command-virtualize.tsx", "type": "registry:component", "target": "components/ui/select/select-command-virtualize.tsx" } ] }, { "name": "select", "author": "hihahihahoho", "title": "Select", "description": "Advanced select component with search, virtualization, and form integration", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/avatar.json", "https://react-19.octung112.workers.dev/r/badge.json", "https://react-19.octung112.workers.dev/r/command.json", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/select-command.json", "https://react-19.octung112.workers.dev/r/select-command-virtualize.json", "https://react-19.octung112.workers.dev/r/select-interface.json", "https://react-19.octung112.workers.dev/r/responsive-popover.json", "separator", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/select/select.tsx", "type": "registry:component", "target": "components/ui/select/select.tsx" }, { "path": "src/components/ui/select/select-form.tsx", "type": "registry:component", "target": "components/ui/select/select-form.tsx" } ] }, { "name": "multiselect", "author": "hihahihahoho", "title": "Multi Select", "description": "Multi-selection component with search, badges, and form integration", "dependencies": [], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/avatar.json", "https://react-19.octung112.workers.dev/r/badge.json", "https://react-19.octung112.workers.dev/r/command.json", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/select-command.json", "https://react-19.octung112.workers.dev/r/select-command-virtualize.json", "https://react-19.octung112.workers.dev/r/select-interface.json", "https://react-19.octung112.workers.dev/r/responsive-popover.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json", "https://react-19.octung112.workers.dev/r/overflow-group.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/select/multiselect.tsx", "type": "registry:component", "target": "components/ui/select/multiselect.tsx" }, { "path": "src/components/ui/select/multiselect-form.tsx", "type": "registry:component", "target": "components/ui/select/multiselect-form.tsx" } ] }, { "name": "badge", "author": "hihahihahoho", "dependencies": [ "class-variance-authority", "lucide-react" ], "registryDependencies": [ "tooltip", "utils", "https://react-19.octung112.workers.dev/r/use-media-query.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/badge.tsx", "type": "registry:component", "target": "components/ui/badge.tsx" } ] }, { "name": "overflow-group", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-slot" ], "registryDependencies": [ "utils", "https://react-19.octung112.workers.dev/r/use-media-query.json", "https://react-19.octung112.workers.dev/r/use-resize-observer.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/overflow-group.tsx", "type": "registry:component", "target": "components/ui/overflow-group.tsx" } ] }, { "name": "checkbox", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-checkbox" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/selection-group.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/checkbox.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox.tsx" }, { "path": "src/components/ui/selection-controls/checkbox-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-form.tsx" }, { "path": "src/components/ui/selection-controls/checkbox-group-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-group-form.tsx" }, { "path": "src/components/ui/selection-controls/selection-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/selection-group.tsx" } ] }, { "name": "checkbox-tree", "author": "hihahihahoho", "dependencies": [ "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/checkbox.json", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/checkbox-tree.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-tree.tsx" }, { "path": "src/components/ui/selection-controls/checkbox-tree-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-tree-form.tsx" }, { "path": "src/components/ui/selection-controls/checkbox.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox.tsx" } ] }, { "name": "radio-group", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-radio-group" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/selection-group.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/radio-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/radio-group.tsx" }, { "path": "src/components/ui/selection-controls/radio-group-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/radio-group-form.tsx" }, { "path": "src/components/ui/selection-controls/selection-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/selection-group.tsx" } ] }, { "name": "selection-group", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "utils", "https://react-19.octung112.workers.dev/r/form.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/selection-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/selection-group.tsx" } ] }, { "name": "switch", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-switch" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/switch.tsx", "type": "registry:component", "target": "components/ui/selection-controls/switch.tsx" }, { "path": "src/components/ui/selection-controls/switch-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/switch-form.tsx" } ] }, { "name": "file-upload-list", "author": "hihahihahoho", "dependencies": [ "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/custom-icons.json", "https://react-19.octung112.workers.dev/r/dialog.json", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/sonner.json", "https://react-19.octung112.workers.dev/r/file-size.json", "https://react-19.octung112.workers.dev/r/const.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json", "https://react-19.octung112.workers.dev/r/use-file-upload.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/file-upload/file-upload-list.tsx", "type": "registry:component", "target": "components/ui/file-upload/file-upload-list.tsx" }, { "path": "src/components/ui/file-upload/file-upload-list-form.tsx", "type": "registry:component", "target": "components/ui/file-upload/file-upload-list-form.tsx" } ] }, { "name": "file-upload", "author": "hihahihahoho", "dependencies": [ "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/custom-icons.json", "https://react-19.octung112.workers.dev/r/dialog.json", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/sonner.json", "https://react-19.octung112.workers.dev/r/file-size.json", "https://react-19.octung112.workers.dev/r/const.json", "utils", "https://react-19.octung112.workers.dev/r/utils-plus.json", "https://react-19.octung112.workers.dev/r/use-file-upload.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/file-upload/file-upload.tsx", "type": "registry:component", "target": "components/ui/file-upload/file-upload.tsx" }, { "path": "src/components/ui/file-upload/file-upload-form.tsx", "type": "registry:component", "target": "components/ui/file-upload/file-upload-form.tsx" } ] }, { "name": "toast", "author": "hihahihahoho", "dependencies": [ "@radix-ui/react-toast", "class-variance-authority", "lucide-react" ], "registryDependencies": [ "utils", "https://react-19.octung112.workers.dev/r/use-toast.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/toast/toast.tsx", "type": "registry:component", "target": "components/ui/toast/toast.tsx" }, { "path": "src/components/ui/toast/toaster.tsx", "type": "registry:component", "target": "components/ui/toast/toaster.tsx" } ] }, { "name": "sortable", "author": "hihahihahoho", "dependencies": [ "@dnd-kit/core", "@dnd-kit/modifiers", "@dnd-kit/sortable", "@dnd-kit/utilities", "@radix-ui/react-slot" ], "registryDependencies": [ "utils", "https://react-19.octung112.workers.dev/r/compose-refs.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/sortable.tsx", "type": "registry:component", "target": "components/ui/sortable.tsx" } ] }, { "name": "table", "author": "hihahihahoho", "dependencies": [], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/table/table.tsx", "type": "registry:component", "target": "components/ui/table/table.tsx" } ] }, { "name": "data-table", "author": "hihahihahoho", "dependencies": [ "@tanstack/react-table", "class-variance-authority", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/table.json", "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/empty-state.json", "https://react-19.octung112.workers.dev/r/scroll-area.json", "https://react-19.octung112.workers.dev/r/pagination.json", "https://react-19.octung112.workers.dev/r/select.json", "https://react-19.octung112.workers.dev/r/select-command.json", "https://react-19.octung112.workers.dev/r/responsive-popover.json", "dropdown-menu", "utils", "https://react-19.octung112.workers.dev/r/compose-refs.json", "https://react-19.octung112.workers.dev/r/use-scroll-position.json", "https://react-19.octung112.workers.dev/r/use-sync-scroll.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/table/data-table.tsx", "type": "registry:component", "target": "components/ui/table/data-table.tsx" }, { "path": "src/components/ui/table/data-table-cell.tsx", "type": "registry:component", "target": "components/ui/table/data-table-cell.tsx" }, { "path": "src/components/ui/table/data-table-context.tsx", "type": "registry:component", "target": "components/ui/table/data-table-context.tsx" }, { "path": "src/components/ui/table/data-table-header-cell.tsx", "type": "registry:component", "target": "components/ui/table/data-table-header-cell.tsx" }, { "path": "src/components/ui/table/data-table-pagination.tsx", "type": "registry:component", "target": "components/ui/table/data-table-pagination.tsx" }, { "path": "src/components/ui/table/data-table-selection.tsx", "type": "registry:component", "target": "components/ui/table/data-table-selection.tsx" }, { "path": "src/components/ui/table/data-table-floating-header.tsx", "type": "registry:component", "target": "components/ui/table/data-table-floating-header.tsx" }, { "path": "src/components/ui/table/data-table-selection.tsx", "type": "registry:component", "target": "components/ui/table/data-table-selection.tsx" }, { "path": "src/components/ui/table/header-ref-context.tsx", "type": "registry:component", "target": "components/ui/table/header-ref-context.tsx" }, { "path": "src/components/ui/table/show-hide-collumn-button.tsx", "type": "registry:component", "target": "components/ui/table/show-hide-collumn-button.tsx" }, { "path": "src/types/tanstacktable.d.ts", "type": "registry:file", "target": "types/tanstacktable.d.ts" } ] }, { "name": "sortable-table", "author": "hihahihahoho", "dependencies": [ "utils", "@tanstack/react-table", "class-variance-authority", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/table.json", "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/empty-state.json", "https://react-19.octung112.workers.dev/r/scroll-area.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/table/sortable-table.tsx", "type": "registry:component", "target": "components/ui/table/sortable-table.tsx" }, { "path": "src/components/ui/table/data-table-cell.tsx", "type": "registry:component", "target": "components/ui/table/data-table-cell.tsx" } ] }, { "name": "visually-hidden-input", "author": "hihahihahoho", "dependencies": [], "type": "registry:component", "files": [ { "path": "src/components/ui/visually-hidden-input.tsx", "type": "registry:component", "target": "components/ui/visually-hidden-input.tsx" } ] }, { "name": "rating", "author": "hihahihahoho", "title": "Rating", "description": "Interactive star rating component with keyboard navigation, half-star support, and form integration", "dependencies": [ "@radix-ui/react-slot", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/visually-hidden-input.json", "https://react-19.octung112.workers.dev/r/compose-refs.json", "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/rating/rating.tsx", "type": "registry:component", "target": "components/ui/rating/rating.tsx" }, { "path": "src/components/ui/rating/rating-form.tsx", "type": "registry:component", "target": "components/ui/rating/rating-form.tsx" } ] }, { "name": "datepicker", "author": "hihahihahoho", "title": "Date Picker", "description": "Date picker component with calendar popup, time input support, and form integration", "dependencies": [ "lucide-react", "date-fns", "@radix-ui/rect" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/calendar.json", "https://react-19.octung112.workers.dev/r/date-time-input.json", "https://react-19.octung112.workers.dev/r/date-time-input-group.json", "https://react-19.octung112.workers.dev/r/drawer.json", "https://react-19.octung112.workers.dev/r/form.json", "popover", "https://react-19.octung112.workers.dev/r/use-date-locale-config.json", "https://react-19.octung112.workers.dev/r/use-media-query.json", "https://react-19.octung112.workers.dev/r/zod.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/datepicker/datepicker.tsx", "type": "registry:component", "target": "components/ui/datepicker/datepicker.tsx" }, { "path": "src/components/ui/datepicker/datepicker-form.tsx", "type": "registry:component", "target": "components/ui/datepicker/datepicker-form.tsx" } ] }, { "name": "date-range-picker", "author": "hihahihahoho", "title": "Date Range Picker", "description": "Date range picker component with calendar popup, range selection, and form integration", "dependencies": [ "lucide-react", "date-fns" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/calendar-range.json", "https://react-19.octung112.workers.dev/r/drawer.json", "https://react-19.octung112.workers.dev/r/form.json", "popover", "separator", "https://react-19.octung112.workers.dev/r/use-date-locale-config.json", "https://react-19.octung112.workers.dev/r/use-media-query.json", "https://react-19.octung112.workers.dev/r/zod.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/date-range-picker/date-range-picker.tsx", "type": "registry:component", "target": "components/ui/date-range-picker/date-range-picker.tsx" }, { "path": "src/components/ui/date-range-picker/date-range-picker-form.tsx", "type": "registry:component", "target": "components/ui/date-range-picker/date-range-picker-form.tsx" } ] }, { "name": "swiper", "author": "hihahihahoho", "title": "Swiper Carousel", "description": "Powerful carousel component built on Swiper.js with shadcn/ui styling, keyboard navigation, and multiple effects", "dependencies": [ "swiper", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/button.json", "utils" ], "type": "registry:component", "css": { "@import \"./styles/swiper.css\"": {} }, "files": [ { "path": "src/components/ui/swiper/swiper.tsx", "type": "registry:component", "target": "components/ui/swiper/swiper.tsx" }, { "path": "src/styles/swiper.css", "type": "registry:file", "target": "styles/swiper.css" } ] }, { "name": "swiper-panorama", "author": "hihahihahoho", "dependencies": [ "swiper" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/swiper.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/swiper/swiper-panorama.ts", "type": "registry:component", "target": "components/ui/swiper/swiper-panorama.ts" } ] }, { "name": "swiper-expo", "author": "hihahihahoho", "dependencies": [ "swiper" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/swiper.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/swiper/swiper-expo.ts", "type": "registry:component", "target": "components/ui/swiper/swiper-expo.ts" } ] }, { "name": "swiper-posters", "author": "hihahihahoho", "dependencies": [ "swiper" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/swiper.json" ], "type": "registry:component", "files": [ { "path": "src/components/ui/swiper/swiper-posters.ts", "type": "registry:component", "target": "components/ui/swiper/swiper-posters.ts" } ] }, { "name": "data-table-server", "author": "hihahihahoho", "dependencies": [ "@tanstack/react-table" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/data-table.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/table/data-table-context-server.tsx", "type": "registry:component", "target": "components/ui/table/data-table-context-server.tsx" } ] }, { "name": "image-crop", "author": "hihahihahoho", "dependencies": [ "react-easy-crop", "@radix-ui/react-slot", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/slider.json", "https://react-19.octung112.workers.dev/r/dialog.json", "https://react-19.octung112.workers.dev/r/avatar.json", "https://react-19.octung112.workers.dev/r/button.json", "https://react-19.octung112.workers.dev/r/form.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/image-crop.tsx", "type": "registry:component", "target": "components/ui/image-crop.tsx" }, { "path": "src/components/ui/image-crop-avatar-form.tsx", "type": "registry:component", "target": "components/ui/image-crop-avatar-form.tsx" } ] }, { "name": "selection-group", "author": "hihahihahoho", "title": "Selection Group", "description": "A layout component for checkbox and radio items with label", "dependencies": [ "@radix-ui/react-slot", "class-variance-authority" ], "registryDependencies": [ "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/selection-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/selection-group.tsx" } ] }, { "name": "checkbox", "author": "hihahihahoho", "title": "Checkbox", "description": "Checkbox component with form integration", "dependencies": [ "@radix-ui/react-checkbox", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/selection-group.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/checkbox.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox.tsx" }, { "path": "src/components/ui/selection-controls/checkbox-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-form.tsx" }, { "path": "src/components/ui/selection-controls/checkbox-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-group.tsx" }, { "path": "src/components/ui/selection-controls/checkbox-group-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/checkbox-group-form.tsx" } ] }, { "name": "radio-group", "author": "hihahihahoho", "title": "Radio Group", "description": "Radio group component with form integration", "dependencies": [ "@radix-ui/react-radio-group", "lucide-react" ], "registryDependencies": [ "https://react-19.octung112.workers.dev/r/form.json", "https://react-19.octung112.workers.dev/r/selection-group.json", "https://react-19.octung112.workers.dev/r/zod-schema-context.json", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/selection-controls/radio-group.tsx", "type": "registry:component", "target": "components/ui/selection-controls/radio-group.tsx" }, { "path": "src/components/ui/selection-controls/radio-group-form.tsx", "type": "registry:component", "target": "components/ui/selection-controls/radio-group-form.tsx" } ] }, { "name": "base-styles", "author": "hihahihahoho", "title": "Base Styles", "description": "Base CSS styles including custom font, scrollbar styles, and utility classes. Includes tailwindcss-safe-area plugin for safe area insets on mobile devices.", "type": "registry:style", "dependencies": [ "tailwindcss-safe-area" ], "css": { "@plugin \"tailwindcss-safe-area\"": {}, "@import \"./styles/base.css\" layer(base)": {}, "@import \"./styles/components.css\" layer(components)": {}, "@import \"./styles/custom-utilities.css\"": {} }, "files": [ { "path": "src/styles/base.css", "type": "registry:file", "target": "styles/base.css" }, { "path": "src/styles/components.css", "type": "registry:file", "target": "styles/components.css" }, { "path": "src/styles/custom-utilities.css", "type": "registry:file", "target": "styles/custom-utilities.css" } ] }, { "name": "number-to-words", "author": "hihahihahoho", "title": "Number to Words", "description": "Converts numeric values to words with multi-locale support (vi-VN, en-US). Vietnamese: lẻ, mốt, lăm rules. English: hyphenated format.", "dependencies": [], "type": "registry:lib", "files": [ { "path": "src/lib/number-to-words/index.ts", "type": "registry:lib", "target": "lib/number-to-words/index.ts" }, { "path": "src/lib/number-to-words/vi-VN.ts", "type": "registry:lib", "target": "lib/number-to-words/vi-VN.ts" }, { "path": "src/lib/number-to-words/en-US.ts", "type": "registry:lib", "target": "lib/number-to-words/en-US.ts" } ] }, { "name": "svg-inline", "author": "hihahihahoho", "title": "SVG Inline", "description": "Loads SVG files inline for dynamic CSS styling with color inheritance and loading states", "dependencies": [ "react-svg" ], "registryDependencies": [ "skeleton", "utils" ], "type": "registry:component", "files": [ { "path": "src/components/ui/svg-inline/svg-inline.tsx", "type": "registry:component", "target": "components/ui/svg-inline/svg-inline.tsx" }, { "path": "src/components/ui/svg-inline/svg-inline.module.css", "type": "registry:file", "target": "components/ui/svg-inline/svg-inline.module.css" } ] } ] }