Input Group
fluid-functionalism/input-groupFreeComponent
Grouped input fields with proximity-based highlighting, animated label transitions, optional icons, and error states.
Install it
npx shadcn@latest add https://fluidfunctionalism.com/r/input-group.jsonSource
1"use client";23import {4 useRef,5 useState,6 useEffect,7 useMemo,8 createContext,9 useContext,10 forwardRef,11 type ReactNode,12 type HTMLAttributes,13 type InputHTMLAttributes,14} from "react";15import { Field } from "@base-ui/react/field";16import type { IconComponent } from "@/lib/icon-context";17import { cn } from "@/lib/utils";18import { fontWeights } from "@/lib/font-weight";19import { useShape } from "@/lib/shape-context";20import { useProximityHover } from "@/hooks/use-proximity-hover";2122interface InputGroupContextValue {23 registerItem: (index: number, element: HTMLElement | null) => void;24 activeIndex: number | null;25}2627const InputGroupContext = createContext<InputGroupContextValue | null>(null);2829function useInputGroup() {30 const ctx = useContext(InputGroupContext);31 if (!ctx)32 throw new Error("useInputGroup must be used within an InputGroup");33 return ctx;34}3536interface InputGroupProps extends HTMLAttributes<HTMLDivElement> {37 children: ReactNode;38}3940const InputGroup = forwardRef<HTMLDivElement, InputGroupProps>(41 ({ children, className, ...props }, ref) => {42 const containerRef = useRef<HTMLDivElement>(null);4344 const { activeIndex, handlers, registerItem, measureItems } =45 useProximityHover(containerRef);4647 useEffect(() => {48 measureItems();49 }, [measureItems, children]);5051 const contextValue = useMemo(52 () => ({ registerItem, activeIndex }),53 [registerItem, activeIndex]54 );5556 return (57 <InputGroupContext.Provider value={contextValue}>58 <div59 ref={(node) => {60 (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;61 if (typeof ref === "function") ref(node);62 else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;63 }}64 onMouseEnter={handlers.onMouseEnter}65 onMouseMove={handlers.onMouseMove}66 onMouseLeave={handlers.onMouseLeave}67 // `relative` makes this div the fields' offsetParent — the proximity68 // hook measures items via offsetTop and compares against69 // container-relative mouse coords, so the two coordinate spaces must70 // share this origin (same as every other proximity consumer).71 className={cn("relative flex flex-col gap-3 w-72 max-w-full", className)}72 {...props}73 >74 {children}75 </div>76 </InputGroupContext.Provider>77 );78 }79);8081// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from fluid-functionalism
All 53 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | fluid-functionalism | Components | Free | 3 deps | |
| Accordion (Base UI)accordion-base | fluid-functionalism | Components | Free | 3 deps | |
| Ask User Questionsask-user-questions | fluid-functionalism | Components | Free | 2 deps | |
| Badgebadge | fluid-functionalism | Components | Free | 1 dep | |
| Buttonbutton | fluid-functionalism | Components | Free | 4 deps | |
| Button (Base UI)button-base | fluid-functionalism | Components | Free | 4 deps | |
| Cardcard | fluid-functionalism | Components | Free | 1 dep | |
| Chat Messagechat-message | fluid-functionalism | Components | Free | 1 dep |
