@edvisor/product-language 0.5.7 → 0.7.0-rc1

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 (356) 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 +3 -12
  10. package/project.json +96 -0
  11. package/release-it.json +18 -0
  12. package/src/README.md +61 -0
  13. package/src/assets/svg/example_icon.svg +3 -0
  14. package/src/assets/svg/example_icon_white.svg +3 -0
  15. package/src/assets/svg/spinner.svg +3 -0
  16. package/src/assets/svg/spinner_white.svg +3 -0
  17. package/src/helpers/index.ts +4 -0
  18. package/src/helpers/playground.ts +26 -0
  19. package/src/helpers/talesOf.tsx +42 -0
  20. package/src/index.ts +2 -0
  21. package/src/lib/components/README.md +49 -0
  22. package/src/lib/components/alert-banner/alert-banner.tsx +34 -0
  23. package/src/lib/components/alert-banner/alert-level-flags.ts +77 -0
  24. package/src/lib/components/alert-banner/index.ts +1 -0
  25. package/src/lib/components/badge/badge-type-flags.ts +72 -0
  26. package/src/lib/components/badge/badge.test.tsx +29 -0
  27. package/src/lib/components/badge/badge.tsx +22 -0
  28. package/src/lib/components/badge/index.ts +1 -0
  29. package/src/lib/components/badge/stories/badge.stories.mdx +44 -0
  30. package/src/lib/components/badge/stories/components.tsx +49 -0
  31. package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +16 -7
  32. package/src/lib/components/card/atoms/index.ts +1 -0
  33. package/src/lib/components/card/card.test.tsx +162 -0
  34. package/src/lib/components/card/card.tsx +78 -0
  35. package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
  36. package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
  37. package/src/lib/components/card/components/card-section-slot.tsx +51 -0
  38. package/src/lib/components/card/components/index.ts +3 -0
  39. package/src/lib/components/card/index.ts +3 -0
  40. package/src/lib/components/card/molecules/index.ts +1 -0
  41. package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
  42. package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
  43. package/src/lib/components/card/storybook/card.stories.mdx +100 -0
  44. package/src/lib/components/card/storybook/components.tsx +227 -0
  45. package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
  46. package/src/lib/components/checkbox/checkbox.tsx +70 -0
  47. package/src/lib/components/checkbox/helpers.tsx +98 -0
  48. package/src/lib/components/checkbox/index.tsx +1 -0
  49. package/src/lib/components/checkbox/stories/checkbox.stories.mdx +57 -0
  50. package/src/lib/components/checkbox/stories/components.tsx +84 -0
  51. package/src/lib/components/date-picker/components/custom-calendar.tsx +193 -0
  52. package/src/lib/components/date-picker/components/index.ts +1 -0
  53. package/src/lib/components/date-picker/data-picker.test.tsx +220 -0
  54. package/src/lib/components/date-picker/date-picker.tsx +10 -0
  55. package/src/lib/components/date-picker/helpers/date-picker-factory.tsx +210 -0
  56. package/src/lib/components/date-picker/index.ts +1 -0
  57. package/src/lib/components/date-picker/storybook/components.tsx +259 -0
  58. package/src/lib/components/date-picker/storybook/date-picker.stories.mdx +133 -0
  59. package/src/lib/components/divider/divider-type-flags.tsx +37 -0
  60. package/src/lib/components/divider/divider.test.tsx +34 -0
  61. package/src/lib/components/divider/divider.tsx +37 -0
  62. package/src/lib/components/divider/index.tsx +1 -0
  63. package/src/lib/components/divider/stories/components.tsx +13 -0
  64. package/src/lib/components/divider/stories/divider.stories.mdx +44 -0
  65. package/src/lib/components/flag/flag-size-flags.tsx +55 -0
  66. package/src/lib/components/flag/flag.list.tsx +788 -0
  67. package/src/lib/components/flag/flag.test.tsx +65 -0
  68. package/src/lib/components/flag/flag.tsx +97 -0
  69. package/src/lib/components/flag/index.tsx +1 -0
  70. package/src/lib/components/flag/stories/components.tsx +403 -0
  71. package/src/lib/components/flag/stories/flag.stories.mdx +48 -0
  72. package/src/lib/components/flag/stories/playGround-select.tsx +145 -0
  73. package/src/lib/components/icon/icon-list.tsx +135 -0
  74. package/src/lib/components/icon/icon.test.tsx +47 -0
  75. package/src/lib/components/icon/icon.tsx +181 -0
  76. package/src/lib/components/icon/index.tsx +1 -0
  77. package/src/lib/components/icon/stories/components.tsx +282 -0
  78. package/src/lib/components/icon/stories/icon.stories.mdx +65 -0
  79. package/src/lib/components/index.ts +24 -0
  80. package/src/lib/components/input-field/components/index.ts +2 -0
  81. package/src/lib/components/input-field/components/labeled-input.tsx +57 -0
  82. package/src/lib/components/input-field/components/stepper.tsx +64 -0
  83. package/src/lib/components/input-field/index.ts +6 -0
  84. package/src/lib/components/input-field/input-field.test.tsx +107 -0
  85. package/src/lib/components/input-field/input-field.tsx +129 -0
  86. package/src/lib/components/input-field/input-number.tsx +41 -0
  87. package/src/lib/components/input-field/input-text.tsx +30 -0
  88. package/src/lib/components/input-field/storybook/components.tsx +339 -0
  89. package/src/lib/components/input-field/storybook/input-field.stories.mdx +113 -0
  90. package/src/lib/components/layout/flex.tsx +22 -0
  91. package/src/lib/components/layout/grid-layout.tsx +40 -0
  92. package/src/lib/components/layout/index.ts +3 -0
  93. package/src/lib/components/layout/left-right-layout.tsx +67 -0
  94. package/src/lib/components/link/index.ts +1 -0
  95. package/src/lib/components/link/link.test.tsx +29 -0
  96. package/src/lib/components/link/link.tsx +56 -0
  97. package/src/lib/components/link/storybook/link.stories.mdx +52 -0
  98. package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
  99. package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
  100. package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
  101. package/src/lib/components/molecules/avatar/index.tsx +1 -0
  102. package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +52 -0
  103. package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
  104. package/src/lib/components/molecules/button/button-flags.tsx +340 -0
  105. package/src/lib/components/molecules/button/button.test.tsx +77 -0
  106. package/src/lib/components/molecules/button/button.tsx +209 -0
  107. package/src/lib/components/molecules/button/index.tsx +1 -0
  108. package/src/lib/components/molecules/button/stories/button.stories.mdx +105 -0
  109. package/src/lib/components/molecules/button/stories/components.tsx +90 -0
  110. package/src/lib/components/molecules/index.ts +3 -0
  111. package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
  112. package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
  113. package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +50 -0
  114. package/src/lib/components/molecules/input-checkbox/stories/components.tsx +53 -0
  115. package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +49 -0
  116. package/src/lib/components/organisms/choice-list/choice-list.test.tsx +36 -0
  117. package/src/lib/components/organisms/choice-list/choice-list.tsx +72 -0
  118. package/src/lib/components/organisms/choice-list/index.tsx +1 -0
  119. package/src/lib/components/organisms/choice-list/stories/choice-list.stories.mdx +57 -0
  120. package/src/lib/components/organisms/choice-list/stories/components.tsx +45 -0
  121. package/src/lib/components/organisms/index.ts +2 -0
  122. package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
  123. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
  124. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +53 -0
  125. package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +124 -0
  126. package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
  127. package/{lib/components/spinner/index.d.ts → src/lib/components/radio-button/index.tsx} +1 -1
  128. package/src/lib/components/radio-button/radio-button.tsx +135 -0
  129. package/src/lib/components/radio-button/radio.test.tsx +59 -0
  130. package/src/lib/components/radio-button/stories/components.tsx +36 -0
  131. package/src/lib/components/radio-button/stories/radio-button.stories.mdx +44 -0
  132. package/src/lib/components/range-slider/components/bar-chart.tsx +50 -0
  133. package/src/lib/components/range-slider/components/handle.tsx +58 -0
  134. package/src/lib/components/range-slider/components/rail.tsx +44 -0
  135. package/src/lib/components/range-slider/components/slider-component.tsx +92 -0
  136. package/src/lib/components/range-slider/components/slider-inputs.tsx +129 -0
  137. package/src/lib/components/range-slider/components/tick.tsx +51 -0
  138. package/src/lib/components/range-slider/components/track.tsx +67 -0
  139. package/src/lib/components/range-slider/index.tsx +2 -0
  140. package/src/lib/components/range-slider/range-slider.test.tsx +185 -0
  141. package/src/lib/components/range-slider/range-slider.tsx +131 -0
  142. package/src/lib/components/range-slider/slider.test.tsx +89 -0
  143. package/src/lib/components/range-slider/slider.tsx +80 -0
  144. package/src/lib/components/range-slider/stories/components.tsx +179 -0
  145. package/src/lib/components/range-slider/stories/range-slider.stories.mdx +84 -0
  146. package/src/lib/components/range-slider/types.ts +18 -0
  147. package/src/lib/components/select/components/menu-container.tsx +69 -0
  148. package/src/lib/components/select/components/menu-list.tsx +195 -0
  149. package/src/lib/components/select/components/menu-row.tsx +43 -0
  150. package/src/lib/components/select/components/menu.tsx +151 -0
  151. package/src/lib/components/select/components/option.tsx +91 -0
  152. package/src/lib/components/select/components/select-label.tsx +10 -0
  153. package/src/lib/components/select/components/value-component-multi.tsx +40 -0
  154. package/src/lib/components/select/components/value-component-single.tsx +27 -0
  155. package/src/lib/components/select/components/value.tsx +374 -0
  156. package/src/lib/components/select/index.tsx +3 -0
  157. package/src/lib/components/select/select.test.tsx +148 -0
  158. package/src/lib/components/select/select.tsx +337 -0
  159. package/src/lib/components/select/storybook/components.tsx +999 -0
  160. package/src/lib/components/select/storybook/radio-group.tsx +157 -0
  161. package/src/lib/components/select/storybook/select.stories.mdx +172 -0
  162. package/src/lib/components/select/types.ts +149 -0
  163. package/src/lib/components/select/utils.ts +101 -0
  164. package/src/lib/components/spinner/index.tsx +1 -0
  165. package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
  166. package/src/lib/components/spinner/spinner.test.tsx +31 -0
  167. package/src/lib/components/spinner/spinner.tsx +54 -0
  168. package/src/lib/components/spinner/stories/components.tsx +39 -0
  169. package/src/lib/components/spinner/stories/spinner.stories.mdx +35 -0
  170. package/src/lib/components/tabs/components/index.ts +1 -0
  171. package/src/lib/components/tabs/components/tab.tsx +62 -0
  172. package/src/lib/components/tabs/index.tsx +1 -0
  173. package/src/lib/components/tabs/storybook/components.tsx +282 -0
  174. package/src/lib/components/tabs/storybook/tabs.stories.mdx +97 -0
  175. package/src/lib/components/tabs/tabs.test.tsx +86 -0
  176. package/src/lib/components/tabs/tabs.tsx +101 -0
  177. package/src/lib/components/tag/components/close-button.tsx +85 -0
  178. package/src/lib/components/tag/components/index.ts +2 -0
  179. package/src/lib/components/tag/components/tag-label.tsx +45 -0
  180. package/src/lib/components/tag/index.tsx +1 -0
  181. package/src/lib/components/tag/stories/components.tsx +86 -0
  182. package/src/lib/components/tag/stories/tag.stories.mdx +42 -0
  183. package/src/lib/components/tag/tag.test.tsx +36 -0
  184. package/src/lib/components/tag/tag.tsx +33 -0
  185. package/src/lib/components/thumbnail/index.tsx +1 -0
  186. package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +44 -0
  187. package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
  188. package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
  189. package/src/lib/components/thumbnail/thumbnail.tsx +44 -0
  190. package/src/lib/components/tree-view/components/tree-node.tsx +203 -0
  191. package/src/lib/components/tree-view/helper.tsx +171 -0
  192. package/src/lib/components/tree-view/index.ts +2 -0
  193. package/src/lib/components/tree-view/stories/components.tsx +640 -0
  194. package/src/lib/components/tree-view/stories/tree-view.stories.mdx +127 -0
  195. package/src/lib/components/tree-view/tree-view.test.tsx +146 -0
  196. package/src/lib/components/tree-view/tree-view.tsx +168 -0
  197. package/src/lib/components/tree-view/types.tsx +70 -0
  198. package/src/lib/components/typography/index.ts +1 -0
  199. package/src/lib/components/typography/storybook/components.tsx +288 -0
  200. package/src/lib/components/typography/storybook/typography.stories.mdx +90 -0
  201. package/src/lib/components/typography/typography.test.tsx +97 -0
  202. package/src/lib/components/typography/typography.tsx +99 -0
  203. package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
  204. package/src/lib/foundations/color-system/base-palette/base-palette.ts +93 -0
  205. package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
  206. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
  207. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
  208. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +160 -0
  209. package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
  210. package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
  211. package/src/lib/foundations/color-system/components/index.ts +1 -0
  212. package/src/lib/foundations/color-system/index.ts +1 -0
  213. package/src/lib/foundations/index.ts +4 -0
  214. package/src/lib/foundations/shadows/components.tsx +59 -0
  215. package/src/lib/foundations/shadows/index.ts +1 -0
  216. package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
  217. package/src/lib/foundations/shadows/shadows.tsx +47 -0
  218. package/src/lib/foundations/spacing/index.ts +1 -0
  219. package/src/lib/foundations/spacing/spacing-guidelines.ts +24 -0
  220. package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
  221. package/src/lib/foundations/spacing/spacing.ts +18 -0
  222. package/src/lib/foundations/typography/constants.ts +25 -0
  223. package/src/lib/foundations/typography/fonts.ts +205 -0
  224. package/src/lib/foundations/typography/index.tsx +1 -0
  225. package/src/lib/foundations/typography/text-aspect-flags.ts +61 -0
  226. package/src/lib/foundations/typography/typography.tsx +102 -0
  227. package/src/lib/helpers/generic-types.ts +44 -0
  228. package/src/lib/helpers/index.ts +8 -0
  229. package/src/lib/helpers/isReactElementOfType.test.tsx +108 -0
  230. package/src/lib/helpers/isReactElementOfType.ts +42 -0
  231. package/src/lib/helpers/nothing.tsx +22 -0
  232. package/{lib/helpers/numbers.d.ts → src/lib/helpers/numbers.ts} +67 -50
  233. package/src/lib/helpers/safe-navigation.ts +57 -0
  234. package/src/lib/helpers/slots.tsx +126 -0
  235. package/src/lib/helpers/strings.test.ts +47 -0
  236. package/src/lib/helpers/strings.ts +16 -0
  237. package/src/lib/helpers/useInputElementState.ts +56 -0
  238. package/tsconfig.json +35 -0
  239. package/tsconfig.lib.json +28 -0
  240. package/tsconfig.spec.json +21 -0
  241. package/index.d.ts +0 -2
  242. package/index.js +0 -9898
  243. package/lib/components/alert-banner/alert-banner.d.ts +0 -11
  244. package/lib/components/alert-banner/alert-level-flags.d.ts +0 -13
  245. package/lib/components/alert-banner/index.d.ts +0 -1
  246. package/lib/components/badge/badge-type-flags.d.ts +0 -18
  247. package/lib/components/badge/badge.d.ts +0 -5
  248. package/lib/components/badge/index.d.ts +0 -1
  249. package/lib/components/card/atoms/index.d.ts +0 -1
  250. package/lib/components/card/card.d.ts +0 -14
  251. package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -5
  252. package/lib/components/card/components/card-controls-slot.d.ts +0 -4
  253. package/lib/components/card/components/card-section-slot.d.ts +0 -11
  254. package/lib/components/card/components/index.d.ts +0 -3
  255. package/lib/components/card/index.d.ts +0 -3
  256. package/lib/components/card/molecules/index.d.ts +0 -1
  257. package/lib/components/card/molecules/left-right-card.d.ts +0 -16
  258. package/lib/components/checkbox/checkbox.d.ts +0 -11
  259. package/lib/components/checkbox/helpers.d.ts +0 -12
  260. package/lib/components/checkbox/index.d.ts +0 -1
  261. package/lib/components/divider/divider-type-flags.d.ts +0 -9
  262. package/lib/components/divider/divider.d.ts +0 -7
  263. package/lib/components/divider/index.d.ts +0 -1
  264. package/lib/components/flag/flag-size-flags.d.ts +0 -12
  265. package/lib/components/flag/flag.d.ts +0 -9
  266. package/lib/components/flag/flag.list.d.ts +0 -781
  267. package/lib/components/flag/index.d.ts +0 -1
  268. package/lib/components/icon/icon-list.d.ts +0 -131
  269. package/lib/components/icon/icon.d.ts +0 -131
  270. package/lib/components/icon/index.d.ts +0 -1
  271. package/lib/components/index.d.ts +0 -19
  272. package/lib/components/input-field/components/index.d.ts +0 -2
  273. package/lib/components/input-field/components/labeled-input.d.ts +0 -10
  274. package/lib/components/input-field/components/stepper.d.ts +0 -7
  275. package/lib/components/input-field/index.d.ts +0 -3
  276. package/lib/components/input-field/input-field.d.ts +0 -25
  277. package/lib/components/input-field/input-number.d.ts +0 -18
  278. package/lib/components/input-field/input-text.d.ts +0 -14
  279. package/lib/components/layout/flex.d.ts +0 -16
  280. package/lib/components/layout/grid-layout.d.ts +0 -11
  281. package/lib/components/layout/index.d.ts +0 -3
  282. package/lib/components/layout/left-right-layout.d.ts +0 -34
  283. package/lib/components/link/index.d.ts +0 -1
  284. package/lib/components/link/link.d.ts +0 -14
  285. package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
  286. package/lib/components/molecules/avatar/avatar.d.ts +0 -12
  287. package/lib/components/molecules/avatar/index.d.ts +0 -1
  288. package/lib/components/molecules/button/button-flags.d.ts +0 -44
  289. package/lib/components/molecules/button/button.d.ts +0 -12
  290. package/lib/components/molecules/button/index.d.ts +0 -1
  291. package/lib/components/molecules/index.d.ts +0 -3
  292. package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
  293. package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
  294. package/lib/components/organisms/index.d.ts +0 -1
  295. package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
  296. package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
  297. package/lib/components/select/components/menu-container.d.ts +0 -3
  298. package/lib/components/select/components/menu-list.d.ts +0 -3
  299. package/lib/components/select/components/menu-row.d.ts +0 -9
  300. package/lib/components/select/components/menu.d.ts +0 -2
  301. package/lib/components/select/components/option.d.ts +0 -13
  302. package/lib/components/select/components/select-label.d.ts +0 -1
  303. package/lib/components/select/components/value-component-multi.d.ts +0 -3
  304. package/lib/components/select/components/value-component-single.d.ts +0 -4
  305. package/lib/components/select/components/value.d.ts +0 -4
  306. package/lib/components/select/index.d.ts +0 -3
  307. package/lib/components/select/select.d.ts +0 -10
  308. package/lib/components/select/types.d.ts +0 -133
  309. package/lib/components/select/utils.d.ts +0 -15
  310. package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
  311. package/lib/components/spinner/spinner.d.ts +0 -9
  312. package/lib/components/tabs/components/index.d.ts +0 -1
  313. package/lib/components/tabs/components/tab.d.ts +0 -7
  314. package/lib/components/tabs/index.d.ts +0 -1
  315. package/lib/components/tabs/tabs.d.ts +0 -15
  316. package/lib/components/tag/components/close-button.d.ts +0 -8
  317. package/lib/components/tag/components/index.d.ts +0 -2
  318. package/lib/components/tag/components/tag-label.d.ts +0 -8
  319. package/lib/components/tag/index.d.ts +0 -1
  320. package/lib/components/tag/tag.d.ts +0 -10
  321. package/lib/components/thumbnail/index.d.ts +0 -1
  322. package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
  323. package/lib/components/thumbnail/thumbnail.d.ts +0 -10
  324. package/lib/components/tree-view/components/tree-node.d.ts +0 -3
  325. package/lib/components/tree-view/helper.d.ts +0 -12
  326. package/lib/components/tree-view/index.d.ts +0 -2
  327. package/lib/components/tree-view/tree-view.d.ts +0 -3
  328. package/lib/components/tree-view/types.d.ts +0 -63
  329. package/lib/components/typography/index.d.ts +0 -1
  330. package/lib/components/typography/typography.d.ts +0 -24
  331. package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -76
  332. package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
  333. package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -132
  334. package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
  335. package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
  336. package/lib/foundations/color-system/components/index.d.ts +0 -1
  337. package/lib/foundations/color-system/index.d.ts +0 -1
  338. package/lib/foundations/index.d.ts +0 -4
  339. package/lib/foundations/shadows/components.d.ts +0 -8
  340. package/lib/foundations/shadows/index.d.ts +0 -1
  341. package/lib/foundations/shadows/shadows.d.ts +0 -8
  342. package/lib/foundations/spacing/index.d.ts +0 -1
  343. package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -22
  344. package/lib/foundations/spacing/spacing.d.ts +0 -18
  345. package/lib/foundations/typography/constants.d.ts +0 -22
  346. package/lib/foundations/typography/fonts.d.ts +0 -1
  347. package/lib/foundations/typography/index.d.ts +0 -1
  348. package/lib/foundations/typography/text-aspect-flags.d.ts +0 -19
  349. package/lib/foundations/typography/typography.d.ts +0 -24
  350. package/lib/helpers/generic-types.d.ts +0 -21
  351. package/lib/helpers/index.d.ts +0 -7
  352. package/lib/helpers/isReactElementOfType.d.ts +0 -8
  353. package/lib/helpers/nothing.d.ts +0 -10
  354. package/lib/helpers/safe-navigation.d.ts +0 -15
  355. package/lib/helpers/slots.d.ts +0 -17
  356. package/lib/helpers/strings.d.ts +0 -1
