stack
diceui-base/stackFreeComponent
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/stack.jsonSource
1"use client";23import { mergeProps } from "@base-ui/react/merge-props";4import { useRender } from "@base-ui/react/use-render";5import { cva } from "class-variance-authority";6import * as React from "react";7import { cn } from "@/lib/utils";89interface ItemDimension {10 itemId: number;11 size: number;12}1314type Side = "top" | "bottom";1516function getDataState(isExpanded: boolean) {17 return isExpanded ? "expanded" : "collapsed";18}1920interface StackContextValue {21 side: Side;22 childrenCount: number;23 itemCount: number;24 expandedItemCount: number;25 gap: number;26 scale: number;27 offset: number;28 expandOnHover: boolean;29 isExpanded: boolean;30 isInteracting: boolean;31 dimensions: ItemDimension[];32 setDimensions: React.Dispatch<React.SetStateAction<ItemDimension[]>>;33}3435const StackContext = React.createContext<StackContextValue | null>(null);3637function useStackContext(consumerName: string) {38 const context = React.useContext(StackContext);39 if (!context) {40 throw new Error(`\`${consumerName}\` must be used within \`Stack\``);41 }42 return context;43}4445interface StackProps46 extends React.ComponentProps<"div">,47 useRender.ComponentProps<"div"> {48 side?: Side;49 itemCount?: number;50 expandedItemCount?: number;51 gap?: number;52 scale?: number;53 offset?: number;54 expandOnHover?: boolean;55}5657function Stack(props: StackProps) {58 const {59 side = "bottom",60 itemCount = 3,61 expandedItemCount,62 gap = 8,63 scale = 0.05,64 offset = 10,65 className,66 children,67 style,68 onMouseEnter: onMouseEnterProp,69 onMouseLeave: onMouseLeaveProp,70 onMouseMove: onMouseMoveProp,71 onPointerDown: onPointerDownProp,72 onPointerUp: onPointerUpProp,73 expandOnHover = false,74 render,75 ...rootProps76 } = props;7778 const [isExpanded, setIsExpanded] = React.useState(false);79 const [isInteracting, setIsInteracting] = React.useState(false);80 const [dimensions, setDimensions] = React.useState<ItemDimension[]>([]);8182 const childrenArray = React.Children.toArray(children).filter(83 React.isValidElement,84 );85 const childrenCount = childrenArray.length;8687 const effectiveExpandedItemCount = expandedItemCount ?? childrenCount;8889 const onMouseEnter = React.useCallback(90 (event: React.MouseEvent<HTMLDivElement>) => {91 onMouseEnterProp?.(event);92 if (event.defaultPrevented) return;9394 if (expandOnHover) {95 setIsExpanded(true);96 }97 },98 [expandOnHover, onMouseEnterProp],99 );100101// … truncated
What it pulls in
npm packages
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 |
