segmented-input
diceui-base/segmented-inputFreeComponent
diceui/base publishes no description for this item.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/sadmann7/diceui/HEAD/docs/public/r/styles/base-vega/segmented-input.jsonSource
1"use client";23import { mergeProps } from "@base-ui/react/merge-props";4import { useRender } from "@base-ui/react/use-render";5import { cva, type VariantProps } from "class-variance-authority";6import * as React from "react";7import { cn } from "@/lib/utils";8import { useDirection } from "@/registry/bases/base/ui/direction";9import { Input } from "@/registry/bases/base/ui/input";1011const ROOT_NAME = "SegmentedInput";12const ITEM_NAME = "SegmentedInputItem";1314type Direction = "ltr" | "rtl";15type Orientation = "horizontal" | "vertical";16type Size = "default" | "sm" | "lg";17type Position = "isolated" | "first" | "middle" | "last";1819interface SegmentedInputContextValue {20 dir?: Direction;21 orientation?: Orientation;22 size?: Size;23 disabled?: boolean;24 invalid?: boolean;25 required?: boolean;26}2728const SegmentedInputContext =29 React.createContext<SegmentedInputContextValue | null>(null);3031function useSegmentedInputContext(consumerName: string) {32 const context = React.useContext(SegmentedInputContext);33 if (!context) {34 throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);35 }36 return context;37}3839interface SegmentedInputProps40 extends React.ComponentProps<"div">,41 useRender.ComponentProps<"div"> {42 dir?: Direction;43 orientation?: Orientation;44 size?: Size;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 render,58 disabled,59 invalid,60 required,61 ...rootProps62 } = props;6364 const contextDir = useDirection();65 const dir = dirProp ?? contextDir;6667 const contextValue = React.useMemo<SegmentedInputContextValue>(68 () => ({69 dir,70 orientation,71 size,72 disabled,73 invalid,74 required,75 }),76 [dir, orientation, size, disabled, invalid, required],77 );7879 const childrenArray = React.Children.toArray(children);80 const childrenCount = childrenArray.length;8182 const segmentedInputItems = React.Children.map(children, (child, index) => {83 if (React.isValidElement<SegmentedInputItemProps>(child)) {84 if (!child.props.position) {85 let position: Position;8687 if (childrenCount === 1) {88 position = "isolated";89 } else if (index === 0) {90 position = "first";91 } else if (index === childrenCount - 1) {92 position = "last";93 } else {94// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from diceui/base
All 192 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| action-baraction-bar | diceui/base | Components | Free | 1 dep | |
| angle-sliderangle-slider | diceui/base | Components | Free | 1 dep · 3 files | |
| avatar-groupavatar-group | diceui/base | Components | Free | 1 dep | |
| badge-overflowbadge-overflow | diceui/base | Components | Free | 1 dep · 2 files | |
| bannerbanner | diceui/base | Components | Free | 1 dep | |
| circular-progresscircular-progress | diceui/base | Components | Free | 1 dep | |
| client-onlyclient-only | diceui/base | Components | Free | no deps | |
| color-pickercolor-picker | diceui/base | Components | Free | 1 dep · 2 files |
