@channel.io/bezier-react 1.7.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/cjs/components/Forms/FormControl/FormControl.js +1 -1
  2. package/dist/cjs/components/Forms/FormControl/FormControl.js.map +1 -1
  3. package/dist/cjs/components/Forms/FormControl/FormControlContext.js +4 -3
  4. package/dist/cjs/components/Forms/FormControl/FormControlContext.js.map +1 -1
  5. package/dist/cjs/components/Forms/FormGroup/FormGroup.js +2 -2
  6. package/dist/cjs/components/Forms/FormGroup/FormGroup.js.map +1 -1
  7. package/dist/cjs/components/Forms/FormHelperText/FormHelperText.js +2 -2
  8. package/dist/cjs/components/Forms/FormHelperText/FormHelperText.js.map +1 -1
  9. package/dist/cjs/components/Forms/FormLabel/FormLabel.js +2 -2
  10. package/dist/cjs/components/Forms/FormLabel/FormLabel.js.map +1 -1
  11. package/dist/cjs/components/Forms/SegmentedControl/SegmentedControlContext.js +3 -15
  12. package/dist/cjs/components/Forms/SegmentedControl/SegmentedControlContext.js.map +1 -1
  13. package/dist/cjs/components/Forms/useFormFieldProps.js +2 -2
  14. package/dist/cjs/components/Forms/useFormFieldProps.js.map +1 -1
  15. package/dist/cjs/components/ListItem/ListItem.styled.js +1 -1
  16. package/dist/cjs/components/Modals/Modal/Modal.js.map +1 -1
  17. package/dist/cjs/components/Modals/Modal/Modal.types.js.map +1 -1
  18. package/dist/cjs/components/Modals/Modal/ModalContent.js +1 -1
  19. package/dist/cjs/components/Modals/Modal/ModalContent.js.map +1 -1
  20. package/dist/cjs/components/Modals/Modal/ModalContentContext.js +4 -6
  21. package/dist/cjs/components/Modals/Modal/ModalContentContext.js.map +1 -1
  22. package/dist/cjs/components/Modals/Modal/ModalHeader.js +1 -1
  23. package/dist/cjs/components/Modals/Modal/ModalHeader.js.map +1 -1
  24. package/dist/cjs/components/OutlineItem/OutlineItem.js +2 -3
  25. package/dist/cjs/components/OutlineItem/OutlineItem.js.map +1 -1
  26. package/dist/cjs/components/OutlineItem/OutlineItemContext.js +9 -5
  27. package/dist/cjs/components/OutlineItem/OutlineItemContext.js.map +1 -1
  28. package/dist/cjs/components/Spinner/Spinner.styled.js +1 -1
  29. package/dist/cjs/components/Tabs/TabAction.js +1 -1
  30. package/dist/cjs/components/Tabs/TabAction.js.map +1 -1
  31. package/dist/cjs/components/Tabs/TabItem.js +1 -1
  32. package/dist/cjs/components/Tabs/TabItem.js.map +1 -1
  33. package/dist/cjs/components/Tabs/TabList.js +1 -1
  34. package/dist/cjs/components/Tabs/TabList.js.map +1 -1
  35. package/dist/cjs/components/Tabs/TabListContext.js +4 -6
  36. package/dist/cjs/components/Tabs/TabListContext.js.map +1 -1
  37. package/dist/cjs/components/Toast/ToastContext.js +4 -6
  38. package/dist/cjs/components/Toast/ToastContext.js.map +1 -1
  39. package/dist/cjs/components/Toast/ToastProvider.js +1 -4
  40. package/dist/cjs/components/Toast/ToastProvider.js.map +1 -1
  41. package/dist/cjs/components/Toast/useToast.js +2 -3
  42. package/dist/cjs/components/Toast/useToast.js.map +1 -1
  43. package/dist/cjs/components/Tooltip/Tooltip.js +4 -16
  44. package/dist/cjs/components/Tooltip/Tooltip.js.map +1 -1
  45. package/dist/cjs/components/Tooltip/Tooltip.styled.js +3 -56
  46. package/dist/cjs/components/Tooltip/Tooltip.styled.js.map +1 -1
  47. package/dist/cjs/components/Tooltip/Tooltip.types.js.map +1 -1
  48. package/dist/cjs/features/FeatureProvider.js +4 -3
  49. package/dist/cjs/features/FeatureProvider.js.map +1 -1
  50. package/dist/cjs/index.js +1 -3
  51. package/dist/cjs/index.js.map +1 -1
  52. package/dist/cjs/utils/reactUtils.js +21 -0
  53. package/dist/cjs/utils/reactUtils.js.map +1 -1
  54. package/dist/esm/components/Forms/FormControl/FormControl.mjs +2 -2
  55. package/dist/esm/components/Forms/FormControl/FormControl.mjs.map +1 -1
  56. package/dist/esm/components/Forms/FormControl/FormControlContext.mjs +3 -3
  57. package/dist/esm/components/Forms/FormControl/FormControlContext.mjs.map +1 -1
  58. package/dist/esm/components/Forms/FormGroup/FormGroup.mjs +1 -1
  59. package/dist/esm/components/Forms/FormGroup/FormGroup.mjs.map +1 -1
  60. package/dist/esm/components/Forms/FormHelperText/FormHelperText.mjs +1 -1
  61. package/dist/esm/components/Forms/FormHelperText/FormHelperText.mjs.map +1 -1
  62. package/dist/esm/components/Forms/FormLabel/FormLabel.mjs +1 -1
  63. package/dist/esm/components/Forms/FormLabel/FormLabel.mjs.map +1 -1
  64. package/dist/esm/components/Forms/SegmentedControl/SegmentedControlContext.mjs +3 -15
  65. package/dist/esm/components/Forms/SegmentedControl/SegmentedControlContext.mjs.map +1 -1
  66. package/dist/esm/components/Forms/useFormFieldProps.mjs +1 -1
  67. package/dist/esm/components/Forms/useFormFieldProps.mjs.map +1 -1
  68. package/dist/esm/components/ListItem/ListItem.styled.mjs +1 -1
  69. package/dist/esm/components/Modals/Modal/Modal.mjs.map +1 -1
  70. package/dist/esm/components/Modals/Modal/Modal.types.mjs.map +1 -1
  71. package/dist/esm/components/Modals/Modal/ModalContent.mjs +2 -2
  72. package/dist/esm/components/Modals/Modal/ModalContent.mjs.map +1 -1
  73. package/dist/esm/components/Modals/Modal/ModalContentContext.mjs +3 -4
  74. package/dist/esm/components/Modals/Modal/ModalContentContext.mjs.map +1 -1
  75. package/dist/esm/components/Modals/Modal/ModalHeader.mjs +3 -3
  76. package/dist/esm/components/Modals/Modal/ModalHeader.mjs.map +1 -1
  77. package/dist/esm/components/OutlineItem/OutlineItem.mjs +2 -3
  78. package/dist/esm/components/OutlineItem/OutlineItem.mjs.map +1 -1
  79. package/dist/esm/components/OutlineItem/OutlineItemContext.mjs +8 -3
  80. package/dist/esm/components/OutlineItem/OutlineItemContext.mjs.map +1 -1
  81. package/dist/esm/components/Spinner/Spinner.styled.mjs +1 -1
  82. package/dist/esm/components/Tabs/TabAction.mjs +3 -3
  83. package/dist/esm/components/Tabs/TabAction.mjs.map +1 -1
  84. package/dist/esm/components/Tabs/TabItem.mjs +3 -3
  85. package/dist/esm/components/Tabs/TabItem.mjs.map +1 -1
  86. package/dist/esm/components/Tabs/TabList.mjs +2 -2
  87. package/dist/esm/components/Tabs/TabList.mjs.map +1 -1
  88. package/dist/esm/components/Tabs/TabListContext.mjs +3 -4
  89. package/dist/esm/components/Tabs/TabListContext.mjs.map +1 -1
  90. package/dist/esm/components/Toast/ToastContext.mjs +3 -4
  91. package/dist/esm/components/Toast/ToastContext.mjs.map +1 -1
  92. package/dist/esm/components/Toast/ToastProvider.mjs +2 -5
  93. package/dist/esm/components/Toast/ToastProvider.mjs.map +1 -1
  94. package/dist/esm/components/Toast/useToast.mjs +3 -4
  95. package/dist/esm/components/Toast/useToast.mjs.map +1 -1
  96. package/dist/esm/components/Tooltip/Tooltip.mjs +4 -16
  97. package/dist/esm/components/Tooltip/Tooltip.mjs.map +1 -1
  98. package/dist/esm/components/Tooltip/Tooltip.styled.mjs +3 -56
  99. package/dist/esm/components/Tooltip/Tooltip.styled.mjs.map +1 -1
  100. package/dist/esm/components/Tooltip/Tooltip.types.mjs.map +1 -1
  101. package/dist/esm/features/FeatureProvider.mjs +5 -4
  102. package/dist/esm/features/FeatureProvider.mjs.map +1 -1
  103. package/dist/esm/index.mjs +1 -2
  104. package/dist/esm/index.mjs.map +1 -1
  105. package/dist/esm/utils/reactUtils.mjs +21 -1
  106. package/dist/esm/utils/reactUtils.mjs.map +1 -1
  107. package/dist/types/components/Forms/FormControl/FormControlContext.d.ts +1 -1
  108. package/dist/types/components/Forms/FormControl/FormControlContext.d.ts.map +1 -1
  109. package/dist/types/components/Forms/FormControl/index.d.ts +1 -1
  110. package/dist/types/components/Forms/FormControl/index.d.ts.map +1 -1
  111. package/dist/types/components/Forms/SegmentedControl/SegmentedControlContext.d.ts +3 -3
  112. package/dist/types/components/Forms/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
  113. package/dist/types/components/Forms/index.d.ts +1 -2
  114. package/dist/types/components/Forms/index.d.ts.map +1 -1
  115. package/dist/types/components/Forms/useFormFieldProps.d.ts.map +1 -1
  116. package/dist/types/components/Modals/Modal/Modal.types.d.ts +1 -1
  117. package/dist/types/components/Modals/Modal/Modal.types.d.ts.map +1 -1
  118. package/dist/types/components/Modals/Modal/ModalContentContext.d.ts +2 -3
  119. package/dist/types/components/Modals/Modal/ModalContentContext.d.ts.map +1 -1
  120. package/dist/types/components/Modals/Modal/ModalHeader.d.ts.map +1 -1
  121. package/dist/types/components/OutlineItem/OutlineItem.d.ts.map +1 -1
  122. package/dist/types/components/OutlineItem/OutlineItemContext.d.ts +4 -10
  123. package/dist/types/components/OutlineItem/OutlineItemContext.d.ts.map +1 -1
  124. package/dist/types/components/Tabs/TabAction.d.ts.map +1 -1
  125. package/dist/types/components/Tabs/TabItem.d.ts.map +1 -1
  126. package/dist/types/components/Tabs/TabListContext.d.ts +1 -2
  127. package/dist/types/components/Tabs/TabListContext.d.ts.map +1 -1
  128. package/dist/types/components/Toast/ToastContext.d.ts +1 -2
  129. package/dist/types/components/Toast/ToastContext.d.ts.map +1 -1
  130. package/dist/types/components/Toast/ToastProvider.d.ts.map +1 -1
  131. package/dist/types/components/Toast/useToast.d.ts.map +1 -1
  132. package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -1
  133. package/dist/types/components/Tooltip/Tooltip.styled.d.ts.map +1 -1
  134. package/dist/types/components/Tooltip/Tooltip.types.d.ts +3 -3
  135. package/dist/types/features/FeatureProvider.d.ts.map +1 -1
  136. package/dist/types/utils/reactUtils.d.ts +14 -0
  137. package/dist/types/utils/reactUtils.d.ts.map +1 -1
  138. package/package.json +1 -1
  139. package/src/components/Forms/FormControl/FormControl.tsx +3 -3
  140. package/src/components/Forms/FormControl/FormControlContext.ts +5 -2
  141. package/src/components/Forms/FormControl/index.ts +1 -1
  142. package/src/components/Forms/FormGroup/FormGroup.tsx +1 -1
  143. package/src/components/Forms/FormHelperText/FormHelperText.tsx +1 -1
  144. package/src/components/Forms/FormLabel/FormLabel.tsx +1 -1
  145. package/src/components/Forms/SegmentedControl/SegmentedControlContext.ts +3 -26
  146. package/src/components/Forms/Slider/Slider.test.tsx +11 -4
  147. package/src/components/Forms/index.ts +0 -2
  148. package/src/components/Forms/useFormFieldProps.ts +1 -2
  149. package/src/components/KeyValueListItem/KeyValueListItem.test.tsx +4 -1
  150. package/src/components/Modals/Modal/Modal.stories.tsx +1 -1
  151. package/src/components/Modals/Modal/Modal.tsx +0 -1
  152. package/src/components/Modals/Modal/Modal.types.ts +1 -1
  153. package/src/components/Modals/Modal/ModalContent.tsx +3 -3
  154. package/src/components/Modals/Modal/ModalContentContext.ts +5 -4
  155. package/src/components/Modals/Modal/ModalHeader.tsx +3 -6
  156. package/src/components/OutlineItem/OutlineItem.tsx +6 -4
  157. package/src/components/OutlineItem/OutlineItemContext.ts +16 -5
  158. package/src/components/Tabs/TabAction.tsx +3 -6
  159. package/src/components/Tabs/TabItem.tsx +3 -6
  160. package/src/components/Tabs/TabList.tsx +3 -3
  161. package/src/components/Tabs/TabListContext.ts +5 -4
  162. package/src/components/Toast/ToastContext.ts +5 -5
  163. package/src/components/Toast/ToastProvider.tsx +3 -5
  164. package/src/components/Toast/useToast.ts +3 -5
  165. package/src/components/Tooltip/Tooltip.stories.tsx +2 -2
  166. package/src/components/Tooltip/Tooltip.styled.ts +0 -77
  167. package/src/components/Tooltip/Tooltip.test.tsx +8 -2
  168. package/src/components/Tooltip/Tooltip.tsx +4 -27
  169. package/src/components/Tooltip/Tooltip.types.ts +3 -3
  170. package/src/components/Tooltip/index.ts +0 -1
  171. package/src/features/FeatureProvider.tsx +9 -6
  172. package/src/utils/reactUtils.ts +41 -0
  173. package/dist/cjs/components/Forms/useFormControlContext.js +0 -13
  174. package/dist/cjs/components/Forms/useFormControlContext.js.map +0 -1
  175. package/dist/cjs/components/OutlineItem/useOutlineItemContext.js +0 -16
  176. package/dist/cjs/components/OutlineItem/useOutlineItemContext.js.map +0 -1
  177. package/dist/esm/components/Forms/useFormControlContext.mjs +0 -9
  178. package/dist/esm/components/Forms/useFormControlContext.mjs.map +0 -1
  179. package/dist/esm/components/OutlineItem/useOutlineItemContext.mjs +0 -12
  180. package/dist/esm/components/OutlineItem/useOutlineItemContext.mjs.map +0 -1
  181. package/dist/types/components/Forms/useFormControlContext.d.ts +0 -3
  182. package/dist/types/components/Forms/useFormControlContext.d.ts.map +0 -1
  183. package/dist/types/components/OutlineItem/useOutlineItemContext.d.ts +0 -4
  184. package/dist/types/components/OutlineItem/useOutlineItemContext.d.ts.map +0 -1
  185. package/src/components/Forms/useFormControlContext.ts +0 -9
  186. package/src/components/OutlineItem/useOutlineItemContext.ts +0 -16
