@channel.io/bezier-react 2.0.2 → 2.0.4

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 (123) hide show
  1. package/dist/cjs/components/AlphaAvatar/Avatar.js +121 -0
  2. package/dist/cjs/components/AlphaAvatar/Avatar.js.map +1 -0
  3. package/dist/cjs/components/AlphaAvatar/Avatar.module.scss.js +8 -0
  4. package/dist/cjs/components/AlphaAvatar/Avatar.module.scss.js.map +1 -0
  5. package/dist/cjs/components/AlphaAvatar/assets/default-avatar.svg.js +8 -0
  6. package/dist/cjs/components/AlphaAvatar/assets/default-avatar.svg.js.map +1 -0
  7. package/dist/cjs/components/AlphaAvatar/useProgressiveImage.js +48 -0
  8. package/dist/cjs/components/AlphaAvatar/useProgressiveImage.js.map +1 -0
  9. package/dist/cjs/components/AlphaAvatarGroup/AvatarGroup.js +153 -0
  10. package/dist/cjs/components/AlphaAvatarGroup/AvatarGroup.js.map +1 -0
  11. package/dist/cjs/components/AlphaAvatarGroup/AvatarGroup.module.scss.js +8 -0
  12. package/dist/cjs/components/AlphaAvatarGroup/AvatarGroup.module.scss.js.map +1 -0
  13. package/dist/cjs/components/AlphaButton/Button.js +78 -0
  14. package/dist/cjs/components/AlphaButton/Button.js.map +1 -0
  15. package/dist/cjs/components/AlphaButton/Button.module.scss.js +8 -0
  16. package/dist/cjs/components/AlphaButton/Button.module.scss.js.map +1 -0
  17. package/dist/cjs/components/AlphaFloatingButton/FloatingButton.js +77 -0
  18. package/dist/cjs/components/AlphaFloatingButton/FloatingButton.js.map +1 -0
  19. package/dist/cjs/components/AlphaFloatingButton/FloatingButton.module.scss.js +8 -0
  20. package/dist/cjs/components/AlphaFloatingButton/FloatingButton.module.scss.js.map +1 -0
  21. package/dist/cjs/components/BaseButton/BaseButton.js +2 -1
  22. package/dist/cjs/components/BaseButton/BaseButton.js.map +1 -1
  23. package/dist/cjs/components/Button/Button.js +1 -5
  24. package/dist/cjs/components/Button/Button.js.map +1 -1
  25. package/dist/cjs/index.js +16 -7
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/packages/bezier-tokens/dist/esm/global.js +2 -2
  28. package/dist/cjs/packages/bezier-tokens/dist/esm/global.js.map +1 -1
  29. package/dist/cjs/styles.css +1 -1
  30. package/dist/esm/components/AlphaAvatar/Avatar.mjs +115 -0
  31. package/dist/esm/components/AlphaAvatar/Avatar.mjs.map +1 -0
  32. package/dist/esm/components/AlphaAvatar/Avatar.module.scss.mjs +4 -0
  33. package/dist/esm/components/AlphaAvatar/Avatar.module.scss.mjs.map +1 -0
  34. package/dist/esm/components/AlphaAvatar/assets/default-avatar.svg.mjs +4 -0
  35. package/dist/esm/components/AlphaAvatar/assets/default-avatar.svg.mjs.map +1 -0
  36. package/dist/esm/components/AlphaAvatar/useProgressiveImage.mjs +44 -0
  37. package/dist/esm/components/AlphaAvatar/useProgressiveImage.mjs.map +1 -0
  38. package/dist/esm/components/AlphaAvatarGroup/AvatarGroup.mjs +149 -0
  39. package/dist/esm/components/AlphaAvatarGroup/AvatarGroup.mjs.map +1 -0
  40. package/dist/esm/components/AlphaAvatarGroup/AvatarGroup.module.scss.mjs +4 -0
  41. package/dist/esm/components/AlphaAvatarGroup/AvatarGroup.module.scss.mjs.map +1 -0
  42. package/dist/esm/components/AlphaButton/Button.mjs +76 -0
  43. package/dist/esm/components/AlphaButton/Button.mjs.map +1 -0
  44. package/dist/esm/components/AlphaButton/Button.module.scss.mjs +4 -0
  45. package/dist/esm/components/AlphaButton/Button.module.scss.mjs.map +1 -0
  46. package/dist/esm/components/AlphaFloatingButton/FloatingButton.mjs +75 -0
  47. package/dist/esm/components/AlphaFloatingButton/FloatingButton.mjs.map +1 -0
  48. package/dist/esm/components/AlphaFloatingButton/FloatingButton.module.scss.mjs +4 -0
  49. package/dist/esm/components/AlphaFloatingButton/FloatingButton.module.scss.mjs.map +1 -0
  50. package/dist/esm/components/BaseButton/BaseButton.mjs +2 -1
  51. package/dist/esm/components/BaseButton/BaseButton.mjs.map +1 -1
  52. package/dist/esm/components/Button/Button.mjs +1 -5
  53. package/dist/esm/components/Button/Button.mjs.map +1 -1
  54. package/dist/esm/index.mjs +4 -0
  55. package/dist/esm/index.mjs.map +1 -1
  56. package/dist/esm/packages/bezier-tokens/dist/esm/global.mjs +2 -2
  57. package/dist/esm/packages/bezier-tokens/dist/esm/global.mjs.map +1 -1
  58. package/dist/esm/styles.css +1 -1
  59. package/dist/types/components/AlphaAvatar/Avatar.d.ts +22 -0
  60. package/dist/types/components/AlphaAvatar/Avatar.d.ts.map +1 -0
  61. package/dist/types/components/AlphaAvatar/Avatar.types.d.ts +42 -0
  62. package/dist/types/components/AlphaAvatar/Avatar.types.d.ts.map +1 -0
  63. package/dist/types/components/AlphaAvatar/index.d.ts +3 -0
  64. package/dist/types/components/AlphaAvatar/index.d.ts.map +1 -0
  65. package/dist/types/components/AlphaAvatar/useProgressiveImage.d.ts +2 -0
  66. package/dist/types/components/AlphaAvatar/useProgressiveImage.d.ts.map +1 -0
  67. package/dist/types/components/AlphaAvatarGroup/AvatarGroup.d.ts +24 -0
  68. package/dist/types/components/AlphaAvatarGroup/AvatarGroup.d.ts.map +1 -0
  69. package/dist/types/components/AlphaAvatarGroup/AvatarGroup.types.d.ts +28 -0
  70. package/dist/types/components/AlphaAvatarGroup/AvatarGroup.types.d.ts.map +1 -0
  71. package/dist/types/components/AlphaAvatarGroup/index.d.ts +3 -0
  72. package/dist/types/components/AlphaAvatarGroup/index.d.ts.map +1 -0
  73. package/dist/types/components/AlphaButton/Button.d.ts +4 -0
  74. package/dist/types/components/AlphaButton/Button.d.ts.map +1 -0
  75. package/dist/types/components/AlphaButton/Button.types.d.ts +44 -0
  76. package/dist/types/components/AlphaButton/Button.types.d.ts.map +1 -0
  77. package/dist/types/components/AlphaButton/index.d.ts +3 -0
  78. package/dist/types/components/AlphaButton/index.d.ts.map +1 -0
  79. package/dist/types/components/AlphaFloatingButton/FloatingButton.d.ts +4 -0
  80. package/dist/types/components/AlphaFloatingButton/FloatingButton.d.ts.map +1 -0
  81. package/dist/types/components/AlphaFloatingButton/FloatingButton.types.d.ts +43 -0
  82. package/dist/types/components/AlphaFloatingButton/FloatingButton.types.d.ts.map +1 -0
  83. package/dist/types/components/AlphaFloatingButton/index.d.ts +3 -0
  84. package/dist/types/components/AlphaFloatingButton/index.d.ts.map +1 -0
  85. package/dist/types/components/BaseButton/BaseButton.d.ts.map +1 -1
  86. package/dist/types/components/Button/Button.d.ts.map +1 -1
  87. package/dist/types/index.d.ts +4 -0
  88. package/dist/types/index.d.ts.map +1 -1
  89. package/package.json +3 -3
  90. package/src/components/AlphaAvatar/AlphaAvatar.stories.tsx +63 -0
  91. package/src/components/AlphaAvatar/Avatar.module.scss +54 -0
  92. package/src/components/AlphaAvatar/Avatar.test.tsx +111 -0
  93. package/src/components/AlphaAvatar/Avatar.tsx +159 -0
  94. package/src/components/AlphaAvatar/Avatar.types.ts +64 -0
  95. package/src/components/AlphaAvatar/__snapshots__/Avatar.test.tsx.snap +93 -0
  96. package/src/components/AlphaAvatar/assets/default-avatar.svg +11 -0
  97. package/src/components/AlphaAvatar/index.ts +8 -0
  98. package/src/components/AlphaAvatar/useProgressiveImage.test.ts +96 -0
  99. package/src/components/AlphaAvatar/useProgressiveImage.ts +60 -0
  100. package/src/components/AlphaAvatarGroup/AlphaAvatarGroup.stories.tsx +55 -0
  101. package/src/components/AlphaAvatarGroup/AvatarGroup.module.scss +53 -0
  102. package/src/components/AlphaAvatarGroup/AvatarGroup.test.tsx +93 -0
  103. package/src/components/AlphaAvatarGroup/AvatarGroup.tsx +229 -0
  104. package/src/components/AlphaAvatarGroup/AvatarGroup.types.ts +43 -0
  105. package/src/components/AlphaAvatarGroup/__mocks__/avatarList.ts +39 -0
  106. package/src/components/AlphaAvatarGroup/__snapshots__/AvatarGroup.test.tsx.snap +215 -0
  107. package/src/components/AlphaAvatarGroup/index.ts +2 -0
  108. package/src/components/AlphaButton/AlphaButton.stories.tsx +29 -0
  109. package/src/components/AlphaButton/Button.module.scss +267 -0
  110. package/src/components/AlphaButton/Button.tsx +124 -0
  111. package/src/components/AlphaButton/Button.types.ts +73 -0
  112. package/src/components/AlphaButton/index.ts +7 -0
  113. package/src/components/AlphaFloatingButton/AlphaFloatingButton.stories.tsx +29 -0
  114. package/src/components/AlphaFloatingButton/FloatingButton.module.scss +204 -0
  115. package/src/components/AlphaFloatingButton/FloatingButton.tsx +123 -0
  116. package/src/components/AlphaFloatingButton/FloatingButton.types.ts +71 -0
  117. package/src/components/AlphaFloatingButton/index.ts +7 -0
  118. package/src/components/BaseButton/BaseButton.tsx +5 -2
  119. package/src/components/Button/Button.module.scss +4 -0
  120. package/src/components/Button/Button.stories.tsx +1 -1
  121. package/src/components/Button/Button.tsx +0 -3
  122. package/src/components/LegacyStack/LegacyStack.stories.tsx +7 -10
  123. package/src/index.ts +4 -0
