@edvisor/product-language 0.3.0 → 0.4.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 (290) hide show
  1. package/index.d.ts +2 -0
  2. package/index.js +9374 -0
  3. package/lib/components/alert-banner/alert-banner.d.ts +11 -0
  4. package/lib/components/alert-banner/alert-level-flags.d.ts +13 -0
  5. package/lib/components/alert-banner/index.d.ts +1 -0
  6. package/lib/components/badge/badge-type-flags.d.ts +18 -0
  7. package/lib/components/badge/badge.d.ts +5 -0
  8. package/lib/components/badge/index.d.ts +1 -0
  9. package/{src/lib/components/card/atoms/card-frame.tsx → lib/components/card/atoms/card-frame.d.ts} +7 -17
  10. package/lib/components/card/atoms/index.d.ts +1 -0
  11. package/lib/components/card/card.d.ts +14 -0
  12. package/lib/components/card/components/card-alert-banner-slot.d.ts +5 -0
  13. package/lib/components/card/components/card-controls-slot.d.ts +4 -0
  14. package/lib/components/card/components/card-section-slot.d.ts +11 -0
  15. package/lib/components/card/components/index.d.ts +3 -0
  16. package/lib/components/card/index.d.ts +2 -0
  17. package/lib/components/card/molecules/index.d.ts +1 -0
  18. package/lib/components/card/molecules/left-right-card.d.ts +16 -0
  19. package/lib/components/checkbox/checkbox.d.ts +10 -0
  20. package/lib/components/checkbox/helpers.d.ts +12 -0
  21. package/lib/components/checkbox/index.d.ts +1 -0
  22. package/lib/components/divider/divider-type-flags.d.ts +9 -0
  23. package/lib/components/divider/divider.d.ts +7 -0
  24. package/lib/components/divider/index.d.ts +1 -0
  25. package/lib/components/flag/flag-size-flags.d.ts +12 -0
  26. package/lib/components/flag/flag.d.ts +9 -0
  27. package/lib/components/flag/flag.list.d.ts +781 -0
  28. package/lib/components/flag/index.d.ts +1 -0
  29. package/lib/components/icon/icon-list.d.ts +131 -0
  30. package/lib/components/icon/icon.d.ts +131 -0
  31. package/lib/components/icon/index.d.ts +1 -0
  32. package/lib/components/index.d.ts +18 -0
  33. package/lib/components/input-field/components/index.d.ts +2 -0
  34. package/lib/components/input-field/components/labeled-input.d.ts +10 -0
  35. package/lib/components/input-field/components/stepper.d.ts +7 -0
  36. package/lib/components/input-field/index.d.ts +3 -0
  37. package/lib/components/input-field/input-field.d.ts +25 -0
  38. package/lib/components/input-field/input-number.d.ts +18 -0
  39. package/lib/components/input-field/input-text.d.ts +14 -0
  40. package/lib/components/layout/flex.d.ts +16 -0
  41. package/lib/components/layout/grid-layout.d.ts +11 -0
  42. package/lib/components/layout/index.d.ts +3 -0
  43. package/lib/components/layout/left-right-layout.d.ts +34 -0
  44. package/lib/components/link/index.d.ts +1 -0
  45. package/lib/components/link/link.d.ts +14 -0
  46. package/lib/components/molecules/avatar/avatar-size-flags.d.ts +12 -0
  47. package/lib/components/molecules/avatar/avatar.d.ts +12 -0
  48. package/lib/components/molecules/avatar/index.d.ts +1 -0
  49. package/lib/components/molecules/button/button-flags.d.ts +44 -0
  50. package/lib/components/molecules/button/button.d.ts +12 -0
  51. package/lib/components/molecules/button/index.d.ts +1 -0
  52. package/lib/components/molecules/index.d.ts +3 -0
  53. package/lib/components/molecules/input-checkbox/index.d.ts +1 -0
  54. package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +8 -0
  55. package/lib/components/organisms/index.d.ts +1 -0
  56. package/lib/components/organisms/multi-choice-list/index.d.ts +1 -0
  57. package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +10 -0
  58. package/lib/components/select/components/menu-container.d.ts +3 -0
  59. package/lib/components/select/components/menu-row.d.ts +9 -0
  60. package/lib/components/select/components/menu.d.ts +2 -0
  61. package/lib/components/select/components/option.d.ts +10 -0
  62. package/lib/components/select/components/select-label.d.ts +1 -0
  63. package/lib/components/select/components/value-component-multi.d.ts +3 -0
  64. package/lib/components/select/components/value-component-single.d.ts +4 -0
  65. package/lib/components/select/components/value.d.ts +4 -0
  66. package/lib/components/select/index.d.ts +1 -0
  67. package/lib/components/select/select.d.ts +9 -0
  68. package/lib/components/select/types.d.ts +124 -0
  69. package/lib/components/select/utils.d.ts +15 -0
  70. package/lib/components/spinner/index.d.ts +1 -0
  71. package/lib/components/spinner/spinner-size-flags.d.ts +10 -0
  72. package/lib/components/spinner/spinner.d.ts +9 -0
  73. package/lib/components/tabs/components/index.d.ts +1 -0
  74. package/lib/components/tabs/components/tab.d.ts +7 -0
  75. package/lib/components/tabs/index.d.ts +1 -0
  76. package/lib/components/tabs/tabs.d.ts +15 -0
  77. package/lib/components/tag/components/close-button.d.ts +8 -0
  78. package/lib/components/tag/components/index.d.ts +2 -0
  79. package/lib/components/tag/components/tag-label.d.ts +8 -0
  80. package/lib/components/tag/index.d.ts +1 -0
  81. package/lib/components/tag/tag.d.ts +10 -0
  82. package/lib/components/thumbnail/index.d.ts +1 -0
  83. package/lib/components/thumbnail/thumbnail-size-flags.d.ts +10 -0
  84. package/lib/components/thumbnail/thumbnail.d.ts +10 -0
  85. package/lib/components/typography/index.d.ts +1 -0
  86. package/lib/components/typography/typography.d.ts +24 -0
  87. package/lib/foundations/color-system/base-palette/base-palette.d.ts +76 -0
  88. package/lib/foundations/color-system/base-palette/index.d.ts +1 -0
  89. package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +132 -0
  90. package/lib/foundations/color-system/color-guidelines/index.d.ts +1 -0
  91. package/lib/foundations/color-system/components/color-sample.d.ts +17 -0
  92. package/lib/foundations/color-system/components/index.d.ts +1 -0
  93. package/lib/foundations/color-system/index.d.ts +1 -0
  94. package/lib/foundations/index.d.ts +4 -0
  95. package/lib/foundations/shadows/components.d.ts +8 -0
  96. package/lib/foundations/shadows/index.d.ts +1 -0
  97. package/lib/foundations/shadows/shadows.d.ts +8 -0
  98. package/lib/foundations/spacing/index.d.ts +1 -0
  99. package/lib/foundations/spacing/spacing-guidelines.d.ts +22 -0
  100. package/lib/foundations/spacing/spacing.d.ts +18 -0
  101. package/lib/foundations/typography/constants.d.ts +22 -0
  102. package/lib/foundations/typography/fonts.d.ts +1 -0
  103. package/lib/foundations/typography/index.d.ts +1 -0
  104. package/lib/foundations/typography/text-aspect-flags.d.ts +19 -0
  105. package/lib/foundations/typography/typography.d.ts +24 -0
  106. package/lib/helpers/generic-types.d.ts +21 -0
  107. package/lib/helpers/index.d.ts +6 -0
  108. package/lib/helpers/nothing.d.ts +8 -0
  109. package/{src/lib/helpers/numbers.ts → lib/helpers/numbers.d.ts} +50 -67
  110. package/lib/helpers/safe-navigation.d.ts +15 -0
  111. package/lib/helpers/slots.d.ts +23 -0
  112. package/lib/helpers/strings.d.ts +1 -0
  113. package/package.json +12 -3
  114. package/.babelrc +0 -12
  115. package/.eslintrc.json +0 -147
  116. package/.storybook/main.js +0 -57
  117. package/.storybook/manager.js +0 -7
  118. package/.storybook/preview.js +0 -15
  119. package/.storybook/tsconfig.json +0 -30
  120. package/jest.config.ts +0 -15
  121. package/jest.setup.ts +0 -2
  122. package/project.json +0 -96
  123. package/release-it.json +0 -18
  124. package/src/README.md +0 -61
  125. package/src/assets/svg/example_icon.svg +0 -3
  126. package/src/assets/svg/example_icon_white.svg +0 -3
  127. package/src/assets/svg/spinner.svg +0 -3
  128. package/src/assets/svg/spinner_white.svg +0 -3
  129. package/src/helpers/index.ts +0 -4
  130. package/src/helpers/playground.ts +0 -16
  131. package/src/helpers/talesOf.tsx +0 -42
  132. package/src/index.ts +0 -2
  133. package/src/lib/components/README.md +0 -49
  134. package/src/lib/components/alert-banner/alert-banner.tsx +0 -34
  135. package/src/lib/components/alert-banner/alert-level-flags.ts +0 -77
  136. package/src/lib/components/alert-banner/index.ts +0 -1
  137. package/src/lib/components/badge/badge-type-flags.ts +0 -72
  138. package/src/lib/components/badge/badge.test.tsx +0 -29
  139. package/src/lib/components/badge/badge.tsx +0 -22
  140. package/src/lib/components/badge/index.ts +0 -1
  141. package/src/lib/components/badge/stories/badge.stories.mdx +0 -44
  142. package/src/lib/components/badge/stories/components.tsx +0 -49
  143. package/src/lib/components/card/atoms/index.ts +0 -1
  144. package/src/lib/components/card/card.test.tsx +0 -162
  145. package/src/lib/components/card/card.tsx +0 -78
  146. package/src/lib/components/card/components/card-alert-banner-slot.tsx +0 -16
  147. package/src/lib/components/card/components/card-controls-slot.tsx +0 -19
  148. package/src/lib/components/card/components/card-section-slot.tsx +0 -51
  149. package/src/lib/components/card/components/index.ts +0 -3
  150. package/src/lib/components/card/index.ts +0 -2
  151. package/src/lib/components/card/molecules/index.ts +0 -1
  152. package/src/lib/components/card/molecules/left-right-card.test.tsx +0 -89
  153. package/src/lib/components/card/molecules/left-right-card.tsx +0 -63
  154. package/src/lib/components/card/storybook/card.stories.mdx +0 -100
  155. package/src/lib/components/card/storybook/components.tsx +0 -223
  156. package/src/lib/components/checkbox/checkbox.test.tsx +0 -39
  157. package/src/lib/components/checkbox/checkbox.tsx +0 -63
  158. package/src/lib/components/checkbox/helpers.tsx +0 -100
  159. package/src/lib/components/checkbox/index.tsx +0 -1
  160. package/src/lib/components/checkbox/stories/checkbox.stories.mdx +0 -57
  161. package/src/lib/components/checkbox/stories/components.tsx +0 -84
  162. package/src/lib/components/divider/divider-type-flags.tsx +0 -37
  163. package/src/lib/components/divider/divider.test.tsx +0 -34
  164. package/src/lib/components/divider/divider.tsx +0 -37
  165. package/src/lib/components/divider/index.tsx +0 -1
  166. package/src/lib/components/divider/stories/components.tsx +0 -13
  167. package/src/lib/components/divider/stories/divider.stories.mdx +0 -44
  168. package/src/lib/components/flag/flag-size-flags.tsx +0 -55
  169. package/src/lib/components/flag/flag.list.tsx +0 -788
  170. package/src/lib/components/flag/flag.test.tsx +0 -65
  171. package/src/lib/components/flag/flag.tsx +0 -97
  172. package/src/lib/components/flag/index.tsx +0 -1
  173. package/src/lib/components/flag/stories/components.tsx +0 -403
  174. package/src/lib/components/flag/stories/flag.stories.mdx +0 -48
  175. package/src/lib/components/flag/stories/playGround-select.tsx +0 -145
  176. package/src/lib/components/icon/icon-list.tsx +0 -135
  177. package/src/lib/components/icon/icon.test.tsx +0 -48
  178. package/src/lib/components/icon/icon.tsx +0 -181
  179. package/src/lib/components/icon/index.tsx +0 -1
  180. package/src/lib/components/icon/stories/components.tsx +0 -282
  181. package/src/lib/components/icon/stories/icon.stories.mdx +0 -65
  182. package/src/lib/components/index.ts +0 -19
  183. package/src/lib/components/input-field/components/index.ts +0 -2
  184. package/src/lib/components/input-field/components/labeled-input.tsx +0 -54
  185. package/src/lib/components/input-field/components/stepper.tsx +0 -60
  186. package/src/lib/components/input-field/index.ts +0 -6
  187. package/src/lib/components/input-field/input-field.test.tsx +0 -107
  188. package/src/lib/components/input-field/input-field.tsx +0 -126
  189. package/src/lib/components/input-field/input-number.tsx +0 -41
  190. package/src/lib/components/input-field/input-text.tsx +0 -30
  191. package/src/lib/components/input-field/storybook/components.tsx +0 -327
  192. package/src/lib/components/input-field/storybook/input-field.stories.mdx +0 -113
  193. package/src/lib/components/layout/flex.tsx +0 -22
  194. package/src/lib/components/layout/grid-layout.tsx +0 -40
  195. package/src/lib/components/layout/index.ts +0 -3
  196. package/src/lib/components/layout/left-right-layout.tsx +0 -67
  197. package/src/lib/components/link/index.ts +0 -1
  198. package/src/lib/components/link/link.test.tsx +0 -29
  199. package/src/lib/components/link/link.tsx +0 -56
  200. package/src/lib/components/link/storybook/link.stories.mdx +0 -52
  201. package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +0 -55
  202. package/src/lib/components/molecules/avatar/avatar.test.tsx +0 -114
  203. package/src/lib/components/molecules/avatar/avatar.tsx +0 -80
  204. package/src/lib/components/molecules/avatar/index.tsx +0 -1
  205. package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +0 -52
  206. package/src/lib/components/molecules/avatar/stories/components.tsx +0 -36
  207. package/src/lib/components/molecules/button/button-flags.tsx +0 -340
  208. package/src/lib/components/molecules/button/button.test.tsx +0 -77
  209. package/src/lib/components/molecules/button/button.tsx +0 -214
  210. package/src/lib/components/molecules/button/index.tsx +0 -1
  211. package/src/lib/components/molecules/button/stories/button.stories.mdx +0 -105
  212. package/src/lib/components/molecules/button/stories/components.tsx +0 -84
  213. package/src/lib/components/molecules/index.ts +0 -3
  214. package/src/lib/components/molecules/input-checkbox/index.tsx +0 -1
  215. package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +0 -34
  216. package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +0 -49
  217. package/src/lib/components/molecules/input-checkbox/stories/components.tsx +0 -53
  218. package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +0 -49
  219. package/src/lib/components/organisms/index.ts +0 -1
  220. package/src/lib/components/organisms/multi-choice-list/index.tsx +0 -1
  221. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +0 -33
  222. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +0 -52
  223. package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +0 -124
  224. package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +0 -99
  225. package/src/lib/components/spinner/index.tsx +0 -1
  226. package/src/lib/components/spinner/spinner-size-flags.tsx +0 -39
  227. package/src/lib/components/spinner/spinner.test.tsx +0 -31
  228. package/src/lib/components/spinner/spinner.tsx +0 -54
  229. package/src/lib/components/spinner/stories/components.tsx +0 -39
  230. package/src/lib/components/spinner/stories/spinner.stories.mdx +0 -35
  231. package/src/lib/components/tabs/components/index.ts +0 -1
  232. package/src/lib/components/tabs/components/tab.tsx +0 -62
  233. package/src/lib/components/tabs/index.tsx +0 -1
  234. package/src/lib/components/tabs/storybook/components.tsx +0 -282
  235. package/src/lib/components/tabs/storybook/tabs.stories.mdx +0 -97
  236. package/src/lib/components/tabs/tabs.test.tsx +0 -86
  237. package/src/lib/components/tabs/tabs.tsx +0 -101
  238. package/src/lib/components/tag/components/close-button.tsx +0 -85
  239. package/src/lib/components/tag/components/index.ts +0 -2
  240. package/src/lib/components/tag/components/tag-label.tsx +0 -44
  241. package/src/lib/components/tag/index.tsx +0 -1
  242. package/src/lib/components/tag/stories/components.tsx +0 -86
  243. package/src/lib/components/tag/stories/tag.stories.mdx +0 -42
  244. package/src/lib/components/tag/tag.test.tsx +0 -36
  245. package/src/lib/components/tag/tag.tsx +0 -33
  246. package/src/lib/components/thumbnail/index.tsx +0 -1
  247. package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +0 -34
  248. package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +0 -41
  249. package/src/lib/components/thumbnail/thumbnail.test.tsx +0 -51
  250. package/src/lib/components/thumbnail/thumbnail.tsx +0 -45
  251. package/src/lib/components/typography/index.ts +0 -1
  252. package/src/lib/components/typography/storybook/components.tsx +0 -288
  253. package/src/lib/components/typography/storybook/typography.stories.mdx +0 -90
  254. package/src/lib/components/typography/typography.test.tsx +0 -97
  255. package/src/lib/components/typography/typography.tsx +0 -99
  256. package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +0 -123
  257. package/src/lib/foundations/color-system/base-palette/base-palette.ts +0 -93
  258. package/src/lib/foundations/color-system/base-palette/index.ts +0 -1
  259. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +0 -85
  260. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +0 -231
  261. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +0 -160
  262. package/src/lib/foundations/color-system/color-guidelines/index.ts +0 -1
  263. package/src/lib/foundations/color-system/components/color-sample.tsx +0 -99
  264. package/src/lib/foundations/color-system/components/index.ts +0 -1
  265. package/src/lib/foundations/color-system/index.ts +0 -1
  266. package/src/lib/foundations/index.ts +0 -4
  267. package/src/lib/foundations/shadows/components.tsx +0 -59
  268. package/src/lib/foundations/shadows/index.ts +0 -1
  269. package/src/lib/foundations/shadows/shadows.stories.mdx +0 -71
  270. package/src/lib/foundations/shadows/shadows.tsx +0 -47
  271. package/src/lib/foundations/spacing/index.ts +0 -1
  272. package/src/lib/foundations/spacing/spacing-guidelines.ts +0 -24
  273. package/src/lib/foundations/spacing/spacing.stories.mdx +0 -51
  274. package/src/lib/foundations/spacing/spacing.ts +0 -18
  275. package/src/lib/foundations/typography/constants.ts +0 -25
  276. package/src/lib/foundations/typography/fonts.ts +0 -205
  277. package/src/lib/foundations/typography/index.tsx +0 -1
  278. package/src/lib/foundations/typography/text-aspect-flags.ts +0 -61
  279. package/src/lib/foundations/typography/typography.tsx +0 -102
  280. package/src/lib/helpers/generic-types.ts +0 -44
  281. package/src/lib/helpers/index.ts +0 -6
  282. package/src/lib/helpers/nothing.tsx +0 -18
  283. package/src/lib/helpers/safe-navigation.ts +0 -44
  284. package/src/lib/helpers/slots.test.tsx +0 -98
  285. package/src/lib/helpers/slots.tsx +0 -157
  286. package/src/lib/helpers/strings.test.ts +0 -47
  287. package/src/lib/helpers/strings.ts +0 -16
  288. package/tsconfig.json +0 -35
  289. package/tsconfig.lib.json +0 -28
  290. package/tsconfig.spec.json +0 -21