@@ -0,0 +1,98 @@
1
+ import { css } from 'styled-components'
2
+ import { Surface, Borders, Actions, Interactive, Icons } from '@foundations'
3
+ import { Hex, is, isNil } from '@helpers'
4
+
5
+ interface ICheckedProps {
6
+ checked?: boolean;
7
+ }
8
+
9
+ const indeterminateSvg = `
10
+ <svg xmlns='http://www.w3.org/2000/svg' width='12' height='10' viewBox='0 0 10 8'>
11
+ <rect fill='white' width='10' height='2' rx='1'/>
12
+ </svg>
13
+ `
14
+ const checkSvg = `
15
+ <svg xmlns='http://www.w3.org/2000/svg' width='10' height='12' viewBox='0 0 10 8'>
16
+ <path d='M4.50846 7.37941C4.0689 7.81898 3.35108 7.81898 2.91151 7.37941L0.330581 4.79848C-0.110194 4.35892 -0.110194 3.64109 0.330581 3.20153C0.770146 2.76196 1.48797 2.76196 1.92753 3.20153L3.70999 4.98399L8.07338 0.620598C8.51294 0.181033 9.23076 0.181033 9.67033 0.620598C10.1099 1.06016 10.1099 1.77798 9.67033 2.21755L4.50846 7.37941Z' fill='white'/>
17
+ </svg>`
18
+
19
+ function getCheckMark (indeterminate: boolean) {
20
+ return css`
21
+ ::before {
22
+ position: absolute;
23
+ content: url("data:image/svg+xml,${indeterminate ? indeterminateSvg : checkSvg}");
24
+ left: ${indeterminate ? 3 : 4}px;
25
+ top: ${indeterminate ? 6 : 3}px;
26
+ }
27
+ `
28
+ }
29
+
30
+ /** the reason I have this isNil to test
31
+ * whether `checked` was passes is this:
32
+ *
33
+ * if the user passed "checked" then
34
+ * they expect the checked styles to be
35
+ * seen if and only if checked is true.
36
+ * In that case I don't add the :checked
37
+ * selector because the user doesn't want
38
+ * the styles to depend on the browser's
39
+ * idea of the state of the button.
40
+ */
41
+ function getCheckedStyles (indeterminate: boolean, color: Hex) {
42
+ return css<{ checked?: boolean }>`
43
+ ${({ checked }) => isNil(checked)
44
+ ? css`
45
+ :checked {
46
+ background: ${color};
47
+ border: 2px solid ${color};
48
+ ${getCheckMark(indeterminate)}
49
+ }
50
+ `
51
+ : is(checked) || is(indeterminate)
52
+ ? css`
53
+ background: ${color};
54
+ border: 2px solid ${color};
55
+ ${getCheckMark(indeterminate)}
56
+ `
57
+ : ''
58
+ }
59
+ `
60
+ }
61
+
62
+ export const getHoverStyles = (indeterminate: boolean) => css`
63
+ background: ${Surface.Default.Hover};
64
+
65
+ ${getCheckedStyles(indeterminate, Interactive.Default.Hover)}
66
+ `
67
+
68
+ export const getDisabledStyles = (indeterminate: boolean) => css`
69
+ pointer-events: none;
70
+ background: ${(props: ICheckedProps) =>
71
+ is(props.checked) || is(indeterminate)
72
+ ? `${Borders.Default.Default}`
73
+ : `${Surface.Default.Subdued}`};
74
+ border: 2px solid ${Borders.Default.Default};
75
+
76
+ ${getCheckedStyles(indeterminate, Icons.Disabled)}
77
+ `
78
+
79
+ export const getDefaultStyles = (indeterminate: boolean) => css`
80
+ background: ${Surface.Default.Default};
81
+ border: 2px solid ${Interactive.Default.Disabled};
82
+
83
+ ${getCheckedStyles(indeterminate, Interactive.Default.Default)}
84
+
85
+ :hover {
86
+ ${getHoverStyles(indeterminate)}
87
+ }
88
+ `
89
+
90
+ export const getInvalidStyles = (indeterminate: boolean) => css`
91
+ background: ${(props: ICheckedProps) =>
92
+ (is(props.checked) || is(indeterminate))
93
+ ? `${Actions.Critical.Default}`
94
+ : `${Surface.Critical.Subdued}`};
95
+ border: 2px solid ${Borders.Critical.Default};
96
+
97
+ ${getCheckedStyles(indeterminate, Icons.Critical)}
98
+ `
@@ -0,0 +1 @@
1
+ export * from './checkbox'
@@ -0,0 +1,57 @@
1
+ import { Canvas, Meta, Story } from '@storybook/addon-docs';
2
+ import { Checkbox } from '../checkbox'
3
+ import { IntegratedExample, CheckboxExample, LimitationsExample } from './components'
4
+
5
+ <Meta
6
+ title="Components/Checkbox"
7
+ component={Checkbox}
8
+ />
9
+
10
+ # Checkbox
11
+
12
+ Checkboxes are most commonly used to give users a way to make a range of selections (zero, one, or multiple). They may also be used as a way to have users indicate they agree to specific terms and services.
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
+ ```tsx
19
+ import { Checkbox } from './index'
20
+
21
+ <Checkbox />
22
+ ```
23
+
24
+ ### Typical Usage
25
+
26
+ Checkbox is "drop-in" compatible with an html input checkbox.
27
+
28
+ <IntegratedExample />
29
+
30
+ ### Modifiers
31
+
32
+ Control the appearance of the checkbox with its modifiers.
33
+
34
+ <CheckboxExample />
35
+
36
+ ## API
37
+
38
+ Extends `HTMLAttributes<HTMLInputElement>`
39
+
40
+ | Name | Type | Description |
41
+ | ----------- | --------- | ------------------------------------------------------------------- |
42
+ | `checked?` | `boolean` | Set checkbox as filled |
43
+ | `disabled?` | `boolean` | Set checkbox as a disabled way (can't click or interact with that) |
44
+ | `error?` | `boolean` | Useful to work inside a form or show some feedback from user action |
45
+ | `onChange?` | `event` | You can listen the changes from the component |
46
+
47
+ ## Changelog
48
+
49
+ ### [0.1.0]
50
+ - replace the checkbox implementation with an input type=checkbox styled to look like what we need
51
+
52
+ ### [0.0.1]
53
+ - update checkbox to behave more like html input with type='checkbox'
54
+
55
+ ### [0.0.0]
56
+ - Offer the "indeterminate" style
57
+ - Get feedback from the component usage (we can migrate to just rendering with css pseudo elements if necessary)
@@ -0,0 +1,84 @@
1
+ import { Margin, } from '@foundations'
2
+ import { If } from '@helpers'
3
+ import { Button } from 'components/molecules/button'
4
+ import { Caption, Label } from 'components/typography'
5
+ import { Playground } from 'storybook-addon-jarle-monaco'
6
+ import styled from 'styled-components'
7
+ import { Checkbox as Base } from '../checkbox'
8
+
9
+ const Checkbox = styled(Base)`
10
+ display: inline-block;
11
+ `
12
+
13
+ export const CheckboxExample = () => (
14
+ <Playground
15
+ code={`
16
+ <>
17
+ <Checkbox />
18
+ <Checkbox checked readOnly />
19
+ <Checkbox disabled />
20
+ <Checkbox checked disabled readOnly />
21
+ <Checkbox error />
22
+ <Checkbox checked error readOnly />
23
+ </>
24
+ `}
25
+ providerProps={{
26
+ renderAsComponent: true,
27
+ scope: {
28
+ Checkbox,
29
+ },
30
+ }}
31
+ />
32
+ )
33
+
34
+ const Fields = styled.div`
35
+ margin-bottom: ${Margin.s};
36
+ `
37
+
38
+ export const IntegratedExample = () => (
39
+ <Playground
40
+ code={`
41
+ /* Edit this code sample! */
42
+ const [withError, setWithError] = useState(false);
43
+ const [accepted, setAccepted] = useState(false);
44
+
45
+ <form onSubmit={(e) => {
46
+ e.preventDefault()
47
+ }}
48
+ >
49
+ <Fields>
50
+ {/* try replacing Checkbox with input */}
51
+ <Checkbox
52
+ id="accept_terms"
53
+ type="checkbox"
54
+ checked={accepted}
55
+ onInvalid={(e) => {
56
+ setWithError(true)
57
+ }}
58
+ error={withError}
59
+ onChange={(e) => {
60
+ setAccepted(!accepted)
61
+ setWithError(false)
62
+ }}
63
+ required
64
+ />
65
+ <label htmlFor="accept_terms"><Label as='span'>I accept these terms.</Label></label>
66
+ <If is={accepted}><Caption subdued>You have accepted the terms.</Caption></If>
67
+ </Fields>
68
+ <Button type='button' onClick={() => setAccepted(false)}>Clear</Button>
69
+ <Button primary type="submit">Submit</Button>
70
+ </form>
71
+ `}
72
+ providerProps={{
73
+ renderAsComponent: true,
74
+ scope: {
75
+ Checkbox,
76
+ Caption,
77
+ Button,
78
+ If,
79
+ Label,
80
+ Fields,
81
+ },
82
+ }}
83
+ />
84
+ )
@@ -0,0 +1,193 @@
1
+ import styled from 'styled-components'
2
+ import { Calendar } from 'react-multi-date-picker'
3
+
4
+ import { Interactive, Surface, Typography, Text, Padding, Margin, Actions } from '@foundations'
5
+
6
+ /**
7
+ * For a reasonable description of the class names etc,
8
+ * @see https://shahabyazdi.github.io/react-multi-date-picker/classes-&-styles/
9
+ */
10
+ export const CustomCalendar = styled(Calendar)`
11
+ .rmdp-week-day {
12
+ ${Typography.Caption}
13
+ color: ${Text.Subdued};
14
+ }
15
+
16
+ .rmdp-header {
17
+ font-size: inherit;
18
+ line-height: inherit;
19
+ height: inherit;
20
+ margin-top: ${Margin.none};
21
+
22
+ .rmdp-header-values span {
23
+ ${Typography.Heading3}
24
+ color: ${Text.Default};
25
+ }
26
+
27
+ button {
28
+ background-color: ${Surface.Default.Default};
29
+ border: none;
30
+ cursor: pointer;
31
+ }
32
+ }
33
+
34
+ .rmdp-day-picker {
35
+ padding: ${Padding.none};
36
+ }
37
+
38
+ .rmdp-month-picker {
39
+ padding: ${Padding.none};
40
+ }
41
+
42
+ .rmdp-year-picker {
43
+ padding: ${Padding.none};
44
+ }
45
+
46
+ .rmdp-calendar {
47
+ padding: ${Padding.m};
48
+ }
49
+
50
+ .rmdp-day.rmdp-disabled {
51
+ border-radius: 6px;
52
+ background-color: ${Actions.Secondary.Disabled};
53
+ box-shadow: none;
54
+ ${Typography.Body}
55
+ color: ${Text.Light};
56
+
57
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden):not(.start):not(.end):hover {
58
+ background-color: ${Actions.Secondary.Hover};
59
+ }
60
+
61
+ &:active {
62
+ background-color: ${Actions.Secondary.Disabled};
63
+ }
64
+
65
+ span {
66
+ background-color: unset;
67
+ }
68
+
69
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span {
70
+ background-color: unset;
71
+ color: ${Text.Default};
72
+ }
73
+
74
+ &.rmdp-today {
75
+ border-radius: 6px;
76
+ }
77
+ }
78
+
79
+ .rmdp-day.rmdp-range {
80
+ border-radius: 0px;
81
+ background-color: ${Surface.Neutral.Subdued};
82
+ box-shadow: none;
83
+ ${Typography.Body}
84
+
85
+ margin-bottom: ${'1px'};
86
+
87
+ &:first-of-type {
88
+ border-radius: 6px 0 0 6px;
89
+ }
90
+
91
+ &:last-of-type {
92
+ border-radius: 0 6px 6px 0;
93
+ }
94
+
95
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden):not(.start):not(.end):hover {
96
+ background-color: ${Actions.Secondary.Hover};
97
+ }
98
+
99
+ &:active {
100
+ background-color: ${Actions.Secondary.Pressed};
101
+ }
102
+
103
+ span {
104
+ background-color: unset;
105
+ }
106
+
107
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span {
108
+ background-color: unset;
109
+ color: ${Text.Default};
110
+ }
111
+
112
+ &.rmdp-today {
113
+ border-radius: 6px;
114
+ }
115
+
116
+ &.start {
117
+ border-radius: 18px 0px 0px 18px;
118
+ }
119
+
120
+ &.end {
121
+ border-radius: 0px 18px 18px 0px;
122
+ }
123
+
124
+ &.start, &.end {
125
+ background-color: ${Interactive.Subtle.Default};
126
+ box-shadow: none;
127
+ ${Typography.Heading4}
128
+ color: ${Text.OnPrimary};
129
+
130
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span {
131
+ background-color: unset;
132
+ color: ${Text.OnPrimary};
133
+ }
134
+
135
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span:hover {
136
+ background-color: unset;
137
+ color: ${Text.OnPrimary};
138
+ }
139
+ }
140
+
141
+ &.rmdp-selected span:not(.highlight) {
142
+ background-color: inherit;
143
+ border-radius: none;
144
+ box-shadow: none;
145
+ }
146
+ }
147
+
148
+ .rmdp-day {
149
+ border-radius: 6px;
150
+ ${Typography.Body}
151
+
152
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden):not(.start):not(.end):not(.rmdp-selected):hover {
153
+ background-color: ${Actions.Secondary.Hover};
154
+ }
155
+
156
+ &:active {
157
+ background-color: ${Actions.Secondary.Pressed};
158
+ }
159
+
160
+ span {
161
+ background-color: unset;
162
+ }
163
+
164
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span {
165
+ background-color: unset;
166
+ color: ${Text.Default};
167
+ }
168
+
169
+ &.rmdp-selected {
170
+ background-color: ${Interactive.Subtle.Default};
171
+ border-radius: 6px;
172
+ box-shadow: none;
173
+ ${Typography.Heading4}
174
+ color: ${Text.OnPrimary};
175
+
176
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span {
177
+ background-color: unset;
178
+ color: ${Text.OnPrimary};
179
+ }
180
+
181
+ &:not(.rmdp-disabled):not(.rmdp-day-hidden) span:hover {
182
+ background-color: unset;
183
+ color: ${Text.OnPrimary};
184
+ }
185
+ }
186
+
187
+ &.rmdp-selected span:not(.highlight) {
188
+ background-color: inherit;
189
+ border-radius: none;
190
+ box-shadow: none;
191
+ }
192
+ }
193
+ `
@@ -0,0 +1 @@
1
+ export * from './custom-calendar'
@@ -0,0 +1,220 @@
1
+ import { render, screen, within } from '@testing-library/react'
2
+ import userEvent from '@testing-library/user-event'
3
+ import { isNil } from 'lodash'
4
+ import { DatePicker } from './index'
5
+
6
+ describe('DatePicker', () => {
7
+ describe('Controls', () => {
8
+ it('renders the controls you pass with the role button', () => {
9
+ render(
10
+ <DatePicker>
11
+ <DatePicker.Controls>
12
+ <div>Hello</div>
13
+ </DatePicker.Controls>
14
+ </DatePicker>
15
+ )
16
+
17
+ const controls = screen.getByRole('combobox')
18
+
19
+ expect(controls).toBeInTheDocument()
20
+ expect(within(controls).getByText('Hello')).toBeInTheDocument()
21
+ })
22
+
23
+ it('clicking the controls you pass in opens the Calendar', async () => {
24
+ render(
25
+ <DatePicker>
26
+ <DatePicker.Controls>
27
+ <div>Hello</div>
28
+ </DatePicker.Controls>
29
+ </DatePicker>
30
+ )
31
+
32
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
33
+ await userEvent.click(screen.getByRole('combobox'))
34
+ expect(screen.getByRole('dialog')).toBeInTheDocument()
35
+ })
36
+
37
+ it('calls the onClick you passed in to your controls', async () => {
38
+ const handleClick = jest.fn()
39
+
40
+ render(
41
+ <DatePicker>
42
+ <DatePicker.Controls>
43
+ <div onClick={handleClick}>Hello</div>
44
+ </DatePicker.Controls>
45
+ </DatePicker>
46
+ )
47
+
48
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
49
+ await userEvent.click(screen.getByRole('combobox'))
50
+ expect(handleClick).toHaveBeenCalled()
51
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
52
+ })
53
+
54
+ it('renders an input by default with the role button', () => {
55
+ render(<DatePicker label="Start Date" />)
56
+
57
+ expect(screen.getByLabelText('Start Date')).toBeInTheDocument()
58
+ expect(screen.getByRole('combobox')).toBeInTheDocument()
59
+ })
60
+
61
+ describe('the default controls', () => {
62
+ it('shows a placeholder when there is no value', () => {
63
+ render(<DatePicker label="Start Date" />)
64
+
65
+ expect(screen.getByLabelText('Start Date')).toHaveAttribute(
66
+ 'placeholder',
67
+ 'YYYY-MM-DD'
68
+ )
69
+ })
70
+
71
+ it('shows a value when there is a value', () => {
72
+ render(
73
+ <DatePicker
74
+ value="2022-12-03"
75
+ onChange={() => undefined}
76
+ label="Start Date"
77
+ />
78
+ )
79
+
80
+ expect(screen.getByLabelText('Start Date')).toHaveAttribute(
81
+ 'value',
82
+ expect.stringMatching(/2022-12-(02|03|04)/)
83
+ )
84
+ })
85
+
86
+ it('formats the value with the given format string', () => {
87
+ const date = '2022-12-03'
88
+ const today = new Date(date)
89
+
90
+ /** formats dates like D/MM/YYYY */
91
+ const formatted = `${today.getDate()}/${
92
+ today.getMonth() + 1
93
+ }/${today.getFullYear()}`
94
+
95
+ render(
96
+ <DatePicker
97
+ value={date}
98
+ format="D/MM/YYYY"
99
+ onChange={() => undefined}
100
+ label="Start Date"
101
+ />
102
+ )
103
+
104
+ expect(screen.getByLabelText('Start Date')).toHaveAttribute(
105
+ 'value',
106
+ formatted
107
+ )
108
+ })
109
+
110
+ it('formats the value with the given format function', () => {
111
+ const date = '2022-12-03'
112
+ const today = new Date(date)
113
+
114
+ /** formats dates like D/MM/YYYY */
115
+ const formatted = `${today.getDate()}/${
116
+ today.getMonth() + 1
117
+ }/${today.getFullYear()}`
118
+
119
+ render(
120
+ <DatePicker
121
+ value={date}
122
+ onChange={() => undefined}
123
+ format={({ date, defaultFormatter }) =>
124
+ isNil(date)
125
+ ? 'Next Available'
126
+ : `Date: ${defaultFormatter(date, 'D/MM/YYYY')}`
127
+ }
128
+ label="Start Date"
129
+ />
130
+ )
131
+
132
+ expect(screen.getByLabelText('Start Date')).toHaveAttribute(
133
+ 'value',
134
+ `Date: ${formatted}`
135
+ )
136
+ })
137
+
138
+ test.todo('formats the value with a default')
139
+
140
+ it('opens the calendar on click', async () => {
141
+ render(<DatePicker />)
142
+
143
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
144
+ expect(screen.queryByRole('combobox')).toBeInTheDocument()
145
+ await userEvent.click(screen.getByRole('combobox'))
146
+ expect(screen.queryByRole('dialog')).toBeInTheDocument()
147
+ })
148
+
149
+ test.todo('renders the given label')
150
+ test.todo('you can override the placeholder')
151
+ test.todo('you can mark the input required')
152
+ test.todo('you can mark the input disabled')
153
+
154
+ it('the input respects the required property', async () => {
155
+ render(
156
+ <form onSubmit={(e) => e.preventDefault()} data-testid="form">
157
+ <DatePicker label="Start Date" required />
158
+ <button type="submit">Click Me</button>
159
+ </form>
160
+ )
161
+
162
+ // it is initially empty
163
+ expect(screen.getByLabelText('Start Date*')).toHaveAttribute(
164
+ 'value',
165
+ ''
166
+ )
167
+
168
+ // try to submit
169
+ await userEvent.click(screen.getByText('Click Me'))
170
+
171
+ // we can't
172
+ expect(document.querySelectorAll(':invalid').length).not.toBe(0)
173
+
174
+ // click to open the dialog
175
+ await userEvent.click(screen.getByLabelText('Start Date*'))
176
+
177
+ // click the date... 12
178
+ await userEvent.click(screen.getByText('12'))
179
+
180
+ // now the inpupt has a value
181
+ expect(screen.getByLabelText('Start Date*')).toHaveAttribute(
182
+ 'value',
183
+ expect.stringContaining('12')
184
+ )
185
+
186
+ // try to submit again
187
+ await userEvent.click(screen.getByText('Click Me'))
188
+
189
+ // we can!
190
+ expect(document.querySelectorAll(':invalid').length).toBe(0)
191
+ })
192
+ })
193
+ })
194
+
195
+ it('renders a calendar when open', () => {
196
+ render(<DatePicker defaultOpen label="Start Date" />)
197
+
198
+ expect(screen.queryByRole('dialog')).toBeInTheDocument()
199
+ })
200
+
201
+ it('renders no calendar when closed', () => {
202
+ render(<DatePicker label="Start Date" />)
203
+
204
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument()
205
+ })
206
+
207
+ it('passes children to the Calendar', () => {
208
+ render(<DatePicker defaultOpen><div>WHOA</div></DatePicker>)
209
+
210
+ const calendar = screen.getByRole('dialog')
211
+ expect(within(calendar).getByText('WHOA')).toBeInTheDocument()
212
+ })
213
+
214
+ describe('Calendar', () => {
215
+ test.todo('disables dates in the given min and max range')
216
+ test.todo('disables dates when isAvailable is false for those dates')
217
+ test.todo('calls onChange when the selected date changes')
218
+ })
219
+ })
220
+
@@ -0,0 +1,10 @@
1
+ import { FC, isDefined } from '@helpers'
2
+ import { datePickerFactory, IDatePickerProps as IBaseProps, IDatePickerSlots } from './helpers/date-picker-factory'
3
+
4
+ export type IDatePickerProps = IBaseProps<string>
5
+
6
+ export const DatePicker: FC<IDatePickerProps, IDatePickerSlots> = datePickerFactory({
7
+ toDate: (str) => new Date(str),
8
+ fromDate: (date) => isDefined(date) ? date.toISOString() : '',
9
+ empty: (str) => str === '',
10
+ })