@@ -1,6 +1,9 @@
1
1
  import React from 'react'
2
2
 
3
- import { isInaccessible } from '@testing-library/react'
3
+ import {
4
+ isInaccessible,
5
+ waitFor,
6
+ } from '@testing-library/react'
4
7
  import userEvent from '@testing-library/user-event'
5
8
 
6
9
  import { render } from '~/src/utils/testUtils'
@@ -217,7 +220,9 @@ describe('Slider', () => {
217
220
  const { getByRole, getAllByText } = renderSlider({ defaultValue: [0] })
218
221
  const sliderThumb = getByRole('slider')
219
222
  await user.hover(sliderThumb)
220
- expect(getAllByText('0')[0]).toBeInTheDocument()
223
+ await waitFor(() => {
224
+ expect(getAllByText('0')[0]).toBeInTheDocument()
225
+ }, { timeout: 10000 })
221
226
  })
222
227
 
223
228
  it('should show tooltip when user focuses on the thumb', async () => {
@@ -230,8 +235,10 @@ describe('Slider', () => {
230
235
  const { getByRole, getAllByText } = renderSlider({ defaultValue: [0] })
231
236
  const sliderThumb = getByRole('slider')
232
237
  await user.click(sliderThumb)
233
- expect(getByRole('tooltip')).toBeInTheDocument()
234
- expect(getAllByText('0')[0]).toBeInTheDocument()
238
+ await waitFor(() => {
239
+ expect(getByRole('tooltip')).toBeInTheDocument()
240
+ expect(getAllByText('0')[0]).toBeInTheDocument()
241
+ }, { timeout: 10000 })
235
242
  })
236
243
 
237
244
  it('should not show tooltip when disableTooltip is true', async () => {
@@ -1,6 +1,5 @@
1
1
  import type { FormComponentProps } from './Form.types'
2
2
  import FormFieldSize from './FormFieldSize'
3
- import useFormControlContext from './useFormControlContext'
4
3
  import useFormFieldProps from './useFormFieldProps'
5
4
  import useKeyboardActionLockerWhileComposing from './useKeyboardActionLockerWhileComposing'
6
5
 
@@ -8,7 +7,6 @@ export type { FormComponentProps }
8
7
  export * from './Inputs/constants/CommonImeControlKeys'
9
8
  export {
10
9
  FormFieldSize,
11
- useFormControlContext,
12
10
  useFormFieldProps,
13
11
  useKeyboardActionLockerWhileComposing,
14
12
  }
@@ -3,8 +3,7 @@ import { useMemo } from 'react'
3
3
  import { ariaAttr } from '~/src/utils/domUtils'
4
4
 
5
5
  import type { FormComponentProps } from '~/src/components/Forms/Form.types'
6
-
7
- import useFormControlContext from './useFormControlContext'
6
+ import { useFormControlContext } from '~/src/components/Forms/FormControl'
8
7
 
9
8
  // TODO: 테스트 추가
10
9
  function useFormFieldProps<Props extends FormComponentProps>(props?: Props) {
@@ -4,6 +4,7 @@ import {
4
4
  AppleIcon,
5
5
  BadgeIcon,
6
6
  } from '@channel.io/bezier-icons'
7
+ import { waitFor } from '@testing-library/react'
7
8
  import userEvent from '@testing-library/user-event'
8
9
 
9
10
  import { render } from '~/src/utils/testUtils'
@@ -176,7 +177,9 @@ describe('KeyValueListItem', () => {
176
177
  const actionItemIcon = actionItemIconWrapper?.firstChild
177
178
 
178
179
  await user.hover(actionItemIcon as HTMLElement)
179
- expect(getByRole('tooltip')).toBeInTheDocument()
180
+ await waitFor(() => {
181
+ expect(getByRole('tooltip')).toBeInTheDocument()
182
+ }, { timeout: 10000 })
180
183
  })
181
184
  })
182
185
 
@@ -85,7 +85,7 @@ function ModalComposition({
85
85
 
86
86
  <ModalBody>
87
87
  <FormControl labelPosition="left">
88
- <FormLabel>Name</FormLabel>
88
+ <FormLabel help="Lorem Ipsum">Name</FormLabel>
89
89
  <Select text="Lorem Ipsum">
90
90
  { Array.from({ length: 20 }).map((_, index) => (
91
91
  <ListItem
@@ -52,4 +52,3 @@ export function Modal({
52
52
  </DialogPrimitive.Root>
53
53
  )
54
54
  }
55
-
@@ -134,4 +134,4 @@ export interface ModalCloseProps extends
134
134
  ChildrenProps<React.ReactElement> {}
135
135
 
136
136
  export interface ModalContentContextValue extends
137
- NonNullable<Pick<ModalContentOptions, 'showCloseIcon'>> {}
137
+ Required<Pick<ModalContentOptions, 'showCloseIcon'>> {}
@@ -13,7 +13,7 @@ import {
13
13
  type ModalContentContextValue,
14
14
  type ModalContentProps,
15
15
  } from './Modal.types'
16
- import ModalContentContext from './ModalContentContext'
16
+ import { ModalContentContextProvider } from './ModalContentContext'
17
17
  import { ModalClose } from './ModalHelpers'
18
18
 
19
19
  import * as Styled from './Modal.styled'
@@ -67,9 +67,9 @@ export const ModalContent = forwardRef(function ModalContent({
67
67
  {...rest}
68
68
  >
69
69
  <Styled.Section>
70
- <ModalContentContext.Provider value={contextValue}>
70
+ <ModalContentContextProvider value={contextValue}>
71
71
  { children }
72
- </ModalContentContext.Provider>
72
+ </ModalContentContextProvider>
73
73
 
74
74
  { /* NOTE: To prevent focusing first on the close button when opening the modal, place the close button behind. */ }
75
75
  { showCloseIcon && (
@@ -1,9 +1,10 @@
1
- import React from 'react'
1
+ import { createContext } from '~/src/utils/reactUtils'
2
2
 
3
3
  import { type ModalContentContextValue } from './Modal.types'
4
4
 
5
- const ModalContentContext = React.createContext<ModalContentContextValue>({
5
+ export const [
6
+ ModalContentContextProvider,
7
+ useModalContentContext,
8
+ ] = createContext<ModalContentContextValue>({
6
9
  showCloseIcon: false,
7
10
  })
8
-
9
- export default ModalContentContext
@@ -1,7 +1,4 @@
1
- import React, {
2
- forwardRef,
3
- useContext,
4
- } from 'react'
1
+ import React, { forwardRef } from 'react'
5
2
 
6
3
  import * as DialogPrimitive from '@radix-ui/react-dialog'
7
4
 
@@ -14,7 +11,7 @@ import {
14
11
  type ModalHeaderProps,
15
12
  ModalTitleSize,
16
13
  } from './Modal.types'
17
- import ModalContentContext from './ModalContentContext'
14
+ import { useModalContentContext } from './ModalContentContext'
18
15
 
19
16
  import * as Styled from './Modal.styled'
20
17
 
@@ -82,7 +79,7 @@ export const ModalHeader = forwardRef(function ModalHeader({
82
79
  hidden = false,
83
80
  ...rest
84
81
  }: ModalHeaderProps, forwardedRef: React.Ref<HTMLElement>) {
85
- const { showCloseIcon } = useContext(ModalContentContext)
82
+ const { showCloseIcon } = useModalContentContext()
86
83
  const hasTitleArea = title || showCloseIcon
87
84
  const Hidden = hidden ? VisuallyHidden : React.Fragment
88
85
 
@@ -19,8 +19,10 @@ import { isNil } from '~/src/utils/typeUtils'
19
19
  import { IconSize } from '~/src/components/Icon'
20
20
 
21
21
  import type OutlineItemProps from './OutlineItem.types'
22
- import { OutlineItemContext } from './OutlineItemContext'
23
- import useOutlineItemContext from './useOutlineItemContext'
22
+ import {
23
+ OutlineItemContextProvider,
24
+ useOutlineItemContext,
25
+ } from './OutlineItemContext'
24
26
 
25
27
  import {
26
28
  ChevronWrapper,
@@ -250,9 +252,9 @@ function OutlineItem(
250
252
  }
251
253
 
252
254
  return (
253
- <OutlineItemContext.Provider value={passedContext}>
255
+ <OutlineItemContextProvider value={passedContext}>
254
256
  { element }
255
- </OutlineItemContext.Provider>
257
+ </OutlineItemContextProvider>
256
258
  )
257
259
  })
258
260
  ), [
@@ -1,23 +1,23 @@
1
1
  import type React from 'react'
2
- import { createContext } from 'react'
3
2
 
4
3
  import { noop } from '~/src/utils/functionUtils'
4
+ import { createContext } from '~/src/utils/reactUtils'
5
5
 
6
- export interface OutlineItemContextProps {
6
+ interface OutlineItemContextProps {
7
7
  depth: number
8
8
  paddingLeft: number
9
9
  active: boolean
10
10
  onClick: (event?: React.MouseEvent<Element>, name?: string) => void
11
11
  }
12
12
 
13
- export const defaultOutlineItemContext = {
13
+ const defaultOutlineItemContext = {
14
14
  depth: 0,
15
15
  paddingLeft: 0,
16
16
  active: false,
17
17
  onClick: noop,
18
18
  }
19
19
 
20
- export function mergeOutlineItemContexts(
20
+ function mergeOutlineItemContexts(
21
21
  inherited: OutlineItemContextProps,
22
22
  props: Partial<Omit<OutlineItemContextProps, 'depth'>>,
23
23
  indent: number,
@@ -33,4 +33,15 @@ export function mergeOutlineItemContexts(
33
33
  }
34
34
  }
35
35
 
36
- export const OutlineItemContext = createContext<OutlineItemContextProps>(defaultOutlineItemContext)
36
+ const [
37
+ OutlineItemContextProvider,
38
+ useOutlineItemContextBase,
39
+ ] = createContext<OutlineItemContextProps>(defaultOutlineItemContext)
40
+
41
+ export { OutlineItemContextProvider }
42
+
43
+ export const useOutlineItemContext = (props: Partial<Omit<OutlineItemContextProps, 'depth'>>, indent: number) => {
44
+ const inheritedContext = useOutlineItemContextBase() ?? defaultOutlineItemContext
45
+ const context = mergeOutlineItemContexts(inheritedContext, props, indent)
46
+ return context
47
+ }
@@ -1,7 +1,4 @@
1
- import React, {
2
- forwardRef,
3
- useContext,
4
- } from 'react'
1
+ import React, { forwardRef } from 'react'
5
2
 
6
3
  import { OpenInNewIcon } from '@channel.io/bezier-icons'
7
4
 
@@ -12,7 +9,7 @@ import { isNil } from '~/src/utils/typeUtils'
12
9
  import { IconSize } from '~/src/components/Icon'
13
10
  import { Text } from '~/src/components/Text'
14
11
 
15
- import TabListContext from './TabListContext'
12
+ import { useTabListContext } from './TabListContext'
16
13
  import {
17
14
  type TabActionElement,
18
15
  type TabActionProps,
@@ -52,7 +49,7 @@ export const TabAction = forwardRef(function TabAction<Link extends string | und
52
49
  ...rest
53
50
  }: TabActionProps<Link>, forwardedRef: React.Ref<TabActionElement<Link>>,
54
51
  ) {
55
- const { size } = useContext(TabListContext)
52
+ const { size } = useTabListContext()
56
53
 
57
54
  return (
58
55
  isNil(href) ? (
@@ -1,7 +1,4 @@
1
- import React, {
2
- forwardRef,
3
- useContext,
4
- } from 'react'
1
+ import React, { forwardRef } from 'react'
5
2
 
6
3
  import * as Tabs from '@radix-ui/react-tabs'
7
4
 
@@ -11,7 +8,7 @@ import {
11
8
  ButtonStyleVariant,
12
9
  } from '~/src/components/Button'
13
10
 
14
- import TabListContext from './TabListContext'
11
+ import { useTabListContext } from './TabListContext'
15
12
  import {
16
13
  type TabItemProps,
17
14
  TabSize,
@@ -40,7 +37,7 @@ export const TabItem = forwardRef(function TabItem({
40
37
  children,
41
38
  ...rest
42
39
  }: TabItemProps, forwardedRef: React.Ref<HTMLButtonElement>) {
43
- const { size } = useContext(TabListContext)
40
+ const { size } = useTabListContext()
44
41
 
45
42
  if (typeof children !== 'string') {
46
43
  return null
@@ -3,7 +3,7 @@ import React, {
3
3
  useMemo,
4
4
  } from 'react'
5
5
 
6
- import TabListContext from './TabListContext'
6
+ import { TabListContextProvider } from './TabListContext'
7
7
  import {
8
8
  type TabListProps,
9
9
  TabSize,
@@ -36,7 +36,7 @@ export const TabList = forwardRef(function TabList({
36
36
  }), [size])
37
37
 
38
38
  return (
39
- <TabListContext.Provider value={heightContextValue}>
39
+ <TabListContextProvider value={heightContextValue}>
40
40
  <Styled.TabList
41
41
  size={size}
42
42
  ref={forwardedRef}
@@ -47,6 +47,6 @@ export const TabList = forwardRef(function TabList({
47
47
  >
48
48
  { children }
49
49
  </Styled.TabList>
50
- </TabListContext.Provider>
50
+ </TabListContextProvider>
51
51
  )
52
52
  })
@@ -1,12 +1,13 @@
1
- import { createContext } from 'react'
1
+ import { createContext } from '~/src/utils/reactUtils'
2
2
 
3
3
  import {
4
4
  type TabListContextValue,
5
5
  TabSize,
6
6
  } from './Tabs.types'
7
7
 
8
- const TabListContext = createContext<TabListContextValue>({
8
+ export const [
9
+ TabListContextProvider,
10
+ useTabListContext,
11
+ ] = createContext<TabListContextValue>({
9
12
  size: TabSize.M,
10
13
  })
11
-
12
- export default TabListContext
@@ -1,10 +1,12 @@
1
- import { createContext } from 'react'
2
-
3
1
  import { noop } from '~/src/utils/functionUtils'
2
+ import { createContext } from '~/src/utils/reactUtils'
4
3
 
5
4
  import { type ToastContextType } from './Toast.types'
6
5
 
7
- const ToastContext = createContext<ToastContextType>({
6
+ export const [
7
+ ToastContextProvider,
8
+ useToastContext,
9
+ ] = createContext<ToastContextType>({
8
10
  add: () => '',
9
11
  update: () => '',
10
12
  remove: noop,
@@ -12,5 +14,3 @@ const ToastContext = createContext<ToastContextType>({
12
14
  leftToasts: [],
13
15
  rightToasts: [],
14
16
  })
15
-
16
- export default ToastContext
@@ -15,13 +15,11 @@ import {
15
15
  type ToastType,
16
16
  } from './Toast.types'
17
17
  import ToastContainer from './ToastContainer'
18
- import ToastContext from './ToastContext'
18
+ import { ToastContextProvider } from './ToastContext'
19
19
  import ToastController from './ToastController'
20
20
  import ToastElement from './ToastElement'
21
21
  import useToastProviderValues from './useToastContextValues'
22
22
 
23
- const { Provider } = ToastContext
24
-
25
23
  function ToastProvider({
26
24
  autoDismissTimeout = 3000,
27
25
  children = [],
@@ -77,7 +75,7 @@ function ToastProvider({
77
75
  ])
78
76
 
79
77
  return (
80
- <Provider value={toastContextValue}>
78
+ <ToastContextProvider value={toastContextValue}>
81
79
  { children }
82
80
  { createPortal(
83
81
  [
@@ -86,7 +84,7 @@ function ToastProvider({
86
84
  ],
87
85
  getRootElement(),
88
86
  ) }
89
- </Provider>
87
+ </ToastContextProvider>
90
88
  )
91
89
  }
92
90
 
@@ -1,12 +1,10 @@
1
- import { useContext } from 'react'
2
-
3
- import ToastContext from './ToastContext'
1
+ import { useToastContext } from './ToastContext'
4
2
 
5
3
  export default function useToast() {
6
- const context = useContext(ToastContext)
4
+ const context = useToastContext()
7
5
 
8
6
  if (!context) {
9
- throw Error('ToastProvider가 필요합니다.')
7
+ throw Error('\'useToast\' must be used within \'ToastProvider\'')
10
8
  }
11
9
 
12
10
  return {
@@ -57,8 +57,8 @@ Primary.args = {
57
57
  disabled: false,
58
58
  keepInContainer: true,
59
59
  allowHover: false,
60
- delayShow: 0,
61
- delayHide: 0,
60
+ delayShow: undefined,
61
+ delayHide: undefined,
62
62
  children: (<Button text="Button" />),
63
63
  content: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.',
64
64
  description: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
@@ -1,10 +1,7 @@
1
1
  import {
2
2
  LineHeightAbsoluteNumber,
3
- TransitionDuration,
4
3
  Typography,
5
- css,
6
4
  ellipsis,
7
- keyframes,
8
5
  styled,
9
6
  } from '~/src/foundation'
10
7
 
@@ -19,64 +16,6 @@ import { Text } from '~/src/components/Text'
19
16
 
20
17
  import { type TooltipProps } from './Tooltip.types'
21
18
 
22
- const fadeIn = keyframes`
23
- from {
24
- opacity: 0;
25
- }
26
-
27
- to {
28
- opacity: 1;
29
- }
30
- `
31
-
32
- const SLIDE_OFFSET = 2
33
-
34
- const slideUp = keyframes`
35
- from {
36
- transform: translateY(${SLIDE_OFFSET}px);
37
- }
38
-
39
- to {
40
- transform: translateY(0);
41
- }
42
- `
43
-
44
- const slideRight = keyframes`
45
- from {
46
- transform: translateX(-${SLIDE_OFFSET}px);
47
- }
48
-
49
- to {
50
- transform: translateX(0);
51
- }
52
- `
53
-
54
- const slideDown = keyframes`
55
- from {
56
- transform: translateY(-${SLIDE_OFFSET}px);
57
- }
58
-
59
- to {
60
- transform: translateY(0);
61
- }
62
- `
63
-
64
- const slideLeft = keyframes`
65
- from {
66
- transform: translateX(${SLIDE_OFFSET}px);
67
- }
68
-
69
- to {
70
- transform: translateX(0);
71
- }
72
- `
73
-
74
- const getSlideAnimation = (frames: ReturnType<typeof keyframes>) => css`
75
- animation-name: ${() => frames}, ${() => fadeIn};
76
- animation-duration: ${TransitionDuration.M}ms;
77
- animation-timing-function: cubic-bezier(0.3, 0, 0, 1);
78
- `
79
-
80
19
  export const TooltipContent = styled(AlphaStack).attrs({
81
20
  direction: 'horizontal',
82
21
  spacing: 4,
@@ -94,22 +33,6 @@ export const TooltipContent = styled(AlphaStack).attrs({
94
33
  ${({ foundation }) => foundation?.elevation?.ev3(true)};
95
34
  ${({ foundation }) => foundation?.rounding?.round8};
96
35
 
97
- &[data-side="top"] {
98
- ${getSlideAnimation(slideUp)}
99
- }
100
-
101
- &[data-side="right"] {
102
- ${getSlideAnimation(slideRight)}
103
- }
104
-
105
- &[data-side="bottom"] {
106
- ${getSlideAnimation(slideDown)}
107
- }
108
-
109
- &[data-side="left"] {
110
- ${getSlideAnimation(slideLeft)}
111
- }
112
-
113
36
  ${({ interpolation }) => interpolation}
114
37
  `
115
38
 
@@ -22,7 +22,10 @@ describe('Tooltip', () => {
22
22
  children,
23
23
  ...rest
24
24
  }: TooltipProps = {}) => render(
25
- <Tooltip {...rest}>
25
+ <Tooltip
26
+ delayShow={0}
27
+ {...rest}
28
+ >
26
29
  <button type="button">
27
30
  Trigger
28
31
  </button>
@@ -127,7 +130,10 @@ describe('TooltipProvider', () => {
127
130
  children,
128
131
  ...rest
129
132
  }: TooltipProviderProps = {}) => render(
130
- <TooltipProvider {...rest}>
133
+ <TooltipProvider
134
+ delayShow={0}
135
+ {...rest}
136
+ >
131
137
  <Tooltip>
132
138
  <button type="button">
133
139
  Trigger
@@ -10,6 +10,7 @@ import React, {
10
10
  import * as TooltipPrimitive from '@radix-ui/react-tooltip'
11
11
 
12
12
  import { document } from '~/src/utils/domUtils'
13
+ import { createContext } from '~/src/utils/reactUtils'
13
14
  import { isBoolean } from '~/src/utils/typeUtils'
14
15
 
15
16
  import {
@@ -20,30 +21,6 @@ import {
20
21
 
21
22
  import * as Styled from './Tooltip.styled'
22
23
 
23
- // TODO: (@ed) Evolve it into a commonly reusable function
24
- // FIXME: duplicate
25
- function createContext<ContextValue>(
26
- providerName: string,
27
- defaultValue: ContextValue,
28
- ) {
29
- const Context = React.createContext<ContextValue>(defaultValue)
30
-
31
- function useContext(consumerName: string) {
32
- const contextValue = React.useContext(Context)
33
-
34
- if (!contextValue) {
35
- throw new Error(`'${consumerName}' must be used within '${providerName}'`)
36
- }
37
-
38
- return contextValue
39
- }
40
-
41
- return [
42
- Context.Provider,
43
- useContext,
44
- ] as const
45
- }
46
-
47
24
  function getSideAndAlign(
48
25
  placement: TooltipPosition,
49
26
  ): Pick<TooltipPrimitive.TooltipContentProps, 'side' | 'align'> {
@@ -123,7 +100,7 @@ const [
123
100
  */
124
101
  TooltipGlobalContextProvider,
125
102
  useTooltipGlobalContext,
126
- ] = createContext<Required<Pick<TooltipProviderProps, 'delayHide'>> | null>('TooltipProvider', null)
103
+ ] = createContext<Required<Pick<TooltipProviderProps, 'delayHide'>> | null>(null, 'TooltipProvider')
127
104
 
128
105
  /**
129
106
  * `TooltipProvider` is used to globally provide props to child tooltips.
@@ -139,9 +116,9 @@ const [
139
116
  export function TooltipProvider({
140
117
  children,
141
118
  allowHover = false,
142
- delayShow = 0,
119
+ delayShow = 300,
143
120
  delayHide = 0,
144
- skipDelayShow = 0,
121
+ skipDelayShow = 500,
145
122
  }: TooltipProviderProps) {
146
123
  const contextValue = useMemo(() => ({
147
124
  delayHide,
@@ -33,7 +33,7 @@ interface TooltipProviderOptions {
33
33
  allowHover?: boolean
34
34
  /**
35
35
  * The delay from when the mouse enters a tooltip trigger until the tooltip opens.
36
- * @default 0
36
+ * @default 300
37
37
  */
38
38
  delayShow?: number
39
39
  /**
@@ -43,7 +43,7 @@ interface TooltipProviderOptions {
43
43
  delayHide?: number
44
44
  /**
45
45
  * How much time a user has to enter another trigger without incurring a delay again.
46
- * @default 0
46
+ * @default 500
47
47
  */
48
48
  skipDelayShow?: number
49
49
  }
@@ -91,7 +91,7 @@ interface TooltipOptions {
91
91
  /**
92
92
  * The delay from when the mouse enters a tooltip trigger until the tooltip opens.
93
93
  * Inherits from the nearest `TooltipProvider`.
94
- * @default 0
94
+ * @default 300
95
95
  */
96
96
  delayShow?: number
97
97
  /**
@@ -9,4 +9,3 @@ export type {
9
9
  TooltipProps,
10
10
  TooltipProviderProps,
11
11
  } from './Tooltip.types'
12
-