@edvisor/product-language 0.1.1 → 0.3.0

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 (261) hide show
  1. package/.babelrc +12 -0
  2. package/.eslintrc.json +147 -0
  3. package/.storybook/main.js +57 -0
  4. package/.storybook/manager.js +7 -0
  5. package/.storybook/preview.js +15 -0
  6. package/.storybook/tsconfig.json +30 -0
  7. package/jest.config.ts +15 -0
  8. package/jest.setup.ts +2 -0
  9. package/package.json +21 -10
  10. package/project.json +96 -0
  11. package/src/README.md +61 -0
  12. package/src/assets/svg/example_icon.svg +3 -0
  13. package/src/assets/svg/example_icon_white.svg +3 -0
  14. package/src/assets/svg/spinner.svg +3 -0
  15. package/src/assets/svg/spinner_white.svg +3 -0
  16. package/src/helpers/index.ts +4 -0
  17. package/src/helpers/playground.ts +16 -0
  18. package/src/helpers/talesOf.tsx +42 -0
  19. package/src/index.ts +2 -0
  20. package/src/lib/components/README.md +49 -0
  21. package/src/lib/components/alert-banner/alert-banner.tsx +34 -0
  22. package/src/lib/components/alert-banner/alert-level-flags.ts +77 -0
  23. package/src/lib/components/alert-banner/index.ts +1 -0
  24. package/src/lib/components/badge/badge-type-flags.ts +72 -0
  25. package/src/lib/components/badge/badge.test.tsx +29 -0
  26. package/src/lib/components/badge/badge.tsx +22 -0
  27. package/src/lib/components/badge/index.ts +1 -0
  28. package/src/lib/components/badge/stories/badge.stories.mdx +44 -0
  29. package/src/lib/components/badge/stories/components.tsx +49 -0
  30. package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +17 -7
  31. package/src/lib/components/card/atoms/index.ts +1 -0
  32. package/src/lib/components/card/card.test.tsx +162 -0
  33. package/src/lib/components/card/card.tsx +78 -0
  34. package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
  35. package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
  36. package/src/lib/components/card/components/card-section-slot.tsx +51 -0
  37. package/src/lib/components/card/components/index.ts +3 -0
  38. package/src/lib/components/card/index.ts +2 -0
  39. package/src/lib/components/card/molecules/index.ts +1 -0
  40. package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
  41. package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
  42. package/src/lib/components/card/storybook/card.stories.mdx +100 -0
  43. package/src/lib/components/card/storybook/components.tsx +223 -0
  44. package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
  45. package/src/lib/components/checkbox/checkbox.tsx +63 -0
  46. package/src/lib/components/checkbox/helpers.tsx +100 -0
  47. package/src/lib/components/checkbox/index.tsx +1 -0
  48. package/src/lib/components/checkbox/stories/checkbox.stories.mdx +57 -0
  49. package/src/lib/components/checkbox/stories/components.tsx +84 -0
  50. package/src/lib/components/divider/divider-type-flags.tsx +37 -0
  51. package/src/lib/components/divider/divider.test.tsx +34 -0
  52. package/src/lib/components/divider/divider.tsx +37 -0
  53. package/src/lib/components/divider/index.tsx +1 -0
  54. package/src/lib/components/divider/stories/components.tsx +13 -0
  55. package/src/lib/components/divider/stories/divider.stories.mdx +44 -0
  56. package/src/lib/components/flag/flag-size-flags.tsx +55 -0
  57. package/src/lib/components/flag/flag.list.tsx +788 -0
  58. package/src/lib/components/flag/flag.test.tsx +65 -0
  59. package/src/lib/components/flag/flag.tsx +97 -0
  60. package/src/lib/components/flag/index.tsx +1 -0
  61. package/src/lib/components/flag/stories/components.tsx +403 -0
  62. package/src/lib/components/flag/stories/flag.stories.mdx +48 -0
  63. package/src/lib/components/flag/stories/playGround-select.tsx +145 -0
  64. package/src/lib/components/icon/icon-list.tsx +135 -0
  65. package/src/lib/components/icon/icon.test.tsx +48 -0
  66. package/src/lib/components/icon/icon.tsx +181 -0
  67. package/src/lib/components/icon/index.tsx +1 -0
  68. package/src/lib/components/icon/stories/components.tsx +282 -0
  69. package/src/lib/components/icon/stories/icon.stories.mdx +65 -0
  70. package/src/lib/components/index.ts +19 -0
  71. package/src/lib/components/input-field/components/index.ts +2 -0
  72. package/src/lib/components/input-field/components/labeled-input.tsx +54 -0
  73. package/src/lib/components/input-field/components/stepper.tsx +60 -0
  74. package/src/lib/components/input-field/index.ts +6 -0
  75. package/src/lib/components/input-field/input-field.test.tsx +107 -0
  76. package/src/lib/components/input-field/input-field.tsx +126 -0
  77. package/src/lib/components/input-field/input-number.tsx +41 -0
  78. package/src/lib/components/input-field/input-text.tsx +30 -0
  79. package/src/lib/components/input-field/storybook/components.tsx +327 -0
  80. package/src/lib/components/input-field/storybook/input-field.stories.mdx +113 -0
  81. package/src/lib/components/layout/flex.tsx +22 -0
  82. package/src/lib/components/layout/grid-layout.tsx +40 -0
  83. package/src/lib/components/layout/index.ts +3 -0
  84. package/src/lib/components/layout/left-right-layout.tsx +67 -0
  85. package/src/lib/components/link/index.ts +1 -0
  86. package/src/lib/components/link/link.test.tsx +29 -0
  87. package/src/lib/components/link/link.tsx +56 -0
  88. package/src/lib/components/link/storybook/link.stories.mdx +52 -0
  89. package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
  90. package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
  91. package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
  92. package/src/lib/components/molecules/avatar/index.tsx +1 -0
  93. package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +52 -0
  94. package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
  95. package/src/lib/components/molecules/button/button-flags.tsx +340 -0
  96. package/src/lib/components/molecules/button/button.test.tsx +77 -0
  97. package/src/lib/components/molecules/button/button.tsx +214 -0
  98. package/src/lib/components/molecules/button/index.tsx +1 -0
  99. package/src/lib/components/molecules/button/stories/button.stories.mdx +105 -0
  100. package/src/lib/components/molecules/button/stories/components.tsx +84 -0
  101. package/src/lib/components/molecules/index.ts +3 -0
  102. package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
  103. package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
  104. package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +49 -0
  105. package/src/lib/components/molecules/input-checkbox/stories/components.tsx +53 -0
  106. package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +49 -0
  107. package/src/lib/components/organisms/index.ts +1 -0
  108. package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
  109. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
  110. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +52 -0
  111. package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +124 -0
  112. package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
  113. package/src/lib/components/spinner/index.tsx +1 -0
  114. package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
  115. package/src/lib/components/spinner/spinner.test.tsx +31 -0
  116. package/src/lib/components/spinner/spinner.tsx +54 -0
  117. package/src/lib/components/spinner/stories/components.tsx +39 -0
  118. package/src/lib/components/spinner/stories/spinner.stories.mdx +35 -0
  119. package/src/lib/components/tabs/components/index.ts +1 -0
  120. package/src/lib/components/tabs/components/tab.tsx +62 -0
  121. package/src/lib/components/tabs/index.tsx +1 -0
  122. package/src/lib/components/tabs/storybook/components.tsx +282 -0
  123. package/src/lib/components/tabs/storybook/tabs.stories.mdx +97 -0
  124. package/src/lib/components/tabs/tabs.test.tsx +86 -0
  125. package/src/lib/components/tabs/tabs.tsx +101 -0
  126. package/src/lib/components/tag/components/close-button.tsx +85 -0
  127. package/src/lib/components/tag/components/index.ts +2 -0
  128. package/src/lib/components/tag/components/tag-label.tsx +44 -0
  129. package/src/lib/components/tag/index.tsx +1 -0
  130. package/src/lib/components/tag/stories/components.tsx +86 -0
  131. package/src/lib/components/tag/stories/tag.stories.mdx +42 -0
  132. package/src/lib/components/tag/tag.test.tsx +36 -0
  133. package/src/lib/components/tag/tag.tsx +33 -0
  134. package/src/lib/components/thumbnail/index.tsx +1 -0
  135. package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +34 -0
  136. package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
  137. package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
  138. package/src/lib/components/thumbnail/thumbnail.tsx +45 -0
  139. package/src/lib/components/typography/index.ts +1 -0
  140. package/src/lib/components/typography/storybook/components.tsx +288 -0
  141. package/src/lib/components/typography/storybook/typography.stories.mdx +90 -0
  142. package/src/lib/components/typography/typography.test.tsx +97 -0
  143. package/src/lib/components/typography/typography.tsx +99 -0
  144. package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
  145. package/src/lib/foundations/color-system/base-palette/base-palette.ts +93 -0
  146. package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
  147. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
  148. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
  149. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +160 -0
  150. package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
  151. package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
  152. package/src/lib/foundations/color-system/components/index.ts +1 -0
  153. package/src/lib/foundations/color-system/index.ts +1 -0
  154. package/src/lib/foundations/index.ts +4 -0
  155. package/src/lib/foundations/shadows/components.tsx +59 -0
  156. package/src/lib/foundations/shadows/index.ts +1 -0
  157. package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
  158. package/src/lib/foundations/shadows/shadows.tsx +47 -0
  159. package/src/lib/foundations/spacing/index.ts +1 -0
  160. package/src/lib/foundations/spacing/spacing-guidelines.ts +24 -0
  161. package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
  162. package/src/lib/foundations/spacing/spacing.ts +18 -0
  163. package/src/lib/foundations/typography/constants.ts +25 -0
  164. package/src/lib/foundations/typography/fonts.ts +205 -0
  165. package/src/lib/foundations/typography/index.tsx +1 -0
  166. package/src/lib/foundations/typography/text-aspect-flags.ts +61 -0
  167. package/src/lib/foundations/typography/typography.tsx +102 -0
  168. package/src/lib/helpers/generic-types.ts +44 -0
  169. package/src/lib/helpers/index.ts +6 -0
  170. package/src/lib/helpers/nothing.tsx +18 -0
  171. package/src/lib/helpers/numbers.ts +67 -0
  172. package/src/lib/helpers/safe-navigation.ts +44 -0
  173. package/src/lib/helpers/slots.test.tsx +98 -0
  174. package/src/lib/helpers/slots.tsx +157 -0
  175. package/src/lib/helpers/strings.test.ts +47 -0
  176. package/src/lib/helpers/strings.ts +16 -0
  177. package/tsconfig.json +35 -0
  178. package/tsconfig.lib.json +28 -0
  179. package/tsconfig.spec.json +21 -0
  180. package/index.d.ts +0 -2
  181. package/index.js +0 -6078
  182. package/lib/components/alert-banner/alert-banner.d.ts +0 -11
  183. package/lib/components/alert-banner/alert-level-flags.d.ts +0 -13
  184. package/lib/components/alert-banner/index.d.ts +0 -1
  185. package/lib/components/badge/badge-type-flags.d.ts +0 -18
  186. package/lib/components/badge/badge.d.ts +0 -5
  187. package/lib/components/badge/index.d.ts +0 -1
  188. package/lib/components/card/atoms/index.d.ts +0 -1
  189. package/lib/components/card/card.d.ts +0 -14
  190. package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -5
  191. package/lib/components/card/components/card-controls-slot.d.ts +0 -4
  192. package/lib/components/card/components/card-section-slot.d.ts +0 -11
  193. package/lib/components/card/components/index.d.ts +0 -3
  194. package/lib/components/card/index.d.ts +0 -2
  195. package/lib/components/card/molecules/index.d.ts +0 -1
  196. package/lib/components/card/molecules/left-right-card.d.ts +0 -16
  197. package/lib/components/checkbox/checkbox.d.ts +0 -11
  198. package/lib/components/checkbox/components/components.d.ts +0 -12
  199. package/lib/components/checkbox/index.d.ts +0 -1
  200. package/lib/components/divider/divider-type-flags.d.ts +0 -9
  201. package/lib/components/divider/divider.d.ts +0 -7
  202. package/lib/components/divider/index.d.ts +0 -1
  203. package/lib/components/index.d.ts +0 -12
  204. package/lib/components/input-field/components/index.d.ts +0 -2
  205. package/lib/components/input-field/components/labeled-input.d.ts +0 -11
  206. package/lib/components/input-field/components/stepper.d.ts +0 -7
  207. package/lib/components/input-field/index.d.ts +0 -3
  208. package/lib/components/input-field/input-field.d.ts +0 -25
  209. package/lib/components/input-field/input-number.d.ts +0 -18
  210. package/lib/components/input-field/input-text.d.ts +0 -14
  211. package/lib/components/layout/flex.d.ts +0 -16
  212. package/lib/components/layout/grid-layout.d.ts +0 -11
  213. package/lib/components/layout/index.d.ts +0 -3
  214. package/lib/components/layout/left-right-layout.d.ts +0 -70
  215. package/lib/components/link/index.d.ts +0 -1
  216. package/lib/components/link/link.d.ts +0 -14
  217. package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
  218. package/lib/components/molecules/avatar/avatar.d.ts +0 -12
  219. package/lib/components/molecules/avatar/index.d.ts +0 -1
  220. package/lib/components/molecules/button/button-flags.d.ts +0 -39
  221. package/lib/components/molecules/button/button.d.ts +0 -24
  222. package/lib/components/molecules/button/index.d.ts +0 -1
  223. package/lib/components/molecules/index.d.ts +0 -3
  224. package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
  225. package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
  226. package/lib/components/organisms/index.d.ts +0 -1
  227. package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
  228. package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
  229. package/lib/components/spinner/index.d.ts +0 -1
  230. package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
  231. package/lib/components/spinner/spinner.d.ts +0 -9
  232. package/lib/components/thumbnail/index.d.ts +0 -1
  233. package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
  234. package/lib/components/thumbnail/thumbnail.d.ts +0 -9
  235. package/lib/components/typography/index.d.ts +0 -1
  236. package/lib/components/typography/typography.d.ts +0 -23
  237. package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -77
  238. package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
  239. package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -131
  240. package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
  241. package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
  242. package/lib/foundations/color-system/components/index.d.ts +0 -1
  243. package/lib/foundations/color-system/index.d.ts +0 -1
  244. package/lib/foundations/index.d.ts +0 -4
  245. package/lib/foundations/shadows/components.d.ts +0 -8
  246. package/lib/foundations/shadows/index.d.ts +0 -1
  247. package/lib/foundations/shadows/shadows.d.ts +0 -8
  248. package/lib/foundations/spacing/index.d.ts +0 -1
  249. package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -22
  250. package/lib/foundations/spacing/spacing.d.ts +0 -18
  251. package/lib/foundations/typography/constants.d.ts +0 -22
  252. package/lib/foundations/typography/index.d.ts +0 -1
  253. package/lib/foundations/typography/text-aspect-flags.d.ts +0 -14
  254. package/lib/foundations/typography/typography.d.ts +0 -19
  255. package/lib/helpers/generic-types.d.ts +0 -21
  256. package/lib/helpers/index.d.ts +0 -6
  257. package/lib/helpers/nothing.d.ts +0 -8
  258. package/lib/helpers/numbers.d.ts +0 -41
  259. package/lib/helpers/safe-navigation.d.ts +0 -14
  260. package/lib/helpers/slots.d.ts +0 -8
  261. package/lib/helpers/strings.d.ts +0 -1