@@ -0,0 +1,123 @@
1
+ import React, { forwardRef } from 'react'
2
+
3
+ import classNames from 'classnames'
4
+
5
+ import {
6
+ type FloatingButtonProps,
7
+ type FloatingButtonSize,
8
+ } from '~/src/components/AlphaFloatingButton/FloatingButton.types'
9
+ import { BaseButton } from '~/src/components/BaseButton'
10
+ import { Icon } from '~/src/components/Icon'
11
+ import { Spinner } from '~/src/components/Spinner'
12
+ import { Text } from '~/src/components/Text'
13
+
14
+ import styles from './FloatingButton.module.scss'
15
+
16
+ function getIconSize(size: FloatingButtonSize) {
17
+ return (
18
+ {
19
+ xs: 'xxs',
20
+ s: 'xs',
21
+ m: 's',
22
+ l: 's',
23
+ xl: 'm',
24
+ } as const
25
+ )[size]
26
+ }
27
+
28
+ function getSpinnerSize(size: FloatingButtonSize) {
29
+ return (
30
+ {
31
+ xs: 'xs',
32
+ s: 'xs',
33
+ m: 's',
34
+ l: 's',
35
+ xl: 's',
36
+ } as const
37
+ )[size]
38
+ }
39
+
40
+ function getTypography(size: FloatingButtonSize) {
41
+ return (
42
+ {
43
+ xs: '13',
44
+ s: '13',
45
+ m: '14',
46
+ l: '15',
47
+ xl: '18',
48
+ } as const
49
+ )[size]
50
+ }
51
+
52
+ export const FloatingButton = forwardRef<
53
+ HTMLButtonElement,
54
+ FloatingButtonProps
55
+ >(function Button(
56
+ {
57
+ as = BaseButton,
58
+ text,
59
+ prefixIcon,
60
+ suffixIcon,
61
+ color = 'blue',
62
+ variant = 'primary',
63
+ size = 'm',
64
+ active,
65
+ className,
66
+ loading,
67
+ ...rest
68
+ },
69
+ forwardedRef
70
+ ) {
71
+ const Comp = as as typeof BaseButton
72
+
73
+ return (
74
+ <Comp
75
+ ref={forwardedRef}
76
+ className={classNames(
77
+ styles.FloatingButton,
78
+ styles[`size-${size}`],
79
+ styles[`variant-${variant}`],
80
+ styles[`color-${color}`],
81
+ active && styles.active,
82
+ className
83
+ )}
84
+ {...rest}
85
+ >
86
+ <div
87
+ className={classNames(styles.ButtonContent, loading && styles.loading)}
88
+ >
89
+ {prefixIcon && (
90
+ <Icon
91
+ size={getIconSize(size)}
92
+ source={prefixIcon}
93
+ className={styles.ButtonIcon}
94
+ />
95
+ )}
96
+
97
+ {/* TODO: use AlphaText later, add typo */}
98
+ <Text
99
+ className={styles.ButtonText}
100
+ typo={getTypography(size)}
101
+ bold
102
+ >
103
+ {text}
104
+ </Text>
105
+
106
+ {suffixIcon && (
107
+ <Icon
108
+ size={getIconSize(size)}
109
+ source={suffixIcon}
110
+ className={styles.ButtonIcon}
111
+ />
112
+ )}
113
+ </div>
114
+
115
+ {/* TODO: use AlphaSpinner */}
116
+ {loading && (
117
+ <div className={styles.ButtonLoader}>
118
+ <Spinner size={getSpinnerSize(size)} />
119
+ </div>
120
+ )}
121
+ </Comp>
122
+ )
123
+ })
@@ -0,0 +1,71 @@
1
+ import { type BezierIcon } from '@channel.io/bezier-icons'
2
+
3
+ import {
4
+ type BezierComponentProps,
5
+ type DisableProps,
6
+ type PolymorphicProps,
7
+ type SizeProps,
8
+ } from '~/src/types/props'
9
+
10
+ export type FloatingButtonVariant = 'primary' | 'secondary'
11
+
12
+ export type FloatingButtonColor =
13
+ | 'blue'
14
+ | 'cobalt'
15
+ | 'red'
16
+ | 'orange'
17
+ | 'green'
18
+ | 'pink'
19
+ | 'purple'
20
+ | 'dark-grey'
21
+ | 'light-grey'
22
+
23
+ export type FloatingButtonSize = 'xs' | 's' | 'm' | 'l' | 'xl'
24
+
25
+ interface FloatingButtonOwnProps {
26
+ /**
27
+ * The text content in the button.
28
+ */
29
+ text: string
30
+
31
+ /**
32
+ * If `loading` is true, spinner will be shown, replacing the content.
33
+ * @default false
34
+ */
35
+ loading?: boolean
36
+
37
+ /**
38
+ * If `active` is true, the button will be styled as if it is hovered.
39
+ * @default false
40
+ */
41
+ active?: boolean
42
+
43
+ /**
44
+ * Types of visual styles for button.
45
+ * @default 'primary'
46
+ */
47
+ variant?: FloatingButtonVariant
48
+
49
+ /**
50
+ * Color of the button.
51
+ * @default 'blue'
52
+ */
53
+ color?: FloatingButtonColor
54
+
55
+ /**
56
+ * Icon on the left.
57
+ */
58
+ prefixIcon?: BezierIcon
59
+
60
+ /**
61
+ * Icon on the right.
62
+ */
63
+ suffixIcon?: BezierIcon
64
+ }
65
+
66
+ export interface FloatingButtonProps
67
+ extends Omit<BezierComponentProps<'button'>, 'color'>,
68
+ PolymorphicProps,
69
+ SizeProps<FloatingButtonSize>,
70
+ DisableProps,
71
+ FloatingButtonOwnProps {}
@@ -0,0 +1,7 @@
1
+ export { FloatingButton as AlphaFloatingButton } from './FloatingButton'
2
+ export type {
3
+ FloatingButtonColor as AlphaFloatingButtonColor,
4
+ FloatingButtonProps as AlphaFloatingButtonProps,
5
+ FloatingButtonSize as AlphaFloatingButtonSize,
6
+ FloatingButtonVariant as AlphaFloatingButtonVariant,
7
+ } from './FloatingButton.types'
@@ -10,12 +10,15 @@ import styles from './BaseButton.module.scss'
10
10
  * `BaseButton` is a reset-style button component with a focus ring, intended for internal use only.
11
11
  */
12
12
  export const BaseButton = forwardRef<HTMLButtonElement, BaseButtonProps>(
13
- function BaseButton({ className, children, ...rest }, forwardedRef) {
13
+ function BaseButton(
14
+ { className, children, type = 'button', ...rest },
15
+ forwardedRef
16
+ ) {
14
17
  return (
15
18
  <button
16
19
  className={classNames(styles.BaseButton, className)}
17
20
  ref={forwardedRef}
18
- type="button"
21
+ type={type}
19
22
  {...rest}
20
23
  >
21
24
  {children}
@@ -244,6 +244,10 @@ $active-selector: ':where(.active, :hover):where(:not(:disabled))';
244
244
  border-radius: var(--radius-8);
245
245
  }
246
246
 
247
+ &:where(.style-primary.color-blue:focus-visible) {
248
+ outline: 3px solid var(--bgtxt-blue-light);
249
+ }
250
+
247
251
  /* Hover styles for text, icon, and loader */
248
252
  &:where(.color-monochrome):where(.style-secondary, .style-tertiary):where(
249
253
  :not(.active, :hover)
@@ -76,7 +76,7 @@ export const WithCustomComponent: StoryObj<ButtonProps> = {
76
76
  leftContent: (
77
77
  <Avatar
78
78
  name="test"
79
- avatarUrl="https://source.unsplash.com/random"
79
+ avatarUrl="https://cf.channel.io/thumb/200x200/pub-file/1/65fc43ee585607b276f6/tmp-3329819395"
80
80
  />
81
81
  ),
82
82
  size: 'm',
@@ -91,7 +91,6 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
91
91
  {
92
92
  as = BaseButton,
93
93
  className,
94
- type = 'button',
95
94
  text,
96
95
  disabled = false,
97
96
  loading = false,
@@ -119,8 +118,6 @@ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
119
118
 
120
119
  return (
121
120
  <Comp
122
- // eslint-disable-next-line react/button-has-type
123
- type={type}
124
121
  ref={forwardedRef}
125
122
  className={classNames(
126
123
  styles.Button,
@@ -1,9 +1,7 @@
1
- import React, { useState } from 'react'
1
+ import React from 'react'
2
2
 
3
3
  import type { Meta, StoryFn, StoryObj } from '@storybook/react'
4
4
 
5
- import { range } from '~/src/utils/number'
6
-
7
5
  import { Button } from '~/src/components/Button'
8
6
  import { Text } from '~/src/components/Text'
9
7
 
@@ -65,22 +63,20 @@ const meta: Meta<
65
63
  }
66
64
  export default meta
67
65
 
68
- const randomSize = (): number => Math.floor(Math.random() * 240 + 120)
69
-
70
66
  const Item = ({
67
+ size,
71
68
  fixedSize,
72
69
  direction,
73
70
  }: {
71
+ size: number
74
72
  fixedSize: boolean
75
73
  direction: 'horizontal' | 'vertical'
76
74
  }) => {
77
- const [alignSize] = useState(() => randomSize())
78
-
79
75
  return (
80
76
  <div
81
77
  style={{
82
- width: fixedSize && direction === 'vertical' ? alignSize : '100%',
83
- height: fixedSize && direction === 'horizontal' ? alignSize : '100%',
78
+ width: fixedSize && direction === 'vertical' ? size : '100%',
79
+ height: fixedSize && direction === 'horizontal' ? size : '100%',
84
80
  backgroundColor: 'var(--bg-black-light)',
85
81
  borderRadius: '4px',
86
82
  boxShadow: 'inset 0 0 1px #c0c0c0',
@@ -142,7 +138,7 @@ const Template: StoryFn<StackPreviewProps> = ({
142
138
  align={align}
143
139
  spacing={spacing}
144
140
  >
145
- {range(4).map((i) => (
141
+ {[200, 400, 300, 100].map((size, i) => (
146
142
  <LegacyStackItem
147
143
  key={`item-${i}`}
148
144
  justify={itemJustifies[i]}
@@ -157,6 +153,7 @@ const Template: StoryFn<StackPreviewProps> = ({
157
153
  <Item
158
154
  direction={direction}
159
155
  fixedSize={(align ?? itemAligns[i]) !== 'stretch'}
156
+ size={size}
160
157
  />
161
158
  </LegacyStackItem>
162
159
  ))}
package/src/index.ts CHANGED
@@ -5,7 +5,11 @@ import '~/src/styles/index.scss'
5
5
  export { tokens } from '@channel.io/bezier-tokens'
6
6
 
7
7
  /* ------------------------------- COMPONENTS ------------------------------- */
8
+ export * from '~/src/components/AlphaAvatar'
9
+ export * from '~/src/components/AlphaAvatarGroup'
10
+ export * from '~/src/components/AlphaButton'
8
11
  export * from '~/src/components/AlphaDialogPrimitive'
12
+ export * from '~/src/components/AlphaFloatingButton'
9
13
  export * from '~/src/components/AlphaTooltipPrimitive'
10
14
  export * from '~/src/components/AppProvider'
11
15
  export * from '~/src/components/AutoFocus'