{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "mhl5-registry", "homepage": "https://mhl5.vercel.app", "items": [ { "name": "AutoGrid", "type": "registry:component", "title": "AutoGrid", "description": "a component that automatically adjusts the grid columns without relying on breakpoints.", "meta": { "url": "/snippets/components/AutoGrid" }, "files": [ { "path": "src/registry/new-york/AutoGrid/AutoGrid.tsx", "type": "registry:component" } ] }, { "name": "DebouncedInput", "type": "registry:ui", "title": "DebouncedInput", "description": "An input that debounces the input value.", "meta": { "url": "/snippets/components/DebouncedInput" }, "registryDependencies": [ "https://mhl5.vercel.app/r/useDebounce.json", "https://mhl5.vercel.app/r/useTimeout.json" ], "files": [ { "path": "src/registry/new-york/DebouncedInput/DebouncedInput.tsx", "type": "registry:ui" } ] }, { "name": "DrawerDialog", "type": "registry:ui", "title": "DrawerDialog", "description": "a responsive dialog that renders a drawer (`max-width: 640px`) and a dialog on larger screens.", "meta": { "url": "/snippets/components/DrawerDialog" }, "registryDependencies": [ "dialog", "drawer", "https://mhl5.vercel.app/r/useMediaQuery.json" ], "files": [ { "path": "src/registry/new-york/DrawerDialog/DrawerDialog.tsx", "type": "registry:ui" } ] }, { "name": "ErrorBoundary", "type": "registry:ui", "title": "ErrorBoundary", "description": "a React boundary component that renders a fallback UI when an error occurs.", "meta": { "url": "/snippets/components/ErrorBoundary" }, "registryDependencies": [ "button", "https://mhl5.vercel.app/r/checks.json" ], "files": [ { "path": "src/registry/new-york/ErrorBoundary/ErrorBoundary.tsx", "type": "registry:ui", "target": "src/components/utils/ErrorBoundary.tsx" } ] }, { "name": "FallbackPages", "type": "registry:component", "title": "FallbackPages", "description": "loading, error and not found pages.", "meta": { "url": "/snippets/components/FallbackPages" }, "registryDependencies": ["button"], "files": [ { "path": "src/registry/new-york/FallbackPages/FallbackPages.tsx", "type": "registry:component" } ], "cssVars": { "theme": { "--animate-scaleUpAndDown": "scaleUpAndDown 1.1s ease infinite", "--animate-pingMd": "pingMd 1.1s cubic-bezier(0, 0, 0.2, 1) infinite", "--animate-pingSm": "pingSm 1.1s cubic-bezier(0, 0, 0.2, 1) infinite" } }, "css": { "@keyframes scaleUpAndDown": { "0%": { "transform": "scale(1)" }, "55%": { "transform": "scale(1.07)" }, "100%": { "transform": "scale(1)" } }, "@keyframes pingMd": { "95%": { "transform": "scale(1.8)", "opacity": "0" }, "100%": { "transform": "scale(1.8)", "opacity": "0" } }, "@keyframes pingSm": { "95%": { "transform": "scale(1.5)", "opacity": "0" }, "100%": { "transform": "scale(1.5)", "opacity": "0" } } } }, { "name": "Img", "type": "registry:ui", "title": "Img", "description": "a component that renders an image with a fallback if the image fails to load.", "meta": { "url": "/snippets/components/Img" }, "files": [ { "path": "src/registry/new-york/Img/Img.tsx", "type": "registry:ui" } ] }, { "name": "StructuredDataScript", "type": "registry:component", "title": "StructuredDataScript", "description": "A type-safe component for adding structured data to the page.", "meta": { "url": "/snippets/components/StructuredDataScript" }, "devDependencies": ["schema-dts"], "files": [ { "path": "src/registry/new-york/StructuredDataScript/StructuredDataScript.tsx", "type": "registry:component" } ] }, { "name": "TagsInput", "type": "registry:component", "title": "TagsInput", "description": "A component for inputting tags.", "meta": { "url": "/snippets/components/TagsInput" }, "registryDependencies": ["button", "input", "tooltip", "kbd"], "dependencies": ["lucide-react"], "files": [ { "path": "src/registry/new-york/TagsInput/TagsInput.tsx", "type": "registry:component" } ] }, { "name": "useCopyToClipboard", "type": "registry:hook", "title": "useCopyToClipboard", "description": "A hook for copying content to clipboard.", "meta": { "url": "/snippets/hooks/useCopyToClipboard" }, "files": [ { "path": "src/registry/hooks/useCopyToClipboard/useCopyToClipboard.ts", "type": "registry:hook" } ] }, { "name": "useDebounce", "type": "registry:hook", "title": "useDebounce", "description": "A hook for debouncing a value.", "meta": { "url": "/snippets/hooks/useDebounce" }, "registryDependencies": ["https://mhl5.vercel.app/r/useTimeout.json"], "files": [ { "path": "src/registry/hooks/useDebounce/useDebounce.ts", "type": "registry:hook" } ] }, { "name": "useIsMounted", "type": "registry:hook", "title": "useIsMounted", "description": "A hook for checking if the component is mounted.", "meta": { "url": "/snippets/hooks/useIsMounted" }, "files": [ { "path": "src/registry/hooks/useIsMounted/useIsMounted.ts", "type": "registry:hook" } ] }, { "name": "useIsVisible", "type": "registry:hook", "title": "useIsVisible", "description": "A hook for checking if an element is visible in the viewport using Intersection Observer API.", "meta": { "url": "/snippets/hooks/useIsVisible" }, "files": [ { "path": "src/registry/hooks/useIsVisible/useIsVisible.ts", "type": "registry:hook" } ] }, { "name": "useMediaQuery", "type": "registry:hook", "title": "useMediaQuery", "description": "`useMediaQuery` uses `useSyncExternalStore` to reactively track media query matches.", "meta": { "url": "/snippets/hooks/useMediaQuery" }, "registryDependencies": ["https://mhl5.vercel.app/r/AutoComplete.json"], "files": [ { "path": "src/registry/hooks/useMediaQuery/useMediaQuery.tsx", "type": "registry:hook" } ] }, { "name": "useOnClickOutside", "type": "registry:hook", "title": "useOnClickOutside", "description": "A hook to handle clicks outside of a component.", "meta": { "url": "/snippets/hooks/useOnClickOutside" }, "registryDependencies": ["https://mhl5.vercel.app/r/checks.json"], "files": [ { "path": "src/registry/hooks/useOnClickOutside/useOnClickOutside.ts", "type": "registry:hook" } ] }, { "name": "useOtp", "type": "registry:hook", "title": "useOtp", "description": "A hook for grabbing OTP codes from the user device.", "meta": { "url": "/snippets/hooks/useOtp" }, "files": [ { "path": "src/registry/hooks/useOtp/useOtp.ts", "type": "registry:hook" } ] }, { "name": "useStepper", "type": "registry:hook", "title": "useStepper", "description": "A hook for managing step-based navigation logic.", "meta": { "url": "/snippets/hooks/useStepper" }, "files": [ { "path": "src/registry/hooks/useStepper/useStepper.ts", "type": "registry:hook" }, { "path": "src/types/NumberRange.ts", "type": "registry:lib", "target": "src/types/NumberRange.ts" } ] }, { "name": "useSessionStorage", "type": "registry:hook", "title": "useSessionStorage", "description": "A React hook built on top of `useSyncExternalStore` for managing state with `sessionStorage`.", "meta": { "url": "/snippets/hooks/useSessionStorage" }, "files": [ { "path": "src/registry/hooks/useSessionStorage/useSessionStorage.ts", "type": "registry:hook" }, { "path": "src/utils/jsonParseWithFallback.ts", "type": "registry:lib", "target": "src/utils/jsonParseWithFallback.ts" } ] }, { "name": "useLocalStorage", "type": "registry:hook", "title": "useLocalStorage", "description": "A React hook built on top of `useSyncExternalStore` that synchronizes state with `localStorage`, providing reactive updates across browser tabs and windows.", "meta": { "url": "/snippets/hooks/useLocalStorage" }, "registryDependencies": ["https://mhl5.vercel.app/r/checks.json"], "files": [ { "path": "src/registry/hooks/useLocalStorage/useLocalStorage.ts", "type": "registry:hook" } ] }, { "name": "useTimeout", "type": "registry:hook", "title": "useTimeout", "description": "A hook for setting a timeout.", "meta": { "url": "/snippets/hooks/useTimeout" }, "files": [ { "path": "src/registry/hooks/useTimeout/useTimeout.ts", "type": "registry:hook" } ] }, { "name": "useInterval", "type": "registry:hook", "title": "useInterval", "description": "A hook for setting an interval.", "meta": { "url": "/snippets/hooks/useInterval" }, "files": [ { "path": "src/registry/hooks/useInterval/useInterval.ts", "type": "registry:hook" } ] }, { "name": "useSearchParamShallow", "type": "registry:hook", "title": "useSearchParamShallow", "description": "A hook for updating URL search parameters using `window.history.pushState` or `window.history.replaceState` instead of the Next.js router. This means URL updates happen entirely on the client side without triggering a server-side re-render.", "meta": { "url": "/snippets/hooks/useSearchParamShallow" }, "files": [ { "path": "src/registry/hooks/useSearchParamShallow/useSearchParamShallow.ts", "type": "registry:hook" } ] }, { "name": "AutoComplete", "type": "registry:lib", "title": "AutoComplete", "description": "a generic type that allows you to autocomplete the string or number", "meta": { "url": "/snippets/types/AutoComplete" }, "files": [ { "path": "src/registry/types/AutoComplete/AutoComplete.ts", "type": "registry:lib", "target": "src/types/AutoComplete.ts" } ] }, { "name": "PartialPick", "type": "registry:lib", "title": "PartialPick", "description": "by default, the partial makes everything optional, but you can use this type to make a partial pick of a type.", "meta": { "url": "/snippets/types/PartialPick" }, "files": [ { "path": "src/registry/types/PartialPick/PartialPick.ts", "type": "registry:lib", "target": "src/types/PartialPick.ts" } ] }, { "name": "RequiredPick", "type": "registry:lib", "title": "RequiredPick", "description": "by default, the required makes everything required, but you can use this type to make a required pick of a type.", "meta": { "url": "/snippets/types/RequiredPick" }, "files": [ { "path": "src/registry/types/RequiredPick/RequiredPick.ts", "type": "registry:lib", "target": "src/types/RequiredPick.ts" } ] }, { "name": "checks", "type": "registry:lib", "title": "checks", "description": "a collection of utility functions for checking the environment of the code is running on.", "meta": { "url": "/snippets/utils/checks" }, "files": [ { "path": "src/registry/utils/checks/checks.ts", "type": "registry:lib", "target": "src/utils/checks.ts" } ] }, { "name": "tryCatch", "type": "registry:lib", "title": "tryCatch", "description": "utility function for catching errors, it aims to replace `try-catch` blocks. it returns a tuple of `[error, data]` and its fully type safe.", "meta": { "url": "/snippets/utils/tryCatch" }, "files": [ { "path": "src/registry/utils/tryCatch/tryCatch.ts", "type": "registry:lib", "target": "src/utils/tryCatch.ts" } ] }, { "name": "groupByKey", "type": "registry:lib", "title": "groupByKey", "description": "a utility function for grouping an array of objects by a key.", "meta": { "url": "/snippets/utils/groupByKey" }, "files": [ { "path": "src/registry/utils/groupByKey/groupByKey.ts", "type": "registry:lib", "target": "src/utils/groupByKey.ts" } ] }, { "name": "formatters", "type": "registry:lib", "title": "formatters", "description": "A collection of formatters for strings, dates, numbers and currencies.", "meta": { "url": "/snippets/utils/formatters" }, "files": [ { "path": "src/registry/utils/formatters/formatters.ts", "type": "registry:lib", "target": "src/utils/formatters.ts" } ] }, { "name": "wait", "type": "registry:lib", "title": "wait", "description": "A collection of wait functions for simulating a delay.", "meta": { "url": "/snippets/utils/wait" }, "files": [ { "path": "src/registry/utils/wait/wait.ts", "type": "registry:lib", "target": "src/utils/wait.ts" } ] } ] }