segmented-input
diceui-radix/segmented-inputFreeComponent
diceui/radix publishes no description for this item.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/sadmann7/diceui/HEAD/docs/public/r/styles/radix-nova/segmented-input.jsonSource
1"use client";23import { cva, type VariantProps } from "class-variance-authority";4import {5 Direction as DirectionPrimitive,6 Slot as SlotPrimitive,7} from "radix-ui";8import * as React from "react";9import { cn } from "@/lib/utils";10import { Input } from "@/registry/bases/radix/ui/input";1112const ROOT_NAME = "SegmentedInput";13const ITEM_NAME = "SegmentedInputItem";1415type Direction = "ltr" | "rtl";16type Orientation = "horizontal" | "vertical";17type Size = "default" | "sm" | "lg";18type Position = "isolated" | "first" | "middle" | "last";1920interface SegmentedInputContextValue {21 dir?: Direction;22 orientation?: Orientation;23 size?: Size;24 disabled?: boolean;25 invalid?: boolean;26 required?: boolean;27}2829const SegmentedInputContext =30 React.createContext<SegmentedInputContextValue | null>(null);3132function useSegmentedInputContext(consumerName: string) {33 const context = React.useContext(SegmentedInputContext);34 if (!context) {35 throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);36 }37 return context;38}3940interface SegmentedInputProps extends React.ComponentProps<"div"> {41 dir?: Direction;42 orientation?: Orientation;43 size?: Size;44 asChild?: boolean;45 disabled?: boolean;46 invalid?: boolean;47 required?: boolean;48}4950function SegmentedInput(props: SegmentedInputProps) {51 const {52 size = "default",53 dir: dirProp,54 orientation = "horizontal",55 children,56 className,57 asChild,58 disabled,59 invalid,60 required,61 ...rootProps62 } = props;6364 const dir = DirectionPrimitive.useDirection(dirProp);6566 const contextValue = React.useMemo<SegmentedInputContextValue>(67 () => ({68 dir,69 orientation,70 size,71 disabled,72 invalid,73 required,74 }),75 [dir, orientation, size, disabled, invalid, required],76 );7778 const childrenArray = React.Children.toArray(children);79 const childrenCount = childrenArray.length;8081 const segmentedInputItems = React.Children.map(children, (child, index) => {82 if (React.isValidElement<SegmentedInputItemProps>(child)) {83 if (!child.props.position) {84 let position: Position;8586 if (childrenCount === 1) {87 position = "isolated";88 } else if (index === 0) {89 position = "first";90 } else if (index === childrenCount - 1) {91 position = "last";92 } else {93 position = "middle";94 }9596 return React.cloneElement(child, { position });97 }98 }99 return child;100 });101102// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from diceui/radix
All 58 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| action-baraction-bar | diceui/radix | Components | Free | 1 dep · 2 files | |
| angle-sliderangle-slider | diceui/radix | Components | Free | 1 dep · 3 files | |
| avatar-groupavatar-group | diceui/radix | Components | Free | 1 dep | |
| badge-overflowbadge-overflow | diceui/radix | Components | Free | 1 dep · 2 files | |
| bannerbanner | diceui/radix | Components | Free | 1 dep | |
| checkbox-groupcheckbox-group | diceui/radix | Components | Free | 1 dep | |
| circular-progresscircular-progress | diceui/radix | Components | Free | 1 dep | |
| client-onlyclient-only | diceui/radix | Components | Free | no deps |
