From ea1129c98f06ae872b0ccfc9a27eca050498b462 Mon Sep 17 00:00:00 2001 From: marcelines Date: Fri, 4 Oct 2024 10:28:18 +0100 Subject: [PATCH 01/14] f: adds segmented control --- .../src/segmented-control/index.tsx | 1 + .../segmented-control.stories.tsx | 42 ++++ .../segmented-control/segmented-control.tsx | 215 ++++++++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 packages/components/src/segmented-control/index.tsx create mode 100644 packages/components/src/segmented-control/segmented-control.stories.tsx create mode 100644 packages/components/src/segmented-control/segmented-control.tsx diff --git a/packages/components/src/segmented-control/index.tsx b/packages/components/src/segmented-control/index.tsx new file mode 100644 index 000000000..051c328ae --- /dev/null +++ b/packages/components/src/segmented-control/index.tsx @@ -0,0 +1 @@ +export * as SegmentedControl from './segmented-control' diff --git a/packages/components/src/segmented-control/segmented-control.stories.tsx b/packages/components/src/segmented-control/segmented-control.stories.tsx new file mode 100644 index 000000000..0b569a99f --- /dev/null +++ b/packages/components/src/segmented-control/segmented-control.stories.tsx @@ -0,0 +1,42 @@ +import { useArgs } from '@storybook/preview-api' + +import { SegmentedControl } from './segmented-control' + +import type { Meta, StoryObj } from '@storybook/react' + +const meta = { + title: 'Components/SegmentedControl', + render: function Render() { + const [{ activeSegment }, updateArgs] = useArgs() + + return ( + updateArgs({ activeSegment: value })} + size={24} + > + Option A + Option B + Option C + + ) + }, +} satisfies Meta + +type Story = StoryObj + +export const Light: Story = { + args: { + activeSegment: 'Option A', + }, +} +export const Dark: Story = { + args: { + activeSegment: 'Option A', + }, + parameters: { + backgrounds: { default: 'dark' }, + }, +} + +export default meta diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx new file mode 100644 index 000000000..303c3943f --- /dev/null +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -0,0 +1,215 @@ +import { + Children, + cloneElement, + forwardRef, + isValidElement, + useEffect, + useRef, + useState, +} from 'react' + +import { cva } from 'cva' + +import type { ReactElement, ReactNode } from 'react' + +const tabContainerStyles = cva({ + base: [ + 'relative inline-flex items-center justify-center gap-0.5 rounded-10 bg-neutral-10 p-0.5', + ], + + variants: { + type: { + grey: 'bg-neutral-10', + 'dark-grey': 'bg-neutral-20', + }, + size: { + 24: 'h-6', + 32: 'h-8', + }, + }, +}) + +const tabStyles = cva({ + base: [ + 'absolute left-0 rounded-8 bg-neutral-50 transition-all duration-300 ease-out', + ], + variants: { + size: { + 24: 'h-[20px]', + 32: 'h-[28px]', + }, + }, +}) + +const segmentStyles = cva({ + base: [ + 'relative z-10 flex select-none items-center font-medium transition-all duration-300 ease-out', + ], + variants: { + active: { + true: 'text-white-100', + false: 'bg-transparent text-neutral-80', + }, + variant: { + default: '', + emoji: '', + icon: 'gap-1', + }, + size: { + 24: 'text-13', + 32: 'text-15', + }, + }, + compoundVariants: [ + { + variant: 'default', + size: 24, + className: 'px-2', + }, + { + variant: 'default', + size: 32, + className: 'px-3', + }, + { + variant: 'emoji', + size: 24, + className: 'pl-[6px] pr-2', + }, + { + variant: 'emoji', + size: 32, + className: 'pl-[10px] pr-3', + }, + { + variant: 'icon', + size: 24, + className: 'pl-[6px] pr-2', + }, + { + variant: 'icon', + size: 32, + className: 'pl-[10px] pr-3', + }, + ], +}) + +type SegmentButtonProps = { + children: ReactNode + onClick?: () => void + active?: boolean + size?: 24 | 32 +} + +const Button = forwardRef( + ({ children, onClick, active, size = 32 }, ref) => ( + + ), +) + +Button.displayName = 'Button' + +const IconButton = forwardRef< + HTMLButtonElement, + SegmentButtonProps & { icon: ReactNode } +>(({ children, icon, onClick, active, size = 32 }, ref) => { + const iconWithCurrentColor = cloneElement(icon as ReactElement, { + color: 'currentColor', + }) + + return ( + + ) +}) + +IconButton.displayName = 'IconButton' + +const EmojiButton = forwardRef< + HTMLButtonElement, + SegmentButtonProps & { emoji: string } +>(({ children, emoji, onClick, active, size = 32 }, ref) => ( + +)) + +EmojiButton.displayName = 'EmojiButton' + +type Props = { + children: ReactNode + activeSegment: T + onSegmentChange: (value: T) => void + size?: 24 | 32 + type?: 'grey' | 'dark-grey' +} + +const SegmentedControl = (props: Props) => { + const { + children, + activeSegment, + onSegmentChange, + size = 32, + type = 'grey', + } = props + + const [indicatorStyle, setIndicatorStyle] = useState({}) + const segmentRefs = useRef<(HTMLButtonElement | null)[]>([]) + + useEffect(() => { + const activeSegmentIndex = Children.toArray(children).findIndex( + child => isValidElement(child) && child.props.children === activeSegment, + ) + + const activeSegmentRef = segmentRefs.current[activeSegmentIndex] + if (activeSegmentRef) { + setIndicatorStyle({ + width: `${activeSegmentRef.offsetWidth}px`, + transform: `translateX(${activeSegmentRef.offsetLeft}px)`, + }) + } + }, [activeSegment, children]) + + const clonedChildren = Children.map( + children, + (child, index) => + isValidElement(child) && + cloneElement(child, { + ...child.props, + onClick: () => onSegmentChange(child.props.children), + active: child.props.children === activeSegment, + ref: (el: HTMLButtonElement) => (segmentRefs.current[index] = el), + size, + }), + ) + + return ( +
+
+ {clonedChildren} +
+ ) +} + +SegmentedControl.Root = SegmentedControl +SegmentedControl.Button = Button +SegmentedControl.IconButton = IconButton +SegmentedControl.EmojiButton = EmojiButton + +export { SegmentedControl } From 711e41397279939c65edcb216b934641f4b3b38a Mon Sep 17 00:00:00 2001 From: marcelines Date: Fri, 4 Oct 2024 15:57:00 +0100 Subject: [PATCH 02/14] f: fix story and adds type variant --- .../segmented-control.stories.tsx | 52 +++++++++++-------- .../segmented-control/segmented-control.tsx | 26 ++++++---- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.stories.tsx b/packages/components/src/segmented-control/segmented-control.stories.tsx index 0b569a99f..ef7526b72 100644 --- a/packages/components/src/segmented-control/segmented-control.stories.tsx +++ b/packages/components/src/segmented-control/segmented-control.stories.tsx @@ -1,39 +1,45 @@ -import { useArgs } from '@storybook/preview-api' +import { useState } from 'react' import { SegmentedControl } from './segmented-control' import type { Meta, StoryObj } from '@storybook/react' +const SegmentedControlVariant = ( + props: React.ComponentPropsWithoutRef, +) => { + const [activeSegment, setActiveSegment] = useState('Option A') + + return ( + + Option A + Option B + Option C + + ) +} + const meta = { title: 'Components/SegmentedControl', - render: function Render() { - const [{ activeSegment }, updateArgs] = useArgs() - + render: args => { return ( - updateArgs({ activeSegment: value })} - size={24} - > - Option A - Option B - Option C - +
+ + + + +
) }, -} satisfies Meta +} satisfies Meta -type Story = StoryObj +type Story = StoryObj -export const Light: Story = { - args: { - activeSegment: 'Option A', - }, -} +export const Light: Story = {} export const Dark: Story = { - args: { - activeSegment: 'Option A', - }, parameters: { backgrounds: { default: 'dark' }, }, diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index 303c3943f..2f4f27c08 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -14,13 +14,12 @@ import type { ReactElement, ReactNode } from 'react' const tabContainerStyles = cva({ base: [ - 'relative inline-flex items-center justify-center gap-0.5 rounded-10 bg-neutral-10 p-0.5', + 'relative inline-flex items-center justify-center gap-0.5 rounded-10 p-0.5', ], - variants: { type: { - grey: 'bg-neutral-10', - 'dark-grey': 'bg-neutral-20', + grey: 'bg-neutral-10 blur:bg-neutral-80/5 blur:backdrop-blur-[20px] dark:bg-neutral-80 blur:dark:bg-white-5', + 'dark-grey': 'bg-neutral-20 dark:bg-neutral-90', }, size: { 24: 'h-6', @@ -30,10 +29,12 @@ const tabContainerStyles = cva({ }) const tabStyles = cva({ - base: [ - 'absolute left-0 rounded-8 bg-neutral-50 transition-all duration-300 ease-out', - ], + base: ['absolute left-0 rounded-8 transition-all duration-300 ease-out'], variants: { + type: { + grey: 'bg-neutral-50 blur:bg-neutral-80/60 dark:bg-neutral-60', + 'dark-grey': 'bg-neutral-50 dark:bg-neutral-60', + }, size: { 24: 'h-[20px]', 32: 'h-[28px]', @@ -48,8 +49,9 @@ const segmentStyles = cva({ variants: { active: { true: 'text-white-100', - false: 'bg-transparent text-neutral-80', + false: 'bg-transparent text-neutral-100 dark:text-white-100', }, + variant: { default: '', emoji: '', @@ -200,9 +202,11 @@ const SegmentedControl = (props: Props) => { ) return ( -
-
- {clonedChildren} +
+
+
+ {clonedChildren} +
) } From 8c3b15640b2a217fd06b3c6653c7aa794368c6a2 Mon Sep 17 00:00:00 2001 From: marcelines Date: Fri, 4 Oct 2024 16:00:19 +0100 Subject: [PATCH 03/14] f: change size type to string --- .../segmented-control.stories.tsx | 4 +-- .../segmented-control/segmented-control.tsx | 36 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.stories.tsx b/packages/components/src/segmented-control/segmented-control.stories.tsx index ef7526b72..3c54109d7 100644 --- a/packages/components/src/segmented-control/segmented-control.stories.tsx +++ b/packages/components/src/segmented-control/segmented-control.stories.tsx @@ -28,9 +28,9 @@ const meta = { return (
- + - +
) }, diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index 2f4f27c08..39873dc62 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -22,8 +22,8 @@ const tabContainerStyles = cva({ 'dark-grey': 'bg-neutral-20 dark:bg-neutral-90', }, size: { - 24: 'h-6', - 32: 'h-8', + '24': 'h-6', + '32': 'h-8', }, }, }) @@ -36,8 +36,8 @@ const tabStyles = cva({ 'dark-grey': 'bg-neutral-50 dark:bg-neutral-60', }, size: { - 24: 'h-[20px]', - 32: 'h-[28px]', + '24': 'h-[20px]', + '32': 'h-[28px]', }, }, }) @@ -58,39 +58,39 @@ const segmentStyles = cva({ icon: 'gap-1', }, size: { - 24: 'text-13', - 32: 'text-15', + '24': 'text-13', + '32': 'text-15', }, }, compoundVariants: [ { variant: 'default', - size: 24, + size: '24', className: 'px-2', }, { variant: 'default', - size: 32, + size: '32', className: 'px-3', }, { variant: 'emoji', - size: 24, + size: '24', className: 'pl-[6px] pr-2', }, { variant: 'emoji', - size: 32, + size: '32', className: 'pl-[10px] pr-3', }, { variant: 'icon', - size: 24, + size: '24', className: 'pl-[6px] pr-2', }, { variant: 'icon', - size: 32, + size: '32', className: 'pl-[10px] pr-3', }, ], @@ -100,11 +100,11 @@ type SegmentButtonProps = { children: ReactNode onClick?: () => void active?: boolean - size?: 24 | 32 + size?: '24' | '32' } const Button = forwardRef( - ({ children, onClick, active, size = 32 }, ref) => ( + ({ children, onClick, active, size = '32' }, ref) => ( @@ -176,7 +213,11 @@ const SegmentedControl = (props: Props) => { useEffect(() => { const activeSegmentIndex = Children.toArray(children).findIndex( - child => isValidElement(child) && child.props.children === activeSegment, + child => + isValidElement(child) && + (child.props.value + ? child.props.value === activeSegment + : child.props.children === activeSegment), ) const activeSegmentRef = segmentRefs.current[activeSegmentIndex] @@ -194,19 +235,20 @@ const SegmentedControl = (props: Props) => { isValidElement(child) && cloneElement(child, { ...child.props, - onClick: () => onSegmentChange(child.props.children), - active: child.props.children === activeSegment, + onClick: () => + onSegmentChange(child.props.value || child.props.children), + active: child.props.value + ? child.props.value === activeSegment + : child.props.children === activeSegment, ref: (el: HTMLButtonElement) => (segmentRefs.current[index] = el), size, }), ) return ( -
-
-
- {clonedChildren} -
+
+
+ {clonedChildren}
) } From 75548bbd4c632f2fe2a55057f43e23754dc84cf7 Mon Sep 17 00:00:00 2001 From: marcelines Date: Mon, 7 Oct 2024 09:50:14 +0100 Subject: [PATCH 05/14] f: changeset --- .changeset/stupid-sloths-cross.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stupid-sloths-cross.md diff --git a/.changeset/stupid-sloths-cross.md b/.changeset/stupid-sloths-cross.md new file mode 100644 index 000000000..fbf2e142c --- /dev/null +++ b/.changeset/stupid-sloths-cross.md @@ -0,0 +1,5 @@ +--- +'@status-im/components': patch +--- + +adds segmented control component From ea8fda77262f4e1525bab058db5e6fab4690d2f2 Mon Sep 17 00:00:00 2001 From: marcelines Date: Mon, 7 Oct 2024 10:30:00 +0100 Subject: [PATCH 06/14] f --- .../segmented-control.stories.tsx | 30 +++++++++++++++++-- .../segmented-control/segmented-control.tsx | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.stories.tsx b/packages/components/src/segmented-control/segmented-control.stories.tsx index d36049cf5..814355cd1 100644 --- a/packages/components/src/segmented-control/segmented-control.stories.tsx +++ b/packages/components/src/segmented-control/segmented-control.stories.tsx @@ -1,6 +1,13 @@ import { createElement, memo, useState } from 'react' -import { BuyIcon, GasIcon } from '@status-im/icons/20' +import { + BuyIcon, + DarkIcon, + DesktopIcon, + GasIcon, + LightIcon, + ProfileIcon, +} from '@status-im/icons/20' import { match } from 'ts-pattern' import { SegmentedControl } from './segmented-control' @@ -9,7 +16,7 @@ import type { Meta, StoryObj } from '@storybook/react' type Data = { value: string - label: string + label?: string icon?: React.ComponentType> emoji?: string } @@ -112,6 +119,13 @@ const meta = { const iconData = [ { value: 'buy', label: 'Buy', icon: BuyIcon }, { value: 'gas', label: 'Gas', icon: GasIcon }, + { value: 'profile', label: 'Profile', icon: ProfileIcon }, + ] + + const themeSelectorData = [ + { value: 'system', icon: DesktopIcon }, + { value: 'light', icon: LightIcon }, + { value: 'dark', icon: DarkIcon }, ] const emojiData = [ @@ -121,6 +135,7 @@ const meta = { ] return (
+

Segmented Control

{/* Only text */} @@ -235,6 +250,17 @@ const meta = { variant="emoji-text" data={emojiData} /> + +
+

Theme Selector

+
+ +
+
) }, diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index f4a7103fb..96ca2d5b9 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -41,7 +41,7 @@ const tabStyles = cva({ }) const segmentStyles = cva({ - base: 'relative z-10 flex h-full flex-1 select-none items-center justify-center whitespace-nowrap rounded-8 font-medium transition-all duration-300 ease-out', + base: 'relative z-10 flex flex-1 select-none items-center justify-center whitespace-nowrap rounded-8 font-medium transition-all duration-300 ease-out', variants: { active: { From 922cd66fc408144e01983f14f52224577ffff39f Mon Sep 17 00:00:00 2001 From: marcelines Date: Mon, 7 Oct 2024 15:42:52 +0100 Subject: [PATCH 07/14] f --- .../segmented-control/segmented-control.tsx | 109 +++++++++++------- 1 file changed, 70 insertions(+), 39 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index 96ca2d5b9..a3fc2ad5a 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -8,7 +8,7 @@ import { useState, } from 'react' -import { cva } from 'cva' +import { cva, cx } from 'cva' import type { ReactElement, ReactNode } from 'react' @@ -26,7 +26,7 @@ const tabContainerStyles = cva({ }, }) -const tabStyles = cva({ +const tabActiveStyles = cva({ base: 'absolute left-0 flex-1 rounded-8 transition-all duration-300 ease-out', variants: { type: { @@ -46,8 +46,11 @@ const segmentStyles = cva({ variants: { active: { true: 'text-white-100', - false: - 'bg-transparent text-neutral-80 hover:bg-neutral-20 dark:text-neutral-40 dark:hover:bg-neutral-70 dark:hover:text-white-100', + false: 'bg-transparent text-neutral-100 dark:text-white-100', + }, + type: { + grey: '', + 'dark-grey': '', }, variant: { default: '', @@ -62,6 +65,16 @@ const segmentStyles = cva({ }, }, compoundVariants: [ + { + type: 'grey', + active: false, + className: 'hover:bg-neutral-20 dark:hover:bg-neutral-70', + }, + { + type: 'dark-grey', + active: false, + className: 'hover:bg-neutral-30 dark:hover:bg-neutral-80', + }, { variant: 'default', size: '24', @@ -142,52 +155,69 @@ const IconButton = forwardRef< SegmentButtonProps & { icon: ReactNode value?: string | number + type?: 'grey' | 'dark-grey' } ->(({ icon, children, value, onClick, active, size = '32' }, ref) => { - const iconWithCurrentColor = cloneElement(icon as ReactElement, { - color: 'currentColor', - className: 'size-4', - }) +>( + ( + { icon, children, value, onClick, active, size = '32', type = 'grey' }, + ref, + ) => { + const iconWithColor = cloneElement(icon as ReactElement, { + className: cx([ + 'size-4 text-neutral-50 dark:text-white-40', + active && '!text-white-100', + ]), + }) - return ( + console.log('Active: ', active) + return ( + + ) + }, +) + +IconButton.displayName = 'IconButton' + +const EmojiButton = forwardRef< + HTMLButtonElement, + SegmentButtonProps & { + emoji: string + value?: string | number + type?: 'grey' | 'dark-grey' + } +>( + ( + { children, emoji, onClick, active, size = '32', value, type = 'grey' }, + ref, + ) => ( - ) -}) - -IconButton.displayName = 'IconButton' - -const EmojiButton = forwardRef< - HTMLButtonElement, - SegmentButtonProps & { - emoji: string - value?: string | number - } ->(({ children, emoji, onClick, active, size = '32', value }, ref) => ( - -)) + ), +) EmojiButton.displayName = 'EmojiButton' @@ -242,12 +272,13 @@ const SegmentedControl = (props: Props) => { : child.props.children === activeSegment, ref: (el: HTMLButtonElement) => (segmentRefs.current[index] = el), size, + type, }), ) return (
-
+
{clonedChildren}
) From caeb354577520710bc13bafd196b2c3ff4f7ac1e Mon Sep 17 00:00:00 2001 From: marcelines Date: Tue, 8 Oct 2024 10:14:54 +0100 Subject: [PATCH 08/14] f: adds all variants in story and fixes some issues --- .../public/assets/background-blur.png | Bin 0 -> 130011 bytes .../segmented-control.stories.tsx | 560 +++++++++++++----- .../segmented-control/segmented-control.tsx | 21 +- 3 files changed, 419 insertions(+), 162 deletions(-) create mode 100644 packages/components/public/assets/background-blur.png diff --git a/packages/components/public/assets/background-blur.png b/packages/components/public/assets/background-blur.png new file mode 100644 index 0000000000000000000000000000000000000000..de40360b55c4bd030f32a19485bf95016b539a74 GIT binary patch literal 130011 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

JBj@8j*TmsJbe&5}ob4IM{QwbWK)SJDN%roa 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 Ef_Ss75dZ)H literal 0 HcmV?d00001 diff --git a/packages/components/src/segmented-control/segmented-control.stories.tsx b/packages/components/src/segmented-control/segmented-control.stories.tsx index 814355cd1..0e3fc8490 100644 --- a/packages/components/src/segmented-control/segmented-control.stories.tsx +++ b/packages/components/src/segmented-control/segmented-control.stories.tsx @@ -1,13 +1,6 @@ import { createElement, memo, useState } from 'react' -import { - BuyIcon, - DarkIcon, - DesktopIcon, - GasIcon, - LightIcon, - ProfileIcon, -} from '@status-im/icons/20' +import { PlaceholderIcon } from '@status-im/icons/20' import { match } from 'ts-pattern' import { SegmentedControl } from './segmented-control' @@ -110,154 +103,417 @@ SegmentedControlVariant.displayName = 'SegmentedControlVariant' const meta = { title: 'Components/SegmentedControl', render: args => { - const textData = [ - { value: 'option-a', label: 'Option A' }, - { value: 'option-b', label: 'Option B' }, - { value: 'option-c', label: 'Option C' }, - ] - - const iconData = [ - { value: 'buy', label: 'Buy', icon: BuyIcon }, - { value: 'gas', label: 'Gas', icon: GasIcon }, - { value: 'profile', label: 'Profile', icon: ProfileIcon }, - ] - - const themeSelectorData = [ - { value: 'system', icon: DesktopIcon }, - { value: 'light', icon: LightIcon }, - { value: 'dark', icon: DarkIcon }, - ] - - const emojiData = [ - { value: 'apple', label: 'Apple', emoji: '🍎' }, - { value: 'orange', label: 'Orange', emoji: '🍊' }, - { value: 'grapes', label: 'Grapes', emoji: '🍇' }, - ] + const tabIcon = { + label: 'Tab', + icon: PlaceholderIcon, + } + const tabText = { label: 'Tab' } + const tabEmoji = { + label: 'Tab', + emoji: '🐷', + } + return ( -

-

Segmented Control

- {/* Only text */} - - - - - - {/* Only icon */} - - - - - - {/* Only emoji */} - - - - - - {/* Icon and text */} - - - - - - {/* Emoji and text */} - - - - - -
-

Theme Selector

-
+
+
+
+ {/* Only text */} + ({ + ...tabText, + value: `placeholder-tab-grey-32-${index}`, + }))} + /> + + {/* Emoji and text */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-grey-32-${index}`, + }))} + /> + + {/* Icon and text */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-grey-32-${index}`, + }))} + /> + + {/* Only emoji */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-only-grey-32-${index}`, + }))} + /> + + {/* Only icon */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-only-grey-32-${index}`, + }))} + /> +
+ +
+ {/* Only text */} + ({ + ...tabText, + value: `placeholder-tab-grey-24-${index}`, + }))} + /> + + {/* Emoji and text */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-grey-24-${index}`, + }))} + /> + + {/* Icon and text */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-grey-24-${index}`, + }))} + /> + + {/* Only emoji */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-only-grey-24-${index}`, + }))} + /> + + {/* Only icon */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-only-grey-24-${index}`, + }))} + /> +
+
+ {/* dark grey light */} +
+
+ {/* Only text */} + ({ + ...tabText, + value: `placeholder-tab-dark-grey-32-${index}`, + }))} + /> + + {/* Emoji and text */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-dark-grey-32-${index}`, + }))} + /> + + {/* Icon and text */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-dark-grey-32-${index}`, + }))} + /> + + {/* Only emoji */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-only-dark-grey-32-${index}`, + }))} + /> + + {/* Only icon */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-only-dark-grey-32-${index}`, + }))} + /> +
+ +
+ {/* Only text */} + ({ + ...tabText, + value: `placeholder-tab-dark-grey-24-${index}`, + }))} + /> + + {/* Emoji and text */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-dark-grey-24-${index}`, + }))} + /> + + {/* Icon and text */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-dark-grey-24-${index}`, + }))} + /> + + {/* Only emoji */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-only-dark-grey-24-${index}`, + }))} + /> + + {/* Only icon */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-only-dark-grey-24-${index}`, + }))} + /> +
+
+ {/* with blur */} +
+
+ {/* Background image */} +
+
+ {/* Only text */} + ({ + ...tabText, + value: `placeholder-tab-dark-grey-32-blur-${index}`, + }))} + /> + + {/* Emoji and text */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-dark-grey-32-blur-${index}`, + }))} + /> + + {/* Icon and text */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-dark-grey-32-blur-${index}`, + }))} + /> + + {/* Only emoji */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-only-dark-grey-32-blur-${index}`, + }))} + /> + + {/* Only icon */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-only-dark-grey-32-blur-${index}`, + }))} + /> +
+ +
+ {/* Only text */} + ({ + ...tabText, + value: `placeholder-tab-dark-grey-24-blur-${index}`, + }))} + /> + + {/* Emoji and text */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-dark-grey-24-blur-${index}`, + }))} + /> + + {/* Icon and text */} + ({ + ...tabIcon, + value: `placeholder-tab-icon-dark-grey-24-blur-${index}`, + }))} + /> + + {/* Only emoji */} + ({ + ...tabEmoji, + value: `placeholder-tab-emoji-only-dark-grey-24-blur-${index}`, + }))} + /> + + {/* Only icon */} ({ + ...tabIcon, + value: `placeholder-tab-icon-only-dark-grey-24-blur-${index}`, + }))} />
diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index a3fc2ad5a..e2f37b901 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -26,15 +26,15 @@ const tabContainerStyles = cva({ }, }) -const tabActiveStyles = cva({ +const activeTabStyles = cva({ base: 'absolute left-0 flex-1 rounded-8 transition-all duration-300 ease-out', variants: { type: { - grey: 'bg-neutral-50 blur:bg-neutral-80/60 dark:bg-neutral-60', + grey: 'bg-neutral-50 blur:bg-neutral-80/60 dark:bg-neutral-60 blur:dark:bg-white-20', 'dark-grey': 'bg-neutral-50 dark:bg-neutral-60', }, size: { - '24': 'h-5', + '24': 'h-[22px]', '32': 'h-7', }, }, @@ -60,7 +60,7 @@ const segmentStyles = cva({ 'icon-only': '', }, size: { - '24': 'h-5 text-13', + '24': 'h-[22px] text-13', '32': 'h-7 text-15', }, }, @@ -68,7 +68,8 @@ const segmentStyles = cva({ { type: 'grey', active: false, - className: 'hover:bg-neutral-20 dark:hover:bg-neutral-70', + className: + 'hover:bg-neutral-20 blur:hover:bg-neutral-80/5 dark:hover:bg-neutral-70 dark:blur:hover:bg-white-5', }, { type: 'dark-grey', @@ -134,14 +135,15 @@ type SegmentButtonProps = { onClick?: () => void active?: boolean size?: '24' | '32' + type?: 'grey' | 'dark-grey' } const Button = forwardRef( - ({ children, onClick, active, size = '32' }, ref) => ( + ({ children, onClick, active, size = '32', type = 'grey' }, ref) => ( @@ -164,12 +166,11 @@ const IconButton = forwardRef< ) => { const iconWithColor = cloneElement(icon as ReactElement, { className: cx([ - 'size-4 text-neutral-50 dark:text-white-40', + 'size-5 text-neutral-50 dark:text-white-40', active && '!text-white-100', ]), }) - console.log('Active: ', active) return ( - ), -) +export const Button = forwardRef< + React.ElementRef, + SegmentButtonProps +>(({ children, active, size = '32', type = 'grey', ...itemProps }, ref) => ( + + {children} + +)) Button.displayName = 'Button' -const IconButton = forwardRef< - HTMLButtonElement, +export const IconButton = forwardRef< + React.ElementRef, SegmentButtonProps & { - icon: ReactNode - value?: string | number + icon: IconElement type?: 'grey' | 'dark-grey' } >( ( - { icon, children, value, onClick, active, size = '32', type = 'grey' }, + { icon, children, active, size = '32', type = 'grey', ...itemProps }, ref, ) => { - const iconWithColor = cloneElement(icon as ReactElement, { + const iconWithColor = cloneElement(icon, { className: cx([ 'size-5 text-neutral-50 dark:text-white-40', active && '!text-white-100', @@ -172,28 +176,27 @@ const IconButton = forwardRef< }) return ( - + ) }, ) IconButton.displayName = 'IconButton' -const EmojiButton = forwardRef< - HTMLButtonElement, +export const EmojiButton = forwardRef< + React.ElementRef, SegmentButtonProps & { emoji: string value?: string | number @@ -201,93 +204,86 @@ const EmojiButton = forwardRef< } >( ( - { children, emoji, onClick, active, size = '32', value, type = 'grey' }, + { children, emoji, active, size = '32', type = 'grey', ...itemProps }, ref, ) => ( - + ), ) EmojiButton.displayName = 'EmojiButton' -type Props = { - children: ReactNode - activeSegment: T - onSegmentChange: (value: T) => void - size?: '24' | '32' - type?: 'grey' | 'dark-grey' +type TabVariants = VariantProps + +interface CustomProps { + type?: TabVariants['type'] + size?: TabVariants['size'] } -const SegmentedControl = (props: Props) => { - const { - children, - activeSegment, - onSegmentChange, - size = '32', - type = 'grey', - } = props +// Use Omit to remove the 'type' prop from ToggleGroupSingleProps +// Use Omit to remove the 'type' prop from ToggleGroupSingleProps +type RootProps = Omit & CustomProps + +const TabsContext = createContext>({}) + +export const Root = (props: RootProps) => { + const { children, size = '32', type = 'grey', ...rootProps } = props const [indicatorStyle, setIndicatorStyle] = useState({}) const segmentRefs = useRef<(HTMLButtonElement | null)[]>([]) useEffect(() => { - const activeSegmentIndex = Children.toArray(children).findIndex( - child => - isValidElement(child) && - (child.props.value - ? child.props.value === activeSegment - : child.props.children === activeSegment), + const activeSegment = segmentRefs.current.find( + segment => segment?.getAttribute('data-state') === 'on', ) - const activeSegmentRef = segmentRefs.current[activeSegmentIndex] - if (activeSegmentRef) { + if (activeSegment) { setIndicatorStyle({ - width: `${activeSegmentRef.offsetWidth}px`, - transform: `translateX(${activeSegmentRef.offsetLeft}px)`, + width: activeSegment.offsetWidth, + transform: `translateX(${activeSegment.offsetLeft}px)`, }) } - }, [activeSegment, children]) + }, [children]) + + const clonedChildren = useMemo(() => { + return Children.map(children, (child, index) => { + if (!isValidElement(child)) return child - const clonedChildren = Children.map( - children, - (child, index) => - isValidElement(child) && - cloneElement(child, { - ...child.props, - onClick: () => - onSegmentChange(child.props.value || child.props.children), - active: child.props.value - ? child.props.value === activeSegment - : child.props.children === activeSegment, - ref: (el: HTMLButtonElement) => (segmentRefs.current[index] = el), + return cloneElement(child, { + ref: (el: HTMLButtonElement | null) => { + segmentRefs.current[index] = el + }, + active: child.props.value === props.value, size, type, - }), - ) + }) + }) + }, [children, props.value, size, type]) return ( -
-
- {clonedChildren} -
+ ({ size, type }), [size, type])}> + +
+ {clonedChildren} + + ) } - -SegmentedControl.Root = SegmentedControl -SegmentedControl.Button = Button -SegmentedControl.IconButton = IconButton -SegmentedControl.EmojiButton = EmojiButton - -export { SegmentedControl } diff --git a/yarn.lock b/yarn.lock index b86a24b62..c826dae4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2528,6 +2528,28 @@ "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-visually-hidden" "1.1.0" +"@radix-ui/react-toggle-group@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz#28714c4d1ff4961a8fd259b1feef58b4cac92f80" + integrity sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-toggle" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-toggle@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz#1f7697b82917019330a16c6f96f649f46b4606cf" + integrity sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-tooltip@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.2.tgz#c42db2ffd7dcc6ff3d65407c8cb70490288f518d" @@ -11291,7 +11313,16 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11375,7 +11406,14 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -12334,7 +12372,7 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -12352,6 +12390,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 42cb83461a137b5d720e983a9486b3ea6836ff5d Mon Sep 17 00:00:00 2001 From: marcelines Date: Thu, 10 Oct 2024 16:36:38 +0100 Subject: [PATCH 10/14] f: changes from review --- .../segmented-control/segmented-control.tsx | 231 ++++++++---------- 1 file changed, 108 insertions(+), 123 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index 3cd8e6d12..7b34b61b8 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -4,6 +4,7 @@ import { createContext, forwardRef, isValidElement, + useContext, useEffect, useMemo, useRef, @@ -17,6 +18,66 @@ import type { IconElement } from '../types' import type { VariantProps } from 'cva' import type { ReactNode } from 'react' +type TabVariants = VariantProps + +interface CustomProps { + type?: TabVariants['type'] + size?: TabVariants['size'] +} + +// Use Omit to remove the 'type' prop from ToggleGroupSingleProps +type RootProps = Omit & CustomProps + +const TabsContext = createContext>({}) + +export const Root = (props: RootProps) => { + const { children, size = '32', type = 'grey', ...rootProps } = props + + const [indicatorStyle, setIndicatorStyle] = useState({}) + const segmentRefs = useRef<(HTMLButtonElement | null)[]>([]) + + useEffect(() => { + const activeSegment = segmentRefs.current.find( + segment => segment?.getAttribute('data-state') === 'on', + ) + + if (activeSegment) { + setIndicatorStyle({ + width: activeSegment.offsetWidth, + transform: `translateX(${activeSegment.offsetLeft}px)`, + }) + } + }, [children]) + + const clonedChildren = useMemo(() => { + return Children.map(children, (child, index) => { + if (!isValidElement(child)) return child + + return cloneElement(child, { + ref: (el: HTMLButtonElement | null) => { + segmentRefs.current[index] = el + }, + }) + }) + }, [children]) + + return ( + ({ size, type }), [size, type])}> + +
+ {clonedChildren} + + + ) +} + const tabContainerStyles = cva({ base: 'relative flex flex-1 items-center justify-center gap-0.5 rounded-10 p-0.5', variants: { @@ -46,13 +107,9 @@ const activeTabStyles = cva({ }) const segmentStyles = cva({ - base: 'relative z-10 flex flex-1 select-none items-center justify-center whitespace-nowrap rounded-8 font-medium transition-all duration-300 ease-out', + base: 'group relative z-10 flex flex-1 select-none items-center justify-center whitespace-nowrap rounded-8 bg-transparent font-medium text-neutral-100 transition-all duration-300 ease-out data-[state="on"]:text-white-100 dark:text-white-100', variants: { - active: { - true: 'text-white-100', - false: 'bg-transparent text-neutral-100 dark:text-white-100', - }, type: { grey: '', 'dark-grey': '', @@ -72,14 +129,13 @@ const segmentStyles = cva({ compoundVariants: [ { type: 'grey', - active: false, className: - 'hover:bg-neutral-20 blur:hover:bg-neutral-80/5 dark:hover:bg-neutral-70 dark:blur:hover:bg-white-5', + 'data-[state="off"]:hover:bg-neutral-20 data-[state="off"]:blur:hover:bg-neutral-80/5 data-[state="off"]:dark:hover:bg-neutral-70 data-[state="off"]:dark:blur:hover:bg-white-5', }, { type: 'dark-grey', - active: false, - className: 'hover:bg-neutral-30 dark:hover:bg-neutral-80', + className: + 'data-[state="off"]:hover:bg-neutral-30 data-[state="off"]:dark:hover:bg-neutral-80', }, { variant: 'default', @@ -136,24 +192,25 @@ const segmentStyles = cva({ type SegmentButtonProps = { children?: ReactNode - active?: boolean value: string - size?: '24' | '32' - type?: 'grey' | 'dark-grey' } & React.RefAttributes export const Button = forwardRef< React.ElementRef, SegmentButtonProps ->(({ children, active, size = '32', type = 'grey', ...itemProps }, ref) => ( - - {children} - -)) +>(({ children, ...itemProps }, ref) => { + const { size, type } = useContext(TabsContext)! + + return ( + + {children} + + ) +}) Button.displayName = 'Button' @@ -161,37 +218,32 @@ export const IconButton = forwardRef< React.ElementRef, SegmentButtonProps & { icon: IconElement - type?: 'grey' | 'dark-grey' } ->( - ( - { icon, children, active, size = '32', type = 'grey', ...itemProps }, - ref, - ) => { - const iconWithColor = cloneElement(icon, { - className: cx([ - 'size-5 text-neutral-50 dark:text-white-40', - active && '!text-white-100', - ]), - }) +>(({ icon, children, ...itemProps }, ref) => { + const { size, type } = useContext(TabsContext)! - return ( - - {iconWithColor} - {children} - - ) - }, -) + const iconWithColor = cloneElement(icon, { + color: 'currentColor', + className: cx([ + 'size-5 text-neutral-50 group-data-[state="on"]:text-white-100 dark:text-white-40', + ]), + }) + + return ( + + {iconWithColor} + {children} + + ) +}) IconButton.displayName = 'IconButton' @@ -200,18 +252,15 @@ export const EmojiButton = forwardRef< SegmentButtonProps & { emoji: string value?: string | number - type?: 'grey' | 'dark-grey' } ->( - ( - { children, emoji, active, size = '32', type = 'grey', ...itemProps }, - ref, - ) => ( +>(({ children, emoji, ...itemProps }, ref) => { + const { size, type } = useContext(TabsContext)! + + return ( {emoji} {children} - ), -) + ) +}) EmojiButton.displayName = 'EmojiButton' - -type TabVariants = VariantProps - -interface CustomProps { - type?: TabVariants['type'] - size?: TabVariants['size'] -} - -// Use Omit to remove the 'type' prop from ToggleGroupSingleProps -// Use Omit to remove the 'type' prop from ToggleGroupSingleProps -type RootProps = Omit & CustomProps - -const TabsContext = createContext>({}) - -export const Root = (props: RootProps) => { - const { children, size = '32', type = 'grey', ...rootProps } = props - - const [indicatorStyle, setIndicatorStyle] = useState({}) - const segmentRefs = useRef<(HTMLButtonElement | null)[]>([]) - - useEffect(() => { - const activeSegment = segmentRefs.current.find( - segment => segment?.getAttribute('data-state') === 'on', - ) - - if (activeSegment) { - setIndicatorStyle({ - width: activeSegment.offsetWidth, - transform: `translateX(${activeSegment.offsetLeft}px)`, - }) - } - }, [children]) - - const clonedChildren = useMemo(() => { - return Children.map(children, (child, index) => { - if (!isValidElement(child)) return child - - return cloneElement(child, { - ref: (el: HTMLButtonElement | null) => { - segmentRefs.current[index] = el - }, - active: child.props.value === props.value, - size, - type, - }) - }) - }, [children, props.value, size, type]) - - return ( - ({ size, type }), [size, type])}> - -
- {clonedChildren} - - - ) -} From a4476bbabd417bfffceecc66a3d5c8f691bbe95b Mon Sep 17 00:00:00 2001 From: Pavel <14926950+prichodko@users.noreply.github.com> Date: Wed, 16 Oct 2024 11:52:43 +0200 Subject: [PATCH 11/14] add context consumer to tabs --- packages/components/src/tabs/tabs.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/components/src/tabs/tabs.tsx b/packages/components/src/tabs/tabs.tsx index 871fe7e1e..7224a923d 100644 --- a/packages/components/src/tabs/tabs.tsx +++ b/packages/components/src/tabs/tabs.tsx @@ -26,6 +26,16 @@ type RootProps = React.ComponentProps & { const TabsContext = createContext>({}) +function useTabsContext() { + const context = useContext(TabsContext) + + if (!context) { + throw new Error('useTabsContext must be used within a ') + } + + return context +} + export const Root = (props: RootProps) => { const { size = '32', variant = 'grey', ...rootProps } = props @@ -42,7 +52,7 @@ export const List = forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >((props, ref) => { - const { size } = useContext(TabsContext)! + const { size } = useTabsContext() return ( ((props, ref) => { const { children, ...rest } = props - const { size, variant } = useContext(TabsContext)! + const { size, variant } = useTabsContext() return ( From e4e2372b7d9f782bbd3ab33a04c94680813403a3 Mon Sep 17 00:00:00 2001 From: Pavel <14926950+prichodko@users.noreply.github.com> Date: Wed, 16 Oct 2024 18:00:27 +0200 Subject: [PATCH 12/14] cleanup --- .../segmented-control/segmented-control.tsx | 345 +++++++----------- 1 file changed, 139 insertions(+), 206 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index 7b34b61b8..91dc9625e 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -1,89 +1,52 @@ import { - Children, cloneElement, createContext, forwardRef, - isValidElement, useContext, useEffect, + useImperativeHandle, useMemo, useRef, useState, } from 'react' import * as ToggleGroup from '@radix-ui/react-toggle-group' -import { cva, cx } from 'cva' +import { cva } from 'cva' import type { IconElement } from '../types' import type { VariantProps } from 'cva' -import type { ReactNode } from 'react' -type TabVariants = VariantProps +type Variants = VariantProps -interface CustomProps { - type?: TabVariants['type'] - size?: TabVariants['size'] -} - -// Use Omit to remove the 'type' prop from ToggleGroupSingleProps -type RootProps = Omit & CustomProps - -const TabsContext = createContext>({}) +const SegmentedControlContext = createContext< + Pick +>({}) -export const Root = (props: RootProps) => { - const { children, size = '32', type = 'grey', ...rootProps } = props +function useSegmentedControlContext() { + const context = useContext(SegmentedControlContext) - const [indicatorStyle, setIndicatorStyle] = useState({}) - const segmentRefs = useRef<(HTMLButtonElement | null)[]>([]) - - useEffect(() => { - const activeSegment = segmentRefs.current.find( - segment => segment?.getAttribute('data-state') === 'on', + if (!context) { + throw new Error( + 'useSegmentedControlContext must be used within a ', ) + } - if (activeSegment) { - setIndicatorStyle({ - width: activeSegment.offsetWidth, - transform: `translateX(${activeSegment.offsetLeft}px)`, - }) - } - }, [children]) - - const clonedChildren = useMemo(() => { - return Children.map(children, (child, index) => { - if (!isValidElement(child)) return child - - return cloneElement(child, { - ref: (el: HTMLButtonElement | null) => { - segmentRefs.current[index] = el - }, - }) - }) - }, [children]) + return context +} - return ( - ({ size, type }), [size, type])}> - -
- {clonedChildren} - - - ) +type RootProps = Omit & { + value: string + onValueChange: (value: string) => void + variant?: Variants['variant'] + size?: Variants['size'] } -const tabContainerStyles = cva({ +const rootStyles = cva({ base: 'relative flex flex-1 items-center justify-center gap-0.5 rounded-10 p-0.5', variants: { - type: { + variant: { grey: 'bg-neutral-10 blur:bg-neutral-80/5 blur:backdrop-blur-[20px] dark:bg-neutral-80 blur:dark:bg-white-5', - 'dark-grey': 'bg-neutral-20 dark:bg-neutral-90', + darkGrey: 'bg-neutral-20 dark:bg-neutral-90', }, size: { '24': 'h-6', @@ -93,182 +56,152 @@ const tabContainerStyles = cva({ }) const activeTabStyles = cva({ - base: 'absolute left-0 flex-1 rounded-8 transition-all duration-300 ease-out', + base: 'pointer-events-none absolute inset-y-0.5 left-0 flex-1 rounded-8 transition-all duration-200 ease-out', variants: { - type: { + variant: { grey: 'bg-neutral-50 blur:bg-neutral-80/60 dark:bg-neutral-60 blur:dark:bg-white-20', - 'dark-grey': 'bg-neutral-50 dark:bg-neutral-60', - }, - size: { - '24': 'h-[22px]', - '32': 'h-7', + darkGrey: 'bg-neutral-50 dark:bg-neutral-60', }, }, }) -const segmentStyles = cva({ - base: 'group relative z-10 flex flex-1 select-none items-center justify-center whitespace-nowrap rounded-8 bg-transparent font-medium text-neutral-100 transition-all duration-300 ease-out data-[state="on"]:text-white-100 dark:text-white-100', +export const Root = forwardRef< + React.ElementRef, + RootProps +>((props, ref) => { + const { + children, + variant = 'grey', + size = '32', + value, + onValueChange, + ...rootProps + } = props + + const rootRef = useRef(null) + useImperativeHandle(ref, () => rootRef.current!) - variants: { - type: { - grey: '', - 'dark-grey': '', - }, - variant: { - default: '', - emoji: 'gap-1', - 'emoji-only': '', - icon: 'gap-1', - 'icon-only': '', - }, - size: { - '24': 'h-[22px] text-13', - '32': 'h-7 text-15', - }, - }, - compoundVariants: [ - { - type: 'grey', - className: - 'data-[state="off"]:hover:bg-neutral-20 data-[state="off"]:blur:hover:bg-neutral-80/5 data-[state="off"]:dark:hover:bg-neutral-70 data-[state="off"]:dark:blur:hover:bg-white-5', - }, - { - type: 'dark-grey', - className: - 'data-[state="off"]:hover:bg-neutral-30 data-[state="off"]:dark:hover:bg-neutral-80', - }, - { - variant: 'default', - size: '24', - className: 'px-2', - }, - { - variant: 'default', - size: '32', - className: 'px-3', - }, - { - variant: 'emoji', - size: '24', - className: 'pl-[6px] pr-2', - }, - { - variant: 'emoji', - size: '32', - className: 'pl-[10px] pr-3', - }, - { - variant: 'emoji-only', - size: '24', - className: 'px-1', - }, - { - variant: 'emoji-only', - size: '32', - className: 'px-1.5', - }, - { - variant: 'icon', - size: '24', - className: 'pl-[6px] pr-2', - }, - { - variant: 'icon', - size: '32', - className: 'pl-[10px] pr-3', - }, - { - variant: 'icon-only', - size: '24', - className: 'px-1', - }, - { - variant: 'icon-only', - size: '32', - className: 'px-1.5', - }, - ], -}) + const [indicatorStyle, setIndicatorStyle] = useState({}) -type SegmentButtonProps = { - children?: ReactNode - value: string -} & React.RefAttributes + useEffect(() => { + const activeButton = + rootRef.current!.querySelector('[data-state="on"]')! -export const Button = forwardRef< - React.ElementRef, - SegmentButtonProps ->(({ children, ...itemProps }, ref) => { - const { size, type } = useContext(TabsContext)! + if (activeButton) { + setIndicatorStyle({ + width: activeButton.offsetWidth, + transform: `translateX(${activeButton.offsetLeft}px)`, + }) + } + }, [value]) return ( - ({ size, variant }), [size, variant])} > - {children} - + { + // Ensuring there is always a value + // @see https://www.radix-ui.com/primitives/docs/components/toggle-group#ensuring-there-is-always-a-value + if (value) { + onValueChange(value) + } + }} + > +
+ {children} + + ) }) -Button.displayName = 'Button' +Root.displayName = 'Root' -export const IconButton = forwardRef< - React.ElementRef, - SegmentButtonProps & { - icon: IconElement - } ->(({ icon, children, ...itemProps }, ref) => { - const { size, type } = useContext(TabsContext)! +/** + * Item + */ - const iconWithColor = cloneElement(icon, { - color: 'currentColor', - className: cx([ - 'size-5 text-neutral-50 group-data-[state="on"]:text-white-100 dark:text-white-40', - ]), - }) +const itemStyles = cva({ + base: [ + 'group relative z-10 flex flex-1 select-none items-center justify-center gap-1 whitespace-nowrap rounded-8 bg-transparent font-medium transition-all duration-300 ease-out', + 'text-neutral-100 data-[state="on"]:text-white-100 dark:text-white-100', + ], - return ( - - {iconWithColor} - {children} - - ) + variants: { + variant: { + grey: [ + 'data-[state="off"]:hover:bg-neutral-20 data-[state="off"]:blur:hover:bg-neutral-80/5 data-[state="off"]:dark:hover:bg-neutral-70 data-[state="off"]:dark:blur:hover:bg-white-5', + ], + darkGrey: [ + 'data-[state="off"]:hover:bg-neutral-30 data-[state="off"]:dark:hover:bg-neutral-80', + ], + }, + size: { + '24': 'h-6 px-2 text-13', + '32': 'h-7 px-3 text-15', + }, + }, +}) + +const iconStyles = cva({ + base: [ + 'size-5 text-neutral-50 group-data-[state="on"]:text-white-100 dark:text-white-40', + ], + variants: { + iconOnly: { + true: '', + false: '-ml-0.5', + }, + }, }) -IconButton.displayName = 'IconButton' +type ItemProps = Omit< + React.ComponentPropsWithoutRef, + 'children' +> & + ( + | { + icon?: IconElement + children: React.ReactNode + } + | { + icon: IconElement + children?: never + 'aria-label': string + } + ) -export const EmojiButton = forwardRef< +export const Item = forwardRef< React.ElementRef, - SegmentButtonProps & { - emoji: string - value?: string | number - } ->(({ children, emoji, ...itemProps }, ref) => { - const { size, type } = useContext(TabsContext)! + ItemProps +>((props, ref) => { + const { icon, children, ...itemProps } = props + + const { size, variant } = useSegmentedControlContext() + + const iconOnly = children ? false : true return ( - {emoji} {children} + {icon && ( + <> + {cloneElement(icon, { + className: iconStyles({ iconOnly }), + })} + + )} + {children} ) }) -EmojiButton.displayName = 'EmojiButton' +Item.displayName = 'Item' From c99d7d9c2108ac53f1bb77cfd8722ae890062fde Mon Sep 17 00:00:00 2001 From: Pavel <14926950+prichodko@users.noreply.github.com> Date: Thu, 17 Oct 2024 14:40:38 +0200 Subject: [PATCH 13/14] rename --- .../components/src/segmented-control/segmented-control.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.tsx b/packages/components/src/segmented-control/segmented-control.tsx index 91dc9625e..22133609a 100644 --- a/packages/components/src/segmented-control/segmented-control.tsx +++ b/packages/components/src/segmented-control/segmented-control.tsx @@ -55,7 +55,7 @@ const rootStyles = cva({ }, }) -const activeTabStyles = cva({ +const activeSegmentStyles = cva({ base: 'pointer-events-none absolute inset-y-0.5 left-0 flex-1 rounded-8 transition-all duration-200 ease-out', variants: { variant: { @@ -113,7 +113,10 @@ export const Root = forwardRef< } }} > -
+
{children} From 34855e144da90d584d00d626fa2fe83e3eb45460 Mon Sep 17 00:00:00 2001 From: Pavel <14926950+prichodko@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:03:50 +0200 Subject: [PATCH 14/14] simplify stories --- .../segmented-control.stories.tsx | 581 +++--------------- 1 file changed, 87 insertions(+), 494 deletions(-) diff --git a/packages/components/src/segmented-control/segmented-control.stories.tsx b/packages/components/src/segmented-control/segmented-control.stories.tsx index a543f27e5..544c50deb 100644 --- a/packages/components/src/segmented-control/segmented-control.stories.tsx +++ b/packages/components/src/segmented-control/segmented-control.stories.tsx @@ -1,529 +1,122 @@ -import { createElement, useState } from 'react' +import { useState } from 'react' import { PlaceholderIcon } from '@status-im/icons/20' -import { match } from 'ts-pattern' import { SegmentedControl } from './' -import type { IconElement } from '../types' import type { Meta, StoryObj } from '@storybook/react' -type Data = { - value: string - label?: string - icon?: React.ComponentType> - emoji?: string -} - -type SegmentedControlVariantProps = { - variant?: 'icon-text' | 'emoji-text' | 'icon-only' | 'emoji-only' - data: Data[] - size?: '24' | '32' - type?: 'grey' | 'dark-grey' -} +type RootProps = React.ComponentPropsWithoutRef +type ItemProps = React.ComponentPropsWithoutRef -const SegmentedControlVariant = (props: SegmentedControlVariantProps) => { - const [activeSegment, setActiveSegment] = useState(props.data[0].value) +const SegmentedControlVariant = ( + props: Omit & { + count: number + size: RootProps['size'] + variant: RootProps['variant'] + }, +) => { + const [value, setValue] = useState('0') - const { type = 'grey', data, size, variant } = props + const { count, variant, size, ...itemProps } = props return ( - {match(variant) - .with('icon-text', () => - data.map(({ value, icon, label }) => { - if (!icon) { - return null - } - - const iconElement = createElement(icon) - - return ( - - {label} - - ) - }), - ) - .with('emoji-text', () => - data.map(({ value, emoji = '', label }) => ( - - {label} - - )), - ) - .with('icon-only', () => - data.map(({ value, icon }) => { - if (!icon) { - return null - } + {Array(count) + .fill(null) + .map((_, index) => { + return ( + + ) + })} + + ) +} - const iconElement = createElement(icon) +const SegmentedControlGroup = ( + props: Omit, +) => { + const { variant = 'grey' } = props - return ( - - ) - }), - ) - .with('emoji-only', () => - data.map(({ value, emoji = '' }) => ( - - )), - ) - .otherwise(() => - data.map(({ value, label }) => ( - - {label} - - )), - )} - + return ( +
+
+ + Tab + + + } + > + Tab + + + + Tab + + } + > + Tab + + + } + aria-label="placeholder" + /> +
+
) } const meta: Meta = { - title: 'Components/SegmentedControl', + title: 'Components/Segmented Control', render: args => { - const tabIcon = { - label: 'Tab', - // I have to use PlaceholderIcon instead of otherwise it will throw an error in storybook for maximum call stack size exceeded. That's why we createElement above and then cast it to IconElement. - icon: PlaceholderIcon, - } - const tabText = { label: 'Tab' } - const tabEmoji = { - label: 'Tab', - emoji: '🐷', - } - return (
-
-
- {/* Only text */} - ({ - ...tabText, - value: `placeholder-tab-grey-32-${index}`, - }))} - /> - - {/* Emoji and text */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-grey-32-${index}`, - }))} - /> - - {/* Icon and text */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-grey-32-${index}`, - }))} - /> - - {/* Only emoji */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-only-grey-32-${index}`, - }))} - /> - - {/* Only icon */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-only-grey-32-${index}`, - }))} - /> -
- -
- {/* Only text */} - ({ - ...tabText, - value: `placeholder-tab-grey-24-${index}`, - }))} - /> - - {/* Emoji and text */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-grey-24-${index}`, - }))} - /> - - {/* Icon and text */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-grey-24-${index}`, - }))} - /> - - {/* Only emoji */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-only-grey-24-${index}`, - }))} - /> - - {/* Only icon */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-only-grey-24-${index}`, - }))} - /> -
-
- {/* dark grey light */} -
-
- {/* Only text */} - ({ - ...tabText, - value: `placeholder-tab-dark-grey-32-${index}`, - }))} - /> - - {/* Emoji and text */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-dark-grey-32-${index}`, - }))} - /> - - {/* Icon and text */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-dark-grey-32-${index}`, - }))} - /> - - {/* Only emoji */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-only-dark-grey-32-${index}`, - }))} - /> - - {/* Only icon */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-only-dark-grey-32-${index}`, - }))} - /> +
+
+
-
- {/* Only text */} - ({ - ...tabText, - value: `placeholder-tab-dark-grey-24-${index}`, - }))} - /> - - {/* Emoji and text */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-dark-grey-24-${index}`, - }))} - /> - - {/* Icon and text */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-dark-grey-24-${index}`, - }))} - /> - - {/* Only emoji */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-only-dark-grey-24-${index}`, - }))} - /> - - {/* Only icon */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-only-dark-grey-24-${index}`, - }))} - /> +
+
-
- {/* with blur */} -
-
- {/* Background image */} -
-
- {/* Only text */} - ({ - ...tabText, - value: `placeholder-tab-dark-grey-32-blur-${index}`, - }))} - /> - {/* Emoji and text */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-dark-grey-32-blur-${index}`, - }))} - /> - - {/* Icon and text */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-dark-grey-32-blur-${index}`, - }))} - /> - - {/* Only emoji */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-only-dark-grey-32-blur-${index}`, - }))} - /> - - {/* Only icon */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-only-dark-grey-32-blur-${index}`, - }))} - /> -
- -
- {/* Only text */} - ({ - ...tabText, - value: `placeholder-tab-dark-grey-24-blur-${index}`, - }))} - /> - - {/* Emoji and text */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-dark-grey-24-blur-${index}`, - }))} - /> - - {/* Icon and text */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-dark-grey-24-blur-${index}`, - }))} - /> - - {/* Only emoji */} - ({ - ...tabEmoji, - value: `placeholder-tab-emoji-only-dark-grey-24-blur-${index}`, - }))} - /> - - {/* Only icon */} - ({ - ...tabIcon, - value: `placeholder-tab-icon-only-dark-grey-24-blur-${index}`, - }))} - /> +
+
+ {/* Background image */} +
+
+ +
) }, -} satisfies Meta +} type Story = StoryObj