@@ -1,162 +0,0 @@
1
- import { Margin } from '@foundations'
2
- import { render, screen } from '@testing-library/react'
3
- import userEvent from '@testing-library/user-event'
4
- import styled from 'styled-components'
5
-
6
- import { Card } from './card'
7
-
8
- describe('Card', () => {
9
- it('renders with the heading', () => {
10
- render(
11
- <Card heading='Heading'>Contents</Card>
12
- )
13
-
14
- expect(screen.getByRole('heading')).toBeInTheDocument()
15
- expect(screen.getByText('Heading')).toBeInTheDocument()
16
- expect(screen.getByText('Contents')).toBeInTheDocument()
17
- })
18
-
19
- it('renders without the heading', () => {
20
- render(
21
- <Card>Contents</Card>
22
- )
23
-
24
- expect(screen.queryByRole('heading')).not.toBeInTheDocument()
25
- expect(screen.getByText('Contents')).toBeInTheDocument()
26
- })
27
-
28
- /**
29
- * this test just ensures that the programmer did not
30
- * forget to add className? to the props and then pass
31
- * it to the wrapping element so that users downstream
32
- * can style the component
33
- */
34
- it('accepts styles', () => {
35
- const NiceCard = styled(Card)`
36
- margin-bottom: ${Margin.l};
37
- `
38
-
39
- const { container } = render(<NiceCard>Contents</NiceCard>)
40
-
41
- expect(container.firstChild).toHaveStyle(`margin-bottom: ${Margin.l}`)
42
- expect(screen.getByText('Contents')).toBeInTheDocument()
43
- })
44
-
45
- describe('slots', () => {
46
- it('renders no regions if it has no headings', () => {
47
- render(
48
- <Card>Contents</Card>
49
- )
50
-
51
- expect(screen.queryByRole('region')).not.toBeInTheDocument()
52
- expect(screen.getByText('Contents')).toBeInTheDocument()
53
- })
54
-
55
- it('renders one region if the card has a heading', () => {
56
- render(
57
- <Card heading='Heading'>Contents</Card>
58
- )
59
-
60
- expect(screen.getByRole('region')).toBeInTheDocument()
61
- expect(screen.getAllByRole('region').length).toBe(1)
62
- expect(screen.getByText('Contents')).toBeInTheDocument()
63
- })
64
-
65
- it('renders one region per heading', () => {
66
- render(
67
- <Card heading='Heading'>
68
- <Card.Section heading='Subheading 1'>Section 1</Card.Section>
69
- <Card.Section heading='Subheading 2'>Section 2</Card.Section>
70
- <Card.Section>Section 3</Card.Section>
71
- <Card.Section>Section 4</Card.Section>
72
- </Card>
73
- )
74
-
75
- expect(screen.getAllByRole('region').length).toBe(3)
76
- })
77
-
78
- it('renders all the given sections', () => {
79
- render(
80
- <Card heading='Heading'>
81
- <Card.Section heading='Subheading 1'>Section 1</Card.Section>
82
- <Card.Section heading='Subheading 2'>Section 2</Card.Section>
83
- <Card.Section>Section 3</Card.Section>
84
- <Card.Section>Section 4</Card.Section>
85
- </Card>
86
- )
87
-
88
- expect(screen.getByText('Section 1')).toBeInTheDocument()
89
- expect(screen.getByText('Section 2')).toBeInTheDocument()
90
- expect(screen.getByText('Section 3')).toBeInTheDocument()
91
- expect(screen.getByText('Section 4')).toBeInTheDocument()
92
- })
93
-
94
- it('does not render plain children if you give it sections', () => {
95
- render(
96
- <Card>
97
- <Card.Section>Section 1</Card.Section>
98
- <div data-testid='plain-children'>PLAIN CHILDREN</div>
99
- </Card>
100
- )
101
-
102
- expect(screen.getByText('Section 1')).toBeInTheDocument()
103
- expect(screen.queryByTestId('plain-children')).not.toBeInTheDocument()
104
- })
105
-
106
- it('renders the heading actions if there is a heading', () => {
107
- render(
108
- <Card heading='Heading'>
109
- <Card.Section>Section 1</Card.Section>
110
- <Card.HeadingAction>
111
- <button>Click Me</button>
112
- </Card.HeadingAction>
113
- </Card>
114
- )
115
-
116
- expect(screen.getByRole('button')).toBeInTheDocument()
117
- })
118
-
119
- it('does not render heading actions if there is no heading', () => {
120
- render(
121
- <Card>
122
- <Card.Section>Section 1</Card.Section>
123
- <Card.HeadingAction>
124
- <button>Click Me</button>
125
- </Card.HeadingAction>
126
- </Card>
127
- )
128
-
129
- expect(screen.queryByRole('button')).not.toBeInTheDocument()
130
- })
131
-
132
- it('renders the controls when they are provided', () => {
133
- render(
134
- <Card heading='Heading'>
135
- <Card.Section>Section 1</Card.Section>
136
- <Card.Controls>
137
- <button>Click Me</button>
138
- </Card.Controls>
139
- </Card>
140
- )
141
-
142
- expect(screen.getByRole('button')).toBeInTheDocument()
143
- })
144
-
145
- it('does not stop the user from clicking the controls', async () => {
146
- const handleClick = jest.fn()
147
-
148
- render(
149
- <Card heading='Heading'>
150
- <Card.Section>Section 1</Card.Section>
151
- <Card.Controls>
152
- <button onClick={handleClick}>Click Me</button>
153
- </Card.Controls>
154
- </Card>
155
- )
156
-
157
- await userEvent.click(screen.getByText('Click Me'))
158
-
159
- expect(handleClick).toHaveBeenCalledTimes(1)
160
- })
161
- })
162
- })
@@ -1,78 +0,0 @@
1
- import styled from 'styled-components'
2
- import { isDefined, isEmpty, getSlots, getOtherChildren, FC, PropsWithChildren, If, getSlot, toKebabCase } from '@helpers'
3
- import { Padding, Margin, shadow } from '@foundations'
4
- import { CardFrame as CardFrameBase } from './atoms'
5
- import { Heading3 } from 'components/typography'
6
- import { SpaceBetween } from 'components/layout'
7
- import { CardAlertBannerSlot, CardControlsSlot, CardHeadingActionSlot, CardSectionSlot } from './components'
8
- import { HTMLAttributes } from 'react'
9
-
10
- const CardHeading = styled(SpaceBetween)`
11
- margin: ${Margin.none} ${Margin.l} ${Margin.none} ${Margin.l};
12
- padding-top: ${Padding.l};
13
- `
14
-
15
- /** remove the margin bottom here since the frame handles it */
16
- const CardHeadingText = styled(Heading3)`
17
- margin-bottom: ${Margin.none};
18
- `
19
-
20
- const CardFrame = styled(CardFrameBase)`
21
- ${shadow};
22
-
23
- > section:nth-of-type(1) {
24
- border: none;
25
- }
26
- `
27
-
28
- export interface ICardProps extends HTMLAttributes<HTMLDivElement>, PropsWithChildren {
29
- heading?: string
30
- }
31
-
32
- const SubComponents = {
33
- Section: CardSectionSlot,
34
- Controls: CardControlsSlot,
35
- HeadingAction: CardHeadingActionSlot,
36
- AlertBanner: CardAlertBannerSlot,
37
- }
38
-
39
- export const Card: FC<ICardProps, typeof SubComponents> = (props) => {
40
- const { children, heading, ...htmlProps } = props
41
-
42
- const sections = getSlots(CardSectionSlot, children)
43
- const controls = getSlot(CardControlsSlot, children)
44
- const headingAction = getSlot(CardHeadingActionSlot, children)
45
- const alertBanners = getSlots(CardAlertBannerSlot, children)
46
- const otherChildren = getOtherChildren(children)
47
-
48
- const headingId = isDefined(heading)
49
- ? toKebabCase(heading)
50
- : undefined
51
-
52
- return (
53
- <CardFrame
54
- aria-labelledby={headingId}
55
- {...htmlProps}
56
- >
57
- <If is={alertBanners}>{alertBanners}</If>
58
- <If is={heading}>
59
- <CardHeading>
60
- <CardHeadingText id={headingId}>{heading}</CardHeadingText>
61
- <If is={headingAction}>{headingAction}</If>
62
- </CardHeading>
63
- </If>
64
- {isEmpty(sections) ? (
65
- <CardSectionSlot>{otherChildren}</CardSectionSlot>
66
- ) : (
67
- sections
68
- )}
69
- <If is={controls}>{controls}</If>
70
- </CardFrame>
71
- )
72
- }
73
-
74
- /** export the slots and some sub-components */
75
- Card.Section = CardSectionSlot
76
- Card.Controls = CardControlsSlot
77
- Card.HeadingAction = CardHeadingActionSlot
78
- Card.AlertBanner = CardAlertBannerSlot
@@ -1,16 +0,0 @@
1
- import styled from 'styled-components'
2
- import { Slot } from '@helpers'
3
- import { Margin } from '@foundations'
4
- import { AlertBanner, AlertBannerProps } from 'components/alert-banner'
5
-
6
- const CardAlertBanner = styled(AlertBanner)`
7
- margin: ${Margin.l} ${Margin.l} ${Margin.none} ${Margin.l};
8
- `
9
-
10
- export class CardAlertBannerSlot extends Slot<AlertBannerProps> {
11
- override render () {
12
- return (
13
- <CardAlertBanner {...this.props}>{this.props.children}</CardAlertBanner>
14
- )
15
- }
16
- }
@@ -1,19 +0,0 @@
1
- import styled from 'styled-components'
2
- import { Slot, PropsWithChildren } from '@helpers'
3
- import { Padding } from '@foundations'
4
- import { Flex } from 'components/layout'
5
-
6
- const ControlsFrame = styled(Flex)`
7
- justify-content: end;
8
- padding: ${Padding.none} ${Padding.l} ${Padding.l} ${Padding.l};
9
- `
10
-
11
- export class CardControlsSlot extends Slot<PropsWithChildren> {
12
- override render () {
13
- return (
14
- <ControlsFrame>
15
- {this.props.children}
16
- </ControlsFrame>
17
- )
18
- }
19
- }
@@ -1,51 +0,0 @@
1
- import { HTMLAttributes } from 'react'
2
- import styled from 'styled-components'
3
- import { isDefined, Slot, getOtherChildren, PropsWithChildren, If, getSlot, toKebabCase } from '@helpers'
4
- import { Borders, Padding, Margin } from '@foundations'
5
- import { Heading4 } from 'components/typography'
6
- import { SpaceBetween } from 'components/layout'
7
-
8
- export class CardHeadingActionSlot extends Slot {}
9
-
10
- interface ICardSectionProps extends HTMLAttributes<HTMLDivElement>, PropsWithChildren {
11
- heading?: string
12
- }
13
-
14
- const Subheading = styled(Heading4)`
15
- margin: ${Margin.none};
16
- `
17
-
18
- const SectionFrame = styled.section`
19
- border-top: 1px solid ${Borders.Default.Subdued};
20
-
21
- padding: ${Padding.l};
22
- `
23
-
24
- const SubheadingFrame = styled(SpaceBetween)`
25
- margin: ${Margin.none} ${Margin.none} ${Margin.m} ${Margin.none};
26
- `
27
-
28
- export class CardSectionSlot extends Slot<ICardSectionProps> {
29
- override render () {
30
- const headingAction = getSlot(CardHeadingActionSlot, this.props.children)
31
- const children = getOtherChildren(this.props.children)
32
- const headingId = isDefined(this.props.heading)
33
- ? toKebabCase(this.props.heading)
34
- : undefined
35
-
36
- return (
37
- <SectionFrame
38
- aria-labelledby={headingId}
39
- {...this.props}
40
- >
41
- <If is={this.props.heading}>
42
- <SubheadingFrame>
43
- <Subheading id={headingId}>{this.props.heading}</Subheading>
44
- <If is={headingAction}>{headingAction}</If>
45
- </SubheadingFrame>
46
- </If>
47
- {children}
48
- </SectionFrame>
49
- )
50
- }
51
- }
@@ -1,3 +0,0 @@
1
- export * from './card-alert-banner-slot'
2
- export * from './card-controls-slot'
3
- export * from './card-section-slot'
@@ -1,2 +0,0 @@
1
- export * from './card'
2
- export * from './molecules/left-right-card'
@@ -1 +0,0 @@
1
- export * from './left-right-card'
@@ -1,89 +0,0 @@
1
- import { Margin } from '@foundations'
2
- import { render, screen } from '@testing-library/react'
3
- import styled from 'styled-components'
4
- import { LeftRightCard } from './left-right-card'
5
-
6
- describe('LeftRightCard', () => {
7
- it('renders the content in the Right slot', () => {
8
- render(
9
- <LeftRightCard>
10
- <LeftRightCard.Right>Content</LeftRightCard.Right>
11
- </LeftRightCard>
12
- )
13
-
14
- expect(screen.getByText('Content')).toBeInTheDocument()
15
- })
16
-
17
- it('does not render other children', () => {
18
- render(
19
- <LeftRightCard>
20
- <div>Other Children</div>
21
- <LeftRightCard.Right>Content</LeftRightCard.Right>
22
- </LeftRightCard>
23
- )
24
-
25
- expect(screen.queryByText('Other Children')).not.toBeInTheDocument()
26
- })
27
-
28
- it('renders a region labelled by the given heading', () => {
29
- render(
30
- <LeftRightCard heading='Heading'>
31
- <LeftRightCard.Right>Content</LeftRightCard.Right>
32
- </LeftRightCard>
33
- )
34
-
35
- expect(screen.getByRole('region')).toBeInTheDocument()
36
- expect(screen.getByLabelText('Heading')).toBeInTheDocument()
37
- expect(screen.getByLabelText('Heading')).toHaveTextContent('Content')
38
- })
39
-
40
- it('renders no region without a heading', () => {
41
- render(
42
- <LeftRightCard>
43
- <LeftRightCard.Right>Content</LeftRightCard.Right>
44
- </LeftRightCard>
45
- )
46
-
47
- expect(screen.queryByRole('region')).not.toBeInTheDocument()
48
- expect(screen.queryByLabelText('Heading')).not.toBeInTheDocument()
49
- expect(screen.getByText('Content')).toBeInTheDocument()
50
- })
51
-
52
- it('describes the children by the given help text', () => {
53
- render(
54
- <LeftRightCard helpText='Helpful Text'>
55
- <LeftRightCard.Right>Content</LeftRightCard.Right>
56
- </LeftRightCard>
57
- )
58
-
59
- expect(screen.getByText('Helpful Text')).toBeInTheDocument()
60
- expect(screen.getByText('Content')).toHaveAccessibleDescription('Helpful Text')
61
- })
62
-
63
- it('still renders without the helpful text, but it is not as helpful', () => {
64
- render(
65
- <LeftRightCard>
66
- <LeftRightCard.Right>Content</LeftRightCard.Right>
67
- </LeftRightCard>
68
- )
69
-
70
- expect(screen.queryByText('Helpful Text')).not.toBeInTheDocument()
71
- expect(screen.getByText('Content')).not.toHaveAccessibleDescription('Helpful Text')
72
- })
73
-
74
- /**
75
- * this test just ensures that the programmer did not
76
- * forget to add className? to the props and then pass
77
- * it to the wrapping element so that users downstream
78
- * can style the component
79
- */
80
- it('accepts styles', () => {
81
- const Component = styled(LeftRightCard)`
82
- margin-bottom: ${Margin.l};
83
- `
84
-
85
- const { container } = render(<Component>Contents</Component>)
86
-
87
- expect(container.firstChild).toHaveStyle(`margin-bottom: ${Margin.l}`)
88
- })
89
- })
@@ -1,63 +0,0 @@
1
- import { FC, getSlot, If, isDefined, Slot, toKebabCase } from '@helpers'
2
- import { leftRightLayoutGenerator } from 'components/layout'
3
- import { Card, ICardProps } from '../card'
4
-
5
- const { Layout } = leftRightLayoutGenerator()
6
-
7
- class Right extends Slot {}
8
- class Controls extends Slot {}
9
-
10
- type SubComponents = {
11
- Right: typeof Right
12
- Controls: typeof Controls
13
- }
14
-
15
- interface ILeftRightCardProps extends ICardProps {
16
- helpText?: string
17
- className?: string
18
- }
19
-
20
- export const LeftRightCard: FC<ILeftRightCardProps, SubComponents> = (
21
- props
22
- ) => {
23
- const right = getSlot(Right, props.children)
24
- const controls = getSlot(Controls, props.children)
25
-
26
- const headingId = isDefined(props.heading)
27
- ? toKebabCase(props.heading)
28
- : undefined
29
-
30
- const helpTextId = isDefined(props.helpText)
31
- ? toKebabCase(props.helpText)
32
- : undefined
33
-
34
- return (
35
- <Card className={props.className}>
36
- <Card.Section aria-labelledby={headingId}>
37
- <Layout>
38
- <Layout.Left>
39
- <If is={props.heading}>
40
- <Layout.HeadingText id={headingId}>
41
- {props.heading}
42
- </Layout.HeadingText>
43
- </If>
44
- <If is={props.helpText}>
45
- <Layout.HelpText id={helpTextId}>
46
- {props.helpText}
47
- </Layout.HelpText>
48
- </If>
49
- </Layout.Left>
50
- <Layout.Right>
51
- <div aria-describedby={helpTextId}>{right}</div>
52
- </Layout.Right>
53
- </Layout>
54
- </Card.Section>
55
- <Card.Controls>
56
- {controls}
57
- </Card.Controls>
58
- </Card>
59
- )
60
- }
61
-
62
- LeftRightCard.Right = Right
63
- LeftRightCard.Controls = Controls
@@ -1,100 +0,0 @@
1
- import { Meta, Canvas } from '@storybook/addon-docs';
2
- import { AlertBanner } from 'components/alert-banner'
3
- import {
4
- CardExample,
5
- SectionsExample,
6
- AlertBannerExample,
7
- LeftRightLayoutExample,
8
- CardControlsExample,
9
- SectionsHeadingActionsExample,
10
- } from './components'
11
-
12
- <Meta title="Components/Card"/>
13
-
14
- # Card
15
-
16
- Cards are used to group similar things together.
17
-
18
- ## How to Use It
19
-
20
- ```tsx
21
- import { Card } from '@edvisor/product-language'
22
-
23
- <Card heading='Heading'>
24
- Lorem ipsum dolor sit amet, consectetur adipiscing elit.
25
- </Card>
26
- ```
27
-
28
- ### Card
29
-
30
- A simple card with a heading and content.
31
-
32
- <CardExample />
33
-
34
- ### Card with Sections
35
-
36
- You can divide a card's body up into sections.
37
-
38
- <SectionsExample />
39
-
40
- ### Card with Heading Actions
41
-
42
- Any heading in a Card can have an action
43
-
44
- <AlertBanner warning>
45
- HeadingAction is a slot, so its children will always render in the same place regardless of where you use it.
46
- </AlertBanner>
47
-
48
- <SectionsHeadingActionsExample />
49
-
50
- ### Card with Controls
51
-
52
- Primary controls go on the bottom of the card.
53
-
54
- <AlertBanner warning>
55
- Controls is a slot, so its children will always render in the same place regardless of where you use it.
56
- </AlertBanner>
57
-
58
- <CardControlsExample />
59
-
60
- ### Card with Alert Banner
61
-
62
- You can grab the user's attention with a banner.
63
-
64
- <AlertBanner warning>
65
- AlertBanner is a slot, so its children will always render in the same place regardless of where you use it.
66
- </AlertBanner>
67
-
68
- <AlertBannerExample />
69
-
70
- ### Card with a Layout
71
-
72
- You can add a layout to a card. In this case we've added a 1:2 ratio "left/right" layout.
73
-
74
- <LeftRightLayoutExample />
75
-
76
- ## API
77
-
78
- ### `Card`
79
-
80
- Extends `HTMLAttributes<HTMLDivElement>`
81
-
82
- | Prop | Type | Description |
83
- | --------- | ---------- | -------------------------- |
84
- | `heading` | `boolean?` | Adds a heading to the card |
85
-
86
- ### `Card.Section`
87
-
88
- Extends `HTMLAttributes<HTMLDivElement>`
89
-
90
- | Prop | Type | Description |
91
- | --------- | ---------- | ------------------------------- |
92
- | `heading` | `boolean?` | Adds a heading to the section |
93
-
94
- ### Slots
95
-
96
- | Slot | Description |
97
- | --------------- | ----------------------------------------------------------- |
98
- | `Controls` | Adds controls to the bottom of the card |
99
- | `HeadingAction` | Adds UI directly across from the card or sections's heading |
100
- | `AlertBanner` | Adds an alert banner above the heading |