-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: Toggle 컴포넌트 재구축 및 npm v1.3.9 배포
- Loading branch information
1 parent
d3b9bd1
commit b6506d1
Showing
8 changed files
with
181 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 23 additions & 0 deletions
23
frontend-monorepo/packages/hang-log-design-system/src/components/NewToggle/Item.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import type { ForwardedRef, PropsWithChildren } from 'react'; | ||
import { useContext, forwardRef } from 'react'; | ||
import { NewToggleContext } from '@components/NewToggle/NewToggle'; | ||
|
||
export interface ItemProps extends PropsWithChildren { | ||
toggleKey: number | string; | ||
} | ||
|
||
const ToggleItem = ({ children, toggleKey }: ItemProps, ref?: ForwardedRef<HTMLDivElement>) => { | ||
const context = useContext(NewToggleContext); | ||
|
||
if (!context) throw new Error('NewToggle 컴포넌트가 Wrapping되어있지 않습니다.'); | ||
|
||
const { selectKey } = context; | ||
|
||
return ( | ||
<div ref={ref} style={{ display: selectKey === toggleKey ? 'block' : 'none' }}> | ||
{children} | ||
</div> | ||
); | ||
}; | ||
|
||
export default forwardRef(ToggleItem); |
28 changes: 28 additions & 0 deletions
28
frontend-monorepo/packages/hang-log-design-system/src/components/NewToggle/List.style.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import { css } from '@emotion/react'; | ||
|
||
import { Theme } from '@styles/Theme'; | ||
|
||
export const getListStyling = (isSelected: boolean) => | ||
css({ | ||
display: 'flex', | ||
alignItems: 'center', | ||
justifyContent: 'center', | ||
|
||
padding: '8px 12px', | ||
border: `1px solid ${isSelected ? Theme.color.blue700 : Theme.color.gray200}`, | ||
|
||
backgroundColor: isSelected ? Theme.color.blue100 : Theme.color.white, | ||
|
||
fontSize: Theme.text.small.fontSize, | ||
lineHeight: Theme.text.small.lineHeight, | ||
color: isSelected ? Theme.color.blue700 : Theme.color.gray600, | ||
|
||
transition: `all .2s ease-in`, | ||
|
||
cursor: 'pointer', | ||
|
||
'&:hover': { | ||
color: isSelected ? Theme.color.blue700 : Theme.color.gray700, | ||
backgroundColor: isSelected ? Theme.color.blue200 : Theme.color.gray100, | ||
}, | ||
}); |
48 changes: 48 additions & 0 deletions
48
frontend-monorepo/packages/hang-log-design-system/src/components/NewToggle/List.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import type { ComponentPropsWithRef, ForwardedRef, KeyboardEvent } from 'react'; | ||
import { useContext, forwardRef } from 'react'; | ||
|
||
import { getListStyling } from '@components/NewToggle/List.style'; | ||
import { NewToggleContext } from './NewToggle'; | ||
|
||
export interface ToggleProps extends ComponentPropsWithRef<'li'> { | ||
toggleKey: number | string; | ||
text: string; | ||
} | ||
|
||
const List = ( | ||
{ toggleKey, text, ...attributes }: ToggleProps, | ||
ref?: ForwardedRef<HTMLLIElement> | ||
) => { | ||
const context = useContext(NewToggleContext); | ||
|
||
if (!context) throw new Error('NewToggle 컴포넌트가 Wrapping되어있지 않습니다.'); | ||
|
||
const { selectKey, handleSelect } = context; | ||
|
||
const handleEnterKeyPress = (event: KeyboardEvent<HTMLLIElement>) => { | ||
if (event.key === 'Enter') { | ||
handleSelect(toggleKey); | ||
} | ||
}; | ||
|
||
return ( | ||
<li | ||
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role | ||
role="radio" | ||
aria-label={`${text}로 토글할 수 있는 버튼입니다. ${ | ||
selectKey === toggleKey ? '이미 선택되어있습니다.' : '' | ||
}`} | ||
tabIndex={0} | ||
ref={ref} | ||
css={getListStyling(selectKey === toggleKey)} | ||
aria-checked={selectKey === toggleKey} | ||
onClick={() => handleSelect(toggleKey)} | ||
onKeyDown={handleEnterKeyPress} | ||
{...attributes} | ||
> | ||
{text} | ||
</li> | ||
); | ||
}; | ||
|
||
export default forwardRef(List); |
35 changes: 35 additions & 0 deletions
35
frontend-monorepo/packages/hang-log-design-system/src/components/NewToggle/NewToggle.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import type { PropsWithChildren } from 'react'; | ||
import { useMemo, createContext } from 'react'; | ||
import { useSelect } from '@hooks/useSelect'; | ||
import List from '@components/NewToggle/List'; | ||
import Item from '@components/NewToggle/Item'; | ||
|
||
interface ToggleContextType { | ||
selectKey: number | string; | ||
handleSelect: (selectedId: number | string) => void; | ||
} | ||
|
||
export interface NewToggleProps extends PropsWithChildren { | ||
initialSelect?: number | string; | ||
} | ||
|
||
export const NewToggleContext = createContext<ToggleContextType | null>(null); | ||
|
||
const NewToggle = ({ initialSelect = 0, children }: NewToggleProps) => { | ||
const { selected, handleSelectClick } = useSelect(initialSelect); | ||
|
||
const context = useMemo( | ||
() => ({ | ||
selectKey: selected, | ||
handleSelect: handleSelectClick, | ||
}), | ||
[handleSelectClick, selected] | ||
); | ||
|
||
return <NewToggleContext.Provider value={context}>{children}</NewToggleContext.Provider>; | ||
}; | ||
|
||
NewToggle.List = List; | ||
NewToggle.Item = Item; | ||
|
||
export default NewToggle; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
43 changes: 43 additions & 0 deletions
43
frontend-monorepo/packages/hang-log-design-system/src/stories/NewToggle.stories.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import { containerStyle } from '@stories/styles'; | ||
import type { Meta, StoryObj } from '@storybook/react'; | ||
|
||
import NewToggle from '@components/NewToggle/NewToggle'; | ||
|
||
const meta = { | ||
title: 'NewToggle', | ||
component: NewToggle, | ||
args: { | ||
initialSelect: 'toggle1', | ||
}, | ||
argTypes: { | ||
initialSelect: { control: 'string' }, | ||
}, | ||
decorators: [ | ||
(Story) => ( | ||
<ul css={containerStyle}> | ||
<Story /> | ||
</ul> | ||
), | ||
], | ||
} satisfies Meta<typeof NewToggle>; | ||
|
||
export default meta; | ||
type Story = StoryObj<typeof meta>; | ||
|
||
export const Default: Story = { | ||
render: ({ ...args }) => ( | ||
<NewToggle {...args}> | ||
<h6>NewToggle</h6> | ||
<div style={{ display: 'flex' }}> | ||
<NewToggle.List text="Toggle 1" toggleKey="toggle1" /> | ||
<NewToggle.List text="Toggle 2" toggleKey="toggle2" /> | ||
<NewToggle.List text="Toggle 3" toggleKey="toggle3" /> | ||
</div> | ||
<div> | ||
<NewToggle.Item toggleKey="toggle1">나는토글1</NewToggle.Item> | ||
<NewToggle.Item toggleKey="toggle2">나는토글2</NewToggle.Item> | ||
<NewToggle.Item toggleKey="toggle3">나는토글3</NewToggle.Item> | ||
</div> | ||
</NewToggle> | ||
), | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters