@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,124 @@
1
+ import { Body, Heading4 } from '@components'
2
+ import { isDefined } from '@helpers'
3
+ import { Playground } from 'storybook-addon-jarle-monaco'
4
+ import { MultiChoiceList } from '../index'
5
+
6
+ export const PlainHTMLFormExample = () => (
7
+ <Playground
8
+ code={`
9
+ /* Edit this code sample! */
10
+ const [withError, setWithError] = useState(false);
11
+
12
+ <form onSubmit={(e) => {
13
+ e.preventDefault()
14
+ }}
15
+ >
16
+ <MultiChoiceList options={[
17
+ {
18
+ label: "My Awesome label",
19
+ id: 'My checkbox 1',
20
+ required: true,
21
+ error: withError,
22
+ helpfulMessage: 'Alternative text here',
23
+ onInvalid: function(e){
24
+ setWithError(true);
25
+ },
26
+ onChange: function(e){
27
+ setWithError(false);
28
+ }
29
+ },
30
+ {
31
+ label: "My Awesome label",
32
+ id: 'My checkbox 2',
33
+ helpfulMessage: 'Alternative text here',
34
+ },
35
+ ]}
36
+ />
37
+ <input type="submit"/>
38
+ </form>
39
+ `}
40
+ providerProps={{
41
+ renderAsComponent: true,
42
+ scope: {
43
+ MultiChoiceList,
44
+ },
45
+ }}
46
+ />
47
+ )
48
+
49
+ export const ExampleWithStateManagement = () => (
50
+ <Playground
51
+ code={`
52
+ /* Edit this code sample! */
53
+ const Locations = [
54
+ {
55
+ label: "Vancouver, BC",
56
+ id: 1,
57
+ },
58
+ {
59
+ label: "Toronto, ON",
60
+ id: 2,
61
+ },
62
+ {
63
+ label: "Quebec, QC",
64
+ id: 3,
65
+ },
66
+ {
67
+ label: "Montreal, QC",
68
+ id: 4,
69
+ },
70
+ ];
71
+ const [locations, setLocations] = useState([]);
72
+ const [withError, setWithError] = useState(false);
73
+
74
+ const options = Locations.map((location) => {
75
+ return {
76
+ ...location,
77
+ checked: isDefined(locations.find((l) => l.id === location.id)),
78
+ onChange: (checked) => {
79
+ if (checked) {
80
+ setLocations([
81
+ ...locations,
82
+ location,
83
+ ])
84
+ } else {
85
+ const i = locations.findIndex((l) => l.id === location.id)
86
+ locations.splice(i, 1)
87
+ setLocations([
88
+ ...locations
89
+ ])
90
+ }
91
+ }
92
+ }
93
+ });
94
+
95
+ <>
96
+ <form onSubmit={(e) => {
97
+ e.preventDefault()
98
+ }}
99
+ >
100
+ <MultiChoiceList options={options}
101
+ />
102
+ <input type="submit"/>
103
+ </form>
104
+ <div>
105
+ <Heading4>Your Selection</Heading4>
106
+ {locations.map((location) => {
107
+ return (
108
+ <Body key={location.id}>{location.label}</Body>
109
+ )
110
+ })}
111
+ </div>
112
+ </>
113
+ `}
114
+ providerProps={{
115
+ renderAsComponent: true,
116
+ scope: {
117
+ MultiChoiceList,
118
+ Heading4,
119
+ Body,
120
+ isDefined,
121
+ },
122
+ }}
123
+ />
124
+ )
@@ -0,0 +1,99 @@
1
+ import { Canvas, Meta, Story } from '@storybook/addon-docs';
2
+ import { MultiChoiceList } from '../multi-choice-list'
3
+ import { PlainHTMLFormExample, ExampleWithStateManagement } from './components'
4
+
5
+ <Meta
6
+ title="Components/MultiChoiceList"
7
+ component={MultiChoiceList}
8
+ />
9
+
10
+ # MultiChoiceList
11
+
12
+ This is a organism, composed by checkbox molecule and some atoms.
13
+
14
+ For more details, check out the component page on [Figma](https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=1097%3A2349)
15
+
16
+ ## How to use
17
+
18
+ ```javascript
19
+ // Import the component
20
+ import { MultiChoiceList } from './index'
21
+
22
+
23
+ // Render the component sending the required parameters
24
+ <MultiChoiceList options={[
25
+ {
26
+ label: 'My Awesome label',
27
+ checked: true,
28
+ id: '1',
29
+ }]
30
+ />
31
+ ```
32
+ ## Examples
33
+
34
+ <Canvas>
35
+ <MultiChoiceList options={[
36
+ {
37
+ label: "My Awesome label",
38
+ defaultChecked: true,
39
+ id: '1',
40
+ },
41
+ {
42
+ label: "My label",
43
+ id: '2',
44
+ },
45
+ {
46
+ label: "My label",
47
+ id: '3',
48
+ },
49
+ {
50
+ label: "My label",
51
+ id: '4',
52
+ },
53
+ ]}/>
54
+ </Canvas>
55
+
56
+ Also, you can send the altive text in order to helping user
57
+ <Canvas>
58
+ <MultiChoiceList options={[
59
+ {
60
+ label: "My Awesome label",
61
+ id: 'My checkbox 1',
62
+ defaultChecked: true,
63
+ error: true,
64
+ helpfulMessage: 'Alternative text here',
65
+ },
66
+ {
67
+ label: "My Awesome label",
68
+ id: 'My checkbox 2',
69
+ helpfulMessage: 'Alternative text here',
70
+ },
71
+ {
72
+ label: "My Awesome label",
73
+ id: 'My checkbox 3',
74
+ helpfulMessage: 'Alternative text here',
75
+ }
76
+ ]}/>
77
+ </Canvas>
78
+
79
+
80
+ ## API
81
+ This component receive a list (`options` parameter) from N amount of Checkbox if you'd like to render.
82
+ So all the possible values from Checkbox component can be passed here.
83
+ Also, you can sen this parameters:
84
+
85
+ | Name | Type | Description | Required (Y/N)|
86
+ | ---- | ----- | ------ | ----- |
87
+ | `id` | `string` | `The id from each checkbox in the list` | `Y` |
88
+ | `helpfulMessage` | `string` | `Message that will be render bellow each checkbox field` | `N` |
89
+
90
+ ## Playground
91
+
92
+ <PlainHTMLFormExample />
93
+
94
+ ### With State Management Example
95
+
96
+ <ExampleWithStateManagement />
97
+
98
+ ## Changelog
99
+ - Offer the "indeterminate" behavior to render this list nesting
@@ -0,0 +1 @@
1
+ export * from './spinner'
@@ -0,0 +1,39 @@
1
+ import { bitwiseOr, MappedEnum, RequireOnlyOne, PropsWithChildren } from '@helpers'
2
+
3
+ const enum SpinnerSize {
4
+ small = 1,
5
+ medium = 2,
6
+ large = 4,
7
+ }
8
+
9
+ type SpinnerSizes<T> = MappedEnum<typeof SpinnerSize, T>
10
+
11
+ function toSpinner(n: number): SpinnerSize {
12
+ switch (n) {
13
+ case SpinnerSize.small:
14
+ return SpinnerSize.small
15
+ case SpinnerSize.medium:
16
+ return SpinnerSize.medium
17
+ case SpinnerSize.large:
18
+ return SpinnerSize.large
19
+ default:
20
+ return SpinnerSize.medium
21
+ }
22
+ }
23
+
24
+ const SpinnerValues = {
25
+ [SpinnerSize.small]: '18px',
26
+ [SpinnerSize.medium]: '40px',
27
+ [SpinnerSize.large]: '60px',
28
+ }
29
+
30
+ export type SpinnerProps = Partial<RequireOnlyOne<SpinnerSizes<boolean>>> &
31
+ PropsWithChildren
32
+
33
+ export function getValuesBySize(props: SpinnerProps): string {
34
+ return SpinnerValues[
35
+ toSpinner(
36
+ bitwiseOr([props.small, props.medium, props.large])
37
+ )
38
+ ]
39
+ }
@@ -0,0 +1,31 @@
1
+ import { render, screen } from '@testing-library/react'
2
+ import { Spinner } from './index'
3
+
4
+ describe('Spinner Tests', () => {
5
+ describe('Spinner Tests', () => {
6
+ it('should render the Spinner with default size', async () => {
7
+ render(
8
+ <Spinner />
9
+ )
10
+
11
+ const spinner = screen.getByRole('icon')
12
+
13
+ expect(spinner).toBeInTheDocument()
14
+ expect(spinner).toHaveStyle('height: 40px')
15
+
16
+ })
17
+
18
+ it('should render the Spinner with small size', async () => {
19
+ render(
20
+ <Spinner small/>
21
+ )
22
+
23
+ const spinner = screen.getByRole('icon')
24
+
25
+ expect(spinner).toBeInTheDocument()
26
+ expect(spinner).toHaveStyle('height: 18px')
27
+
28
+ })
29
+
30
+ })
31
+ })
@@ -0,0 +1,54 @@
1
+ import { getValuesBySize, SpinnerProps } from './spinner-size-flags'
2
+ import { FC, is } from '@helpers'
3
+ import styled, { keyframes } from 'styled-components'
4
+ import { Icons } from '@foundations'
5
+ import { IconMinor } from 'components/icon'
6
+
7
+ const spinAnimation = keyframes`
8
+ 0% {
9
+ transform: rotate(0deg);
10
+ stroke-dashoffset: 25;
11
+ }
12
+ 50% {
13
+ transform: rotate(720deg);
14
+ stroke-dashoffset: 125;
15
+ }
16
+ 100% {
17
+ transform: rotate(1080deg);
18
+ stroke-dashoffset: 25;
19
+ }
20
+ `
21
+
22
+ const Spin = styled.div<{ $size: string, $onPrimary: boolean, $onCritical: boolean }>`
23
+ svg {
24
+ width: ${({ $size }) => $size};
25
+ height: ${({ $size }) => $size};
26
+ position: unset;
27
+ path {
28
+ fill: ${({ $onPrimary, $onCritical }) => ($onPrimary || $onCritical) ? Icons.OnPrimary : Icons.Default};
29
+ }
30
+ animation: ${spinAnimation} infinite 2s linear;
31
+ }
32
+ `
33
+
34
+ type IProps = SpinnerProps & {
35
+ onPrimary?: boolean
36
+ onCritical?: boolean
37
+ className?: string
38
+ }
39
+
40
+ export const Spinner : FC<IProps> = (props) => {
41
+ const size = getValuesBySize(props)
42
+
43
+ return (
44
+ <Spin
45
+ $onPrimary={is(props.onPrimary)}
46
+ $onCritical={is(props.onCritical)}
47
+ $size={size}
48
+ className={props.className}
49
+ >
50
+ <IconMinor.Spinner />
51
+ </Spin>
52
+ )
53
+ }
54
+
@@ -0,0 +1,39 @@
1
+ import styled from 'styled-components'
2
+ import { Padding, Surface } from '@foundations'
3
+ import { Playground } from 'storybook-addon-jarle-monaco'
4
+ import { Button } from 'components/molecules'
5
+ import { Spinner } from '../spinner'
6
+
7
+ export const Div = styled.div`
8
+ padding: ${Padding.s};
9
+ background: ${Surface.Default.Default};
10
+ display: flex;
11
+ gap: 20px;
12
+ `
13
+
14
+ export const SpinnerCodeExample = () => (
15
+ <Playground
16
+ code={`
17
+ // Try replacing the Button types.
18
+ <Div>
19
+ <Button primary>
20
+ <Spinner onPrimary />
21
+ </Button>
22
+ <Button destructive primary>
23
+ <Spinner onCritical />
24
+ </Button>
25
+ <Button destructive>
26
+ <Spinner onCritical />
27
+ </Button>
28
+ </Div>
29
+ `}
30
+ providerProps={{
31
+ renderAsComponent: true,
32
+ scope: {
33
+ Button,
34
+ Spinner,
35
+ Div,
36
+ },
37
+ }}
38
+ />
39
+ )
@@ -0,0 +1,35 @@
1
+ import { Canvas, Meta, Story, ArgsTable } from '@storybook/addon-docs';
2
+ import { StoryComponent, talesOf, StorybookFrame } from '@stories'
3
+ import { Spinner } from '../index'
4
+ import { Button } from 'components/molecules/button'
5
+
6
+ import { SpinnerCodeExample } from './components'
7
+
8
+ <Meta title="Components/Spinner" />
9
+
10
+ # Spinner
11
+
12
+ Spinners are used to notify users that their action is being processed.
13
+
14
+ For more details, check out the guidelines on [Figma](https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=734%3A7380)
15
+
16
+ ## How to Use
17
+
18
+ ```tsx
19
+ import { Spinner } from './index'
20
+
21
+ <Spinner />
22
+ ```
23
+
24
+ ### Size
25
+
26
+ <Canvas>
27
+ <Spinner small/>
28
+ <Spinner />
29
+ </Canvas>
30
+
31
+ ### On primary
32
+
33
+ When rendering the spinner on a primary or critical surface, use onPrimary or onCritical.
34
+
35
+ <SpinnerCodeExample/>
@@ -0,0 +1 @@
1
+ export * from './tab'
@@ -0,0 +1,62 @@
1
+ import { CSSProperties, HTMLAttributes, useEffect, useRef } from 'react'
2
+ import { FC, isDefined, Nothing, PropsWithChildren } from '@helpers'
3
+ import { Borders, Margin, Padding } from '@foundations'
4
+ import { Label } from 'components/typography'
5
+
6
+ const styles: (props: { selected: boolean }) => CSSProperties = ({ selected }) => ({
7
+ display: 'flex',
8
+ padding: Padding.m,
9
+ cursor: 'pointer',
10
+ outline: 'none',
11
+ borderBottom: selected ? `3px solid ${Borders.Highlight.Default}` : '',
12
+ ':focus': {
13
+ borderBottom: `3px solid ${Borders.Highlight.Default}`
14
+ },
15
+ })
16
+
17
+ export interface ITabProps extends PropsWithChildren, HTMLAttributes<HTMLDivElement> {
18
+ Prefix?: FC<HTMLAttributes<HTMLElement>>
19
+ selected?: boolean
20
+ }
21
+
22
+ export const Tab: FC<ITabProps> = (props) => {
23
+ const {
24
+ Prefix,
25
+ selected = false,
26
+ ...rest
27
+ } = props
28
+
29
+ // eslint-disable-next-line no-null/no-null
30
+ const ref = useRef<HTMLDivElement>(null)
31
+
32
+ useEffect(() => {
33
+ selected ? ref.current?.focus() : ref.current?.blur()
34
+ }, [selected])
35
+
36
+ /**
37
+ * @TODO this is a hack to be able to use the ref in react-web-client
38
+ * RWC uses styled-components < v4 and expects the ref to be passes as
39
+ * "innerRef" not just "ref", but product-language uses > v4 and wants
40
+ * to use ref. So for some components that need a ref, like this one
41
+ * we will have to use a div and style it the old fashioned way until
42
+ * we upgrade rwc's styled-components or drop rwc
43
+ */
44
+ return (
45
+ <div
46
+ {...rest}
47
+ tabIndex={0}
48
+ onClick={() => {
49
+ ref.current?.focus()
50
+ }}
51
+ role={'tab'}
52
+ aria-selected={selected}
53
+ ref={ref}
54
+ style={styles({ selected })}
55
+ >
56
+ {isDefined(Prefix) ? <Prefix style={{ marginRight: Margin.xs}} /> : <Nothing />}
57
+ <Label strong subdued={!selected}>
58
+ {props.children}
59
+ </Label>
60
+ </div>
61
+ )
62
+ }
@@ -0,0 +1 @@
1
+ export * from './tabs'