@@ -0,0 +1,214 @@
1
+ import styled from 'styled-components'
2
+ import { FC, is, isDefined, Nothing } from '@helpers'
3
+ import { Focused } from '@foundations'
4
+ import {
5
+ ButtonSizeProps,
6
+ getBackgroundColorByType,
7
+ getIsDisabled,
8
+ getTextColorByType,
9
+ getIconColorByType,
10
+ getTextColorIfDisabled,
11
+ getCursor,
12
+ getPaddingBySize,
13
+ getBackgroundColorHoverByType,
14
+ getTextDecorationHoverByType,
15
+ getTextColorOnHoverByType,
16
+ getIconColorOnHoverByType,
17
+ getBorderByType,
18
+ getPaddingByType,
19
+ getBackgroundColorDisabledByType,
20
+ getBorderDisabledByType,
21
+ ButtonType,
22
+ getBackgroundColorPressedByType,
23
+ getButtonType,
24
+ ButtonTypeProps,
25
+ } from './button-flags'
26
+ import { ComponentType } from 'react'
27
+ import { Label } from 'components/typography'
28
+ import { Spinner } from 'components/spinner'
29
+
30
+ const ButtonFrame = styled.button<{
31
+ backgroundColor: string
32
+ buttonSize: string
33
+ cursor: string
34
+ backgroundHover: string
35
+ textDecorationHover: string,
36
+ backgroundPressed: string
37
+ textColorHover: string
38
+ buttonBorder: string
39
+ isDisabled: boolean
40
+ iconColor: string
41
+ iconColorHover: string
42
+ }>`
43
+ padding: ${(props) => props.buttonSize};
44
+ border: ${(props) => props.buttonBorder};
45
+ border-radius: 6px;
46
+ background: ${(props) => props.backgroundColor};
47
+ cursor: ${(props) => props.cursor};
48
+ display: flex;
49
+ flex-direction: row;
50
+ justify-content: center;
51
+ gap: 8px;
52
+ align-items: center;
53
+ position: relative;
54
+ svg[role='icon'] {
55
+ path {
56
+ fill: ${(props) => props.iconColor};
57
+ }
58
+ }
59
+
60
+
61
+ ${(props) =>
62
+ !props.isDisabled
63
+ ? `
64
+ &:hover {
65
+ background: ${props.backgroundHover};
66
+ text-decoration: ${props.textDecorationHover};
67
+ div {
68
+ color: ${props.textColorHover};
69
+ }
70
+ svg[role='icon'] {
71
+ path {
72
+ fill: ${props.iconColorHover};
73
+ }
74
+ }
75
+ }
76
+
77
+ &:focus {
78
+ outline: 2px solid ${Focused.Default}
79
+ }
80
+
81
+ &:focus-visible {
82
+ border: 2px solid ${Focused.Default}
83
+ }
84
+
85
+ &:active {
86
+ text-decoration: 'none'
87
+ background: ${props.backgroundPressed}
88
+ }
89
+ `
90
+ : ''}
91
+ `
92
+
93
+ const ButtonText = styled(Label)<{ textColor: string, textColorDisabled: string, isLoading: boolean }>`
94
+ color: ${(props) =>
95
+ props.textColorDisabled !== '' ? props.textColorDisabled : props.textColor};
96
+
97
+ ${(props) =>
98
+ props.isLoading
99
+ ? `
100
+ opacity: 0;
101
+ `
102
+ : ''}
103
+ `
104
+
105
+ const IconContainer = styled.div<{ isLoading: boolean }>`
106
+ width: 20px;
107
+ ${(props) =>
108
+ props.isLoading
109
+ ? 'visibility: hidden;'
110
+ : ''
111
+ }
112
+ `
113
+
114
+ const Loading = styled(Spinner)`
115
+ position: absolute;
116
+ `
117
+
118
+ interface IButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
119
+ loading?: boolean
120
+ IconPrefix?: ComponentType
121
+ IconSuffix?: ComponentType
122
+ children?: string
123
+ subtle?: boolean
124
+ }
125
+
126
+ function makeButtonConfig(props: IButtonProps & ButtonTypeProps & ButtonSizeProps) {
127
+ const buttonType = getButtonType(props)
128
+ const isDisabled = getIsDisabled(props)
129
+ const backgroundColor = isDisabled
130
+ ? getBackgroundColorDisabledByType(buttonType)
131
+ : getBackgroundColorByType(buttonType)
132
+ const buttonPadding = getPaddingBySize(props)
133
+ const buttonOverridePadding = getPaddingByType(buttonType)
134
+ const cursor = getCursor(props)
135
+ const backgroundHover = getBackgroundColorHoverByType(buttonType)
136
+ const textDecorationHover = getTextDecorationHoverByType(buttonType)
137
+ const backgroundPressed = getBackgroundColorPressedByType(buttonType)
138
+ const textColorHover = getTextColorOnHoverByType(buttonType)
139
+ const iconColorHover = getIconColorOnHoverByType(buttonType)
140
+ const buttonBorder = isDisabled
141
+ ? getBorderDisabledByType(buttonType)
142
+ : getBorderByType(buttonType)
143
+ const buttonSize =
144
+ buttonOverridePadding !== '' ? buttonOverridePadding : buttonPadding
145
+ const textColor = getTextColorByType(buttonType)
146
+ const iconColor = getIconColorByType(buttonType)
147
+ const textColorDisabled = getTextColorIfDisabled(props)
148
+
149
+ return {
150
+ backgroundColor,
151
+ buttonSize,
152
+ cursor,
153
+ backgroundHover,
154
+ textDecorationHover,
155
+ backgroundPressed,
156
+ textColorHover,
157
+ iconColorHover,
158
+ buttonBorder,
159
+ isDisabled,
160
+ textColor,
161
+ iconColor,
162
+ textColorDisabled,
163
+ buttonType,
164
+ }
165
+ }
166
+
167
+ export const Button: FC<IButtonProps & ButtonTypeProps & ButtonSizeProps> = (
168
+ props
169
+ ) => {
170
+ const {
171
+ children,
172
+ loading,
173
+ IconPrefix,
174
+ IconSuffix,
175
+ type = 'button',
176
+ ...htmlProps
177
+ } = props
178
+ const { textColor, textColorDisabled, buttonType, ...buttonConfig } =
179
+ makeButtonConfig(props)
180
+ return (
181
+ <ButtonFrame {...htmlProps} type={type} {...buttonConfig} data-testid="button-test">
182
+ {isDefined(IconPrefix) ? (
183
+ <IconContainer isLoading={is(loading)}>
184
+ <IconPrefix />
185
+ </IconContainer>
186
+ ) : <Nothing />}
187
+ <ButtonText
188
+ textColor={textColor}
189
+ textColorDisabled={textColorDisabled}
190
+ isLoading={is(loading)}
191
+ >
192
+ {children}
193
+ </ButtonText>
194
+ {is(loading) ? (
195
+ <Loading
196
+ small
197
+ onPrimary={
198
+ buttonType === ButtonType.primary ||
199
+ buttonType === ButtonType.destructivePrimary
200
+ }
201
+ />
202
+ ) : (
203
+ ''
204
+ )}
205
+
206
+ {isDefined(IconSuffix) ? (
207
+ <IconContainer isLoading={is(loading)}>
208
+ <IconSuffix />
209
+ </IconContainer>
210
+ ) : <Nothing />}
211
+ </ButtonFrame>
212
+ )
213
+ }
214
+
@@ -0,0 +1 @@
1
+ export * from './button'
@@ -0,0 +1,105 @@
1
+ import { Canvas, Meta, Story, ArgsTable } from '@storybook/addon-docs';
2
+ import { Button } from '../index'
3
+ import { IconMinor } from 'components/icon'
4
+ import { PlainHTMLFormExample, DisabledLoadingExample } from './components'
5
+
6
+ <Meta
7
+ title="Components/Button"
8
+ component={Button}
9
+ />
10
+
11
+ # Button
12
+
13
+ For more details, check out the component page on [Figma](https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=1008%3A1257)
14
+
15
+ ## How to use
16
+
17
+ ```javascript
18
+ // Import the component
19
+ import { Button } from './index'
20
+
21
+
22
+ // Render the component sending the required parameters
23
+ <Button primary label="SOME-label-HERE" />
24
+ ```
25
+
26
+ ## Properties
27
+
28
+ The Buttons accepts the same properties as a normal button and has some additional ones.
29
+
30
+ The available optional properties are as follows, try them out in the editable code sample below!
31
+
32
+ | Prop | Type | Description |
33
+ | ---------- | --------- | ------------------------------------------------------------------------ |
34
+ | `IconPrefix?` | `Icon` | It will add the given Icon before the text |
35
+ | `IconSuffix?` | `Icon` | It will add the given Icon after the text |
36
+ | `loading?` | `boolean` | Replaces the text for a loading icon |
37
+ | `size?` | `small / large` | Changes the size of the button. Leave it empty for the default size |
38
+
39
+ ### Using as form controls
40
+ <PlainHTMLFormExample />
41
+
42
+ ### Disabled until something is typed then loading until response
43
+ <DisabledLoadingExample />
44
+
45
+ ## Examples
46
+
47
+ <Canvas>
48
+ <Button type="submit">Basic</Button>
49
+ <Button primary>Primary</Button>
50
+ <Button destructive>Destructive</Button>
51
+ <Button destructive primary>Destructive Primary</Button>
52
+ <Button outline>Outline</Button>
53
+ <Button plain>Plain</Button>
54
+ <Button plain subtle >Plain Subtle</Button>
55
+ </Canvas>
56
+
57
+ Disabled
58
+ <Canvas>
59
+ <Button disabled>Basic</Button>
60
+ <Button primary disabled>Primary</Button>
61
+ <Button destructive disabled>Destructive</Button>
62
+ <Button destructive primary disabled>Destructive Primary</Button>
63
+ <Button outline disabled>Outline</Button>
64
+ <Button plain disabled>Plain</Button>
65
+ <Button plain subtle disabled>Plain Subtle</Button>
66
+ </Canvas>
67
+
68
+ Loading
69
+ <Canvas>
70
+ <Button loading>Basic</Button>
71
+ <Button primary loading>Primary</Button>
72
+ <Button destructive loading>Destructive</Button>
73
+ <Button destructive primary loading>Destructive Primary</Button>
74
+ <Button outline loading>Outline</Button>
75
+ <Button plain loading>Plain</Button>
76
+ <Button plain subtle loading>Plain Subtle</Button>
77
+ </Canvas>
78
+
79
+ Icons
80
+ <Canvas>
81
+ <Button IconPrefix={IconMinor.Fire}>Basic</Button>
82
+ <Button primary IconPrefix={IconMinor.Fire}>Primary</Button>
83
+ <Button destructive IconPrefix={IconMinor.Fire}>Destructive</Button>
84
+ <Button destructive primary IconPrefix={IconMinor.Fire}>Destructive Primary</Button>
85
+ <Button outline IconPrefix={IconMinor.Fire}>Outline</Button>
86
+ <Button plain IconPrefix={IconMinor.Fire}>Plain</Button>
87
+ <Button plain subtle IconPrefix={IconMinor.Fire}>Plain Subtle</Button>
88
+ </Canvas>
89
+
90
+ <Canvas>
91
+ <Button IconSuffix={IconMinor.Fire}>Basic</Button>
92
+ <Button primary IconSuffix={IconMinor.Fire}>Primary</Button>
93
+ <Button destructive IconSuffix={IconMinor.Fire}>Destructive</Button>
94
+ <Button destructive primary IconSuffix={IconMinor.Fire}>Destructive Primary</Button>
95
+ <Button outline IconSuffix={IconMinor.Fire}>Outline</Button>
96
+ <Button plain IconSuffix={IconMinor.Fire}>Plain</Button>
97
+ <Button plain subtle IconSuffix={IconMinor.Fire}>Plain Subtle</Button>
98
+ </Canvas>
99
+
100
+ <Canvas>
101
+ <Button large>Large</Button>
102
+ <Button>Default</Button>
103
+ <Button small>Small</Button>
104
+ </Canvas>
105
+
@@ -0,0 +1,84 @@
1
+
2
+ import { Playground } from 'storybook-addon-jarle-monaco'
3
+ import { InputField } from '../../../input-field'
4
+ import { Button } from '../button'
5
+
6
+ export const PlainHTMLFormExample = () => (
7
+ <Playground
8
+ code={`
9
+ /* Edit this code sample! */
10
+ const [invalid, setInvalid] = useState(false);
11
+
12
+ <form onSubmit={(e) => e.preventDefault()}>
13
+ <label htmlFor="country_code">Country code:</label>
14
+ <InputField
15
+ type="text"
16
+ placeholder="Enter a country code..."
17
+ id="country_code"
18
+ name="country_code"
19
+ pattern="[A-Za-z]{3}"
20
+ onInvalid={setInvalid}
21
+ invalid={invalid}
22
+ onChange={() => setInvalid(false)}
23
+ title="Three letter country code"
24
+ required
25
+ />
26
+ <div style={{display:'flex', gap:'8px'}}>
27
+ <Button type="reset">Clear</Button>
28
+ <Button primary type="submit">Send</Button>
29
+ </div>
30
+ </form>
31
+ `}
32
+ providerProps={{
33
+ renderAsComponent: true,
34
+ scope: {
35
+ InputField,
36
+ Button
37
+ },
38
+ }}
39
+ />
40
+ )
41
+
42
+ export const DisabledLoadingExample = () => (
43
+ <Playground
44
+ code={`
45
+ /* Edit this code sample! */
46
+ const [invalid, setInvalid] = useState(false);
47
+ const [disabled, setDisabled] = useState(true);
48
+ const [loading, setLoading] = useState(false);
49
+
50
+ <form onSubmit={(e) => {
51
+ e.preventDefault();
52
+ setLoading(true)
53
+ setTimeout(() => setLoading(false), 2000)
54
+ }}>
55
+ <label htmlFor="country_code">Country code:</label>
56
+ <InputField
57
+ type="text"
58
+ placeholder="Enter a country code..."
59
+ id="country_code"
60
+ name="country_code"
61
+ pattern="[A-Za-z]{3}"
62
+ onInvalid={setInvalid}
63
+ invalid={invalid}
64
+ onChange={() => {
65
+ setInvalid(false);
66
+ setDisabled(false);
67
+ }}
68
+ title="Three letter country code"
69
+ required
70
+ />
71
+ <div style={{display:'flex', gap:'8px'}}>
72
+ <Button primary type="submit" disabled={disabled} loading={loading}>Send</Button>
73
+ </div>
74
+ </form>
75
+ `}
76
+ providerProps={{
77
+ renderAsComponent: true,
78
+ scope: {
79
+ InputField,
80
+ Button
81
+ },
82
+ }}
83
+ />
84
+ )
@@ -0,0 +1,3 @@
1
+ export * from './avatar'
2
+ export * from './button'
3
+ export * from './input-checkbox'
@@ -0,0 +1 @@
1
+ export * from './input-checkbox'
@@ -0,0 +1,34 @@
1
+ import {render, screen } from '@testing-library/react'
2
+ import userEvent from '@testing-library/user-event'
3
+ import { InputCheckbox } from './input-checkbox'
4
+
5
+ describe('InputCheckbox Tests', () => {
6
+ it('should render the component and handle event after click', async () => {
7
+ const spyOnChange = jest.fn()
8
+ render(
9
+ <InputCheckbox
10
+ label='My Checkbox'
11
+ onChange={spyOnChange}
12
+ />
13
+ )
14
+
15
+ expect(spyOnChange).not.toHaveBeenCalled()
16
+ const myComponent = screen.getByRole('checkbox')
17
+ expect(screen.getByText('My Checkbox')).toBeInTheDocument()
18
+ expect(myComponent).toBeInTheDocument()
19
+
20
+ await userEvent.click(myComponent)
21
+
22
+ expect(spyOnChange).toHaveBeenCalled()
23
+ })
24
+ it('should not render the component if dont receive a label', async () => {
25
+ const { container } = render(
26
+ <InputCheckbox
27
+ label=''
28
+ />
29
+ )
30
+
31
+
32
+ expect(container).toBeEmptyDOMElement()
33
+ })
34
+ })
@@ -0,0 +1,49 @@
1
+ import { InputHTMLAttributes } from 'react'
2
+ import styled from 'styled-components'
3
+ import { FC, isDefined, isEmpty, Nothing } from '@helpers'
4
+ import { Margin } from '@foundations'
5
+ import { Checkbox } from '../../checkbox'
6
+ import { Label } from 'components/typography'
7
+
8
+ const Text = styled(Label)`
9
+ margin-left: ${Margin.xs};
10
+ user-select: none;
11
+ `
12
+
13
+ const Wrapper = styled.label`
14
+ display: flex;
15
+ width: 100%;
16
+ align-items: center;
17
+ `
18
+
19
+ export type IInputCheckboxProps = InputHTMLAttributes<HTMLInputElement> & {
20
+ label: string
21
+ error?: boolean
22
+ onChange?: (change: boolean) => void
23
+ }
24
+
25
+ export const InputCheckbox: FC<IInputCheckboxProps> = (props) => {
26
+ const {
27
+ onChange,
28
+ label = '',
29
+ } = props
30
+
31
+ if (isEmpty(label)) {
32
+ return <Nothing />
33
+ }
34
+
35
+ return (
36
+ <Wrapper>
37
+ <Checkbox
38
+ {...props}
39
+ onChange={(e) => {
40
+ if (isDefined(onChange)) {
41
+ onChange(e.target.checked)
42
+ }
43
+ }}
44
+ name={isDefined(props.name) ? props.name : label}
45
+ />
46
+ <Text>{label}</Text>
47
+ </Wrapper>
48
+ )
49
+ }
@@ -0,0 +1,53 @@
1
+ import { Playground } from 'storybook-addon-jarle-monaco'
2
+ import styled from 'styled-components'
3
+ import { Margin } from '@foundations'
4
+ import { If } from '@helpers'
5
+ import { Button } from 'components/molecules/button'
6
+ import { Caption } from 'components/typography'
7
+ import { InputCheckbox } from '../input-checkbox'
8
+
9
+ const Fields = styled.div`
10
+ margin-bottom: ${Margin.s};
11
+ `
12
+
13
+ export const InputCheckboxExample = () => (
14
+ <Playground
15
+ code={`
16
+ /* Edit this code sample! */
17
+ const [withError, setWithError] = useState(false);
18
+ const [accepted, setAccepted] = useState(false);
19
+
20
+ <form onSubmit={(e) => {
21
+ e.preventDefault()
22
+ }}
23
+ >
24
+ <Fields>
25
+ <InputCheckbox
26
+ onInvalid={(e) => {
27
+ setWithError(true)
28
+ }}
29
+ error={withError}
30
+ onChange={(e) => {
31
+ setAccepted(!accepted)
32
+ setWithError(false)
33
+ }}
34
+ label="I accept the terms."
35
+ required />
36
+ <If is={accepted}><Caption subdued>You have accepted the terms.</Caption></If>
37
+ </Fields>
38
+ <Button primary type="submit">Submit</Button>
39
+ </form>
40
+ `}
41
+ providerProps={{
42
+ renderAsComponent: true,
43
+ scope: {
44
+ InputCheckbox,
45
+ Caption,
46
+ Button,
47
+ If,
48
+ Fields,
49
+ },
50
+ }}
51
+ />
52
+ )
53
+
@@ -0,0 +1,49 @@
1
+ import { Canvas, Meta, Story } from '@storybook/addon-docs';
2
+ import { InputCheckbox } from '../input-checkbox'
3
+ import { InputCheckboxExample } from './components'
4
+
5
+ <Meta
6
+ title="Components/InputCheckbox"
7
+ component={InputCheckbox}
8
+ />
9
+
10
+ # InputCheckbox
11
+
12
+ This is a molecule, composed by the atoms checkbox input and typography as well.
13
+
14
+ For more details, check out the component page on [Figma](https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=1008%3A1257)
15
+
16
+ ## How to use
17
+
18
+ ```javascript
19
+ // Import the component
20
+ import { InputCheckbox } from './index'
21
+
22
+
23
+ // Render the component sending the required parameters
24
+ <InputCheckbox label="MY-TEXT-HERE" />
25
+ ```
26
+
27
+ ## Examples
28
+
29
+ <Canvas>
30
+ <InputCheckbox label="Burger" />
31
+ <InputCheckbox label="Fries" disabled />
32
+ <InputCheckbox label="Drink" error />
33
+ </Canvas>
34
+
35
+
36
+ ## API
37
+ You can send all the possible values from Checkbox component.
38
+ Also, you can sen this parameters:
39
+
40
+
41
+ | Name | Type | Description | Required (Y/N)|
42
+ | ---- | ----- | ------ | ------- |
43
+ | `label` | `string` | `The label from the checkbox` | `Y` |
44
+ | `onChange` | `event` | `You can listen the changes from the component` | `N` |
45
+
46
+
47
+ ## Playground
48
+
49
+ <InputCheckboxExample />
@@ -0,0 +1 @@
1
+ export * from './multi-choice-list'
@@ -0,0 +1 @@
1
+ export * from './multi-choice-list'
@@ -0,0 +1,33 @@
1
+ import { render, screen } from '@testing-library/react'
2
+ import { MultiChoiceList } from './multi-choice-list'
3
+
4
+ describe('MultiChoiceList Tests', () => {
5
+ it('should render the amount of checkbox matching with the options size', async () => {
6
+ render(
7
+ <MultiChoiceList options={[
8
+ {
9
+ label: 'My Awesome label',
10
+ id: 'My checkbox 1',
11
+ checked: true,
12
+ error: true,
13
+ helpfulMessage: 'Alternative text here',
14
+ },
15
+ {
16
+ label: 'My Awesome label',
17
+ id: 'My checkbox 2'
18
+ },
19
+ ]}
20
+ />
21
+ )
22
+
23
+ expect(screen.getByText('Alternative text here')).toBeInTheDocument()
24
+ expect(screen.getAllByRole('checkbox').length).toBe(2)
25
+ })
26
+ it('should not render anything if dont send valid options', async () => {
27
+ render(
28
+ <MultiChoiceList options={[]}
29
+ />
30
+ )
31
+ expect(screen.queryAllByRole('checkbox').length).toBe(0)
32
+ })
33
+ })
@@ -0,0 +1,52 @@
1
+ import styled from 'styled-components'
2
+ import { FC, isDefined, isEmpty, Nothing } from '@helpers'
3
+ import { Margin } from '@foundations'
4
+ import { Flex } from 'components/layout'
5
+ import { Label } from 'components/typography'
6
+ import { IInputCheckboxProps, InputCheckbox } from 'components/molecules/input-checkbox'
7
+
8
+ const HelpfulMessage = styled(Label)`
9
+ margin-top: ${Margin.xxs};
10
+ margin-left: ${Margin.xl};
11
+ user-select: none;
12
+ `
13
+ const Group = styled(Flex)`
14
+ width: 100%;
15
+ flex-direction: column;
16
+ gap: 18px;
17
+ `
18
+ interface IOption extends IInputCheckboxProps {
19
+ helpfulMessage?: string
20
+ }
21
+ interface IMultiChoiceList {
22
+ options: IOption[]
23
+ }
24
+
25
+ export const MultiChoiceList: FC<IMultiChoiceList> = (props: IMultiChoiceList) => {
26
+ const { options } = props
27
+
28
+ if (isEmpty(options)) {
29
+ return <Nothing />
30
+ }
31
+
32
+ return (
33
+ <Group role="group">
34
+ {options.map((option:IOption) => (
35
+ <div key={option.id}>
36
+ <InputCheckbox
37
+ aria-describedby={isDefined(option.helpfulMessage)
38
+ ? `${option.id}-id`
39
+ : ''
40
+ }
41
+ {...option}
42
+ />
43
+ {isDefined(option.helpfulMessage) && (
44
+ <HelpfulMessage subdued id={`${option.id}-id`}>
45
+ {option.helpfulMessage}
46
+ </HelpfulMessage>
47
+ )}
48
+ </div>
49
+ ))}
50
+ </Group>
51
+ )
52
+ }