mirror of https://github.com/buster-so/buster.git
update segmented
This commit is contained in:
parent
bb7af41bf2
commit
290f9fde09
|
@ -8,7 +8,29 @@ const meta: Meta<typeof Segmented> = {
|
||||||
parameters: {
|
parameters: {
|
||||||
layout: 'centered'
|
layout: 'centered'
|
||||||
},
|
},
|
||||||
tags: ['autodocs']
|
tags: ['autodocs'],
|
||||||
|
argTypes: {
|
||||||
|
size: {
|
||||||
|
control: 'radio',
|
||||||
|
options: ['default', 'large']
|
||||||
|
},
|
||||||
|
block: {
|
||||||
|
control: 'boolean'
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
control: 'text'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render: (args) => {
|
||||||
|
return (
|
||||||
|
<div className="flex w-full min-w-[500px] flex-col items-center justify-center gap-4">
|
||||||
|
<Segmented {...args} />
|
||||||
|
{/* <Segmented {...args} block />
|
||||||
|
<Segmented {...args} size="large" />
|
||||||
|
<Segmented {...args} block size="large" /> */}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
|
@ -26,12 +48,40 @@ export const Default: Story = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const Large: Story = {
|
||||||
|
args: {
|
||||||
|
items: defaultItems,
|
||||||
|
size: 'large'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Block: Story = {
|
||||||
|
args: {
|
||||||
|
items: defaultItems,
|
||||||
|
block: true
|
||||||
|
},
|
||||||
|
parameters: {
|
||||||
|
layout: 'padded'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const LargeBlock: Story = {
|
||||||
|
args: {
|
||||||
|
items: defaultItems,
|
||||||
|
size: 'large',
|
||||||
|
block: true
|
||||||
|
},
|
||||||
|
parameters: {
|
||||||
|
layout: 'padded'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const WithIcons: Story = {
|
export const WithIcons: Story = {
|
||||||
args: {
|
args: {
|
||||||
items: [
|
items: [
|
||||||
{ value: 'list', label: '📋 List' },
|
{ value: 'list', label: 'List' },
|
||||||
{ value: 'grid', label: '📱 Grid' },
|
{ value: 'grid', label: 'Grid' },
|
||||||
{ value: 'gallery', label: '🖼️ Gallery' }
|
{ value: 'gallery', label: 'Gallery' }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -43,6 +93,16 @@ export const Controlled: Story = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const WithDisabledItems: Story = {
|
||||||
|
args: {
|
||||||
|
items: [
|
||||||
|
{ value: 'tab1', label: 'Enabled' },
|
||||||
|
{ value: 'tab2', label: 'Disabled', disabled: true },
|
||||||
|
{ value: 'tab3', label: 'Enabled' }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const CustomStyling: Story = {
|
export const CustomStyling: Story = {
|
||||||
args: {
|
args: {
|
||||||
items: defaultItems,
|
items: defaultItems,
|
||||||
|
|
|
@ -19,10 +19,11 @@ interface SegmentedProps {
|
||||||
onChange?: (value: string) => void;
|
onChange?: (value: string) => void;
|
||||||
className?: string;
|
className?: string;
|
||||||
size?: 'default' | 'large';
|
size?: 'default' | 'large';
|
||||||
|
block?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
|
export const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
|
||||||
({ items, value, onChange, className, size = 'default' }, ref) => {
|
({ items, value, onChange, className, size = 'default', block = false }, ref) => {
|
||||||
const tabRefs = React.useRef<Map<string, HTMLButtonElement>>(new Map());
|
const tabRefs = React.useRef<Map<string, HTMLButtonElement>>(new Map());
|
||||||
const [selectedValue, setSelectedValue] = useState(value || items[0]?.value);
|
const [selectedValue, setSelectedValue] = useState(value || items[0]?.value);
|
||||||
const [hoveredValue, setHoveredValue] = useState<string | null>(null);
|
const [hoveredValue, setHoveredValue] = useState<string | null>(null);
|
||||||
|
@ -66,6 +67,7 @@ export const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
|
||||||
'bg-item-select relative inline-flex items-center rounded-lg',
|
'bg-item-select relative inline-flex items-center rounded-lg',
|
||||||
height,
|
height,
|
||||||
padding,
|
padding,
|
||||||
|
block && 'w-full',
|
||||||
className
|
className
|
||||||
)}>
|
)}>
|
||||||
<motion.div
|
<motion.div
|
||||||
|
@ -81,7 +83,9 @@ export const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
|
||||||
damping: 35
|
damping: 35
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<Tabs.List className="relative z-10 flex items-center gap-1" aria-label="Segmented Control">
|
<Tabs.List
|
||||||
|
className="relative z-10 flex w-full items-center gap-1"
|
||||||
|
aria-label="Segmented Control">
|
||||||
{items.map((item) => (
|
{items.map((item) => (
|
||||||
<Tabs.Trigger
|
<Tabs.Trigger
|
||||||
key={item.value}
|
key={item.value}
|
||||||
|
@ -96,6 +100,7 @@ export const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
|
||||||
'relative z-10 flex items-center justify-center gap-x-1.5 gap-y-1 rounded-md transition-colors',
|
'relative z-10 flex items-center justify-center gap-x-1.5 gap-y-1 rounded-md transition-colors',
|
||||||
size === 'default' ? 'px-2.5' : 'px-3',
|
size === 'default' ? 'px-2.5' : 'px-3',
|
||||||
innerHeight,
|
innerHeight,
|
||||||
|
block && 'flex-1',
|
||||||
'focus-visible:ring-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
|
'focus-visible:ring-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
|
||||||
selectedValue === item.value
|
selectedValue === item.value
|
||||||
? 'text-foreground'
|
? 'text-foreground'
|
||||||
|
|
Loading…
Reference in New Issue